From 2e23e6c4d1fcd1fa079a4db3dc88731d6f46d3e8 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 9 Dec 2022 11:04:16 +0300 Subject: [PATCH 001/436] [WIP] basic functionality except TX signing --- CMakeLists.txt | 3 + Core/ApiAdapter.cpp | 44 +- Core/ApiAdapter.h | 5 +- Core/ApiJson.cpp | 119 ++-- Core/ApiJson.h | 28 +- Core/AssetsAdapter.cpp | 32 +- Core/AssetsAdapter.h | 11 +- Core/BsServerAdapter.cpp | 46 +- Core/BsServerAdapter.h | 17 +- Core/MDHistAdapter.cpp | 4 +- Core/MDHistAdapter.h | 2 +- Core/MktDataAdapter.cpp | 12 +- Core/MktDataAdapter.h | 4 +- Core/SettingsAdapter.cpp | 97 ++-- Core/SettingsAdapter.h | 46 +- Core/SignerAdapter.cpp | 101 ++-- Core/SignerAdapter.h | 43 +- GUI/QtQuick/AddressListModel.cpp | 112 ++++ GUI/QtQuick/AddressListModel.h | 49 ++ GUI/QtQuick/QtQuickAdapter.cpp | 392 +++++++++---- GUI/QtQuick/QtQuickAdapter.h | 108 +++- GUI/QtQuick/TxListModel.cpp | 70 +++ GUI/QtQuick/TxListModel.h | 41 ++ GUI/QtQuick/images/bitcoin-disabled.png | Bin 0 -> 608 bytes GUI/QtQuick/images/bitcoin-main-net.png | Bin 0 -> 660 bytes GUI/QtQuick/images/bitcoin-test-net.png | Bin 0 -> 664 bytes GUI/QtQuick/images/explorer_icon.png | Bin 0 -> 1810 bytes GUI/QtQuick/images/overview_icon.png | Bin 0 -> 654 bytes GUI/QtQuick/images/receive_icon.png | Bin 0 -> 235 bytes GUI/QtQuick/images/send_icon.png | Bin 0 -> 549 bytes GUI/QtQuick/images/settings_icon.png | Bin 0 -> 1626 bytes GUI/QtQuick/images/transactions_icon.png | Bin 0 -> 390 bytes GUI/QtQuick/qml/CreateNewWallet.qml | 84 +++ GUI/QtQuick/qml/ExplorerPage.qml | 40 ++ GUI/QtQuick/qml/ImportSeedPhrase.qml | 525 ++++++++++++++++++ GUI/QtQuick/qml/OverviewPage.qml | 182 ++++++ GUI/QtQuick/qml/ReceivePage.qml | 128 +++++ GUI/QtQuick/qml/SeedPhrase.qml | 194 +++++++ GUI/QtQuick/qml/SendPage.qml | 43 ++ GUI/QtQuick/qml/SettingsPage.qml | 43 ++ .../qml/StyledControls/CustomTabButton.qml | 20 +- GUI/QtQuick/qml/TransactionsPage.qml | 106 ++++ GUI/QtQuick/qml/VerifySeedPhrase.qml | 144 +++++ GUI/QtQuick/qml/WalletNamePass.qml | 112 ++++ GUI/QtQuick/qml/main.qml | 148 ++++- GUI/QtQuick/qtquick.qrc | 20 + GUI/QtWidgets/QtGuiAdapter.cpp | 211 +++---- GUI/QtWidgets/QtGuiAdapter.h | 66 +-- UnitTests/MockTerminal.cpp | 14 +- UnitTests/TestAdapters.cpp | 33 +- UnitTests/TestAdapters.h | 8 +- common | 2 +- 52 files changed, 2932 insertions(+), 577 deletions(-) create mode 100644 GUI/QtQuick/AddressListModel.cpp create mode 100644 GUI/QtQuick/AddressListModel.h create mode 100644 GUI/QtQuick/TxListModel.cpp create mode 100644 GUI/QtQuick/TxListModel.h create mode 100644 GUI/QtQuick/images/bitcoin-disabled.png create mode 100644 GUI/QtQuick/images/bitcoin-main-net.png create mode 100644 GUI/QtQuick/images/bitcoin-test-net.png create mode 100644 GUI/QtQuick/images/explorer_icon.png create mode 100644 GUI/QtQuick/images/overview_icon.png create mode 100644 GUI/QtQuick/images/receive_icon.png create mode 100644 GUI/QtQuick/images/send_icon.png create mode 100644 GUI/QtQuick/images/settings_icon.png create mode 100644 GUI/QtQuick/images/transactions_icon.png create mode 100644 GUI/QtQuick/qml/CreateNewWallet.qml create mode 100644 GUI/QtQuick/qml/ExplorerPage.qml create mode 100644 GUI/QtQuick/qml/ImportSeedPhrase.qml create mode 100644 GUI/QtQuick/qml/OverviewPage.qml create mode 100644 GUI/QtQuick/qml/ReceivePage.qml create mode 100644 GUI/QtQuick/qml/SeedPhrase.qml create mode 100644 GUI/QtQuick/qml/SendPage.qml create mode 100644 GUI/QtQuick/qml/SettingsPage.qml create mode 100644 GUI/QtQuick/qml/TransactionsPage.qml create mode 100644 GUI/QtQuick/qml/VerifySeedPhrase.qml create mode 100644 GUI/QtQuick/qml/WalletNamePass.qml diff --git a/CMakeLists.txt b/CMakeLists.txt index fc5e14c8b..61cacb419 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,9 @@ add_definitions(-DNOMINMAX) # Force Armory to ignore Crypto++ and use libbtc instead. add_definitions(-DLIBBTC_ONLY) +add_definitions(-DQT_IS_AVAILABLE) +add_definitions(-DQT_UI_IS_AVAILABLE) + IF (APPLE) add_definitions(-DMDB_USE_POSIX_SEM=1) ENDIF(APPLE) diff --git a/Core/ApiAdapter.cpp b/Core/ApiAdapter.cpp index 5a8f9e04d..ca8004736 100644 --- a/Core/ApiAdapter.cpp +++ b/Core/ApiAdapter.cpp @@ -11,6 +11,7 @@ #include "ApiAdapter.h" #include +using namespace bs::message; class ApiRouter : public bs::message::Router { @@ -75,7 +76,7 @@ class ApiBusGateway : public ApiBusAdapter return false; // ignore unsolicited broadcasts } - bool process(const bs::message::Envelope &env) override + ProcessingResult process(const bs::message::Envelope &env) override { auto envCopy = env; envCopy.setId(0); @@ -87,23 +88,25 @@ class ApiBusGateway : public ApiBusAdapter std::unique_lock lock(mtxIdMap_); idMap_[envCopy.foreignId()] = { env.foreignId(), env.sender }; } - return true; + return ProcessingResult::Success; } else { - return false; + return ProcessingResult::Retry; } } else if (env.receiver->isFallback()) { if (env.isRequest()) { envCopy.receiver = userTermBroadcast_; - return parent_->pushFill(envCopy); + return parent_->pushFill(envCopy) ? ProcessingResult::Success + : ProcessingResult::Retry; } else { std::unique_lock lock(mtxIdMap_); const auto &itId = idMap_.find(env.responseId()); if (itId == idMap_.end()) { envCopy.receiver = userTermBroadcast_; - return parent_->pushFill(envCopy); + return parent_->pushFill(envCopy) ? ProcessingResult::Success + : ProcessingResult::Retry; } else { envCopy = bs::message::Envelope::makeResponse(parent_->user_ @@ -113,14 +116,14 @@ class ApiBusGateway : public ApiBusAdapter if (parent_->pushFill(envCopy)) { idMap_.erase(env.responseId()); } - return true; + return ProcessingResult::Success; } } } - return true; + return ProcessingResult::Success; } - bool pushToApiBus(const bs::message::Envelope &env) + ProcessingResult pushToApiBus(const bs::message::Envelope &env) { auto envCopy = env; envCopy.setId(0); @@ -136,17 +139,17 @@ class ApiBusGateway : public ApiBusAdapter if (pushFill(envCopy)) { idMap_.erase(itIdMap); - return true; + return ProcessingResult::Success; } - return false; + return ProcessingResult::Retry; } } - bool rc = pushFill(envCopy); + const bool rc = pushFill(envCopy); if (rc && env.isRequest()) { std::unique_lock lock(mtxIdMap_); idMap_[envCopy.foreignId()] = { env.foreignId(), env.sender }; } - return rc; + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } private: @@ -204,19 +207,28 @@ void ApiAdapter::add(const std::shared_ptr &adapter) apiBus_->addAdapter(adapter); } -bool ApiAdapter::process(const bs::message::Envelope &env) +ProcessingResult ApiAdapter::process(const bs::message::Envelope &env) { - RelayAdapter::process(env); + const auto rc = RelayAdapter::process(env); if (env.receiver->value() == user_->value()) { return gwAdapter_->pushToApiBus(env); } - return true; + return rc; } bool ApiAdapter::processBroadcast(const bs::message::Envelope& env) { if (RelayAdapter::processBroadcast(env)) { - return gwAdapter_->pushToApiBus(env); + gwAdapter_->pushToApiBus(env); + return true; } return false; } + +bool ApiBusAdapter::pushFill(bs::message::Envelope& env) +{ + if (!queue_) { + return false; + } + return queue_->pushFill(env); +} diff --git a/Core/ApiAdapter.h b/Core/ApiAdapter.h index f95782014..96dd14b3d 100644 --- a/Core/ApiAdapter.h +++ b/Core/ApiAdapter.h @@ -72,6 +72,9 @@ class ApiBusAdapter : public bs::message::Adapter user_->setName(name()); } +protected: + bool pushFill(bs::message::Envelope&) override; + protected: std::shared_ptr user_; }; @@ -84,7 +87,7 @@ class ApiAdapter : public bs::message::RelayAdapter, public bs::MainLoopRuner ApiAdapter(const std::shared_ptr &); ~ApiAdapter() override = default; - bool process(const bs::message::Envelope &) override; + bs::message::ProcessingResult process(const bs::message::Envelope &) override; bool processBroadcast(const bs::message::Envelope& env) override; Users supportedReceivers() const override { return { user_, fallbackUser_ }; } diff --git a/Core/ApiJson.cpp b/Core/ApiJson.cpp index 97bfd9096..d6004e730 100644 --- a/Core/ApiJson.cpp +++ b/Core/ApiJson.cpp @@ -34,7 +34,7 @@ ApiJsonAdapter::ApiJsonAdapter(const std::shared_ptr &logger) , userSettings_(UserTerminal::create(TerminalUsers::Settings)) {} -bool ApiJsonAdapter::process(const Envelope &env) +ProcessingResult ApiJsonAdapter::process(const Envelope &env) { if (std::dynamic_pointer_cast(env.sender)) { switch (env.sender->value()) { @@ -58,7 +58,7 @@ bool ApiJsonAdapter::process(const Envelope &env) return processOnChainTrack(env); case TerminalUsers::Assets: return processAssets(env); - default: break; + default: return ProcessingResult::Ignored; } } else if (env.receiver && (env.sender->value() == user_->value()) @@ -70,8 +70,9 @@ bool ApiJsonAdapter::process(const Envelope &env) else { logger_->warn("[{}] non-terminal #{} user {}", __func__, env.foreignId() , env.sender->name()); + return ProcessingResult::Error; } - return true; + return ProcessingResult::Success; } bool ApiJsonAdapter::processBroadcast(const bs::message::Envelope& env) @@ -79,25 +80,25 @@ bool ApiJsonAdapter::processBroadcast(const bs::message::Envelope& env) if (std::dynamic_pointer_cast(env.sender)) { switch (env.sender->value()) { case TerminalUsers::System: - return processAdminMessage(env); + return (processAdminMessage(env) != ProcessingResult::Ignored); case TerminalUsers::Blockchain: - return processBlockchain(env); + return (processBlockchain(env) != ProcessingResult::Ignored); case TerminalUsers::Signer: - return processSigner(env); + return (processSigner(env) != ProcessingResult::Ignored); case TerminalUsers::Wallets: - return processWallets(env); + return (processWallets(env) != ProcessingResult::Ignored); case TerminalUsers::BsServer: - return processBsServer(env); + return (processBsServer(env) != ProcessingResult::Ignored); case TerminalUsers::Settlement: - return processSettlement(env); + return (processSettlement(env) != ProcessingResult::Ignored); case TerminalUsers::Matching: - return processMatching(env); + return (processMatching(env) != ProcessingResult::Ignored); case TerminalUsers::MktData: - return processMktData(env); + return (processMktData(env) != ProcessingResult::Ignored); case TerminalUsers::OnChainTracker: - return processOnChainTrack(env); + return (processOnChainTrack(env) != ProcessingResult::Ignored); case TerminalUsers::Assets: - return processAssets(env); + return (processAssets(env) != ProcessingResult::Ignored); default: break; } } @@ -234,12 +235,12 @@ void ApiJsonAdapter::OnClientDisconnected(const std::string& clientId) , connectedClients_.size()); } -bool ApiJsonAdapter::processSettings(const Envelope &env) +ProcessingResult ApiJsonAdapter::processSettings(const Envelope &env) { SettingsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse settings msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case SettingsMessage::kGetResponse: @@ -270,12 +271,12 @@ bool ApiJsonAdapter::processSettings(const Envelope &env) clientPubKeys_.insert(clientKey); } break; - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool ApiJsonAdapter::processSettingsGetResponse(const SettingsMessage_SettingsResponse &response) +ProcessingResult ApiJsonAdapter::processSettingsGetResponse(const SettingsMessage_SettingsResponse &response) { std::map settings; for (const auto &setting : response.responses()) { @@ -294,26 +295,26 @@ bool ApiJsonAdapter::processSettingsGetResponse(const SettingsMessage_SettingsRe break; } } - return true; + return ProcessingResult::Success; } -bool ApiJsonAdapter::processAdminMessage(const Envelope &env) +ProcessingResult ApiJsonAdapter::processAdminMessage(const Envelope &env) { AdministrativeMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse admin msg #{}", __func__, env.foreignId()); - return false; + return ProcessingResult::Error; } switch (msg.data_case()) { case AdministrativeMessage::kStart: processStart(); break; - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool ApiJsonAdapter::processBlockchain(const Envelope &env) +ProcessingResult ApiJsonAdapter::processBlockchain(const Envelope &env) { ArmoryMessage msg; if (!msg.ParseFromString(env.message)) { @@ -322,7 +323,7 @@ bool ApiJsonAdapter::processBlockchain(const Envelope &env) if (!env.receiver) { logger_->debug("[{}] no receiver", __func__); } - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case ArmoryMessage::kStateChanged: @@ -350,12 +351,12 @@ bool ApiJsonAdapter::processBlockchain(const Envelope &env) case ArmoryMessage::kZcInvalidated: sendReplyToClient(0, msg, env.sender); break; - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool ApiJsonAdapter::processSigner(const Envelope &env) +ProcessingResult ApiJsonAdapter::processSigner(const Envelope &env) { SignerMessage msg; if (!msg.ParseFromString(env.message)) { @@ -364,7 +365,7 @@ bool ApiJsonAdapter::processSigner(const Envelope &env) if (!env.receiver) { logger_->debug("[{}] no receiver", __func__); } - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case SignerMessage::kState: @@ -376,17 +377,17 @@ bool ApiJsonAdapter::processSigner(const Envelope &env) case SignerMessage::kSignTxResponse: sendReplyToClient(env.responseId(), msg, env.sender); break; - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool ApiJsonAdapter::processWallets(const Envelope &env) +ProcessingResult ApiJsonAdapter::processWallets(const Envelope &env) { WalletsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case WalletsMessage::kWalletLoaded: @@ -405,34 +406,34 @@ bool ApiJsonAdapter::processWallets(const Envelope &env) sendReplyToClient(env.responseId(), msg, env.sender); } break; - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool ApiJsonAdapter::processOnChainTrack(const Envelope &env) +ProcessingResult ApiJsonAdapter::processOnChainTrack(const Envelope &env) { OnChainTrackMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case OnChainTrackMessage::kAuthState: case OnChainTrackMessage::kVerifiedAuthAddresses: sendReplyToClient(0, msg, env.sender); break; - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool ApiJsonAdapter::processAssets(const bs::message::Envelope& env) +ProcessingResult ApiJsonAdapter::processAssets(const bs::message::Envelope& env) { AssetsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case AssetsMessage::kSubmittedAuthAddrs: @@ -443,9 +444,9 @@ bool ApiJsonAdapter::processAssets(const bs::message::Envelope& env) case AssetsMessage::kBalance: sendReplyToClient(0, msg, env.sender); break; - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } void ApiJsonAdapter::processStart() @@ -466,12 +467,12 @@ void ApiJsonAdapter::processStart() pushRequest(user_, userSettings_, msg.SerializeAsString()); } -bool ApiJsonAdapter::processBsServer(const bs::message::Envelope& env) +ProcessingResult ApiJsonAdapter::processBsServer(const bs::message::Envelope& env) { BsServerMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case BsServerMessage::kStartLoginResult: @@ -486,17 +487,17 @@ bool ApiJsonAdapter::processBsServer(const bs::message::Envelope& env) loggedInUser_.clear(); sendReplyToClient(0, msg, env.sender); break; - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool ApiJsonAdapter::processSettlement(const bs::message::Envelope& env) +ProcessingResult ApiJsonAdapter::processSettlement(const bs::message::Envelope& env) { SettlementMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case SettlementMessage::kQuote: @@ -508,17 +509,17 @@ bool ApiJsonAdapter::processSettlement(const bs::message::Envelope& env) case SettlementMessage::kQuoteReqNotif: sendReplyToClient(0, msg, env.sender); break; - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool ApiJsonAdapter::processMatching(const bs::message::Envelope& env) +ProcessingResult ApiJsonAdapter::processMatching(const bs::message::Envelope& env) { MatchingMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case MatchingMessage::kLoggedIn: @@ -530,17 +531,17 @@ bool ApiJsonAdapter::processMatching(const bs::message::Envelope& env) loggedInUser_.clear(); sendReplyToClient(0, msg, env.sender); break; - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool ApiJsonAdapter::processMktData(const bs::message::Envelope& env) +ProcessingResult ApiJsonAdapter::processMktData(const bs::message::Envelope& env) { MktDataMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case MktDataMessage::kDisconnected: @@ -549,9 +550,9 @@ bool ApiJsonAdapter::processMktData(const bs::message::Envelope& env) case MktDataMessage::kPriceUpdate: sendReplyToClient(0, msg, env.sender); break; - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } bool ApiJsonAdapter::hasRequest(uint64_t msgId) const diff --git a/Core/ApiJson.h b/Core/ApiJson.h index f10527c5e..7aba427db 100644 --- a/Core/ApiJson.h +++ b/Core/ApiJson.h @@ -32,7 +32,7 @@ class ApiJsonAdapter : public ApiBusAdapter, public ServerConnectionListener ApiJsonAdapter(const std::shared_ptr &); ~ApiJsonAdapter() override = default; - bool process(const bs::message::Envelope &) override; + bs::message::ProcessingResult process(const bs::message::Envelope &) override; bool processBroadcast(const bs::message::Envelope&) override; Users supportedReceivers() const override { return { user_ }; } @@ -44,19 +44,19 @@ class ApiJsonAdapter : public ApiBusAdapter, public ServerConnectionListener void OnClientDisconnected(const std::string& clientId) override; private: - bool processSettings(const bs::message::Envelope &); - bool processSettingsGetResponse(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); - - bool processAdminMessage(const bs::message::Envelope &); - bool processAssets(const bs::message::Envelope&); - bool processBlockchain(const bs::message::Envelope&); - bool processBsServer(const bs::message::Envelope&); - bool processMatching(const bs::message::Envelope&); - bool processMktData(const bs::message::Envelope&); - bool processOnChainTrack(const bs::message::Envelope&); - bool processSettlement(const bs::message::Envelope&); - bool processSigner(const bs::message::Envelope&); - bool processWallets(const bs::message::Envelope&); + bs::message::ProcessingResult processSettings(const bs::message::Envelope &); + bs::message::ProcessingResult processSettingsGetResponse(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); + + bs::message::ProcessingResult processAdminMessage(const bs::message::Envelope &); + bs::message::ProcessingResult processAssets(const bs::message::Envelope&); + bs::message::ProcessingResult processBlockchain(const bs::message::Envelope&); + bs::message::ProcessingResult processBsServer(const bs::message::Envelope&); + bs::message::ProcessingResult processMatching(const bs::message::Envelope&); + bs::message::ProcessingResult processMktData(const bs::message::Envelope&); + bs::message::ProcessingResult processOnChainTrack(const bs::message::Envelope&); + bs::message::ProcessingResult processSettlement(const bs::message::Envelope&); + bs::message::ProcessingResult processSigner(const bs::message::Envelope&); + bs::message::ProcessingResult processWallets(const bs::message::Envelope&); void processStart(); diff --git a/Core/AssetsAdapter.cpp b/Core/AssetsAdapter.cpp index f633376cf..8d7b8fa15 100644 --- a/Core/AssetsAdapter.cpp +++ b/Core/AssetsAdapter.cpp @@ -26,13 +26,13 @@ AssetsAdapter::AssetsAdapter(const std::shared_ptr &logger) assetMgr_ = std::make_unique(logger, this); } -bool AssetsAdapter::process(const bs::message::Envelope &env) +ProcessingResult AssetsAdapter::process(const bs::message::Envelope &env) { if (env.sender->value() == bs::message::TerminalUsers::Settings) { SettingsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse settings message #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case SettingsMessage::kGetResponse: @@ -44,7 +44,7 @@ bool AssetsAdapter::process(const bs::message::Envelope &env) MatchingMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse matching message #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case MatchingMessage::kSubmittedAuthAddresses: @@ -56,7 +56,7 @@ bool AssetsAdapter::process(const bs::message::Envelope &env) AssetsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse own message #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case AssetsMessage::kSubmitAuthAddress: @@ -64,7 +64,7 @@ bool AssetsAdapter::process(const bs::message::Envelope &env) default: break; } } - return true; + return ProcessingResult::Ignored; } bool AssetsAdapter::processBroadcast(const bs::message::Envelope& env) @@ -106,7 +106,8 @@ bool AssetsAdapter::processBroadcast(const bs::message::Envelope& env) } switch (msg.data_case()) { case BsServerMessage::kBalanceUpdated: - return processBalance(msg.balance_updated().currency(), msg.balance_updated().value()); + return (processBalance(msg.balance_updated().currency(), msg.balance_updated().value()) + != ProcessingResult::Ignored); default: break; } } @@ -141,14 +142,14 @@ void AssetsAdapter::onSecuritiesChanged() { } -bool AssetsAdapter::processGetSettings(const SettingsMessage_SettingsResponse& response) +ProcessingResult AssetsAdapter::processGetSettings(const SettingsMessage_SettingsResponse& response) { for (const auto& setting : response.responses()) { switch (setting.request().index()) { default: break; } } - return true; + return ProcessingResult::Ignored; } bool AssetsAdapter::onMatchingLogin(const MatchingMessage_LoggedIn&) @@ -159,29 +160,32 @@ bool AssetsAdapter::onMatchingLogin(const MatchingMessage_LoggedIn&) , msg.SerializeAsString()); } -bool AssetsAdapter::processSubmittedAuth(const MatchingMessage_SubmittedAuthAddresses& response) +ProcessingResult AssetsAdapter::processSubmittedAuth(const MatchingMessage_SubmittedAuthAddresses& response) { AssetsMessage msg; auto msgBC = msg.mutable_submitted_auth_addrs(); for (const auto& addr : response.addresses()) { msgBC->add_addresses(addr); } - return pushBroadcast(user_, msg.SerializeAsString()); + pushBroadcast(user_, msg.SerializeAsString()); + return ProcessingResult::Success; } -bool AssetsAdapter::processSubmitAuth(const std::string& address) +ProcessingResult AssetsAdapter::processSubmitAuth(const std::string& address) { // currently using Celer storage for this, but this might changed at some point MatchingMessage msg; msg.set_submit_auth_address(address); - return pushRequest(user_, UserTerminal::create(TerminalUsers::Matching) + pushRequest(user_, UserTerminal::create(TerminalUsers::Matching) , msg.SerializeAsString()); + return ProcessingResult::Success; } -bool AssetsAdapter::processBalance(const std::string& currency, double value) +ProcessingResult AssetsAdapter::processBalance(const std::string& currency, double value) { AssetsMessage msg; auto msgBal = msg.mutable_balance(); msgBal->set_currency(currency); msgBal->set_value(value); - return pushBroadcast(user_, msg.SerializeAsString()); + pushBroadcast(user_, msg.SerializeAsString()); + return ProcessingResult::Success; } diff --git a/Core/AssetsAdapter.h b/Core/AssetsAdapter.h index ae88c1905..7ecd91910 100644 --- a/Core/AssetsAdapter.h +++ b/Core/AssetsAdapter.h @@ -33,7 +33,7 @@ class AssetsAdapter : public bs::message::Adapter AssetsAdapter(const std::shared_ptr &); ~AssetsAdapter() override = default; - bool process(const bs::message::Envelope &) override; + bs::message::ProcessingResult process(const bs::message::Envelope &) override; bool processBroadcast(const bs::message::Envelope&) override; Users supportedReceivers() const override { return { user_ }; } @@ -50,11 +50,11 @@ class AssetsAdapter : public bs::message::Adapter void onSecuritiesChanged() override; //internal processing - bool processGetSettings(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); + bs::message::ProcessingResult processGetSettings(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); bool onMatchingLogin(const BlockSettle::Terminal::MatchingMessage_LoggedIn&); - bool processSubmittedAuth(const BlockSettle::Terminal::MatchingMessage_SubmittedAuthAddresses&); - bool processSubmitAuth(const std::string&); - bool processBalance(const std::string& currency, double); + bs::message::ProcessingResult processSubmittedAuth(const BlockSettle::Terminal::MatchingMessage_SubmittedAuthAddresses&); + bs::message::ProcessingResult processSubmitAuth(const std::string&); + bs::message::ProcessingResult processBalance(const std::string& currency, double); private: std::shared_ptr logger_; @@ -62,5 +62,4 @@ class AssetsAdapter : public bs::message::Adapter std::unique_ptr assetMgr_; }; - #endif // ASSETS_ADAPTER_H diff --git a/Core/BsServerAdapter.cpp b/Core/BsServerAdapter.cpp index db008164e..89dd42434 100644 --- a/Core/BsServerAdapter.cpp +++ b/Core/BsServerAdapter.cpp @@ -39,14 +39,14 @@ BsServerAdapter::BsServerAdapter(const std::shared_ptr &logger) connMgr_->setCaBundle(bs::caBundlePtr(), bs::caBundleSize()); } -bool BsServerAdapter::process(const bs::message::Envelope &env) +ProcessingResult BsServerAdapter::process(const bs::message::Envelope &env) { if (env.sender->value() == TerminalUsers::Settings) { SettingsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse settings message #{}", __func__ , env.foreignId()); - return true; + return ProcessingResult::Error; } if (msg.data_case() == SettingsMessage::kGetResponse) { return processLocalSettings(msg.get_response()); @@ -55,7 +55,7 @@ bool BsServerAdapter::process(const bs::message::Envelope &env) else if (env.receiver->value() == user_->value()) { return processOwnRequest(env); } - return true; + return ProcessingResult::Ignored; } bool BsServerAdapter::processBroadcast(const bs::message::Envelope& env) @@ -90,12 +90,12 @@ void BsServerAdapter::start() , msg.SerializeAsString()); } -bool BsServerAdapter::processOwnRequest(const Envelope &env) +ProcessingResult BsServerAdapter::processOwnRequest(const Envelope &env) { BsServerMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse own request #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case BsServerMessage::kOpenConnection: @@ -131,10 +131,10 @@ bool BsServerAdapter::processOwnRequest(const Envelope &env) #endif default: break; } - return true; + return ProcessingResult::Ignored; } -bool BsServerAdapter::processLocalSettings(const SettingsMessage_SettingsResponse &response) +ProcessingResult BsServerAdapter::processLocalSettings(const SettingsMessage_SettingsResponse &response) { for (const auto &setting : response.responses()) { switch (static_cast(setting.request().index())) { @@ -152,37 +152,37 @@ bool BsServerAdapter::processLocalSettings(const SettingsMessage_SettingsRespons default: break; } } - return true; + return ProcessingResult::Success; } -bool BsServerAdapter::processPuBKeyResponse(bool allowed) +ProcessingResult BsServerAdapter::processPuBKeyResponse(bool allowed) { if (!futPuBkey_) { logger_->error("[{}] not waiting for PuB key permission", __func__); - return true; + return ProcessingResult::Error; } futPuBkey_->setValue(allowed); futPuBkey_.reset(); - return true; + return ProcessingResult::Success; } -bool BsServerAdapter::processTimeout(const std::string& id) +ProcessingResult BsServerAdapter::processTimeout(const std::string& id) { const auto& itTO = timeouts_.find(id); if (itTO == timeouts_.end()) { logger_->error("[{}] unknown timeout {}", __func__, id); - return true; + return ProcessingResult::Error; } itTO->second(); timeouts_.erase(itTO); - return true; + return ProcessingResult::Success; } -bool BsServerAdapter::processOpenConnection() +ProcessingResult BsServerAdapter::processOpenConnection() { if (connected_) { logger_->error("[{}] already connected", __func__); - return true; + return ProcessingResult::Error; } #if 0 bsClient_ = std::make_unique(logger_, this); @@ -215,13 +215,13 @@ bool BsServerAdapter::processOpenConnection() } bsClient_->setConnection(std::move(connection)); #endif - return true; + return ProcessingResult::Success; } -bool BsServerAdapter::processStartLogin(const std::string& login) +ProcessingResult BsServerAdapter::processStartLogin(const std::string& login) { if (!connected_) { - return false; // wait for connection to complete + return ProcessingResult::Retry; // wait for connection to complete } if (currentLogin_.empty()) { currentLogin_ = login; @@ -232,19 +232,19 @@ bool BsServerAdapter::processStartLogin(const std::string& login) else { //onStartLoginDone(true, {}); } - return true; + return ProcessingResult::Success; } -bool BsServerAdapter::processCancelLogin() +ProcessingResult BsServerAdapter::processCancelLogin() { if (currentLogin_.empty()) { logger_->warn("[BsServerAdapter::processCancelLogin] no login started - ignoring request"); - return true; + return ProcessingResult::Ignored; } #if 0 bsClient_->cancelLogin(); #endif - return true; + return ProcessingResult::Success; } #if 0 diff --git a/Core/BsServerAdapter.h b/Core/BsServerAdapter.h index 27480f787..c05f2a6b8 100644 --- a/Core/BsServerAdapter.h +++ b/Core/BsServerAdapter.h @@ -43,7 +43,7 @@ class BsServerAdapter : public bs::message::Adapter BsServerAdapter(const std::shared_ptr &); ~BsServerAdapter() override = default; - bool process(const bs::message::Envelope &) override; + bs::message::ProcessingResult process(const bs::message::Envelope &) override; bool processBroadcast(const bs::message::Envelope&) override; Users supportedReceivers() const override { return { user_ }; } @@ -51,13 +51,13 @@ class BsServerAdapter : public bs::message::Adapter private: void start(); - bool processOwnRequest(const bs::message::Envelope &); - bool processLocalSettings(const BlockSettle::Terminal::SettingsMessage_SettingsResponse &); - bool processPuBKeyResponse(bool); - bool processTimeout(const std::string& id); - bool processOpenConnection(); - bool processStartLogin(const std::string&); - bool processCancelLogin(); + bs::message::ProcessingResult processOwnRequest(const bs::message::Envelope &); + bs::message::ProcessingResult processLocalSettings(const BlockSettle::Terminal::SettingsMessage_SettingsResponse &); + bs::message::ProcessingResult processPuBKeyResponse(bool); + bs::message::ProcessingResult processTimeout(const std::string& id); + bs::message::ProcessingResult processOpenConnection(); + bs::message::ProcessingResult processStartLogin(const std::string&); + bs::message::ProcessingResult processCancelLogin(); //bool processSubmitAuthAddr(const bs::message::Envelope&, const std::string &addr); //void processUpdateOrders(const Blocksettle::Communication::ProxyTerminalPb::Response_UpdateOrders&); //void processUnsignedPayin(const Blocksettle::Communication::ProxyTerminalPb::Response_UnsignedPayinRequest&); @@ -81,5 +81,4 @@ class BsServerAdapter : public bs::message::Adapter std::unordered_map> timeouts_; }; - #endif // BS_SERVER_ADAPTER_H diff --git a/Core/MDHistAdapter.cpp b/Core/MDHistAdapter.cpp index 92ae0aa88..dd1c3d770 100644 --- a/Core/MDHistAdapter.cpp +++ b/Core/MDHistAdapter.cpp @@ -23,9 +23,9 @@ MDHistAdapter::MDHistAdapter(const std::shared_ptr &logger) , user_(std::make_shared(bs::message::TerminalUsers::MDHistory)) {} -bool MDHistAdapter::process(const bs::message::Envelope &env) +ProcessingResult MDHistAdapter::process(const bs::message::Envelope &) { - return true; + return ProcessingResult::Ignored; } bool MDHistAdapter::processBroadcast(const bs::message::Envelope& env) diff --git a/Core/MDHistAdapter.h b/Core/MDHistAdapter.h index 3737b248e..82e8df697 100644 --- a/Core/MDHistAdapter.h +++ b/Core/MDHistAdapter.h @@ -23,7 +23,7 @@ class MDHistAdapter : public bs::message::Adapter MDHistAdapter(const std::shared_ptr &); ~MDHistAdapter() override = default; - bool process(const bs::message::Envelope &) override; + bs::message::ProcessingResult process(const bs::message::Envelope &) override; bool processBroadcast(const bs::message::Envelope&) override; Users supportedReceivers() const override { return { user_ }; } diff --git a/Core/MktDataAdapter.cpp b/Core/MktDataAdapter.cpp index b5e153027..1b3aead08 100644 --- a/Core/MktDataAdapter.cpp +++ b/Core/MktDataAdapter.cpp @@ -34,14 +34,14 @@ MktDataAdapter::MktDataAdapter(const std::shared_ptr &logger) , true, false); } -bool MktDataAdapter::process(const bs::message::Envelope &env) +ProcessingResult MktDataAdapter::process(const bs::message::Envelope &env) { if (env.receiver->value() == user_->value()) { MktDataMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse own request #{}" , __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case MktDataMessage::kStartConnection: @@ -51,7 +51,7 @@ bool MktDataAdapter::process(const bs::message::Envelope &env) break; } } - return true; + return ProcessingResult::Ignored; } bool MktDataAdapter::processBroadcast(const bs::message::Envelope& env) @@ -179,15 +179,15 @@ void MktDataAdapter::sendTrade(const bs::network::NewTrade& trade) pushBroadcast(user_, msg.SerializeAsString(), true); } -bool MktDataAdapter::processStartConnection(int e) +ProcessingResult MktDataAdapter::processStartConnection(int e) { if (connected_) { logger_->debug("[{}] already connected", __func__); - return true; + return ProcessingResult::Success; } const auto env = static_cast(e); mdProvider_->SetConnectionSettings(PubKeyLoader::serverHostName(PubKeyLoader::KeyType::MdServer, env) , PubKeyLoader::serverHttpsPort()); mdProvider_->MDLicenseAccepted(); - return true; + return ProcessingResult::Success; } diff --git a/Core/MktDataAdapter.h b/Core/MktDataAdapter.h index e2bee9398..91ef7d696 100644 --- a/Core/MktDataAdapter.h +++ b/Core/MktDataAdapter.h @@ -25,7 +25,7 @@ class MktDataAdapter : public bs::message::Adapter, public MDCallbackTarget MktDataAdapter(const std::shared_ptr &); ~MktDataAdapter() override = default; - bool process(const bs::message::Envelope &) override; + bs::message::ProcessingResult process(const bs::message::Envelope &) override; bool processBroadcast(const bs::message::Envelope&) override; Users supportedReceivers() const override { return { user_ }; } @@ -50,7 +50,7 @@ class MktDataAdapter : public bs::message::Adapter, public MDCallbackTarget private: void sendTrade(const bs::network::NewTrade&); - bool processStartConnection(int env); + bs::message::ProcessingResult processStartConnection(int env); private: std::shared_ptr logger_; diff --git a/Core/SettingsAdapter.cpp b/Core/SettingsAdapter.cpp index 504efd497..fbe694e71 100644 --- a/Core/SettingsAdapter.cpp +++ b/Core/SettingsAdapter.cpp @@ -72,13 +72,13 @@ SettingsAdapter::SettingsAdapter(const std::shared_ptr &set signersProvider_ = std::make_shared(appSettings_); } -bool SettingsAdapter::process(const bs::message::Envelope &env) +ProcessingResult SettingsAdapter::process(const bs::message::Envelope &env) { if (env.receiver->value() == TerminalUsers::Settings) { SettingsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse settings msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case SettingsMessage::kGetRequest: @@ -131,7 +131,7 @@ bool SettingsAdapter::process(const bs::message::Envelope &env) break; } } - return true; + return ProcessingResult::Ignored; } bool SettingsAdapter::processBroadcast(const bs::message::Envelope& env) @@ -165,18 +165,18 @@ bool SettingsAdapter::processBroadcast(const bs::message::Envelope& env) return false; } -bool SettingsAdapter::processRemoteSettings(uint64_t msgId) +ProcessingResult SettingsAdapter::processRemoteSettings(uint64_t msgId) { const auto &itReq = remoteSetReqs_.find(msgId); if (itReq == remoteSetReqs_.end()) { logger_->error("[{}] failed to find remote settings request #{}", __func__ , msgId); - return true; + return ProcessingResult::Error; } - return true; + return ProcessingResult::Ignored; } -bool SettingsAdapter::processGetState(const bs::message::Envelope& env) +ProcessingResult SettingsAdapter::processGetState(const bs::message::Envelope& env) { SettingsMessage msg; auto msgResp = msg.mutable_state(); @@ -187,10 +187,11 @@ bool SettingsAdapter::processGetState(const bs::message::Envelope& env) setReq->set_index(static_cast(st.first)); setFromQVariant(st.second, setReq, setResp); } - return pushResponse(user_, env, msg.SerializeAsString()); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Success; } -bool SettingsAdapter::processReset(const bs::message::Envelope& env +ProcessingResult SettingsAdapter::processReset(const bs::message::Envelope& env , const SettingsMessage_SettingsRequest& request) { SettingsMessage msg; @@ -205,10 +206,11 @@ bool SettingsAdapter::processReset(const bs::message::Envelope& env const auto& value = appSettings_->get(setting); setFromQVariant(value, setReq, setResp); } - return pushResponse(user_, env, msg.SerializeAsString()); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Success; } -bool SettingsAdapter::processResetToState(const bs::message::Envelope& env +ProcessingResult SettingsAdapter::processResetToState(const bs::message::Envelope& env , const SettingsMessage_SettingsResponse& request) { for (const auto& req : request.responses()) { @@ -218,10 +220,11 @@ bool SettingsAdapter::processResetToState(const bs::message::Envelope& env } SettingsMessage msg; *msg.mutable_state() = request; - return pushResponse(user_, env, msg.SerializeAsString()); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Success; } -bool SettingsAdapter::processBootstrap(const bs::message::Envelope &env +ProcessingResult SettingsAdapter::processBootstrap(const bs::message::Envelope &env , const std::string& bsData) { SettingsMessage msg; @@ -246,8 +249,9 @@ bool SettingsAdapter::processBootstrap(const bs::message::Envelope &env else { logger_->error("[{}] failed to set bootstrap data", __func__); } - return pushResponse(user_, bsData.empty() ? env.sender : nullptr + pushResponse(user_, bsData.empty() ? env.sender : nullptr , msg.SerializeAsString(), bsData.empty() ? env.foreignId() : 0); + return ProcessingResult::Success; } static bs::network::ws::PrivateKey readOrCreatePrivateKey(const std::string& filename) @@ -274,7 +278,7 @@ static bs::network::ws::PrivateKey readOrCreatePrivateKey(const std::string& fil return result; } -bool SettingsAdapter::processApiPrivKey(const bs::message::Envelope& env) +ProcessingResult SettingsAdapter::processApiPrivKey(const bs::message::Envelope& env) { //FIXME: should be re-implemented to avoid storing plain private key in a file on disk const auto &apiKeyFN = appSettings_->AppendToWritableDir( QString::fromStdString("apiPrivKey")).toStdString(); @@ -282,7 +286,8 @@ bool SettingsAdapter::processApiPrivKey(const bs::message::Envelope& env) SettingsMessage msg; SecureBinaryData privKey(apiPrivKey.data(), apiPrivKey.size()); msg.set_api_privkey(privKey.toBinStr()); - return pushResponse(user_, env, msg.SerializeAsString()); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Success; } static std::set readClientKeys(const std::string& filename) @@ -305,7 +310,7 @@ static std::set readClientKeys(const std::string& filename) return result; } -bool SettingsAdapter::processApiClientsList(const bs::message::Envelope& env) +ProcessingResult SettingsAdapter::processApiClientsList(const bs::message::Envelope& env) { const auto& apiKeysFN = appSettings_->AppendToWritableDir( QString::fromStdString("apiClientPubKeys")).toStdString(); @@ -318,7 +323,8 @@ bool SettingsAdapter::processApiClientsList(const bs::message::Envelope& env) for (const auto& clientKey : clientKeys) { msgResp->add_pub_keys(clientKey); } - return pushResponse(user_, env, msg.SerializeAsString()); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Success; } std::string SettingsAdapter::guiMode() const @@ -329,7 +335,7 @@ std::string SettingsAdapter::guiMode() const return appSettings_->guiMode().toStdString(); } -bool SettingsAdapter::processGetRequest(const bs::message::Envelope &env +ProcessingResult SettingsAdapter::processGetRequest(const bs::message::Envelope &env , const SettingsMessage_SettingsRequest &request) { unsigned int nbFetched = 0; @@ -421,12 +427,13 @@ bool SettingsAdapter::processGetRequest(const bs::message::Envelope &env } } if (nbFetched > 0) { - return pushResponse(user_, env, msg.SerializeAsString()); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Success; } - return true; + return ProcessingResult::Ignored; } -bool SettingsAdapter::processPutRequest(const SettingsMessage_SettingsResponse &request) +ProcessingResult SettingsAdapter::processPutRequest(const SettingsMessage_SettingsResponse &request) { unsigned int nbUpdates = 0; for (const auto &req : request.responses()) { @@ -489,12 +496,13 @@ bool SettingsAdapter::processPutRequest(const SettingsMessage_SettingsResponse & if (nbUpdates) { SettingsMessage msg; *(msg.mutable_settings_updated()) = request; - return pushBroadcast(user_, msg.SerializeAsString()); + pushBroadcast(user_, msg.SerializeAsString()); + return ProcessingResult::Success; } - return true; + return ProcessingResult::Ignored; } -bool SettingsAdapter::processArmoryServer(const BlockSettle::Terminal::SettingsMessage_ArmoryServer &request) +ProcessingResult SettingsAdapter::processArmoryServer(const BlockSettle::Terminal::SettingsMessage_ArmoryServer &request) { int selIndex = 0; for (const auto &server : armoryServersProvider_->servers()) { @@ -506,20 +514,20 @@ bool SettingsAdapter::processArmoryServer(const BlockSettle::Terminal::SettingsM } if (selIndex >= armoryServersProvider_->servers().size()) { logger_->error("[{}] failed to find Armory server {}", __func__, request.server_name()); - return true; + return ProcessingResult::Success; } armoryServersProvider_->setupServer(selIndex); appSettings_->selectNetwork(); } -bool SettingsAdapter::processSetArmoryServer(const bs::message::Envelope& env, int index) +ProcessingResult SettingsAdapter::processSetArmoryServer(const bs::message::Envelope& env, int index) { armoryServersProvider_->setupServer(index); appSettings_->selectNetwork(); return processGetArmoryServers(env); } -bool SettingsAdapter::processGetArmoryServers(const bs::message::Envelope& env) +ProcessingResult SettingsAdapter::processGetArmoryServers(const bs::message::Envelope& env) { SettingsMessage msg; auto msgResp = msg.mutable_armory_servers(); @@ -536,7 +544,8 @@ bool SettingsAdapter::processGetArmoryServers(const bs::message::Envelope& env) msgSrv->set_one_way_auth(server.oneWayAuth_); msgSrv->set_password(server.password.toBinStr()); } - return pushResponse(user_, env, msg.SerializeAsString()); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Success; } static ArmoryServer fromMessage(const SettingsMessage_ArmoryServer& msg) @@ -553,7 +562,7 @@ static ArmoryServer fromMessage(const SettingsMessage_ArmoryServer& msg) return result; } -bool SettingsAdapter::processAddArmoryServer(const bs::message::Envelope& env +ProcessingResult SettingsAdapter::processAddArmoryServer(const bs::message::Envelope& env , const SettingsMessage_ArmoryServer& request) { const auto& server = fromMessage(request); @@ -566,7 +575,7 @@ bool SettingsAdapter::processAddArmoryServer(const bs::message::Envelope& env return processGetArmoryServers(env); } -bool SettingsAdapter::processDelArmoryServer(const bs::message::Envelope& env +ProcessingResult SettingsAdapter::processDelArmoryServer(const bs::message::Envelope& env , int index) { if (!armoryServersProvider_->remove(index)) { @@ -575,7 +584,7 @@ bool SettingsAdapter::processDelArmoryServer(const bs::message::Envelope& env return processGetArmoryServers(env); } -bool SettingsAdapter::processUpdArmoryServer(const bs::message::Envelope& env +ProcessingResult SettingsAdapter::processUpdArmoryServer(const bs::message::Envelope& env , const SettingsMessage_ArmoryServerUpdate& request) { const auto& server = fromMessage(request.server()); @@ -585,7 +594,7 @@ bool SettingsAdapter::processUpdArmoryServer(const bs::message::Envelope& env return processGetArmoryServers(env); } -bool SettingsAdapter::processSignerSettings(const bs::message::Envelope &env) +ProcessingResult SettingsAdapter::processSignerSettings(const bs::message::Envelope &env) { SettingsMessage msg; auto msgResp = msg.mutable_signer_response(); @@ -609,22 +618,23 @@ bool SettingsAdapter::processSignerSettings(const bs::message::Envelope &env) msgResp->set_home_dir(appSettings_->GetHomeDir().toStdString()); msgResp->set_auto_sign_spend_limit(appSettings_->get(ApplicationSettings::autoSignSpendLimit)); - return pushResponse(user_, env, msg.SerializeAsString()); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Success; } -bool SettingsAdapter::processSignerSetKey(const SettingsMessage_SignerSetKey &request) +ProcessingResult SettingsAdapter::processSignerSetKey(const SettingsMessage_SignerSetKey &request) { signersProvider_->addKey(request.server_id(), request.new_key()); - return true; + return ProcessingResult::Success; } -bool SettingsAdapter::processSignerReset() +ProcessingResult SettingsAdapter::processSignerReset() { signersProvider_->setupSigner(0, true); - return true; + return ProcessingResult::Success; } -bool SettingsAdapter::processGetSigners(const bs::message::Envelope& env) +ProcessingResult SettingsAdapter::processGetSigners(const bs::message::Envelope& env) { SettingsMessage msg; auto msgResp = msg.mutable_signer_servers(); @@ -637,10 +647,11 @@ bool SettingsAdapter::processGetSigners(const bs::message::Envelope& env) msgSrv->set_port(std::to_string(signer.port)); msgSrv->set_key(signer.key.toStdString()); } - return pushResponse(user_, env, msg.SerializeAsString()); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Success; } -bool SettingsAdapter::processSetSigner(const bs::message::Envelope& env +ProcessingResult SettingsAdapter::processSetSigner(const bs::message::Envelope& env , int index) { signersProvider_->setupSigner(index); @@ -657,7 +668,7 @@ static SignerHost fromMessage(const SettingsMessage_SignerServer& msg) return result; } -bool SettingsAdapter::processAddSigner(const bs::message::Envelope& env +ProcessingResult SettingsAdapter::processAddSigner(const bs::message::Envelope& env , const SettingsMessage_SignerServer& request) { const auto& signer = fromMessage(request); @@ -666,7 +677,7 @@ bool SettingsAdapter::processAddSigner(const bs::message::Envelope& env return processGetSigners(env); } -bool SettingsAdapter::processDelSigner(const bs::message::Envelope& env +ProcessingResult SettingsAdapter::processDelSigner(const bs::message::Envelope& env , int index) { signersProvider_->remove(index); diff --git a/Core/SettingsAdapter.h b/Core/SettingsAdapter.h index 5999dc89b..e2878951a 100644 --- a/Core/SettingsAdapter.h +++ b/Core/SettingsAdapter.h @@ -58,7 +58,7 @@ class SettingsAdapter : public bs::message::Adapter , const QStringList &appArgs); ~SettingsAdapter() override = default; - bool process(const bs::message::Envelope &) override; + bs::message::ProcessingResult process(const bs::message::Envelope &) override; bool processBroadcast(const bs::message::Envelope&) override; Users supportedReceivers() const override { return { user_ }; } @@ -68,34 +68,34 @@ class SettingsAdapter : public bs::message::Adapter std::string guiMode() const; private: - bool processGetRequest(const bs::message::Envelope & + bs::message::ProcessingResult processGetRequest(const bs::message::Envelope & , const BlockSettle::Terminal::SettingsMessage_SettingsRequest &); - bool processPutRequest(const BlockSettle::Terminal::SettingsMessage_SettingsResponse &); - bool processArmoryServer(const BlockSettle::Terminal::SettingsMessage_ArmoryServer &); - bool processSetArmoryServer(const bs::message::Envelope&, int index); - bool processGetArmoryServers(const bs::message::Envelope&); - bool processAddArmoryServer(const bs::message::Envelope& + bs::message::ProcessingResult processPutRequest(const BlockSettle::Terminal::SettingsMessage_SettingsResponse &); + bs::message::ProcessingResult processArmoryServer(const BlockSettle::Terminal::SettingsMessage_ArmoryServer &); + bs::message::ProcessingResult processSetArmoryServer(const bs::message::Envelope&, int index); + bs::message::ProcessingResult processGetArmoryServers(const bs::message::Envelope&); + bs::message::ProcessingResult processAddArmoryServer(const bs::message::Envelope& , const BlockSettle::Terminal::SettingsMessage_ArmoryServer&); - bool processDelArmoryServer(const bs::message::Envelope&, int index); - bool processUpdArmoryServer(const bs::message::Envelope& + bs::message::ProcessingResult processDelArmoryServer(const bs::message::Envelope&, int index); + bs::message::ProcessingResult processUpdArmoryServer(const bs::message::Envelope& , const BlockSettle::Terminal::SettingsMessage_ArmoryServerUpdate&); - bool processSignerSettings(const bs::message::Envelope &); - bool processSignerSetKey(const BlockSettle::Terminal::SettingsMessage_SignerSetKey &); - bool processSignerReset(); - bool processGetSigners(const bs::message::Envelope&); - bool processSetSigner(const bs::message::Envelope&, int); - bool processAddSigner(const bs::message::Envelope& + bs::message::ProcessingResult processSignerSettings(const bs::message::Envelope &); + bs::message::ProcessingResult processSignerSetKey(const BlockSettle::Terminal::SettingsMessage_SignerSetKey &); + bs::message::ProcessingResult processSignerReset(); + bs::message::ProcessingResult processGetSigners(const bs::message::Envelope&); + bs::message::ProcessingResult processSetSigner(const bs::message::Envelope&, int); + bs::message::ProcessingResult processAddSigner(const bs::message::Envelope& , const BlockSettle::Terminal::SettingsMessage_SignerServer&); - bool processDelSigner(const bs::message::Envelope&, int); - bool processRemoteSettings(uint64_t msgId); - bool processGetState(const bs::message::Envelope&); - bool processReset(const bs::message::Envelope& + bs::message::ProcessingResult processDelSigner(const bs::message::Envelope&, int); + bs::message::ProcessingResult processRemoteSettings(uint64_t msgId); + bs::message::ProcessingResult processGetState(const bs::message::Envelope&); + bs::message::ProcessingResult processReset(const bs::message::Envelope& , const BlockSettle::Terminal::SettingsMessage_SettingsRequest&); - bool processResetToState(const bs::message::Envelope& + bs::message::ProcessingResult processResetToState(const bs::message::Envelope& , const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); - bool processBootstrap(const bs::message::Envelope&, const std::string&); - bool processApiPrivKey(const bs::message::Envelope&); - bool processApiClientsList(const bs::message::Envelope&); + bs::message::ProcessingResult processBootstrap(const bs::message::Envelope&, const std::string&); + bs::message::ProcessingResult processApiPrivKey(const bs::message::Envelope&); + bs::message::ProcessingResult processApiClientsList(const bs::message::Envelope&); private: std::shared_ptr user_; diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 35b1de300..2c318b561 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -37,13 +37,13 @@ std::unique_ptr SignerAdapter::createClient() const return client; } -bool SignerAdapter::process(const bs::message::Envelope &env) +ProcessingResult SignerAdapter::process(const bs::message::Envelope &env) { if (env.isRequest()) { SignerMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse own msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } return processOwnRequest(env, msg); } @@ -51,7 +51,7 @@ bool SignerAdapter::process(const bs::message::Envelope &env) SettingsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse settings msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case SettingsMessage::kSignerResponse: @@ -61,7 +61,7 @@ bool SignerAdapter::process(const bs::message::Envelope &env) default: break; } } - return true; + return ProcessingResult::Ignored; } bool SignerAdapter::processBroadcast(const bs::message::Envelope& env) @@ -97,7 +97,7 @@ void SignerAdapter::start() , msg.SerializeAsString()); } -bool SignerAdapter::processOwnRequest(const bs::message::Envelope &env +ProcessingResult SignerAdapter::processOwnRequest(const bs::message::Envelope &env , const SignerMessage &request) { switch (request.data_case()) { @@ -142,10 +142,10 @@ bool SignerAdapter::processOwnRequest(const bs::message::Envelope &env logger_->warn("[{}] unknown signer request: {}", __func__, request.data_case()); break; } - return true; + return ProcessingResult::Ignored; } -bool SignerAdapter::processSignerSettings(const SettingsMessage_SignerServer &response) +ProcessingResult SignerAdapter::processSignerSettings(const SettingsMessage_SignerServer &response) { curServerId_ = response.id(); netType_ = static_cast(response.network_type()); @@ -163,7 +163,8 @@ bool SignerAdapter::processSignerSettings(const SettingsMessage_SignerServer &re logger_->info("[{}] loading wallets from {}", __func__, walletsDir_); signer_->Start(); walletsChanged(); - return sendComponentLoading(); + sendComponentLoading(); + return ProcessingResult::Success; } void SignerAdapter::walletsChanged(bool rescan) @@ -228,14 +229,15 @@ bool SignerAdapter::sendComponentLoading() static const auto &adminUser = UserTerminal::create(TerminalUsers::System); AdministrativeMessage msg; msg.set_component_loading(user_->value()); - return pushBroadcast(adminUser, msg.SerializeAsString()); + pushBroadcast(adminUser, msg.SerializeAsString()); + return true; } -bool SignerAdapter::processNewKeyResponse(bool acceptNewKey) +ProcessingResult SignerAdapter::processNewKeyResponse(bool acceptNewKey) { if (!connFuture_) { logger_->error("[{}] new key comparison wasn't requested", __func__); - return true; + return ProcessingResult::Error; } connFuture_->setValue(acceptNewKey); if (acceptNewKey) { @@ -247,10 +249,10 @@ bool SignerAdapter::processNewKeyResponse(bool acceptNewKey) , msg.SerializeAsString()); } connFuture_.reset(); - return true; + return ProcessingResult::Success; } -bool SignerAdapter::processStartWalletSync(const bs::message::Envelope &env) +ProcessingResult SignerAdapter::processStartWalletSync(const bs::message::Envelope &env) { requests_.put(env.foreignId(), env.sender); const auto &cbWallets = [this, msgId=env.foreignId()] @@ -285,10 +287,10 @@ bool SignerAdapter::processStartWalletSync(const bs::message::Envelope &env) pushResponse(user_, sender, msg.SerializeAsString(), msgId); }; signer_->syncWalletInfo(cbWallets); - return true; + return ProcessingResult::Success; } -bool SignerAdapter::processSyncAddresses(const bs::message::Envelope &env +ProcessingResult SignerAdapter::processSyncAddresses(const bs::message::Envelope &env , const SignerMessage_SyncAddresses &request) { requests_.put(env.foreignId(), env.sender); @@ -311,10 +313,10 @@ bool SignerAdapter::processSyncAddresses(const bs::message::Envelope &env addrSet.insert(BinaryData::fromString(addr)); } signer_->syncAddressBatch(request.wallet_id(), addrSet, cb); - return true; + return ProcessingResult::Success; } -bool SignerAdapter::processSyncNewAddresses(const bs::message::Envelope &env +ProcessingResult SignerAdapter::processSyncNewAddresses(const bs::message::Envelope &env , const SignerMessage_SyncNewAddresses &request) { requests_.put(env.foreignId(), env.sender); @@ -335,7 +337,7 @@ bool SignerAdapter::processSyncNewAddresses(const bs::message::Envelope &env }; if (request.indices_size() != 1) { logger_->error("[{}] not a single new address request", __func__); - return true; + return ProcessingResult::Error; } signer_->syncNewAddress(request.wallet_id(), request.indices(0), cb); } @@ -364,10 +366,10 @@ bool SignerAdapter::processSyncNewAddresses(const bs::message::Envelope &env } signer_->syncNewAddresses(request.wallet_id(), indices, cb); } - return true; + return ProcessingResult::Success; } -bool SignerAdapter::processExtendAddrChain(const bs::message::Envelope &env +ProcessingResult SignerAdapter::processExtendAddrChain(const bs::message::Envelope &env , const SignerMessage_ExtendAddrChain &request) { requests_.put(env.foreignId(), env.sender); @@ -389,10 +391,10 @@ bool SignerAdapter::processExtendAddrChain(const bs::message::Envelope &env pushResponse(user_, sender, msg.SerializeAsString(), msgId); }; signer_->extendAddressChain(request.wallet_id(), request.count(), request.ext_int(), cb); - return true; + return ProcessingResult::Success; } -bool SignerAdapter::processSyncWallet(const bs::message::Envelope &env +ProcessingResult SignerAdapter::processSyncWallet(const bs::message::Envelope &env , const std::string &walletId) { requests_.put(env.foreignId(), env.sender); @@ -429,10 +431,10 @@ bool SignerAdapter::processSyncWallet(const bs::message::Envelope &env pushResponse(user_, sender, msg.SerializeAsString(), msgId); }; signer_->syncWallet(walletId, cb); - return true; + return ProcessingResult::Success; } -bool SignerAdapter::processSyncHdWallet(const bs::message::Envelope &env +ProcessingResult SignerAdapter::processSyncHdWallet(const bs::message::Envelope &env , const std::string &walletId) { requests_.put(env.foreignId(), env.sender); @@ -451,27 +453,27 @@ bool SignerAdapter::processSyncHdWallet(const bs::message::Envelope &env pushResponse(user_, sender, msg.SerializeAsString(), msgId); }; signer_->syncHDWallet(walletId, cb); - return true; + return ProcessingResult::Success; } -bool SignerAdapter::processSyncAddrComment(const SignerMessage_SyncAddressComment &request) +ProcessingResult SignerAdapter::processSyncAddrComment(const SignerMessage_SyncAddressComment &request) { try { signer_->syncAddressComment(request.wallet_id() , bs::Address::fromAddressString(request.address()), request.comment()); } catch (const std::exception &) {} - return true; + return ProcessingResult::Success; } -bool SignerAdapter::processSyncTxComment(const SignerMessage_SyncTxComment &request) +ProcessingResult SignerAdapter::processSyncTxComment(const SignerMessage_SyncTxComment &request) { signer_->syncTxComment(request.wallet_id() , BinaryData::fromString(request.tx_hash()), request.comment()); - return true; + return ProcessingResult::Success; } -bool SignerAdapter::processGetRootPubKey(const bs::message::Envelope &env +ProcessingResult SignerAdapter::processGetRootPubKey(const bs::message::Envelope &env , const std::string &walletId) { requests_.put(env.foreignId(), env.sender); @@ -491,20 +493,22 @@ bool SignerAdapter::processGetRootPubKey(const bs::message::Envelope &env pushResponse(user_, sender, msg.SerializeAsString(), msgId); }; signer_->getRootPubkey(walletId, cb); - return true; + return ProcessingResult::Success; } -bool SignerAdapter::processDelHdRoot(const std::string &walletId) +ProcessingResult SignerAdapter::processDelHdRoot(const std::string &walletId) { - return (signer_->DeleteHDRoot(walletId) > 0); + signer_->DeleteHDRoot(walletId); + return ProcessingResult::Success; } -bool SignerAdapter::processDelHdLeaf(const std::string &walletId) +ProcessingResult SignerAdapter::processDelHdLeaf(const std::string &walletId) { - return (signer_->DeleteHDLeaf(walletId) > 0); + signer_->DeleteHDLeaf(walletId); + return ProcessingResult::Success; } -bool SignerAdapter::processSignTx(const bs::message::Envelope& env +ProcessingResult SignerAdapter::processSignTx(const bs::message::Envelope& env , const SignerMessage_SignTxRequest& request) { const auto& cbSigned = [this, env, id=request.id()] @@ -524,10 +528,10 @@ bool SignerAdapter::processSignTx(const bs::message::Envelope& env signer_->signTXRequest(txReq, cbSigned , static_cast(request.sign_mode()) , request.keep_dup_recips()); - return true; + return ProcessingResult::Success; } -bool SignerAdapter::processResolvePubSpenders(const bs::message::Envelope& env +ProcessingResult SignerAdapter::processResolvePubSpenders(const bs::message::Envelope& env , const bs::core::wallet::TXSignRequest& txReq) { const auto& cbResolve = [this, env](bs::error::ErrorCode result @@ -542,21 +546,21 @@ bool SignerAdapter::processResolvePubSpenders(const bs::message::Envelope& env if (signer_->resolvePublicSpenders(txReq, cbResolve) == 0) { logger_->error("[{}] failed to send", __func__); } - return true; + return ProcessingResult::Success; } -bool SignerAdapter::processAutoSignRequest(const bs::message::Envelope& env +ProcessingResult SignerAdapter::processAutoSignRequest(const bs::message::Envelope& env , const SignerMessage_AutoSign& request) { autoSignRequests_[request.wallet_id()] = env; QVariantMap data; data[QLatin1String("rootId")] = QString::fromStdString(request.wallet_id()); data[QLatin1String("enable")] = request.enable(); - return (signer_->customDialogRequest(bs::signer::ui::GeneralDialogType::ActivateAutoSign - , data) != 0); + signer_->customDialogRequest(bs::signer::ui::GeneralDialogType::ActivateAutoSign, data); + return ProcessingResult::Success; } -bool SignerAdapter::processDialogRequest(const bs::message::Envelope& +ProcessingResult SignerAdapter::processDialogRequest(const bs::message::Envelope& , const SignerMessage_DialogRequest& request) { const auto& dlgType = static_cast(request.dialog_type()); @@ -564,10 +568,11 @@ bool SignerAdapter::processDialogRequest(const bs::message::Envelope& for (const auto& d : request.data()) { data[QString::fromStdString(d.key())] = QString::fromStdString(d.value()); } - return (signer_->customDialogRequest(dlgType, data) != 0); + signer_->customDialogRequest(dlgType, data); + return ProcessingResult::Success; } -bool SignerAdapter::processCreateWallet(const bs::message::Envelope& env +ProcessingResult SignerAdapter::processCreateWallet(const bs::message::Envelope& env , bool rescan, const SignerMessage_CreateWalletRequest& w) { bs::wallet::PasswordData pwdData; @@ -592,10 +597,10 @@ bool SignerAdapter::processCreateWallet(const bs::message::Envelope& env msgResp->set_error_msg(e.what()); } pushResponse(user_, env, msg.SerializeAsString()); - return true; + return ProcessingResult::Success; } -bool SignerAdapter::processDeleteWallet(const bs::message::Envelope& env +ProcessingResult SignerAdapter::processDeleteWallet(const bs::message::Envelope& env , const std::string& rootId) { SignerMessage msg; @@ -607,5 +612,5 @@ bool SignerAdapter::processDeleteWallet(const bs::message::Envelope& env msg.set_wallet_deleted(""); } pushBroadcast(user_, msg.SerializeAsString()); - return true; + return ProcessingResult::Success; } diff --git a/Core/SignerAdapter.h b/Core/SignerAdapter.h index 1a942dc57..44866a784 100644 --- a/Core/SignerAdapter.h +++ b/Core/SignerAdapter.h @@ -55,7 +55,7 @@ class SignerAdapter : public bs::message::Adapter, public SignerCallbackTarget , const std::shared_ptr &signer = nullptr); ~SignerAdapter() override = default; - bool process(const bs::message::Envelope &) override; + bs::message::ProcessingResult process(const bs::message::Envelope &) override; bool processBroadcast(const bs::message::Envelope&) override; Users supportedReceivers() const override { return { user_ }; } @@ -74,37 +74,37 @@ class SignerAdapter : public bs::message::Adapter, public SignerCallbackTarget void autoSignStateChanged(bs::error::ErrorCode , const std::string& walletId) override; - bool processOwnRequest(const bs::message::Envelope & + bs::message::ProcessingResult processOwnRequest(const bs::message::Envelope & , const BlockSettle::Common::SignerMessage &); - bool processSignerSettings(const BlockSettle::Terminal::SettingsMessage_SignerServer &); - bool processNewKeyResponse(bool); + bs::message::ProcessingResult processSignerSettings(const BlockSettle::Terminal::SettingsMessage_SignerServer &); + bs::message::ProcessingResult processNewKeyResponse(bool); bool sendComponentLoading(); - bool processStartWalletSync(const bs::message::Envelope &); - bool processSyncAddresses(const bs::message::Envelope & + bs::message::ProcessingResult processStartWalletSync(const bs::message::Envelope &); + bs::message::ProcessingResult processSyncAddresses(const bs::message::Envelope & , const BlockSettle::Common::SignerMessage_SyncAddresses &); - bool processSyncNewAddresses(const bs::message::Envelope & + bs::message::ProcessingResult processSyncNewAddresses(const bs::message::Envelope & , const BlockSettle::Common::SignerMessage_SyncNewAddresses &); - bool processExtendAddrChain(const bs::message::Envelope & + bs::message::ProcessingResult processExtendAddrChain(const bs::message::Envelope & , const BlockSettle::Common::SignerMessage_ExtendAddrChain &); - bool processSyncWallet(const bs::message::Envelope &, const std::string &walletId); - bool processSyncHdWallet(const bs::message::Envelope &, const std::string &walletId); - bool processSyncAddrComment(const BlockSettle::Common::SignerMessage_SyncAddressComment &); - bool processSyncTxComment(const BlockSettle::Common::SignerMessage_SyncTxComment &); - bool processGetRootPubKey(const bs::message::Envelope &, const std::string &walletId); - bool processDelHdRoot(const std::string &walletId); - bool processDelHdLeaf(const std::string &walletId); - bool processSignTx(const bs::message::Envelope& + bs::message::ProcessingResult processSyncWallet(const bs::message::Envelope &, const std::string &walletId); + bs::message::ProcessingResult processSyncHdWallet(const bs::message::Envelope &, const std::string &walletId); + bs::message::ProcessingResult processSyncAddrComment(const BlockSettle::Common::SignerMessage_SyncAddressComment &); + bs::message::ProcessingResult processSyncTxComment(const BlockSettle::Common::SignerMessage_SyncTxComment &); + bs::message::ProcessingResult processGetRootPubKey(const bs::message::Envelope &, const std::string &walletId); + bs::message::ProcessingResult processDelHdRoot(const std::string &walletId); + bs::message::ProcessingResult processDelHdLeaf(const std::string &walletId); + bs::message::ProcessingResult processSignTx(const bs::message::Envelope& , const BlockSettle::Common::SignerMessage_SignTxRequest&); - bool processResolvePubSpenders(const bs::message::Envelope& + bs::message::ProcessingResult processResolvePubSpenders(const bs::message::Envelope& , const bs::core::wallet::TXSignRequest&); - bool processAutoSignRequest(const bs::message::Envelope& + bs::message::ProcessingResult processAutoSignRequest(const bs::message::Envelope& , const BlockSettle::Common::SignerMessage_AutoSign&); - bool processDialogRequest(const bs::message::Envelope& + bs::message::ProcessingResult processDialogRequest(const bs::message::Envelope& , const BlockSettle::Common::SignerMessage_DialogRequest&); - bool processCreateWallet(const bs::message::Envelope&, bool rescan + bs::message::ProcessingResult processCreateWallet(const bs::message::Envelope&, bool rescan , const BlockSettle::Common::SignerMessage_CreateWalletRequest&); - bool processDeleteWallet(const bs::message::Envelope&, const std::string& rootId); + bs::message::ProcessingResult processDeleteWallet(const bs::message::Envelope&, const std::string& rootId); private: std::shared_ptr logger_; @@ -123,5 +123,4 @@ class SignerAdapter : public bs::message::Adapter, public SignerCallbackTarget SecureBinaryData passphrase_; }; - #endif // SIGNER_ADAPTER_H diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp new file mode 100644 index 000000000..f3a0b6da2 --- /dev/null +++ b/GUI/QtQuick/AddressListModel.cpp @@ -0,0 +1,112 @@ +/* + +*********************************************************************************** +* Copyright (C) 2020 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "AddressListModel.h" +#include "Address.h" +#include "BTCNumericTypes.h" + +namespace { + static const QHash kRoles{ + {QmlAddressListModel::TableDataRole, "tabledata"}, + {QmlAddressListModel::HeadingRole, "heading"}, + {QmlAddressListModel::FirstColRole, "firstcol"} + }; +} + +QmlAddressListModel::QmlAddressListModel(const std::shared_ptr&, QObject* parent) + : QAbstractTableModel(parent) +{ + table.append({tr("Address"), tr("Balance (BTC)"), tr("#Tx"), tr("Comment")}); +} + +int QmlAddressListModel::rowCount(const QModelIndex &) const +{ + return table.size(); +} + +int QmlAddressListModel::columnCount(const QModelIndex &) const +{ + return 4; +} + +QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const +{ + if (index.column() > 3) { + return {}; + } + switch (role) { + case TableDataRole: + return table.at(index.row()).at(index.column()); + case HeadingRole: + return (index.row() == 0); + case FirstColRole: + return (index.column() == 0); + default: break; + } + return QVariant(); +} + +QHash QmlAddressListModel::roleNames() const +{ + return kRoles; +} + +void QmlAddressListModel::addRow(const QVector& row) +{ + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + try { + const auto& addr = bs::Address::fromAddressString(row.at(0).toStdString()); + const auto& itAddr = pendingBalances_.find(addr.id()); + if (itAddr != pendingBalances_.end()) { + auto rowCopy = row; + rowCopy[1] = QString::number(itAddr->second.balance / BTCNumericTypes::BalanceDivider, 'f', 8); + rowCopy[2] = QString::number(itAddr->second.nbTx); + pendingBalances_.erase(itAddr); + table.append(rowCopy); + } + else { + table.append(row); + } + } + catch (const std::exception&) { + table.append(row); + } + endInsertRows(); +} + +void QmlAddressListModel::updateRow(const BinaryData& addrPubKey, uint64_t bal, uint32_t nbTx) +{ + bool updated = false; + for (int i = 1; i < table.size(); ++ i) { + auto& row = table[i]; + try { + const auto& addr = bs::Address::fromAddressString(row.at(0).toStdString()); + if (addr.id() == addrPubKey) { + row[1] = QString::number(bal / BTCNumericTypes::BalanceDivider, 'f', 8); + row[2] = QString::number(nbTx); + emit dataChanged(createIndex(i, 1), createIndex(i, 2)); + updated = true; + break; + } + } + catch (const std::exception&) {} + } + if (!updated) { + pendingBalances_[addrPubKey] = { bal, nbTx }; + } +} + +void QmlAddressListModel::clear() +{ + pendingBalances_.clear(); + beginResetModel(); + table.remove(1, table.size() - 1); + endResetModel(); +} diff --git a/GUI/QtQuick/AddressListModel.h b/GUI/QtQuick/AddressListModel.h new file mode 100644 index 000000000..e852b2079 --- /dev/null +++ b/GUI/QtQuick/AddressListModel.h @@ -0,0 +1,49 @@ +/* + +*********************************************************************************** +* Copyright (C) 2020 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef ADDRESS_LIST_MODEL_H +#define ADDRESS_LIST_MODEL_H + +#include +#include +#include +#include "BinaryData.h" + +namespace spdlog { + class logger; +} + +class QmlAddressListModel : public QAbstractTableModel +{ + Q_OBJECT +public: + enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, FirstColRole }; + QmlAddressListModel(const std::shared_ptr&, QObject* parent = nullptr); + + int rowCount(const QModelIndex & = QModelIndex()) const override; + int columnCount(const QModelIndex & = QModelIndex()) const override; + QVariant data(const QModelIndex& index, int role) const override; + QHash roleNames() const override; + + void addRow(const QVector&); + void updateRow(const BinaryData& addr, uint64_t bal, uint32_t nbTx); + void clear(); + +private: + QVector> table; + + struct PendingBalance { + uint64_t balance{ 0 }; + uint32_t nbTx{ 0 }; + }; + std::map pendingBalances_; +}; + +#endif // ADDRESS_LIST_MODEL_H diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index b5f3e464d..88f8e4a7a 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -11,6 +11,7 @@ #include "CommonTypes.h" #include "QtQuickAdapter.h" #include +#include #include #include #include @@ -20,12 +21,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include "bip39/bip39.h" #include "BSMessageBox.h" #include "BSTerminalSplashScreen.h" #include "Wallets/ProtobufHeadlessUtils.h" @@ -88,14 +91,19 @@ static void checkStyleSheet(QApplication& app) app.setStyleSheet(QString::fromLatin1(stylesheetFile.readAll())); } + QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) : QObject(nullptr), logger_(logger) , userSettings_(std::make_shared(TerminalUsers::Settings)) , userWallets_(std::make_shared(TerminalUsers::Wallets)) , userBlockchain_(std::make_shared(TerminalUsers::Blockchain)) , userSigner_(std::make_shared(TerminalUsers::Signer)) + , txTypes_({ tr("All transactions") }) { staticLogger = logger; + addrModel_ = new QmlAddressListModel(logger, this); + pendingTxModel_ = new TxListModel(logger, this); + txModel_ = new TxListModel(logger, this); } QtQuickAdapter::~QtQuickAdapter() @@ -169,8 +177,14 @@ void QtQuickAdapter::run(int &argc, char **argv) logger_->debug("[QtGuiAdapter::run] creating QML app"); QQmlApplicationEngine engine; QQuickWindow::setTextRenderType(QQuickWindow::NativeTextRendering); + rootCtxt_ = engine.rootContext(); const QFont fixedFont = QFontDatabase::systemFont(QFontDatabase::FixedFont); - engine.rootContext()->setContextProperty(QStringLiteral("fixedFont"), fixedFont); + rootCtxt_->setContextProperty(QStringLiteral("fixedFont"), fixedFont); + rootCtxt_->setContextProperty(QLatin1Literal("bsApp"), this); + rootCtxt_->setContextProperty(QLatin1Literal("addressListModel"), addrModel_); + rootCtxt_->setContextProperty(QLatin1Literal("pendingTxListModel"), pendingTxModel_); + rootCtxt_->setContextProperty(QLatin1Literal("txListModel"), txModel_); + engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); if (engine.rootObjects().empty()) { BSMessageBox box(BSMessageBox::critical, app.tr("BlockSettle Terminal") @@ -178,6 +192,7 @@ void QtQuickAdapter::run(int &argc, char **argv) box.exec(); return; } + rootObj_ = engine.rootObjects().at(0); if (loadingDone_) { auto window = qobject_cast(rootObj_); @@ -186,6 +201,15 @@ void QtQuickAdapter::run(int &argc, char **argv) } } + auto comboWalletsList = rootObj_->findChild(QLatin1Literal("walletsComboBox")); + if (comboWalletsList) { + QObject::connect((QObject*)comboWalletsList, SIGNAL(activated(int)), this, SLOT(walletSelected(int))); + } + comboWalletsList = rootObj_->findChild(QLatin1Literal("receiveWalletsComboBox")); + if (comboWalletsList) { + QObject::connect((QObject*)comboWalletsList, SIGNAL(activated(int)), this, SLOT(walletSelected(int))); + } + updateStates(); requestInitialSettings(); @@ -193,7 +217,14 @@ void QtQuickAdapter::run(int &argc, char **argv) app.exec(); } -bool QtQuickAdapter::process(const Envelope &env) +QStringList QtQuickAdapter::txWalletsList() const +{ + QStringList result = { tr("All wallets") }; + result.append(walletsList_); + return result; +} + +ProcessingResult QtQuickAdapter::process(const Envelope &env) { if (std::dynamic_pointer_cast(env.sender)) { switch (env.sender->value()) { @@ -208,7 +239,7 @@ bool QtQuickAdapter::process(const Envelope &env) default: break; } } - return true; + return ProcessingResult::Ignored; } bool QtQuickAdapter::processBroadcast(const bs::message::Envelope& env) @@ -216,27 +247,27 @@ bool QtQuickAdapter::processBroadcast(const bs::message::Envelope& env) if (std::dynamic_pointer_cast(env.sender)) { switch (env.sender->value()) { case TerminalUsers::System: - return processAdminMessage(env); + return (processAdminMessage(env) != ProcessingResult::Ignored); case TerminalUsers::Settings: - return processSettings(env); + return (processSettings(env) != ProcessingResult::Ignored); case TerminalUsers::Blockchain: - return processBlockchain(env); + return (processBlockchain(env) != ProcessingResult::Ignored); case TerminalUsers::Signer: - return processSigner(env); + return (processSigner(env) != ProcessingResult::Ignored); case TerminalUsers::Wallets: - return processWallets(env); + return (processWallets(env) != ProcessingResult::Ignored); default: break; } } return false; } -bool QtQuickAdapter::processSettings(const Envelope &env) +ProcessingResult QtQuickAdapter::processSettings(const Envelope &env) { SettingsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse settings msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case SettingsMessage::kGetResponse: @@ -249,10 +280,10 @@ bool QtQuickAdapter::processSettings(const Envelope &env) return processArmoryServers(msg.armory_servers()); default: break; } - return true; + return ProcessingResult::Ignored; } -bool QtQuickAdapter::processSettingsGetResponse(const SettingsMessage_SettingsResponse &response) +ProcessingResult QtQuickAdapter::processSettingsGetResponse(const SettingsMessage_SettingsResponse &response) { std::map settings; for (const auto &setting : response.responses()) { @@ -292,10 +323,10 @@ bool QtQuickAdapter::processSettingsGetResponse(const SettingsMessage_SettingsRe if (!settings.empty()) { //TODO: propagate settings to GUI } - return true; + return ProcessingResult::Success; } -bool QtQuickAdapter::processSettingsState(const SettingsMessage_SettingsResponse& response) +ProcessingResult QtQuickAdapter::processSettingsState(const SettingsMessage_SettingsResponse& response) { ApplicationSettings::State state; for (const auto& setting : response.responses()) { @@ -303,10 +334,10 @@ bool QtQuickAdapter::processSettingsState(const SettingsMessage_SettingsResponse fromResponse(setting); } //TODO: process setting - return true; + return ProcessingResult::Success; } -bool QtQuickAdapter::processArmoryServers(const SettingsMessage_ArmoryServers& response) +ProcessingResult QtQuickAdapter::processArmoryServers(const SettingsMessage_ArmoryServers& response) { QList servers; for (const auto& server : response.servers()) { @@ -320,15 +351,15 @@ bool QtQuickAdapter::processArmoryServers(const SettingsMessage_ArmoryServers& r logger_->debug("[{}] {} servers, cur: {}, conn: {}", __func__, servers.size() , response.idx_current(), response.idx_connected()); //TODO - return true; + return ProcessingResult::Success; } -bool QtQuickAdapter::processAdminMessage(const Envelope &env) +ProcessingResult QtQuickAdapter::processAdminMessage(const Envelope &env) { AdministrativeMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse admin msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case AdministrativeMessage::kComponentCreated: @@ -350,10 +381,10 @@ bool QtQuickAdapter::processAdminMessage(const Envelope &env) default: break; } updateSplashProgress(); - return true; + return ProcessingResult::Success; } -bool QtQuickAdapter::processBlockchain(const Envelope &env) +ProcessingResult QtQuickAdapter::processBlockchain(const Envelope &env) { ArmoryMessage msg; if (!msg.ParseFromString(env.message)) { @@ -362,7 +393,7 @@ bool QtQuickAdapter::processBlockchain(const Envelope &env) if (!env.receiver) { logger_->debug("[{}] no receiver", __func__); } - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case ArmoryMessage::kLoading: @@ -381,7 +412,9 @@ bool QtQuickAdapter::processBlockchain(const Envelope &env) case ArmoryMessage::kWalletRegistered: if (msg.wallet_registered().success() && msg.wallet_registered().wallet_id().empty()) { walletsReady_ = true; - //TODO + WalletsMessage msg; + msg.set_get_ledger_entries({}); + pushRequest(user_, userWallets_, msg.SerializeAsString()); } break; case ArmoryMessage::kAddressHistory: @@ -392,12 +425,12 @@ bool QtQuickAdapter::processBlockchain(const Envelope &env) return processZC(msg.zc_received()); case ArmoryMessage::kZcInvalidated: return processZCInvalidated(msg.zc_invalidated()); - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool QtQuickAdapter::processSigner(const Envelope &env) +ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) { SignerMessage msg; if (!msg.ParseFromString(env.message)) { @@ -406,7 +439,7 @@ bool QtQuickAdapter::processSigner(const Envelope &env) if (!env.receiver) { logger_->debug("[{}] no receiver", __func__); } - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case SignerMessage::kState: @@ -431,17 +464,22 @@ bool QtQuickAdapter::processSigner(const Envelope &env) //TODO } break; - default: break; + case SignerMessage::kCreatedWallet: + walletsList_.clear(); + logger_->debug("[{}] wallet {} created: {}", __func__ //TODO: show something in the GUI if needed + , msg.created_wallet().wallet_id(), msg.created_wallet().error_msg()); + break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool QtQuickAdapter::processWallets(const Envelope &env) +ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) { WalletsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case WalletsMessage::kLoading: @@ -476,15 +514,7 @@ bool QtQuickAdapter::processWallets(const Envelope &env) } catch (const std::exception &) {} } - const auto& walletId = msg.wallet_addresses().wallet_id(); - auto itReq = needChangeAddrReqs_.find(env.responseId()); - if (itReq != needChangeAddrReqs_.end()) { - //TODO - needChangeAddrReqs_.erase(itReq); - } - else { - //TODO - } + processWalletAddresses(addresses); } break; @@ -502,7 +532,9 @@ bool QtQuickAdapter::processWallets(const Envelope &env) case WalletsMessage::kWalletData: return processWalletData(env.responseId(), msg.wallet_data()); case WalletsMessage::kWalletBalances: - return processWalletBalances(env, msg.wallet_balances()); + if (env.responseId()) { + return processWalletBalances(msg.wallet_balances()); + } case WalletsMessage::kTxDetailsResponse: return processTXDetails(env.responseId(), msg.tx_details_response()); case WalletsMessage::kWalletsListResponse: @@ -513,14 +545,16 @@ bool QtQuickAdapter::processWallets(const Envelope &env) return processReservedUTXOs(msg.reserved_utxos()); case WalletsMessage::kWalletChanged: if (walletsReady_) { - //TODO: onNeedLedgerEntries({}); + WalletsMessage msg; + msg.set_get_ledger_entries({}); + pushRequest(user_, userWallets_, msg.SerializeAsString()); } break; case WalletsMessage::kLedgerEntries: return processLedgerEntries(msg.ledger_entries()); - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } void QtQuickAdapter::updateStates() @@ -536,6 +570,9 @@ void QtQuickAdapter::updateSplashProgress() if (splashScreen_) { QMetaObject::invokeMethod(splashScreen_, [this] { QTimer::singleShot(100, [this] { + if (!splashScreen_) { + return; + } splashScreen_->hide(); splashScreen_->deleteLater(); splashScreen_ = nullptr; @@ -639,48 +676,94 @@ void QtQuickAdapter::createWallet(bool primary) logger_->debug("[{}] primary: {}", __func__, primary); } +std::string QtQuickAdapter::hdWalletIdByIndex(int index) +{ + if ((index < 0) || (index >= walletsList_.size())) { + return {}; + } + const auto& walletName = walletsList_.at(index).toStdString(); + std::string walletId; + for (const auto& wallet : hdWallets_) { + if (wallet.second.name == walletName) { + walletId = wallet.first; + break; + } + } + return walletId; +} + +void QtQuickAdapter::walletSelected(int index) +{ + const auto& walletName = walletsList_.at(index).toStdString(); + const auto& walletId = hdWalletIdByIndex(index); + confWalletBalance_ = unconfWalletBalance_ = totalWalletBalance_ = 0; + nbUsedWalletAddresses_ = 0; + WalletsMessage msg; + msg.set_get_wallet_balances(walletId); + pushRequest(user_, userWallets_, msg.SerializeAsString(), {}, 10, std::chrono::milliseconds{500}); + + addrModel_->clear(); + msg.set_wallet_get(walletId); + const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); + walletInfoReq_[msgId] = walletName; + walletNames_[walletId] = walletName; +} + void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) { hdWallets_[*wi.ids.cbegin()] = wi; - //TODO + walletsList_.push_back(QString::fromStdString(wi.name)); + logger_->debug("[QtQuickAdapter::processWalletLoaded] {}", wi.name); + emit walletsListChanged(); + if (hdWallets_.size() == 1) { + walletSelected(0); + } } -bool QtQuickAdapter::processWalletData(uint64_t msgId +ProcessingResult QtQuickAdapter::processWalletData(uint64_t msgId , const WalletsMessage_WalletData& response) { - const auto& itWallet = walletGetMap_.find(msgId); - if (itWallet == walletGetMap_.end()) { - return true; + const auto& itReq = walletInfoReq_.find(msgId); + if (itReq != walletInfoReq_.end()) { + std::unordered_set walletIds; + for (const auto& addr : response.used_addresses()) { + walletIds.insert(addr.wallet_id()); + if (!addr.comment().empty()) { + try { + const auto& address = bs::Address::fromAddressString(addr.address()); + addrComments_[address] = addr.comment(); + } + catch (const std::exception&) {} + } + } + for (const auto& walletId : walletIds) { + walletNames_[walletId] = itReq->second; + } + walletInfoReq_.erase(itReq); } - const auto& walletId = itWallet->second; - const auto& walletData = bs::sync::WalletData::fromCommonMessage(response); - //TODO - { - walletGetMap_.erase(itWallet); - return true; + for (const auto& addr : response.used_addresses()) { + addrModel_->addRow({ QString::fromStdString(addr.address()), {}, {} + , QString::fromStdString(addr.comment().empty() ? addr.index() : addr.comment()) }); } - return false; + return ProcessingResult::Success; } -bool QtQuickAdapter::processWalletBalances(const bs::message::Envelope & - , const WalletsMessage_WalletBalances &response) +ProcessingResult QtQuickAdapter::processWalletBalances(const WalletsMessage_WalletBalances &response) { - bs::sync::WalletBalanceData wbd; - wbd.id = response.wallet_id(); - wbd.balTotal = response.total_balance(); - wbd.balSpendable = response.spendable_balance(); - wbd.balUnconfirmed = response.unconfirmed_balance(); - wbd.nbAddresses = response.nb_addresses(); - for (const auto &addrBal : response.address_balances()) { - wbd.addrBalances.push_back({ BinaryData::fromString(addrBal.address()) - , addrBal.tx_count(), (int64_t)addrBal.total_balance(), (int64_t)addrBal.spendable_balance() - , (int64_t)addrBal.unconfirmed_balance() }); + //logger_->debug("[{}] {}", __func__, response.DebugString()); + totalWalletBalance_ += response.total_balance(); + confWalletBalance_ += response.spendable_balance(); + unconfWalletBalance_ += response.unconfirmed_balance(); + nbUsedWalletAddresses_ += response.nb_addresses(); + for (const auto& addrBal : response.address_balances()) { + addrModel_->updateRow(BinaryData::fromString(addrBal.address()), addrBal.total_balance(), addrBal.tx_count()); } - //TODO - return true; + emit walletBalanceChanged(); + return ProcessingResult::Success; } -bool QtQuickAdapter::processTXDetails(uint64_t msgId, const WalletsMessage_TXDetailsResponse &response) +ProcessingResult QtQuickAdapter::processTXDetails(uint64_t msgId + , const WalletsMessage_TXDetailsResponse &response) { std::vector txDetails; for (const auto &resp : response.responses()) { @@ -757,10 +840,10 @@ bool QtQuickAdapter::processTXDetails(uint64_t msgId, const WalletsMessage_TXDet else { //TODO } - return true; + return ProcessingResult::Success; } -bool QtQuickAdapter::processLedgerEntries(const LedgerEntries &response) +ProcessingResult QtQuickAdapter::processLedgerEntries(const LedgerEntries &response) { std::vector entries; for (const auto &entry : response.entries()) { @@ -784,12 +867,113 @@ bool QtQuickAdapter::processLedgerEntries(const LedgerEntries &response) } entries.push_back(std::move(txEntry)); } - //TODO - return true; + for (const auto& entry : entries) { + std::string walletName, comment; + bs::Address address; + const auto& itWallet = walletNames_.find(*entry.walletIds.cbegin()); + if (itWallet != walletNames_.end()) { + walletName = itWallet->second; + } + if (!entry.addresses.empty()) { + address = *entry.addresses.cbegin(); + } + try { + comment = addrComments_.at(address); + } + catch (const std::exception&) {} + + if (entry.nbConf < 6) { + pendingTxModel_->addRow({ QDateTime::fromSecsSinceEpoch(entry.txTime).toString() + , QString::fromStdString(walletName), {}, QString::fromStdString(address.display()) + , QString::number(entry.value / BTCNumericTypes::BalanceDivider, 'f', 8) + , QString::number(entry.nbConf), {}, QString::fromStdString(comment)}); + } + txModel_->addRow({ QDateTime::fromSecsSinceEpoch(entry.txTime).toString() + , QString::fromStdString(walletName), {}, QString::fromStdString(address.display()) + , QString::number(entry.value / BTCNumericTypes::BalanceDivider, 'f', 8) + , QString::number(entry.nbConf), {}, QString::fromStdString(comment) }); + } + nbTransactions_ = entries.size(); + emit nbTransactionsChanged(); + return ProcessingResult::Success; } +QStringList QtQuickAdapter::newSeedPhrase() +{ + auto seed = CryptoPRNG::generateRandom(16); + std::vector seedData; + for (int i = 0; i < (int)seed.getSize(); ++i) { + seedData.push_back(seed.getPtr()[i]); + } + const auto& words = BIP39::create_mnemonic(seedData); + QStringList result; + for (const auto& word : words) { + result.append(QString::fromStdString(word)); + } + return result; +} + +void QtQuickAdapter::copySeedToClipboard(const QStringList& seed) +{ + const auto& str = seed.join(QLatin1Char(' ')); + QGuiApplication::clipboard()->setText(str); +} -bool QtQuickAdapter::processAddressHist(const ArmoryMessage_AddressHistory& response) +void QtQuickAdapter::createWallet(const QString& name, const QStringList& seed + , const QString& password) +{ + logger_->debug("[{}] {}", __func__, name.toStdString()); + BIP39::word_list words; + for (const auto& w : seed) { + words.add(w.toStdString()); + } + SignerMessage msg; + auto msgReq = msg.mutable_create_wallet(); + msgReq->set_name(name.toStdString()); + //msgReq->set_xpriv_key(seedData.xpriv); + const auto binSeed = BIP39::seed_from_mnemonic(words); + msgReq->set_seed(binSeed.toBinStr()); + msgReq->set_password(password.toStdString()); + pushRequest(user_, userSigner_, msg.SerializeAsString()); +} + +void QtQuickAdapter::importWallet(const QString& name, const QStringList& seed + , const QString& password) +{ + logger_->debug("[{}] {}", __func__, name.toStdString()); + BIP39::word_list words; + for (const auto& w : seed) { + words.add(w.toStdString()); + } + SignerMessage msg; + auto msgReq = msg.mutable_import_wallet(); + msgReq->set_name(name.toStdString()); + //msgReq->set_description(seedData.description); + //msgReq->set_xpriv_key(seedData.xpriv); + const auto binSeed = BIP39::seed_from_mnemonic(words); + msgReq->set_seed(binSeed.toBinStr()); + msgReq->set_password(password.toStdString()); + pushRequest(user_, userSigner_, msg.SerializeAsString()); +} + +void QtQuickAdapter::generateNewAddress(int walletIndex, bool isNative) +{ + const auto& hdWalletId = hdWalletIdByIndex(walletIndex); + logger_->debug("[{}] #{}: {}", __func__, walletIndex, hdWalletId); + //TODO: find leaf walletId depending on isNative + WalletsMessage msg; + msg.set_create_ext_address(hdWalletId); + pushRequest(user_, userWallets_, msg.SerializeAsString()); +} + +void QtQuickAdapter::copyAddressToClipboard(const QString& addr) +{ + QGuiApplication::clipboard()->setText(addr); + generatedAddress_.clear(); + emit addressGenerated(); +} + +ProcessingResult QtQuickAdapter::processAddressHist(const ArmoryMessage_AddressHistory& response) { bs::Address addr; try { @@ -797,7 +981,7 @@ bool QtQuickAdapter::processAddressHist(const ArmoryMessage_AddressHistory& resp } catch (const std::exception& e) { logger_->error("[{}] invalid address: {}", __func__, e.what()); - return true; + return ProcessingResult::Error; } std::vector entries; for (const auto& entry : response.entries()) { @@ -822,30 +1006,32 @@ bool QtQuickAdapter::processAddressHist(const ArmoryMessage_AddressHistory& resp entries.push_back(std::move(txEntry)); } //TODO - return true; + return ProcessingResult::Success; } -bool QtQuickAdapter::processFeeLevels(const ArmoryMessage_FeeLevelsResponse& response) +ProcessingResult QtQuickAdapter::processFeeLevels(const ArmoryMessage_FeeLevelsResponse& response) { std::map feeLevels; for (const auto& pair : response.fee_levels()) { feeLevels[pair.level()] = pair.fee(); } //TODO - return true; + return ProcessingResult::Success; } -bool QtQuickAdapter::processWalletsList(const WalletsMessage_WalletsListResponse& response) +ProcessingResult QtQuickAdapter::processWalletsList(const WalletsMessage_WalletsListResponse& response) { - std::vector wallets; + logger_->debug("[QtQuickAdapter::processWalletsList] {}", response.DebugString()); + walletsList_.clear(); for (const auto& wallet : response.wallets()) { - wallets.push_back(bs::sync::HDWalletData::fromCommonMessage(wallet)); + const auto& hdWallet = bs::sync::HDWalletData::fromCommonMessage(wallet); + walletsList_.push_back(QString::fromStdString(hdWallet.name)); } - //TODO - return true; + emit walletsListChanged(); + return ProcessingResult::Success; } -bool QtQuickAdapter::processUTXOs(const WalletsMessage_UtxoListResponse& response) +ProcessingResult QtQuickAdapter::processUTXOs(const WalletsMessage_UtxoListResponse& response) { std::vector utxos; for (const auto& serUtxo : response.utxos()) { @@ -854,16 +1040,16 @@ bool QtQuickAdapter::processUTXOs(const WalletsMessage_UtxoListResponse& respons utxos.push_back(std::move(utxo)); } //TODO - return true; + return ProcessingResult::Success; } -bool QtQuickAdapter::processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse& response) +ProcessingResult QtQuickAdapter::processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse& response) { //TODO - return true; + return ProcessingResult::Success; } -bool QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived& zcs) +ProcessingResult QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived& zcs) { WalletsMessage msg; auto msgReq = msg.mutable_tx_details_request(); @@ -876,24 +1062,21 @@ bool QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMessage_ZCReceiv txReq->set_value(zcEntry.value()); } const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); - if (!msgId) { - return false; - } newZCs_.insert(msgId); - return true; + return ProcessingResult::Success; } -bool QtQuickAdapter::processZCInvalidated(const ArmoryMessage_ZCInvalidated& zcInv) +ProcessingResult QtQuickAdapter::processZCInvalidated(const ArmoryMessage_ZCInvalidated& zcInv) { std::vector txHashes; for (const auto& hashStr : zcInv.tx_hashes()) { txHashes.push_back(BinaryData::fromString(hashStr)); } //TODO - return true; + return ProcessingResult::Success; } -bool QtQuickAdapter::processReservedUTXOs(const WalletsMessage_ReservedUTXOs& response) +ProcessingResult QtQuickAdapter::processReservedUTXOs(const WalletsMessage_ReservedUTXOs& response) { std::vector utxos; for (const auto& utxoSer : response.utxos()) { @@ -902,5 +1085,18 @@ bool QtQuickAdapter::processReservedUTXOs(const WalletsMessage_ReservedUTXOs& re utxos.push_back(std::move(utxo)); } //TODO - return true; + return ProcessingResult::Success; +} + +void QtQuickAdapter::processWalletAddresses(const std::vector& addresses) +{ + if (addresses.empty()) { + return; + } + const auto lastAddr = addresses.at(addresses.size() - 1); + logger_->debug("[{}] last address: {}", __func__, lastAddr.address.display()); + addrModel_->addRow({ QString::fromStdString(lastAddr.address.display()), {}, {} + , QString::fromStdString(lastAddr.index) }); + generatedAddress_ = lastAddr.address; + emit addressGenerated(); } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 03312cd93..e6a3b5d10 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -14,9 +14,11 @@ #include #include #include "Address.h" +#include "AddressListModel.h" #include "ApiAdapter.h" #include "Wallets/SignContainer.h" #include "ThreadSafeClasses.h" +#include "TxListModel.h" #include "UiUtils.h" namespace bs { @@ -65,8 +67,10 @@ namespace BlockSettle { class SettingsMessage_SignerServers; } } - class BSTerminalSplashScreen; +class QQmlContext; +class QmlWalletsList; + class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoopRuner { @@ -76,7 +80,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop QtQuickAdapter(const std::shared_ptr &); ~QtQuickAdapter() override; - bool process(const bs::message::Envelope &) override; + bs::message::ProcessingResult process(const bs::message::Envelope &) override; bool processBroadcast(const bs::message::Envelope&) override; Users supportedReceivers() const override { return { user_ }; } @@ -84,15 +88,55 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void run(int &argc, char **argv) override; + Q_PROPERTY(QStringList walletsList READ walletsList NOTIFY walletsListChanged) + QStringList walletsList() const { return walletsList_; } + Q_PROPERTY(QStringList txWalletsList READ txWalletsList NOTIFY walletsListChanged) + QStringList txWalletsList() const; + Q_PROPERTY(QStringList txTypesList READ txTypesList) + QStringList txTypesList() const { return txTypes_; } + + Q_PROPERTY(QString confirmedBalance READ confirmedBalance NOTIFY walletBalanceChanged) + QString confirmedBalance() const { return QString::number(confWalletBalance_, 'f', 8); } + Q_PROPERTY(QString unconfirmedBalance READ unconfirmedBalance NOTIFY walletBalanceChanged) + QString unconfirmedBalance() const { return QString::number(unconfWalletBalance_, 'f', 8); } + Q_PROPERTY(QString totalBalance READ totalBalance NOTIFY walletBalanceChanged) + QString totalBalance() const { return QString::number(totalWalletBalance_, 'f', 8); } + Q_PROPERTY(quint32 nbUsedWalletAddresses READ nbUsedWalletAddresses NOTIFY walletBalanceChanged) + quint32 nbUsedWalletAddresses() const { return nbUsedWalletAddresses_; } + + Q_PROPERTY(quint32 nbTransactions READ nbTransactions NOTIFY nbTransactionsChanged) + quint32 nbTransactions() const { return nbTransactions_; } + + Q_PROPERTY(QString generatedAddress READ generatedAddress NOTIFY addressGenerated) + QString generatedAddress() const { return QString::fromStdString(generatedAddress_.display()); } + + Q_INVOKABLE QStringList newSeedPhrase(); + Q_INVOKABLE void copySeedToClipboard(const QStringList&); + Q_INVOKABLE void createWallet(const QString& name, const QStringList& seed + , const QString& password); + Q_INVOKABLE void importWallet(const QString& name, const QStringList& seed + , const QString& password); + Q_INVOKABLE void generateNewAddress(int walletIndex, bool isNative); + Q_INVOKABLE void copyAddressToClipboard(const QString& addr); + +signals: + void walletsListChanged(); + void walletBalanceChanged(); + void nbTransactionsChanged(); + void addressGenerated(); + +private slots: + void walletSelected(int); + private: - bool processSettings(const bs::message::Envelope &); - bool processSettingsGetResponse(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); - bool processSettingsState(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); - bool processArmoryServers(const BlockSettle::Terminal::SettingsMessage_ArmoryServers&); - bool processAdminMessage(const bs::message::Envelope &); - bool processBlockchain(const bs::message::Envelope &); - bool processSigner(const bs::message::Envelope &); - bool processWallets(const bs::message::Envelope &); + bs::message::ProcessingResult processSettings(const bs::message::Envelope &); + bs::message::ProcessingResult processSettingsGetResponse(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); + bs::message::ProcessingResult processSettingsState(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); + bs::message::ProcessingResult processArmoryServers(const BlockSettle::Terminal::SettingsMessage_ArmoryServers&); + bs::message::ProcessingResult processAdminMessage(const bs::message::Envelope &); + bs::message::ProcessingResult processBlockchain(const bs::message::Envelope &); + bs::message::ProcessingResult processSigner(const bs::message::Envelope &); + bs::message::ProcessingResult processWallets(const bs::message::Envelope &); void requestInitialSettings(); void updateSplashProgress(); @@ -100,27 +144,29 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void updateStates(); void createWallet(bool primary); + std::string hdWalletIdByIndex(int); void processWalletLoaded(const bs::sync::WalletInfo &); - bool processWalletData(const uint64_t msgId + bs::message::ProcessingResult processWalletData(const uint64_t msgId , const BlockSettle::Common::WalletsMessage_WalletData&); - bool processWalletBalances(const bs::message::Envelope & - , const BlockSettle::Common::WalletsMessage_WalletBalances &); - bool processTXDetails(uint64_t msgId, const BlockSettle::Common::WalletsMessage_TXDetailsResponse &); - bool processLedgerEntries(const BlockSettle::Common::LedgerEntries &); - bool processAddressHist(const BlockSettle::Common::ArmoryMessage_AddressHistory&); - bool processFeeLevels(const BlockSettle::Common::ArmoryMessage_FeeLevelsResponse&); - bool processWalletsList(const BlockSettle::Common::WalletsMessage_WalletsListResponse&); - bool processUTXOs(const BlockSettle::Common::WalletsMessage_UtxoListResponse&); - bool processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse&); - bool processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived&); - bool processZCInvalidated(const BlockSettle::Common::ArmoryMessage_ZCInvalidated&); - bool processReservedUTXOs(const BlockSettle::Common::WalletsMessage_ReservedUTXOs&); + bs::message::ProcessingResult processWalletBalances(const BlockSettle::Common::WalletsMessage_WalletBalances &); + bs::message::ProcessingResult processTXDetails(uint64_t msgId, const BlockSettle::Common::WalletsMessage_TXDetailsResponse &); + bs::message::ProcessingResult processLedgerEntries(const BlockSettle::Common::LedgerEntries &); + bs::message::ProcessingResult processAddressHist(const BlockSettle::Common::ArmoryMessage_AddressHistory&); + bs::message::ProcessingResult processFeeLevels(const BlockSettle::Common::ArmoryMessage_FeeLevelsResponse&); + bs::message::ProcessingResult processWalletsList(const BlockSettle::Common::WalletsMessage_WalletsListResponse&); + bs::message::ProcessingResult processUTXOs(const BlockSettle::Common::WalletsMessage_UtxoListResponse&); + bs::message::ProcessingResult processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse&); + bs::message::ProcessingResult processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived&); + bs::message::ProcessingResult processZCInvalidated(const BlockSettle::Common::ArmoryMessage_ZCInvalidated&); + bs::message::ProcessingResult processReservedUTXOs(const BlockSettle::Common::WalletsMessage_ReservedUTXOs&); + void processWalletAddresses(const std::vector&); private: std::shared_ptr logger_; BSTerminalSplashScreen* splashScreen_{ nullptr }; QObject* rootObj_{ nullptr }; + QQmlContext* rootCtxt_{nullptr}; std::shared_ptr userSettings_, userWallets_; std::shared_ptr userBlockchain_, userSigner_; bool loadingDone_{ false }; @@ -134,13 +180,21 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop std::string signerDetails_; bool walletsReady_{ false }; - std::map walletGetMap_; std::unordered_map hdWallets_; + std::unordered_map walletNames_; + std::map walletInfoReq_; + std::map addrComments_; std::set newZCs_; - std::unordered_map assetTypes_; - std::set needChangeAddrReqs_; + QStringList walletsList_; + const QStringList txTypes_; + unsigned nbUsedWalletAddresses_{ 0 }; + double confWalletBalance_{ 0 }, unconfWalletBalance_{ 0 }, totalWalletBalance_{ 0 }; + unsigned nbTransactions_{ 0 }; + QmlAddressListModel* addrModel_{ nullptr }; + TxListModel* pendingTxModel_{ nullptr }; + TxListModel* txModel_{ nullptr }; + bs::Address generatedAddress_; }; - #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp new file mode 100644 index 000000000..43d9c0de6 --- /dev/null +++ b/GUI/QtQuick/TxListModel.cpp @@ -0,0 +1,70 @@ +/* + +*********************************************************************************** +* Copyright (C) 2020 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "TxListModel.h" +#include + +namespace { + static const QHash kRoles{ + {TxListModel::TableDataRole, "tabledata"}, + {TxListModel::HeadingRole, "heading"} + }; +} + +TxListModel::TxListModel(const std::shared_ptr&, QObject* parent) + : QAbstractTableModel(parent) +{ + table.append({ tr("Date"), tr("Wallet"), tr("Type"), tr("Address"), tr("Amount") + , tr("Confirmations"), tr("Flag"), tr("Comment") }); +} + +int TxListModel::rowCount(const QModelIndex &) const +{ + return table.size(); +} + +int TxListModel::columnCount(const QModelIndex &) const +{ + return 8; +} + +QVariant TxListModel::data(const QModelIndex& index, int role) const +{ + if (index.column() > 7) { + return {}; + } + switch (role) { + case TableDataRole: + return table.at(index.row()).at(index.column()); + case HeadingRole: + return (index.row() == 0); + default: break; + } + return QVariant(); +} + +QHash TxListModel::roleNames() const +{ + return kRoles; +} + +void TxListModel::addRow(const QVector& row) +{ + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + table.append(row); + endInsertRows(); +} + +void TxListModel::clear() +{ + beginResetModel(); + table.remove(1, table.size() - 1); + endResetModel(); +} diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h new file mode 100644 index 000000000..0ad35cca3 --- /dev/null +++ b/GUI/QtQuick/TxListModel.h @@ -0,0 +1,41 @@ +/* + +*********************************************************************************** +* Copyright (C) 2020 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef TX_LIST_MODEL_H +#define TX_LIST_MODEL_H + +#include +#include +#include + +namespace spdlog { + class logger; +} + +class TxListModel : public QAbstractTableModel +{ + Q_OBJECT +public: + enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole }; + TxListModel(const std::shared_ptr&, QObject* parent = nullptr); + + int rowCount(const QModelIndex & = QModelIndex()) const override; + int columnCount(const QModelIndex & = QModelIndex()) const override; + QVariant data(const QModelIndex& index, int role) const override; + QHash roleNames() const override; + + void addRow(const QVector&); + void clear(); + +private: + QVector> table; +}; + +#endif // TX_LIST_MODEL_H diff --git a/GUI/QtQuick/images/bitcoin-disabled.png b/GUI/QtQuick/images/bitcoin-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..12aa8b9ae132a945dcc39f5b5075003658d55606 GIT binary patch literal 608 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 A3;+NC literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/overview_icon.png b/GUI/QtQuick/images/overview_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..beadcac7412af7a1cfbba240489887942181534d GIT binary patch literal 654 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P3?%12mYf5m7>k44ofvPP)Tsw@I14-?iy0WW zg+Z8+Vb&Z8pkP9PPlzj!{z6M&R96bLm_eZ=$S;^7;J-tI!2I*;4fb!SSGfPapnrk= zfeG;mA1=u2Kk(1zPffh?0_gDBo-U3d6?1y0xCS{#RNny>u7;g__kibmfehpv8s{0luL+MV6Y-h^*I7wO)NF6zZyF5{>j7rjlM-r_NMw(i)GZye1DVhN`oXnkd9p)zh5wuhc1>*m|NJz5b-Z7m+oSZz`uP1{_SgU4 z$GyV8V}dfrDQ4a*hDWYPte8@MZqL83$0WPX>q0@2sK9HESrL52DvItGt`w=bnE0Fd9wbZ?SkxHE*wxn_;`_Em$94L0FFSYhk}393mn>FvI4{7! Z(4Rba?~COt`GF2*@O1TaS?83{1OV+SRL=ka literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/send_icon.png b/GUI/QtQuick/images/send_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9d7b3706499c7a401f8d858824571df64568da GIT binary patch literal 549 zcmV+=0^0qFP)Px$-$_J4R9FdPU>F6XAut*OqaiRF0s|ZZjO5y{*sxLW-~WGW85sYc)AHzN% zQ<{O1@dyVOlh@61|IfrYgs2cuY1k(7A7}x{a*zdlJX}67%R!dhYY4i<%F1XDbl4+? z|Nm`%e*3#isbe=kRUDw%xR^PHo^_U~04nCdvE2 zD6;tb{mUNR_AP?w>d^Ukqd>8Bqxk<{e-8i+)BqZMmYIvk`Cf(VM|4Aw`N}ODWdHpB zzYiD^D!>rAz{bepdaJ?r4YC?!Hr^=s_w(;skmW#EUgTlobR%Rr$l$v*0gpKtne2g~ zbrTq620#D*S&wWXIvcM8fIa~E_9z<@tIO2}k9X*raq(|9_&;N0XR-&Tmt#Q3f5N41 nRD3i9MnhmU1V%$(P=o*g&lI9w!J#TS00000NkvXXu0mjfPi6h` literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/settings_icon.png b/GUI/QtQuick/images/settings_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a41ec0e29e7484798a1384c9c6d2d2537c2baf10 GIT binary patch literal 1626 zcmV-g2BrClP)Px*6iGxuR7efQR$FY8MHHShvlkH3f@nb70P1cj7X<}U#D=t7?GxT85Tw%X_MvDiVi2JSWiS7XXBMX{KLr7U%c6~-kBrp@j7G(ccn7enS>QdK`;|(sAAj@bkYku>ZqRUE|^KNaH zh{o#7;My=5b|F_0DVGD#g<*g30j*2g^FXdN$YEe~)$PCmL)b(Zn`;h@2FLtuiB!5b zraIPZhcDp5kbMS}EDZCK{d!+XXJu$8iOa*1z{(cCdrzuPttsX#!$M@jtWY7Oc3UCl ze5unLT4mO&|F`%{YB8jx!hmg@OZ0W)i+J6qEfl7L6x)YX)(p9!xxS)Ujo!Er)eaua zHY?KsA34lj2OxWeNcBTzd!QC144p=%wbiVnEq>3ZRFaReVCwD#{P?NRV)Wj6lDq#f zJCDbOYPXA#*QdwKx~_K0@dnDVAy*Izg)Q9EWOOR;Dig^0;~?)0FNDWc!M=LJe05Y)u+HQ8f9pFSrEV!6LPIH`aX`) zpE9WZ#c#{Ucd9)cN~iJPu1bG)(~+K6FaKSOk!T5X&&qCrm7xM>RtwHwsKPm1rNLF@ zt7xEuYnj=DK2ZgR^Ld1gJ~*?1yRIr*^-%&A%q>%EEV3Tw|2n%5mu>T@`xU^1-;!f> z(EK@ha2}4pQgl&WTJdt-w-oUZBTp47szFV<3cjM5Ynano7L&SDqCDY8T!Lu8djftx> z>3p{Z9^wr?X8;LV@NI44#r4{mdKj{4zXJ*!^AC#oy?}QcYAm2}3Y1bZ|7OtOM!ac7 z0Vxn!tY0ZcLn=@OuFCjQd+VOjn~z%cCGR9}VT|wdSR9>S;)}JY$zO6%8)Nl;fVrL0 zo6<=qc=1KGuRuE5T6byYmyFm>Y%@qF>^A`q<-up-2HB5Avn1m8e5FC1>w}fZ?gbm| zJ*kmTyP)?|!FA5l1@8)Vjz2U~fii$)sh|#Tz=uEZih$aum_Ze=DyWR?!E^DlQh}<1 zODF6};9URSCq+VhjeT9#?045_Mi}0=(P8NWj7|=7*Ll5fmPzoeL8W&C4i3I|7#PN3 z%IL~wURoF*ndlGtY<+ZpZUAqzmrVny#35>94wG*H6ywk2aVBP&MAU^uBJ;W zsKXa}Q%ZQ1GV8>2LDhv)nRg^XAqPjr6WvuiPCt1?3ei_HQ7;ZiS%%|kB0ku^>HT!2 z2FFT|V?o96xwlPzAskn}~(A2yeES+HBY|{|{6-SIqGNnS+q{dkbP2*@Nb3(EBR? Y0br5+pri*)!2kdN07*qoM6N<$f^eq*6951J literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/transactions_icon.png b/GUI/QtQuick/images/transactions_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..87a8dde75658da3cdecea7b414305983c042343b GIT binary patch literal 390 zcmV;10eSw3P)Px$KuJVFR7eeDU>F6Iguws*|4V?_43`-oIglD$@*r_WWJ#c6WgtHch}ogy4nX<= z6ay&?pa2vB;R8Sn0zZLx6(b|#T`&(wu)r8ldMS`@1>(<8z5A5 zfi%br3n(AMf*(NJH^U@>K8gXd-vGr9z{HSgpu7x_{|8wfC{~QDh6$O2h5ZL8#)d^4 zCIpfLsUZ#kZ9hPqO5Cc@%|MUj4?wM;FsB3<0E0{bs{!b?V^u^z5Zw$yaX`R0!qOyL z0Cb@wVPg?0NU{KEI4IYG(mBz9BnyD1E(Btfgh9wAk}LqGj@N_?M3*PY0(8y9@CT&@ zyNPi*Oby9C0LDWbOfxYw$rcb}D6$&#`hWwN)_s8rVD$mAT4LCs`hWvjAxfGC8jfD0 kA*&^ZjZvc!qlqFl04T>*b#of+h5!Hn07*qoM6N<$f+o$4g#Z8m literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/qml/CreateNewWallet.qml b/GUI/QtQuick/qml/CreateNewWallet.qml new file mode 100644 index 000000000..7c4b92a91 --- /dev/null +++ b/GUI/QtQuick/qml/CreateNewWallet.qml @@ -0,0 +1,84 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + SeedPhrase { + id: seedPhrasePage + visible: false + } + ImportSeedPhrase { + id: importSeedPhrasePage + visible: false + } + + Column { + spacing: 32 + anchors.fill: parent + + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + Label { + text: qsTr("Create new wallet") + font.pointSize: 14 + } + + Text { + text: qsTr("

Terms and conditions

Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...
") + font.pointSize: 10 + } + CheckBox { + id: checkboxTerms + text: qsTr("Agree with terms and conditions") + font.pointSize: 12 + } + + Row { + spacing: 23 + + Button { + text: qsTr("Hardware Wallet") + font.pointSize: 12 + enabled: false + } + Button { + text: qsTr("Import Wallet") + font.pointSize: 12 + enabled: checkboxTerms.checked + onClicked: { + stack.push(importSeedPhrasePage) + } + } + Button { + text: qsTr("Create new") + font.pointSize: 12 + enabled: checkboxTerms.checked + onClicked: { + seedPhrasePage.phrase = bsApp.newSeedPhrase() + stack.push(seedPhrasePage) + } + } + } + } +} diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml new file mode 100644 index 000000000..e999b64dd --- /dev/null +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -0,0 +1,40 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + id: explorer + + Column { + spacing: 50 + anchors.fill: parent + + Text { + text: " " + } + Text { + text: qsTr("Explorer page") + font.pointSize: 23 + } + Image { + source: "qrc:/images/bs_logo.png" + } + } +} diff --git a/GUI/QtQuick/qml/ImportSeedPhrase.qml b/GUI/QtQuick/qml/ImportSeedPhrase.qml new file mode 100644 index 000000000..9775bd264 --- /dev/null +++ b/GUI/QtQuick/qml/ImportSeedPhrase.qml @@ -0,0 +1,525 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + property var phrase + + WalletNamePass { + id: walletNamePassPage + visible: false + } + + Column { + spacing: 23 + anchors.fill: parent + + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + Label { + text: qsTr("Import wallet") + font.pointSize: 14 + } + + Row { + spacing: 16 + Label { + text: qsTr("Seed phrase type") + font.pointSize: 10 + } + RadioButton { + id: rb12Words + checked: true + text: qsTr("12 words") + font.pointSize: 10 + } + RadioButton { + id: rb24Words + checked: false + text: qsTr("24 words") + font.pointSize: 10 + } + } + + Row { + spacing: 23 + + TextInput { + id: word1 + width: 250 + height: 23 + color: 'lightgrey' + font.pointSize: 12 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "1" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word2 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "2" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word3 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "3" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + } + Row { + spacing: 23 + + TextInput { + id: word4 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "4" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word5 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "5" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word6 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "6" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + } + Row { + spacing: 23 + + TextInput { + id: word7 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "7" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word8 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "8" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word9 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "9" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + } + Row { + spacing: 23 + + TextInput { + id: word10 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "10" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word11 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "11" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word12 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "12" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + } + Row { + spacing: 23 + visible: rb24Words.checked + + TextInput { + id: word13 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "13" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word14 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "14" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word15 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "15" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + } + Row { + spacing: 23 + visible: rb24Words.checked + + TextInput { + id: word16 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "16" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word17 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "17" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word18 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "18" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + } + Row { + spacing: 23 + visible: rb24Words.checked + + TextInput { + id: word19 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "19" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word20 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "20" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word21 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "21" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + } + Row { + spacing: 23 + visible: rb24Words.checked + + TextInput { + id: word22 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "22" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word23 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "23" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word24 + width: 250 + height: 23 + font.pointSize: 12 + color: 'lightgrey' + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "24" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + } + + Button { + width: 900 + text: qsTr("Import") + font.pointSize: 14 + enabled: word1.text.length && word2.text.length && word3.text.length + && word4.text.length && word5.text.length && word6.text.length + && word7.text.length && word8.text.length && word9.text.length + && word10.text.length && word11.text.length && word12.text.length + && (rb24Words.checked ? (word13.text.length && word14.text.length + && word15.text.length && word16.text.length && word17.text.length + && word18.text.length && word19.text.length && word20.text.length + && word21.text.length && word22.text.length && word23.text.length + && word24.text.length) : true) + + onClicked: { + phrase = [ word1.text, word2.text, word3.text, word4.text, + word5.text, word6.text, word7.text, word8.text, word9.text, + word10.text, word11.text, word12.text] + if (rb24Words.checked) { + phrase.append(word13.text) + phrase.append(word14.text) + phrase.append(word15.text) + phrase.append(word16.text) + phrase.append(word17.text) + phrase.append(word18.text) + phrase.append(word19.text) + phrase.append(word20.text) + phrase.append(word21.text) + phrase.append(word22.text) + phrase.append(word23.text) + phrase.append(word24.text) + + } + walletNamePassPage.phrase = phrase + walletNamePassPage.isImport = true + stack.push(walletNamePassPage) + } + } + } +} diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml new file mode 100644 index 000000000..598cae79e --- /dev/null +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -0,0 +1,182 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + id: overview + + CreateNewWallet { + id: createNewWalletPage + visible: false + } + + Column { + spacing: 23 + anchors.fill: parent + + Row { + spacing: 15 + + ComboBox { + id: walletsComboBox + objectName: "walletsComboBox" + model: bsApp.walletsList + font.pointSize: 12 + } + Column { + Label { + text: qsTr("Confirmed balance") + font.pointSize: 8 + } + Label { + text: qsTr("%1 BTC").arg(bsApp.confirmedBalance) + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Unconfirmed balance") + font.pointSize: 8 + } + Label { + text: qsTr("%1 BTC").arg(bsApp.unconfirmedBalance) + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Total balance") + font.pointSize: 8 + } + Label { + text: qsTr("%1 BTC").arg(bsApp.totalBalance) + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("#Used addresses") + font.pointSize: 8 + } + Label { + text: qsTr("%1").arg(bsApp.nbUsedWalletAddresses) + font.pointSize: 12 + } + } + Item { // spacer item + Layout.fillWidth: true + Layout.fillHeight: true + Rectangle { anchors.fill: parent; color: "#ffaaaa" } + } + Button { + text: qsTr("Wallet Properties") + font.pointSize: 10 + } + Button { + text: qsTr("Create new wallet") + font.pointSize: 10 + onClicked: { + stack.push(createNewWalletPage) + } + } + } + + Row { + spacing: 15 + + Label { + text: qsTr("Addresses") + font.pointSize: 14 + } + Item { // spacer item + Layout.fillWidth: true + Layout.fillHeight: true + Rectangle { anchors.fill: parent; color: "#ffaaaa" } + } + Button { + text: qsTr("Hide used") + font.pointSize: 8 + } + Button { + text: qsTr("Hide internal") + font.pointSize: 8 + } + Button { + text: qsTr("Hide external") + font.pointSize: 8 + } + Button { + text: qsTr("Hide empty") + font.pointSize: 8 + } + } + TableView { + width: 1000 + height: 300 + columnSpacing: 1 + rowSpacing: 1 + clip: false + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: addressListModel + delegate: Rectangle { + implicitWidth: firstcol ? 550 : 150 + implicitHeight: 20 + border.color: "black" + border.width: 1 + color: heading ? 'black' : 'darkslategrey' + Text { + text: tabledata + font.pointSize: heading ? 8 : 10 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + } + } + + Label { + text: qsTr("Non-Settled Transactions") + font.pointSize: 14 + } + TableView { + width: 1000 + height: 200 + columnSpacing: 1 + rowSpacing: 1 + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: pendingTxListModel + delegate: Rectangle { + implicitWidth: 125 + implicitHeight: 20 + border.color: "black" + border.width: 1 + color: heading ? 'black' : 'darkslategrey' + Text { + text: tabledata + font.pointSize: heading ? 8 : 10 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + } + } + } +} diff --git a/GUI/QtQuick/qml/ReceivePage.qml b/GUI/QtQuick/qml/ReceivePage.qml new file mode 100644 index 000000000..1c1321920 --- /dev/null +++ b/GUI/QtQuick/qml/ReceivePage.qml @@ -0,0 +1,128 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + id: receive + + Column { + spacing: 23 + anchors.fill: parent + + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + + Label { + text: qsTr("Generate address") + font.pointSize: 14 + } + Row { + spacing: 23 + ComboBox { + id: receiveWalletsComboBox + objectName: "receiveWalletsComboBox" + model: bsApp.walletsList + currentIndex: walletsComboBox.currentIndex + font.pointSize: 14 + width: 500 + visible: (bsApp.walletsList.length > 1) + } + Label { + text: qsTr("%1 BTC").arg(bsApp.totalBalance) + font.pointSize: 14 + } + } + Label { + text: bsApp.generatedAddress.length ? qsTr("Bitcoins sent to this address will appear in %1").arg(receiveWalletsComboBox.textAt(receiveWalletsComboBox.currentIndex)) + : qsTr("Select address type") + font.pointSize: 12 + } + Row { + spacing: 5 + visible: !bsApp.generatedAddress.length + + RadioButton { + id: rbNative + checked: true + text: qsTr("
Native SegWit
(bech32)
") + font.pointSize: 10 + } + RadioButton { + id: rbNested + checked: false + text: qsTr("
Nested SegWit
(P2SH)
") + font.pointSize: 10 + } + } + Label { + visible: bsApp.generatedAddress.length + width: 900 + height: 32 + text: qsTr("%1").arg(bsApp.generatedAddress) + font.pointSize: 14 + } + Button { + visible: !bsApp.generatedAddress.length + width: 600 + text: qsTr("Generate") + font.pointSize: 14 + onClicked: { + bsApp.generateNewAddress(receiveWalletsComboBox.currentIndex, rbNative.checked) + } + } + Button { + visible: bsApp.generatedAddress.length + width: 600 + text: qsTr("Copy to clipboard") + font.pointSize: 14 + onClicked: { + bsApp.copyAddressToClipboard(bsApp.generatedAddress) + } + } + + TableView { + width: 1000 + height: 300 + columnSpacing: 1 + rowSpacing: 1 + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: addressListModel + delegate: Rectangle { + implicitWidth: firstcol ? 550 : 150 + implicitHeight: 20 + border.color: "black" + border.width: 1 + color: heading ? 'black' : 'darkslategrey' + Text { + text: tabledata + font.pointSize: heading ? 8 : 10 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + } + } + } +} diff --git a/GUI/QtQuick/qml/SeedPhrase.qml b/GUI/QtQuick/qml/SeedPhrase.qml new file mode 100644 index 000000000..5a0674277 --- /dev/null +++ b/GUI/QtQuick/qml/SeedPhrase.qml @@ -0,0 +1,194 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + property var phrase + + VerifySeedPhrase { + id: verifySeedPhrase + visible: false + } + + Column { + spacing: 32 + anchors.fill: parent + + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + Label { + text: qsTr("Create new wallet") + font.pointSize: 14 + } + Label { + text: qsTr("Write down and store your 12 word seed someplace safe and offline") + font.pointSize: 10 + } + + Row { + spacing: 23 + + TextEdit { + id: word1 + width: 250 + height: 32 + text: phrase[0] + color: 'darkgrey' + font.pointSize: 12 + enabled: false + } + TextEdit { + id: word2 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase[1] + enabled: false + } + TextEdit { + id: word3 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase[2] + enabled: false + } + } + Row { + spacing: 23 + + TextEdit { + id: word4 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase[3] + enabled: false + } + TextEdit { + id: word5 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase[4] + enabled: false + } + TextEdit { + id: word6 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase[5] + enabled: false + } + } + Row { + spacing: 23 + + TextEdit { + id: word7 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase[6] + enabled: false + } + TextEdit { + id: word8 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase[7] + enabled: false + } + TextEdit { + id: word9 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase[8] + enabled: false + } + } + Row { + spacing: 23 + + TextEdit { + id: word10 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase[9] + enabled: false + } + TextEdit { + id: word11 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase[10] + enabled: false + } + TextEdit { + id: word12 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase[11] + enabled: false + } + } + Row { + spacing: 50 + Button { + width: 450 + text: qsTr("Copy Seed") + font.pointSize: 12 + onClicked: { + bsApp.copySeedToClipboard(phrase) + } + } + Button { + width: 450 + text: qsTr("Continue") + font.pointSize: 12 + onClicked: { + verifySeedPhrase.phrase = phrase + stack.push(verifySeedPhrase) + } + } + } + } +} diff --git a/GUI/QtQuick/qml/SendPage.qml b/GUI/QtQuick/qml/SendPage.qml new file mode 100644 index 000000000..ab48445da --- /dev/null +++ b/GUI/QtQuick/qml/SendPage.qml @@ -0,0 +1,43 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + id: send + + Column { + spacing: 50 + anchors.fill: parent + + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + Text { + text: qsTr("Send page") + font.pointSize: 23 + } + Image { + source: "qrc:/images/bs_logo.png" + } + } +} diff --git a/GUI/QtQuick/qml/SettingsPage.qml b/GUI/QtQuick/qml/SettingsPage.qml new file mode 100644 index 000000000..449d492b8 --- /dev/null +++ b/GUI/QtQuick/qml/SettingsPage.qml @@ -0,0 +1,43 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + id: settings + + Column { + spacing: 50 + anchors.fill: parent + + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + Text { + text: qsTr("Settings page") + font.pointSize: 23 + } + Image { + source: "qrc:/images/bs_logo.png" + } + } +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml b/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml index 0abd48a18..1e8a73827 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml @@ -10,24 +10,40 @@ */ import QtQuick 2.9 import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.3 import "../BsStyles" TabButton { id: control text: parent.text + icon.source: parent.icon.source property alias cText: text_ + property alias cIcon: image_ focusPolicy: Qt.NoFocus - contentItem: Text { + contentItem: RowLayout { + width: parent.width + height: parent.height + + Image { + id: image_ + source: control.icon.source + horizontalAlignment: Qt.AlignVCenter + verticalAlignment: Qt.AlignVCenter + Layout.fillHeight: true + } + + Text { id: text_ text: control.text font.capitalization: Font.AllUppercase font.pointSize: 10 color: control.checked ? (control.down ? BSStyle.textPressedColor : BSStyle.textColor) : BSStyle.buttonsUncheckedColor elide: Text.ElideRight - horizontalAlignment: Text.AlignHCenter + horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter } + } background: Rectangle { implicitWidth: 100 diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml new file mode 100644 index 000000000..a5c0b8437 --- /dev/null +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -0,0 +1,106 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + id: transactions + + Column { + spacing: 23 + anchors.fill: parent + + Row { + spacing: 15 + + Label { + text: qsTr("Transactions list (%1)").arg(bsApp.nbTransactions) + font.pointSize: 14 + } + Item { // spacer item + Layout.fillWidth: true + Layout.fillHeight: true + Rectangle { anchors.fill: parent; color: "#ffaaaa" } + } + ComboBox { + id: txWalletsComboBox + objectName: "txWalletsComboBox" + model: bsApp.txWalletsList + font.pointSize: 8 + } + ComboBox { + id: txTypesComboBox + objectName: "txTypesComboBox" + model: bsApp.txTypesList + font.pointSize: 8 + } + Button { + text: qsTr("From") + font.pointSize: 8 + } + Label { + text: qsTr("-") + font.pointSize: 12 + } + Button { + text: qsTr("To") + font.pointSize: 8 + } + TextEdit { + id: txSearchBox + width: 75 + height: 32 + Text { + text: qsTr("Search") + color: 'darkgrey' + visible: !txSearchBox.text && !txSearchBox.activeFocus + } + } + Button { + text: qsTr("CSV download") + font.pointSize: 8 + } + } + + TableView { + width: 1000 + height: 600 + columnSpacing: 1 + rowSpacing: 1 + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: txListModel + delegate: Rectangle { + implicitWidth: 125 + implicitHeight: 20 + border.color: "black" + border.width: 1 + clip: true + color: heading ? 'black' : 'darkslategrey' + Text { + text: tabledata + font.pointSize: heading ? 8 : 10 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + } + } + } +} diff --git a/GUI/QtQuick/qml/VerifySeedPhrase.qml b/GUI/QtQuick/qml/VerifySeedPhrase.qml new file mode 100644 index 000000000..59b28e54d --- /dev/null +++ b/GUI/QtQuick/qml/VerifySeedPhrase.qml @@ -0,0 +1,144 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" + +Item { + property var phrase + + WalletNamePass { + id: walletNamePass + visible: false + } + + Column { + spacing: 23 + anchors.fill: parent + + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + Label { + text: qsTr("Verify your seed") + font.pointSize: 14 + } + + TextInput { + id: word1 + property bool isValid: (phrase[0] === text) + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 12 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "1" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word6 + property bool isValid: (phrase[5] === text) + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 12 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "6" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word8 + property bool isValid: (phrase[7] === text) + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 12 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "8" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: word11 + property bool isValid: (phrase[10] === text) + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 12 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "11" + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + + Label { + id: verifResult + height: 32 + color: 'red' + text: (word1.isValid && word6.isValid && word8.isValid && word11.isValid) + ? "" : qsTr("Your words are wrong") + } + + Row { + spacing: 50 + Button { + width: 450 + text: qsTr("Skip") + font.pointSize: 12 + onClicked: { // TODO: show confirmation or add a checkbox to confirm + walletNamePass.phrase = phrase + walletNamePass.popLevel = 4 + stack.push(walletNamePass) + } + } + Button { + width: 450 + text: qsTr("Continue") + font.pointSize: 12 + enabled: word1.isValid && word6.isValid && word8.isValid && word11.isValid + onClicked: { + walletNamePass.phrase = phrase + walletNamePass.popLevel = 4 + stack.push(walletNamePass) + } + } + } + } +} diff --git a/GUI/QtQuick/qml/WalletNamePass.qml b/GUI/QtQuick/qml/WalletNamePass.qml new file mode 100644 index 000000000..60e3cd18a --- /dev/null +++ b/GUI/QtQuick/qml/WalletNamePass.qml @@ -0,0 +1,112 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" + +Item { + property var phrase + property int popLevel: 3 + property bool isImport: false + + Column { + spacing: 23 + anchors.fill: parent + + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + Label { + text: qsTr("Set password") + font.pointSize: 14 + } + + TextInput { + id: walletName + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: qsTr("Wallet name") + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + + TextInput { + id: pass1 + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + echoMode: TextInput.Password + passwordCharacter: '*' + Text { + text: qsTr("Password") + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + TextInput { + id: pass2 + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + echoMode: TextInput.Password + passwordCharacter: '*' + Text { + text: qsTr("Confirm password") + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + + Button { + width: 900 + text: qsTr("Confirm") + font.pointSize: 14 + enabled: pass1.text.length && pass2.text.length && (pass1.text == pass2.text) + + onClicked: { + if (isImport) { + bsApp.importWallet(walletName.text, phrase, pass1.text) + } + else { + bsApp.createWallet(walletName.text, phrase, pass1.text) + } + for (var i = 0; i < popLevel; i++) { + stack.pop() + } + } + } + } +} diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 0d9e070aa..210bed466 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -9,7 +9,7 @@ */ import QtQuick 2 -import QtQuick.Controls 2 +import QtQuick.Controls 2.9 import QtQuick.Layouts 1.3 import QtQuick.Window 2 import "StyledControls" 1 @@ -24,8 +24,8 @@ import "js/helper.js" as JsHelper ApplicationWindow { id: mainWindow - width: 800 - height: 600 + minimumWidth: 1024 + minimumHeight: 800 visible: false title: qsTr("BlockSettle Terminal") @@ -52,9 +52,9 @@ ApplicationWindow { } // attached to use from c++ - function messageBoxCritical(title, text, details) { +/* function messageBoxCritical(title, text, details) { return JsHelper.messageBoxCritical(title, text, details) - } + }*/ InfoBanner { id: ibSuccess @@ -64,6 +64,144 @@ ApplicationWindow { id: ibFailure bgColor: "darkred" } + InfoBanner { + id: ibInfo + bgColor: "darkgrey" + } + + StackView { + id: stack + initialItem: swipeView + anchors.fill: parent + } + + SendPage { + id: sendPage + visible: false + } + + ReceivePage { + id: receivePage + visible: false + } + + SettingsPage { + id: settingsPage + visible: false + } + + header: Column { + height: 50 + width: parent.width + + RowLayout { + height: 50 + width: parent.width + + Image { + source: "qrc:/images/bs_logo.png" + horizontalAlignment: Qt.AlignLeft + verticalAlignment: Qt.AlignTop + Layout.fillHeight: true + } + + Image { + id: imgArmoryStatus + source: "qrc:/images/bitcoin-disabled.png" + verticalAlignment: Qt.AlignVCenter + } + + Label { + Layout.fillWidth: true + } + + ToolButton { + id: btnSend + text: qsTr("Send") + icon.source: "qrc:/images/send_icon.png" + font.pointSize: 16 + Layout.fillHeight: true + enabled: false + onClicked: { + stack.push(sendPage) + //sendPage.visible = true + } + } + ToolButton { + id: btnReceive + text: qsTr("Receive") + icon.source: "qrc:/images/receive_icon.png" + font.pointSize: 16 + Layout.fillHeight: true + onClicked: { + stack.push(receivePage) + } + } + ToolButton { + id: btnSettings + text: qsTr("Settings") + icon.source: "qrc:/images/settings_icon.png" + font.pointSize: 16 + Layout.fillHeight: true + onClicked: { + stack.push(settingsPage) + } + } + } + + Rectangle { + width: parent.width + height: 1 + } + } + + SwipeView { + anchors.fill: parent + id: swipeView + currentIndex: tabBar.currentIndex + Layout.fillWidth: true + Layout.fillHeight: true + + OverviewPage { + id: overviewPage + } + + TransactionsPage { + id: transactionsPage + } + + ExplorerPage { + id: explorerPage + } + } + + footer: TabBar { + id: tabBar + currentIndex: swipeView.currentIndex + spacing: 5 + Layout.fillWidth: false + background: Rectangle { + color: "transparent" + } + + CustomTabButton { + id: btnOverview + text: qsTr("Overview") + icon.source: "qrc:/images/overview_icon.png" + } + CustomTabButton { + id: btnTransactions + text: qsTr("Transactions") + icon.source: "qrc:/images/transactions_icon.png" + } + + CustomTabButton { + id: btnExplorer + text: qsTr("Explorer") + icon.source: "qrc:/images/explorer_icon.png" + } + } + /* function raiseWindow() { JsHelper.raiseWindow(mainWindow) diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 22130886b..52b77d90a 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -2,7 +2,27 @@ images/full_logo.png images/bs_logo.png + images/bitcoin-test-net.png + images/bitcoin-main-net.png + images/bitcoin-disabled.png + images/send_icon.png + images/receive_icon.png + images/settings_icon.png + images/overview_icon.png + images/transactions_icon.png + images/explorer_icon.png qml/main.qml + qml/OverviewPage.qml + qml/TransactionsPage.qml + qml/ExplorerPage.qml + qml/SendPage.qml + qml/ReceivePage.qml + qml/SettingsPage.qml + qml/CreateNewWallet.qml + qml/SeedPhrase.qml + qml/ImportSeedPhrase.qml + qml/VerifySeedPhrase.qml + qml/WalletNamePass.qml qml/InfoBanner.qml qml/InfoBannerComponent.qml qml/InfoBar.qml diff --git a/GUI/QtWidgets/QtGuiAdapter.cpp b/GUI/QtWidgets/QtGuiAdapter.cpp index b494fe42b..c303bb711 100644 --- a/GUI/QtWidgets/QtGuiAdapter.cpp +++ b/GUI/QtWidgets/QtGuiAdapter.cpp @@ -223,7 +223,7 @@ void QtGuiAdapter::run(int &argc, char **argv) } } -bool QtGuiAdapter::process(const Envelope &env) +ProcessingResult QtGuiAdapter::process(const Envelope &env) { if (std::dynamic_pointer_cast(env.sender)) { switch (env.sender->value()) { @@ -248,7 +248,7 @@ bool QtGuiAdapter::process(const Envelope &env) default: break; } } - return true; + return ProcessingResult::Ignored; } bool QtGuiAdapter::processBroadcast(const bs::message::Envelope& env) @@ -256,37 +256,37 @@ bool QtGuiAdapter::processBroadcast(const bs::message::Envelope& env) if (std::dynamic_pointer_cast(env.sender)) { switch (env.sender->value()) { case TerminalUsers::System: - return processAdminMessage(env); + return (processAdminMessage(env) != ProcessingResult::Ignored); case TerminalUsers::Settings: - return processSettings(env); + return (processSettings(env) != ProcessingResult::Ignored); case TerminalUsers::Blockchain: - return processBlockchain(env); + return (processBlockchain(env) != ProcessingResult::Ignored); case TerminalUsers::Signer: - return processSigner(env); + return (processSigner(env) != ProcessingResult::Ignored); case TerminalUsers::Wallets: - return processWallets(env); + return (processWallets(env) != ProcessingResult::Ignored); case TerminalUsers::BsServer: - return processBsServer(env); + return (processBsServer(env) != ProcessingResult::Ignored); case TerminalUsers::Matching: - return processMatching(env); + return (processMatching(env) != ProcessingResult::Ignored); case TerminalUsers::MktData: - return processMktData(env); + return (processMktData(env) != ProcessingResult::Ignored); case TerminalUsers::OnChainTracker: - return processOnChainTrack(env); + return (processOnChainTrack(env) != ProcessingResult::Ignored); case TerminalUsers::Assets: - return processAssets(env); + return (processAssets(env) != ProcessingResult::Ignored); default: break; } } return false; } -bool QtGuiAdapter::processSettings(const Envelope &env) +ProcessingResult QtGuiAdapter::processSettings(const Envelope &env) { SettingsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse settings msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case SettingsMessage::kGetResponse: @@ -299,10 +299,10 @@ bool QtGuiAdapter::processSettings(const Envelope &env) return processArmoryServers(msg.armory_servers()); default: break; } - return true; + return ProcessingResult::Ignored; } -bool QtGuiAdapter::processSettingsGetResponse(const SettingsMessage_SettingsResponse &response) +ProcessingResult QtGuiAdapter::processSettingsGetResponse(const SettingsMessage_SettingsResponse &response) { std::map settings; for (const auto &setting : response.responses()) { @@ -346,28 +346,30 @@ bool QtGuiAdapter::processSettingsGetResponse(const SettingsMessage_SettingsResp } } if (!settings.empty()) { - return QMetaObject::invokeMethod(mainWindow_, [mw = mainWindow_, settings] { + const bool rc = QMetaObject::invokeMethod(mainWindow_, [mw = mainWindow_, settings] { for (const auto& setting : settings) { mw->onSetting(setting.first, setting.second); } }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } - return true; + return ProcessingResult::Ignored; } -bool QtGuiAdapter::processSettingsState(const SettingsMessage_SettingsResponse& response) +ProcessingResult QtGuiAdapter::processSettingsState(const SettingsMessage_SettingsResponse& response) { ApplicationSettings::State state; for (const auto& setting : response.responses()) { state[static_cast(setting.request().index())] = fromResponse(setting); } - return QMetaObject::invokeMethod(mainWindow_, [mw = mainWindow_, state] { + const bool rc = QMetaObject::invokeMethod(mainWindow_, [mw = mainWindow_, state] { mw->onSettingsState(state); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processArmoryServers(const SettingsMessage_ArmoryServers& response) +ProcessingResult QtGuiAdapter::processArmoryServers(const SettingsMessage_ArmoryServers& response) { QList servers; for (const auto& server : response.servers()) { @@ -380,17 +382,18 @@ bool QtGuiAdapter::processArmoryServers(const SettingsMessage_ArmoryServers& res } logger_->debug("[{}] {} servers, cur: {}, conn: {}", __func__, servers.size() , response.idx_current(), response.idx_connected()); - return QMetaObject::invokeMethod(mainWindow_, [mw = mainWindow_, servers, response] { + const bool rc = QMetaObject::invokeMethod(mainWindow_, [mw = mainWindow_, servers, response] { mw->onArmoryServers(servers, response.idx_current(), response.idx_connected()); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processAdminMessage(const Envelope &env) +ProcessingResult QtGuiAdapter::processAdminMessage(const Envelope &env) { AdministrativeMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse admin msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case AdministrativeMessage::kComponentCreated: @@ -412,10 +415,10 @@ bool QtGuiAdapter::processAdminMessage(const Envelope &env) default: break; } updateSplashProgress(); - return true; + return ProcessingResult::Success; } -bool QtGuiAdapter::processBlockchain(const Envelope &env) +ProcessingResult QtGuiAdapter::processBlockchain(const Envelope &env) { ArmoryMessage msg; if (!msg.ParseFromString(env.message)) { @@ -424,7 +427,7 @@ bool QtGuiAdapter::processBlockchain(const Envelope &env) if (!env.receiver) { logger_->debug("[{}] no receiver", __func__); } - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case ArmoryMessage::kLoading: @@ -464,12 +467,12 @@ bool QtGuiAdapter::processBlockchain(const Envelope &env) return processZC(msg.zc_received()); case ArmoryMessage::kZcInvalidated: return processZCInvalidated(msg.zc_invalidated()); - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool QtGuiAdapter::processSigner(const Envelope &env) +ProcessingResult QtGuiAdapter::processSigner(const Envelope &env) { SignerMessage msg; if (!msg.ParseFromString(env.message)) { @@ -478,7 +481,7 @@ bool QtGuiAdapter::processSigner(const Envelope &env) if (!env.receiver) { logger_->debug("[{}] no receiver", __func__); } - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case SignerMessage::kState: @@ -512,17 +515,17 @@ bool QtGuiAdapter::processSigner(const Envelope &env) }); } break; - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool QtGuiAdapter::processWallets(const Envelope &env) +ProcessingResult QtGuiAdapter::processWallets(const Envelope &env) { WalletsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case WalletsMessage::kLoading: @@ -608,41 +611,41 @@ bool QtGuiAdapter::processWallets(const Envelope &env) break; case WalletsMessage::kLedgerEntries: return processLedgerEntries(msg.ledger_entries()); - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool QtGuiAdapter::processOnChainTrack(const Envelope &env) +ProcessingResult QtGuiAdapter::processOnChainTrack(const Envelope &env) { OnChainTrackMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case OnChainTrackMessage::kLoading: loadingComponents_.insert(env.sender->value()); updateSplashProgress(); break; - default: break; + default: return ProcessingResult::Ignored; } - return true; + return ProcessingResult::Success; } -bool QtGuiAdapter::processAssets(const bs::message::Envelope& env) +ProcessingResult QtGuiAdapter::processAssets(const bs::message::Envelope& env) { AssetsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case AssetsMessage::kBalance: return processBalance(msg.balance()); default: break; } - return true; + return ProcessingResult::Ignored; } void QtGuiAdapter::updateStates() @@ -1273,25 +1276,24 @@ void QtGuiAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) } } -bool QtGuiAdapter::processWalletData(uint64_t msgId +ProcessingResult QtGuiAdapter::processWalletData(uint64_t msgId , const WalletsMessage_WalletData& response) { const auto& itWallet = walletGetMap_.find(msgId); if (itWallet == walletGetMap_.end()) { - return true; + return ProcessingResult::Ignored; } const auto& walletId = itWallet->second; const auto& walletData = bs::sync::WalletData::fromCommonMessage(response); if (QMetaObject::invokeMethod(mainWindow_, [this, walletId, walletData] { - mainWindow_->onWalletData(walletId, walletData); - })) { + mainWindow_->onWalletData(walletId, walletData); })) { walletGetMap_.erase(itWallet); - return true; + return ProcessingResult::Success; } - return false; + return ProcessingResult::Retry; } -bool QtGuiAdapter::processWalletBalances(const bs::message::Envelope & +ProcessingResult QtGuiAdapter::processWalletBalances(const bs::message::Envelope & , const WalletsMessage_WalletBalances &response) { bs::sync::WalletBalanceData wbd; @@ -1305,12 +1307,13 @@ bool QtGuiAdapter::processWalletBalances(const bs::message::Envelope & , addrBal.tx_count(), (int64_t)addrBal.total_balance(), (int64_t)addrBal.spendable_balance() , (int64_t)addrBal.unconfirmed_balance() }); } - return QMetaObject::invokeMethod(mainWindow_, [this, wbd] { + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, wbd] { mainWindow_->onWalletBalance(wbd); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processTXDetails(uint64_t msgId, const WalletsMessage_TXDetailsResponse &response) +ProcessingResult QtGuiAdapter::processTXDetails(uint64_t msgId, const WalletsMessage_TXDetailsResponse &response) { std::vector txDetails; for (const auto &resp : response.responses()) { @@ -1382,16 +1385,18 @@ bool QtGuiAdapter::processTXDetails(uint64_t msgId, const WalletsMessage_TXDetai const auto& itZC = newZCs_.find(msgId); if (itZC != newZCs_.end()) { newZCs_.erase(itZC); - return QMetaObject::invokeMethod(mainWindow_, [this, txDetails] { + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, txDetails] { mainWindow_->onNewZCs(txDetails); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } - return QMetaObject::invokeMethod(mainWindow_, [this, txDetails] { + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, txDetails] { mainWindow_->onTXDetails(txDetails); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processLedgerEntries(const LedgerEntries &response) +ProcessingResult QtGuiAdapter::processLedgerEntries(const LedgerEntries &response) { std::vector entries; for (const auto &entry : response.entries()) { @@ -1415,15 +1420,16 @@ bool QtGuiAdapter::processLedgerEntries(const LedgerEntries &response) } entries.push_back(std::move(txEntry)); } - return QMetaObject::invokeMethod(mainWindow_, [this, entries, filter=response.filter() + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, entries, filter=response.filter() , totPages=response.total_pages(), curPage=response.cur_page() , curBlock=response.cur_block()] { mainWindow_->onLedgerEntries(filter, totPages, curPage, curBlock, entries); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processAddressHist(const ArmoryMessage_AddressHistory& response) +ProcessingResult QtGuiAdapter::processAddressHist(const ArmoryMessage_AddressHistory& response) { bs::Address addr; try { @@ -1431,7 +1437,7 @@ bool QtGuiAdapter::processAddressHist(const ArmoryMessage_AddressHistory& respon } catch (const std::exception& e) { logger_->error("[{}] invalid address: {}", __func__, e.what()); - return true; + return ProcessingResult::Error; } std::vector entries; for (const auto& entry : response.entries()) { @@ -1455,35 +1461,38 @@ bool QtGuiAdapter::processAddressHist(const ArmoryMessage_AddressHistory& respon } entries.push_back(std::move(txEntry)); } - return QMetaObject::invokeMethod(mainWindow_, [this, entries, addr, curBlock = response.cur_block()] { + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, entries, addr, curBlock = response.cur_block()] { mainWindow_->onAddressHistory(addr, curBlock, entries); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processFeeLevels(const ArmoryMessage_FeeLevelsResponse& response) +ProcessingResult QtGuiAdapter::processFeeLevels(const ArmoryMessage_FeeLevelsResponse& response) { std::map feeLevels; for (const auto& pair : response.fee_levels()) { feeLevels[pair.level()] = pair.fee(); } - return QMetaObject::invokeMethod(mainWindow_, [this, feeLevels]{ + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, feeLevels]{ mainWindow_->onFeeLevels(feeLevels); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processWalletsList(const WalletsMessage_WalletsListResponse& response) +ProcessingResult QtGuiAdapter::processWalletsList(const WalletsMessage_WalletsListResponse& response) { std::vector wallets; for (const auto& wallet : response.wallets()) { wallets.push_back(bs::sync::HDWalletData::fromCommonMessage(wallet)); } - return QMetaObject::invokeMethod(mainWindow_, [this, wallets, id = response.id()]{ + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, wallets, id = response.id()]{ mainWindow_->onWalletsList(id, wallets); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processUTXOs(const WalletsMessage_UtxoListResponse& response) +ProcessingResult QtGuiAdapter::processUTXOs(const WalletsMessage_UtxoListResponse& response) { std::vector utxos; for (const auto& serUtxo : response.utxos()) { @@ -1491,20 +1500,22 @@ bool QtGuiAdapter::processUTXOs(const WalletsMessage_UtxoListResponse& response) utxo.unserialize(BinaryData::fromString(serUtxo)); utxos.push_back(std::move(utxo)); } - return QMetaObject::invokeMethod(mainWindow_, [this, utxos, response]{ + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, utxos, response]{ mainWindow_->onUTXOs(response.id(), response.wallet_id(), utxos); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse& response) +ProcessingResult QtGuiAdapter::processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse& response) { - return QMetaObject::invokeMethod(mainWindow_, [this, response] { + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, response] { mainWindow_->onSignedTX(response.id(), BinaryData::fromString(response.signed_tx()) , static_cast(response.error_code())); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived& zcs) +ProcessingResult QtGuiAdapter::processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived& zcs) { WalletsMessage msg; auto msgReq = msg.mutable_tx_details_request(); @@ -1518,29 +1529,30 @@ bool QtGuiAdapter::processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived } const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); if (!msgId) { - return false; + return ProcessingResult::Error; } newZCs_.insert(msgId); - return true; + return ProcessingResult::Success; } -bool QtGuiAdapter::processZCInvalidated(const ArmoryMessage_ZCInvalidated& zcInv) +ProcessingResult QtGuiAdapter::processZCInvalidated(const ArmoryMessage_ZCInvalidated& zcInv) { std::vector txHashes; for (const auto& hashStr : zcInv.tx_hashes()) { txHashes.push_back(BinaryData::fromString(hashStr)); } - return QMetaObject::invokeMethod(mainWindow_, [this, txHashes] { + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, txHashes] { mainWindow_->onZCsInvalidated(txHashes); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processBsServer(const bs::message::Envelope& env) +ProcessingResult QtGuiAdapter::processBsServer(const bs::message::Envelope& env) { BsServerMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case BsServerMessage::kStartLoginResult: @@ -1549,18 +1561,19 @@ bool QtGuiAdapter::processBsServer(const bs::message::Envelope& env) return processLogin(msg.login_result()); default: break; } - return true; + return ProcessingResult::Ignored; } -bool QtGuiAdapter::processStartLogin(const BsServerMessage_StartLoginResult& response) +ProcessingResult QtGuiAdapter::processStartLogin(const BsServerMessage_StartLoginResult& response) { - return QMetaObject::invokeMethod(mainWindow_, [this, response] { + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, response] { mainWindow_->onLoginStarted(response.login(), response.success() , response.error_text()); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processLogin(const BsServerMessage_LoginResult& response) +ProcessingResult QtGuiAdapter::processLogin(const BsServerMessage_LoginResult& response) { #if 0 result.login = response.login(); @@ -1583,16 +1596,16 @@ bool QtGuiAdapter::processLogin(const BsServerMessage_LoginResult& response) mainWindow_->onLoggedIn(result); }); #else - return true; + return ProcessingResult::Ignored; #endif 0 } -bool QtGuiAdapter::processMatching(const bs::message::Envelope& env) +ProcessingResult QtGuiAdapter::processMatching(const bs::message::Envelope& env) { MatchingMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case MatchingMessage::kLoggedIn: @@ -1603,22 +1616,23 @@ bool QtGuiAdapter::processMatching(const bs::message::Envelope& env) }); #endif case MatchingMessage::kLoggedOut: - return QMetaObject::invokeMethod(mainWindow_, [this] { + QMetaObject::invokeMethod(mainWindow_, [this] { //mainWindow_->onMatchingLogout(); }); + return ProcessingResult::Success; /* case MatchingMessage::kQuoteNotif: return processQuoteNotif(msg.quote_notif());*/ default: break; } - return true; + return ProcessingResult::Ignored; } -bool QtGuiAdapter::processMktData(const bs::message::Envelope& env) +ProcessingResult QtGuiAdapter::processMktData(const bs::message::Envelope& env) { MktDataMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case MktDataMessage::kConnected: @@ -1626,29 +1640,29 @@ bool QtGuiAdapter::processMktData(const bs::message::Envelope& env) case MktDataMessage::kDisconnected: mdInstrumentsReceived_ = false; //return QMetaObject::invokeMethod(mainWindow_, [this] { mainWindow_->onMDDisconnected(); }); - return true; + return ProcessingResult::Success; case MktDataMessage::kNewSecurity: return processSecurity(msg.new_security().name(), msg.new_security().asset_type()); case MktDataMessage::kAllInstrumentsReceived: mdInstrumentsReceived_ = true; - return true; // sendPooledOrdersUpdate(); + return ProcessingResult::Success; // sendPooledOrdersUpdate(); case MktDataMessage::kPriceUpdate: return processMdUpdate(msg.price_update()); default: break; } - return true; + return ProcessingResult::Ignored; } -bool QtGuiAdapter::processSecurity(const std::string& name, int assetType) +ProcessingResult QtGuiAdapter::processSecurity(const std::string& name, int assetType) { const auto &at = static_cast(assetType); assetTypes_[name] = at; - return true; + return ProcessingResult::Success; } -bool QtGuiAdapter::processMdUpdate(const MktDataMessage_Prices& msg) +ProcessingResult QtGuiAdapter::processMdUpdate(const MktDataMessage_Prices& msg) { - return QMetaObject::invokeMethod(mainWindow_, [this, msg] { + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, msg] { const bs::network::MDFields fields{ { bs::network::MDField::Type::PriceBid, msg.bid() }, { bs::network::MDField::Type::PriceOffer, msg.ask() }, @@ -1659,16 +1673,18 @@ bool QtGuiAdapter::processMdUpdate(const MktDataMessage_Prices& msg) mainWindow_->onMDUpdated(static_cast(msg.security().asset_type()) , QString::fromStdString(msg.security().name()), fields); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processBalance(const AssetsMessage_Balance& bal) +ProcessingResult QtGuiAdapter::processBalance(const AssetsMessage_Balance& bal) { - return QMetaObject::invokeMethod(mainWindow_, [this, bal] { + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, bal] { mainWindow_->onBalance(bal.currency(), bal.value()); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } -bool QtGuiAdapter::processReservedUTXOs(const WalletsMessage_ReservedUTXOs& response) +ProcessingResult QtGuiAdapter::processReservedUTXOs(const WalletsMessage_ReservedUTXOs& response) { std::vector utxos; for (const auto& utxoSer : response.utxos()) { @@ -1676,9 +1692,10 @@ bool QtGuiAdapter::processReservedUTXOs(const WalletsMessage_ReservedUTXOs& resp utxo.unserialize(BinaryData::fromString(utxoSer)); utxos.push_back(std::move(utxo)); } - return QMetaObject::invokeMethod(mainWindow_, [this, response, utxos] { + const bool rc = QMetaObject::invokeMethod(mainWindow_, [this, response, utxos] { mainWindow_->onReservedUTXOs(response.id(), response.sub_id(), utxos); }); + return rc ? ProcessingResult::Success : ProcessingResult::Retry; } #include "QtGuiAdapter.moc" diff --git a/GUI/QtWidgets/QtGuiAdapter.h b/GUI/QtWidgets/QtGuiAdapter.h index 9ac8fd566..c0518b71e 100644 --- a/GUI/QtWidgets/QtGuiAdapter.h +++ b/GUI/QtWidgets/QtGuiAdapter.h @@ -77,7 +77,7 @@ class QtGuiAdapter : public QObject, public ApiBusAdapter, public bs::MainLoopRu QtGuiAdapter(const std::shared_ptr &); ~QtGuiAdapter() override; - bool process(const bs::message::Envelope &) override; + bs::message::ProcessingResult process(const bs::message::Envelope &) override; bool processBroadcast(const bs::message::Envelope&) override; Users supportedReceivers() const override { return { user_ }; } @@ -86,16 +86,16 @@ class QtGuiAdapter : public QObject, public ApiBusAdapter, public bs::MainLoopRu void run(int &argc, char **argv) override; private: - bool processSettings(const bs::message::Envelope &); - bool processSettingsGetResponse(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); - bool processSettingsState(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); - bool processArmoryServers(const BlockSettle::Terminal::SettingsMessage_ArmoryServers&); - bool processAdminMessage(const bs::message::Envelope &); - bool processBlockchain(const bs::message::Envelope &); - bool processSigner(const bs::message::Envelope &); - bool processWallets(const bs::message::Envelope &); - bool processOnChainTrack(const bs::message::Envelope &); - bool processAssets(const bs::message::Envelope&); + bs::message::ProcessingResult processSettings(const bs::message::Envelope &); + bs::message::ProcessingResult processSettingsGetResponse(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); + bs::message::ProcessingResult processSettingsState(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); + bs::message::ProcessingResult processArmoryServers(const BlockSettle::Terminal::SettingsMessage_ArmoryServers&); + bs::message::ProcessingResult processAdminMessage(const bs::message::Envelope &); + bs::message::ProcessingResult processBlockchain(const bs::message::Envelope &); + bs::message::ProcessingResult processSigner(const bs::message::Envelope &); + bs::message::ProcessingResult processWallets(const bs::message::Envelope &); + bs::message::ProcessingResult processOnChainTrack(const bs::message::Envelope &); + bs::message::ProcessingResult processAssets(const bs::message::Envelope&); void requestInitialSettings(); void updateSplashProgress(); @@ -106,30 +106,30 @@ class QtGuiAdapter : public QObject, public ApiBusAdapter, public bs::MainLoopRu void makeMainWinConnections(); void processWalletLoaded(const bs::sync::WalletInfo &); - bool processWalletData(const uint64_t msgId + bs::message::ProcessingResult processWalletData(const uint64_t msgId , const BlockSettle::Common::WalletsMessage_WalletData&); - bool processWalletBalances(const bs::message::Envelope & + bs::message::ProcessingResult processWalletBalances(const bs::message::Envelope & , const BlockSettle::Common::WalletsMessage_WalletBalances &); - bool processTXDetails(uint64_t msgId, const BlockSettle::Common::WalletsMessage_TXDetailsResponse &); - bool processLedgerEntries(const BlockSettle::Common::LedgerEntries &); - bool processAddressHist(const BlockSettle::Common::ArmoryMessage_AddressHistory&); - bool processFeeLevels(const BlockSettle::Common::ArmoryMessage_FeeLevelsResponse&); - bool processWalletsList(const BlockSettle::Common::WalletsMessage_WalletsListResponse&); - bool processUTXOs(const BlockSettle::Common::WalletsMessage_UtxoListResponse&); - bool processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse&); - bool processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived&); - bool processZCInvalidated(const BlockSettle::Common::ArmoryMessage_ZCInvalidated&); - - bool processBsServer(const bs::message::Envelope&); - bool processStartLogin(const BlockSettle::Terminal::BsServerMessage_StartLoginResult&); - bool processLogin(const BlockSettle::Terminal::BsServerMessage_LoginResult&); - - bool processMatching(const bs::message::Envelope&); - bool processMktData(const bs::message::Envelope&); - bool processSecurity(const std::string&, int); - bool processMdUpdate(const BlockSettle::Terminal::MktDataMessage_Prices &); - bool processBalance(const BlockSettle::Terminal::AssetsMessage_Balance&); - bool processReservedUTXOs(const BlockSettle::Common::WalletsMessage_ReservedUTXOs&); + bs::message::ProcessingResult processTXDetails(uint64_t msgId, const BlockSettle::Common::WalletsMessage_TXDetailsResponse &); + bs::message::ProcessingResult processLedgerEntries(const BlockSettle::Common::LedgerEntries &); + bs::message::ProcessingResult processAddressHist(const BlockSettle::Common::ArmoryMessage_AddressHistory&); + bs::message::ProcessingResult processFeeLevels(const BlockSettle::Common::ArmoryMessage_FeeLevelsResponse&); + bs::message::ProcessingResult processWalletsList(const BlockSettle::Common::WalletsMessage_WalletsListResponse&); + bs::message::ProcessingResult processUTXOs(const BlockSettle::Common::WalletsMessage_UtxoListResponse&); + bs::message::ProcessingResult processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse&); + bs::message::ProcessingResult processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived&); + bs::message::ProcessingResult processZCInvalidated(const BlockSettle::Common::ArmoryMessage_ZCInvalidated&); + + bs::message::ProcessingResult processBsServer(const bs::message::Envelope&); + bs::message::ProcessingResult processStartLogin(const BlockSettle::Terminal::BsServerMessage_StartLoginResult&); + bs::message::ProcessingResult processLogin(const BlockSettle::Terminal::BsServerMessage_LoginResult&); + + bs::message::ProcessingResult processMatching(const bs::message::Envelope&); + bs::message::ProcessingResult processMktData(const bs::message::Envelope&); + bs::message::ProcessingResult processSecurity(const std::string&, int); + bs::message::ProcessingResult processMdUpdate(const BlockSettle::Terminal::MktDataMessage_Prices &); + bs::message::ProcessingResult processBalance(const BlockSettle::Terminal::AssetsMessage_Balance&); + bs::message::ProcessingResult processReservedUTXOs(const BlockSettle::Common::WalletsMessage_ReservedUTXOs&); private slots: void onGetSettings(const std::vector&); diff --git a/UnitTests/MockTerminal.cpp b/UnitTests/MockTerminal.cpp index 1ff4ba799..f102d05db 100644 --- a/UnitTests/MockTerminal.cpp +++ b/UnitTests/MockTerminal.cpp @@ -108,13 +108,13 @@ class SettingsMockAdapter : public bs::message::Adapter return false; } - bool process(const bs::message::Envelope& env) override + ProcessingResult process(const bs::message::Envelope& env) override { if (env.receiver->value() == TerminalUsers::Settings) { SettingsMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse settings msg #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case SettingsMessage::kGetRequest: @@ -143,7 +143,7 @@ class SettingsMockAdapter : public bs::message::Adapter default: break; } } - return true; + return ProcessingResult::Ignored; } bs::message::Adapter::Users supportedReceivers() const override @@ -156,7 +156,7 @@ class SettingsMockAdapter : public bs::message::Adapter // std::shared_ptr createOnChainPlug() const; private: - bool processGetRequest(const bs::message::Envelope& env + ProcessingResult processGetRequest(const bs::message::Envelope& env , const BlockSettle::Terminal::SettingsMessage_SettingsRequest& request) { SettingsMessage msg; @@ -175,9 +175,9 @@ class SettingsMockAdapter : public bs::message::Adapter } } if (msgResp->responses_size()) { - return pushResponse(user_, env, msg.SerializeAsString()); + pushResponse(user_, env, msg.SerializeAsString()); } - return true; + return ProcessingResult::Success; } private: @@ -192,7 +192,7 @@ class ApiMockAdapter : public bs::message::Adapter ApiMockAdapter() {} ~ApiMockAdapter() override = default; - bool process(const bs::message::Envelope&) override { return true; } + ProcessingResult process(const bs::message::Envelope&) override { return ProcessingResult::Ignored; } bool processBroadcast(const bs::message::Envelope&) override { return false; } bs::message::Adapter::Users supportedReceivers() const override { diff --git a/UnitTests/TestAdapters.cpp b/UnitTests/TestAdapters.cpp index 46350581a..16bee1bd0 100644 --- a/UnitTests/TestAdapters.cpp +++ b/UnitTests/TestAdapters.cpp @@ -27,7 +27,7 @@ using namespace BlockSettle::Terminal; constexpr auto kExpirationTimeout = std::chrono::seconds{ 5 }; -bool TestSupervisor::process(const Envelope &env) +ProcessingResult TestSupervisor::process(const Envelope &env) { #ifdef MSG_DEBUGGING StaticLogger::loggerPtr->debug("[{}] {}{}: {}({}) -> {}({}), {} bytes" @@ -48,7 +48,7 @@ bool TestSupervisor::process(const Envelope &env) filtersToDelete.push_back(seqNo); break; } - return false; + return ProcessingResult::Success; } } for (const auto &filter : filterWait_) { @@ -65,10 +65,10 @@ bool TestSupervisor::process(const Envelope &env) filterMap_.erase(seqNo); filterWait_.erase(seqNo); } - return false; + return ProcessingResult::Success; } } - return true; + return ProcessingResult::Ignored; } bs::message::SeqId TestSupervisor::send(bs::message::TerminalUsers sender, bs::message::TerminalUsers receiver @@ -124,13 +124,13 @@ MatchingMock::MatchingMock(const std::shared_ptr& logger , userSettl_(UserTerminal::create(TerminalUsers::Settlement)) {} -bool MatchingMock::process(const bs::message::Envelope& env) +ProcessingResult MatchingMock::process(const bs::message::Envelope& env) { if (env.isRequest() && (env.receiver->value() == user_->value())) { MatchingMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse own request #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case MatchingMessage::kSendRfq: @@ -184,7 +184,8 @@ bool MatchingMock::process(const bs::message::Envelope& env) else { match.second.order = fromMsg(msg.order()); } - return pushResponse(user_, userSettl_, msg.SerializeAsString()); + pushResponse(user_, userSettl_, msg.SerializeAsString()); + return ProcessingResult::Success; } } } @@ -212,27 +213,31 @@ bool MatchingMock::process(const bs::message::Envelope& env) BsServerMessage msg; if (!msg.ParseFromString(env.message)) { logger_->error("[{}] failed to parse own request #{}", __func__, env.foreignId()); - return true; + return ProcessingResult::Error; } switch (msg.data_case()) { case BsServerMessage::kSendUnsignedPayin: - return processUnsignedPayin(msg.send_unsigned_payin()); + return processUnsignedPayin(msg.send_unsigned_payin()) ? + ProcessingResult::Success : ProcessingResult::Error; case BsServerMessage::kSendSignedPayin: - return processSignedTX(msg.send_signed_payin(), true, true); + return processSignedTX(msg.send_signed_payin(), true, true) ? + ProcessingResult::Success : ProcessingResult::Error; case BsServerMessage::kSendSignedPayout: - return processSignedTX(msg.send_signed_payout(), false, true); - default: break; + return processSignedTX(msg.send_signed_payout(), false, true) ? + ProcessingResult::Success : ProcessingResult::Error; + default: return ProcessingResult::Ignored; } } else if (env.receiver->value() == env.sender->value() && (env.sender->value() == user_->value())) { //own to self for (const auto& match : matches_) { if (match.second.quote.quoteId == env.message) { - return sendPendingOrder(match.first); + return sendPendingOrder(match.first) ? ProcessingResult::Success + : ProcessingResult::Error; } } } - return true; + return ProcessingResult::Success; } bool MatchingMock::processBroadcast(const bs::message::Envelope&) diff --git a/UnitTests/TestAdapters.h b/UnitTests/TestAdapters.h index 657ada321..ecf6a8561 100644 --- a/UnitTests/TestAdapters.h +++ b/UnitTests/TestAdapters.h @@ -39,16 +39,16 @@ class TestSupervisor : public bs::message::Adapter TestSupervisor(const std::string& name) : name_(name) {} - bool process(const bs::message::Envelope &) override; + bs::message::ProcessingResult process(const bs::message::Envelope &) override; bool processBroadcast(const bs::message::Envelope& env) override { - return process(env); + return (process(env) != bs::message::ProcessingResult::Ignored); } bs::message::Adapter::Users supportedReceivers() const override { - return { std::make_shared() }; + return { std::make_shared() }; } std::string name() const override { return "sup" + name_; } @@ -79,7 +79,7 @@ class MatchingMock : public bs::message::Adapter , const std::string& name, const std::string& email , const std::shared_ptr &); // for pushing ZCs (mocking PB) - bool process(const bs::message::Envelope&) override; + bs::message::ProcessingResult process(const bs::message::Envelope&) override; bool processBroadcast(const bs::message::Envelope&) override; bs::message::Adapter::Users supportedReceivers() const override diff --git a/common b/common index 7a79d2caa..2fe353595 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 7a79d2caa5f8541efeeb11ab3861df1dbe7cf8ba +Subproject commit 2fe35359568bf51b3585bbda66c0b7d9df2cf768 From e0515da92debe66ce7042c1e4162d051c4264346 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 9 Dec 2022 19:38:42 +0300 Subject: [PATCH 002/436] Linux build fixes --- BlockSettleUILib/NotificationCenter.cpp | 2 +- CMakeLists.txt | 1 + Core/TerminalMessage.h | 2 +- GUI/QtQuick/TxListModel.h | 1 + common | 2 +- 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/BlockSettleUILib/NotificationCenter.cpp b/BlockSettleUILib/NotificationCenter.cpp index b9d85985f..e2285b47c 100644 --- a/BlockSettleUILib/NotificationCenter.cpp +++ b/BlockSettleUILib/NotificationCenter.cpp @@ -308,7 +308,7 @@ void NotificationTrayIconResponder::notificationAction(const QString &action) newVersionMessage_ = true; messageClicked(); } else if (action == c_newOkAction) { - newChatMessage_ = true; +// newChatMessage_ = true; messageClicked(); } } diff --git a/CMakeLists.txt b/CMakeLists.txt index 61cacb419..3162a1ad4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -187,6 +187,7 @@ INCLUDE_DIRECTORIES(${Qt5Sql_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${Qt5Svg_INCLUDE_DIRS}) IF ( UNIX AND NOT APPLE ) + add_compile_options(-fPIC) FIND_PACKAGE(Qt5DBus REQUIRED) ADD_DEFINITIONS( "-DBS_USE_DBUS" ) INCLUDE_DIRECTORIES(${Qt5DBus_INCLUDE_DIRS}) diff --git a/Core/TerminalMessage.h b/Core/TerminalMessage.h index 206c373cf..3ec4c2e45 100644 --- a/Core/TerminalMessage.h +++ b/Core/TerminalMessage.h @@ -100,7 +100,7 @@ namespace bs { std::shared_ptr logger_; std::map> queues_; std::shared_ptr runnableAdapter_; - std::shared_ptr relayAdapter_; + std::shared_ptr relayAdapter_; }; } // namespace message diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 0ad35cca3..6f41a7821 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -11,6 +11,7 @@ #ifndef TX_LIST_MODEL_H #define TX_LIST_MODEL_H +#include #include #include #include diff --git a/common b/common index 2fe353595..81c94e65a 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 2fe35359568bf51b3585bbda66c0b7d9df2cf768 +Subproject commit 81c94e65a97ba9f20cb105c1122ffded4fa82ee2 From 9c64e5f1b2de07b176c52bb32eead2e426aa0800 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 12 Dec 2022 20:27:52 +0300 Subject: [PATCH 003/436] basic TX signing --- Core/SettingsAdapter.cpp | 1 + GUI/QtQuick/QTXSignRequest.cpp | 100 +++++++++++++++++++++++ GUI/QtQuick/QTXSignRequest.h | 79 +++++++++++++++++++ GUI/QtQuick/QtQuickAdapter.cpp | 79 ++++++++++++++++++- GUI/QtQuick/QtQuickAdapter.h | 13 ++- GUI/QtQuick/qml/SendPage.qml | 140 ++++++++++++++++++++++++++++++--- GUI/QtQuick/qml/VerifyTX.qml | 126 +++++++++++++++++++++++++++++ GUI/QtQuick/qml/main.qml | 4 +- GUI/QtQuick/qtquick.qrc | 1 + common | 2 +- 10 files changed, 528 insertions(+), 17 deletions(-) create mode 100644 GUI/QtQuick/QTXSignRequest.cpp create mode 100644 GUI/QtQuick/QTXSignRequest.h create mode 100644 GUI/QtQuick/qml/VerifyTX.qml diff --git a/Core/SettingsAdapter.cpp b/Core/SettingsAdapter.cpp index fbe694e71..d9c0ec749 100644 --- a/Core/SettingsAdapter.cpp +++ b/Core/SettingsAdapter.cpp @@ -518,6 +518,7 @@ ProcessingResult SettingsAdapter::processArmoryServer(const BlockSettle::Termina } armoryServersProvider_->setupServer(selIndex); appSettings_->selectNetwork(); + return ProcessingResult::Success; } ProcessingResult SettingsAdapter::processSetArmoryServer(const bs::message::Envelope& env, int index) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp new file mode 100644 index 000000000..e63c8e673 --- /dev/null +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -0,0 +1,100 @@ +/* + +*********************************************************************************** +* Copyright (C) 2020 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "QTXSignRequest.h" +#include "Address.h" +#include "BTCNumericTypes.h" + + +QTXSignRequest::QTXSignRequest(QObject* parent) + : QObject(parent) +{} + +void QTXSignRequest::setTxSignReq(const bs::core::wallet::TXSignRequest& txReq) +{ + txReq_ = txReq; + emit txSignReqChanged(); +} + +void QTXSignRequest::setError(const QString& err) +{ + error_ = err; + emit error(); +} + +QStringList QTXSignRequest::outputAddresses() const +{ + if (!txReq_.isValid()) { + return {}; + } + QStringList result; + for (const auto& recip : txReq_.getRecipients([](const bs::Address&) { return true; })) { + try { + const auto& addr = bs::Address::fromRecipient(recip); + result.append(QString::fromStdString(addr.display())); + } + catch (const std::exception& e) { + result.append(QLatin1String("error: ") + QLatin1String(e.what())); + } + } + return result; +} + +QString QTXSignRequest::outputAmount() const +{ + if (!txReq_.isValid()) { + return {}; + } + return QString::number(txReq_.amountSent([](const bs::Address&) { return true; }) / BTCNumericTypes::BalanceDivider + , 'f', 8); +} + +QString QTXSignRequest::inputAmount() const +{ + if (!txReq_.isValid()) { + return {}; + } + return QString::number(txReq_.amountReceived([](const bs::Address&) { return true; }) / BTCNumericTypes::BalanceDivider + , 'f', 8); +} + +QString QTXSignRequest::returnAmount() const +{ + if (!txReq_.isValid()) { + return {}; + } + return QString::number(txReq_.changeAmount([](const bs::Address&) { return true; }) / BTCNumericTypes::BalanceDivider + , 'f', 8); +} + +QString QTXSignRequest::fee() const +{ + if (!txReq_.isValid()) { + return {}; + } + return QString::number(txReq_.getFee() / BTCNumericTypes::BalanceDivider + , 'f', 8); +} + +quint32 QTXSignRequest::txSize() const +{ + if (!txReq_.isValid()) { + return 0; + } + return txReq_.estimateTxVirtSize(); +} + +QString QTXSignRequest::feePerByte() const +{ + if (!txReq_.isValid()) { + return {}; + } + return QString::number(txReq_.getFee() / (double)txReq_.estimateTxVirtSize(), 'f', 1); +} diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h new file mode 100644 index 000000000..4bec621c6 --- /dev/null +++ b/GUI/QtQuick/QTXSignRequest.h @@ -0,0 +1,79 @@ +/* + +*********************************************************************************** +* Copyright (C) 2020 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef Q_TX_SIGN_REQUEST_H +#define Q_TX_SIGN_REQUEST_H + +#include +#include +#include +#include "BinaryData.h" +#include "CoreWallet.h" + +namespace spdlog { + class logger; +} + +class QTXSignRequest : public QObject +{ + Q_OBJECT +public: + struct Recipient { + const bs::Address address; + double amount; + }; + + QTXSignRequest(QObject* parent = nullptr); + bs::core::wallet::TXSignRequest txReq() const { return txReq_; } + void setTxSignReq(const bs::core::wallet::TXSignRequest&); + void setError(const QString&); + + Q_PROPERTY(QStringList outputAddresses READ outputAddresses NOTIFY txSignReqChanged) + QStringList outputAddresses() const; + Q_PROPERTY(QString outputAmount READ outputAmount NOTIFY txSignReqChanged) + QString outputAmount() const; + Q_PROPERTY(QString inputAmount READ inputAmount NOTIFY txSignReqChanged) + QString inputAmount() const; + Q_PROPERTY(QString returnAmount READ returnAmount NOTIFY txSignReqChanged) + QString returnAmount() const; + Q_PROPERTY(QString fee READ fee NOTIFY txSignReqChanged) + QString fee() const; + Q_PROPERTY(quint32 txSize READ txSize NOTIFY txSignReqChanged) + quint32 txSize() const; + Q_PROPERTY(QString feePerByte READ feePerByte NOTIFY txSignReqChanged) + QString feePerByte() const; + Q_PROPERTY(QString errorText READ errorText NOTIFY error) + QString errorText() const { return error_; } + Q_PROPERTY(bool isValid READ isValid NOTIFY txSignReqChanged) + bool isValid() const { return (error_.isEmpty() && txReq_.isValid()); } + +signals: + void txSignReqChanged(); + void error(); + +private: + bs::core::wallet::TXSignRequest txReq_{}; + QString error_; +}; + + +class QUTXO : public QObject +{ + Q_OBJECT +public: + QUTXO(const UTXO& utxo, QObject* parent = nullptr) + : QObject(parent), utxo_(utxo) {} + UTXO utxo() const { return utxo_; } + +private: + const UTXO utxo_; +}; + +#endif // Q_TX_SIGN_REQUEST_H diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 88f8e4a7a..414f5c081 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -31,6 +31,7 @@ #include "bip39/bip39.h" #include "BSMessageBox.h" #include "BSTerminalSplashScreen.h" +#include "QTXSignRequest.h" #include "Wallets/ProtobufHeadlessUtils.h" #include "SettingsAdapter.h" @@ -175,6 +176,9 @@ void QtQuickAdapter::run(int &argc, char **argv) }); logger_->debug("[QtGuiAdapter::run] creating QML app"); + qmlRegisterInterface("QTXSignRequest"); + qmlRegisterInterface("QUTXO"); + QQmlApplicationEngine engine; QQuickWindow::setTextRenderType(QQuickWindow::NativeTextRendering); rootCtxt_ = engine.rootContext(); @@ -209,6 +213,10 @@ void QtQuickAdapter::run(int &argc, char **argv) if (comboWalletsList) { QObject::connect((QObject*)comboWalletsList, SIGNAL(activated(int)), this, SLOT(walletSelected(int))); } + comboWalletsList = rootObj_->findChild(QLatin1Literal("sendWalletsComboBox")); + if (comboWalletsList) { + QObject::connect((QObject*)comboWalletsList, SIGNAL(activated(int)), this, SLOT(walletSelected(int))); + } updateStates(); @@ -552,6 +560,8 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) break; case WalletsMessage::kLedgerEntries: return processLedgerEntries(msg.ledger_entries()); + case WalletsMessage::kTxResponse: + return processTxResponse(env.responseId(), msg.tx_response()); default: return ProcessingResult::Ignored; } return ProcessingResult::Success; @@ -762,7 +772,7 @@ ProcessingResult QtQuickAdapter::processWalletBalances(const WalletsMessage_Wall return ProcessingResult::Success; } -ProcessingResult QtQuickAdapter::processTXDetails(uint64_t msgId +ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId , const WalletsMessage_TXDetailsResponse &response) { std::vector txDetails; @@ -973,6 +983,25 @@ void QtQuickAdapter::copyAddressToClipboard(const QString& addr) emit addressGenerated(); } +QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex + , const QString& recvAddr, double amount, double fee, const QString& comment) +{ + WalletsMessage msg; + auto msgReq = msg.mutable_tx_request(); + msgReq->set_hd_wallet_id(hdWalletIdByIndex(walletIndex)); + auto msgOut = msgReq->add_outputs(); + msgOut->set_address(recvAddr.toStdString()); + msgOut->set_amount(amount); + msgReq->set_fee_per_byte(fee); + if (!comment.isEmpty()) { + msgReq->set_comment(comment.toStdString()); + } + const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); + const auto txReq = new QTXSignRequest(this); + txReqs_[msgId] = txReq; + return txReq; +} + ProcessingResult QtQuickAdapter::processAddressHist(const ArmoryMessage_AddressHistory& response) { bs::Address addr; @@ -1045,7 +1074,16 @@ ProcessingResult QtQuickAdapter::processUTXOs(const WalletsMessage_UtxoListRespo ProcessingResult QtQuickAdapter::processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse& response) { - //TODO + const auto& signedTX = BinaryData::fromString(response.signed_tx()); + logger_->debug("[{}] signed TX size: {}", __func__, signedTX.getSize()); + + ArmoryMessage msg; + auto msgReq = msg.mutable_tx_push(); + //msgReq->set_push_id(id); + auto msgTx = msgReq->add_txs_to_push(); + msgTx->set_tx(response.signed_tx()); + //not adding TX hashes atm + pushRequest(user_, userBlockchain_, msg.SerializeAsString()); return ProcessingResult::Success; } @@ -1100,3 +1138,40 @@ void QtQuickAdapter::processWalletAddresses(const std::vector generatedAddress_ = lastAddr.address; emit addressGenerated(); } + +bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::SeqId msgId + , const WalletsMessage_TxResponse& response) +{ + const auto& itReq = txReqs_.find(msgId); + if (itReq == txReqs_.end()) { + logger_->error("[{}] unknown request #{}", __func__, msgId); + return bs::message::ProcessingResult::Error; + } + auto qReq = itReq->second; + txReqs_.erase(itReq); + if (!response.error_text().empty()) { + logger_->error("[{}] {}", __func__, response.error_text()); + qReq->setError(QString::fromStdString(response.error_text())); + return bs::message::ProcessingResult::Success; + } + const auto txReq = bs::signer::pbTxRequestToCore(response.tx_sign_request(), logger_); + qReq->setTxSignReq(txReq); + return bs::message::ProcessingResult::Success; +} + +void QtQuickAdapter::signAndBroadcast(QTXSignRequest* txReq, const QString& password) +{ + if (!txReq) { + logger_->error("[{}] no TX request passed", __func__); + return; + } + const auto& txSignReq = txReq->txReq(); + SignerMessage msg; + auto msgReq = msg.mutable_sign_tx_request(); + //msgReq->set_id(id); + *msgReq->mutable_tx_request() = bs::signer::coreTxRequestToPb(txSignReq); + msgReq->set_sign_mode((int)SignContainer::TXSignMode::Full); + //msgReq->set_keep_dup_recips(keepDupRecips); + msgReq->set_passphrase(password.toStdString()); + pushRequest(user_, userSigner_, msg.SerializeAsString()); +} \ No newline at end of file diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index e6a3b5d10..8aaaed3e0 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -41,6 +41,7 @@ namespace BlockSettle { class WalletsMessage_AuthKey; class WalletsMessage_ReservedUTXOs; class WalletsMessage_TXDetailsResponse; + class WalletsMessage_TxResponse; class WalletsMessage_UtxoListResponse; class WalletsMessage_WalletBalances; class WalletsMessage_WalletData; @@ -70,7 +71,7 @@ namespace BlockSettle { class BSTerminalSplashScreen; class QQmlContext; class QmlWalletsList; - +class QTXSignRequest; class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoopRuner { @@ -119,6 +120,10 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void generateNewAddress(int walletIndex, bool isNative); Q_INVOKABLE void copyAddressToClipboard(const QString& addr); + Q_INVOKABLE QTXSignRequest* createTXSignRequest(int walletIndex, const QString& recvAddr + , double amount, double fee, const QString& comment); + Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); + signals: void walletsListChanged(); void walletBalanceChanged(); @@ -150,7 +155,7 @@ private slots: bs::message::ProcessingResult processWalletData(const uint64_t msgId , const BlockSettle::Common::WalletsMessage_WalletData&); bs::message::ProcessingResult processWalletBalances(const BlockSettle::Common::WalletsMessage_WalletBalances &); - bs::message::ProcessingResult processTXDetails(uint64_t msgId, const BlockSettle::Common::WalletsMessage_TXDetailsResponse &); + bs::message::ProcessingResult processTXDetails(bs::message::SeqId, const BlockSettle::Common::WalletsMessage_TXDetailsResponse &); bs::message::ProcessingResult processLedgerEntries(const BlockSettle::Common::LedgerEntries &); bs::message::ProcessingResult processAddressHist(const BlockSettle::Common::ArmoryMessage_AddressHistory&); bs::message::ProcessingResult processFeeLevels(const BlockSettle::Common::ArmoryMessage_FeeLevelsResponse&); @@ -161,6 +166,8 @@ private slots: bs::message::ProcessingResult processZCInvalidated(const BlockSettle::Common::ArmoryMessage_ZCInvalidated&); bs::message::ProcessingResult processReservedUTXOs(const BlockSettle::Common::WalletsMessage_ReservedUTXOs&); void processWalletAddresses(const std::vector&); + bs::message::ProcessingResult processTxResponse(bs::message::SeqId + , const BlockSettle::Common::WalletsMessage_TxResponse&); private: std::shared_ptr logger_; @@ -195,6 +202,8 @@ private slots: TxListModel* pendingTxModel_{ nullptr }; TxListModel* txModel_{ nullptr }; bs::Address generatedAddress_; + + std::map txReqs_; }; #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/qml/SendPage.qml b/GUI/QtQuick/qml/SendPage.qml index ab48445da..c17c50b9e 100644 --- a/GUI/QtQuick/qml/SendPage.qml +++ b/GUI/QtQuick/qml/SendPage.qml @@ -22,22 +22,142 @@ import "BsStyles" Item { id: send + VerifyTX { + id: verifySignTX + visible: false + } + Column { - spacing: 50 + spacing: 23 anchors.fill: parent - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() + Row { + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + Text { + text: qsTr("Send Bitcoin") + font.pointSize: 14 + } + Button { + width: 300 + text: qsTr("Advanced") + font.pointSize: 14 } } - Text { - text: qsTr("Send page") - font.pointSize: 23 + + TextInput { + id: recvAddress + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: qsTr("Receiver address") + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + + Row { + TextInput { + id: amount + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: qsTr("Amount") + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + Text { + text: qsTr("BTC") + font.pointSize: 10 + color: 'darkgrey' + anchors.right: parent + anchors.horizontalCenter: parent + } + } + Button { + text: qsTr("MAX") + font.pointSize: 14 + } } - Image { - source: "qrc:/images/bs_logo.png" + Row { + spacing: 23 + ComboBox { + id: sendWalletsComboBox + objectName: "sendWalletsComboBox" + model: bsApp.walletsList + currentIndex: walletsComboBox.currentIndex + font.pointSize: 14 + enabled: (bsApp.walletsList.length > 1) + width: 350 + } + Label { + text: qsTr("%1 BTC").arg(bsApp.totalBalance) + font.pointSize: 14 + } + TextInput { + id: fees + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: qsTr("Fee Suggestions") + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + Text { + text: qsTr("s/b") + font.pointSize: 10 + color: 'darkgrey' + anchors.right: parent + anchors.horizontalCenter: parent + } + } + } + TextEdit { + id: txComment + width: 900 + height: 64 + Text { + text: qsTr("Comment") + color: 'darkgrey' + } + } + + Button { + width: 900 + text: qsTr("Continue") + font.pointSize: 14 + enabled: recvAddress.text.length && (parseFloat(amount.text) >= 0.00001) + && (parseFloat(fees.text) >= 1.0) + + onClicked: { + verifySignTX.txSignRequest = bsApp.createTXSignRequest( + sendWalletsComboBox.currentIndex, recvAddress.text, + parseFloat(amount.text), parseFloat(fees.text), + txComment.text) + stack.push(verifySignTX) + } } } } diff --git a/GUI/QtQuick/qml/VerifyTX.qml b/GUI/QtQuick/qml/VerifyTX.qml new file mode 100644 index 000000000..5b5ac5606 --- /dev/null +++ b/GUI/QtQuick/qml/VerifyTX.qml @@ -0,0 +1,126 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + property var txSignRequest + + Column { + spacing: 23 + anchors.fill: parent + + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + GridLayout { + columns: 2 + Label { + text: qsTr("Output address:") + font.pointSize: 12 + } + Label { + text: qsTr("%1").arg(txSignRequest.outputAddresses[0]) + font.pointSize: 12 + } + Label { + text: qsTr("Output amount:") + font.pointSize: 12 + } + Label { + text: qsTr("%1").arg(txSignRequest.outputAmount) + font.pointSize: 12 + } + Label { + text: qsTr("Input amount:") + font.pointSize: 12 + } + Label { + text: qsTr("%1").arg(txSignRequest.inputAmount) + font.pointSize: 12 + } + Label { + text: qsTr("Return amount:") + font.pointSize: 12 + } + Label { + text: qsTr("%1").arg(txSignRequest.returnAmount) + font.pointSize: 12 + } + Label { + text: qsTr("Transaction fee:") + font.pointSize: 12 + } + Label { + text: qsTr("%1").arg(txSignRequest.fee) + font.pointSize: 12 + } + Label { + text: qsTr("Transaction size:") + font.pointSize: 12 + } + Label { + text: qsTr("%1").arg(txSignRequest.txSize) + font.pointSize: 12 + } + Label { + text: qsTr("Fee per byte:") + font.pointSize: 12 + } + Label { + text: qsTr("%1").arg(txSignRequest.feePerByte) + font.pointSize: 12 + } + } + TextInput { + id: password + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + echoMode: TextInput.Password + passwordCharacter: '*' + Text { + text: qsTr("Password") + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + Button { + width: 900 + text: qsTr("Broadcast") + font.pointSize: 14 + enabled: txSignRequest.isValid && password.text.length + + onClicked: { + bsApp.signAndBroadcast(txSignRequest, password.text) + stack.pop() + stack.pop() + password.text = "" + } + } + } +} diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 210bed466..c2131dd88 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -121,10 +121,9 @@ ApplicationWindow { icon.source: "qrc:/images/send_icon.png" font.pointSize: 16 Layout.fillHeight: true - enabled: false + enabled: !bsApp.walletsList.empty onClicked: { stack.push(sendPage) - //sendPage.visible = true } } ToolButton { @@ -133,6 +132,7 @@ ApplicationWindow { icon.source: "qrc:/images/receive_icon.png" font.pointSize: 16 Layout.fillHeight: true + enabled: !bsApp.walletsList.empty onClicked: { stack.push(receivePage) } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 52b77d90a..a013cc75a 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -23,6 +23,7 @@ qml/ImportSeedPhrase.qml qml/VerifySeedPhrase.qml qml/WalletNamePass.qml + qml/VerifyTX.qml qml/InfoBanner.qml qml/InfoBannerComponent.qml qml/InfoBar.qml diff --git a/common b/common index 81c94e65a..c29c7c25d 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 81c94e65a97ba9f20cb105c1122ffded4fa82ee2 +Subproject commit c29c7c25d5c881b4dacab98c3239799bc448d574 From 5d8d7825e0df5d14cf0c2f92d0f56d04648df553 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 13 Dec 2022 20:41:40 +0300 Subject: [PATCH 004/436] Settings page --- GUI/QtQuick/QtQuickAdapter.cpp | 77 ++++++++++++++++-- GUI/QtQuick/QtQuickAdapter.h | 37 +++++++++ GUI/QtQuick/qml/SettingsPage.qml | 133 +++++++++++++++++++++++++++++-- 3 files changed, 236 insertions(+), 11 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 414f5c081..a82e6b3a4 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -329,7 +329,11 @@ ProcessingResult QtQuickAdapter::processSettingsGetResponse(const SettingsMessag } } if (!settings.empty()) { - //TODO: propagate settings to GUI + for (const auto& setting : settings) { + logger_->debug("[{}] {} = {}", __func__, setting.first, setting.second.toString().toStdString()); + settingsCache_[static_cast(setting.first)] = setting.second; + } + emit settingChanged(); } return ProcessingResult::Success; } @@ -660,24 +664,34 @@ void QtQuickAdapter::requestInitialSettings() setReq = msgReq->add_requests(); setReq->set_source(SettingSource_Local); - setReq->set_index(SetIdx_ShowInfoWidget); + setReq->set_index(SetIdx_AdvancedTXisDefault); setReq->set_type(SettingType_Bool); setReq = msgReq->add_requests(); setReq->set_source(SettingSource_Local); - setReq->set_index(SetIdx_AdvancedTXisDefault); - setReq->set_type(SettingType_Bool); + setReq->set_index(SetIdx_LogDefault); + setReq->set_type(SettingType_Strings); setReq = msgReq->add_requests(); setReq->set_source(SettingSource_Local); - setReq->set_index(SetIdx_CloseToTray); - setReq->set_type(SettingType_Bool); + setReq->set_index(SetIdx_LogMessages); + setReq->set_type(SettingType_Strings); setReq = msgReq->add_requests(); setReq->set_source(SettingSource_Local); setReq->set_index(SetIdx_Environment); setReq->set_type(SettingType_Int); + setReq = msgReq->add_requests(); + setReq->set_source(SettingSource_Local); + setReq->set_index(SetIdx_ArmoryDbIP); + setReq->set_type(SettingType_String); + + setReq = msgReq->add_requests(); + setReq->set_source(SettingSource_Local); + setReq->set_index(SetIdx_ArmoryDbPort); + setReq->set_type(SettingType_String); + pushRequest(user_, userSettings_, msg.SerializeAsString()); } @@ -908,6 +922,11 @@ ProcessingResult QtQuickAdapter::processLedgerEntries(const LedgerEntries &respo return ProcessingResult::Success; } +QStringList QtQuickAdapter::settingEnvironments() const +{ + return { tr("Main"), tr("Test") }; +} + QStringList QtQuickAdapter::newSeedPhrase() { auto seed = CryptoPRNG::generateRandom(16); @@ -1159,6 +1178,52 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq return bs::message::ProcessingResult::Success; } +QVariant QtQuickAdapter::getSetting(ApplicationSettings::Setting s) const +{ + try { + return settingsCache_.at(s); + } + catch (const std::exception&) {} + return {}; +} + +QString QtQuickAdapter::getSettingStringAt(ApplicationSettings::Setting s, int idx) +{ + const auto& list = getSetting(s).toStringList(); + if ((idx >= 0) && (idx < list.size())) { + return list.at(idx); + } + return {}; +} + +void QtQuickAdapter::setSetting(ApplicationSettings::Setting s, const QVariant& val) +{ + if (settingsCache_.empty()) { + return; + } + try { + if (settingsCache_.at(s) == val) { + return; + } + } + catch (const std::exception&) {} + logger_->debug("[{}] {} = {}", __func__, (int)s, val.toString().toStdString()); + settingsCache_[s] = val; + SettingsMessage msg; + auto msgReq = msg.mutable_put_request(); + auto setResp = msgReq->add_responses(); + auto setReq = setResp->mutable_request(); + setReq->set_source(SettingSource_Local); + setReq->set_index(static_cast(s)); + setFromQVariant(val, setReq, setResp); + + pushRequest(user_, userSettings_, msg.SerializeAsString()); +} + +void QtQuickAdapter::resetArmoryConnection() +{ +} + void QtQuickAdapter::signAndBroadcast(QTXSignRequest* txReq, const QString& password) { if (!txReq) { diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 8aaaed3e0..f2dab7805 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -16,6 +16,7 @@ #include "Address.h" #include "AddressListModel.h" #include "ApiAdapter.h" +#include "ApplicationSettings.h" #include "Wallets/SignContainer.h" #include "ThreadSafeClasses.h" #include "TxListModel.h" @@ -111,6 +112,35 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_PROPERTY(QString generatedAddress READ generatedAddress NOTIFY addressGenerated) QString generatedAddress() const { return QString::fromStdString(generatedAddress_.display()); } + // Settings properties + Q_PROPERTY(QString settingLogFile READ settingLogFile WRITE setLogFile NOTIFY settingChanged) + QString settingLogFile() { return getSettingStringAt(ApplicationSettings::Setting::logDefault, 0); } + void setLogFile(const QString& str) { setSetting(ApplicationSettings::Setting::logDefault, str); } + + Q_PROPERTY(QString settingMsgLogFile READ settingMsgLogFile WRITE setMsgLogFile NOTIFY settingChanged) + QString settingMsgLogFile() { return getSettingStringAt(ApplicationSettings::Setting::logMessages, 0); } + void setMsgLogFile(const QString& str) { setSetting(ApplicationSettings::Setting::logMessages, str); } + + Q_PROPERTY(bool settingAdvancedTX READ settingAdvancedTX WRITE setAdvancedTX NOTIFY settingChanged) + bool settingAdvancedTX() { return getSetting(ApplicationSettings::Setting::AdvancedTxDialogByDefault).toBool(); } + void setAdvancedTX(bool b) { setSetting(ApplicationSettings::Setting::AdvancedTxDialogByDefault, b); } + + Q_PROPERTY(int settingEnvironment READ settingEnvironment WRITE setEnvironment NOTIFY settingChanged) + int settingEnvironment() { return getSetting(ApplicationSettings::Setting::envConfiguration).toInt(); } + void setEnvironment(int i) { setSetting(ApplicationSettings::Setting::envConfiguration, i); } + + Q_PROPERTY(QStringList settingEnvironments READ settingEnvironments) + QStringList settingEnvironments() const; + + Q_PROPERTY(QString settingArmoryHost READ settingArmoryHost WRITE setArmoryHost NOTIFY settingChanged) + QString settingArmoryHost() const { return getSetting(ApplicationSettings::Setting::armoryDbIp).toString(); } + void setArmoryHost(const QString& str) { setSetting(ApplicationSettings::Setting::armoryDbIp, str); } + + Q_PROPERTY(QString settingArmoryPort READ settingArmoryPort WRITE setArmoryPort NOTIFY settingChanged) + QString settingArmoryPort() const { return getSetting(ApplicationSettings::Setting::armoryDbPort).toString(); } + void setArmoryPort(const QString& str) { setSetting(ApplicationSettings::Setting::armoryDbPort, str); } + + // QML-invokable methods Q_INVOKABLE QStringList newSeedPhrase(); Q_INVOKABLE void copySeedToClipboard(const QStringList&); Q_INVOKABLE void createWallet(const QString& name, const QStringList& seed @@ -129,6 +159,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void walletBalanceChanged(); void nbTransactionsChanged(); void addressGenerated(); + void settingChanged(); private slots: void walletSelected(int); @@ -169,6 +200,11 @@ private slots: bs::message::ProcessingResult processTxResponse(bs::message::SeqId , const BlockSettle::Common::WalletsMessage_TxResponse&); + QVariant getSetting(ApplicationSettings::Setting) const; + QString getSettingStringAt(ApplicationSettings::Setting, int idx); + void setSetting(ApplicationSettings::Setting, const QVariant&); + void resetArmoryConnection(); + private: std::shared_ptr logger_; BSTerminalSplashScreen* splashScreen_{ nullptr }; @@ -204,6 +240,7 @@ private slots: bs::Address generatedAddress_; std::map txReqs_; + std::map settingsCache_; }; #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/qml/SettingsPage.qml b/GUI/QtQuick/qml/SettingsPage.qml index 449d492b8..e6bca4acc 100644 --- a/GUI/QtQuick/qml/SettingsPage.qml +++ b/GUI/QtQuick/qml/SettingsPage.qml @@ -32,12 +32,135 @@ Item { stack.pop() } } - Text { - text: qsTr("Settings page") - font.pointSize: 23 + CheckBox { + id: cbGeneral + text: qsTr("General >") + font.pointSize: 14 + onCheckStateChanged: { + if (checked) { + cbNetwork.checked = false + cbAbout.checked = false + } + } + } + GridLayout { + columns: 2 + visible: cbGeneral.checked + + Label { + text: qsTr("Log file:") + font.pointSize: 12 + } + TextInput { + id: mainLog + width: 500 + height: 32 + color: 'lightgrey' + text: bsApp.settingLogFile + font.pointSize: 12 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + } + Label { + text: qsTr("Messages log file:") + font.pointSize: 12 + } + TextInput { + id: msgLog + width: 500 + height: 32 + color: 'lightgrey' + text: bsApp.settingMsgLogFile + font.pointSize: 12 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + } + Label { + text: " " + font.pointSize: 12 + } + CheckBox { + id: cbAdvTX + width: 500 + height: 32 + text: qsTr("Advanced TX dialog by default") + font.pointSize: 12 + checked: bsApp.settingAdvancedTX + } + } + + CheckBox { + id: cbNetwork + text: qsTr("Network >") + font.pointSize: 14 + onCheckStateChanged: { + if (checked) { + cbGeneral.checked = false + cbAbout.checked = false + } + } + } + GridLayout { + columns: 2 + visible: cbNetwork.checked + Label { + text: qsTr("Environment:") + font.pointSize: 12 + } + ComboBox { + id: cbEnvironments + model: bsApp.settingEnvironments + font.pointSize: 12 + currentIndex: bsApp.settingEnvironment + onCurrentIndexChanged: { + bsApp.settingEnvironment = currentIndex + } + } + Label { + text: qsTr("Armory host:") + font.pointSize: 12 + } + TextInput { + id: armoryHost + width: 500 + height: 32 + color: 'lightgrey' + text: bsApp.settingArmoryHost + font.pointSize: 12 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + onTextChanged: { + bsApp.settingArmoryHost = text + } + } + Label { + text: qsTr("Armory port:") + font.pointSize: 12 + } + TextInput { + id: armoryPort + width: 500 + height: 32 + color: 'lightgrey' + text: bsApp.settingArmoryPort + font.pointSize: 12 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + onTextChanged: { + bsApp.settingArmoryPort = text + } + } } - Image { - source: "qrc:/images/bs_logo.png" + CheckBox { + id: cbAbout + text: qsTr("About >") + font.pointSize: 14 + onCheckStateChanged: { + if (checked) { + cbGeneral.checked = false + cbNetwork.checked = false + } + } } } } From 962601a0f9d4ffa188f13ea4b0882a8acd4f6f8c Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 14 Dec 2022 21:39:56 +0300 Subject: [PATCH 005/436] TX list improvements --- GUI/QtQuick/QtQuickAdapter.cpp | 106 +++++++----- GUI/QtQuick/QtQuickAdapter.h | 4 + GUI/QtQuick/TxListModel.cpp | 249 +++++++++++++++++++++++++-- GUI/QtQuick/TxListModel.h | 29 +++- GUI/QtQuick/qml/OverviewPage.qml | 18 +- GUI/QtQuick/qml/SendPage.qml | 8 +- GUI/QtQuick/qml/TransactionsPage.qml | 6 +- GUI/QtQuick/qml/main.qml | 2 +- common | 2 +- 9 files changed, 354 insertions(+), 70 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index a82e6b3a4..567b95287 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -330,7 +330,6 @@ ProcessingResult QtQuickAdapter::processSettingsGetResponse(const SettingsMessag } if (!settings.empty()) { for (const auto& setting : settings) { - logger_->debug("[{}] {} = {}", __func__, setting.first, setting.second.toString().toStdString()); settingsCache_[static_cast(setting.first)] = setting.second; } emit settingChanged(); @@ -415,11 +414,15 @@ ProcessingResult QtQuickAdapter::processBlockchain(const Envelope &env) case ArmoryMessage::kStateChanged: armoryState_ = msg.state_changed().state(); blockNum_ = msg.state_changed().top_block(); - //TODO + emit armoryStateChanged(); + logger_->debug("[{}] current block: {}", __func__, blockNum_); + pendingTxModel_->setCurrentBlock(blockNum_); + txModel_->setCurrentBlock(blockNum_); break; case ArmoryMessage::kNewBlock: blockNum_ = msg.new_block().top_block(); - //TODO + pendingTxModel_->setCurrentBlock(blockNum_); + txModel_->setCurrentBlock(blockNum_); break; case ArmoryMessage::kWalletRegistered: if (msg.wallet_registered().success() && msg.wallet_registered().wallet_id().empty()) { @@ -547,6 +550,7 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) if (env.responseId()) { return processWalletBalances(msg.wallet_balances()); } + break; case WalletsMessage::kTxDetailsResponse: return processTXDetails(env.responseId(), msg.tx_details_response()); case WalletsMessage::kWalletsListResponse: @@ -735,13 +739,16 @@ void QtQuickAdapter::walletSelected(int index) void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) { + const bool isInitialLoad = hdWallets_.empty(); hdWallets_[*wi.ids.cbegin()] = wi; - walletsList_.push_back(QString::fromStdString(wi.name)); logger_->debug("[QtQuickAdapter::processWalletLoaded] {}", wi.name); - emit walletsListChanged(); - if (hdWallets_.size() == 1) { - walletSelected(0); - } + QMetaObject::invokeMethod(this, [this, isInitialLoad, walletName = QString::fromStdString(wi.name)] { + walletsList_.push_back(walletName); + if (isInitialLoad) { + walletSelected(0); + } + emit walletsListChanged(); + }); } ProcessingResult QtQuickAdapter::processWalletData(uint64_t msgId @@ -789,7 +796,6 @@ ProcessingResult QtQuickAdapter::processWalletBalances(const WalletsMessage_Wall ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId , const WalletsMessage_TXDetailsResponse &response) { - std::vector txDetails; for (const auto &resp : response.responses()) { bs::sync::TXWalletDetails txDet{ BinaryData::fromString(resp.tx_hash()), resp.wallet_id() , resp.wallet_name(), static_cast(resp.wallet_type()) @@ -798,6 +804,13 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId if (!response.error_msg().empty()) { txDet.comment = response.error_msg(); } + if (!resp.comment().empty()) { + pendingTxModel_->setTxComment(resp.tx_hash(), txDet.comment); + txModel_->setTxComment(resp.tx_hash(), txDet.comment); + } + //logger_->debug("[{}] {} = {}", __func__, resp.wallet_id(), resp.wallet_name()); + pendingTxModel_->setWalletName(resp.wallet_id(), resp.wallet_name()); + txModel_->setWalletName(resp.wallet_id(), resp.wallet_name()); const auto &ownTxHash = BinaryData::fromString(resp.tx_hash()); try { @@ -849,28 +862,28 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId , resp.change_address().out_index() }; } catch (const std::exception &) {} - txDetails.emplace_back(std::move(txDet)); - } - if (!response.responses_size() && !response.error_msg().empty()) { - bs::sync::TXWalletDetails txDet; - txDet.comment = response.error_msg(); - txDetails.emplace_back(std::move(txDet)); + pendingTxModel_->setDetails(txDet); + txModel_->setDetails(txDet); } + const auto& itZC = newZCs_.find(msgId); if (itZC != newZCs_.end()) { newZCs_.erase(itZC); //TODO } - else { - //TODO - } return ProcessingResult::Success; } ProcessingResult QtQuickAdapter::processLedgerEntries(const LedgerEntries &response) { + WalletsMessage msg; + auto msgReq = msg.mutable_tx_details_request(); std::vector entries; for (const auto &entry : response.entries()) { + auto txReq = msgReq->add_requests(); + txReq->set_tx_hash(entry.tx_hash()); + txReq->set_value(entry.value()); + bs::TXEntry txEntry; txEntry.txHash = BinaryData::fromString(entry.tx_hash()); txEntry.value = entry.value(); @@ -880,6 +893,9 @@ ProcessingResult QtQuickAdapter::processLedgerEntries(const LedgerEntries &respo txEntry.isChainedZC = entry.chained_zc(); txEntry.nbConf = entry.nb_conf(); for (const auto &walletId : entry.wallet_ids()) { + if (txReq->wallet_id().empty()) { + txReq->set_wallet_id(walletId); + } txEntry.walletIds.insert(walletId); } for (const auto &addrStr : entry.addresses()) { @@ -892,33 +908,14 @@ ProcessingResult QtQuickAdapter::processLedgerEntries(const LedgerEntries &respo entries.push_back(std::move(txEntry)); } for (const auto& entry : entries) { - std::string walletName, comment; - bs::Address address; - const auto& itWallet = walletNames_.find(*entry.walletIds.cbegin()); - if (itWallet != walletNames_.end()) { - walletName = itWallet->second; - } - if (!entry.addresses.empty()) { - address = *entry.addresses.cbegin(); + if (entry.nbConf <= 6) { + pendingTxModel_->addRow(entry); } - try { - comment = addrComments_.at(address); - } - catch (const std::exception&) {} - - if (entry.nbConf < 6) { - pendingTxModel_->addRow({ QDateTime::fromSecsSinceEpoch(entry.txTime).toString() - , QString::fromStdString(walletName), {}, QString::fromStdString(address.display()) - , QString::number(entry.value / BTCNumericTypes::BalanceDivider, 'f', 8) - , QString::number(entry.nbConf), {}, QString::fromStdString(comment)}); - } - txModel_->addRow({ QDateTime::fromSecsSinceEpoch(entry.txTime).toString() - , QString::fromStdString(walletName), {}, QString::fromStdString(address.display()) - , QString::number(entry.value / BTCNumericTypes::BalanceDivider, 'f', 8) - , QString::number(entry.nbConf), {}, QString::fromStdString(comment) }); } + txModel_->addRows(entries); nbTransactions_ = entries.size(); emit nbTransactionsChanged(); + pushRequest(user_, userWallets_, msg.SerializeAsString()); return ProcessingResult::Success; } @@ -998,8 +995,10 @@ void QtQuickAdapter::generateNewAddress(int walletIndex, bool isNative) void QtQuickAdapter::copyAddressToClipboard(const QString& addr) { QGuiApplication::clipboard()->setText(addr); - generatedAddress_.clear(); - emit addressGenerated(); + if (!generatedAddress_.empty()) { + generatedAddress_.clear(); + emit addressGenerated(); + } } QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex @@ -1117,6 +1116,27 @@ ProcessingResult QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMess txReq->set_wallet_id(zcEntry.wallet_ids(0)); } txReq->set_value(zcEntry.value()); + + bs::TXEntry txEntry; + txEntry.txHash = BinaryData::fromString(zcEntry.tx_hash()); + txEntry.value = zcEntry.value(); + txEntry.blockNum = blockNum_; + txEntry.txTime = zcEntry.tx_time(); + txEntry.isRBF = zcEntry.rbf(); + txEntry.isChainedZC = zcEntry.chained_zc(); + txEntry.nbConf = zcEntry.nb_conf(); + for (const auto& walletId : zcEntry.wallet_ids()) { + txEntry.walletIds.insert(walletId); + } + for (const auto& addrStr : zcEntry.addresses()) { + try { + const auto& addr = bs::Address::fromAddressString(addrStr); + txEntry.addresses.push_back(addr); + } + catch (const std::exception&) {} + } + pendingTxModel_->prependRow(txEntry); + txModel_->prependRow(txEntry); } const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); newZCs_.insert(msgId); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index f2dab7805..06ae23506 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -140,6 +140,9 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop QString settingArmoryPort() const { return getSetting(ApplicationSettings::Setting::armoryDbPort).toString(); } void setArmoryPort(const QString& str) { setSetting(ApplicationSettings::Setting::armoryDbPort, str); } + Q_PROPERTY(int armoryState READ armoryState NOTIFY armoryStateChanged) + int armoryState() const { return armoryState_; } + // QML-invokable methods Q_INVOKABLE QStringList newSeedPhrase(); Q_INVOKABLE void copySeedToClipboard(const QStringList&); @@ -160,6 +163,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void nbTransactionsChanged(); void addressGenerated(); void settingChanged(); + void armoryStateChanged(); private slots: void walletSelected(int); diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 43d9c0de6..5208be95e 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -9,42 +9,161 @@ */ #include "TxListModel.h" +#include #include +#include "StringUtils.h" namespace { static const QHash kRoles{ - {TxListModel::TableDataRole, "tabledata"}, - {TxListModel::HeadingRole, "heading"} + {TxListModel::TableDataRole, "tableData"}, + {TxListModel::HeadingRole, "heading"}, + {TxListModel::ColorRole, "dataColor"}, + {TxListModel::WidthRole, "colWidth"}, }; } -TxListModel::TxListModel(const std::shared_ptr&, QObject* parent) - : QAbstractTableModel(parent) -{ - table.append({ tr("Date"), tr("Wallet"), tr("Type"), tr("Address"), tr("Amount") - , tr("Confirmations"), tr("Flag"), tr("Comment") }); -} +TxListModel::TxListModel(const std::shared_ptr& logger, QObject* parent) + : QAbstractTableModel(parent), logger_(logger) + , header_{ tr("Date"), tr("Wallet"), tr("Type"), tr("Address"), tr("Amount") + , tr("#Conf"), tr("Flag"), tr("Comment") } +{} int TxListModel::rowCount(const QModelIndex &) const { - return table.size(); + return data_.size() + 1; } int TxListModel::columnCount(const QModelIndex &) const { - return 8; + return header_.size(); +} + +QString TxListModel::getData(int row, int col) const +{ + if (row > data_.size()) { + return {}; + } + if (row == 0) { + return header_.at(col); + } + const auto& entry = data_.at(row - 1); + switch (col) { + case 0: return QDateTime::fromSecsSinceEpoch(entry.txTime).toString(); + case 1: return walletNameById(*entry.walletIds.cbegin()); + case 2: return txType(row - 1); + case 3: { + bs::Address address; + if (!entry.addresses.empty()) { + address = *entry.addresses.cbegin(); + } + return QString::fromStdString(address.display()); + } + case 4: return QString::number(entry.value / BTCNumericTypes::BalanceDivider, 'f', 8); + case 5: return QString::number(entry.nbConf); + case 6: return txFlag(row - 1); + case 7: { + const auto& itComm = txComments_.find(entry.txHash.toBinStr()); + if (itComm != txComments_.end()) { + return QString::fromStdString(itComm->second); + } + break; + } + default: break; + } + return {}; +} + +QColor TxListModel::dataColor(int row, int col) const +{ + if (row == 0) { + return QColorConstants::DarkGray; + } + if (col == 5) { + const auto& entry = data_.at(row - 1); + switch (entry.nbConf) { + case 0: return QColorConstants::Red; + case 1: + case 2: + case 3: + case 4: + case 5: return QColorConstants::Yellow; + default: return QColorConstants::Green; + } + } + else if ((col == 2) || (col == 6)) { + return QColorConstants::DarkGray; + } + return QColorConstants::LightGray; +} + +float TxListModel::colWidth(int col) const +{ // width ratio, sum should give columnCount() as a result + switch (col) { + case 0: return 1.5; + case 1: return 0.6; + case 2: return 0.8; + case 3: return 2.0; + case 4: return 0.8; + case 5: return 0.5; + case 6: return 0.5; + case 7: return 1.0; + } + return 1.0; +} + +QString TxListModel::walletNameById(const std::string& walletId) const +{ + auto itName = walletNames_.find(walletId); + if (itName != walletNames_.end()) { + return QString::fromStdString(itName->second); + } + itName = walletNames_.find(bs::toLower(walletId)); + if (itName != walletNames_.end()) { + return QString::fromStdString(itName->second); + } + return QString::fromStdString(walletId); +} + +QString TxListModel::txType(int row) const +{ + const auto& itTxDet = txDetails_.find(row); + if (itTxDet != txDetails_.end()) { + switch (itTxDet->second.direction) { + case bs::sync::Transaction::Direction::Received: return tr("Received"); + case bs::sync::Transaction::Direction::Sent: return tr("Sent"); + case bs::sync::Transaction::Direction::Internal: return tr("Internal"); + case bs::sync::Transaction::Direction::Unknown: return tr("Unknown"); + default: return QString::number((int)itTxDet->second.direction); + } + } + return {}; +} + +QString TxListModel::txFlag(int row) const +{ + const auto& itTxDet = txDetails_.find(row); + if (itTxDet != txDetails_.end()) { + if (itTxDet->second.tx.isRBF()) { + return tr("RBF"); + } + } + return {}; } QVariant TxListModel::data(const QModelIndex& index, int role) const { - if (index.column() > 7) { + if (index.column() >= header_.size()) { return {}; } switch (role) { case TableDataRole: - return table.at(index.row()).at(index.column()); + return getData(index.row(), index.column()); case HeadingRole: return (index.row() == 0); + case ColorRole: + return dataColor(index.row(), index.column()); + case WidthRole: + return colWidth(index.column()); default: break; } return QVariant(); @@ -55,16 +174,116 @@ QHash TxListModel::roleNames() const return kRoles; } -void TxListModel::addRow(const QVector& row) +void TxListModel::addRows(const std::vector& entries) +{ + beginInsertRows(QModelIndex(), rowCount(), rowCount() + entries.size() - 1); + data_.insert(data_.end(), entries.cbegin(), entries.cend()); + endInsertRows(); +} + +void TxListModel::prependRow(const bs::TXEntry& entry) +{ + beginInsertRows(QModelIndex(), 1, 1); + data_.insert(data_.cbegin(), entry); + endInsertRows(); +} + +void TxListModel::addRow(const bs::TXEntry& entry) { beginInsertRows(QModelIndex(), rowCount(), rowCount()); - table.append(row); + data_.push_back(entry); endInsertRows(); } void TxListModel::clear() { beginResetModel(); - table.remove(1, table.size() - 1); + data_.clear(); endResetModel(); } + +void TxListModel::setTxComment(const std::string& txHash, const std::string& comment) +{ + txComments_[txHash] = comment; + int rowFirst = 0, rowLast = 0; + for (int i = 0; i < data_.size(); ++i) { + const auto& txEntryHash = data_.at(i).txHash.toBinStr(); + if (txHash == txEntryHash) { + if (!rowFirst) { + rowFirst = i + 1; + } + rowLast = i + 1; + } + } + if (rowFirst && rowLast) { + emit dataChanged(createIndex(rowFirst, 7), createIndex(rowLast, 7)); + } +} + +void TxListModel::setWalletName(const std::string& walletId, const std::string& walletName) +{ + const auto& [it, inserted] = walletNames_.insert({ walletId, walletName }); + if (inserted) { + int rowFirst = 0, rowLast = 0; + for (int i = 0; i < data_.size(); ++i) { + const auto& entry = data_.at(i); + if (entry.walletIds.empty()) { + continue; + } + const auto& entryWalletId = bs::toLower(*entry.walletIds.cbegin()); + if (bs::toLower(walletId) == entryWalletId) { + if (!rowFirst) { + rowFirst = i + 1; + } + rowLast = i + 1; + } + } + if (rowFirst && rowLast) { + emit dataChanged(createIndex(rowFirst, 1), createIndex(rowLast, 1)); + } + //logger_->debug("[{}] found rows {}-{} for {} = {}", __func__, rowFirst, rowLast, walletId, walletName); + } +} + +void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet) +{ + int row = 0; + for (int i = 0; i < data_.size(); ++i) { + const auto& entry = data_.at(i); + if (entry.txHash == txDet.txHash) { + for (const auto& walletId : entry.walletIds) { + if (bs::toLower(walletId) == bs::toLower(txDet.walletId)) { + txDetails_[i] = txDet; + row = i + 1; + break; + } + } + if (row) { + break; + } + } + } + if (row) { + emit dataChanged(createIndex(row, 2), createIndex(row, 6)); + } + else { + //logger_->debug("[{}] {} {} not found", __func__, txDet.txHash.toHexStr(), txDet.walletId); + } +} + +void TxListModel::setCurrentBlock(uint32_t nbBlock) +{ + if (!nbBlock) { + return; + } + if (!curBlock_) { + curBlock_ = nbBlock; + return; + } + const int diff = nbBlock - curBlock_; + curBlock_ = nbBlock; + for (auto& entry : data_) { + entry.nbConf += diff; + } + emit dataChanged(createIndex(1, 5), createIndex(data_.size(), 5)); +} diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 6f41a7821..be7569db9 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -13,8 +13,11 @@ #include #include +#include #include #include +#include "ArmoryConnection.h" +#include "Wallets/SignerDefs.h" namespace spdlog { class logger; @@ -24,7 +27,7 @@ class TxListModel : public QAbstractTableModel { Q_OBJECT public: - enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole }; + enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole, WidthRole }; TxListModel(const std::shared_ptr&, QObject* parent = nullptr); int rowCount(const QModelIndex & = QModelIndex()) const override; @@ -32,11 +35,31 @@ class TxListModel : public QAbstractTableModel QVariant data(const QModelIndex& index, int role) const override; QHash roleNames() const override; - void addRow(const QVector&); + void prependRow(const bs::TXEntry&); + void addRow(const bs::TXEntry&); + void addRows(const std::vector&); void clear(); + void setTxComment(const std::string& txHash, const std::string& comment); + void setWalletName(const std::string& walletId, const std::string& walletName); + void setDetails(const bs::sync::TXWalletDetails&); + void setCurrentBlock(uint32_t); private: - QVector> table; + QString getData(int row, int col) const; + QColor dataColor(int row, int col) const; + float colWidth(int col) const; + QString walletNameById(const std::string&) const; + QString txType(int row) const; + QString txFlag(int row) const; + +private: + std::shared_ptr logger_; + const QStringList header_; + std::vector data_; + std::unordered_map txComments_; + std::unordered_map walletNames_; + std::map txDetails_; + uint32_t curBlock_; }; #endif // TX_LIST_MODEL_H diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 598cae79e..8e1768854 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -149,6 +149,18 @@ Item { anchors.centerIn: parent } } + MouseArea { + anchors.fill: parent + onClicked: { + //if ((addressListModel.column === 0) && (addressListModel.row > 0)) { + bsApp.copyAddressToClipboard("row: " + model.row) + //ibInfo.displayMessage(qsTr("address copied")) + //} + } + onDoubleClicked: { + //TODO: show address details + } + } } Label { @@ -165,15 +177,15 @@ Item { ScrollIndicator.vertical: ScrollIndicator { } model: pendingTxListModel delegate: Rectangle { - implicitWidth: 125 + implicitWidth: 125 * colWidth implicitHeight: 20 border.color: "black" border.width: 1 color: heading ? 'black' : 'darkslategrey' Text { - text: tabledata + text: tableData font.pointSize: heading ? 8 : 10 - color: heading ? 'darkgrey' : 'lightgrey' + color: dataColor anchors.centerIn: parent } } diff --git a/GUI/QtQuick/qml/SendPage.qml b/GUI/QtQuick/qml/SendPage.qml index c17c50b9e..4ded45d18 100644 --- a/GUI/QtQuick/qml/SendPage.qml +++ b/GUI/QtQuick/qml/SendPage.qml @@ -137,10 +137,16 @@ Item { TextEdit { id: txComment width: 900 - height: 64 + height: 84 + color: 'lightgrey' + verticalAlignment: TextEdit.AlignVCenter + font.pointSize: 12 Text { text: qsTr("Comment") color: 'darkgrey' + anchors.left: parent + anchors.top: parent + font.pointSize: 10 } } diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index a5c0b8437..252c89a3f 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -88,16 +88,16 @@ Item { ScrollIndicator.vertical: ScrollIndicator { } model: txListModel delegate: Rectangle { - implicitWidth: 125 + implicitWidth: 125 * colWidth implicitHeight: 20 border.color: "black" border.width: 1 clip: true color: heading ? 'black' : 'darkslategrey' Text { - text: tabledata + text: tableData font.pointSize: heading ? 8 : 10 - color: heading ? 'darkgrey' : 'lightgrey' + color: dataColor anchors.centerIn: parent } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index c2131dd88..6cb6f6cc8 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -107,7 +107,7 @@ ApplicationWindow { Image { id: imgArmoryStatus - source: "qrc:/images/bitcoin-disabled.png" + source: (bsApp.armoryState == 7) ? "qrc:/images/bitcoin-test-net.png" : "qrc:/images/bitcoin-disabled.png" verticalAlignment: Qt.AlignVCenter } diff --git a/common b/common index c29c7c25d..a979fa35f 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit c29c7c25d5c881b4dacab98c3239799bc448d574 +Subproject commit a979fa35f130bf1e6080568dc2a1c58baa60a7c6 From 77e8a3abc508353d93345187296018792807630b Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 15 Dec 2022 16:23:01 +0200 Subject: [PATCH 006/436] main screen: header and footer --- GUI/QtQuick/images/conn_ind.png | Bin 0 -> 196 bytes GUI/QtQuick/images/explorer_icon.png | Bin 1810 -> 233 bytes .../images/explorer_icon_unchoosed.png | Bin 0 -> 592 bytes GUI/QtQuick/images/logo.png | Bin 0 -> 1323 bytes GUI/QtQuick/images/overview_icon.png | Bin 654 -> 244 bytes .../images/overview_icon_not_choosed.png | Bin 0 -> 222 bytes GUI/QtQuick/images/plugins_icon.png | Bin 0 -> 287 bytes GUI/QtQuick/images/plugins_icon_unchoosed.png | Bin 0 -> 361 bytes GUI/QtQuick/images/receive_icon.png | Bin 235 -> 236 bytes GUI/QtQuick/images/send_icon.png | Bin 549 -> 240 bytes GUI/QtQuick/images/settings_icon.png | Bin 1626 -> 628 bytes GUI/QtQuick/images/transactions_icon.png | Bin 390 -> 389 bytes .../images/transactions_icon_unchoosed.png | Bin 0 -> 822 bytes GUI/QtQuick/qml/BsStyles/BSStyle.qml | 3 + .../qml/StyledControls/CustomTabButton.qml | 91 +++++++----- .../StyledControls/CustomTitleToolButton.qml | 60 ++++++++ GUI/QtQuick/qml/StyledControls/qmldir | 1 + GUI/QtQuick/qml/main.qml | 130 ++++++++++++------ GUI/QtQuick/qtquick.qrc | 8 ++ 19 files changed, 212 insertions(+), 81 deletions(-) create mode 100755 GUI/QtQuick/images/conn_ind.png mode change 100644 => 100755 GUI/QtQuick/images/explorer_icon.png create mode 100755 GUI/QtQuick/images/explorer_icon_unchoosed.png create mode 100755 GUI/QtQuick/images/logo.png mode change 100644 => 100755 GUI/QtQuick/images/overview_icon.png create mode 100755 GUI/QtQuick/images/overview_icon_not_choosed.png create mode 100755 GUI/QtQuick/images/plugins_icon.png create mode 100755 GUI/QtQuick/images/plugins_icon_unchoosed.png mode change 100644 => 100755 GUI/QtQuick/images/receive_icon.png mode change 100644 => 100755 GUI/QtQuick/images/send_icon.png mode change 100644 => 100755 GUI/QtQuick/images/settings_icon.png mode change 100644 => 100755 GUI/QtQuick/images/transactions_icon.png create mode 100755 GUI/QtQuick/images/transactions_icon_unchoosed.png create mode 100644 GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml diff --git a/GUI/QtQuick/images/conn_ind.png b/GUI/QtQuick/images/conn_ind.png new file mode 100755 index 0000000000000000000000000000000000000000..16a6c32bf81863945f03d9ec6c03389026120478 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJZ3p^r=85p>QL70(Y)*K0-AY*Zm zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#NKY5XkP61qQyT>x97I?y{N1l0mDCZ_!4<%0 zqVM%xNb!1@J z*w6hZkrl{i3-AeXef0c4khx1rt^!Cgl?3?(|7Uo*-M|aT<1FxqEM{Qf76xHPhFNn! z#>aWOIEH8h&%F@HcR+!IIbi4irR_`mlH5#Qw+GETIf*yBsO8`Wy$5~aYYLv6E}t{~ z&1RN_6ropjU+WvREDx)R-+z%Hyp2Kdud0?E*MeUyrzZ!L*=$_bSkvguY|J~uR;`Zl V>VXqVKY=zec)I$ztaD0e0stR|O??0W literal 1810 zcmV+t2krQYP)Px*%t=H+RA>d=n$L??RT#&6wG1Vb6zqqZjs-4KEFvmh%sWLSxu{JDLW^01K|-{0 z(WaGd4Hew@M~EP9G(jw(r3ophnK76cS|Qd%zI{G-&Y3y)eee6;b7w{!ec(IioagyI z&vVXu?>YC}bEoy#EJ~--X%TKcXoFY4ItyYI}Zis^c z!{89O4yG&m8eQn_rO}P3>*uvu1=dAx%#AHOk>~Q0g`Y8 z`~ad{rE&o51$TpTOWjWnZ%g3nqpvZH6~!DQb#Z2FC&>^v8naT`iBT}m;FR7@cJj;I zWO9Sg^$=qoZDXbbH0Mxm%tkx{w}H2faue(V3)3L9y}jN|bvbo?^i8?67XovbOEGsl z<;=KFz#U*5D2Kt)ra|#}Q%u8eX~;=Y^kGNS7(ILf%?JC97-TnPX+qOp0bcHL?oz<< zm%rJi?r9netVj*Cy*iU&%UIiQb*`wZAKsg?D-6b}!oMIo_-S)~hM3?lq`t7bH1tq+V zVA~+hbZo{n_8?#Ean9M-o<~7xAutf6s}w5-1)YPoU)g7_O8ZqjSfheLjZlBs24(kG zhQ7z4OqCc~Aa0X(O<8(t@K%9uKxtX-Wlm|}o&bI4%@lK@W^7=N(v_&-?SiA&_nte@ zThRMjaVt~WQB(wTPp5p=ZR^*bpm(xgON>uC<}MX-7@z&)y%!(2Jx;l=53sNkdUHuQBv zDebUx0?rkVeJ@5ZF_xB-Z$nVHM|)zfbhK$d>^pD_$_D3CI|Mn(L+;gE9Es$HZ)-;aivZLiotpzN$mq#fSrg5BwO8kH^h{4KH_Ai`fCa-Gic zgS#{E4?d2AM`VgeVL9?#Al=C!C!8mfdTur5h&k*0;uzLBur+~wvCb>l|D!bFwM>4b zU5=For8&%H&K$WENNXI};?Vdb#}m$n`fyL*&g4hhYq64BnuA+w1pc3yKJkTju}l3w zIAuR*GZQ>$+IXXt?LqgpQGTvie5qWP;|Tu^Fr6c|CHOs^lOyGr%bcmMUmc#O%*qXy z)XUb8wf!7YJ-my+rTeK=Uss2JN!0ODyE%Zlvi#t^1e8nOia&>7wMS@4QkU*$lXgyZ z2$E&{Cd_!S2>x%LNTT`?92O}AezQlg2(95H8|@47%Z?{e?=Ddlajuc!_F z^9AO&Sc-odOzW|J+M}san1kEub7*I3sL>pc3C}sl9?4Cx1A8Q2Tjp`OotQ_$wfrbv z(?KOa#_M3U`k!JsR+KoX%lRoUC=Z?P$}(oK5&BXX}E)87-LIhdDZ8Xmb3vF9aH`OB(HgpZh$r zKe4j|S890ukKe+;ylS}zrpw`aP`M;_ysm_MLe%l1-Pph!%cHKU3>=E`foUrxV;rHK zojmoO1NC=UG`@}fC=E;{gL@=CO2h$9mJDnN#2x>@RSe$yz@5RYiZP8nC@A)UpOGqk zacYBcpbYx(cV>dp*;*MWQNr_?RQv3Mvo*y0K5;Kqv2PC?``9iS>l!#T`BZx0@S9=f?I$OKk8w(io-h5nla0H(Z;^3$j_jPH(LHCS^KSsY2 zPVO$ECmy~&isGE2TJ&jtzg*dR0(o1;Id_=)!~G8|>Bt$33rbuq{q=o#mOc>D{updY z{c`I1=$mqByQ46NxfFA^Q_if_3GAbw@}I=eyAk~hD3uexsv~j>j|pF6h*98%Jj%WM zC$Y3sWE%l-`(<)F;rFS%z|F4GPJOECath{zkG{r82V@R+L-$We=!D(|E`U^S)3^q{ z27a?z3p^G(7GPbSHaT+jNyV7PE-h5|Z**ibIT!|h6^$PdsWujUjWG;nJfIl|NPor9 zq3(ZnUJd635MN5isgHpxz!NeLlTLzJ{b%R@0ptnzj*n^*&;S4c07*qoM6N<$f{BM~ A3;+NC diff --git a/GUI/QtQuick/images/explorer_icon_unchoosed.png b/GUI/QtQuick/images/explorer_icon_unchoosed.png new file mode 100755 index 0000000000000000000000000000000000000000..dbd3e9c135e816a353d3c6ee8d46f789002f9ada GIT binary patch literal 592 zcmV-W0Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0p&?VK~zXf)s(?9 z13?gmyJy7N8^{~jN8kx02drEKNtG&xe&}rUYY~2SB#^4n2 z^VKwrz$IU!rY4Qzef@O(nd4mX$kR%B=FM#oCh-PS_1ech7kvV`yqQ3%1|pr@oNpZ4 zw3E4|N*N`V6zJ^T*=F0OBSZv(l}l&|C9~JHHRlVx1Qmg5461~S{3Hb}Uiq+-GuLNp zZBlg7-O_=~E>|-Ca`nlEiSY~7mibNEFeI!%fS3l-yEaS=0yWLwf(=7L0YdVWgrT>l z7wRClY+nT-raZEjKgKmj^pO96PXU7G-0J?gjS@4HKk!V?_igc)3h0quMAin0kwSPx zaRP`n0-Ux{awKdAofHT6@_eCEw&Bp^iif2^-%#|BJFrNIrJ3S^XEWatc$cO!D44RT z2oVAH5&<$RK{SS`gjdeS$g`-F9<%8PgYDXwULddZE`NYsxAa$b()c=>Az{zUR4r0+ zj1AA_s!o9}>`wwPLkJV*!H;b-?QDb}%y?BlUw;U4hOVpjio^;e#U&Cwfu=D})R<2T-DpSdRIe_RB$XlfpbArfi8p9_rQ>Wn0 zC(ei?n2@x#cBy^K?>#(#!2CfN42Gb3|33U*(kt-O;QJnR_^R<8b@=AdIYEcc2|5tH zp%ze;)}=X;V?BdCdHP(%T>6GLr!NS$A>!&m9y8W| zu`h2cPQX}%26!@#tI6kF=tDskAI>>$7;{|x%JW##3t%=%VP%NUp*+Ib9K909cpOAr zW<1$39Y5x@=>U$4MzV;@g6A=$PlW91g_Nl`d~U{KIsn>s0>@<_<&?|Bj9t+YLw0H` zkB-X##|M`msh$UR?UarjZ5;<|c;RfxKkhrKc2S?(Cp`YRjbC=nd#VcYD&_ z>^i@N&pPEqY*gIZd2lr z&Y|$@Z1rs*tY$ZNlYIYKvIvlmck5f6WUALIT;g6ZFON6&eMAn{A9T zIdy=QXG^Uzup1xY?Ls@Mz>pPI2G)F=Is z>0d}+V*190Hg1rsc;GTM&soDf;KW(k4Dj|1t+inqu=hGNhk%?UAZOOlcjw7@Qu%NG z`17wJ?MMnHisNA0S$AgI>j_Gz#;!r=jiq}S&k0CqB`?; z)bJW8ks}cYNvJxrb>TseFn=m^)`niW837eP(_vwCmYz;0579PA)d9RTO~snLnh{ewJSs(#5qa;k6d5FPv|qWORiM~8(o zZOsRs;TWCZ#I%bobeK>qZFqc+Mp-3++P^flCR2z!nW5GE<2w!rz2 zTg3DnZ)L3CFt%|_QT0kV6P@RhJpQwCgfnp{($5;*IMol{VN$ERLtq$NO@gAGVND7XDFQBR_tu{g-xiDBJ2nU_F8 zmUKs7M+SzC{oH>NS%LgcPZ!6K3dXmSH}W+tVs4vOUqt(@EDciNnFc<|$wO|4GO++`cOCtrAaK;`c7ss(W;`&M^1Pf2;-GbLr2 eqgTKve}7(8A5T-G@yGywpzcv~R= literal 654 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P3?%12mYf5m7>k44ofvPP)Tsw@I14-?iy0WW zg+Z8+Vb&Z8pkP9PPlzj!{z6M&R96bLm_eZ=$S;^7;J-tI!2I*;4fb!SSGfPapnrk= zfeG;mA1=u2Kk(1zPffh?0_gDBo-U3d6?1y0xCS{#RNny>u7;g__kibmfehpv8s{0luL+MV6Y-h^*I7wO)NF6zZyF5{>j7rjlM-r_NMw(i)GZye1DVhN`QL70(Y)*O)bVow*x5D)KU3Dy<{k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!Gca%qgD@k*tT_@u!7ZLHjv*HQSEmH>H7f|XOpN|<`Ni5_FEwX< zVfi}eUj@&ZS+Y&1Z*)XV-q-R#=M78Z!M7h}?CzShPcZ9z`N1+_iP7cd32g4Zw!hEj zpUlbIrYjK;$#ZtSA@)v8dh z_fMH0eU+3z~hA!~!&cQO0wy?oa<##%K@Jms_eM#Y}M)kaIi6W<4Ii0KzT?sef> gAk*yaYo(rxeRBQdKXZ4U4$%D!p00i_>zopr0PVDNaR2}S literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/plugins_icon_unchoosed.png b/GUI/QtQuick/images/plugins_icon_unchoosed.png new file mode 100755 index 0000000000000000000000000000000000000000..0e405f3a1353d703699aebb277b0e5f8d51d97b3 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1|(OCFP#RY7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!Gca%qgD@k*tT_@u!GE4Ejv*HQSEroiZE_H3O+O=+#96jr+5ykL zSr=H;_g-x2l-nt(EucL?NT(%bZesgY9qxzjLVtxe8FSm*sGRJWp>Rj7IG|ur!O@*; zbCVk#tNP~8*={&_Yg<^s!l(1(lAmxhuKzUgVN2j5)h$21)hwt!vm4)&Fo#I|7NAw&Lzz&Ox6Utu(7^5CgD0oDt`6i7S+jDLQY0Ke%@x%o%Uvy=lu!Y z+(Mg`10UTw^R)c#y1+ML|3&Y``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBexs+0V@L(#+ey258x#Z__)8hw5Ae#kPBUby z4xHZTTf%(z0I!YxMHVKtxa6nW{P(o^81}h*vzmU2=bO&L6FZE~CW(BTGw}(BYjD>^ zyY4yNYiDX~62I|K#8O1zWPjuKA_Iqs&5T_&4{Va}&SVt~(&sW*z3RjR^%Fafyyhzopr0HUx>UH||9 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}OFdm2Ln1hn z6C_v{D;h{Kfr(~YmVf{M>oXnkd9p)zh5wuhc1>*m|NJz5b-Z7m+oSZz`uP1{_SgU4 z$GyV8V}dfrDQ4a*hDWYPte8@MZqL83$0WPX>q0@2sK9HESrL52DvItGt`w=bnE0Fd9wbZ?SkxHE*wxn_;`_Em$94L0FFSYhk}393mn>FvI4{7! Z(4Rba?~COt`GF2*@O1TaS?83{1OV+SRL=ka diff --git a/GUI/QtQuick/images/send_icon.png b/GUI/QtQuick/images/send_icon.png old mode 100644 new mode 100755 index bb9d7b3706499c7a401f8d858824571df64568da..9ffddafc1c6213a1566f0158fcca00dad9930142 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBeygX8V@L(#+sV1S4GIEn2ieRHu(>rFo#JUY zC**cO!|VcwSb)o2naTS8|9|~UeDlqw=dP@id~WGs^+Aw3)3-m zU|B9cz2Sk&#%f(HgT%lMj4B-m9S;iM(B?SEweaMg$J_O-Sp#nTJJe*&@#p!Oi>&XT hv2Hr=d^U3%qd}eT!zXu6t^+!V!PC{xWt~$(69DieQ;Yxr literal 549 zcmV+=0^0qFP)Px$-$_J4R9FdPU>F6XAut*OqaiRF0s|ZZjO5y{*sxLW-~WGW85sYc)AHzN% zQ<{O1@dyVOlh@61|IfrYgs2cuY1k(7A7}x{a*zdlJX}67%R!dhYY4i<%F1XDbl4+? z|Nm`%e*3#isbe=kRUDw%xR^PHo^_U~04nCdvE2 zD6;tb{mUNR_AP?w>d^Ukqd>8Bqxk<{e-8i+)BqZMmYIvk`Cf(VM|4Aw`N}ODWdHpB zzYiD^D!>rAz{bepdaJ?r4YC?!Hr^=s_w(;skmW#EUgTlobR%Rr$l$v*0gpKtne2g~ zbrTq620#D*S&wWXIvcM8fIa~E_9z<@tIO2}k9X*raq(|9_&;N0XR-&Tmt#Q3f5N41 nRD3i9MnhmU1V%$(P=o*g&lI9w!J#TS00000NkvXXu0mjfPi6h` diff --git a/GUI/QtQuick/images/settings_icon.png b/GUI/QtQuick/images/settings_icon.png old mode 100644 new mode 100755 index a41ec0e29e7484798a1384c9c6d2d2537c2baf10..e2d98c2b8a041d85b862383c15f3b1f4d507613a GIT binary patch literal 628 zcmV-)0*n2LP)g&>NT=#63Z&)F#l1 zH~o*{nUFThNS2=8e0b*fA2U5+ol)W&=371g*-GP6FIfIB&bUJ>N~)SvI1I;Dqz&Mx`1%nOwB$x_BlD@){$I?bB;!_h2-FN4o_F?Sm|zm9@c-a(~IRdo!n znrGz6=y04qGv1|B=s(0-TTP{-_jZ? zW(z0tK9jWcY>971R~PO4j2IoUU=V&x>TEd{p{lm3m%Yh6w$`5AZ>Xi?0aS!18+L;z z0?AIYhRHmYl6Ohr4z8 zFq$*tnU^^OXkA047!dn+Ag^CV_0Ojjjsf+97J|QTtxO9(kd>{h#7KkPCCDxq@?p-K zJZPL;6Z4zgiGn)69#tt11qYqx`H>0+5Vrv3-iMt)6=>1FmVu97sIaf885H(SM>hnSCd(R3E&5{cX323JmM1%Y=Cs+G4)GdjpU3h2bywClXB-#QysE z`$y3MKxw-G O0000Px*6iGxuR7efQR$FY8MHHShvlkH3f@nb70P1cj7X<}U#D=t7?GxT85Tw%X_MvDiVi2JSWiS7XXBMX{KLr7U%c6~-kBrp@j7G(ccn7enS>QdK`;|(sAAj@bkYku>ZqRUE|^KNaH zh{o#7;My=5b|F_0DVGD#g<*g30j*2g^FXdN$YEe~)$PCmL)b(Zn`;h@2FLtuiB!5b zraIPZhcDp5kbMS}EDZCK{d!+XXJu$8iOa*1z{(cCdrzuPttsX#!$M@jtWY7Oc3UCl ze5unLT4mO&|F`%{YB8jx!hmg@OZ0W)i+J6qEfl7L6x)YX)(p9!xxS)Ujo!Er)eaua zHY?KsA34lj2OxWeNcBTzd!QC144p=%wbiVnEq>3ZRFaReVCwD#{P?NRV)Wj6lDq#f zJCDbOYPXA#*QdwKx~_K0@dnDVAy*Izg)Q9EWOOR;Dig^0;~?)0FNDWc!M=LJe05Y)u+HQ8f9pFSrEV!6LPIH`aX`) zpE9WZ#c#{Ucd9)cN~iJPu1bG)(~+K6FaKSOk!T5X&&qCrm7xM>RtwHwsKPm1rNLF@ zt7xEuYnj=DK2ZgR^Ld1gJ~*?1yRIr*^-%&A%q>%EEV3Tw|2n%5mu>T@`xU^1-;!f> z(EK@ha2}4pQgl&WTJdt-w-oUZBTp47szFV<3cjM5Ynano7L&SDqCDY8T!Lu8djftx> z>3p{Z9^wr?X8;LV@NI44#r4{mdKj{4zXJ*!^AC#oy?}QcYAm2}3Y1bZ|7OtOM!ac7 z0Vxn!tY0ZcLn=@OuFCjQd+VOjn~z%cCGR9}VT|wdSR9>S;)}JY$zO6%8)Nl;fVrL0 zo6<=qc=1KGuRuE5T6byYmyFm>Y%@qF>^A`q<-up-2HB5Avn1m8e5FC1>w}fZ?gbm| zJ*kmTyP)?|!FA5l1@8)Vjz2U~fii$)sh|#Tz=uEZih$aum_Ze=DyWR?!E^DlQh}<1 zODF6};9URSCq+VhjeT9#?045_Mi}0=(P8NWj7|=7*Ll5fmPzoeL8W&C4i3I|7#PN3 z%IL~wURoF*ndlGtY<+ZpZUAqzmrVny#35>94wG*H6ywk2aVBP&MAU^uBJ;W zsKXa}Q%ZQ1GV8>2LDhv)nRg^XAqPjr6WvuiPCt1?3ei_HQ7;ZiS%%|kB0ku^>HT!2 z2FFT|V?o96xwlPzAskn}~(A2yeES+HBY|{|{6-SIqGNnS+q{dkbP2*@Nb3(EBR? Y0br5+pri*)!2kdN07*qoM6N<$f^eq*6951J diff --git a/GUI/QtQuick/images/transactions_icon.png b/GUI/QtQuick/images/transactions_icon.png old mode 100644 new mode 100755 index 87a8dde75658da3cdecea7b414305983c042343b..c67779b76ef6a516918ad9cbaa00fcbe9cc964b8 GIT binary patch delta 350 zcmV-k0iphe1BC;SFn<69XF*Lt006O%3;baP00009a7bBm000XU000XU0RWnu7ytkP z8c9S!R7gv$mOBo@Fbsy1hXb0?8k$*Yt@`FWFwk>zft}!LW zK~MyNlH$Ny%d1*|tk*zkxu|P;Y9P@z4iB8V>ztl+Nop)e5s=8jzFfo`Gt0!+bqFJH zx!sdrZme@~?w%Vn(7Lf>G>5S(nxA|`vQW5-K3nv7_y!@A}Iaq$Bv#u_W-ITB9tq;cPJ5w76(`qUC7vf w4A`wByMgTv{je(l3m~zur~#1wJ#RkM3LS@&Et;07*qoM6N<$f=*YN@Bjb+ delta 351 zcmV-l0igbc1BL^TFn<9+Nkl7g`11Suk02Be?13(M{KY@4^BO~KoFb_zuz!*?^DUfaj;?GdN0+7A{ z#ZVy>$^gnc0Ht|>G{_7KC?CUuA3)nT!z6(|iUG3U0L2c##D9=!pu7x_{|8wfC{~QD zh6$O2h5ZL8#)d^4CIpfLsUZ#kZ9hPqO5Cc@%|MUj4?wM;FsB3<0E0{bs{!b?V^u^z z5Zw$yaX`R0!qOyL0Cb@wVPg?0NU{KEI4IYG(mBz9BnyD1E(Btfgh9wAk}LqGj@N_? zM3*PY0(8y9@K^_>1-prHIZO@7J^;o;8%#4XG|3haV<@s3^!k7UnAUxP3SjjCvRY!; xp!$FVSs_ZA1{#iDqamv$hK*695u=GBH2^5bRdsV3?S=pV002ovPDHLkV1fZ5hcy5I diff --git a/GUI/QtQuick/images/transactions_icon_unchoosed.png b/GUI/QtQuick/images/transactions_icon_unchoosed.png new file mode 100755 index 0000000000000000000000000000000000000000..56e13b31523e180d6076144896145913b879a751 GIT binary patch literal 822 zcmV-61Ihe}P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0?SE6K~zXft(HMg z6HyR=XWni@z13e}Ig7EV_trq-5xg~As1Xtp4{*|yn6M-oh^KNeA+czCf%Rnh0fch% zBt39%{Rh1X>F$m*(?`?VZN=i3ykuu)cjnD|^X4tW7#0g&D(OzG^J5MO(ttb|{-{j= z4UFiRBCPq9VoUUK#0JP0cGBR&7bM6;09692n*=ue{jQ_@8ruU7Mo?fe%cBk`_W7i zoJprUQKMQ1x40_yZtGl79~4!kNJPf#wet^()B463@~b;dE!RGH3ED^H;$15$Qr>sm zsphZXYTBSni>#}6P2=%D6{mRvQHBYeSq|3X%v09fLo1J0!1UfdCL8oNUEX(1rrXG@_R6^v2=iCTM$IHQuABmwH z1z6K({_r%v^4?S7KOkM1C!(#QTSWo90M0_p!CD@P)NMsElHA^AwNf*3L5dBs< zDN^rt>z#wIpZO-@{xNBgo^$rmf2;K_9Dy&1`u)rt8V8SN9?d6NKC`BgNO5GIJbS~% zP~xiD^UIsN)}-i#^CvnR2RzO%3lVo(47k6CEq~wBwDW6TI_fwX#6*@)YC-B<_A%~0 zi4Aa#1VTfLWN<{{R3007*qoM6N<$f;wY% A6951J literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index 5fcf78014..326739497 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -26,6 +26,7 @@ QtObject { readonly property color textColor: "white" readonly property color textPressedColor: "#3a8ab4" readonly property color disabledHeaderColor: "#909090" + readonly property color titleTextColor: "#7A88B0" readonly property color labelsTextColor: "#939393" readonly property color labelsTextDisabledColor: "#454E53" @@ -73,4 +74,6 @@ QtObject { readonly property color testnetColor: "#22c064" readonly property color mainnetTextColor: "white" readonly property color testnetTextColor: "black" + + readonly property color selectedColor: "white" } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml b/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml index 1e8a73827..5ae742e06 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml @@ -8,55 +8,70 @@ ********************************************************************************** */ -import QtQuick 2.9 -import QtQuick.Controls 2.3 +import QtQuick 2.12 +import QtQuick.Controls 2.4 import QtQuick.Layouts 1.3 import "../BsStyles" TabButton { id: control - text: parent.text - icon.source: parent.icon.source - property alias cText: text_ - property alias cIcon: image_ + + width: 94 + height: parent.height + focusPolicy: Qt.NoFocus - contentItem: RowLayout { - width: parent.width - height: parent.height - - Image { - id: image_ - source: control.icon.source - horizontalAlignment: Qt.AlignVCenter - verticalAlignment: Qt.AlignVCenter - Layout.fillHeight: true - } + font.pixelSize: 10 + font.family: "Roboto" + font.weight: Font.Medium - Text { - id: text_ - text: control.text - font.capitalization: Font.AllUppercase - font.pointSize: 10 - color: control.checked ? (control.down ? BSStyle.textPressedColor : BSStyle.textColor) : BSStyle.buttonsUncheckedColor - elide: Text.ElideRight - horizontalAlignment: Text.AlignLeft - verticalAlignment: Text.AlignVCenter - } + property url selectedIcon_; + property url nonSelectedIcon_; + + contentItem: ColumnLayout { + width: control.width + height: control.height + spacing : 4 + + Image { + id: image_ + + width: 24 + height: 24 + Layout.alignment : Qt.AlignTop | Qt.AlignHCenter + Layout.topMargin : 10 + + source: control.checked? selectedIcon_ :nonSelectedIcon_ + sourceSize: Qt.size(parent.width, parent.height) + + smooth: true + } + + Text { + id: text_ + + Layout.alignment : Qt.AlignBottom | Qt.AlignHCenter + Layout.bottomMargin : 5 + + text: control.text + font: control.font + color: !control.enabled ? BSStyle.disabledTextColor : + (control.down ? BSStyle.textPressedColor : + (control.checked? BSStyle.selectedColor : BSStyle.titleTextColor)) + } } + background: Rectangle { - implicitWidth: 100 - implicitHeight: 50 - opacity: enabled ? 1 : 0.3 - color: control.checked ? (control.down ? BSStyle.backgroundPressedColor : BSStyle.backgroundColor) : "0f1f24" - - Rectangle { - width: parent.width - height: 2 - color: control.checked ? (control.down ? BSStyle.textPressedColor : BSStyle.buttonsPrimaryMainColor) : "transparent" - anchors.top: parent.top - } + implicitWidth: parent.width + implicitHeight: parent.height + color: "transparent" + } + + function setIcons(selectedIcon: url, nonselectedIcon: url) + { + selectedIcon_ = selectedIcon; + nonSelectedIcon_ = nonselectedIcon; } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml b/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml new file mode 100644 index 000000000..9cda5ada8 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml @@ -0,0 +1,60 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.3 +import "../BsStyles" + + +ToolButton { + id: control + + property bool _isSelected: false + + Layout.fillHeight: true + implicitWidth: 110 + + hoverEnabled: true + + font.pixelSize: 12 + font.family: "Roboto" + font.weight: Font.Normal + palette.buttonText: !enabled ? BSStyle.disabledTextColor : + (control.down ? BSStyle.textPressedColor : + (_isSelected ? BSStyle.selectedColor : BSStyle.titleTextColor)) + + icon.color: palette.buttonText + icon.width: 16 + icon.height: 16 + + background: Rectangle { + anchors.fill: parent + id: btn_background + clip: true + color: !control.enabled ? BSStyle.disabledColor : + (control._isPressed ? BSStyle.buttonsPressedColor : + (control.hovered ? BSStyle.buttonsHoveredColor : BSStyle.buttonsMainColor)) + Rectangle { + color: 'transparent' + anchors.fill: parent + anchors.rightMargin: -border.width + anchors.topMargin: -border.width + anchors.bottomMargin: -border.width + border.width: 1 + border.color:"#3C435A" + } + } + + function select(isSelected: bool) + { + _isSelected = isSelected; + } +} diff --git a/GUI/QtQuick/qml/StyledControls/qmldir b/GUI/QtQuick/qml/StyledControls/qmldir index c5f3cae76..5a51888a7 100644 --- a/GUI/QtQuick/qml/StyledControls/qmldir +++ b/GUI/QtQuick/qml/StyledControls/qmldir @@ -20,4 +20,5 @@ CustomTextArea 1.0 CustomTextArea.qml CustomTextInput 1.0 CustomTextInput.qml CustomPasswordTextInput 1.0 CustomPasswordTextInput.qml CustomTitleDialogWindow 1.0 CustomTitleDialogWindow.qml +CustomTitleToolButton 1.0 CustomTitleToolButton.qml CustomTitleDialogWindowWithExpander 1.0 CustomTitleDialogWindowWithExpander.qml diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 210bed466..9152bae83 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -34,9 +34,6 @@ ApplicationWindow { readonly property int resizeAnimationDuration: 25 Component.onCompleted: { - mainWindow.flags = Qt.CustomizeWindowHint | Qt.MSWindowsFixedSizeDialogHint | - Qt.Dialog | Qt.WindowSystemMenuHint | - Qt.WindowTitleHint | Qt.WindowCloseButtonHint hide() // qmlFactory.installEventFilterToObj(mainWindow) // qmlFactory.applyWindowFix(mainWindow) @@ -91,59 +88,61 @@ ApplicationWindow { } header: Column { - height: 50 + height: 57 width: parent.width + spacing: 0 RowLayout { - height: 50 + height: 56 width: parent.width + spacing: 0 Image { - source: "qrc:/images/bs_logo.png" - horizontalAlignment: Qt.AlignLeft - verticalAlignment: Qt.AlignTop - Layout.fillHeight: true + width: 129 + height: 24 + source: "qrc:/images/logo.png" + Layout.leftMargin : 18 + } + + Label { + width: 13 } Image { id: imgArmoryStatus - source: "qrc:/images/bitcoin-disabled.png" - verticalAlignment: Qt.AlignVCenter + source: "qrc:/images/conn_ind.png" } Label { Layout.fillWidth: true } - ToolButton { + CustomTitleToolButton { id: btnSend + enabled: false text: qsTr("Send") icon.source: "qrc:/images/send_icon.png" - font.pointSize: 16 - Layout.fillHeight: true - enabled: false onClicked: { + topMenuBtnClicked(btnSend) stack.push(sendPage) //sendPage.visible = true } } - ToolButton { + CustomTitleToolButton { id: btnReceive text: qsTr("Receive") icon.source: "qrc:/images/receive_icon.png" - font.pointSize: 16 - Layout.fillHeight: true onClicked: { + topMenuBtnClicked(btnReceive) stack.push(receivePage) } } - ToolButton { + CustomTitleToolButton { id: btnSettings text: qsTr("Settings") icon.source: "qrc:/images/settings_icon.png" - font.pointSize: 16 - Layout.fillHeight: true onClicked: { + topMenuBtnClicked(btnSettings) stack.push(settingsPage) } } @@ -152,6 +151,7 @@ ApplicationWindow { Rectangle { width: parent.width height: 1 + color: "#3C435A" } } @@ -175,33 +175,77 @@ ApplicationWindow { } } - footer: TabBar { - id: tabBar - currentIndex: swipeView.currentIndex - spacing: 5 - Layout.fillWidth: false - background: Rectangle { - color: "transparent" - } + footer: Rectangle { + height: 56 + width: parent.width + color :"#191E2A" - CustomTabButton { - id: btnOverview - text: qsTr("Overview") - icon.source: "qrc:/images/overview_icon.png" - } - CustomTabButton { - id: btnTransactions - text: qsTr("Transactions") - icon.source: "qrc:/images/transactions_icon.png" - } + RowLayout { + spacing: 0 + anchors.fill: parent + + Label { + Layout.fillWidth: true + } - CustomTabButton { - id: btnExplorer - text: qsTr("Explorer") - icon.source: "qrc:/images/explorer_icon.png" + TabBar { + id: tabBar + currentIndex: swipeView.currentIndex + padding: 0 + spacing: 0 + Layout.fillWidth: false + + background: Rectangle { + color: "transparent" + } + + CustomTabButton { + id: btnOverview + text: qsTr("Overview") + Component.onCompleted: { + btnOverview.setIcons ("qrc:/images/overview_icon.png", "qrc:/images/overview_icon_not_choosed.png") + } + } + CustomTabButton { + id: btnTransactions + text: qsTr("Transactions") + Component.onCompleted: { + btnTransactions.setIcons ("qrc:/images/transactions_icon.png", "qrc:/images/transactions_icon_unchoosed.png") + } + } + + CustomTabButton { + id: btnExplorer + text: qsTr("Explorer") + Component.onCompleted: { + btnExplorer.setIcons ("qrc:/images/explorer_icon.png", "qrc:/images/explorer_icon_unchoosed.png") + } + } + + CustomTabButton { + id: btnPlugins + text: qsTr("Plugins") + Component.onCompleted: { + btnPlugins.setIcons ("qrc:/images/plugins_icon.png", "qrc:/images/plugins_icon_unchoosed.png") + } + } + } + + Label { + Layout.fillWidth: true + } } } + function topMenuBtnClicked(clickedBtn) + { + btnSend.select(false) + btnReceive.select(false) + btnSettings.select(false) + + clickedBtn.select(true) + } + /* function raiseWindow() { JsHelper.raiseWindow(mainWindow) diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 52b77d90a..cb2da9550 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -45,5 +45,13 @@ qml/StyledControls/qmldir qml/BsStyles/BSStyle.qml qml/BsStyles/qmldir + qml/StyledControls/CustomTitleToolButton.qml + images/logo.png + images/conn_ind.png + images/plugins_icon.png + images/overview_icon_not_choosed.png + images/plugins_icon_unchoosed.png + images/transactions_icon_unchoosed.png + images/explorer_icon_unchoosed.png From 336c60989868cb474bdfa01a092ac96abbd7f689 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 15 Dec 2022 18:36:24 +0300 Subject: [PATCH 007/436] Address copying in overview --- GUI/QtQuick/TxListModel.cpp | 25 +++++- GUI/QtQuick/qml/AddressDetails.qml | 120 +++++++++++++++++++++++++++++ GUI/QtQuick/qml/ExplorerPage.qml | 10 --- GUI/QtQuick/qml/InfoBanner.qml | 4 +- GUI/QtQuick/qml/OverviewPage.qml | 26 ++++--- GUI/QtQuick/qml/main.qml | 5 +- GUI/QtQuick/qtquick.qrc | 1 + common | 2 +- 8 files changed, 164 insertions(+), 29 deletions(-) create mode 100644 GUI/QtQuick/qml/AddressDetails.qml diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 5208be95e..a5fd1f458 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -58,7 +58,7 @@ QString TxListModel::getData(int row, int col) const } return QString::fromStdString(address.display()); } - case 4: return QString::number(entry.value / BTCNumericTypes::BalanceDivider, 'f', 8); + case 4: return QString::number(std::abs(entry.value) / BTCNumericTypes::BalanceDivider, 'f', 8); case 5: return QString::number(entry.nbConf); case 6: return txFlag(row - 1); case 7: { @@ -78,8 +78,8 @@ QColor TxListModel::dataColor(int row, int col) const if (row == 0) { return QColorConstants::DarkGray; } + const auto& entry = data_.at(row - 1); if (col == 5) { - const auto& entry = data_.at(row - 1); switch (entry.nbConf) { case 0: return QColorConstants::Red; case 1: @@ -90,7 +90,25 @@ QColor TxListModel::dataColor(int row, int col) const default: return QColorConstants::Green; } } - else if ((col == 2) || (col == 6)) { + else if (col == 2) { + const auto& itTxDet = txDetails_.find(row - 1); + if (itTxDet != txDetails_.end()) { + switch (itTxDet->second.direction) { + case bs::sync::Transaction::Direction::Received: return QColorConstants::Green; + case bs::sync::Transaction::Direction::Sent: return QColorConstants::Red; + case bs::sync::Transaction::Direction::Internal: return QColorConstants::Cyan; + default: break; + } + } + return QColorConstants::DarkGray; + } + else if (col == 4) { + if (entry.value < 0) { + return qRgb(208, 192, 192); + } + return qRgb(192, 208, 192); + } + else if (col == 6) { return QColorConstants::DarkGray; } return QColorConstants::LightGray; @@ -199,6 +217,7 @@ void TxListModel::clear() { beginResetModel(); data_.clear(); + txDetails_.clear(); endResetModel(); } diff --git a/GUI/QtQuick/qml/AddressDetails.qml b/GUI/QtQuick/qml/AddressDetails.qml new file mode 100644 index 000000000..893337e1c --- /dev/null +++ b/GUI/QtQuick/qml/AddressDetails.qml @@ -0,0 +1,120 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + property var addressInfo + + Column { + spacing: 23 + anchors.fill: parent + + GridLayout { + columns: 3 + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + Label { + text: qsTr("Transactions") + font.pointSize: 12 + } + Label { + text: qsTr("1") + font.pointSize: 12 + } + Image { + source: "qrc:/images/bs_logo.png" + Layout.rowSpan: 5 + } + Label { + text: qsTr("Wallet") + font.pointSize: 12 + } + Label { + text: qsTr("wallet") + font.pointSize: 12 + } + Label { + text: qsTr("Address") + font.pointSize: 12 + } + Row { + Label { + id: address + text: qsTr("address") + color: 'lightgrey' + font.pointSize: 12 + } + Button { + text: qsTr("Copy") + font.pointSize: 12 + onClicked: { + bsApp.copyAddressToClipboard(address.text) + } + } + } + Label { + text: qsTr("Address Type/ID") + font.pointSize: 12 + } + Label { + text: qsTr("External/0") + font.pointSize: 12 + } + Label { + text: qsTr("Comment") + font.pointSize: 12 + } + Label { + text: qsTr("-") + font.pointSize: 12 + } + Label { + text: qsTr("Balance") + font.pointSize: 12 + } + Label { + text: qsTr("0") + font.pointSize: 12 + } + } + Row { + Label { + text: qsTr("Incoming transactions") + font.pointSize: 14 + } + Image { + source: "qrc:/images/receive_icon.png" + } + } + Row { + Label { + text: qsTr("Outgoing transactions") + font.pointSize: 14 + } + Image { + source: "qrc:/images/send_icon.png" + } + } + } +} diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml index e999b64dd..9ab2e338e 100644 --- a/GUI/QtQuick/qml/ExplorerPage.qml +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -26,15 +26,5 @@ Item { spacing: 50 anchors.fill: parent - Text { - text: " " - } - Text { - text: qsTr("Explorer page") - font.pointSize: 23 - } - Image { - source: "qrc:/images/bs_logo.png" - } } } diff --git a/GUI/QtQuick/qml/InfoBanner.qml b/GUI/QtQuick/qml/InfoBanner.qml index 7cedd5c37..b7dc0ad4d 100644 --- a/GUI/QtQuick/qml/InfoBanner.qml +++ b/GUI/QtQuick/qml/InfoBanner.qml @@ -19,6 +19,7 @@ Loader { messages.source = Qt.resolvedUrl("InfoBannerComponent.qml"); messages.item.message = message; messages.item.bgColor = bgColor + messages.visible = true } width: parent.width @@ -33,9 +34,10 @@ Loader { Timer { id: timer - interval: 7000 + interval: 5000 onTriggered: { messages.state = "" + messages.visible = false } } diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 8e1768854..67002c699 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -26,6 +26,10 @@ Item { id: createNewWalletPage visible: false } + AddressDetails { + id: addressDetails + visible: false + } Column { spacing: 23 @@ -148,17 +152,17 @@ Item { color: heading ? 'darkgrey' : 'lightgrey' anchors.centerIn: parent } - } - MouseArea { - anchors.fill: parent - onClicked: { - //if ((addressListModel.column === 0) && (addressListModel.row > 0)) { - bsApp.copyAddressToClipboard("row: " + model.row) - //ibInfo.displayMessage(qsTr("address copied")) - //} - } - onDoubleClicked: { - //TODO: show address details + MouseArea { + anchors.fill: parent + onClicked: { + if (!heading && (model.column === 0)) { + bsApp.copyAddressToClipboard(tabledata) + ibInfo.displayMessage(qsTr("address %1 copied to clipboard").arg(tabledata)) + } + } + onDoubleClicked: { + stack.push(addressDetails) + } } } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index a87ebab10..8a42bcca0 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -110,7 +110,7 @@ ApplicationWindow { Image { id: imgArmoryStatus - source: "qrc:/images/conn_ind.png" + source: (bsApp.armoryState === 7) ? "qrc:/images/conn_ind.png" : "qrc:/images/conn_inactive.png" } Label { @@ -119,12 +119,11 @@ ApplicationWindow { CustomTitleToolButton { id: btnSend - enabled: false + enabled: !bsApp.walletsList.empty text: qsTr("Send") icon.source: "qrc:/images/send_icon.png" font.pointSize: 16 Layout.fillHeight: true - enabled: !bsApp.walletsList.empty onClicked: { topMenuBtnClicked(btnSend) stack.push(sendPage) diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index ca224161e..c0ac11c1f 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -13,6 +13,7 @@ images/explorer_icon.png qml/main.qml qml/OverviewPage.qml + qml/AddressDetails.qml qml/TransactionsPage.qml qml/ExplorerPage.qml qml/SendPage.qml diff --git a/common b/common index 81c94e65a..a979fa35f 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 81c94e65a97ba9f20cb105c1122ffded4fa82ee2 +Subproject commit a979fa35f130bf1e6080568dc2a1c58baa60a7c6 From dd0919e0cd6184958fb5da3466868c9f9463b7cb Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 15 Dec 2022 23:21:32 +0300 Subject: [PATCH 008/436] Explorer page initial layout --- GUI/QtQuick/TxListModel.cpp | 12 ++ GUI/QtQuick/TxListModel.h | 4 +- GUI/QtQuick/qml/ExplorerPage.qml | 305 ++++++++++++++++++++++++++- GUI/QtQuick/qml/OverviewPage.qml | 2 +- GUI/QtQuick/qml/TransactionsPage.qml | 14 ++ 5 files changed, 331 insertions(+), 6 deletions(-) diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index a5fd1f458..28517d711 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -19,6 +19,7 @@ namespace { {TxListModel::HeadingRole, "heading"}, {TxListModel::ColorRole, "dataColor"}, {TxListModel::WidthRole, "colWidth"}, + {TxListModel::TxIdRole, "txId"}, }; } @@ -168,6 +169,15 @@ QString TxListModel::txFlag(int row) const return {}; } +QString TxListModel::txId(int row) const +{ + const auto& itTxDet = txDetails_.find(row); + if (itTxDet != txDetails_.end()) { + return QString::fromStdString(itTxDet->second.txHash.toHexStr(true)); + } + return {}; +} + QVariant TxListModel::data(const QModelIndex& index, int role) const { if (index.column() >= header_.size()) { @@ -182,6 +192,8 @@ QVariant TxListModel::data(const QModelIndex& index, int role) const return dataColor(index.row(), index.column()); case WidthRole: return colWidth(index.column()); + case TxIdRole: + return txId(index.row() - 1); default: break; } return QVariant(); diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index be7569db9..7aa78a939 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -27,7 +27,8 @@ class TxListModel : public QAbstractTableModel { Q_OBJECT public: - enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole, WidthRole }; + enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole + , WidthRole, TxIdRole }; TxListModel(const std::shared_ptr&, QObject* parent = nullptr); int rowCount(const QModelIndex & = QModelIndex()) const override; @@ -51,6 +52,7 @@ class TxListModel : public QAbstractTableModel QString walletNameById(const std::string&) const; QString txType(int row) const; QString txFlag(int row) const; + QString txId(int row) const; private: std::shared_ptr logger_; diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml index 9ab2e338e..4876b367a 100644 --- a/GUI/QtQuick/qml/ExplorerPage.qml +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -8,9 +8,9 @@ ********************************************************************************** */ -import QtQuick 2 -import QtQuick.Controls 2.9 -import QtQuick.Layouts 1.3 +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 import QtQml.Models 2 import "StyledControls" @@ -21,10 +21,307 @@ import "BsStyles" Item { id: explorer + property bool isAddressSearch: true + property bool isTXSearch Column { - spacing: 50 + spacing: 32 anchors.fill: parent + TextInput { + id: txSearchBox + width: 900 + height: 32 + color: 'lightgrey' + font.pointSize: 14 + Text { + text: qsTr("Search for transaction or address") + color: 'darkgrey' + visible: !txSearchBox.text && !txSearchBox.activeFocus + } + } + + Column { + visible: isAddressSearch + Row { + spacing: 16 + Label { + text: qsTr("Address") + font.pointSize: 14 + } + Label { + text: "address" + color: 'lightgrey' + font.pointSize: 12 + } + Button { + text: qsTr("Copy") + font.pointSize: 12 + onClicked: { + } + } + } + Row { + spacing: 12 + Column { + Label { + text: qsTr("Transactions count") + font.pointSize: 8 + } + Label { + text: qsTr("4") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Balance (BTC)") + font.pointSize: 8 + } + Label { + text: qsTr("0.0099889") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Total Received (BTC)") + font.pointSize: 8 + } + Label { + text: qsTr("0.0099889") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Total Sent (BTC)") + font.pointSize: 8 + } + Label { + text: qsTr("0.0099889") + font.pointSize: 12 + } + } + } + Label { + text: qsTr("Transactions") + font.pointSize: 14 + } + TableView { + width: 1000 + height: 300 + columnSpacing: 1 + rowSpacing: 1 + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: addressListModel + delegate: Rectangle { + implicitWidth: firstcol ? 550 : 150 + implicitHeight: 20 + border.color: "black" + border.width: 1 + color: heading ? 'black' : 'darkslategrey' + Text { + text: tabledata + font.pointSize: heading ? 8 : 10 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + MouseArea { + anchors.fill: parent + onClicked: { + if (!heading && (model.column === 1)) { + isAddressSearch = false + isTXSearch = true + } + } + } + } + } + } + + Column { + visible: isTXSearch + Row { + spacing: 16 + Label { + text: qsTr("Transaction ID") + font.pointSize: 14 + } + Label { + text: "transaction id" + color: 'lightgrey' + font.pointSize: 12 + } + Button { + text: qsTr("Copy") + font.pointSize: 12 + onClicked: { + } + } + } + Row { + spacing: 12 + Column { + Label { + text: qsTr("Confirmations") + font.pointSize: 8 + } + Label { + text: qsTr("283") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Inputs") + font.pointSize: 8 + } + Label { + text: qsTr("1") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Outputs") + font.pointSize: 8 + } + Label { + text: qsTr("2") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Input Amount (BTC)") + font.pointSize: 8 + } + Label { + text: qsTr("0.01959741") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Output Amount (BTC)") + font.pointSize: 8 + } + Label { + text: qsTr("0.01959741") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Fees (BTC)") + font.pointSize: 8 + } + Label { + text: qsTr("0.00000146") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Fee per byte (s/b)") + font.pointSize: 8 + } + Label { + text: qsTr("1") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Size (virtual bytes)") + font.pointSize: 8 + } + Label { + text: qsTr("141") + font.pointSize: 12 + } + } + } + Row { + spacing: 32 + Column { + Label { + text: qsTr("Input") + font.pointSize: 14 + } + TableView { + width: 500 + height: 300 + columnSpacing: 1 + rowSpacing: 1 + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: addressListModel + delegate: Rectangle { + implicitWidth: 120 + implicitHeight: 40 + border.color: "black" + border.width: 1 + color: heading ? 'black' : 'darkslategrey' + Text { + text: tabledata + font.pointSize: heading ? 8 : 10 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + MouseArea { + anchors.fill: parent + onClicked: { + if (!heading && (model.column === 0)) { + isTXSearch = false + isAddressSearch = true + } + } + } + } + } + } + Column { + Label { + text: qsTr("Output") + font.pointSize: 14 + } + TableView { + width: 500 + height: 300 + columnSpacing: 1 + rowSpacing: 1 + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: addressListModel + delegate: Rectangle { + implicitWidth: 120 + implicitHeight: 40 + border.color: "black" + border.width: 1 + color: heading ? 'black' : 'darkslategrey' + Text { + text: tabledata + font.pointSize: heading ? 8 : 10 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + MouseArea { + anchors.fill: parent + onClicked: { + if (!heading && (model.column === 0)) { + } + } + } + } + } + } + } + } } } diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 67002c699..46e0dba2b 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -136,7 +136,7 @@ Item { height: 300 columnSpacing: 1 rowSpacing: 1 - clip: false + clip: true ScrollIndicator.horizontal: ScrollIndicator { } ScrollIndicator.vertical: ScrollIndicator { } model: addressListModel diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 252c89a3f..4fd589628 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -100,6 +100,20 @@ Item { color: dataColor anchors.centerIn: parent } + MouseArea { + anchors.fill: parent + onClicked: { + if (!heading) { + bsApp.copyAddressToClipboard(txId) + ibInfo.displayMessage(qsTr("TX id %1 copied to clipboard").arg(txId)) + } + } + onDoubleClicked: { + if (!heading) { + //TODO: show TX details + } + } + } } } } From a4e1a6c32035a0c5a3fe9f253ed5aa27eae04ebc Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 16 Dec 2022 18:41:38 +0300 Subject: [PATCH 009/436] Advanced TX pages --- GUI/QtQuick/qml/SendAdvanced.qml | 273 +++++++++++++++++++++++++++ GUI/QtQuick/qml/SendPage.qml | 11 ++ GUI/QtQuick/qml/VerifyAdvancedTX.qml | 179 ++++++++++++++++++ GUI/QtQuick/qtquick.qrc | 2 + 4 files changed, 465 insertions(+) create mode 100644 GUI/QtQuick/qml/SendAdvanced.qml create mode 100644 GUI/QtQuick/qml/VerifyAdvancedTX.qml diff --git a/GUI/QtQuick/qml/SendAdvanced.qml b/GUI/QtQuick/qml/SendAdvanced.qml new file mode 100644 index 000000000..619dacf6f --- /dev/null +++ b/GUI/QtQuick/qml/SendAdvanced.qml @@ -0,0 +1,273 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + property var recvAddress + property int walletIdx + property var sendAmount + property var comment + id: send + + VerifyAdvancedTX { + id: verifySignTX + visible: false + } + + Column { + spacing: 23 + anchors.fill: parent + + Row { + Button { + text: qsTr("Simple") + font.pointSize: 12 + onClicked: { + stack.pop() + } + } + Text { + text: qsTr("Send Bitcoin") + font.pointSize: 14 + } + } + + Row { + spacing: 23 + Column { + spacing: 12 + Label { + text: qsTr("Inputs") + font.pointSize: 14 + } + Row { + ComboBox { + id: sendWalletsComboBox + objectName: "sendWalletsComboBox" + model: bsApp.walletsList + currentIndex: walletIdx + font.pointSize: 12 + enabled: (bsApp.walletsList.length > 1) + width: 350 + } + Label { + text: qsTr("%1 BTC").arg(bsApp.totalBalance) + font.pointSize: 12 + } + } + TextInput { + id: fees + width: 400 + height: 32 + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: qsTr("Fee Suggestions") + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + Text { + text: qsTr("s/b") + font.pointSize: 10 + color: 'darkgrey' + anchors.right: parent + anchors.horizontalCenter: parent + } + } + Row { + spacing: 23 + Label { + text: qsTr("Input Addresses") + font.pointSize: 10 + } + CheckBox { + id: cbSelectInputs + font.pointSize: 10 + text: qsTr("Select Inputs") + } + Label { + text: qsTr("#Tx: 0") + font.pointSize: 10 + } + Label { + text: qsTr("Balance (BTC): %1").arg(bsApp.totalBalance) + font.pointSize: 10 + } + } + TableView { + width: 480 + height: 250 + columnSpacing: 1 + rowSpacing: 1 + visible: cbSelectInputs.checked + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: addressListModel + delegate: Rectangle { + implicitWidth: 120 + implicitHeight: 20 + border.color: "black" + border.width: 1 + color: heading ? 'black' : 'darkslategrey' + Text { + text: tabledata + font.pointSize: heading ? 8 : 10 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + MouseArea { + anchors.fill: parent + onClicked: { + if (!heading) { + //TODO: select + } + } + } + } + } + } + + Column { + spacing: 12 + Row { + Label { + text: qsTr("Outputs") + font.pointSize: 14 + } + Button { + text: "+" + font.pointSize: 14 + onClicked: { + } + } + } + TextInput { + id: outAddr0 + width: 400 + height: 32 + text: recvAddress + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: qsTr("Receiver address") + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + Row { + TextInput { + id: amount0 + width: 400 + height: 32 + text: sendAmount + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: qsTr("Amount") + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + Text { + text: qsTr("BTC") + font.pointSize: 10 + color: 'darkgrey' + anchors.right: parent + anchors.horizontalCenter: parent + } + } + Button { + text: qsTr("MAX") + font.pointSize: 14 + } + } + TableView { + width: 480 + height: 200 + columnSpacing: 1 + rowSpacing: 1 + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: addressListModel + delegate: Rectangle { + implicitWidth: 120 + implicitHeight: 20 + border.color: "black" + border.width: 1 + color: heading ? 'black' : 'darkslategrey' + Text { + text: tabledata + font.pointSize: heading ? 8 : 10 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + } + } + } + } + + + TextEdit { + id: txComment + text: comment + width: 900 + height: 50 + color: 'lightgrey' + verticalAlignment: TextEdit.AlignVCenter + font.pointSize: 12 + Text { + text: qsTr("Comment") + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + font.pointSize: 10 + } + } + + Button { + width: 900 + text: qsTr("Continue") + font.pointSize: 14 + enabled: recvAddress.text.length && (parseFloat(amount.text) >= 0.00001) + && (parseFloat(fees.text) >= 1.0) + + onClicked: { + verifySignTX.txSignRequest = bsApp.createTXSignRequest( + sendWalletsComboBox.currentIndex, recvAddress.text, + parseFloat(amount.text), parseFloat(fees.text), + txComment.text) + stack.push(verifySignTX) + } + } + } +} diff --git a/GUI/QtQuick/qml/SendPage.qml b/GUI/QtQuick/qml/SendPage.qml index 4ded45d18..e6795e8ee 100644 --- a/GUI/QtQuick/qml/SendPage.qml +++ b/GUI/QtQuick/qml/SendPage.qml @@ -26,6 +26,10 @@ Item { id: verifySignTX visible: false } + SendAdvanced { + id: advancedCreateTX + visible: false + } Column { spacing: 23 @@ -46,6 +50,13 @@ Item { width: 300 text: qsTr("Advanced") font.pointSize: 14 + onClicked: { + advancedCreateTX.recvAddress = recvAddress.text + advancedCreateTX.walletIdx = sendWalletsComboBox.currentIndex + advancedCreateTX.sendAmount = amount.text + advancedCreateTX.comment = txComment.text + stack.push(advancedCreateTX) + } } } diff --git a/GUI/QtQuick/qml/VerifyAdvancedTX.qml b/GUI/QtQuick/qml/VerifyAdvancedTX.qml new file mode 100644 index 000000000..a84ab0f5c --- /dev/null +++ b/GUI/QtQuick/qml/VerifyAdvancedTX.qml @@ -0,0 +1,179 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + property var txSignRequest + + Column { + spacing: 23 + anchors.fill: parent + + Row { + spacing: 100 + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + Label { + text: qsTr("Sign Transaction") + font.pointSize: 14 + } + } + Row { + spacing: 23 + + TableView { + width: 480 + height: 250 + columnSpacing: 1 + rowSpacing: 1 + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: addressListModel + delegate: Rectangle { + implicitWidth: 120 + implicitHeight: 20 + border.color: "black" + border.width: 1 + color: heading ? 'black' : 'darkslategrey' + Text { + text: tabledata + font.pointSize: heading ? 8 : 10 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + } + } + + TableView { + width: 480 + height: 250 + columnSpacing: 1 + rowSpacing: 1 + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: addressListModel + delegate: Rectangle { + implicitWidth: 120 + implicitHeight: 20 + border.color: "black" + border.width: 1 + color: heading ? 'black' : 'darkslategrey' + Text { + text: tabledata + font.pointSize: heading ? 8 : 10 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + } + } + } + + GridLayout { + columns: 4 + columnSpacing: 50 + Label { + text: qsTr("Input amount:") + font.pointSize: 12 + } + Label { + text: qsTr("%1").arg(txSignRequest.inputAmount) + font.pointSize: 12 + } + Label { + text: qsTr("Transaction size:") + font.pointSize: 12 + } + Label { + text: qsTr("%1").arg(txSignRequest.txSize) + font.pointSize: 12 + } + Label { + text: qsTr("Return amount:") + font.pointSize: 12 + } + Label { + text: qsTr("%1").arg(txSignRequest.returnAmount) + font.pointSize: 12 + } + Label { + text: qsTr("Fee per byte:") + font.pointSize: 12 + } + Label { + text: qsTr("%1").arg(txSignRequest.feePerByte) + font.pointSize: 12 + } + Label { + text: qsTr("Transaction fee:") + font.pointSize: 12 + } + Label { + text: qsTr("%1").arg(txSignRequest.fee) + font.pointSize: 12 + } + Label { + text: qsTr("Total spent:") + font.pointSize: 12 + } + Label { + text: qsTr("%1").arg(txSignRequest.outputAmount) + font.pointSize: 12 + } + } + TextInput { + id: password + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + echoMode: TextInput.Password + passwordCharacter: '*' + Text { + text: qsTr("Password") + font.pointSize: 6 + color: 'darkgrey' + anchors.left: parent + anchors.top: parent + } + } + Button { + width: 900 + text: qsTr("Broadcast") + font.pointSize: 14 + enabled: txSignRequest.isValid && password.text.length + + onClicked: { + bsApp.signAndBroadcast(txSignRequest, password.text) + stack.pop() + stack.pop() + stack.pop() + password.text = "" + } + } + } +} diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index c0ac11c1f..a615903c9 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -17,6 +17,7 @@ qml/TransactionsPage.qml qml/ExplorerPage.qml qml/SendPage.qml + qml/SendAdvanced.qml qml/ReceivePage.qml qml/SettingsPage.qml qml/CreateNewWallet.qml @@ -25,6 +26,7 @@ qml/VerifySeedPhrase.qml qml/WalletNamePass.qml qml/VerifyTX.qml + qml/VerifyAdvancedTX.qml qml/InfoBanner.qml qml/InfoBannerComponent.qml qml/InfoBar.qml From ad55283334b2f65716ae13160b1643d86a939e32 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 19 Dec 2022 23:59:32 +0300 Subject: [PATCH 010/436] actual explorer address implementation --- GUI/QtQuick/QtQuickAdapter.cpp | 37 ++- GUI/QtQuick/QtQuickAdapter.h | 2 + GUI/QtQuick/TxListModel.cpp | 260 +++++++++++++++++++- GUI/QtQuick/TxListModel.h | 50 ++++ GUI/QtQuick/qml/ExplorerAddress.qml | 135 +++++++++++ GUI/QtQuick/qml/ExplorerEmpty.qml | 45 ++++ GUI/QtQuick/qml/ExplorerPage.qml | 357 ++++++---------------------- GUI/QtQuick/qml/ExplorerTX.qml | 214 +++++++++++++++++ GUI/QtQuick/qtquick.qrc | 3 + 9 files changed, 819 insertions(+), 284 deletions(-) create mode 100644 GUI/QtQuick/qml/ExplorerAddress.qml create mode 100644 GUI/QtQuick/qml/ExplorerEmpty.qml create mode 100644 GUI/QtQuick/qml/ExplorerTX.qml diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 567b95287..abf4ba42d 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -105,6 +105,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) addrModel_ = new QmlAddressListModel(logger, this); pendingTxModel_ = new TxListModel(logger, this); txModel_ = new TxListModel(logger, this); + expTxByAddrModel_ = new TxListForAddr(logger, this); } QtQuickAdapter::~QtQuickAdapter() @@ -188,6 +189,7 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("addressListModel"), addrModel_); rootCtxt_->setContextProperty(QLatin1Literal("pendingTxListModel"), pendingTxModel_); rootCtxt_->setContextProperty(QLatin1Literal("txListModel"), txModel_); + rootCtxt_->setContextProperty(QLatin1Literal("txListByAddrModel"), expTxByAddrModel_); engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); if (engine.rootObjects().empty()) { @@ -418,11 +420,13 @@ ProcessingResult QtQuickAdapter::processBlockchain(const Envelope &env) logger_->debug("[{}] current block: {}", __func__, blockNum_); pendingTxModel_->setCurrentBlock(blockNum_); txModel_->setCurrentBlock(blockNum_); + expTxByAddrModel_->setCurrentBlock(blockNum_); break; case ArmoryMessage::kNewBlock: blockNum_ = msg.new_block().top_block(); pendingTxModel_->setCurrentBlock(blockNum_); txModel_->setCurrentBlock(blockNum_); + expTxByAddrModel_->setCurrentBlock(blockNum_); break; case ArmoryMessage::kWalletRegistered: if (msg.wallet_registered().success() && msg.wallet_registered().wallet_id().empty()) { @@ -640,6 +644,9 @@ void QtQuickAdapter::splashProgressCompleted() logger_->error("[QtQuickAdapter::splashProgressCompleted] no main window found"); } QTimer::singleShot(100, [this] { + if (!splashScreen_) { + return; + } splashScreen_->hide(); splashScreen_->deleteLater(); splashScreen_ = nullptr; @@ -1052,7 +1059,7 @@ ProcessingResult QtQuickAdapter::processAddressHist(const ArmoryMessage_AddressH } entries.push_back(std::move(txEntry)); } - //TODO + expTxByAddrModel_->addRows(entries); return ProcessingResult::Success; } @@ -1259,4 +1266,30 @@ void QtQuickAdapter::signAndBroadcast(QTXSignRequest* txReq, const QString& pass //msgReq->set_keep_dup_recips(keepDupRecips); msgReq->set_passphrase(password.toStdString()); pushRequest(user_, userSigner_, msg.SerializeAsString()); -} \ No newline at end of file +} + +int QtQuickAdapter::startSearch(const QString& s) +{ + const auto& trimmed = s.trimmed().toStdString(); + bs::Address address; + try { + address = bs::Address::fromAddressString(trimmed); + if (address.isValid()) { + expTxByAddrModel_->clear(); + ArmoryMessage msg; + msg.set_get_address_history(address.display()); + pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + return 1; + } + } + catch (const std::exception&) {} + + if (trimmed.length() == 64) { // potential TX hash in hex + const auto& txId = BinaryData::CreateFromHex(trimmed); + if (txId.getSize() == 32) { // valid TXid + //TODO: send request to BA + return 2; + } + } + return 0; +} diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 06ae23506..7afc36bac 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -156,6 +156,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE QTXSignRequest* createTXSignRequest(int walletIndex, const QString& recvAddr , double amount, double fee, const QString& comment); Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); + Q_INVOKABLE int startSearch(const QString&); signals: void walletsListChanged(); @@ -241,6 +242,7 @@ private slots: QmlAddressListModel* addrModel_{ nullptr }; TxListModel* pendingTxModel_{ nullptr }; TxListModel* txModel_{ nullptr }; + TxListForAddr* expTxByAddrModel_{ nullptr }; bs::Address generatedAddress_; std::map txReqs_; diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 28517d711..1db7ee1bd 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -14,13 +14,19 @@ #include "StringUtils.h" namespace { - static const QHash kRoles{ + static const QHash kTxListRoles{ {TxListModel::TableDataRole, "tableData"}, {TxListModel::HeadingRole, "heading"}, {TxListModel::ColorRole, "dataColor"}, {TxListModel::WidthRole, "colWidth"}, {TxListModel::TxIdRole, "txId"}, }; + static const QHash kTxListForAddrRoles{ + {TxListForAddr::TableDataRole, "tableData"}, + {TxListForAddr::HeadingRole, "heading"}, + {TxListForAddr::ColorRole, "dataColor"}, + {TxListForAddr::WidthRole, "colWidth"}, + }; } TxListModel::TxListModel(const std::shared_ptr& logger, QObject* parent) @@ -201,7 +207,7 @@ QVariant TxListModel::data(const QModelIndex& index, int role) const QHash TxListModel::roleNames() const { - return kRoles; + return kTxListRoles; } void TxListModel::addRows(const std::vector& entries) @@ -318,3 +324,253 @@ void TxListModel::setCurrentBlock(uint32_t nbBlock) } emit dataChanged(createIndex(1, 5), createIndex(data_.size(), 5)); } + + +TxListForAddr::TxListForAddr(const std::shared_ptr& logger, QObject* parent) + : QAbstractTableModel(parent), logger_(logger) + , header_{ tr("Date"), tr("Transaction ID"), tr("#Conf"), tr("#Ins"), tr("#Outs"), tr("Amount (BTC)") + , tr("Fees (BTC)"), tr("fpb"), tr("VSize (B)") } +{} + +int TxListForAddr::rowCount(const QModelIndex&) const +{ + return data_.size() + 1; +} + +int TxListForAddr::columnCount(const QModelIndex&) const +{ + return header_.size(); +} + +static QString displayNb(int nb) +{ + if (nb < 0) { + return QObject::tr("..."); + } + return QString::number(nb); +} + +static QString displayBTC(double btc, int precision = 8) +{ + if (btc < 0) { + return QObject::tr("..."); + } + return QString::number(btc, 'f', precision); +} + +QString TxListForAddr::getData(int row, int col) const +{ + if (row > data_.size()) { + return {}; + } + if (row == 0) { + return header_.at(col); + } + const auto& entry = data_.at(row - 1); + const auto totFees = totalFees(row - 1); + switch (col) { + case 0: return QDateTime::fromSecsSinceEpoch(entry.txTime).toString(); + case 1: return txId(row - 1); + case 2: return QString::number(entry.nbConf); + case 3: return displayNb(nbInputs(row - 1)); + case 4: return displayNb(nbOutputs(row - 1)); + case 5: return QString::number(entry.value / BTCNumericTypes::BalanceDivider, 'f', 8); + case 6: return displayBTC(totFees / BTCNumericTypes::BalanceDivider); + case 7: return (totFees < 0) ? tr("...") : displayBTC(totFees / (double)txSize(row - 1), 1); + case 8: return displayNb(txSize(row - 1)); + default: break; + } + return {}; +} + +int TxListForAddr::nbInputs(int row) const +{ + const auto& itTxDet = txs_.find(row); + if (itTxDet != txs_.end()) { + return itTxDet->second.getNumTxIn(); + } + return -1; +} + +int TxListForAddr::nbOutputs(int row) const +{ + const auto& itTxDet = txs_.find(row); + if (itTxDet != txs_.end()) { + return itTxDet->second.getNumTxOut(); + } + return -1; +} + +int TxListForAddr::txSize(int row) const +{ + const auto& itTxDet = txs_.find(row); + if (itTxDet != txs_.end()) { + return itTxDet->second.getTxWeight(); + } + return -1; +} + +int64_t TxListForAddr::totalFees(int row) const +{ + const auto& itTxDet = txs_.find(row); + if (itTxDet != txs_.end()) { + return itTxDet->second.getNumTxOut(); + } + return -1; +} + +QColor TxListForAddr::dataColor(int row, int col) const +{ + if (row == 0) { + return QColorConstants::DarkGray; + } + const auto& entry = data_.at(row - 1); + if (col == 2) { + switch (entry.nbConf) { + case 0: return QColorConstants::Red; + case 1: + case 2: + case 3: + case 4: + case 5: return QColorConstants::Yellow; + default: return QColorConstants::Green; + } + } + return QColorConstants::LightGray; +} + +float TxListForAddr::colWidth(int col) const +{ // width ratio, sum should give columnCount() as a result + switch (col) { + case 0: return 1.5; + case 1: return 4.0; + case 2: return 0.5; + case 3: return 0.4; + case 4: return 0.4; + case 5: return 0.8; + case 6: return 0.8; + case 7: return 0.3; + case 8: return 0.3; + default: break; + } + return 1.0; +} + +QString TxListForAddr::txId(int row) const +{ + try { + return QString::fromStdString(data_.at(row).txHash.toHexStr(true)); + } + catch (const std::exception&) {} + return {}; +} + +QVariant TxListForAddr::data(const QModelIndex& index, int role) const +{ + if (index.column() >= header_.size()) { + return {}; + } + switch (role) { + case TableDataRole: + return getData(index.row(), index.column()); + case HeadingRole: + return (index.row() == 0); + case ColorRole: + return dataColor(index.row(), index.column()); + case WidthRole: + return colWidth(index.column()); + default: break; + } + return QVariant(); +} + +QHash TxListForAddr::roleNames() const +{ + return kTxListForAddrRoles; +} + +void TxListForAddr::addRows(const std::vector& entries) +{ + beginInsertRows(QModelIndex(), rowCount(), rowCount() + entries.size() - 1); + data_.insert(data_.end(), entries.cbegin(), entries.cend()); + endInsertRows(); + emit changed(); +} + +void TxListForAddr::clear() +{ + beginResetModel(); + data_.clear(); + txs_.clear(); + endResetModel(); + emit changed(); +} + +void TxListForAddr::setDetails(const std::vector& txs) +{ + int rowStart = 0, rowEnd = 0; + for (const auto& tx : txs) { + for (int i = 0; i < data_.size(); ++i) { + const auto& entry = data_.at(i); + if (entry.txHash == tx.getThisHash()) { + if (!rowStart) { + rowStart = i + 1; + } + if (rowEnd <= i) { + rowEnd = i + 1; + } + } + } + } + if (rowStart && rowEnd) { + emit dataChanged(createIndex(rowStart, 3), createIndex(rowEnd, 8)); + } +} + +void TxListForAddr::setCurrentBlock(uint32_t nbBlock) +{ + if (!nbBlock) { + return; + } + if (!curBlock_) { + curBlock_ = nbBlock; + return; + } + const int diff = nbBlock - curBlock_; + curBlock_ = nbBlock; + for (auto& entry : data_) { + entry.nbConf += diff; + } + emit dataChanged(createIndex(1, 2), createIndex(data_.size(), 2)); +} + +QString TxListForAddr::totalReceived() const +{ + int64_t result = 0; + for (const auto& entry : data_) { + if (entry.value > 0) { + result += entry.value; + } + } + return displayBTC(result / BTCNumericTypes::BalanceDivider); +} + +QString TxListForAddr::totalSent() const +{ + int64_t result = 0; + for (const auto& entry : data_) { + if (entry.value < 0) { + result += entry.value; + } + } + return displayBTC(std::abs(result) / BTCNumericTypes::BalanceDivider); +} + +QString TxListForAddr::balance() const +{ + int64_t result = 0; + for (const auto& entry : data_) { + result += entry.value; + } + return displayBTC(result / BTCNumericTypes::BalanceDivider); +} diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 7aa78a939..5d1c29d6d 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -64,4 +64,54 @@ class TxListModel : public QAbstractTableModel uint32_t curBlock_; }; + +class TxListForAddr : public QAbstractTableModel +{ + Q_OBJECT +public: + enum TableRoles { + TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole, WidthRole + }; + TxListForAddr(const std::shared_ptr&, QObject* parent = nullptr); + + int rowCount(const QModelIndex & = QModelIndex()) const override; + int columnCount(const QModelIndex & = QModelIndex()) const override; + QVariant data(const QModelIndex& index, int role) const override; + QHash roleNames() const override; + + void addRows(const std::vector&); + void clear(); + void setDetails(const std::vector&); + void setCurrentBlock(uint32_t); + + Q_PROPERTY(QString totalReceived READ totalReceived NOTIFY changed) + QString totalReceived() const; + Q_PROPERTY(QString totalSent READ totalSent NOTIFY changed) + QString totalSent() const; + Q_PROPERTY(QString balance READ balance NOTIFY changed) + QString balance() const; + Q_PROPERTY(int nbTx READ nbTx NOTIFY changed) + int nbTx() const { return data_.size(); } + +signals: + void changed(); + +private: + QString getData(int row, int col) const; + QColor dataColor(int row, int col) const; + float colWidth(int col) const; + QString txId(int row) const; + int nbInputs(int row) const; + int nbOutputs(int row) const; + int txSize(int row) const; + int64_t totalFees(int row) const; + +private: + std::shared_ptr logger_; + const QStringList header_; + std::vector data_; + std::map txs_; + uint32_t curBlock_; +}; + #endif // TX_LIST_MODEL_H diff --git a/GUI/QtQuick/qml/ExplorerAddress.qml b/GUI/QtQuick/qml/ExplorerAddress.qml new file mode 100644 index 000000000..e9e8af700 --- /dev/null +++ b/GUI/QtQuick/qml/ExplorerAddress.qml @@ -0,0 +1,135 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + property var address + + Column { + spacing: 23 + anchors.fill: parent + + Label { + text: " " + font.pointSize: 50 + height: 50 + } + Row { + spacing: 16 + Label { + text: qsTr("Address") + font.pointSize: 14 + } + Label { + text: address + color: 'lightgrey' + font.pointSize: 12 + } + Button { + text: qsTr("Copy") + font.pointSize: 12 + onClicked: { + bsApp.copyAddressToClipboard(address) + } + } + } + Row { + spacing: 12 + Column { + Label { + text: qsTr("Transactions count") + font.pointSize: 8 + } + Label { + text: qsTr("%1").arg(txListByAddrModel.nbTx) + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Balance (BTC)") + font.pointSize: 8 + } + Label { + text: qsTr("%1").arg(txListByAddrModel.balance) + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Total Received (BTC)") + font.pointSize: 8 + } + Label { + text: qsTr("%1").arg(txListByAddrModel.totalReceived) + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Total Sent (BTC)") + font.pointSize: 8 + } + Label { + text: qsTr("%1").arg(txListByAddrModel.totalSent) + font.pointSize: 12 + } + } + } + Label { + text: qsTr("Transactions") + font.pointSize: 14 + } + TableView { + width: 1008 + height: 450 + columnSpacing: 1 + rowSpacing: 1 + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: txListByAddrModel + delegate: Rectangle { + implicitWidth: 112 * colWidth + implicitHeight: 20 + border.color: "black" + border.width: 1 + color: heading ? 'black' : 'darkslategrey' + clip: true + Text { + text: tableData + font.pointSize: heading ? 8 : 10 + color: dataColor + anchors.centerIn: parent + } + MouseArea { + anchors.fill: parent + onClicked: { + if (!heading && (model.column === 1)) { + explorerTX.txId = tableData + bsApp.startSearch(explorerTX.txId) + explorerStack.push(explorerTX) + } + } + } + } + } + } +} diff --git a/GUI/QtQuick/qml/ExplorerEmpty.qml b/GUI/QtQuick/qml/ExplorerEmpty.qml new file mode 100644 index 000000000..a81eb775c --- /dev/null +++ b/GUI/QtQuick/qml/ExplorerEmpty.qml @@ -0,0 +1,45 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + Column { + spacing: 32 + anchors.fill: parent + + Label { + text: " " + font.pointSize: 50 + height: 50 + } + Image { + width: 150 + height: 150 + source: "qrc:/images/logo.png" + Layout.topMargin: 150 + //Layout.horizontalCenter: parent + } + Label { + text: qsTr("Provides you with a convenient, powerful, yet simple tool to read
transaction and address data from the bitcoin network
") + font.pointSize: 12 + } + + } +} diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml index 4876b367a..855dec39c 100644 --- a/GUI/QtQuick/qml/ExplorerPage.qml +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -20,306 +20,103 @@ import "BsStyles" //import "js/helper.js" as JsHelper Item { + property var searchStack: [] + property var searchHist: [] id: explorer - property bool isAddressSearch: true - property bool isTXSearch + + ExplorerEmpty { + id: explorerEmpty + visible: false + } + ExplorerAddress { + id: explorerAddress + visible: false + } + ExplorerTX { + id: explorerTX + visible: false + } Column { spacing: 32 anchors.fill: parent - TextInput { - id: txSearchBox - width: 900 - height: 32 - color: 'lightgrey' - font.pointSize: 14 - Text { - text: qsTr("Search for transaction or address") - color: 'darkgrey' - visible: !txSearchBox.text && !txSearchBox.activeFocus - } - } + Row { + id: textInput + TextInput { + id: expSearchBox + width: 900 + height: 32 + color: 'lightgrey' + font.pointSize: 14 - Column { - visible: isAddressSearch - Row { - spacing: 16 - Label { - text: qsTr("Address") - font.pointSize: 14 - } - Label { - text: "address" - color: 'lightgrey' - font.pointSize: 12 - } - Button { - text: qsTr("Copy") - font.pointSize: 12 - onClicked: { + function textEntered() { + var rc = bsApp.startSearch(expSearchBox.text) + searchStack.push(expSearchBox.text) + if (rc === 0) { + ibFailure.displayMessage(qsTr("Unknown type of search key")) } - } - } - Row { - spacing: 12 - Column { - Label { - text: qsTr("Transactions count") - font.pointSize: 8 + else if (rc === 1) { // address entered + explorerAddress.address = expSearchBox.text + explorerStack.push(explorerAddress) } - Label { - text: qsTr("4") - font.pointSize: 12 + else if (rc === 2) { // TXid entered + explorerStack.push(explorerTX) } } - Column { - Label { - text: qsTr("Balance (BTC)") - font.pointSize: 8 - } - Label { - text: qsTr("0.0099889") - font.pointSize: 12 - } - } - Column { - Label { - text: qsTr("Total Received (BTC)") - font.pointSize: 8 - } - Label { - text: qsTr("0.0099889") - font.pointSize: 12 - } + + onAccepted: textEntered() + + Text { + text: qsTr("Search for transaction or address") + color: 'darkgrey' + visible: !txSearchBox.text && !txSearchBox.activeFocus } - Column { - Label { - text: qsTr("Total Sent (BTC)") - font.pointSize: 8 - } - Label { - text: qsTr("0.0099889") - font.pointSize: 12 + } + Button { + text: qsTr("<") + font.pointSize: 14 + width: 50 + enabled: (explorerStack.depth > 1) + onClicked: { + explorerStack.pop() + searchHist.push(searchStack[searchStack.length - 1]) + searchStack.pop + if (searchStack.length > 0) { + expSearchBox.text = searchStack[searchStack.length - 1] } + expSearchBox.text = "" } } - Label { - text: qsTr("Transactions") + Button { + text: qsTr(">") font.pointSize: 14 - } - TableView { - width: 1000 - height: 300 - columnSpacing: 1 - rowSpacing: 1 - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } - model: addressListModel - delegate: Rectangle { - implicitWidth: firstcol ? 550 : 150 - implicitHeight: 20 - border.color: "black" - border.width: 1 - color: heading ? 'black' : 'darkslategrey' - Text { - text: tabledata - font.pointSize: heading ? 8 : 10 - color: heading ? 'darkgrey' : 'lightgrey' - anchors.centerIn: parent - } - MouseArea { - anchors.fill: parent - onClicked: { - if (!heading && (model.column === 1)) { - isAddressSearch = false - isTXSearch = true - } - } - } + width: 50 + enabled: true //(searchHist.length > 0) + onClicked: { + expSearchBox.text = searchHist[searchHist.length - 1] + expSearchBox.textEntered() + searchHist.pop } } } - Column { - visible: isTXSearch - Row { - spacing: 16 - Label { - text: qsTr("Transaction ID") - font.pointSize: 14 - } - Label { - text: "transaction id" - color: 'lightgrey' - font.pointSize: 12 - } - Button { - text: qsTr("Copy") - font.pointSize: 12 - onClicked: { - } - } - } - Row { - spacing: 12 - Column { - Label { - text: qsTr("Confirmations") - font.pointSize: 8 - } - Label { - text: qsTr("283") - font.pointSize: 12 - } - } - Column { - Label { - text: qsTr("Inputs") - font.pointSize: 8 - } - Label { - text: qsTr("1") - font.pointSize: 12 - } - } - Column { - Label { - text: qsTr("Outputs") - font.pointSize: 8 - } - Label { - text: qsTr("2") - font.pointSize: 12 - } - } - Column { - Label { - text: qsTr("Input Amount (BTC)") - font.pointSize: 8 - } - Label { - text: qsTr("0.01959741") - font.pointSize: 12 - } - } - Column { - Label { - text: qsTr("Output Amount (BTC)") - font.pointSize: 8 - } - Label { - text: qsTr("0.01959741") - font.pointSize: 12 - } - } - Column { - Label { - text: qsTr("Fees (BTC)") - font.pointSize: 8 - } - Label { - text: qsTr("0.00000146") - font.pointSize: 12 - } - } - Column { - Label { - text: qsTr("Fee per byte (s/b)") - font.pointSize: 8 - } - Label { - text: qsTr("1") - font.pointSize: 12 - } - } - Column { - Label { - text: qsTr("Size (virtual bytes)") - font.pointSize: 8 - } - Label { - text: qsTr("141") - font.pointSize: 12 - } - } - } - Row { - spacing: 32 - Column { - Label { - text: qsTr("Input") - font.pointSize: 14 - } - TableView { - width: 500 - height: 300 - columnSpacing: 1 - rowSpacing: 1 - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } - model: addressListModel - delegate: Rectangle { - implicitWidth: 120 - implicitHeight: 40 - border.color: "black" - border.width: 1 - color: heading ? 'black' : 'darkslategrey' - Text { - text: tabledata - font.pointSize: heading ? 8 : 10 - color: heading ? 'darkgrey' : 'lightgrey' - anchors.centerIn: parent - } - MouseArea { - anchors.fill: parent - onClicked: { - if (!heading && (model.column === 0)) { - isTXSearch = false - isAddressSearch = true - } - } - } - } - } - } - Column { - Label { - text: qsTr("Output") - font.pointSize: 14 - } - TableView { - width: 500 - height: 300 - columnSpacing: 1 - rowSpacing: 1 - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } - model: addressListModel - delegate: Rectangle { - implicitWidth: 120 - implicitHeight: 40 - border.color: "black" - border.width: 1 - color: heading ? 'black' : 'darkslategrey' - Text { - text: tabledata - font.pointSize: heading ? 8 : 10 - color: heading ? 'darkgrey' : 'lightgrey' - anchors.centerIn: parent - } - MouseArea { - anchors.fill: parent - onClicked: { - if (!heading && (model.column === 0)) { - } - } - } - } - } + Item { + Rectangle { + anchors.top: parent.top + 100 + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + //clip: true + StackView { + id: explorerStack + anchors.fill: parent + initialItem: explorerEmpty + //anchors.top: parent.top + 100 + //anchors.bottom: parent.bottom + //anchors.left: parent.left + //anchors.right: parent.right + //clip: true } } } diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml new file mode 100644 index 000000000..fcc18b35c --- /dev/null +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -0,0 +1,214 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + property var txId + + Column { + spacing: 23 + anchors.fill: parent + + Label { + text: " " + font.pointSize: 50 + height: 50 + } + Row { + spacing: 16 + Label { + text: qsTr("Transaction ID") + font.pointSize: 14 + } + Label { + text: txId + color: 'lightgrey' + font.pointSize: 12 + } + Button { + text: qsTr("Copy") + font.pointSize: 12 + onClicked: { + bsApp.copyAddressToClipboard(txId) + } + } + } + Row { + spacing: 12 + Column { + Label { + text: qsTr("Confirmations") + font.pointSize: 8 + } + Label { + text: qsTr("283") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Inputs") + font.pointSize: 8 + } + Label { + text: qsTr("1") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Outputs") + font.pointSize: 8 + } + Label { + text: qsTr("2") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Input Amount (BTC)") + font.pointSize: 8 + } + Label { + text: qsTr("0.01959741") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Output Amount (BTC)") + font.pointSize: 8 + } + Label { + text: qsTr("0.01959741") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Fees (BTC)") + font.pointSize: 8 + } + Label { + text: qsTr("0.00000146") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Fee per byte (s/b)") + font.pointSize: 8 + } + Label { + text: qsTr("1") + font.pointSize: 12 + } + } + Column { + Label { + text: qsTr("Size (virtual bytes)") + font.pointSize: 8 + } + Label { + text: qsTr("141") + font.pointSize: 12 + } + } + } + Row { + spacing: 32 + Column { + Label { + text: qsTr("Input") + font.pointSize: 14 + } + TableView { + width: 500 + height: 300 + columnSpacing: 1 + rowSpacing: 1 + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: addressListModel + delegate: Rectangle { + implicitWidth: 120 + implicitHeight: 40 + border.color: "black" + border.width: 1 + color: heading ? 'black' : 'darkslategrey' + Text { + text: tabledata + font.pointSize: heading ? 8 : 10 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + MouseArea { + anchors.fill: parent + onClicked: { + if (!heading && (model.column === 0)) { + isTXSearch = false + isAddressSearch = true + } + } + } + } + } + } + Column { + Label { + text: qsTr("Output") + font.pointSize: 14 + } + TableView { + width: 500 + height: 300 + columnSpacing: 1 + rowSpacing: 1 + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: addressListModel + delegate: Rectangle { + implicitWidth: 120 + implicitHeight: 40 + border.color: "black" + border.width: 1 + color: heading ? 'black' : 'darkslategrey' + Text { + text: tabledata + font.pointSize: heading ? 8 : 10 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + MouseArea { + anchors.fill: parent + onClicked: { + if (!heading && (model.column === 0)) { + } + } + } + } + } + } + } + } +} diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index a615903c9..55316d9d1 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -16,6 +16,9 @@ qml/AddressDetails.qml qml/TransactionsPage.qml qml/ExplorerPage.qml + qml/ExplorerEmpty.qml + qml/ExplorerAddress.qml + qml/ExplorerTX.qml qml/SendPage.qml qml/SendAdvanced.qml qml/ReceivePage.qml From 07ae8dec47f4308803bd53338ff1b2fc46ed79e4 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 21 Dec 2022 10:12:46 +0300 Subject: [PATCH 011/436] Complete explorer impl --- GUI/QtQuick/QtQuickAdapter.cpp | 77 ++++++++- GUI/QtQuick/QtQuickAdapter.h | 8 +- GUI/QtQuick/TxListModel.cpp | 236 +++++++++++++++++++++++++++- GUI/QtQuick/TxListModel.h | 74 +++++++++ GUI/QtQuick/qml/ExplorerAddress.qml | 4 +- GUI/QtQuick/qml/ExplorerLoader.qml | 21 +++ GUI/QtQuick/qml/ExplorerPage.qml | 6 +- GUI/QtQuick/qml/ExplorerTX.qml | 62 +++++--- GUI/QtQuick/qtquick.qrc | 1 + common | 2 +- 10 files changed, 452 insertions(+), 39 deletions(-) create mode 100644 GUI/QtQuick/qml/ExplorerLoader.qml diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index abf4ba42d..876b21916 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -179,6 +179,7 @@ void QtQuickAdapter::run(int &argc, char **argv) logger_->debug("[QtGuiAdapter::run] creating QML app"); qmlRegisterInterface("QTXSignRequest"); qmlRegisterInterface("QUTXO"); + qmlRegisterInterface("QTxDetails"); QQmlApplicationEngine engine; QQuickWindow::setTextRenderType(QQuickWindow::NativeTextRendering); @@ -444,6 +445,8 @@ ProcessingResult QtQuickAdapter::processBlockchain(const Envelope &env) return processZC(msg.zc_received()); case ArmoryMessage::kZcInvalidated: return processZCInvalidated(msg.zc_invalidated()); + case ArmoryMessage::kTransactions: + return processTransactions(env.responseId(), msg.transactions()); default: return ProcessingResult::Ignored; } return ProcessingResult::Success; @@ -758,7 +761,7 @@ void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) }); } -ProcessingResult QtQuickAdapter::processWalletData(uint64_t msgId +ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId , const WalletsMessage_WalletData& response) { const auto& itReq = walletInfoReq_.find(msgId); @@ -825,6 +828,7 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId Tx tx(BinaryData::fromString(resp.tx())); if (tx.isInitialized()) { txDet.tx = std::move(tx); + txDet.tx.setTxHeight(resp.tx_height()); } } } catch (const std::exception &e) { @@ -869,8 +873,17 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId , resp.change_address().out_index() }; } catch (const std::exception &) {} - pendingTxModel_->setDetails(txDet); - txModel_->setDetails(txDet); + + const auto& itTxDet = txDetailReqs_.find(msgId); + if (itTxDet == txDetailReqs_.end()) { + pendingTxModel_->setDetails(txDet); + txModel_->setDetails(txDet); + } + else { + itTxDet->second->setDetails(txDet); // shouldn't be more than one entry + itTxDet->second->setCurBlock(blockNum_); + txDetailReqs_.erase(itTxDet); + } } const auto& itZC = newZCs_.find(msgId); @@ -1027,6 +1040,23 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex return txReq; } +QTxDetails* QtQuickAdapter::getTXDetails(const QString& txHash) +{ + auto txBinHash = BinaryData::CreateFromHex(txHash.trimmed().toStdString()); + txBinHash.swapEndian(); + if (txBinHash.getSize() != 32) { + return new QTxDetails({}, this); + } + WalletsMessage msg; + auto msgReq = msg.mutable_tx_details_request(); + auto txReq = msgReq->add_requests(); + txReq->set_tx_hash(txBinHash.toBinStr()); + const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); + const auto txDet = new QTxDetails(txBinHash, this); + txDetailReqs_[msgId] = txDet; + return txDet; +} + ProcessingResult QtQuickAdapter::processAddressHist(const ArmoryMessage_AddressHistory& response) { bs::Address addr; @@ -1037,8 +1067,11 @@ ProcessingResult QtQuickAdapter::processAddressHist(const ArmoryMessage_AddressH logger_->error("[{}] invalid address: {}", __func__, e.what()); return ProcessingResult::Error; } + ArmoryMessage msg; + auto msgReq = msg.mutable_get_txs_by_hash(); std::vector entries; for (const auto& entry : response.entries()) { + msgReq->add_tx_hashes(entry.tx_hash()); bs::TXEntry txEntry; txEntry.txHash = BinaryData::fromString(entry.tx_hash()); txEntry.value = entry.value(); @@ -1060,6 +1093,8 @@ ProcessingResult QtQuickAdapter::processAddressHist(const ArmoryMessage_AddressH entries.push_back(std::move(txEntry)); } expTxByAddrModel_->addRows(entries); + const auto msgId = pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + expTxAddrReqs_.insert(msgId); return ProcessingResult::Success; } @@ -1160,6 +1195,41 @@ ProcessingResult QtQuickAdapter::processZCInvalidated(const ArmoryMessage_ZCInva return ProcessingResult::Success; } +bs::message::ProcessingResult QtQuickAdapter::processTransactions(bs::message::SeqId msgId + , const ArmoryMessage_Transactions& response) +{ + std::vector result; + std::set inHashes; + for (const auto& txData : response.transactions()) { + Tx tx(BinaryData::fromString(txData.tx())); + tx.setTxHeight(txData.height()); + for (int i = 0; i < tx.getNumTxIn(); ++i) { + const auto& in = tx.getTxInCopy(i); + const OutPoint op = in.getOutPoint(); + inHashes.insert(op.getTxHash()); + } + result.emplace_back(std::move(tx)); + } + const auto& itExpTxAddr = expTxAddrReqs_.find(msgId); + if (itExpTxAddr != expTxAddrReqs_.end()) { + ArmoryMessage msg; + auto msgReq = msg.mutable_get_txs_by_hash(); + for (const auto& inHash : inHashes) { + msgReq->add_tx_hashes(inHash.toBinStr()); + } + expTxAddrReqs_.erase(itExpTxAddr); + expTxByAddrModel_->setDetails(result); + const auto msgIdReq = pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + expTxAddrInReqs_.insert(msgIdReq); + } + const auto& itExpTxAddrIn = expTxAddrInReqs_.find(msgId); + if (itExpTxAddrIn != expTxAddrInReqs_.end()) { + expTxAddrInReqs_.erase(itExpTxAddrIn); + expTxByAddrModel_->setInputs(result); + } + return bs::message::ProcessingResult::Success; +} + ProcessingResult QtQuickAdapter::processReservedUTXOs(const WalletsMessage_ReservedUTXOs& response) { std::vector utxos; @@ -1287,7 +1357,6 @@ int QtQuickAdapter::startSearch(const QString& s) if (trimmed.length() == 64) { // potential TX hash in hex const auto& txId = BinaryData::CreateFromHex(trimmed); if (txId.getSize() == 32) { // valid TXid - //TODO: send request to BA return 2; } } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 7afc36bac..f1d638c68 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -33,6 +33,7 @@ namespace BlockSettle { namespace Common { class ArmoryMessage_AddressHistory; class ArmoryMessage_FeeLevelsResponse; + class ArmoryMessage_Transactions; class ArmoryMessage_ZCInvalidated; class ArmoryMessage_ZCReceived; class LedgerEntries; @@ -72,6 +73,7 @@ namespace BlockSettle { class BSTerminalSplashScreen; class QQmlContext; class QmlWalletsList; +class QTxDetails; class QTXSignRequest; class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoopRuner @@ -157,6 +159,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop , double amount, double fee, const QString& comment); Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); Q_INVOKABLE int startSearch(const QString&); + Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); signals: void walletsListChanged(); @@ -188,7 +191,7 @@ private slots: std::string hdWalletIdByIndex(int); void processWalletLoaded(const bs::sync::WalletInfo &); - bs::message::ProcessingResult processWalletData(const uint64_t msgId + bs::message::ProcessingResult processWalletData(const bs::message::SeqId , const BlockSettle::Common::WalletsMessage_WalletData&); bs::message::ProcessingResult processWalletBalances(const BlockSettle::Common::WalletsMessage_WalletBalances &); bs::message::ProcessingResult processTXDetails(bs::message::SeqId, const BlockSettle::Common::WalletsMessage_TXDetailsResponse &); @@ -200,6 +203,7 @@ private slots: bs::message::ProcessingResult processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse&); bs::message::ProcessingResult processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived&); bs::message::ProcessingResult processZCInvalidated(const BlockSettle::Common::ArmoryMessage_ZCInvalidated&); + bs::message::ProcessingResult processTransactions(bs::message::SeqId, const BlockSettle::Common::ArmoryMessage_Transactions&); bs::message::ProcessingResult processReservedUTXOs(const BlockSettle::Common::WalletsMessage_ReservedUTXOs&); void processWalletAddresses(const std::vector&); bs::message::ProcessingResult processTxResponse(bs::message::SeqId @@ -246,7 +250,9 @@ private slots: bs::Address generatedAddress_; std::map txReqs_; + std::map txDetailReqs_; std::map settingsCache_; + std::set expTxAddrReqs_, expTxAddrInReqs_; }; #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 1db7ee1bd..5ae397f84 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -27,6 +27,13 @@ namespace { {TxListForAddr::ColorRole, "dataColor"}, {TxListForAddr::WidthRole, "colWidth"}, }; + static const QHash kTxInOutRoles{ + {TxInOutModel::TableDataRole, "tableData"}, + {TxInOutModel::HeadingRole, "heading"}, + {TxInOutModel::ColorRole, "dataColor"}, + {TxInOutModel::WidthRole, "colWidth"}, + {TxInOutModel::AddressRole, "address"}, + }; } TxListModel::TxListModel(const std::shared_ptr& logger, QObject* parent) @@ -414,7 +421,22 @@ int64_t TxListForAddr::totalFees(int row) const { const auto& itTxDet = txs_.find(row); if (itTxDet != txs_.end()) { - return itTxDet->second.getNumTxOut(); + int64_t txValue = 0; + for (int i = 0; i < itTxDet->second.getNumTxIn(); ++i) { + const auto& in = itTxDet->second.getTxInCopy(i); + const OutPoint op = in.getOutPoint(); + const auto& itInput = inputs_.find(op.getTxHash()); + if (itInput == inputs_.end()) { + return -1; + } + const auto& prevOut = itInput->second.getTxOutCopy(op.getTxOutIndex()); + txValue += prevOut.getValue(); + } + for (int i = 0; i < itTxDet->second.getNumTxOut(); ++i) { + const auto& out = itTxDet->second.getTxOutCopy(i); + txValue -= out.getValue(); + } + return txValue; } return -1; } @@ -442,15 +464,15 @@ QColor TxListForAddr::dataColor(int row, int col) const float TxListForAddr::colWidth(int col) const { // width ratio, sum should give columnCount() as a result switch (col) { - case 0: return 1.5; - case 1: return 4.0; + case 0: return 1.6; + case 1: return 3.7; case 2: return 0.5; case 3: return 0.4; case 4: return 0.4; case 5: return 0.8; case 6: return 0.8; - case 7: return 0.3; - case 8: return 0.3; + case 7: return 0.4; + case 8: return 0.4; default: break; } return 1.0; @@ -513,6 +535,7 @@ void TxListForAddr::setDetails(const std::vector& txs) for (int i = 0; i < data_.size(); ++i) { const auto& entry = data_.at(i); if (entry.txHash == tx.getThisHash()) { + txs_[i] = tx; if (!rowStart) { rowStart = i + 1; } @@ -527,6 +550,14 @@ void TxListForAddr::setDetails(const std::vector& txs) } } +void TxListForAddr::setInputs(const std::vector& txs) +{ + for (const auto& tx : txs) { + inputs_[tx.getThisHash()] = tx; + } + emit dataChanged(createIndex(1, 6), createIndex(data_.size(), 7)); +} + void TxListForAddr::setCurrentBlock(uint32_t nbBlock) { if (!nbBlock) { @@ -574,3 +605,198 @@ QString TxListForAddr::balance() const } return displayBTC(result / BTCNumericTypes::BalanceDivider); } + + +void QTxDetails::setDetails(const bs::sync::TXWalletDetails& details) +{ + details_ = details; + QMetaObject::invokeMethod(this, [this] { + inputsModel_ = new TxInOutModel(details_.inputAddresses, this); + outputsModel_ = new TxInOutModel(details_.outputAddresses, this); + emit updated(); + }); +} + +void QTxDetails::setCurBlock(uint32_t curBlock) +{ + if (curBlock_ != curBlock) { + curBlock_ = curBlock; + QMetaObject::invokeMethod(this, [this] { + emit newBlock(); + }); + } +} + +QString QTxDetails::virtSize() const +{ + return displayNb(details_.tx.getTxWeight()); +} + +QString QTxDetails::nbConf() const +{ + const int txHeight = details_.tx.getTxHeight(); + return displayNb((txHeight > 0) ? curBlock_ - txHeight + 1 : txHeight); +} + +QString QTxDetails::nbInputs() const +{ + return displayNb(details_.tx.getNumTxIn()); +} + +QString QTxDetails::nbOutputs() const +{ + return displayNb(details_.tx.getNumTxOut()); +} + +QString QTxDetails::inputAmount() const +{ + uint64_t amount = 0; + for (const auto& in : details_.inputAddresses) { + amount += in.value; + } + return displayBTC(amount / BTCNumericTypes::BalanceDivider); +} + +QString QTxDetails::outputAmount() const +{ + uint64_t amount = 0; + for (const auto& out : details_.outputAddresses) { + amount += out.value; + } + return displayBTC(amount / BTCNumericTypes::BalanceDivider); +} + +QString QTxDetails::fee() const +{ + int64_t amount = 0; + for (const auto& in : details_.inputAddresses) { + amount += in.value; + } + for (const auto& out : details_.outputAddresses) { + amount -= out.value; + } + return displayBTC(amount / BTCNumericTypes::BalanceDivider); +} + +QString QTxDetails::feePerByte() const +{ + int64_t amount = 0; + for (const auto& in : details_.inputAddresses) { + amount += in.value; + } + for (const auto& out : details_.outputAddresses) { + amount -= out.value; + } + int txWeight = details_.tx.getTxWeight(); + if (!txWeight) { + txWeight = -1; + } + return displayBTC(amount / txWeight, 1); +} + +TxInOutModel::TxInOutModel(const std::vector& data, QObject* parent) + : QAbstractTableModel(parent), data_(data) + , header_{ {}, tr("Address"), tr("Amount"), tr("Wallet") } +{} + +int TxInOutModel::rowCount(const QModelIndex&) const +{ + return data_.size() * 2 + 1; +} + +int TxInOutModel::columnCount(const QModelIndex&) const +{ + return header_.size(); +} + +QVariant TxInOutModel::data(const QModelIndex& index, int role) const +{ + if (index.column() >= header_.size()) { + return {}; + } + switch (role) { + case TableDataRole: + return getData(index.row(), index.column()); + case HeadingRole: + return (index.row() == 0); + case ColorRole: + return dataColor(index.row(), index.column()); + case WidthRole: + return colWidth(index.column()); + case AddressRole: + try { + return QString::fromStdString(data_.at((index.row() - 1) / 2).address.display()); + } + catch (const std::exception&) { return {}; } + default: break; + } + return {}; +} + +QHash TxInOutModel::roleNames() const +{ + return kTxInOutRoles; +} + +QString TxInOutModel::getData(int row, int col) const +{ + if (row > (data_.size() * 2)) { + return {}; + } + if (row == 0) { + return header_.at(col); + } + try { + switch (col) { + case 0: + if ((row % 2) == 1) { + return tr("Ad.:"); + } + else { + return tr("Tx.:"); + } + case 1: + if ((row % 2) == 1) { + return QString::fromStdString(data_.at((row - 1) / 2).address.display()); + } + else { + return QString::fromStdString(data_.at((row - 1) / 2).outHash.toHexStr(true)); + } + case 2: + if ((row % 2) == 1) { + return QString::fromStdString(data_.at((row - 1) / 2).valueStr); + } + break; + case 3: + if ((row % 2) == 1) { + return QString::fromStdString(data_.at((row - 1) / 2).walletName); + } + break; + default: break; + } + } + catch (const std::exception&) { + return {}; + } + return {}; +} + +QColor TxInOutModel::dataColor(int row, int col) const +{ + if ((row == 0) || (col == 0)) { + return QColorConstants::DarkGray; + } + return QColorConstants::LightGray; +} + +float TxInOutModel::colWidth(int col) const +{ + switch (col) { + case 0: return 0.3; + case 1: return 2.5; + case 2: return 0.6; + case 3: return 0.6; + default: break; + } + return 1.0; +} diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 5d1c29d6d..a87749ffd 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -82,6 +82,7 @@ class TxListForAddr : public QAbstractTableModel void addRows(const std::vector&); void clear(); void setDetails(const std::vector&); + void setInputs(const std::vector&); void setCurrentBlock(uint32_t); Q_PROPERTY(QString totalReceived READ totalReceived NOTIFY changed) @@ -111,7 +112,80 @@ class TxListForAddr : public QAbstractTableModel const QStringList header_; std::vector data_; std::map txs_; + std::map inputs_; uint32_t curBlock_; }; + +class TxInOutModel : public QAbstractTableModel +{ + Q_OBJECT +public: + enum TableRoles { + TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole, WidthRole, AddressRole + }; + TxInOutModel(const std::vector& data, QObject* parent = nullptr); + + int rowCount(const QModelIndex & = QModelIndex()) const override; + int columnCount(const QModelIndex & = QModelIndex()) const override; + QVariant data(const QModelIndex& index, int role) const override; + QHash roleNames() const override; + +private: + QString getData(int row, int col) const; + QColor dataColor(int row, int col) const; + float colWidth(int col) const; + +private: + const QStringList header_; + const std::vector data_; +}; + +class QTxDetails : public QObject +{ + Q_OBJECT +public: + QTxDetails(const BinaryData& txHash, QObject* parent = nullptr) + : QObject(parent), txHash_(txHash) + {} + + void setDetails(const bs::sync::TXWalletDetails&); + void setCurBlock(uint32_t); + + Q_PROPERTY(QString txId READ txId NOTIFY updated) + QString txId() const { return QString::fromStdString(txHash_.toHexStr(true)); } + Q_PROPERTY(QString virtSize READ virtSize NOTIFY updated) + QString virtSize() const; + Q_PROPERTY(QString nbConf READ nbConf NOTIFY newBlock) + QString nbConf() const; + Q_PROPERTY(QString nbInputs READ nbInputs NOTIFY updated) + QString nbInputs() const; + Q_PROPERTY(QString nbOutputs READ nbOutputs NOTIFY updated) + QString nbOutputs() const; + Q_PROPERTY(QString inputAmount READ inputAmount NOTIFY updated) + QString inputAmount() const; + Q_PROPERTY(QString outputAmount READ outputAmount NOTIFY updated) + QString outputAmount() const; + Q_PROPERTY(QString fee READ fee NOTIFY updated) + QString fee() const; + Q_PROPERTY(QString feePerByte READ feePerByte NOTIFY updated) + QString feePerByte() const; + + Q_PROPERTY(TxInOutModel* inputs READ inputs NOTIFY updated) + TxInOutModel* inputs() const { return inputsModel_; } + Q_PROPERTY(TxInOutModel* outputs READ outputs NOTIFY updated) + TxInOutModel* outputs() const { return outputsModel_; } + +signals: + void updated(); + void newBlock(); + +private: + const BinaryData txHash_; + bs::sync::TXWalletDetails details_; + TxInOutModel* inputsModel_{ nullptr }; + TxInOutModel* outputsModel_{ nullptr }; + uint32_t curBlock_{ 0 }; +}; + #endif // TX_LIST_MODEL_H diff --git a/GUI/QtQuick/qml/ExplorerAddress.qml b/GUI/QtQuick/qml/ExplorerAddress.qml index e9e8af700..caec94e0e 100644 --- a/GUI/QtQuick/qml/ExplorerAddress.qml +++ b/GUI/QtQuick/qml/ExplorerAddress.qml @@ -97,6 +97,7 @@ Item { text: qsTr("Transactions") font.pointSize: 14 } + TableView { width: 1008 height: 450 @@ -123,8 +124,7 @@ Item { anchors.fill: parent onClicked: { if (!heading && (model.column === 1)) { - explorerTX.txId = tableData - bsApp.startSearch(explorerTX.txId) + explorerTX.tx = bsApp.getTXDetails(tableData) explorerStack.push(explorerTX) } } diff --git a/GUI/QtQuick/qml/ExplorerLoader.qml b/GUI/QtQuick/qml/ExplorerLoader.qml new file mode 100644 index 000000000..9012193c5 --- /dev/null +++ b/GUI/QtQuick/qml/ExplorerLoader.qml @@ -0,0 +1,21 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.12 + +Loader { + id: page + + function loadTX(tx) { + page.source = "" + page.source = Qt.resolvedUrl("ExplorerTX.qml") + page.item.tx = tx + } +} diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml index 855dec39c..a3e5dd5d0 100644 --- a/GUI/QtQuick/qml/ExplorerPage.qml +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -36,6 +36,9 @@ Item { id: explorerTX visible: false } +// ExplorerLoader { +// id: explorerTX +// } Column { spacing: 32 @@ -61,6 +64,7 @@ Item { explorerStack.push(explorerAddress) } else if (rc === 2) { // TXid entered + explorerTX.tx = bsApp.getTXDetails(expSearchBox.text) explorerStack.push(explorerTX) } } @@ -70,7 +74,7 @@ Item { Text { text: qsTr("Search for transaction or address") color: 'darkgrey' - visible: !txSearchBox.text && !txSearchBox.activeFocus + visible: !expSearchBox.text && !expSearchBox.activeFocus } } Button { diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index fcc18b35c..3ca368495 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -20,7 +20,13 @@ import "BsStyles" //import "js/helper.js" as JsHelper Item { - property var txId + property var tx + property var expAddress + + Component.onCompleted: { + expAddress = Qt.createComponent("ExplorerAddress.qml") + expAddress.visible = false + } Column { spacing: 23 @@ -38,7 +44,7 @@ Item { font.pointSize: 14 } Label { - text: txId + text: tx ? tx.txId : qsTr("Unknown") color: 'lightgrey' font.pointSize: 12 } @@ -46,7 +52,7 @@ Item { text: qsTr("Copy") font.pointSize: 12 onClicked: { - bsApp.copyAddressToClipboard(txId) + bsApp.copyAddressToClipboard(tx.txId) } } } @@ -58,7 +64,7 @@ Item { font.pointSize: 8 } Label { - text: qsTr("283") + text: qsTr("%1").arg(tx.nbConf) font.pointSize: 12 } } @@ -68,7 +74,7 @@ Item { font.pointSize: 8 } Label { - text: qsTr("1") + text: qsTr("%1").arg(tx.nbInputs) font.pointSize: 12 } } @@ -78,7 +84,7 @@ Item { font.pointSize: 8 } Label { - text: qsTr("2") + text: qsTr("%1").arg(tx.nbOutputs) font.pointSize: 12 } } @@ -88,7 +94,7 @@ Item { font.pointSize: 8 } Label { - text: qsTr("0.01959741") + text: qsTr("%1").arg(tx.inputAmount) font.pointSize: 12 } } @@ -98,7 +104,7 @@ Item { font.pointSize: 8 } Label { - text: qsTr("0.01959741") + text: qsTr("%1").arg(tx.outputAmount) font.pointSize: 12 } } @@ -108,7 +114,7 @@ Item { font.pointSize: 8 } Label { - text: qsTr("0.00000146") + text: qsTr("%1").arg(tx.fee) font.pointSize: 12 } } @@ -118,7 +124,7 @@ Item { font.pointSize: 8 } Label { - text: qsTr("1") + text: qsTr("%1").arg(tx.feePerByte) font.pointSize: 12 } } @@ -128,7 +134,7 @@ Item { font.pointSize: 8 } Label { - text: qsTr("141") + text: qsTr("%1").arg(tx.virtSize) font.pointSize: 12 } } @@ -140,6 +146,7 @@ Item { text: qsTr("Input") font.pointSize: 14 } + TableView { width: 500 height: 300 @@ -148,25 +155,26 @@ Item { clip: true ScrollIndicator.horizontal: ScrollIndicator { } ScrollIndicator.vertical: ScrollIndicator { } - model: addressListModel + model: tx ? tx.inputs : addressListModel delegate: Rectangle { - implicitWidth: 120 - implicitHeight: 40 + implicitWidth: 125 * colWidth + implicitHeight: 20 border.color: "black" border.width: 1 color: heading ? 'black' : 'darkslategrey' Text { - text: tabledata + text: tableData font.pointSize: heading ? 8 : 10 - color: heading ? 'darkgrey' : 'lightgrey' + color: dataColor anchors.centerIn: parent } MouseArea { anchors.fill: parent onClicked: { - if (!heading && (model.column === 0)) { - isTXSearch = false - isAddressSearch = true + if (!heading && (model.column === 1)) { + expAddress.address = address + bsApp.startSearch(address) + explorerStack.push(expAddress) } } } @@ -186,23 +194,27 @@ Item { clip: true ScrollIndicator.horizontal: ScrollIndicator { } ScrollIndicator.vertical: ScrollIndicator { } - model: addressListModel + model: tx ? tx.outputs : addressListModel delegate: Rectangle { - implicitWidth: 120 - implicitHeight: 40 + implicitWidth: 125 * colWidth + implicitHeight: 20 border.color: "black" border.width: 1 color: heading ? 'black' : 'darkslategrey' Text { - text: tabledata + text: tableData font.pointSize: heading ? 8 : 10 - color: heading ? 'darkgrey' : 'lightgrey' + color: dataColor anchors.centerIn: parent } MouseArea { anchors.fill: parent onClicked: { - if (!heading && (model.column === 0)) { + if (!heading && (model.column === 1)) { + visible = false + expAddress.address = address + bsApp.startSearch(address) + explorerStack.push(expAddress) } } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 55316d9d1..61a270506 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -19,6 +19,7 @@ qml/ExplorerEmpty.qml qml/ExplorerAddress.qml qml/ExplorerTX.qml + qml/ExplorerLoader.qml qml/SendPage.qml qml/SendAdvanced.qml qml/ReceivePage.qml diff --git a/common b/common index a979fa35f..c7935a877 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit a979fa35f130bf1e6080568dc2a1c58baa60a7c6 +Subproject commit c7935a877a18b65df6bc84ab994d074348585d92 From 333683dd3e9ed3d7623eba66fcbfafc091939703 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 23 Dec 2022 00:30:36 +0300 Subject: [PATCH 012/436] Advanced TX inputs and outputs models --- GUI/QtQuick/QTXSignRequest.h | 13 -- GUI/QtQuick/QtQuickAdapter.cpp | 28 ++- GUI/QtQuick/QtQuickAdapter.h | 8 +- GUI/QtQuick/TxInputsModel.cpp | 361 +++++++++++++++++++++++++++++++ GUI/QtQuick/TxInputsModel.h | 113 ++++++++++ GUI/QtQuick/TxOutputsModel.cpp | 132 +++++++++++ GUI/QtQuick/TxOutputsModel.h | 65 ++++++ GUI/QtQuick/qml/SendAdvanced.qml | 59 +++-- GUI/QtQuick/qml/SendPage.qml | 13 +- common | 2 +- 10 files changed, 753 insertions(+), 41 deletions(-) create mode 100644 GUI/QtQuick/TxInputsModel.cpp create mode 100644 GUI/QtQuick/TxInputsModel.h create mode 100644 GUI/QtQuick/TxOutputsModel.cpp create mode 100644 GUI/QtQuick/TxOutputsModel.h diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h index 4bec621c6..1677c3b58 100644 --- a/GUI/QtQuick/QTXSignRequest.h +++ b/GUI/QtQuick/QTXSignRequest.h @@ -63,17 +63,4 @@ class QTXSignRequest : public QObject QString error_; }; - -class QUTXO : public QObject -{ - Q_OBJECT -public: - QUTXO(const UTXO& utxo, QObject* parent = nullptr) - : QObject(parent), utxo_(utxo) {} - UTXO utxo() const { return utxo_; } - -private: - const UTXO utxo_; -}; - #endif // Q_TX_SIGN_REQUEST_H diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 876b21916..d27e75046 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -32,6 +32,7 @@ #include "BSMessageBox.h" #include "BSTerminalSplashScreen.h" #include "QTXSignRequest.h" +#include "TxOutputsModel.h" #include "Wallets/ProtobufHeadlessUtils.h" #include "SettingsAdapter.h" @@ -106,6 +107,8 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) pendingTxModel_ = new TxListModel(logger, this); txModel_ = new TxListModel(logger, this); expTxByAddrModel_ = new TxListForAddr(logger, this); + txOutputsModel_ = new TxOutputsModel(logger, this); + txInputsModel_ = new TxInputsModel(logger, txOutputsModel_, this); } QtQuickAdapter::~QtQuickAdapter() @@ -177,8 +180,10 @@ void QtQuickAdapter::run(int &argc, char **argv) }); logger_->debug("[QtGuiAdapter::run] creating QML app"); + qmlRegisterInterface("QObjectList"); qmlRegisterInterface("QTXSignRequest"); qmlRegisterInterface("QUTXO"); + qmlRegisterInterface("QUTXOList"); qmlRegisterInterface("QTxDetails"); QQmlApplicationEngine engine; @@ -191,6 +196,8 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("pendingTxListModel"), pendingTxModel_); rootCtxt_->setContextProperty(QLatin1Literal("txListModel"), txModel_); rootCtxt_->setContextProperty(QLatin1Literal("txListByAddrModel"), expTxByAddrModel_); + rootCtxt_->setContextProperty(QLatin1Literal("txInputsModel"), txInputsModel_); + rootCtxt_->setContextProperty(QLatin1Literal("txOutputsModel"), txOutputsModel_); engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); if (engine.rootObjects().empty()) { @@ -1021,8 +1028,8 @@ void QtQuickAdapter::copyAddressToClipboard(const QString& addr) } } -QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex - , const QString& recvAddr, double amount, double fee, const QString& comment) +QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QString& recvAddr + , double amount, double fee, const QString& comment, QUTXOList* utxos) { WalletsMessage msg; auto msgReq = msg.mutable_tx_request(); @@ -1034,12 +1041,27 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex if (!comment.isEmpty()) { msgReq->set_comment(comment.toStdString()); } + if (utxos) { + for (const auto& qUtxo : utxos->data()) { + msgReq->add_utxos(qUtxo->utxo().serialize().toBinStr()); + } + } const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); const auto txReq = new QTXSignRequest(this); txReqs_[msgId] = txReq; return txReq; } +void QtQuickAdapter::getUTXOsForWallet(int walletIndex) +{ + logger_->debug("[{}] #{}", __func__, walletIndex); + txInputsModel_->clear(); + WalletsMessage msg; + auto msgReq = msg.mutable_get_utxos(); + msgReq->set_wallet_id(hdWalletIdByIndex(walletIndex)); + pushRequest(user_, userWallets_, msg.SerializeAsString()); +} + QTxDetails* QtQuickAdapter::getTXDetails(const QString& txHash) { auto txBinHash = BinaryData::CreateFromHex(txHash.trimmed().toStdString()); @@ -1128,7 +1150,7 @@ ProcessingResult QtQuickAdapter::processUTXOs(const WalletsMessage_UtxoListRespo utxo.unserialize(BinaryData::fromString(serUtxo)); utxos.push_back(std::move(utxo)); } - //TODO + txInputsModel_->addUTXOs(utxos); return ProcessingResult::Success; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index f1d638c68..417b335fb 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -19,6 +19,7 @@ #include "ApplicationSettings.h" #include "Wallets/SignContainer.h" #include "ThreadSafeClasses.h" +#include "TxInputsModel.h" #include "TxListModel.h" #include "UiUtils.h" @@ -75,6 +76,8 @@ class QQmlContext; class QmlWalletsList; class QTxDetails; class QTXSignRequest; +class TxInputsModel; +class TxOutputsModel; class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoopRuner { @@ -156,7 +159,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void copyAddressToClipboard(const QString& addr); Q_INVOKABLE QTXSignRequest* createTXSignRequest(int walletIndex, const QString& recvAddr - , double amount, double fee, const QString& comment); + , double amount, double fee, const QString& comment = {}, QUTXOList* utxos = nullptr); + Q_INVOKABLE void getUTXOsForWallet(int walletIndex); Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); Q_INVOKABLE int startSearch(const QString&); Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); @@ -247,6 +251,8 @@ private slots: TxListModel* pendingTxModel_{ nullptr }; TxListModel* txModel_{ nullptr }; TxListForAddr* expTxByAddrModel_{ nullptr }; + TxInputsModel* txInputsModel_{ nullptr }; + TxOutputsModel* txOutputsModel_{ nullptr }; bs::Address generatedAddress_; std::map txReqs_; diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp new file mode 100644 index 000000000..a69c50c9f --- /dev/null +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -0,0 +1,361 @@ +/* + +*********************************************************************************** +* Copyright (C) 2020 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "TxInputsModel.h" +#include +#include "Address.h" +#include "BTCNumericTypes.h" +#include "TxOutputsModel.h" + +namespace { + static const QHash kRoles{ + {TxInputsModel::TableDataRole, "tableData"}, + {TxInputsModel::HeadingRole, "heading"}, + {TxInputsModel::WidthRole, "colWidth"}, + {TxInputsModel::ColorRole, "dataColor"}, + {TxInputsModel::BgColorRole, "bgColor"}, + }; +} + +TxInputsModel::TxInputsModel(const std::shared_ptr& logger + , TxOutputsModel* outs, QObject* parent) + : QAbstractTableModel(parent), logger_(logger), outsModel_(outs) + , header_{ {}, tr("Address/Hash"), tr("#Tx"), tr("Balance (BTC)"), tr("Comment") } +{ } + +int TxInputsModel::rowCount(const QModelIndex &) const +{ + return data_.size() + 1; +} + +int TxInputsModel::columnCount(const QModelIndex &) const +{ + return header_.size(); +} + +QVariant TxInputsModel::data(const QModelIndex& index, int role) const +{ + switch (role) { + case TableDataRole: + return getData(index.row(), index.column()); + case HeadingRole: + return (index.row() == 0); + case WidthRole: + return colWidth(index.column()); + case ColorRole: + return dataColor(index.row(), index.column()); + case BgColorRole: + return bgColor(index.row()); + default: break; + } + return QVariant(); +} + +QHash TxInputsModel::roleNames() const +{ + return kRoles; +} + +void TxInputsModel::clear() +{ + beginResetModel(); + utxos_.clear(); + data_.clear(); + selection_.clear(); + preSelected_.clear(); + endResetModel(); +} + +void TxInputsModel::addUTXOs(const std::vector& utxos) +{ + for (const auto& utxo : utxos) { + try { + const auto& addr = bs::Address::fromUTXO(utxo); + utxos_[addr].push_back(utxo); + int addrIndex = -1; + for (int i = 0; i < data_.size(); ++i) { + if (data_.at(i).address == addr) { + addrIndex = i; + break; + } + } + if (addrIndex < 0) { + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + data_.push_back({ addr }); + endInsertRows(); + } + else { + if (data_.at(addrIndex).expanded) { + beginInsertRows(QModelIndex(), addrIndex + 2, addrIndex + 2); + data_.insert(data_.cbegin() + addrIndex + 1, { {}, utxo.getTxHash(), utxo.getTxOutIndex() }); + endInsertRows(); + } + } + } + catch (const std::exception&) { + continue; + } + } +} + +void TxInputsModel::toggle(int row) +{ + --row; + auto& entry = data_[row]; + if (!entry.txId.empty()) { + return; + } + const auto& it = utxos_.find(entry.address); + if (it == utxos_.end()) { + return; + } + const auto& changeSelection = [this](const std::map& selChanges) + { + for (const auto& idx : selChanges) { + selection_.erase(idx.first); + if (idx.second >= 0) { + selection_.insert(idx.second); + } + } + }; + std::map selChanges; + if (entry.expanded) { + entry.expanded = false; + for (const auto& sel : selection_) { + if (sel > row) { + if (sel <= (row + it->second.size())) { + selChanges[sel] = -1; + } + else { + selChanges[sel] = sel - it->second.size(); + } + } + } + beginRemoveRows(QModelIndex(), row + 2, row + it->second.size() + 1); + changeSelection(selChanges); + data_.erase(data_.cbegin() + row + 1, data_.cbegin() + row + it->second.size()); + endRemoveRows(); + } + else { + entry.expanded = true; + for (const auto& sel : selection_) { + if (sel == row) { + selChanges[sel] = -1; + } + else if (sel > row) { + selChanges[sel] = sel + it->second.size(); + } + } + std::vector entries; + for (const auto& utxo : it->second) { + entries.push_back({ {}, utxo.getTxHash(), utxo.getTxOutIndex()}); + } + beginInsertRows(QModelIndex(), row + 2, row + it->second.size() + 1); + changeSelection(selChanges); + data_.insert(data_.cbegin() + row + 1, entries.cbegin(), entries.cend()); + endInsertRows(); + emit dataChanged(createIndex(row + 1, 0), createIndex(row + 1, columnCount() - 1), { BgColorRole }); + } +} + +void TxInputsModel::toggleSelection(int row) +{ + --row; + if (data_.at(row).expanded) { + return; + } + const auto& entry = data_.at(row); + const auto& itAddr = utxos_.find(entry.address); + UTXO utxo{}; + if (itAddr == utxos_.end()) { + bool found = false; + for (const auto& byAddr : utxos_) { + for (const auto& u : byAddr.second) { + if ((u.getTxHash() == entry.txId) && (u.getTxOutIndex() == entry.txOutIndex)) { + utxo = u; + found = true; + break; + } + } + if (found) { + break; + } + } + } + if (selection_.find(row) == selection_.end()) { + selection_.insert(row); + if (!entry.txId.empty()) { + nbTx_++; + selectedBalance_ += utxo.getValue(); + } + else { + if (itAddr != utxos_.end()) { + nbTx_ += itAddr->second.size(); + for (const auto& utxo : itAddr->second) { + selectedBalance_ += utxo.getValue(); + } + } + } + } + else { + selection_.erase(row); + if (!entry.txId.empty()) { + nbTx_--; + selectedBalance_ -= utxo.getValue(); + } + else { + if (itAddr != utxos_.end()) { + nbTx_ -= itAddr->second.size(); + for (const auto& utxo : itAddr->second) { + selectedBalance_ -= utxo.getValue(); + } + } + } + } + emit selectionChanged(); + emit dataChanged(createIndex(row + 1, 0), createIndex(row + 1, columnCount() - 1)); +} + +QUTXOList* TxInputsModel::getSelection() +{ + QList result; + const double amount = outsModel_ ? outsModel_->totalAmount() : 0; + logger_->debug("[{}] total amount: {}", __func__, amount); + if (amount > 0) { // auto selection + const auto& it = preSelected_.find((int)std::floor(amount * BTCNumericTypes::BalanceDivider)); + if (it != preSelected_.end()) { + return new QUTXOList(it->second, (QObject*)this); + } + std::vector allUTXOs; + for (const auto& byAddr : utxos_) { + allUTXOs.insert(allUTXOs.cend(), byAddr.second.cbegin(), byAddr.second.cend()); + } + //TODO: select and save + nbTx_ = result.size(); + selectedBalance_ = 0; + for (const auto& qUtxo : result) { + selectedBalance_ += qUtxo->utxo().getValue(); + } + preSelected_[(int)std::floor(amount * BTCNumericTypes::BalanceDivider)] = result; + } + else { + for (const int idx : selection_) { + const auto& entry = data_.at(idx); + if (!entry.txId.empty()) { + bool added = false; + for (const auto& byAddr : utxos_) { + for (const auto& utxo : byAddr.second) { + if ((entry.txId == utxo.getTxHash()) && (entry.txOutIndex == utxo.getTxOutIndex())) { + result.push_back(new QUTXO(utxo, (QObject*)this)); + added = true; + break; + } + } + if (added) { + break; + } + } + } + else { + selectedBalance_ = 0; + const auto& itUTXO = utxos_.find(entry.address); + if (itUTXO != utxos_.end()) { + for (const auto& utxo : itUTXO->second) { + selectedBalance_ += utxo.getValue(); + result.push_back(new QUTXO(utxo, (QObject*)this)); + } + } + nbTx_ = result.size(); + preSelected_[0] = result; + } + } + } + emit selectionChanged(); + return new QUTXOList(result, (QObject*)this); +} + +QVariant TxInputsModel::getData(int row, int col) const +{ + if (row == 0) { + return header_.at(col); + } + const auto& entry = data_.at(row - 1); + const auto& itUTXOs = entry.address.empty() ? utxos_.end() : utxos_.find(entry.address); + switch (col) { + case 0: + return (selection_.find(row -1) != selection_.end()); + case 1: + if (!entry.txId.empty()) { + const auto& txId = entry.txId.toHexStr(true); + std::string str = " " + txId.substr(0, 8) + "..." + txId.substr(txId.size() - 9, 8); + return QString::fromStdString(str); + } + else { + return QString::fromStdString(entry.address.display()); + } + case 2: + if (itUTXOs != utxos_.end()) { + return QString::number(itUTXOs->second.size()); + } + break; + case 3: + if (itUTXOs != utxos_.end()) { + uint64_t balance = 0; + for (const auto& utxo : itUTXOs->second) { + balance += utxo.getValue(); + } + return QString::number(balance / BTCNumericTypes::BalanceDivider, 'f', 8); + } + else { + for (const auto& byAddr : utxos_) { + for (const auto& utxo : byAddr.second) { + if ((entry.txId == utxo.getTxHash()) && (entry.txOutIndex == utxo.getTxOutIndex())) { + return QString::number(utxo.getValue() / BTCNumericTypes::BalanceDivider, 'f', 8); + } + } + } + } + break; + default: break; + } + return {}; +} + +QColor TxInputsModel::dataColor(int row, int col) const +{ + if (row == 0) { + return QColorConstants::DarkGray; + } + return QColorConstants::LightGray; +} + +QColor TxInputsModel::bgColor(int row) const +{ + if (row == 0) { + return QColorConstants::Black; + } + if (selection_.find(row - 1) != selection_.end()) { + return QColorConstants::DarkCyan; + } + return QColorConstants::DarkBlue; +} + +float TxInputsModel::colWidth(int col) const +{ // width ratio, sum should give columnCount() as a result + switch (col) { + case 0: return 0.2; + case 1: return 2.6; + case 2: return 0.4; + case 3: return 0.8; + case 4: return 1; + default: break; + } + return 1.0; +} diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h new file mode 100644 index 000000000..dd269b71a --- /dev/null +++ b/GUI/QtQuick/TxInputsModel.h @@ -0,0 +1,113 @@ +/* + +*********************************************************************************** +* Copyright (C) 2020 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef TX_INPUTS_MODEL_H +#define TX_INPUTS_MODEL_H + +#include +#include +#include +#include +#include +#include "Address.h" +#include "BinaryData.h" +#include "TxClasses.h" + +namespace spdlog { + class logger; +} +class TxOutputsModel; + + +class QUTXO : public QObject +{ + Q_OBJECT +public: + QUTXO(const UTXO& utxo, QObject* parent = nullptr) + : QObject(parent), utxo_(utxo) {} + UTXO utxo() const { return utxo_; } + +private: + const UTXO utxo_; +}; + +class QUTXOList : public QObject +{ + Q_OBJECT +public: + QUTXOList(const QList& data, QObject* parent = nullptr) + : QObject(parent), data_(data) + {} + QList data() const { return data_; } + +private: + QList data_; +}; + +class TxInputsModel : public QAbstractTableModel +{ + Q_OBJECT +public: + enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, WidthRole + , ColorRole, BgColorRole }; + TxInputsModel(const std::shared_ptr&, TxOutputsModel*, QObject* parent = nullptr); + + int rowCount(const QModelIndex & = QModelIndex()) const override; + int columnCount(const QModelIndex & = QModelIndex()) const override; + QVariant data(const QModelIndex& index, int role) const override; + QHash roleNames() const override; + + void clear(); + void addUTXOs(const std::vector&); + + Q_PROPERTY(int nbTx READ nbTx NOTIFY selectionChanged) + int nbTx() const { return nbTx_; } + Q_PROPERTY(QString balance READ balance NOTIFY selectionChanged) + QString balance() const { return QString::number(selectedBalance_ / BTCNumericTypes::BalanceDivider, 'f', 8); } + + Q_PROPERTY(QString fee READ fee WRITE setFee NOTIFY feeChanged) + QString fee() const { return fee_; } + void setFee(const QString& fee) { fee_ = fee; emit feeChanged(); } + + Q_INVOKABLE void toggle(int row); + Q_INVOKABLE void toggleSelection(int row); + Q_INVOKABLE QUTXOList* getSelection(); + +signals: + void selectionChanged() const; + void feeChanged() const; + +private: + QVariant getData(int row, int col) const; + QColor dataColor(int row, int col) const; + QColor bgColor(int row) const; + float colWidth(int col) const; + +private: + std::shared_ptr logger_; + TxOutputsModel* outsModel_{ nullptr }; + const QStringList header_; + std::map> utxos_; + + struct Entry { + bs::Address address; + BinaryData txId{}; + uint32_t txOutIndex{ UINT32_MAX }; + bool expanded{ false }; + }; + std::vector data_; + std::set selection_; + std::map> preSelected_; + int nbTx_{ 0 }; + uint64_t selectedBalance_{ 0 }; + QString fee_; +}; + +#endif // TX_INPUTS_MODEL_H diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp new file mode 100644 index 000000000..c37dddc48 --- /dev/null +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -0,0 +1,132 @@ +/* + +*********************************************************************************** +* Copyright (C) 2020 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "TxOutputsModel.h" +#include +#include "Address.h" +#include "BTCNumericTypes.h" + +namespace { + static const QHash kRoles{ + {TxOutputsModel::TableDataRole, "tableData"}, + {TxOutputsModel::HeadingRole, "heading"}, + {TxOutputsModel::WidthRole, "colWidth"}, + {TxOutputsModel::ColorRole, "dataColor"} + }; +} + +TxOutputsModel::TxOutputsModel(const std::shared_ptr& logger, QObject* parent) + : QAbstractTableModel(parent), logger_(logger) + , header_{ tr("Output Address"), tr("Amount (BTC)"), {} } +{ } + +int TxOutputsModel::rowCount(const QModelIndex &) const +{ + return data_.size() + 1; +} + +int TxOutputsModel::columnCount(const QModelIndex &) const +{ + return header_.size(); +} + +QVariant TxOutputsModel::data(const QModelIndex& index, int role) const +{ + switch (role) { + case TableDataRole: + return getData(index.row(), index.column()); + case HeadingRole: + return (index.row() == 0); + case WidthRole: + return colWidth(index.column()); + case ColorRole: + return dataColor(index.row(), index.column()); + default: break; + } + return QVariant(); +} + +QHash TxOutputsModel::roleNames() const +{ + return kRoles; +} + +double TxOutputsModel::totalAmount() const +{ + double result = 0.0; + for (const auto& entry : data_) { + result += entry.amount; + } + return result; +} + +void TxOutputsModel::clearOutputs() +{ + beginResetModel(); + data_.clear(); + endResetModel(); +} + +void TxOutputsModel::addOutput(const QString& address, double amount) +{ + bs::Address addr; + try { + addr = bs::Address::fromAddressString(address.toStdString()); + } + catch (const std::exception&) { + return; + } + Entry entry{ addr, amount }; + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + data_.emplace_back(std::move(entry)); + endInsertRows(); +} + +void TxOutputsModel::delOutput(int row) +{ + beginRemoveRows(QModelIndex(), row, row); + data_.erase(data_.cbegin() + row - 1); + endRemoveRows(); +} + +QVariant TxOutputsModel::getData(int row, int col) const +{ + if (row == 0) { + return header_.at(col); + } + const auto& entry = data_.at(row - 1); + switch (col) { + case 0: + return QString::fromStdString(entry.address.display()); + case 1: + return QString::number(entry.amount, 'f', 8); + default: break; + } + return {}; +} + +QColor TxOutputsModel::dataColor(int row, int col) const +{ + if (row == 0) { + return QColorConstants::DarkGray; + } + return QColorConstants::LightGray; +} + +float TxOutputsModel::colWidth(int col) const +{ // width ratio, sum should give columnCount() as a result + switch (col) { + case 0: return 2.0; + case 1: return 0.5; + case 2: return 0.2; + default: break; + } + return 1.0; +} diff --git a/GUI/QtQuick/TxOutputsModel.h b/GUI/QtQuick/TxOutputsModel.h new file mode 100644 index 000000000..8a88b7c77 --- /dev/null +++ b/GUI/QtQuick/TxOutputsModel.h @@ -0,0 +1,65 @@ +/* + +*********************************************************************************** +* Copyright (C) 2020 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef TX_OUTPUTS_MODEL_H +#define TX_OUTPUTS_MODEL_H + +#include +#include +#include +#include +#include +#include "Address.h" +#include "BinaryData.h" +#include "TxClasses.h" + +namespace spdlog { + class logger; +} + +class TxOutputsModel : public QAbstractTableModel +{ + Q_OBJECT +public: + enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, WidthRole + , ColorRole }; + TxOutputsModel(const std::shared_ptr&, QObject* parent = nullptr); + + int rowCount(const QModelIndex & = QModelIndex()) const override; + int columnCount(const QModelIndex & = QModelIndex()) const override; + QVariant data(const QModelIndex& index, int role) const override; + QHash roleNames() const override; + + double totalAmount() const; + + Q_INVOKABLE void addOutput(const QString& address, double amount); + Q_INVOKABLE void delOutput(int row); + Q_INVOKABLE void clearOutputs(); + +signals: + void selectionChanged() const; + +private: + QVariant getData(int row, int col) const; + QColor dataColor(int row, int col) const; + float colWidth(int col) const; + +private: + std::shared_ptr logger_; + const QStringList header_; + + struct Entry { + bs::Address address; + double amount; + }; + std::vector data_; +}; + +#endif // TX_OUTPUTS_MODEL_H diff --git a/GUI/QtQuick/qml/SendAdvanced.qml b/GUI/QtQuick/qml/SendAdvanced.qml index 619dacf6f..97c23c829 100644 --- a/GUI/QtQuick/qml/SendAdvanced.qml +++ b/GUI/QtQuick/qml/SendAdvanced.qml @@ -20,10 +20,10 @@ import "BsStyles" //import "js/helper.js" as JsHelper Item { - property var recvAddress + property var recvAddress: "" property int walletIdx - property var sendAmount - property var comment + property var sendAmount: "" + property var comment: "" id: send VerifyAdvancedTX { @@ -60,12 +60,14 @@ Item { Row { ComboBox { id: sendWalletsComboBox - objectName: "sendWalletsComboBox" model: bsApp.walletsList currentIndex: walletIdx font.pointSize: 12 enabled: (bsApp.walletsList.length > 1) width: 350 + onCurrentIndexChanged: { + bsApp.getUTXOsForWallet(sendWalletsComboBox.currentIndex) + } } Label { text: qsTr("%1 BTC").arg(bsApp.totalBalance) @@ -76,6 +78,7 @@ Item { id: fees width: 400 height: 32 + text: txInputsModel.fee color: 'lightgrey' font.pointSize: 14 horizontalAlignment: TextEdit.AlignHCenter @@ -94,6 +97,9 @@ Item { anchors.right: parent anchors.horizontalCenter: parent } + onAccepted: { + txInputsModel.fee = text + } } Row { spacing: 23 @@ -107,16 +113,16 @@ Item { text: qsTr("Select Inputs") } Label { - text: qsTr("#Tx: 0") + text: qsTr("#Tx: %1").arg(txInputsModel.nbTx) font.pointSize: 10 } Label { - text: qsTr("Balance (BTC): %1").arg(bsApp.totalBalance) + text: qsTr("Balance (BTC): %1").arg(txInputsModel.balance) font.pointSize: 10 } } TableView { - width: 480 + width: 500 height: 250 columnSpacing: 1 rowSpacing: 1 @@ -124,24 +130,29 @@ Item { clip: true ScrollIndicator.horizontal: ScrollIndicator { } ScrollIndicator.vertical: ScrollIndicator { } - model: addressListModel + model: txInputsModel delegate: Rectangle { - implicitWidth: 120 + implicitWidth: 100 * colWidth implicitHeight: 20 border.color: "black" border.width: 1 - color: heading ? 'black' : 'darkslategrey' + color: bgColor Text { - text: tabledata + text: tableData ? tableData : "" font.pointSize: heading ? 8 : 10 - color: heading ? 'darkgrey' : 'lightgrey' + color: dataColor anchors.centerIn: parent } MouseArea { anchors.fill: parent onClicked: { if (!heading) { - //TODO: select + if (model.column === 0) { + txInputsModel.toggleSelection(model.row) + } + else if (model.column === 1) { + txInputsModel.toggle(model.row) + } } } } @@ -164,7 +175,7 @@ Item { } } TextInput { - id: outAddr0 + id: outAddr width: 400 height: 32 text: recvAddress @@ -182,7 +193,7 @@ Item { } Row { TextInput { - id: amount0 + id: amount width: 400 height: 32 text: sendAmount @@ -218,19 +229,27 @@ Item { clip: true ScrollIndicator.horizontal: ScrollIndicator { } ScrollIndicator.vertical: ScrollIndicator { } - model: addressListModel + model: txOutputsModel delegate: Rectangle { - implicitWidth: 120 + implicitWidth: 160 * colWidth implicitHeight: 20 border.color: "black" border.width: 1 color: heading ? 'black' : 'darkslategrey' Text { - text: tabledata + text: tableData ? tableData : "" font.pointSize: heading ? 8 : 10 - color: heading ? 'darkgrey' : 'lightgrey' + color: dataColor anchors.centerIn: parent } + MouseArea { + anchors.fill: parent + onClicked: { + if (!heading && (model.column === 2)) { + txOutputsModel.delOutput(model.row) + } + } + } } } } @@ -265,7 +284,7 @@ Item { verifySignTX.txSignRequest = bsApp.createTXSignRequest( sendWalletsComboBox.currentIndex, recvAddress.text, parseFloat(amount.text), parseFloat(fees.text), - txComment.text) + txComment.text, txInputsModel.getSelection()) stack.push(verifySignTX) } } diff --git a/GUI/QtQuick/qml/SendPage.qml b/GUI/QtQuick/qml/SendPage.qml index e6795e8ee..e6bed9114 100644 --- a/GUI/QtQuick/qml/SendPage.qml +++ b/GUI/QtQuick/qml/SendPage.qml @@ -51,9 +51,17 @@ Item { text: qsTr("Advanced") font.pointSize: 14 onClicked: { - advancedCreateTX.recvAddress = recvAddress.text + bsApp.getUTXOsForWallet(sendWalletsComboBox.currentIndex) + txOutputsModel.clearOutputs() + var outAmount = parseFloat(amount.text) + if ((outAmount >= 0.0000001) && (recvAddress.text.length)) { + txOutputsModel.addOutput(recvAddress.text, outAmount) + txInputsModel.getSelection() + advancedCreateTX.recvAddress = recvAddress.text + advancedCreateTX.sendAmount = amount.text + } + txInputsModel.fee = fees.text advancedCreateTX.walletIdx = sendWalletsComboBox.currentIndex - advancedCreateTX.sendAmount = amount.text advancedCreateTX.comment = txComment.text stack.push(advancedCreateTX) } @@ -110,7 +118,6 @@ Item { spacing: 23 ComboBox { id: sendWalletsComboBox - objectName: "sendWalletsComboBox" model: bsApp.walletsList currentIndex: walletsComboBox.currentIndex font.pointSize: 14 diff --git a/common b/common index c7935a877..b17f94851 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit c7935a877a18b65df6bc84ab994d074348585d92 +Subproject commit b17f94851ff6bc845f902bf6400421ebda0a4acc From 7aef5d37ee61f20689f6ce69be2589424660c358 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 23 Dec 2022 17:23:38 +0200 Subject: [PATCH 013/436] gui: new wallet: Terms and conditions, start creation --- GUI/QtQuick/TermsAndConditions.txt | 0 GUI/QtQuick/images/close_button.png | Bin 0 -> 281 bytes GUI/QtQuick/images/wallet icon.png | Bin 0 -> 2180 bytes GUI/QtQuick/qml/BsStyles/BSStyle.qml | 8 ++ GUI/QtQuick/qml/CreateWallet.qml | 118 ++++++++++++++++++ GUI/QtQuick/qml/OverviewPage.qml | 4 + GUI/QtQuick/qml/StartCreateWallet.qml | 93 ++++++++++++++ .../qml/StyledControls/CustomButton.qml | 82 +++--------- .../qml/StyledControls/CustomTitleLabel.qml | 22 ++++ .../StyledControls/CustomTitleToolButton.qml | 2 +- GUI/QtQuick/qml/TermsAndConditions.qml | 101 +++++++++++++++ GUI/QtQuick/qml/main.qml | 14 ++- GUI/QtQuick/qtquick.qrc | 7 ++ 13 files changed, 381 insertions(+), 70 deletions(-) create mode 100644 GUI/QtQuick/TermsAndConditions.txt create mode 100755 GUI/QtQuick/images/close_button.png create mode 100755 GUI/QtQuick/images/wallet icon.png create mode 100644 GUI/QtQuick/qml/CreateWallet.qml create mode 100644 GUI/QtQuick/qml/StartCreateWallet.qml create mode 100644 GUI/QtQuick/qml/StyledControls/CustomTitleLabel.qml create mode 100644 GUI/QtQuick/qml/TermsAndConditions.qml diff --git a/GUI/QtQuick/TermsAndConditions.txt b/GUI/QtQuick/TermsAndConditions.txt new file mode 100644 index 000000000..e69de29bb diff --git a/GUI/QtQuick/images/close_button.png b/GUI/QtQuick/images/close_button.png new file mode 100755 index 0000000000000000000000000000000000000000..5ffc3ce64f539804beafa3816553946a9570e589 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{yI+=$B+ufsgoayIw^9v{hf0pRBB=FD%Pso zSJ-+dO?Gj(_EAFM<7xFfr-S<}a<5lEtPps+?eV_pE;8q)hc(V#qrLZAiL+4sf!>e< zb1N?zPhx#{=+RsT^&id;@??)UEoCciRR5T8GV$#uuP=*aet0K%9^1w_o5?xICgT4( z3&wQWtF^n%r^~snwYcoaa(Ty*j3XTnDtqR!?0>McQPq*HPsNnm+as^m`j?dP235gt ZoEmX=i^C&?76V<*;OXk;vd$@?2>=ZgYB>M^ literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/wallet icon.png b/GUI/QtQuick/images/wallet icon.png new file mode 100755 index 0000000000000000000000000000000000000000..2aeae9cb4c1d05c153b444059568d490fe057ae4 GIT binary patch literal 2180 zcmZuyXE+-Q7mlD-Y3-_UiS=oWOYI#i5)wu1*&;EbD6thqjkaj335u${N30Mds*2jX zrPNh>v?{LA;$HoJ^~XKW^Pcyd_xw2L$NM}d`4$q&%6y#}006MUj14Rz-HYfUfkh+yF2D37;V3rMD=L#Wg%2 zfs+X7rFnZwTOGuQrb$|OjAES3c~>CCh4$u5bWM=BlM_45#lGKyOPAe$c^tfu;ytCR zQ;3YP!g=Y%Q1nA1%WOy)_!BR1m>g*CIKq5)j1Ca{b8K$%$>txPGO1opQr?*=N>MW@ zbB?Yor(4uszTrCY=o0x-*DY&^?}fZc`C`x*5r)(#Oi`4w7HFp|t0E8$ z>y?k|5L7hHZBB{alsImZi%nt|Rt23#N~-gc=uTl_k*2q+ox~~{js{^nvDCJ2suG`e zwvIs_y=S9?O7sLnsNvM>Ozn0T6ci=jO8-^k+Mj4r=vzZr)raqUvV`gL6JGT)Z_-Ty zMKiMHT|&zV;+6R%L#N3+fiP8lugbbA$-5B^&D{7A4(CyhI*0fMSdasxM)!}`6kNVk zos|vpwyu(mHv9U4I$_lJ0@rpxmN=-Ea{hpcl)IgQdTm9-Tv{+G1>oz~^# z{oEhzaIn190$25(V3&~)SzViNx^NAB7f*kG@bhcC5^)VCZ0XQp(XEr!NULSGoh^T* z$S}yyFH=WDlX5&y?UpQ0?s^~~Y}~e&mP@~8vH0!xVo~NYN1WDk5wh_M^BdlzXQeLE z(@G9|$}bdMIaoDx(RO8$cgfg*Rdo1%;^JC4$;{FCoe6=u1EoP;CBue+QGdy>rwPcE%Liu z-qA0b1=NWwF82Gl65eiUBqI4{uDQ}<{&*p~APdH!i~!*Ue+Gl1+%oSsKnp}(HLr+B zs0*hZTpV2eC@@>i8MPhVk(ra<{4&XQnQ?z|&DdI+*6=c602n4VInWk-y{KZx4RLxR z32&33uvj<{YvrMN{f(}jm8Q7vp0r#VURupUEq+tncguD*$opoVyy&E`3bpUwEvPYhM}6!-uqn zSm5W?bP8LEAc*)?^YgA8=!oPxj;TI@LcgRuUX*alMW$k^SaJWKRZZAbiAlaD-AFQO znD|344_Xl!z`3G1ak)Q`pc}@R^Ss=P{LW^aT=9j}#gx%?q||4lBkb=S&IE_`1!-&- z2l>eZXN9V(dd9Adm`!S{%M~{X9p$}!Y2uPKKOq{Nqr4wf?9JX(+nDUs^$I5-t*V1K zS#7hnf9p}YQK*TKNp^DW)_IRn1eK#-XW<0sY8dZ=TNvC$y_2jgVY*8x#u%EdxLNK5 zFJXVfjm3!%kWiA=;&&avJ0j=t%trDuIS+OfpjBgHuujCO3%kv zUB8EKvk%v=f7(_#n$T@(CEp}q^5eC>)!I=NbahlErIAn=?<&hMbufz1Rj;Qld1cRd zuBs#T?o2@4Qv2JE3>GDg0xKm2sB{_}Q#u<%QG05DZASQJ31o1CXhmTyCPt0K)C7uJ zeFK!d?>Ox_8uFtMl6m>CL(OwD+?Um-OT?c>%nYrdvaL?z5}!drv(1UW6rz)jv8^AX zcX*1Srh>`B!!f7PYH2xUBis8SNdxyha2jDs`$Y`Z zct*zrUV-rv6^s5ZRk3|)+%$xLDJHL#?lf91X2j+h9a@YU*|MsQ-U*_wbGX$1TSy`q(;`t@O43P#kdae)t1wU>C+5i9m literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index 326739497..7ac3864e7 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -40,6 +40,14 @@ QtObject { readonly property color buttonsPressedColor: "#55000000" readonly property color buttonsHoveredColor: "#22000000" + readonly property color buttonsStandardColor: "#3C435A" + readonly property color buttonsStandardPressedColor: "#55000000" + readonly property color buttonsStandardHoveredColor: "#22000000" + + readonly property color buttonsPreferredColor: "#45A6FF" + readonly property color buttonsPreferredPressedColor: "#55000000" + readonly property color buttonsPreferredHoveredColor: "#22000000" + readonly property color buttonsPrimaryMainColor: "#247dac" readonly property color buttonsPrimaryPressedColor: "#22C064" readonly property color buttonsPrimaryHoveredColor: "#449dcc" diff --git a/GUI/QtQuick/qml/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet.qml new file mode 100644 index 000000000..60bf94714 --- /dev/null +++ b/GUI/QtQuick/qml/CreateWallet.qml @@ -0,0 +1,118 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "BsStyles" + +Window { + id: root + visible: true + flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog + + maximumHeight: rect.height + maximumWidth: rect.width + + minimumHeight: rect.height + minimumWidth: rect.width + + objectName: "create_wallet" + + color: "transparent" + + x: mainWindow.x + (mainWindow.width - width)/2 + y: mainWindow.y + 28 + + Rectangle { + id: rect + color: "#191E2A" + opacity: 1 + radius: 16 + height: stack_create_wallet.height + 40 + width: stack_create_wallet.width + //anchors.fill: parent + border.color : "#3C435A" + border.width : 1 + + Image { + id: close_button + + anchors.top: parent.top + anchors.topMargin: 24 + anchors.right: parent.right + anchors.rightMargin: 24 + + source: "qrc:/images/close_button.png" + width: 16 + height: 16 + MouseArea { + anchors.fill: parent + onClicked: { + root.close() + stack_create_wallet.pop(null) + } + } + } + + StackView { + id: stack_create_wallet + initialItem: terms_conditions + + anchors.top: close_button.bottom + anchors.topMargin: 0 + + implicitHeight: currentItem.height + implicitWidth: currentItem.width + + pushEnter: Transition { + PropertyAnimation { + property: "opacity" + from: 0 + to:1 + duration: 200 + } + } + + pushExit: Transition { + PropertyAnimation { + property: "opacity" + from: 1 + to:0 + duration: 200 + } + } + + popEnter: Transition { + PropertyAnimation { + property: "opacity" + from: 0 + to:1 + duration: 200 + } + } + + popExit: Transition { + PropertyAnimation { + property: "opacity" + from: 1 + to:0 + duration: 200 + } + } + } + + TermsAndConditions { + id: terms_conditions + visible: false + onSig_continue: { + stack_create_wallet.push(start_create) + } + } + + StartCreateWallet { + id: start_create + visible: false + } + } +} + diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 46e0dba2b..387d7ebc8 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -22,10 +22,13 @@ import "BsStyles" Item { id: overview + signal newWalletClicked(); + CreateNewWallet { id: createNewWalletPage visible: false } + AddressDetails { id: addressDetails visible: false @@ -98,6 +101,7 @@ Item { font.pointSize: 10 onClicked: { stack.push(createNewWalletPage) + newWalletClicked() } } } diff --git a/GUI/QtQuick/qml/StartCreateWallet.qml b/GUI/QtQuick/qml/StartCreateWallet.qml new file mode 100644 index 000000000..4253cce89 --- /dev/null +++ b/GUI/QtQuick/qml/StartCreateWallet.qml @@ -0,0 +1,93 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "StyledControls" +import "BsStyles" + + +ColumnLayout { + + id: layout + height: 481 + width: 580 + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: "Create new wallet" + } + + Label { + Layout.fillWidth: true + height: 24 + } + + Image { + id: wallet_icon + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 120 + Layout.preferredWidth : 120 + + source: "qrc:/images/wallet icon.png" + width: 120 + height: 120 + } + + Label { + Layout.fillWidth: true + height: 16 + } + + Text { + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 16 + text: "

Need help? Please consult our Getting Started Guides

" + } + + Label { + Layout.fillWidth: true + height: 196 + } + + RowLayout { + id: row + spacing: 10 + + CustomButton { + id: hardware_but + text: qsTr("Hardware Wallet") + Layout.leftMargin: 25 + width: 170 + + Component.onCompleted: { + hardware_but.preferred = false + } + } + + CustomButton { + id: import_but + text: qsTr("Import Wallet") + width: 170 + + Component.onCompleted: { + import_but.preferred = false + } + } + + CustomButton { + id: create_but + text: qsTr("Create new") + width: 170 + + Component.onCompleted: { + create_but.preferred = true + } + } + + } +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomButton.qml b/GUI/QtQuick/qml/StyledControls/CustomButton.qml index 80adca47a..1913bbce9 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButton.qml @@ -14,81 +14,29 @@ import "../BsStyles" Button { id: control - property bool capitalize: true - property bool primary: false - text: parent.text - leftPadding: 15 - rightPadding: 15 - anchors.margins: 5 + property bool preferred: false contentItem: Text { text: control.text - opacity: enabled ? 1.0 : 0.3 - color: BSStyle.textColor - font.capitalization: capitalize ? Font.AllUppercase : Font.MixedCase - font.pixelSize: 11 + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Bold + color: "#FFFFFF" horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight } - background: Rectangle { - id: rect - implicitWidth: 110 - implicitHeight: 35 - opacity: primary ? 1 : (control.enabled ? 1 : 0.3) - border.color: BSStyle.buttonsBorderColor - color: primary ? BSStyle.buttonsPrimaryMainColor : (control.highlighted ? BSStyle.buttonsPrimaryMainColor : BSStyle.buttonsMainColor) - border.width: primary ? 0 : 1 + implicitWidth: control.width + implicitHeight: 50 + color: preferred ? (!control.enabled ? BSStyle.disabledColor : + (control.down ? BSStyle.buttonsPreferredPressedColor : + (control.hovered ? BSStyle.buttonsPreferredHoveredColor : BSStyle.buttonsPreferredColor))): + (!control.enabled ? BSStyle.disabledColor : + (control.down ? BSStyle.buttonsStandardPressedColor : + (control.hovered ? BSStyle.buttonsStandardHoveredColor : BSStyle.buttonsStandardColor))) + + radius: 14 } - - states: [ - State { - name: "" - PropertyChanges { - target: rect - opacity: primary ? 1 : (control.enabled ? 1 : 0.3) - color: primary ? BSStyle.buttonsPrimaryMainColor : (control.highlighted ? BSStyle.buttonsPrimaryMainColor : BSStyle.buttonsMainColor) - } - }, - State { - name: "pressed" - when: control.pressed - PropertyChanges { - target: rect - opacity: primary ? 0.7 : (control.enabled ? 1 : 0.3) - color: primary ? BSStyle.buttonsPrimaryMainColor : (control.highlighted ? BSStyle.buttonsPrimaryPressedColor : BSStyle.buttonsPressedColor) - } - }, - State { - name: "hovered" - when: control.hovered - PropertyChanges { - target: rect - opacity: primary ? 0.85 : (control.enabled ? 1 : 0.3) - color: primary ? BSStyle.buttonsPrimaryMainColor : (control.highlighted ? BSStyle.buttonsPrimaryHoveredColor : BSStyle.buttonsHoveredColor) - } - }, - State { - name: "disabled" - when: !control.enabled - PropertyChanges { - target: rect - opacity: primary ? 0.3 : (control.enabled ? 1 : 0.3) - color: primary ? BSStyle.buttonsPrimaryMainColor : "gray" - } - } - ] - - transitions: [ - Transition { - from: ""; to: "hovered" - ColorAnimation { duration: 100 } - }, - Transition { - from: "*"; to: "pressed" - ColorAnimation { duration: 10 } - } - ] } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTitleLabel.qml b/GUI/QtQuick/qml/StyledControls/CustomTitleLabel.qml new file mode 100644 index 000000000..7a99bf906 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomTitleLabel.qml @@ -0,0 +1,22 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import "../BsStyles" + +Label { + id: title + height : 23 + color: "#E2E7FF" + font.pixelSize: 20 + font.family: "Roboto" + font.weight: Font.Medium +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml b/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml index 9cda5ada8..d5f88057f 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml @@ -40,7 +40,7 @@ ToolButton { id: btn_background clip: true color: !control.enabled ? BSStyle.disabledColor : - (control._isPressed ? BSStyle.buttonsPressedColor : + (control.down ? BSStyle.buttonsPressedColor : (control.hovered ? BSStyle.buttonsHoveredColor : BSStyle.buttonsMainColor)) Rectangle { color: 'transparent' diff --git a/GUI/QtQuick/qml/TermsAndConditions.qml b/GUI/QtQuick/qml/TermsAndConditions.qml new file mode 100644 index 000000000..e228df83e --- /dev/null +++ b/GUI/QtQuick/qml/TermsAndConditions.qml @@ -0,0 +1,101 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "StyledControls" +import "BsStyles" + +ColumnLayout { + + id: layout + + signal sig_continue() + + height: 481 + width: 580 + implicitHeight: 481 + implicitWidth: 580 + + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignLeft + Layout.leftMargin: 24 + Layout.preferredHeight : title.height + text: "Terms and conditions" + } + + Label { + Layout.fillWidth: true + height: 24 + } + + ScrollView { + id: scroll + Layout.alignment: Qt.AlignLeft + Layout.leftMargin: 24 + implicitWidth: 532 + implicitHeight: 340 + + ScrollBar.vertical.policy: ScrollBar.AlwaysOn + + clip: true + + TextArea { + id: edit + + width: parent.width + height: parent.height + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Normal + leftPadding: 0 + rightPadding: 24 + color: "#E2E7FF" + text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n\nSed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\n\nNeque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n\nSed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\n\nNeque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit" + selectByMouse: true + wrapMode: TextEdit.WordWrap + readOnly: true + + background: Rectangle { + anchors.fill: parent + color: "transparent" + radius: 4 + } + + } + } + + Rectangle { + Layout.fillWidth: true + height: 1 + color: "#3C435A" + } + + Label { + Layout.fillWidth: true + height: 24 + } + + CustomButton { + id: continue_but + text: qsTr("Continue") + Layout.leftMargin: 24 + width: 532 + + Component.onCompleted: { + continue_but.preferred = true + } + onClicked: { + sig_continue() + } + } + + Label { + Layout.fillWidth: true + height: 24 + } +} + diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 8a42bcca0..f7a3f96d9 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -24,8 +24,8 @@ import "js/helper.js" as JsHelper ApplicationWindow { id: mainWindow - minimumWidth: 1024 - minimumHeight: 800 + minimumWidth: 1200 + minimumHeight: 900 visible: false title: qsTr("BlockSettle Terminal") @@ -39,6 +39,11 @@ ApplicationWindow { // qmlFactory.applyWindowFix(mainWindow) } + CreateWallet { + id: createWallet + visible: false + } + color: BSStyle.backgroundColor overlay.modal: Rectangle { @@ -170,6 +175,11 @@ ApplicationWindow { OverviewPage { id: overviewPage + onNewWalletClicked: { + createWallet.show() + createWallet.raise() + createWallet.requestActivate() + } } TransactionsPage { diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 55316d9d1..7fba8f112 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -60,5 +60,12 @@ images/plugins_icon_unchoosed.png images/transactions_icon_unchoosed.png images/explorer_icon_unchoosed.png + qml/TermsAndConditions.qml + TermsAndConditions.txt + images/close_button.png + qml/CreateWallet.qml + qml/StyledControls/CustomTitleLabel.qml + images/wallet icon.png + qml/StartCreateWallet.qml From 079818e65137f60393d057515038bfc0a8171167 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 23 Dec 2022 21:14:17 +0300 Subject: [PATCH 014/436] Advanced TX basics --- GUI/QtQuick/QtQuickAdapter.cpp | 42 +++++++++++++++++++-------- GUI/QtQuick/QtQuickAdapter.h | 1 + GUI/QtQuick/TxInputsModel.cpp | 49 +++++++++++++++++++++++++------- GUI/QtQuick/TxInputsModel.h | 4 +++ GUI/QtQuick/TxOutputsModel.cpp | 9 ++++++ GUI/QtQuick/TxOutputsModel.h | 2 ++ GUI/QtQuick/qml/SendAdvanced.qml | 20 +++++++++++-- GUI/QtQuick/qml/SendPage.qml | 4 +-- 8 files changed, 104 insertions(+), 27 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index d27e75046..dc23f3995 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -423,18 +423,11 @@ ProcessingResult QtQuickAdapter::processBlockchain(const Envelope &env) break; case ArmoryMessage::kStateChanged: armoryState_ = msg.state_changed().state(); - blockNum_ = msg.state_changed().top_block(); + setTopBlock(msg.state_changed().top_block()); emit armoryStateChanged(); - logger_->debug("[{}] current block: {}", __func__, blockNum_); - pendingTxModel_->setCurrentBlock(blockNum_); - txModel_->setCurrentBlock(blockNum_); - expTxByAddrModel_->setCurrentBlock(blockNum_); break; case ArmoryMessage::kNewBlock: - blockNum_ = msg.new_block().top_block(); - pendingTxModel_->setCurrentBlock(blockNum_); - txModel_->setCurrentBlock(blockNum_); - expTxByAddrModel_->setCurrentBlock(blockNum_); + setTopBlock(msg.new_block().top_block()); break; case ArmoryMessage::kWalletRegistered: if (msg.wallet_registered().success() && msg.wallet_registered().wallet_id().empty()) { @@ -594,6 +587,15 @@ void QtQuickAdapter::updateStates() //TODO } +void QtQuickAdapter::setTopBlock(uint32_t topBlock) +{ + blockNum_ = topBlock; + pendingTxModel_->setCurrentBlock(blockNum_); + txModel_->setCurrentBlock(blockNum_); + expTxByAddrModel_->setCurrentBlock(blockNum_); + txInputsModel_->setTopBlock(topBlock); +} + //#define DEBUG_LOADING_PROGRESS void QtQuickAdapter::updateSplashProgress() { @@ -1034,9 +1036,25 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri WalletsMessage msg; auto msgReq = msg.mutable_tx_request(); msgReq->set_hd_wallet_id(hdWalletIdByIndex(walletIndex)); - auto msgOut = msgReq->add_outputs(); - msgOut->set_address(recvAddr.toStdString()); - msgOut->set_amount(amount); + if (!recvAddr.isEmpty() && (amount > 0)) { + auto msgOut = msgReq->add_outputs(); + msgOut->set_address(recvAddr.toStdString()); + msgOut->set_amount(amount); + } + else { + const auto& recipients = txOutputsModel_->recipients(); + for (const auto& recip : recipients) { + try { + const auto& addr = bs::Address::fromRecipient(recip); + auto msgOut = msgReq->add_outputs(); + msgOut->set_address(addr.display()); + msgOut->set_amount(recip->getValue() / BTCNumericTypes::BalanceDivider); + } + catch (const std::exception& e) { + logger_->error("[{}] {}", __func__, e.what()); + } + } + } msgReq->set_fee_per_byte(fee); if (!comment.isEmpty()) { msgReq->set_comment(comment.toStdString()); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 417b335fb..889a5b2ed 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -190,6 +190,7 @@ private slots: void updateSplashProgress(); void splashProgressCompleted(); void updateStates(); + void setTopBlock(uint32_t); void createWallet(bool primary); std::string hdWalletIdByIndex(int); diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index a69c50c9f..bba0901be 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -12,6 +12,7 @@ #include #include "Address.h" #include "BTCNumericTypes.h" +#include "CoinSelection.h" #include "TxOutputsModel.h" namespace { @@ -103,6 +104,10 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) continue; } } + if (collectUTXOsForAmount_ > 0) { + collectUTXOsFor(collectUTXOsForAmount_); + collectUTXOsForAmount_ = 0; + } } void TxInputsModel::toggle(int row) @@ -233,16 +238,11 @@ QUTXOList* TxInputsModel::getSelection() if (it != preSelected_.end()) { return new QUTXOList(it->second, (QObject*)this); } - std::vector allUTXOs; - for (const auto& byAddr : utxos_) { - allUTXOs.insert(allUTXOs.cend(), byAddr.second.cbegin(), byAddr.second.cend()); - } - //TODO: select and save - nbTx_ = result.size(); - selectedBalance_ = 0; - for (const auto& qUtxo : result) { - selectedBalance_ += qUtxo->utxo().getValue(); + if (utxos_.empty()) { + collectUTXOsForAmount_ = amount; + return nullptr; } + result = collectUTXOsFor(amount); preSelected_[(int)std::floor(amount * BTCNumericTypes::BalanceDivider)] = result; } else { @@ -275,12 +275,41 @@ QUTXOList* TxInputsModel::getSelection() nbTx_ = result.size(); preSelected_[0] = result; } + emit selectionChanged(); } } - emit selectionChanged(); return new QUTXOList(result, (QObject*)this); } +QList TxInputsModel::collectUTXOsFor(double amount) +{ + QList result; + std::vector allUTXOs; + for (const auto& byAddr : utxos_) { + allUTXOs.insert(allUTXOs.cend(), byAddr.second.cbegin(), byAddr.second.cend()); + } + bs::Address::decorateUTXOs(allUTXOs); + const auto& recipients = outsModel_->recipients(); + std::map>> recipientsMap; + for (unsigned i = 0; i < recipients.size(); ++i) { + recipientsMap[i] = { recipients.at(i) }; + } + float feePerByte = fee_.isEmpty() ? 1.0 : std::stof(fee_.toStdString()); + auto payment = Armory::CoinSelection::PaymentStruct(recipientsMap, 0, feePerByte, 0); + Armory::CoinSelection::CoinSelection coinSelection([allUTXOs](uint64_t) { return allUTXOs; } + , std::vector{}, UINT64_MAX, topBlock_); + const auto selection = coinSelection.getUtxoSelectionForRecipients(payment, allUTXOs); + + selectedBalance_ = 0; + for (const auto& utxo : selection.utxoVec_) { + selectedBalance_ += utxo.getValue(); + result.push_back(new QUTXO(utxo, (QObject*)this)); + } + nbTx_ = result.size(); + emit selectionChanged(); + return result; +} + QVariant TxInputsModel::getData(int row, int col) const { if (row == 0) { diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index dd269b71a..fbf99fde6 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -66,6 +66,7 @@ class TxInputsModel : public QAbstractTableModel void clear(); void addUTXOs(const std::vector&); + void setTopBlock(uint32_t topBlock) { topBlock_ = topBlock; } Q_PROPERTY(int nbTx READ nbTx NOTIFY selectionChanged) int nbTx() const { return nbTx_; } @@ -89,6 +90,7 @@ class TxInputsModel : public QAbstractTableModel QColor dataColor(int row, int col) const; QColor bgColor(int row) const; float colWidth(int col) const; + QList collectUTXOsFor(double amount); private: std::shared_ptr logger_; @@ -108,6 +110,8 @@ class TxInputsModel : public QAbstractTableModel int nbTx_{ 0 }; uint64_t selectedBalance_{ 0 }; QString fee_; + uint32_t topBlock_{ 0 }; + double collectUTXOsForAmount_{ 0 }; }; #endif // TX_INPUTS_MODEL_H diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index c37dddc48..65fb24bb1 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -67,6 +67,15 @@ double TxOutputsModel::totalAmount() const return result; } +std::vector> TxOutputsModel::recipients() const +{ + std::vector> result; + for (const auto& entry : data_) { + result.emplace_back(entry.address.getRecipient(bs::XBTAmount(entry.amount))); + } + return result; +} + void TxOutputsModel::clearOutputs() { beginResetModel(); diff --git a/GUI/QtQuick/TxOutputsModel.h b/GUI/QtQuick/TxOutputsModel.h index 8a88b7c77..ac3f0272b 100644 --- a/GUI/QtQuick/TxOutputsModel.h +++ b/GUI/QtQuick/TxOutputsModel.h @@ -18,6 +18,7 @@ #include #include "Address.h" #include "BinaryData.h" +#include "ScriptRecipient.h" #include "TxClasses.h" namespace spdlog { @@ -38,6 +39,7 @@ class TxOutputsModel : public QAbstractTableModel QHash roleNames() const override; double totalAmount() const; + std::vector> recipients() const; Q_INVOKABLE void addOutput(const QString& address, double amount); Q_INVOKABLE void delOutput(int row); diff --git a/GUI/QtQuick/qml/SendAdvanced.qml b/GUI/QtQuick/qml/SendAdvanced.qml index 97c23c829..1aa585d22 100644 --- a/GUI/QtQuick/qml/SendAdvanced.qml +++ b/GUI/QtQuick/qml/SendAdvanced.qml @@ -171,6 +171,12 @@ Item { text: "+" font.pointSize: 14 onClicked: { + var outAmount = parseFloat(amount.text) + if (recvAddress.text.length && (outAmount > 0)) { + txOutputs.addOutput(recvAddress.text, outAmount) + recvAddress.text = "" + amount.text = "" + } } } } @@ -215,6 +221,14 @@ Item { anchors.right: parent anchors.horizontalCenter: parent } + onAccepted: { + var outAmount = parseFloat(text) + if (recvAddress.text.length && (outAmount > 0)) { + txOutputs.addOutput(recvAddress.text, outAmount) + recvAddress.text = "" + amount.text = "" + } + } } Button { text: qsTr("MAX") @@ -282,9 +296,9 @@ Item { onClicked: { verifySignTX.txSignRequest = bsApp.createTXSignRequest( - sendWalletsComboBox.currentIndex, recvAddress.text, - parseFloat(amount.text), parseFloat(fees.text), - txComment.text, txInputsModel.getSelection()) + sendWalletsComboBox.currentIndex, "", 0, + parseFloat(fees.text), txComment.text, + txInputsModel.getSelection()) stack.push(verifySignTX) } } diff --git a/GUI/QtQuick/qml/SendPage.qml b/GUI/QtQuick/qml/SendPage.qml index e6bed9114..05602f1f7 100644 --- a/GUI/QtQuick/qml/SendPage.qml +++ b/GUI/QtQuick/qml/SendPage.qml @@ -53,6 +53,8 @@ Item { onClicked: { bsApp.getUTXOsForWallet(sendWalletsComboBox.currentIndex) txOutputsModel.clearOutputs() + txInputsModel.fee = fees.text + advancedCreateTX.walletIdx = sendWalletsComboBox.currentIndex var outAmount = parseFloat(amount.text) if ((outAmount >= 0.0000001) && (recvAddress.text.length)) { txOutputsModel.addOutput(recvAddress.text, outAmount) @@ -60,8 +62,6 @@ Item { advancedCreateTX.recvAddress = recvAddress.text advancedCreateTX.sendAmount = amount.text } - txInputsModel.fee = fees.text - advancedCreateTX.walletIdx = sendWalletsComboBox.currentIndex advancedCreateTX.comment = txComment.text stack.push(advancedCreateTX) } From 12b0fc8470282283642978f43dc685a1105edb60 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 24 Dec 2022 02:36:12 +0200 Subject: [PATCH 015/436] gui: new wallet: 12 word seed --- GUI/QtQuick/images/back_arrow.png | Bin 0 -> 275 bytes GUI/QtQuick/images/copy_seed.png | Bin 0 -> 291 bytes GUI/QtQuick/qml/CreateWallet.qml | 31 +++++- GUI/QtQuick/qml/StartCreateWallet.qml | 15 ++- .../qml/StyledControls/CustomButton.qml | 14 ++- .../qml/StyledControls/CustomSeedLabel.qml | 54 +++++++++++ GUI/QtQuick/qml/WalletSeed.qml | 89 ++++++++++++++++++ GUI/QtQuick/qtquick.qrc | 4 + 8 files changed, 203 insertions(+), 4 deletions(-) create mode 100755 GUI/QtQuick/images/back_arrow.png create mode 100755 GUI/QtQuick/images/copy_seed.png create mode 100644 GUI/QtQuick/qml/StyledControls/CustomSeedLabel.qml create mode 100644 GUI/QtQuick/qml/WalletSeed.qml diff --git a/GUI/QtQuick/images/back_arrow.png b/GUI/QtQuick/images/back_arrow.png new file mode 100755 index 0000000000000000000000000000000000000000..b83e845a61e0a576f78e17407b68bdd08e8d1421 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#6`n4RAr*{or`#2EF%W5ee>O*P+myEnrOiwi zcx5$QwFKWuNY+bEw5<4On|S7@+R2luRh3e9zZ5lBc^I01nxp<-f38bqn|s@#fO!vZ zNqk<+aKn6$PqHruqfw2rL%Tjpc#A$uWaM@sKZ!3PnYR~Rka}l${@0EEpu>sX6)~;v zE<~%Gur!F+6dkdWs456WOHshrvLpCbJ5D$mU?T> R9H5&SJYD@<);T3K0RV`KWFr6o literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/copy_seed.png b/GUI/QtQuick/images/copy_seed.png new file mode 100755 index 0000000000000000000000000000000000000000..f41388ca64710b780eaafab0a5862a7c073afeb6 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#9iA?ZAr*{orxZo?GL*K^mI?y+zCW;ZkU%@6sCx9=AwY4M-1)DVjL;G6H1>F~C7 zSJv6-ch)rg3=1#&u5wc literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/qml/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet.qml index 60bf94714..2f2232356 100644 --- a/GUI/QtQuick/qml/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet.qml @@ -30,7 +30,6 @@ Window { radius: 16 height: stack_create_wallet.height + 40 width: stack_create_wallet.width - //anchors.fill: parent border.color : "#3C435A" border.width : 1 @@ -54,6 +53,26 @@ Window { } } + Image { + id: back_arrow_button + visible: !(terms_conditions.visible || start_create.visible) + + anchors.top: parent.top + anchors.topMargin: 24 + anchors.left: parent.left + anchors.leftMargin: 24 + + source: "qrc:/images/back_arrow.png" + width: 20 + height: 16 + MouseArea { + anchors.fill: parent + onClicked: { + stack_create_wallet.pop() + } + } + } + StackView { id: stack_create_wallet initialItem: terms_conditions @@ -112,7 +131,17 @@ Window { StartCreateWallet { id: start_create visible: false + onSig_create_new: { + wallet_seed.phrase = bsApp.newSeedPhrase() + stack_create_wallet.push(wallet_seed) + } } + + WalletSeed { + id: wallet_seed + visible: false + } + } } diff --git a/GUI/QtQuick/qml/StartCreateWallet.qml b/GUI/QtQuick/qml/StartCreateWallet.qml index 4253cce89..65c0af1d3 100644 --- a/GUI/QtQuick/qml/StartCreateWallet.qml +++ b/GUI/QtQuick/qml/StartCreateWallet.qml @@ -10,6 +10,11 @@ import "BsStyles" ColumnLayout { id: layout + + signal sig_create_new() + signal sig_import_wallet() + signal sig_hardware_wallet() + height: 481 width: 580 spacing: 0 @@ -67,6 +72,9 @@ ColumnLayout { Component.onCompleted: { hardware_but.preferred = false } + onClicked: { + sig_hardware_wallet() + } } CustomButton { @@ -77,6 +85,9 @@ ColumnLayout { Component.onCompleted: { import_but.preferred = false } + onClicked: { + sig_import_wallet() + } } CustomButton { @@ -87,7 +98,9 @@ ColumnLayout { Component.onCompleted: { create_but.preferred = true } + onClicked: { + sig_create_new() + } } - } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomButton.qml b/GUI/QtQuick/qml/StyledControls/CustomButton.qml index 1913bbce9..7cdb31ff9 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButton.qml @@ -16,7 +16,16 @@ Button { id: control property bool preferred: false - contentItem: Text { + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Bold + palette.buttonText: "#FFFFFF" + + icon.color: "transparent" + icon.width: 24 + icon.height: 24 + + /*contentItem: Text { text: control.text font.pixelSize: 16 font.family: "Roboto" @@ -25,7 +34,8 @@ Button { horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight - } + }*/ + background: Rectangle { implicitWidth: control.width implicitHeight: 50 diff --git a/GUI/QtQuick/qml/StyledControls/CustomSeedLabel.qml b/GUI/QtQuick/qml/StyledControls/CustomSeedLabel.qml new file mode 100644 index 000000000..1fbf432bc --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomSeedLabel.qml @@ -0,0 +1,54 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import "../BsStyles" + +Rectangle { + id: rect + + property alias serial_num: serial_number.text + property alias seed_text: seed.text + + width: 170 + height: 46 + + color: "#020817" + opacity: 1 + radius: 14 + + Label { + id: serial_number + + anchors.top: rect.top + anchors.topMargin: 8 + anchors.left: rect.left + anchors.leftMargin: 10 + + font.pixelSize: 12 + font.family: "Roboto" + font.weight: Font.Normal + + color: "#7A88B0" + } + + Label { + id: seed + + anchors.centerIn : rect + + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Normal + + color: "#E2E7FF" + } +} diff --git a/GUI/QtQuick/qml/WalletSeed.qml b/GUI/QtQuick/qml/WalletSeed.qml new file mode 100644 index 000000000..775fab812 --- /dev/null +++ b/GUI/QtQuick/qml/WalletSeed.qml @@ -0,0 +1,89 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "StyledControls" +import "BsStyles" + + +ColumnLayout { + + id: layout + + property var phrase + + height: 481 + width: 580 + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: "Create new wallet" + } + + Label { + id: subtitle + Layout.alignment: Qt.AlignCenter + Layout.topMargin: 16 + Layout.preferredHeight : 16 + text: "Write down and store your 12 word seed someplace safe and offline" + color: "#E2E7FF" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + GridView { + id: grid + + Layout.fillHeight: true + Layout.fillWidth: true + Layout.leftMargin: 25 + Layout.topMargin: 32 + + cellHeight : 56 + cellWidth : 180 + + model: phrase + delegate: CustomSeedLabel { + seed_text: modelData + serial_num: index + 1 + } + + } + + RowLayout { + id: row + spacing: 10 + + Layout.leftMargin: 24 + Layout.bottomMargin: 40 + + CustomButton { + id: copy_seed_but + text: qsTr("Copy Seed") + width: 261 + + Component.onCompleted: { + copy_seed_but.preferred = false + } + onClicked: { + bsApp.copySeedToClipboard(phrase) + } + } + + CustomButton { + id: continue_but + text: qsTr("Continue") + width: 261 + + Component.onCompleted: { + continue_but.preferred = true + } + } + + } +} diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 1b789cfee..0874d719c 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -68,5 +68,9 @@ qml/StyledControls/CustomTitleLabel.qml images/wallet icon.png qml/StartCreateWallet.qml + images/back_arrow.png + qml/WalletSeed.qml + qml/StyledControls/CustomSeedLabel.qml + images/copy_seed.png From 64cd23680bdcf81ac71c2cf3380e164d3c7e166c Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 26 Dec 2022 18:13:08 +0200 Subject: [PATCH 016/436] fix anchors bug --- GUI/QtQuick/qml/BsStyles/BSStyle.qml | 20 ++++++++++--------- .../qml/StyledControls/CustomButton.qml | 13 +----------- GUI/QtQuick/qml/TermsAndConditions.qml | 1 - 3 files changed, 12 insertions(+), 22 deletions(-) diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index 7ac3864e7..baf0a9698 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -19,7 +19,6 @@ QtObject { readonly property color backgroundModalColor: "#737373" readonly property color backgroundModeLessColor: "#939393" - readonly property color disabledColor: "#41484f" readonly property color disabledTextColor: "#71787f" readonly property color disabledBgColor: "#31383f" @@ -40,14 +39,6 @@ QtObject { readonly property color buttonsPressedColor: "#55000000" readonly property color buttonsHoveredColor: "#22000000" - readonly property color buttonsStandardColor: "#3C435A" - readonly property color buttonsStandardPressedColor: "#55000000" - readonly property color buttonsStandardHoveredColor: "#22000000" - - readonly property color buttonsPreferredColor: "#45A6FF" - readonly property color buttonsPreferredPressedColor: "#55000000" - readonly property color buttonsPreferredHoveredColor: "#22000000" - readonly property color buttonsPrimaryMainColor: "#247dac" readonly property color buttonsPrimaryPressedColor: "#22C064" readonly property color buttonsPrimaryHoveredColor: "#449dcc" @@ -84,4 +75,15 @@ QtObject { readonly property color testnetTextColor: "black" readonly property color selectedColor: "white" + + + + //new properties + readonly property color buttonsStandardColor: "#3C435A" + readonly property color buttonsStandardPressedColor: "#55000000" + readonly property color buttonsStandardHoveredColor: "#22000000" + + readonly property color buttonsPreferredColor: "#45A6FF" + readonly property color buttonsPreferredPressedColor: "#55000000" + readonly property color buttonsPreferredHoveredColor: "#22000000" } diff --git a/GUI/QtQuick/qml/StyledControls/CustomButton.qml b/GUI/QtQuick/qml/StyledControls/CustomButton.qml index 7cdb31ff9..4082f1cde 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButton.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2018 - 2022, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * @@ -25,17 +25,6 @@ Button { icon.width: 24 icon.height: 24 - /*contentItem: Text { - text: control.text - font.pixelSize: 16 - font.family: "Roboto" - font.weight: Font.Bold - color: "#FFFFFF" - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - elide: Text.ElideRight - }*/ - background: Rectangle { implicitWidth: control.width implicitHeight: 50 diff --git a/GUI/QtQuick/qml/TermsAndConditions.qml b/GUI/QtQuick/qml/TermsAndConditions.qml index e228df83e..0a6a226b8 100644 --- a/GUI/QtQuick/qml/TermsAndConditions.qml +++ b/GUI/QtQuick/qml/TermsAndConditions.qml @@ -60,7 +60,6 @@ ColumnLayout { readOnly: true background: Rectangle { - anchors.fill: parent color: "transparent" radius: 4 } From ed8025c4240f954ba58f85186f8d94f69f08afec Mon Sep 17 00:00:00 2001 From: dvajdual Date: Tue, 27 Dec 2022 01:56:39 +0200 Subject: [PATCH 017/436] bug fix --- GUI/QtQuick/qml/main.qml | 2 -- 1 file changed, 2 deletions(-) diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index f7a3f96d9..e70b38d03 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -170,8 +170,6 @@ ApplicationWindow { anchors.fill: parent id: swipeView currentIndex: tabBar.currentIndex - Layout.fillWidth: true - Layout.fillHeight: true OverviewPage { id: overviewPage From 341005c9b049ff60b4dd19daf4180630f1be8b3b Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 27 Dec 2022 14:25:50 +0300 Subject: [PATCH 018/436] TX details rework --- BlockSettleUILib/TransactionsViewModel.cpp | 14 +-- GUI/QtQuick/QtQuickAdapter.cpp | 36 +++---- GUI/QtQuick/QtQuickAdapter.h | 6 -- GUI/QtQuick/TxListModel.cpp | 120 +++++++++++---------- GUI/QtQuick/TxListModel.h | 10 +- GUI/QtQuick/qml/TransactionsPage.qml | 2 +- GUI/QtWidgets/QtGuiAdapter.cpp | 10 +- common | 2 +- 8 files changed, 106 insertions(+), 94 deletions(-) diff --git a/BlockSettleUILib/TransactionsViewModel.cpp b/BlockSettleUILib/TransactionsViewModel.cpp index 15398dae1..7b664264a 100644 --- a/BlockSettleUILib/TransactionsViewModel.cpp +++ b/BlockSettleUILib/TransactionsViewModel.cpp @@ -595,8 +595,9 @@ void TransactionsViewModel::onLedgerEntries(const std::string &, uint32_t std::vector txWallet; txWallet.reserve(entries.size()); for (const auto &entry : entries) { - const auto &walletId = entry.walletIds.empty() ? std::string{} : *(entry.walletIds.cbegin()); - txWallet.push_back({ entry.txHash, walletId, entry.value }); + std::vector walletIds; + walletIds.insert(walletIds.end(), entry.walletIds.cbegin(), entry.walletIds.cend()); + txWallet.push_back({ entry.txHash, walletIds, entry.value }); } emit needTXDetails(txWallet, true, {}); } @@ -625,8 +626,9 @@ void TransactionsViewModel::onZCsInvalidated(const std::vector& txHa txWallet.reserve(invalidatedNodes_.size()); for (const auto& invNode : invalidatedNodes_) { const auto& entry = invNode.second->item()->txEntry; - const auto& walletId = entry.walletIds.empty() ? std::string{} : *(entry.walletIds.cbegin()); - txWallet.push_back({ entry.txHash, walletId, entry.value }); + std::vector walletIds; + walletIds.insert(walletIds.end(), entry.walletIds.cbegin(), entry.walletIds.cend()); + txWallet.push_back({ entry.txHash, walletIds, entry.value }); } emit needTXDetails(txWallet, false, {}); } @@ -637,9 +639,9 @@ void TransactionsViewModel::onTXDetails(const std::vectordebug("[{}] {}", __func__, response.DebugString()); for (const auto &resp : response.responses()) { - bs::sync::TXWalletDetails txDet{ BinaryData::fromString(resp.tx_hash()), resp.wallet_id() + bs::sync::TXWalletDetails txDet{ BinaryData::fromString(resp.tx_hash()), resp.hd_wallet_id() , resp.wallet_name(), static_cast(resp.wallet_type()) , resp.wallet_symbol(), static_cast(resp.direction()) , resp.comment(), resp.valid(), resp.amount() }; @@ -827,9 +828,6 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId pendingTxModel_->setTxComment(resp.tx_hash(), txDet.comment); txModel_->setTxComment(resp.tx_hash(), txDet.comment); } - //logger_->debug("[{}] {} = {}", __func__, resp.wallet_id(), resp.wallet_name()); - pendingTxModel_->setWalletName(resp.wallet_id(), resp.wallet_name()); - txModel_->setWalletName(resp.wallet_id(), resp.wallet_name()); const auto &ownTxHash = BinaryData::fromString(resp.tx_hash()); try { @@ -882,6 +880,15 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId , resp.change_address().out_index() }; } catch (const std::exception &) {} + for (const auto& addr : resp.own_addresses()) { + try { + txDet.ownAddresses.push_back(bs::Address::fromAddressString(addr)); + } + catch (const std::exception&) {} + } + for (const auto& walletId : resp.wallet_ids()) { + txDet.walletIds.insert(walletId); + } const auto& itTxDet = txDetailReqs_.find(msgId); if (itTxDet == txDetailReqs_.end()) { @@ -894,17 +901,12 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId txDetailReqs_.erase(itTxDet); } } - - const auto& itZC = newZCs_.find(msgId); - if (itZC != newZCs_.end()) { - newZCs_.erase(itZC); - //TODO - } return ProcessingResult::Success; } ProcessingResult QtQuickAdapter::processLedgerEntries(const LedgerEntries &response) { + //logger_->debug("[{}] {}", __func__, response.DebugString()); WalletsMessage msg; auto msgReq = msg.mutable_tx_details_request(); std::vector entries; @@ -922,9 +924,7 @@ ProcessingResult QtQuickAdapter::processLedgerEntries(const LedgerEntries &respo txEntry.isChainedZC = entry.chained_zc(); txEntry.nbConf = entry.nb_conf(); for (const auto &walletId : entry.wallet_ids()) { - if (txReq->wallet_id().empty()) { - txReq->set_wallet_id(walletId); - } + txReq->add_wallet_ids(walletId); txEntry.walletIds.insert(walletId); } for (const auto &addrStr : entry.addresses()) { @@ -942,8 +942,6 @@ ProcessingResult QtQuickAdapter::processLedgerEntries(const LedgerEntries &respo } } txModel_->addRows(entries); - nbTransactions_ = entries.size(); - emit nbTransactionsChanged(); pushRequest(user_, userWallets_, msg.SerializeAsString()); return ProcessingResult::Success; } @@ -1189,13 +1187,14 @@ ProcessingResult QtQuickAdapter::processSignTX(const BlockSettle::Common::Signer ProcessingResult QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived& zcs) { + logger_->debug("[{}] {}", __func__, zcs.DebugString()); WalletsMessage msg; auto msgReq = msg.mutable_tx_details_request(); for (const auto& zcEntry : zcs.tx_entries()) { auto txReq = msgReq->add_requests(); txReq->set_tx_hash(zcEntry.tx_hash()); - if (zcEntry.wallet_ids_size() > 0) { - txReq->set_wallet_id(zcEntry.wallet_ids(0)); + for (const auto& walletId : zcEntry.wallet_ids()) { + txReq->add_wallet_ids(walletId); } txReq->set_value(zcEntry.value()); @@ -1220,8 +1219,7 @@ ProcessingResult QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMess pendingTxModel_->prependRow(txEntry); txModel_->prependRow(txEntry); } - const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); - newZCs_.insert(msgId); + pushRequest(user_, userWallets_, msg.SerializeAsString()); return ProcessingResult::Success; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 889a5b2ed..9922c5b99 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -111,9 +111,6 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_PROPERTY(quint32 nbUsedWalletAddresses READ nbUsedWalletAddresses NOTIFY walletBalanceChanged) quint32 nbUsedWalletAddresses() const { return nbUsedWalletAddresses_; } - Q_PROPERTY(quint32 nbTransactions READ nbTransactions NOTIFY nbTransactionsChanged) - quint32 nbTransactions() const { return nbTransactions_; } - Q_PROPERTY(QString generatedAddress READ generatedAddress NOTIFY addressGenerated) QString generatedAddress() const { return QString::fromStdString(generatedAddress_.display()); } @@ -168,7 +165,6 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop signals: void walletsListChanged(); void walletBalanceChanged(); - void nbTransactionsChanged(); void addressGenerated(); void settingChanged(); void armoryStateChanged(); @@ -241,13 +237,11 @@ private slots: std::unordered_map walletNames_; std::map walletInfoReq_; std::map addrComments_; - std::set newZCs_; QStringList walletsList_; const QStringList txTypes_; unsigned nbUsedWalletAddresses_{ 0 }; double confWalletBalance_{ 0 }, unconfWalletBalance_{ 0 }, totalWalletBalance_{ 0 }; - unsigned nbTransactions_{ 0 }; QmlAddressListModel* addrModel_{ nullptr }; TxListModel* pendingTxModel_{ nullptr }; TxListModel* txModel_{ nullptr }; diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 5ae397f84..74c2f866e 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -63,7 +63,7 @@ QString TxListModel::getData(int row, int col) const const auto& entry = data_.at(row - 1); switch (col) { case 0: return QDateTime::fromSecsSinceEpoch(entry.txTime).toString(); - case 1: return walletNameById(*entry.walletIds.cbegin()); + case 1: return walletName(row - 1); case 2: return txType(row - 1); case 3: { bs::Address address; @@ -143,17 +143,13 @@ float TxListModel::colWidth(int col) const return 1.0; } -QString TxListModel::walletNameById(const std::string& walletId) const +QString TxListModel::walletName(int row) const { - auto itName = walletNames_.find(walletId); - if (itName != walletNames_.end()) { - return QString::fromStdString(itName->second); - } - itName = walletNames_.find(bs::toLower(walletId)); - if (itName != walletNames_.end()) { - return QString::fromStdString(itName->second); + const auto& itTxDet = txDetails_.find(row); + if (itTxDet != txDetails_.end()) { + return QString::fromStdString(itTxDet->second.walletName); } - return QString::fromStdString(walletId); + return {}; } QString TxListModel::txType(int row) const @@ -219,23 +215,68 @@ QHash TxListModel::roleNames() const void TxListModel::addRows(const std::vector& entries) { - beginInsertRows(QModelIndex(), rowCount(), rowCount() + entries.size() - 1); - data_.insert(data_.end(), entries.cbegin(), entries.cend()); - endInsertRows(); + std::vector newEntries; + for (const auto& entry : entries) { + int row = 0; + for (int i = 0; i < data_.size(); ++i) { + const auto& de = data_.at(i); + if ((entry.txHash == de.txHash) && (de.walletIds == entry.walletIds)) { + data_[i].txTime = entry.txTime; + data_[i].recvTime = entry.recvTime; + row = i + 1; + break; + } + } + if (row) { + logger_->debug("[{}::{}] updating entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); + emit dataChanged(createIndex(row, 0), createIndex(row, 0)); + } + else { + logger_->debug("[{}::{}] adding entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); + newEntries.push_back(entry); + } + } + if (!newEntries.empty()) { + beginInsertRows(QModelIndex(), rowCount(), rowCount() + newEntries.size() - 1); + data_.insert(data_.end(), newEntries.cbegin(), newEntries.cend()); + endInsertRows(); + emit nbTxChanged(); + } } void TxListModel::prependRow(const bs::TXEntry& entry) { + logger_->debug("[{}::{}] prepending entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); beginInsertRows(QModelIndex(), 1, 1); data_.insert(data_.cbegin(), entry); endInsertRows(); + emit nbTxChanged(); } void TxListModel::addRow(const bs::TXEntry& entry) { - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - data_.push_back(entry); - endInsertRows(); + int row = 0; + for (int i = 0; i < data_.size(); ++i) { + const auto& de = data_.at(i); + if ((entry.txHash == de.txHash) && (de.walletIds == entry.walletIds)) { + data_[i].txTime = entry.txTime; + data_[i].recvTime = entry.recvTime; + row = i + 1; + break; + } + } + + if (row) { + logger_->debug("[{}::{}] updating entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); + emit dataChanged(createIndex(row, 0), createIndex(row, 0)); + } + else { + logger_->debug("[{}::{}] adding entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + data_.push_back(entry); + endInsertRows(); + emit nbTxChanged(); + } } void TxListModel::clear() @@ -244,6 +285,7 @@ void TxListModel::clear() data_.clear(); txDetails_.clear(); endResetModel(); + emit nbTxChanged(); } void TxListModel::setTxComment(const std::string& txHash, const std::string& comment) @@ -264,54 +306,24 @@ void TxListModel::setTxComment(const std::string& txHash, const std::string& com } } -void TxListModel::setWalletName(const std::string& walletId, const std::string& walletName) -{ - const auto& [it, inserted] = walletNames_.insert({ walletId, walletName }); - if (inserted) { - int rowFirst = 0, rowLast = 0; - for (int i = 0; i < data_.size(); ++i) { - const auto& entry = data_.at(i); - if (entry.walletIds.empty()) { - continue; - } - const auto& entryWalletId = bs::toLower(*entry.walletIds.cbegin()); - if (bs::toLower(walletId) == entryWalletId) { - if (!rowFirst) { - rowFirst = i + 1; - } - rowLast = i + 1; - } - } - if (rowFirst && rowLast) { - emit dataChanged(createIndex(rowFirst, 1), createIndex(rowLast, 1)); - } - //logger_->debug("[{}] found rows {}-{} for {} = {}", __func__, rowFirst, rowLast, walletId, walletName); - } -} - void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet) { int row = 0; for (int i = 0; i < data_.size(); ++i) { const auto& entry = data_.at(i); - if (entry.txHash == txDet.txHash) { - for (const auto& walletId : entry.walletIds) { - if (bs::toLower(walletId) == bs::toLower(txDet.walletId)) { - txDetails_[i] = txDet; - row = i + 1; - break; - } - } - if (row) { - break; - } + if ((entry.txHash == txDet.txHash) && (txDet.walletIds == entry.walletIds)) { + txDetails_[i] = txDet; + data_[i].addresses = txDet.ownAddresses; + row = i + 1; + break; } } if (row) { - emit dataChanged(createIndex(row, 2), createIndex(row, 6)); + //logger_->debug("[{}] {} {} found at row {}", __func__, txDet.txHash.toHexStr(), txDet.hdWalletId, row); + emit dataChanged(createIndex(row, 1), createIndex(row, 6)); } else { - //logger_->debug("[{}] {} {} not found", __func__, txDet.txHash.toHexStr(), txDet.walletId); + //logger_->debug("[{}] {} {} not found", __func__, txDet.txHash.toHexStr(), txDet.hdWalletId); } } diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index a87749ffd..70261dd3d 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -36,20 +36,25 @@ class TxListModel : public QAbstractTableModel QVariant data(const QModelIndex& index, int role) const override; QHash roleNames() const override; + Q_PROPERTY(int nbTx READ nbTx NOTIFY nbTxChanged); + int nbTx() const { return data_.size(); } + void prependRow(const bs::TXEntry&); void addRow(const bs::TXEntry&); void addRows(const std::vector&); void clear(); void setTxComment(const std::string& txHash, const std::string& comment); - void setWalletName(const std::string& walletId, const std::string& walletName); void setDetails(const bs::sync::TXWalletDetails&); void setCurrentBlock(uint32_t); +signals: + void nbTxChanged(); + private: QString getData(int row, int col) const; QColor dataColor(int row, int col) const; float colWidth(int col) const; - QString walletNameById(const std::string&) const; + QString walletName(int row) const; QString txType(int row) const; QString txFlag(int row) const; QString txId(int row) const; @@ -59,7 +64,6 @@ class TxListModel : public QAbstractTableModel const QStringList header_; std::vector data_; std::unordered_map txComments_; - std::unordered_map walletNames_; std::map txDetails_; uint32_t curBlock_; }; diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 4fd589628..fff04614a 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -30,7 +30,7 @@ Item { spacing: 15 Label { - text: qsTr("Transactions list (%1)").arg(bsApp.nbTransactions) + text: qsTr("Transactions list (%1)").arg(txListModel.nbTx) font.pointSize: 14 } Item { // spacer item diff --git a/GUI/QtWidgets/QtGuiAdapter.cpp b/GUI/QtWidgets/QtGuiAdapter.cpp index c303bb711..179e3c1c7 100644 --- a/GUI/QtWidgets/QtGuiAdapter.cpp +++ b/GUI/QtWidgets/QtGuiAdapter.cpp @@ -1018,7 +1018,9 @@ void QtGuiAdapter::onNeedTXDetails(const std::vector &txWall auto request = msgReq->add_requests(); //logger_->debug("[{}] {}", __func__, txw.txHash.toHexStr()); request->set_tx_hash(txw.txHash.toBinStr()); - request->set_wallet_id(txw.walletId); + for (const auto& walletId : txw.walletIds) { + request->add_wallet_ids(walletId); + } request->set_value(txw.value); } if (!addr.empty()) { @@ -1317,7 +1319,7 @@ ProcessingResult QtGuiAdapter::processTXDetails(uint64_t msgId, const WalletsMes { std::vector txDetails; for (const auto &resp : response.responses()) { - bs::sync::TXWalletDetails txDet{ BinaryData::fromString(resp.tx_hash()), resp.wallet_id() + bs::sync::TXWalletDetails txDet{ BinaryData::fromString(resp.tx_hash()), resp.hd_wallet_id() , resp.wallet_name(), static_cast(resp.wallet_type()) , resp.wallet_symbol(), static_cast(resp.direction()) , resp.comment(), resp.valid(), resp.amount() }; @@ -1522,8 +1524,8 @@ ProcessingResult QtGuiAdapter::processZC(const BlockSettle::Common::ArmoryMessag for (const auto& zcEntry : zcs.tx_entries()) { auto txReq = msgReq->add_requests(); txReq->set_tx_hash(zcEntry.tx_hash()); - if (zcEntry.wallet_ids_size() > 0) { - txReq->set_wallet_id(zcEntry.wallet_ids(0)); + for (const auto& walletId : zcEntry.wallet_ids()) { + txReq->add_wallet_ids(walletId); } txReq->set_value(zcEntry.value()); } diff --git a/common b/common index b17f94851..b08f335be 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit b17f94851ff6bc845f902bf6400421ebda0a4acc +Subproject commit b08f335be10dd8cc3fa13300f9cae4e64f400d6c From 946923f4101ef63f8b89a3dca7da879b413e0e1e Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 27 Dec 2022 18:55:45 +0300 Subject: [PATCH 019/436] Fix wallet balance update --- GUI/QtQuick/QtQuickAdapter.cpp | 21 ++++++++++++--------- GUI/QtQuick/QtQuickAdapter.h | 3 ++- GUI/QtQuick/TxListModel.cpp | 5 +++++ common | 2 +- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 14b123d67..f327d0f15 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -554,10 +554,7 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) case WalletsMessage::kWalletData: return processWalletData(env.responseId(), msg.wallet_data()); case WalletsMessage::kWalletBalances: - if (env.responseId()) { - return processWalletBalances(msg.wallet_balances()); - } - break; + return processWalletBalances(env.responseId(), msg.wallet_balances()); case WalletsMessage::kTxDetailsResponse: return processTXDetails(env.responseId(), msg.tx_details_response()); case WalletsMessage::kWalletsListResponse: @@ -741,6 +738,7 @@ std::string QtQuickAdapter::hdWalletIdByIndex(int index) void QtQuickAdapter::walletSelected(int index) { + curWalletIndex_ = index; const auto& walletName = walletsList_.at(index).toStdString(); const auto& walletId = hdWalletIdByIndex(index); confWalletBalance_ = unconfWalletBalance_ = totalWalletBalance_ = 0; @@ -798,13 +796,18 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId return ProcessingResult::Success; } -ProcessingResult QtQuickAdapter::processWalletBalances(const WalletsMessage_WalletBalances &response) +ProcessingResult QtQuickAdapter::processWalletBalances(bs::message::SeqId responseId + , const WalletsMessage_WalletBalances &response) { //logger_->debug("[{}] {}", __func__, response.DebugString()); - totalWalletBalance_ += response.total_balance(); - confWalletBalance_ += response.spendable_balance(); - unconfWalletBalance_ += response.unconfirmed_balance(); - nbUsedWalletAddresses_ += response.nb_addresses(); + if (response.wallet_id() != hdWalletIdByIndex(curWalletIndex_)) { + return ProcessingResult::Ignored; + } + totalWalletBalance_ = response.total_balance(); + confWalletBalance_ = response.spendable_balance(); + unconfWalletBalance_ = response.unconfirmed_balance(); + nbUsedWalletAddresses_ = response.nb_addresses(); + for (const auto& addrBal : response.address_balances()) { addrModel_->updateRow(BinaryData::fromString(addrBal.address()), addrBal.total_balance(), addrBal.tx_count()); } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 9922c5b99..791ae0725 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -194,7 +194,7 @@ private slots: void processWalletLoaded(const bs::sync::WalletInfo &); bs::message::ProcessingResult processWalletData(const bs::message::SeqId , const BlockSettle::Common::WalletsMessage_WalletData&); - bs::message::ProcessingResult processWalletBalances(const BlockSettle::Common::WalletsMessage_WalletBalances &); + bs::message::ProcessingResult processWalletBalances(bs::message::SeqId, const BlockSettle::Common::WalletsMessage_WalletBalances &); bs::message::ProcessingResult processTXDetails(bs::message::SeqId, const BlockSettle::Common::WalletsMessage_TXDetailsResponse &); bs::message::ProcessingResult processLedgerEntries(const BlockSettle::Common::LedgerEntries &); bs::message::ProcessingResult processAddressHist(const BlockSettle::Common::ArmoryMessage_AddressHistory&); @@ -242,6 +242,7 @@ private slots: const QStringList txTypes_; unsigned nbUsedWalletAddresses_{ 0 }; double confWalletBalance_{ 0 }, unconfWalletBalance_{ 0 }, totalWalletBalance_{ 0 }; + int curWalletIndex_{ 0 }; QmlAddressListModel* addrModel_{ nullptr }; TxListModel* pendingTxModel_{ nullptr }; TxListModel* txModel_{ nullptr }; diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 74c2f866e..ab9ee8b62 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -247,8 +247,13 @@ void TxListModel::addRows(const std::vector& entries) void TxListModel::prependRow(const bs::TXEntry& entry) { logger_->debug("[{}::{}] prepending entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); + decltype(txDetails_) prevDet; beginInsertRows(QModelIndex(), 1, 1); data_.insert(data_.cbegin(), entry); + txDetails_.swap(prevDet); + for (auto txDet : prevDet) { + txDetails_[txDet.first + 1] = std::move(txDet.second); + } endInsertRows(); emit nbTxChanged(); } diff --git a/common b/common index b08f335be..0d70f4173 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit b08f335be10dd8cc3fa13300f9cae4e64f400d6c +Subproject commit 0d70f41734934aa34d39b8ad984e4b7398f9d5ac From b7b8f32916640aeb4e16af08570557ec561d109a Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 29 Dec 2022 19:27:53 +0200 Subject: [PATCH 020/436] add verify seed --- GUI/QtQuick/images/warning_icon.png | Bin 0 -> 983 bytes GUI/QtQuick/qml/BsStyles/BSStyle.qml | 1 + GUI/QtQuick/qml/CreateWallet.qml | 20 ++- .../qml/StyledControls/CustomButton.qml | 3 +- .../StyledControls/CustomSeedTextInput.qml | 78 ++++++++++ GUI/QtQuick/qml/WalletSeed.qml | 6 + GUI/QtQuick/qml/WalletSeedVerify.qml | 134 ++++++++++++++++++ GUI/QtQuick/qtquick.qrc | 3 + 8 files changed, 243 insertions(+), 2 deletions(-) create mode 100755 GUI/QtQuick/images/warning_icon.png create mode 100644 GUI/QtQuick/qml/StyledControls/CustomSeedTextInput.qml create mode 100644 GUI/QtQuick/qml/WalletSeedVerify.qml diff --git a/GUI/QtQuick/images/warning_icon.png b/GUI/QtQuick/images/warning_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..efb6fa7081df91550a91e0ce81a7d2c8262435e9 GIT binary patch literal 983 zcmV;|11S87P)qSWJ8DJR+cNOVH?u-o}9#1Lwt7GaXHIJ%&uf(nYV$0~s-a<;@dPy@9HzX2Ffbg?@_ z6_7>a-bs0l%@mLJKa@JC0c*k}W1Fa`NXEWtOgZNl4rne|!kTba#;V3+eot{MMY?^I zrjaqM2vdXtw%>I@?&e_~e6=h?> zBxBfgNveF5tehd8xYLLVatp0!j6INv`FL#58%uYWBn@N~PNBm0}zF!}zNtDRg zs-T~M42GUT&oVU=ZNgM&RVG0|61Q<5W$&SA9HvX3T2nL8Cj1JZ$0ji?Gl>kTWzjv7 zIj}GjEy5X-=$DPo31i56iKlkh5vP6b67$Na!=uloFVF?-tG@_b?iJ5p6H%m<-506Sz zkDJZ8&YY~7l*wEn;lDx*G)!U#$7+Oq|3P;i|67^SJIiD)moOJvJV|>sMo>3REH+R^ zOlnXRtzSnEC!!nA5K$B=MCDU|01Hn60CTYN$l zd4VT4cWHh(2gldzwm3zQG@E-*pgT9r(;v4_~002ovPDHLk FV1nYSs6qe$ literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index baf0a9698..5f99084ed 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -19,6 +19,7 @@ QtObject { readonly property color backgroundModalColor: "#737373" readonly property color backgroundModeLessColor: "#939393" + readonly property color disabledColor: "#22293B" readonly property color disabledTextColor: "#71787f" readonly property color disabledBgColor: "#31383f" diff --git a/GUI/QtQuick/qml/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet.qml index 2f2232356..ac3218ca5 100644 --- a/GUI/QtQuick/qml/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet.qml @@ -7,6 +7,9 @@ import "BsStyles" Window { id: root + + property var phrase + visible: true flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog @@ -25,6 +28,8 @@ Window { Rectangle { id: rect + + property var phrase color: "#191E2A" opacity: 1 radius: 16 @@ -132,7 +137,7 @@ Window { id: start_create visible: false onSig_create_new: { - wallet_seed.phrase = bsApp.newSeedPhrase() + root.phrase = bsApp.newSeedPhrase() stack_create_wallet.push(wallet_seed) } } @@ -140,6 +145,19 @@ Window { WalletSeed { id: wallet_seed visible: false + phrase: root.phrase + onSig_continue: { + stack_create_wallet.push(wallet_seed_verify) + } + } + + WalletSeedVerify { + id: wallet_seed_verify + visible: false + phrase: root.phrase + onSig_verified: { + console.log("onSig_verified"); + } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomButton.qml b/GUI/QtQuick/qml/StyledControls/CustomButton.qml index 4082f1cde..9a1efda5f 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButton.qml @@ -19,7 +19,8 @@ Button { font.pixelSize: 16 font.family: "Roboto" font.weight: Font.Bold - palette.buttonText: "#FFFFFF" + palette.buttonText: enabled ? "#FFFFFF" : "#020817" + icon.color: "transparent" icon.width: 24 diff --git a/GUI/QtQuick/qml/StyledControls/CustomSeedTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomSeedTextInput.qml new file mode 100644 index 000000000..722152e0b --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomSeedTextInput.qml @@ -0,0 +1,78 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import "../BsStyles" + +Rectangle { + id: rect + + property alias serial_num: serial_number.text + property alias seed_text: seed.text + property bool isValid: false + + signal textChanged() + + height: 46 + + color: "#020817" + opacity: 1 + radius: 14 + + border.color: isValid ? (seed.focus ? "#45A6FF" : "#3C435A") : "#EB6060" + border.width: 1 + + Label { + id: serial_number + + anchors.top: rect.top + anchors.topMargin: 8 + anchors.left: rect.left + anchors.leftMargin: 10 + + font.pixelSize: 12 + font.family: "Roboto" + font.weight: Font.Normal + + color: "#7A88B0" + } + + TextInput { + id: seed + + anchors.top: rect.top + anchors.topMargin: 13 + anchors.bottom: rect.bottom + anchors.bottomMargin: 13 + anchors.left: rect.left + anchors.leftMargin: 50 + width: rect.width - 100 + + horizontalAlignment : TextInput.AlignHCenter + + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Normal + + color: "#E2E7FF" + + onTextChanged : { + rect.textChanged() + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + seed.forceActiveFocus() + } + } +} diff --git a/GUI/QtQuick/qml/WalletSeed.qml b/GUI/QtQuick/qml/WalletSeed.qml index 775fab812..792c6c8b1 100644 --- a/GUI/QtQuick/qml/WalletSeed.qml +++ b/GUI/QtQuick/qml/WalletSeed.qml @@ -11,6 +11,8 @@ ColumnLayout { id: layout + signal sig_continue() + property var phrase height: 481 @@ -83,6 +85,10 @@ ColumnLayout { Component.onCompleted: { continue_but.preferred = true } + + onClicked: { + layout.sig_continue() + } } } diff --git a/GUI/QtQuick/qml/WalletSeedVerify.qml b/GUI/QtQuick/qml/WalletSeedVerify.qml new file mode 100644 index 000000000..312ebb525 --- /dev/null +++ b/GUI/QtQuick/qml/WalletSeedVerify.qml @@ -0,0 +1,134 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "StyledControls" +import "BsStyles" + + +ColumnLayout { + + id: layout + + property var phrase + signal sig_verified() + + property var indexes: [ "1", "6", "8", "11"] + + height: 521 + width: 580 + + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: "Verify your seed" + } + + ListView { + id: list + + Layout.fillHeight: true + Layout.fillWidth: true + Layout.leftMargin: 25 + Layout.topMargin: 32 + + spacing : 10 + property var isValid: true + property var isComplete: false + + model: indexes + delegate: CustomSeedTextInput { + width: 530 + serial_num: layout.indexes[index] + isValid: list.isValid + onTextChanged : { + list.isComplete = true + for (var i = 0; i < list.count; i++) + { + if(list.itemAtIndex(i).seed_text === "") + { + list.isComplete = false + break + } + } + } + } + + } + + Label { + id: error_description + + visible: !list.isValid + + text: "Your words are wrong" + + Layout.leftMargin: 222 + Layout.bottomMargin: 114 + Layout.preferredHeight : 16 + + height: 16 + width: 136 + + color: "#EB6060" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + RowLayout { + id: row + spacing: 10 + + Layout.leftMargin: 24 + Layout.bottomMargin: 40 + + CustomButton { + id: copy_seed_but + text: qsTr("Skip") + width: 261 + + Component.onCompleted: { + copy_seed_but.preferred = false + } + } + + CustomButton { + id: continue_but + text: qsTr("Continue") + width: 261 + enabled: list.isComplete + + Component.onCompleted: { + continue_but.preferred = true + } + + onClicked: { + list.isValid = true + for (var i = 0; i < list.count; i++) + { + console.log("layout.indexes[i] - " + layout.indexes[i]) + console.log("layout.phrase[layout.indexes[i]]) - " + layout.phrase[layout.indexes[i]] - 1) + console.log("list.itemAtIndex(i).seed_text - " + list.itemAtIndex(i).seed_text) + if(list.itemAtIndex(i).seed_text !== layout.phrase[layout.indexes[i] - 1]) + { + list.isValid = false + break + } + } + if (list.isValid) + { + console.log("layout.verified") + layout.sig_verified() + } + } + + } + + } +} + diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 0874d719c..bacd58db8 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -72,5 +72,8 @@ qml/WalletSeed.qml qml/StyledControls/CustomSeedLabel.qml images/copy_seed.png + qml/WalletSeedVerify.qml + qml/StyledControls/CustomSeedTextInput.qml + images/warning_icon.png From 17ba3e3253f6cdadde13d56c943b0ed07abe7fa7 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 29 Dec 2022 20:34:23 +0300 Subject: [PATCH 021/436] fix VerifyTX details --- GUI/QtQuick/QTXSignRequest.cpp | 5 +++-- GUI/QtQuick/TxListModel.cpp | 10 +++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index e63c8e673..dd4e0bf0b 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -52,7 +52,8 @@ QString QTXSignRequest::outputAmount() const if (!txReq_.isValid()) { return {}; } - return QString::number(txReq_.amountSent([](const bs::Address&) { return true; }) / BTCNumericTypes::BalanceDivider + return QString::number(txReq_.amountReceived([changeAddr = txReq_.change.address] + (const bs::Address& addr) { return (addr != changeAddr); }) / BTCNumericTypes::BalanceDivider , 'f', 8); } @@ -61,7 +62,7 @@ QString QTXSignRequest::inputAmount() const if (!txReq_.isValid()) { return {}; } - return QString::number(txReq_.amountReceived([](const bs::Address&) { return true; }) / BTCNumericTypes::BalanceDivider + return QString::number(txReq_.armorySigner_.getTotalInputsValue() / BTCNumericTypes::BalanceDivider , 'f', 8); } diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index ab9ee8b62..3a142d411 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -228,11 +228,11 @@ void TxListModel::addRows(const std::vector& entries) } } if (row) { - logger_->debug("[{}::{}] updating entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); + //logger_->debug("[{}::{}] updating entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); emit dataChanged(createIndex(row, 0), createIndex(row, 0)); } else { - logger_->debug("[{}::{}] adding entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); + //logger_->debug("[{}::{}] adding entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); newEntries.push_back(entry); } } @@ -246,7 +246,7 @@ void TxListModel::addRows(const std::vector& entries) void TxListModel::prependRow(const bs::TXEntry& entry) { - logger_->debug("[{}::{}] prepending entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); + //logger_->debug("[{}::{}] prepending entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); decltype(txDetails_) prevDet; beginInsertRows(QModelIndex(), 1, 1); data_.insert(data_.cbegin(), entry); @@ -272,11 +272,11 @@ void TxListModel::addRow(const bs::TXEntry& entry) } if (row) { - logger_->debug("[{}::{}] updating entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); + //logger_->debug("[{}::{}] updating entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); emit dataChanged(createIndex(row, 0), createIndex(row, 0)); } else { - logger_->debug("[{}::{}] adding entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); + //logger_->debug("[{}::{}] adding entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); beginInsertRows(QModelIndex(), rowCount(), rowCount()); data_.push_back(entry); endInsertRows(); From 9655d65d26597570623166847a2122284a37c478 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 29 Dec 2022 23:49:42 +0200 Subject: [PATCH 022/436] add skip verification --- GUI/QtQuick/qml/CreateWallet.qml | 13 +++ GUI/QtQuick/qml/WalletSeedSkipAccept.qml | 100 +++++++++++++++++++++++ GUI/QtQuick/qml/WalletSeedVerify.qml | 9 +- GUI/QtQuick/qtquick.qrc | 1 + 4 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 GUI/QtQuick/qml/WalletSeedSkipAccept.qml diff --git a/GUI/QtQuick/qml/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet.qml index ac3218ca5..37ba5749e 100644 --- a/GUI/QtQuick/qml/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet.qml @@ -158,6 +158,19 @@ Window { onSig_verified: { console.log("onSig_verified"); } + onSig_skipped: { + stack_create_wallet.push(wallet_seed_accept) + } + } + + WalletSeedSkipAccept { + id: wallet_seed_accept + visible: false + onSig_skip: { + } + onSig_not_skip: { + stack_create_wallet.pop() + } } } diff --git a/GUI/QtQuick/qml/WalletSeedSkipAccept.qml b/GUI/QtQuick/qml/WalletSeedSkipAccept.qml new file mode 100644 index 000000000..8a5685972 --- /dev/null +++ b/GUI/QtQuick/qml/WalletSeedSkipAccept.qml @@ -0,0 +1,100 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "StyledControls" +import "BsStyles" + +ColumnLayout { + + id: layout + + signal sig_skip() + signal sig_not_skip() + + height: 521 + width: 580 + + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: "Verify your seed" + } + + Image { + id: warning_icon + + Layout.alignment: Qt.AlignHCenter | Qt.AlignTop + Layout.topMargin: 24 + Layout.preferredHeight : 44 + Layout.preferredWidth : 44 + + source: "qrc:/images/warning_icon.png" + width: 44 + height: 44 + } + + Label { + id: warning_description + + text: "Are you sure you want to skip the seed verifying?" + + Layout.alignment: Qt.AlignHCenter | Qt.AlignTop + + Layout.topMargin: 16 + Layout.preferredHeight : 16 + + color: "#E2E7FF" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + RowLayout { + id: row + spacing: 10 + + Layout.leftMargin: 24 + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignLeft | Qt.AlignBottom + + CustomButton { + id: skip_but + text: qsTr("Yes, Skip") + width: 261 + + Component.onCompleted: { + skip_but.preferred = false + } + + onClicked: { + sig_skip() + } + } + + CustomButton { + id: no_but + text: qsTr("No") + width: 261 + + Component.onCompleted: { + no_but.preferred = true + } + + onClicked: { + sig_not_skip() + } + } + + } +} diff --git a/GUI/QtQuick/qml/WalletSeedVerify.qml b/GUI/QtQuick/qml/WalletSeedVerify.qml index 312ebb525..3eeb5548c 100644 --- a/GUI/QtQuick/qml/WalletSeedVerify.qml +++ b/GUI/QtQuick/qml/WalletSeedVerify.qml @@ -13,6 +13,7 @@ ColumnLayout { property var phrase signal sig_verified() + signal sig_skipped() property var indexes: [ "1", "6", "8", "11"] @@ -88,12 +89,16 @@ ColumnLayout { Layout.bottomMargin: 40 CustomButton { - id: copy_seed_but + id: skip_but text: qsTr("Skip") width: 261 Component.onCompleted: { - copy_seed_but.preferred = false + skip_but.preferred = false + } + + onClicked: { + layout.sig_skipped() } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index bacd58db8..806e70d9d 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -75,5 +75,6 @@ qml/WalletSeedVerify.qml qml/StyledControls/CustomSeedTextInput.qml images/warning_icon.png + qml/WalletSeedSkipAccept.qml From b709e481f150351adc83fa79ae27dcccf527b8b9 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 30 Dec 2022 07:27:01 +0200 Subject: [PATCH 023/436] add password confirmation --- GUI/QtQuick/images/Eye_icon _unvisible.png | Bin 0 -> 680 bytes GUI/QtQuick/images/Eye_icon _visible.png | Bin 0 -> 680 bytes GUI/QtQuick/qml/ConfirmPassword.qml | 118 ++++++++++++++++++ GUI/QtQuick/qml/CreateWallet.qml | 12 +- .../StyledControls/CustomSeedTextInput.qml | 67 +--------- .../qml/StyledControls/CustomTextInput.qml | 105 +++++++++++++--- GUI/QtQuick/qml/WalletSeed.qml | 2 +- GUI/QtQuick/qml/WalletSeedVerify.qml | 10 +- GUI/QtQuick/qtquick.qrc | 3 + 9 files changed, 231 insertions(+), 86 deletions(-) create mode 100755 GUI/QtQuick/images/Eye_icon _unvisible.png create mode 100755 GUI/QtQuick/images/Eye_icon _visible.png create mode 100644 GUI/QtQuick/qml/ConfirmPassword.qml diff --git a/GUI/QtQuick/images/Eye_icon _unvisible.png b/GUI/QtQuick/images/Eye_icon _unvisible.png new file mode 100755 index 0000000000000000000000000000000000000000..420af037a420e0d7dc709a494d654dbd81f61c80 GIT binary patch literal 680 zcmV;Z0$2TsP)c# zlVw-Yie;5uMeQ&<(_hcu-Lpjhm371Tgr3-p8(c*kP zY5NdU;9QRzj^4qkk>IGpv7dNmN)Yi)Z#;|rs?$AUNgn}R>(;i9cvf+eWI09Kjwuc30yDiHJU>3yB%G0hPijGH0i4EuF=Zw zF5e2T3T-63Xym)H$og0Fb5vnicCB#PMu5%$8kmPWX1YPtxy!GWUUp1PYh{YWc8X3? z3h+V3a7T+ko$aPq*qFfa{OcVhlQ3A9$@NRX@0f!eBJCgB-}vnQTl)@Az;CM2AzLy4 O0000c# zlVw-Yie;5uMeQ&<(_hcu-Lpjhm371Tgr3-p8(c*kP zY5NdU;9QRzj^4qkk>IGpv7dNmN)Yi)Z#;|rs?$AUNgn}R>(;i9cvf+eWI09Kjwuc30yDiHJU>3yB%G0hPijGH0i4EuF=Zw zF5e2T3T-63Xym)H$og0Fb5vnicCB#PMu5%$8kmPWX1YPtxy!GWUUp1PYh{YWc8X3? z3h+V3a7T+ko$aPq*qFfa{OcVhlQ3A9$@NRX@0f!eBJCgB-}vnQTl)@Az;CM2AzLy4 O0000qml/StyledControls/CustomSeedTextInput.qml images/warning_icon.png qml/WalletSeedSkipAccept.qml + images/Eye_icon _unvisible.png + images/Eye_icon _visible.png + qml/ConfirmPassword.qml From 41177f8b0cd31303aaaf07a40c4c29dfaadb1d01 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 30 Dec 2022 09:51:06 +0300 Subject: [PATCH 024/436] Add activated setting --- GUI/QtQuick/QtQuickAdapter.cpp | 5 +++++ GUI/QtQuick/QtQuickAdapter.h | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index f327d0f15..8f31ca34c 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -712,6 +712,11 @@ void QtQuickAdapter::requestInitialSettings() setReq->set_index(SetIdx_ArmoryDbPort); setReq->set_type(SettingType_String); + setReq = msgReq->add_requests(); + setReq->set_source(SettingSource_Local); + setReq->set_index(SetIdx_Initialized); + setReq->set_type(SettingType_Bool); + pushRequest(user_, userSettings_, msg.SerializeAsString()); } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 791ae0725..6cb823332 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -142,6 +142,10 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop QString settingArmoryPort() const { return getSetting(ApplicationSettings::Setting::armoryDbPort).toString(); } void setArmoryPort(const QString& str) { setSetting(ApplicationSettings::Setting::armoryDbPort, str); } + Q_PROPERTY(bool settingActivated READ settingActivated WRITE setActivated NOTIFY settingChanged) + bool settingActivated() const { return getSetting(ApplicationSettings::Setting::initialized).toBool(); } + void setActivated(bool b) { setSetting(ApplicationSettings::Setting::initialized, b); } + Q_PROPERTY(int armoryState READ armoryState NOTIFY armoryStateChanged) int armoryState() const { return armoryState_; } From 502cadf70701fbfe339ec8daca6748c88b628fef Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 30 Dec 2022 10:50:56 +0300 Subject: [PATCH 025/436] auto wallet name generation if it was passed empty --- GUI/QtQuick/QtQuickAdapter.cpp | 28 ++++++++++++++++++++++++---- GUI/QtQuick/QtQuickAdapter.h | 1 + 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 8f31ca34c..c4252b84e 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -741,6 +741,24 @@ std::string QtQuickAdapter::hdWalletIdByIndex(int index) return walletId; } +std::string QtQuickAdapter::generateWalletName() const +{ + int index = walletNames_.size(); + std::string name; + bool nameExists = true; + while (nameExists) { + name = "wallet" + std::to_string(++index); + nameExists = false; + for (const auto& w : walletNames_) { + if (w.second == name) { + nameExists = true; + break; + } + } + } + return name; +} + void QtQuickAdapter::walletSelected(int index) { curWalletIndex_ = index; @@ -983,14 +1001,15 @@ void QtQuickAdapter::copySeedToClipboard(const QStringList& seed) void QtQuickAdapter::createWallet(const QString& name, const QStringList& seed , const QString& password) { - logger_->debug("[{}] {}", __func__, name.toStdString()); + const auto walletName = name.isEmpty() ? generateWalletName() : name.toStdString(); + logger_->debug("[{}] {}", __func__, walletName); BIP39::word_list words; for (const auto& w : seed) { words.add(w.toStdString()); } SignerMessage msg; auto msgReq = msg.mutable_create_wallet(); - msgReq->set_name(name.toStdString()); + msgReq->set_name(walletName); //msgReq->set_xpriv_key(seedData.xpriv); const auto binSeed = BIP39::seed_from_mnemonic(words); msgReq->set_seed(binSeed.toBinStr()); @@ -1001,14 +1020,15 @@ void QtQuickAdapter::createWallet(const QString& name, const QStringList& seed void QtQuickAdapter::importWallet(const QString& name, const QStringList& seed , const QString& password) { - logger_->debug("[{}] {}", __func__, name.toStdString()); + const auto walletName = name.isEmpty() ? generateWalletName() : name.toStdString(); + logger_->debug("[{}] {}", __func__, walletName); BIP39::word_list words; for (const auto& w : seed) { words.add(w.toStdString()); } SignerMessage msg; auto msgReq = msg.mutable_import_wallet(); - msgReq->set_name(name.toStdString()); + msgReq->set_name(walletName); //msgReq->set_description(seedData.description); //msgReq->set_xpriv_key(seedData.xpriv); const auto binSeed = BIP39::seed_from_mnemonic(words); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 6cb823332..be3df139e 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -194,6 +194,7 @@ private slots: void createWallet(bool primary); std::string hdWalletIdByIndex(int); + std::string generateWalletName() const; void processWalletLoaded(const bs::sync::WalletInfo &); bs::message::ProcessingResult processWalletData(const bs::message::SeqId From ba9417e49c03c7151de77577c062dbe419e57f6a Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 31 Dec 2022 00:17:17 +0200 Subject: [PATCH 026/436] fix bugs --- GUI/QtQuick/QtQuickAdapter.cpp | 3 +++ GUI/QtQuick/TermsAndConditions.txt | 1 + GUI/QtQuick/images/USB_icon_conn.png | Bin 0 -> 670 bytes GUI/QtQuick/images/USB_icon_disconn.png | Bin 0 -> 692 bytes GUI/QtQuick/qml/ConfirmPassword.qml | 1 + GUI/QtQuick/qml/CreateWallet.qml | 3 ++- GUI/QtQuick/qml/StartCreateWallet.qml | 3 ++- GUI/QtQuick/qml/TermsAndConditions.qml | 12 ++++++++++ GUI/QtQuick/qml/WalletSeedVerify.qml | 29 ++++++++++++++++++++---- GUI/QtQuick/qtquick.qrc | 2 ++ 10 files changed, 48 insertions(+), 6 deletions(-) create mode 100755 GUI/QtQuick/images/USB_icon_conn.png create mode 100755 GUI/QtQuick/images/USB_icon_disconn.png diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index c4252b84e..21d3f4d40 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -186,6 +186,9 @@ void QtQuickAdapter::run(int &argc, char **argv) qmlRegisterInterface("QUTXOList"); qmlRegisterInterface("QTxDetails"); + //need to read files in qml + qputenv("QML_XHR_ALLOW_FILE_READ", QByteArray("1")); + QQmlApplicationEngine engine; QQuickWindow::setTextRenderType(QQuickWindow::NativeTextRendering); rootCtxt_ = engine.rootContext(); diff --git a/GUI/QtQuick/TermsAndConditions.txt b/GUI/QtQuick/TermsAndConditions.txt index e69de29bb..162e96136 100644 --- a/GUI/QtQuick/TermsAndConditions.txt +++ b/GUI/QtQuick/TermsAndConditions.txt @@ -0,0 +1 @@ +"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n\nSed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\n\nNeque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n\nSed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\n\nNeque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit" diff --git a/GUI/QtQuick/images/USB_icon_conn.png b/GUI/QtQuick/images/USB_icon_conn.png new file mode 100755 index 0000000000000000000000000000000000000000..6b096010e24c786a6db4d7d2492cc5e9c15a0097 GIT binary patch literal 670 zcmV;P0%84$P)NV|kxLsS(`P&h&11i%TPQh{aYt^y>uK{*0PVA%xKum5vR z1+Fb3Y`0XMPeLAz$20%@^Zfh(EEbE!VzHbM1}Sqhk`Jzny0)DR`ja=Nff%GJ_+}_= z!B4SUM9`YunI?`TF~P-wyyt8sHVX%auBR1qjw8t;0g6MJ~a1awcc3uiRs+D}l z)#d@`bkOKek3Zy*kBC96kkA*3qM8t_GY&4l+?rKz%*%mv=*l~7GoHI~;#WCZuphG> zf0FW~V#fFbc!CQ($v--L)mVI-7d^ZiT zdkCt!9>cG??J~c1bNZ~fftEwLYy1P~%O);XSsw2a5lNr-K2L5<>Cj}aN0N61a~@Tm zF7&5&riK{oojMH_gVxl4v7L-TE!1W9Ie|JL3eCTqqwLLNP}Tg5Waw@laj~0)99=BS zq|Yslw?f%oM12UNpsP!`D0@@zWAbV!Pugr4-uea?bhXY5v1exD)!OwZsT&7vZ()9_ zXK&2{36e^Ac|DLO<6pyKO}nl<_kE(WlGYx00E-0$YmxTIRZ)6G8o z!sifw)!`ixRfa^3F|b5Jr2d~S$VtYq#bU8oESCRG}e{qtttn=z5Y;cz${jst?JWLksi6_eDpY>CIgf>BoIJt*1RiT- zc}($pVU;}&Be5)v;L?n!KwACD4YpS|%RWb9J^m62U7t$kGOzW=pm~>gi{LnZ$7$i7 z$2{B+tDue5>nXA5Khypg=(-HCDQar36@<08ffKVibe6iJm;kNlKR~@|A^OM)EjV#H zC9x#ae$!O%8%(zfw$BXX9HTl$4nC(GtgSj6DkR-Fuss}~=b2vCHlaH0fCdG7Vt$WP zi}G^;Xq?=Am6K!^^3>Q*WCKlQu~2wwzU?5`M(>?jU>p-waG3amaHq*;5!n|xf&KcZ zV^*nm#ey7NM~)t9S&wQMol}97avw$-!g0-4x?10V$k~UsS^RmoB`ZaDj~&Q;`N=en z{EXPR)m;9l!eKIx=B3mx4nGLT9AA9y;h%aqCh$$oY8FE3q=G2@n=Z{k?qP?+;cz${ a4~Ac*QW?pXE=rI90000Need help? Please consult our Getting Started Guides

" + text: "

Need help? Please consult our Getting Started Guides

" + onLinkActivated: Qt.openUrlExternally(link) } Label { diff --git a/GUI/QtQuick/qml/TermsAndConditions.qml b/GUI/QtQuick/qml/TermsAndConditions.qml index 0a6a226b8..76b788d25 100644 --- a/GUI/QtQuick/qml/TermsAndConditions.qml +++ b/GUI/QtQuick/qml/TermsAndConditions.qml @@ -19,6 +19,17 @@ ColumnLayout { spacing: 0 + Component.onCompleted: { + var xhr = new XMLHttpRequest; + xhr.open("GET", "qrc:/TermsAndConditions.txt"); + xhr.onreadystatechange = function() { + if (xhr.readyState === XMLHttpRequest.DONE) { + edit.text = xhr.responseText; + } + }; + xhr.send(); + } + CustomTitleLabel { id: title Layout.alignment: Qt.AlignLeft @@ -89,6 +100,7 @@ ColumnLayout { } onClicked: { sig_continue() + bsApp.settingActivated = true } } diff --git a/GUI/QtQuick/qml/WalletSeedVerify.qml b/GUI/QtQuick/qml/WalletSeedVerify.qml index 04e3e594b..99f4cc177 100644 --- a/GUI/QtQuick/qml/WalletSeedVerify.qml +++ b/GUI/QtQuick/qml/WalletSeedVerify.qml @@ -6,7 +6,6 @@ import QtQuick.Layouts 1.15 import "StyledControls" import "BsStyles" - ColumnLayout { id: layout @@ -15,7 +14,7 @@ ColumnLayout { signal sig_verified() signal sig_skipped() - property var indexes: [ "1", "6", "8", "11"] + property var indexes: [] height: 521 width: 580 @@ -41,7 +40,7 @@ ColumnLayout { property var isValid: true property var isComplete: false - model: indexes + //model: layout.indexes delegate: CustomSeedTextInput { width: 530 title_text: layout.indexes[index] @@ -131,5 +130,27 @@ ColumnLayout { } } -} + function createRandomIndexes() { + var idx = [] + while(idx.length < 4) + { + var r = Math.floor(Math.random() * 12) + 1; + if(idx.indexOf(r) === -1) idx.push(r); + } + for(var i_ord = 0; i_ord < 4; i_ord++) + { + for(var i = 0; i < 3 - i_ord; i++) + { + if(idx[i] > idx[i+1]) + { + var temp = idx[i] + idx[i] = idx[i+1] + idx[i+1] = temp + } + } + } + layout.indexes = idx + list.model = idx + } +} diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 2d6e7ed1f..ed455ad10 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -79,5 +79,7 @@ images/Eye_icon _unvisible.png images/Eye_icon _visible.png qml/ConfirmPassword.qml + images/USB_icon_conn.png + images/USB_icon_disconn.png From 2535439d4eb57a07bccec1c0f851972281a7f403 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 31 Dec 2022 04:08:17 +0200 Subject: [PATCH 027/436] add ImportWatchingWallet --- GUI/QtQuick/images/File.png | Bin 0 -> 224 bytes GUI/QtQuick/images/file_drop.png | Bin 0 -> 4011 bytes GUI/QtQuick/images/folder_icon.png | Bin 0 -> 367 bytes GUI/QtQuick/images/wallet_file.png | Bin 0 -> 2095 bytes GUI/QtQuick/qml/ConfirmPassword.qml | 15 -- GUI/QtQuick/qml/CreateWallet.qml | 23 +++ GUI/QtQuick/qml/ImportHardware.qml | 79 +++++++++ GUI/QtQuick/qml/ImportWatchingWallet.qml | 151 ++++++++++++++++++ .../qml/StyledControls/CustomTextSwitch.qml | 111 +++++++++++++ GUI/QtQuick/qtquick.qrc | 7 + 10 files changed, 371 insertions(+), 15 deletions(-) create mode 100755 GUI/QtQuick/images/File.png create mode 100755 GUI/QtQuick/images/file_drop.png create mode 100755 GUI/QtQuick/images/folder_icon.png create mode 100755 GUI/QtQuick/images/wallet_file.png create mode 100644 GUI/QtQuick/qml/ImportHardware.qml create mode 100644 GUI/QtQuick/qml/ImportWatchingWallet.qml create mode 100644 GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml diff --git a/GUI/QtQuick/images/File.png b/GUI/QtQuick/images/File.png new file mode 100755 index 0000000000000000000000000000000000000000..a80ca66fc9c352307f22465a4638858e9526c29a GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eK!3HFi66di4Db50q$YKTtZeb8+WSBKa0w~B> z9OUlAuzopr0P|Bx9{>OV literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/file_drop.png b/GUI/QtQuick/images/file_drop.png new file mode 100755 index 0000000000000000000000000000000000000000..ff2204028d68873e41974c228546e562e9121201 GIT binary patch literal 4011 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 literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/folder_icon.png b/GUI/QtQuick/images/folder_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..60755972354dece76dbd5f86eccf8e813bd246bc GIT binary patch literal 367 zcmV-#0g(QQP)&c9zb&{hu{v=B~ zBklA2yrpjB_M;K$zAw3FPrSfg{ACg$h%iy%W!cCnnK-NLWa?Z>yno7rM%N6dQk{Sa zG9sRl8C~!o9dr?w1uV&@o1qC-7OB`mH+>$aZpA>%6?*?=C!rqvCKGkWjoHo4X@)a| zCo)l+U1)cYy~IpHt}TTCCl-5Zn(L6rMBJZi?}8 z$YT2sgAwMjVATuKGHYF4yVjk)+e+tGrCeuh^-!s6XDD{V{d2XQTLW|GZ)6Lkv=smV N002ovPDHLkV1mfzkm~>d literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/wallet_file.png b/GUI/QtQuick/images/wallet_file.png new file mode 100755 index 0000000000000000000000000000000000000000..5d786be905666f21a171ce6a9cbc98281db5b590 GIT binary patch literal 2095 zcma)73pA8z7=8y4HAyOk8ZFV;Z6mpLb%`a>loOF#+iEp2=!j7?w3SFMThnF7t#wOu zRAk9y#v+~8E#sOsjdYk8W12A5WX%3EQw-HP%{l-3|MQ*i`QG<^p6C7l`2G9r(JGoM z0D#`(VCw=Pw+sNKxlj>Vv5lo-k(+XegGVU9B6abF0&?0aWDynWVs8UQP1=LV9|eDF zXKR3m$&03bUI3s}yT{i0U<8W8unt;2xT1N`vY|2O?5ZoGq zCq`MR9*e;ae%x78Nj*2| z$)M!c76!c(hPBf;*goDPMu9mFATvF4STrfP)HbvPdJ_l{^bz7lBQje0v|<{n4k#02UwA%F58)tO7Bwe_E0w2lS7dV@%eeAjh=6h=Ku-$1VI= z13*mJa5sRlI0V%cp+N`h0D!ZR0|)hGV0D;L`Vev4TtL!5!YIJ1d^6ityFewVvMODt z?XUoHl$Alp`4hS%Kpq@gmd@k>wsxb&9TXVt$H!F!{9*~9Sb%O=xgdCH@pdAN#>B@G>}j))p@7=(d7U&iQg!*wEwuggf1y1 zU!-t&K80&2W)QPj98AQ)Qw{N-Ea%$u0qNP3eI^ng9U$O`zh=aMEOrKh+%KzE;`4jy ziW1|JH}qQo#13gypF1d%4jC_L724=o(jU}Cbc{&Tkn>2bQaSEPDMxwTOsR_z-mA0Te;6Gdz43t2peP3gl5PK;`lavSypgd9=k$A zBw*1*Y5?YA0-r!T677?zt8V)32q;s{EKQb&UfraO%BTqBMN6F&QdkaN*Nb)tYFhco zSITS4=~uhl!x@i$;4xAIf_EP!mJ`~edCwWX*WH`|xCLrz_4K;p4`=bQ=AF##FN;Oh z9-XRfw=9M+-U{&UY3h#X$^1gK7R!)Z&is{JBImqrG22SychrFBwJk>l;`)>8X@s*{ zX=AF|eP(qf;bY}%ia2*Z9P8P5W2iOV0 z-~92KNX`{xr4`-EVYRsp31NG^Y z>^saTp>UintaM?fW}};!|M~QcJ&6?lIB}-D)7&VU5?NMT=*wjLjL|B1*pt&rzh69U UZFK2kkXWiccKd9LY>xc)KXmvH+W-In literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/qml/ConfirmPassword.qml b/GUI/QtQuick/qml/ConfirmPassword.qml index a4645862b..677133fb9 100644 --- a/GUI/QtQuick/qml/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/ConfirmPassword.qml @@ -26,21 +26,6 @@ ColumnLayout { text: qsTr("Set password") } - /*CustomTextInput { - id: wallet_name - - Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 32 - - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 - - title_text: qsTr("Wallet name") - }*/ - CustomTextInput { id: password diff --git a/GUI/QtQuick/qml/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet.qml index aa1c290e4..f9c9dc3ac 100644 --- a/GUI/QtQuick/qml/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet.qml @@ -140,6 +140,12 @@ Window { root.phrase = bsApp.newSeedPhrase() stack_create_wallet.push(wallet_seed) } + onSig_import_wallet: { + stack_create_wallet.push(import_hardware) + } + onSig_hardware_wallet: { + stack_create_wallet.push(import_watching_wallet) + } } WalletSeed { @@ -184,6 +190,23 @@ Window { } } + ImportHardware { + id: import_hardware + visible: false + onSig_import: { + root.close() + stack_create_wallet.pop(null) + } + } + + ImportWatchingWallet { + id: import_watching_wallet + visible: false + onSig_import: { + root.close() + stack_create_wallet.pop(null) + } + } } } diff --git a/GUI/QtQuick/qml/ImportHardware.qml b/GUI/QtQuick/qml/ImportHardware.qml new file mode 100644 index 000000000..902776e0c --- /dev/null +++ b/GUI/QtQuick/qml/ImportHardware.qml @@ -0,0 +1,79 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "StyledControls" +import "BsStyles" + +ColumnLayout { + + id: layout + + property bool isConnected: false + + signal sig_import() + + height: 481 + width: 580 + implicitHeight: 481 + implicitWidth: 580 + + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Import hardware") + } + + Image { + id: usb_icon + + Layout.alignment: Qt.AlignCenter + Layout.topMargin: 24 + Layout.preferredHeight : 44 + Layout.preferredWidth : 44 + + width: 44 + height: 44 + + source: layout.isConnected ? "qrc:/images/USB_icon_conn.png" : "qrc:/images/USB_icon_disconn.png" + } + + + Label { + id: subtitle + Layout.alignment: Qt.AlignCenter + Layout.topMargin: 16 + Layout.preferredHeight : 16 + text: qsTr("Connect your wallet") + color: "#E2E7FF" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + CustomButton { + id: confirm_but + text: qsTr("Import") + Layout.leftMargin: 25 + Layout.bottomMargin: 40 + width: 530 + enabled: layout.isConnected + + Component.onCompleted: { + confirm_but.preferred = true + } + onClicked: { + sig_import() + } + } +} diff --git a/GUI/QtQuick/qml/ImportWatchingWallet.qml b/GUI/QtQuick/qml/ImportWatchingWallet.qml new file mode 100644 index 000000000..6f75cd08a --- /dev/null +++ b/GUI/QtQuick/qml/ImportWatchingWallet.qml @@ -0,0 +1,151 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "StyledControls" +import "BsStyles" + +ColumnLayout { + + id: layout + + signal sig_import() + signal sig_full() + + property bool isFileChoosen: false + + height: 511 + width: 580 + + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Import wallet") + } + + CustomTextSwitch { + Layout.alignment: Qt.AlignCenter + Layout.topMargin: 24 + + onSig_full_changed: (isFull) => { + if (isFull === true) + { + layout.sig_full() + } + } + } + + Image { + id: dashed_border + + Layout.alignment: Qt.AlignCenter + Layout.topMargin: 24 + Layout.leftMargin: 25 + Layout.rightMargin: 25 + Layout.preferredHeight: 282 + height: 282 + + source: layout.isFileChoosen ? "qrc:/images/file_drop.png" : "qrc:/images/wallet_file.png" + + Image { + id: file_icon + + visible: layout.isFileChoosen + + width:12 + height: 16 + + anchors.left: parent.left + anchors.leftMargin: 203 + anchors.verticalCenter: parent.verticalCenter + + source: "qrc:/images/File.png" + } + + Image { + id: folder_icon + + visible: !layout.isFileChoosen + + width: 20 + height: 16 + + anchors.left: parent.left + anchors.leftMargin: 200 + anchors.verticalCenter: parent.verticalCenter + + source: "qrc:/images/folder_icon.png" + } + + Label { + id: label_file + + visible: layout.isFileChoosen + + anchors.left: parent.left + anchors.leftMargin: 230 + anchors.verticalCenter: parent.verticalCenter + color: "#E2E7FF" + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + id: label_folder + + visible: !layout.isFileChoosen + + anchors.left: parent.left + anchors.leftMargin: 225 + anchors.verticalCenter: parent.verticalCenter + text: qsTr("Select the file") + color: "#E2E7FF" + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Normal + } + + /*FileDialog { + id: fileDialog + visible: false + onAccepted: { + label_file.text = fileDialog.fileUrl + } + }*/ + + MouseArea { + anchors.fill: parent + onClicked: { + //fileDialog.visible = true + } + } + + } + + CustomButton { + id: import_but + text: qsTr("Import") + Layout.leftMargin: 25 + Layout.topMargin: 32 + width: 530 + enabled: layout.isFileChoosen + + Component.onCompleted: { + import_but.preferred = true + } + onClicked: { + layout.sig_import() + } + } + + Label { + id: spacer + Layout.fillHeight: true + Layout.fillWidth: true + } +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml b/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml new file mode 100644 index 000000000..08d8af100 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml @@ -0,0 +1,111 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import "../BsStyles" + +Rectangle { + id: root + + property bool isFullChoosed: true + signal sig_full_changed (bool isFull) + + width: 530 + height: 40 + + color: "transparent" + radius: 37 + border.color : "#3C435A" + border.width : 1 + + Rectangle { + id: left_rect + + width: 260 + height: 34 + + anchors.top: root.top + anchors.topMargin: 3 + anchors.left: root.left + anchors.leftMargin: 3 + + color: isFullChoosed? "#32394F": "transparent" + radius: 37 + + Label { + id: left_label + + width: 260 + height: 15 + + anchors.centerIn : left_rect + horizontalAlignment : Text.AlignHCenter + + text: "Full" + + color: isFullChoosed? "#E2E7FF": "#7A88B0" + + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Medium + } + + MouseArea { + anchors.fill: parent + onClicked: { + isFullChoosed = true + sig_full_changed(isFullChoosed) + } + } + } + + Rectangle { + id: right_rect + + width: 260 + height: 34 + + anchors.top: root.top + anchors.topMargin: 3 + anchors.right: root.right + anchors.rightMargin: 3 + + color: !isFullChoosed? "#32394F": "transparent" + radius: 37 + + Label { + id: right_label + + width: 260 + height: 15 + + anchors.centerIn : right_rect + horizontalAlignment : Text.AlignHCenter + + text: "Import watching-only wallet" + + color: !isFullChoosed? "#E2E7FF": "#7A88B0" + + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Medium + } + + MouseArea { + anchors.fill: parent + onClicked: { + isFullChoosed = false + sig_full_changed(isFullChoosed) + } + } + } + +} diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index ed455ad10..3c03b2cc2 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -81,5 +81,12 @@ qml/ConfirmPassword.qml images/USB_icon_conn.png images/USB_icon_disconn.png + qml/ImportHardware.qml + qml/StyledControls/CustomTextSwitch.qml + images/wallet_file.png + images/file_drop.png + qml/ImportWatchingWallet.qml + images/folder_icon.png + images/File.png From b299bdbae6c420a7ba012d2ae8e454e3d39c3c4a Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Sat, 31 Dec 2022 18:43:48 +0300 Subject: [PATCH 028/436] Import dialogs plugin --- BlockSettleApp/CMakeLists.txt | 1 + BlockSettleApp/main.cpp | 1 + BlockSettleHW/CMakeLists.txt | 10 +--- BlockSettleHW/trezor/trezorClient.cpp | 63 +++++++++------------- BlockSettleHW/trezor/trezorClient.h | 15 +++--- BlockSettleHW/trezor/trezorDevice.cpp | 77 +++++++++++++-------------- BlockSettleHW/trezor/trezorDevice.h | 22 ++++---- CMakeLists.txt | 5 ++ 8 files changed, 89 insertions(+), 105 deletions(-) diff --git a/BlockSettleApp/CMakeLists.txt b/BlockSettleApp/CMakeLists.txt index 315ab5303..b520e142b 100644 --- a/BlockSettleApp/CMakeLists.txt +++ b/BlockSettleApp/CMakeLists.txt @@ -48,6 +48,7 @@ ENDIF () TARGET_LINK_LIBRARIES( ${BLOCKSETTLE_APP_NAME} ${TERMINAL_CORE_NAME} +# ${BLOCKSETTLE_HW_LIBRARY_NAME} ${TERMINAL_GUI_QT_NAME} ${TERMINAL_GUI_QTQUICK_NAME} ${BLOCKSETTLE_UI_LIBRARY_NAME} diff --git a/BlockSettleApp/main.cpp b/BlockSettleApp/main.cpp index ebc4e6579..f80bf14b3 100644 --- a/BlockSettleApp/main.cpp +++ b/BlockSettleApp/main.cpp @@ -64,6 +64,7 @@ Q_IMPORT_PLUGIN(QtQuick2PrivateWidgetsPlugin) Q_IMPORT_PLUGIN(QtQuick2Plugin) Q_IMPORT_PLUGIN(QtQuick2WindowPlugin) Q_IMPORT_PLUGIN(QtQuickControls2Plugin) +Q_IMPORT_PLUGIN(QtQuick2DialogsPlugin) Q_IMPORT_PLUGIN(QtQuickTemplates2Plugin) //Q_IMPORT_PLUGIN(QtQuickControls1Plugin) Q_IMPORT_PLUGIN(QtQuickLayoutsPlugin) diff --git a/BlockSettleHW/CMakeLists.txt b/BlockSettleHW/CMakeLists.txt index f6efd92cb..f38c35db5 100644 --- a/BlockSettleHW/CMakeLists.txt +++ b/BlockSettleHW/CMakeLists.txt @@ -57,19 +57,13 @@ FUNCTION(GENERATE_PROTO IN_DIR OUT_DIR) SET(PROTO_SOURCE_FILES ${PROTO_SOURCE_FILES} ${PROTO_SOURCE_FILE}) SET(PROTO_HEADER_FILES ${PROTO_HEADER_FILES} ${PROTO_HEADER_FILE}) - ADD_CUSTOM_COMMAND(OUTPUT ${PROTO_SOURCE_FILE} - OUTPUT ${PROTO_HEADER_FILE} - DEPENDS ${PROTO_FILE} - COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} ${PROTO_FILE} --cpp_out=${OUT_DIR} --proto_path=${IN_DIR} - WORKING_DIRECTORY ${BLOCKSETTLE_HW_ROOT} - ) + EXECUTE_PROCESS(COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} ${PROTO_FILE} --cpp_out ${OUT_DIR} -I ${IN_DIR} --proto_path ${IN_DIR}) ENDFOREACH(PROTO_FILE) SET(GENERATED_SOURCE_FILES ${GENERATED_SOURCE_FILES} ${PROTO_SOURCE_FILES} PARENT_SCOPE) SET(GENERATED_HEADER_FILES ${GENERATED_HEADER_FILES} ${PROTO_HEADER_FILES} PARENT_SCOPE) SET(GENERATED_INCLUDE_DIRS ${GENERATED_INCLUDE_DIRS} ${OUT_DIR} PARENT_SCOPE) - ENDFUNCTION(GENERATE_PROTO) GENERATE_PROTO("${THIRD_PARTY_COMMON_DIR}/trezorCommon" "${BLOCKSETTLE_HW_ROOT}/trezor/generated_proto") @@ -86,5 +80,3 @@ TARGET_LINK_LIBRARIES(${BLOCKSETTLE_HW_LIBRARY_NAME} Qt5::Network ${OS_SPECIFIC_LIBS} ) - - diff --git a/BlockSettleHW/trezor/trezorClient.cpp b/BlockSettleHW/trezor/trezorClient.cpp index c1a440089..12dab254a 100644 --- a/BlockSettleHW/trezor/trezorClient.cpp +++ b/BlockSettleHW/trezor/trezorClient.cpp @@ -23,10 +23,10 @@ #include #include -TrezorClient::TrezorClient(const std::shared_ptr& connectionManager, +TrezorClient::TrezorClient(const std::shared_ptr& logger, std::shared_ptr walletManager, bool testNet, QObject* parent /*= nullptr*/) : QObject(parent) - , connectionManager_(connectionManager) + , logger_(logger) , walletManager_(walletManager) , testNet_(testNet) { @@ -46,8 +46,7 @@ void TrezorClient::initConnection(bool force, AsyncCallBack&& cb) } }); if (!reply || reply->error() != QNetworkReply::NoError) { - connectionManager_->GetLogger()->error( - "[TrezorClient] initConnection - Network error : " + reply->errorString().toUtf8()); + logger_->error("[TrezorClient] initConnection - Network error: {}", reply->errorString().toUtf8()); return; } @@ -56,15 +55,13 @@ void TrezorClient::initConnection(bool force, AsyncCallBack&& cb) QJsonParseError jsonError; QJsonDocument loadDoc = QJsonDocument::fromJson(loadData, &jsonError); if (jsonError.error != QJsonParseError::NoError) { - connectionManager_->GetLogger()->error( - "[TrezorClient] initConnection - Invalid json structure . Parsing error : " + jsonError.errorString().toUtf8()); + logger_->error("[TrezorClient] initConnection - Invalid json structure: {}", jsonError.errorString().toUtf8()); return; } const auto bridgeInfo = loadDoc.object(); - connectionManager_->GetLogger()->info( - "[TrezorClient] initConnection - Connection initialized. Bridge version : " - + bridgeInfo.value(QString::fromUtf8("version")).toString().toUtf8()); + logger_->info("[TrezorClient] initConnection - Connection initialized. Bridge version: {}" + , bridgeInfo.value(QString::fromUtf8("version")).toString().toUtf8()); state_ = State::Init; emit initialized(); @@ -73,7 +70,7 @@ void TrezorClient::initConnection(bool force, AsyncCallBack&& cb) reply->deleteLater(); }; - connectionManager_->GetLogger()->info("[TrezorClient] Initialize connection"); + logger_->info("[TrezorClient] Initialize connection"); postToTrezor("/", std::move(initCallBack), true); } @@ -105,13 +102,11 @@ void TrezorClient::releaseConnection(AsyncCallBack&& cb) }); if (!reply || reply->error() != QNetworkReply::NoError) { - connectionManager_->GetLogger()->error( - "[TrezorClient] releaseConnection - Network error : " + reply->errorString().toUtf8()); + logger_->error("[TrezorClient] releaseConnection - Network error: {}", reply->errorString().toUtf8()); return; } - connectionManager_->GetLogger()->info( - "[TrezorClient] releaseConnection - Connection successfully released"); + logger_->info("[TrezorClient] releaseConnection - Connection successfully released"); state_ = State::Released; emit deviceReleased(); @@ -119,8 +114,7 @@ void TrezorClient::releaseConnection(AsyncCallBack&& cb) reply->deleteLater(); }; - connectionManager_->GetLogger()->info("[TrezorClient] Release connection. Connection id: " - + deviceData_.sessionId_); + logger_->info("[TrezorClient] Release connection. Connection id: {}", deviceData_.sessionId_.toStdString()); QByteArray releaseUrl = "/release/" + deviceData_.sessionId_; postToTrezor(std::move(releaseUrl), std::move(releaseCallback)); @@ -142,8 +136,7 @@ void TrezorClient::call(QByteArray&& input, AsyncCallBackCall&& cb) auto callCallback = [this, cbCopy = std::move(cb)](QNetworkReply* reply) mutable { if (!reply || reply->error() != QNetworkReply::NoError) { - connectionManager_->GetLogger()->error( - "[TrezorClient] call - Network error : " + reply->errorString().toUtf8()); + logger_->error("[TrezorClient] call - Network error: {}", reply->errorString().toUtf8()); if (cbCopy) { cbCopy({}); } @@ -154,7 +147,7 @@ void TrezorClient::call(QByteArray&& input, AsyncCallBackCall&& cb) cbCopy(std::move(loadData)); }; - connectionManager_->GetLogger()->info("[TrezorClient] Call to trezor."); + logger_->info("[TrezorClient] Call to trezor."); QByteArray callUrl = "/call/" + deviceData_.sessionId_; postToTrezorInput(std::move(callUrl), std::move(callCallback), std::move(input)); @@ -190,8 +183,7 @@ void TrezorClient::enumDevices(bool forceAcquire, AsyncCallBack&& cb) }); if (!reply || reply->error() != QNetworkReply::NoError) { - connectionManager_->GetLogger()->error( - "[TrezorClient] enumDevices - Network error : " + reply->errorString().toUtf8()); + logger_->error("[TrezorClient] enumDevices - Network error: {}", reply->errorString().toUtf8()); return; } @@ -200,16 +192,14 @@ void TrezorClient::enumDevices(bool forceAcquire, AsyncCallBack&& cb) QJsonParseError jsonError; QJsonDocument loadDoc = QJsonDocument::fromJson(loadData, &jsonError); if (jsonError.error != QJsonParseError::NoError) { - connectionManager_->GetLogger()->error( - "[TrezorClient] enumDevices - Invalid json structure . Parsing error : " + jsonError.errorString().toUtf8()); + logger_->error("[TrezorClient] enumDevices - Invalid json structure: {}", jsonError.errorString().toUtf8()); return; } QJsonArray devices = loadDoc.array(); const int deviceCount = devices.count(); if (deviceCount == 0) { - connectionManager_->GetLogger()->info( - "[TrezorClient] enumDevices - No trezor device available"); + logger_->info("[TrezorClient] enumDevices - No trezor device available"); return; } @@ -233,9 +223,8 @@ void TrezorClient::enumDevices(bool forceAcquire, AsyncCallBack&& cb) } deviceData_ = trezorDevices.first(); - connectionManager_->GetLogger()->info( - "[TrezorClient] enumDevices - Enumerate request succeeded. Total device available : " - + QString::number(deviceCount).toUtf8() + ". Trying to acquire first one..."); + logger_->info("[TrezorClient] enumDevices - Enumerate request succeeded. " + "Total devices available: {}. Trying to acquire first one...", deviceCount); state_ = State::Enumerated; emit devicesScanned(); @@ -244,7 +233,7 @@ void TrezorClient::enumDevices(bool forceAcquire, AsyncCallBack&& cb) reply->deleteLater(); }; - connectionManager_->GetLogger()->info("[TrezorClient] Request to enumerate devices."); + logger_->info("[TrezorClient] Request to enumerate devices."); postToTrezor("/enumerate", std::move(enumCallback)); } @@ -261,8 +250,7 @@ void TrezorClient::acquireDevice(AsyncCallBack&& cb) }); if (!reply || reply->error() != QNetworkReply::NoError) { - connectionManager_->GetLogger()->error( - "[TrezorClient] acquireDevice - Network error : " + reply->errorString().toUtf8()); + logger_->error("[TrezorClient] acquireDevice - Network error: {}", reply->errorString().toUtf8()); return; } @@ -272,25 +260,24 @@ void TrezorClient::acquireDevice(AsyncCallBack&& cb) deviceData_.sessionId_ = acuiredDevice[QLatin1String("session")].toString().toUtf8(); if (deviceData_.sessionId_.isEmpty() || deviceData_.sessionId_ == previousSessionId) { - connectionManager_->GetLogger()->error( - "[TrezorClient] acquireDevice - Cannot acquire device"); + logger_->error("[TrezorClient] acquireDevice - Cannot acquire device"); return; } - connectionManager_->GetLogger()->info("[TrezorClient] Connection has successfully acquired. Old connection id: " - + previousSessionId + ", new connection id : " + deviceData_.sessionId_); + logger_->info("[TrezorClient] Connection has successfully acquired. Old " + "connection id: {}, new connection id: {}", previousSessionId.toStdString() + , deviceData_.sessionId_.toStdString()); state_ = State::Acquired; emit deviceReady(); - trezorDevice_ = new TrezorDevice(connectionManager_, walletManager_, testNet_, { this }, this) ; + trezorDevice_ = new TrezorDevice(logger_, walletManager_, testNet_, { this }, this) ; trezorDevice_->init(std::move(ensureCb.releaseCb())); reply->deleteLater(); }; - connectionManager_->GetLogger()->info("[TrezorClient] Acquire new connection. Old connection id: " - + previousSessionId); + logger_->info("[TrezorClient] Acquire new connection. Old connection id: {}", previousSessionId); QByteArray acquireUrl = "/acquire/" + deviceData_.path_ + "/" + previousSessionId; postToTrezor(std::move(acquireUrl), std::move(acquireCallback)); diff --git a/BlockSettleHW/trezor/trezorClient.h b/BlockSettleHW/trezor/trezorClient.h index 5f3fac1f6..45a3336be 100644 --- a/BlockSettleHW/trezor/trezorClient.h +++ b/BlockSettleHW/trezor/trezorClient.h @@ -18,15 +18,16 @@ #include #include -class ConnectionManager; -class QNetworkRequest; -class TrezorDevice; - +namespace spdlog { + class logger; +} namespace bs { namespace sync { class WalletsManager; } } +class QNetworkRequest; +class TrezorDevice; class TrezorClient : public QObject { @@ -34,8 +35,8 @@ class TrezorClient : public QObject public: - TrezorClient(const std::shared_ptr& connectionManager_, - std::shared_ptr walletManager, bool testNet, QObject* parent = nullptr); + TrezorClient(const std::shared_ptr&, + std::shared_ptr, bool testNet, QObject* parent = nullptr); ~TrezorClient() override = default; QByteArray getSessionId(); @@ -69,7 +70,7 @@ class TrezorClient : public QObject void onRequestPinMatrix(); private: - std::shared_ptr connectionManager_; + std::shared_ptr logger_; std::shared_ptr walletManager_; const QByteArray trezorEndPoint_ = "http://127.0.0.1:21325"; diff --git a/BlockSettleHW/trezor/trezorDevice.cpp b/BlockSettleHW/trezor/trezorDevice.cpp index 1f580e25a..b9da4f89c 100644 --- a/BlockSettleHW/trezor/trezorDevice.cpp +++ b/BlockSettleHW/trezor/trezorDevice.cpp @@ -85,15 +85,14 @@ namespace { const std::string tesNetCoin = "Testnet"; } -TrezorDevice::TrezorDevice(const std::shared_ptr &connectionManager, std::shared_ptr walletManager +TrezorDevice::TrezorDevice(const std::shared_ptr &logger + , std::shared_ptr walletManager , bool testNet, const QPointer &client, QObject* parent) : HwDeviceInterface(parent) - , connectionManager_(connectionManager) - , walletManager_(walletManager) + , logger_(logger), walletManager_(walletManager) , client_(std::move(client)) , testNet_(testNet) -{ -} +{} TrezorDevice::~TrezorDevice() = default; @@ -136,7 +135,7 @@ DeviceType TrezorDevice::type() const void TrezorDevice::init(AsyncCallBack&& cb) { - connectionManager_->GetLogger()->debug("[TrezorDevice] init - start init call "); + logger_->debug("[TrezorDevice] init - start init call"); management::Initialize message; message.set_session_id(client_->getSessionId()); @@ -176,8 +175,8 @@ void TrezorDevice::getPublicKey(AsyncCallBackCall&& cb) AsyncCallBackCall cbNested = [this, cbLegacy = std::move(cbLegacy)](QVariant &&data) mutable { awaitingWalletInfo_.info_.xpubNestedSegwit = data.toByteArray().toStdString(); - connectionManager_->GetLogger()->debug("[TrezorDevice] init - start retrieving legacy public key from device " - + features_.label()); + logger_->debug("[TrezorDevice] init - start retrieving legacy public key from device {}" + , features_.label()); bitcoin::GetPublicKey message; for (const uint32_t add : getDerivationPath(testNet_, bs::hd::Purpose::NonSegWit)) { message.add_address_n(add); @@ -193,8 +192,8 @@ void TrezorDevice::getPublicKey(AsyncCallBackCall&& cb) AsyncCallBackCall cbNative = [this, cbNested = std::move(cbNested)](QVariant &&data) mutable { awaitingWalletInfo_.info_.xpubNativeSegwit = data.toByteArray().toStdString(); - connectionManager_->GetLogger()->debug("[TrezorDevice] init - start retrieving nested segwit public key from device " - + features_.label()); + logger_->debug("[TrezorDevice] init - start retrieving nested segwit public key from device {}" + , features_.label()); bitcoin::GetPublicKey message; for (const uint32_t add : getDerivationPath(testNet_, bs::hd::Purpose::Nested)) { message.add_address_n(add); @@ -208,9 +207,8 @@ void TrezorDevice::getPublicKey(AsyncCallBackCall&& cb) makeCall(message); }; - - connectionManager_->GetLogger()->debug("[TrezorDevice] init - start retrieving native segwit public key from device " - + features_.label()); + logger_->debug("[TrezorDevice] init - start retrieving native segwit public key from device {}" + , features_.label()); bitcoin::GetPublicKey message; for (const uint32_t add : getDerivationPath(testNet_, bs::hd::Purpose::Native)) { message.add_address_n(add); @@ -226,7 +224,7 @@ void TrezorDevice::getPublicKey(AsyncCallBackCall&& cb) void TrezorDevice::setMatrixPin(const std::string& pin) { - connectionManager_->GetLogger()->debug("[TrezorDevice] setMatrixPin - send matrix pin response"); + logger_->debug("[TrezorDevice] setMatrixPin - send matrix pin response"); common::PinMatrixAck message; message.set_pin(pin); makeCall(message); @@ -234,7 +232,7 @@ void TrezorDevice::setMatrixPin(const std::string& pin) void TrezorDevice::setPassword(const std::string& password, bool enterOnDevice) { - connectionManager_->GetLogger()->debug("[TrezorDevice] setPassword - send passphrase response"); + logger_->debug("[TrezorDevice] setPassword - send passphrase response"); common::PassphraseAck message; if (enterOnDevice) { message.set_on_device(true); @@ -246,7 +244,7 @@ void TrezorDevice::setPassword(const std::string& password, bool enterOnDevice) void TrezorDevice::cancel() { - connectionManager_->GetLogger()->debug("[TrezorDevice] cancel previous operation"); + logger_->debug("[TrezorDevice] cancel previous operation"); management::Cancel message; makeCall(message); sendTxMessage(HWInfoStatus::kCancelledByUser); @@ -254,8 +252,8 @@ void TrezorDevice::cancel() void TrezorDevice::clearSession(AsyncCallBack&& cb) { - connectionManager_->GetLogger()->debug("[TrezorDevice] cancel previous operation"); - management::ClearSession message; + logger_->debug("[TrezorDevice] cancel previous operation"); + management::/*ClearSession*/EndSession message; if (cb) { setCallbackNoData(MessageType_Success, std::move(cb)); @@ -268,7 +266,7 @@ void TrezorDevice::clearSession(AsyncCallBack&& cb) void TrezorDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX, AsyncCallBackCall&& cb /*= nullptr*/) { currentTxSignReq_.reset(new bs::core::wallet::TXSignRequest(reqTX)); - connectionManager_->GetLogger()->debug("[TrezorDevice] SignTX - specify init data to " + features_.label()); + logger_->debug("[TrezorDevice] SignTX - specify init data to " + features_.label()); bitcoin::SignTx message; message.set_inputs_count(currentTxSignReq_->armorySigner_.getTxInCount()); @@ -288,7 +286,7 @@ void TrezorDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX, AsyncCal void TrezorDevice::retrieveXPubRoot(AsyncCallBack&& cb) { // Fetching walletId - connectionManager_->GetLogger()->debug("[TrezorDevice] init - start retrieving root public key from device " + logger_->debug("[TrezorDevice] init - start retrieving root public key from device " + features_.label()); bitcoin::GetPublicKey message; message.add_address_n(bs::hd::hardFlag); @@ -337,7 +335,7 @@ void TrezorDevice::handleMessage(const MessageData& data) { common::Failure failure; if (parseResponse(failure, data)) { - connectionManager_->GetLogger()->debug("[TrezorDevice] handleMessage last message failure " + logger_->debug("[TrezorDevice] handleMessage last message failure " + getJSONReadableMessage(failure)); } sendTxMessage(QString::fromStdString(failure.message())); @@ -359,7 +357,7 @@ void TrezorDevice::handleMessage(const MessageData& data) case MessageType_Features: { if (parseResponse(features_, data)) { - connectionManager_->GetLogger()->debug("[TrezorDevice] handleMessage Features, model: '{}' - {}.{}.{}" + logger_->debug("[TrezorDevice] handleMessage Features, model: '{}' - {}.{}.{}" , features_.model(), features_.major_version(), features_.minor_version(), features_.patch_version()); // + getJSONReadableMessage(features_)); } @@ -369,7 +367,7 @@ void TrezorDevice::handleMessage(const MessageData& data) { common::ButtonRequest request; if (parseResponse(request, data)) { - connectionManager_->GetLogger()->debug("[TrezorDevice] handleMessage ButtonRequest " + logger_->debug("[TrezorDevice] handleMessage ButtonRequest " + getJSONReadableMessage(request)); } common::ButtonAck response; @@ -400,7 +398,7 @@ void TrezorDevice::handleMessage(const MessageData& data) { bitcoin::PublicKey publicKey; if (parseResponse(publicKey, data)) { - connectionManager_->GetLogger()->debug("[TrezorDevice] handleMessage PublicKey" //); + logger_->debug("[TrezorDevice] handleMessage PublicKey" //); + getJSONReadableMessage(publicKey)); } dataCallback(MessageType_PublicKey, QByteArray::fromStdString(publicKey.xpub())); @@ -420,7 +418,7 @@ void TrezorDevice::handleMessage(const MessageData& data) break; default: { - connectionManager_->GetLogger()->debug("[TrezorDevice] handleMessage " + std::to_string(data.msg_type_) + " - Unhandled message type"); + logger_->debug("[TrezorDevice] handleMessage " + std::to_string(data.msg_type_) + " - Unhandled message type"); } break; } @@ -432,11 +430,11 @@ bool TrezorDevice::parseResponse(google::protobuf::Message &msg, const MessageDa { bool ok = msg.ParseFromString(data.message_); if (ok) { - connectionManager_->GetLogger()->debug("[TrezorDevice] handleMessage " + + logger_->debug("[TrezorDevice] handleMessage " + std::to_string(data.msg_type_) + " - successfully parsed response"); } else { - connectionManager_->GetLogger()->debug("[TrezorDevice] handleMessage " + + logger_->debug("[TrezorDevice] handleMessage " + std::to_string(data.msg_type_) + " - failed to parse response"); } @@ -487,7 +485,7 @@ void TrezorDevice::handleTxRequest(const MessageData& data) assert(currentTxSignReq_); bitcoin::TxRequest txRequest; if (parseResponse(txRequest, data)) { - connectionManager_->GetLogger()->debug("[TrezorDevice] handleMessage TxRequest " + logger_->debug("[TrezorDevice] handleMessage TxRequest " + getJSONReadableMessage(txRequest)); } @@ -512,7 +510,7 @@ void TrezorDevice::handleTxRequest(const MessageData& data) input->set_script_sig(txIn.getScript().toBinStr()); } - connectionManager_->GetLogger()->debug("[TrezorDevice] handleTxRequest TXINPUT for prev hash" + logger_->debug("[TrezorDevice] handleTxRequest TXINPUT for prev hash" + getJSONReadableMessage(txAck)); makeCall(txAck); @@ -565,7 +563,7 @@ void TrezorDevice::handleTxRequest(const MessageData& data) txAck.set_allocated_tx(type); - connectionManager_->GetLogger()->debug("[TrezorDevice] handleTxRequest TXINPUT" + logger_->debug("[TrezorDevice] handleTxRequest TXINPUT" + getJSONReadableMessage(txAck)); makeCall(txAck); @@ -583,7 +581,7 @@ void TrezorDevice::handleTxRequest(const MessageData& data) binOutput->set_script_pubkey(txOut.getScript().toBinStr()); } - connectionManager_->GetLogger()->debug("[TrezorDevice] handleTxRequest TXOUTPUT for prev hash" + logger_->debug("[TrezorDevice] handleTxRequest TXOUTPUT for prev hash" + getJSONReadableMessage(txAck)); makeCall(txAck); @@ -600,7 +598,8 @@ void TrezorDevice::handleTxRequest(const MessageData& data) if (currentTxSignReq_->change.address != address) { // general output output->set_address(address.display()); output->set_amount(bsOutput->getValue()); - output->set_script_type(bitcoin::TxAck_TransactionType_TxOutputType_OutputScriptType_PAYTOADDRESS); + //output->set_script_type(bitcoin::TxAck_TransactionType_TxOutputType_OutputScriptType_PAYTOADDRESS); + output->set_script_type(bitcoin::PAYTOADDRESS); } else { const auto &change = currentTxSignReq_->change; output->set_amount(change.value); @@ -618,15 +617,15 @@ void TrezorDevice::handleTxRequest(const MessageData& data) } const auto changeType = change.address.getType(); - bitcoin::TxAck_TransactionType_TxOutputType_OutputScriptType scriptType; + bitcoin::OutputScriptType scriptType; if (changeType == AddressEntryType_P2SH) { - scriptType = bitcoin::TxAck_TransactionType_TxOutputType_OutputScriptType_PAYTOP2SHWITNESS; + scriptType = bitcoin::PAYTOP2SHWITNESS; } else if (changeType == AddressEntryType_P2WPKH) { - scriptType = bitcoin::TxAck_TransactionType_TxOutputType_OutputScriptType_PAYTOWITNESS; + scriptType = bitcoin::PAYTOWITNESS; } else if (changeType == AddressEntryType_P2PKH) { - scriptType = bitcoin::TxAck_TransactionType_TxOutputType_OutputScriptType_PAYTOADDRESS; + scriptType = bitcoin::PAYTOADDRESS; } else { throw std::runtime_error(fmt::format("unexpected changeType: {}", static_cast(changeType))); } @@ -635,7 +634,7 @@ void TrezorDevice::handleTxRequest(const MessageData& data) } txAck.set_allocated_tx(type); - connectionManager_->GetLogger()->debug("[TrezorDevice] handleTxRequest TXOUTPUT" + logger_->debug("[TrezorDevice] handleTxRequest TXOUTPUT" + getJSONReadableMessage(txAck)); makeCall(txAck); @@ -654,7 +653,7 @@ void TrezorDevice::handleTxRequest(const MessageData& data) data->set_outputs_cnt(tx.getNumTxOut()); } - connectionManager_->GetLogger()->debug("[TrezorDevice] handleTxRequest TXMETA" + logger_->debug("[TrezorDevice] handleTxRequest TXMETA" + getJSONReadableMessage(txAck)); makeCall(txAck); @@ -690,7 +689,7 @@ Tx TrezorDevice::prevTx(const bitcoin::TxRequest &txRequest) } catch (const std::exception&) { - SPDLOG_LOGGER_ERROR(connectionManager_->GetLogger(), "can't find prev TX {}", txHash.toHexStr(1)); + SPDLOG_LOGGER_ERROR(logger_, "can't find prev TX {}", txHash.toHexStr(1)); return {}; } } diff --git a/BlockSettleHW/trezor/trezorDevice.h b/BlockSettleHW/trezor/trezorDevice.h index 3dcc6d838..905baa233 100644 --- a/BlockSettleHW/trezor/trezorDevice.h +++ b/BlockSettleHW/trezor/trezorDevice.h @@ -17,18 +17,15 @@ #include #include - // Trezor interface (source - https://github.com/trezor/trezor-common/tree/master/protob) +#include "trezor/generated_proto/messages.pb.h" #include "trezor/generated_proto/messages-management.pb.h" #include "trezor/generated_proto/messages-common.pb.h" #include "trezor/generated_proto/messages-bitcoin.pb.h" -#include "trezor/generated_proto/messages.pb.h" - - -class ConnectionManager; -class QNetworkRequest; -class TrezorClient; +namespace spdlog { + class logger; +} namespace bs { namespace core { namespace wallet { @@ -39,21 +36,22 @@ namespace bs { class WalletsManager; } } +class QNetworkRequest; +class TrezorClient; class TrezorDevice : public HwDeviceInterface { Q_OBJECT public: - TrezorDevice(const std::shared_ptr & - , std::shared_ptr walletManager, bool testNet + TrezorDevice(const std::shared_ptr & + , std::shared_ptr, bool testNet , const QPointer &, QObject* parent = nullptr); ~TrezorDevice() override; DeviceKey key() const override; DeviceType type() const override; - // lifecycle void init(AsyncCallBack&& cb = nullptr) override; void cancel() override; @@ -102,8 +100,8 @@ class TrezorDevice : public HwDeviceInterface bool isFirmwareSupported() const; std::string firmwareSupportedVersion() const; - std::shared_ptr connectionManager_{}; - std::shared_ptr walletManager_{}; + std::shared_ptr logger_; + std::shared_ptr walletManager_; QPointer client_{}; hw::trezor::messages::management::Features features_{}; diff --git a/CMakeLists.txt b/CMakeLists.txt index 3162a1ad4..293e9c8d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -484,6 +484,7 @@ IF(WIN32) ${QT5_QML_ROOT}/QtQuick.2/qtquick2plugind.lib ${QT5_QML_ROOT}/QtQuick/Controls/qtquickcontrolsplugind.lib ${QT5_QML_ROOT}/QtQuick/Controls.2/qtquickcontrols2plugind.lib + ${QT5_QML_ROOT}/QtQuick/Dialogs/dialogplugind.lib ${QT5_QML_ROOT}/QtQuick/Layouts/qquicklayoutsplugind.lib ${QT5_QML_ROOT}/QtQuick/Templates.2/qtquicktemplates2plugind.lib ${QT5_QML_ROOT}/QtQuick/Window.2/windowplugind.lib @@ -534,6 +535,7 @@ IF(WIN32) ${QT5_QML_ROOT}/QtQuick.2/qtquick2plugin.lib ${QT5_QML_ROOT}/QtQuick/Controls/qtquickcontrolsplugin.lib ${QT5_QML_ROOT}/QtQuick/Controls.2/qtquickcontrols2plugin.lib + ${QT5_QML_ROOT}/QtQuick/Dialogs/dialogplugin.lib ${QT5_QML_ROOT}/QtQuick/Layouts/qquicklayoutsplugin.lib ${QT5_QML_ROOT}/QtQuick/Templates.2/qtquicktemplates2plugin.lib ${QT5_QML_ROOT}/QtQuick/Window.2/windowplugin.lib @@ -615,6 +617,7 @@ ELSE(WIN32) ${QT5_QML_ROOT}/QtQuick.2/libqtquick2plugin_debug.a ${QT5_QML_ROOT}/QtQuick/Controls/libqtquickcontrolsplugin_debug.a ${QT5_QML_ROOT}/QtQuick/Controls.2/libqtquickcontrols2plugin_debug.a + ${QT5_QML_ROOT}/QtQuick/Dialogs/libdialogplugin_debug.lib ${QT5_QML_ROOT}/QtQuick/Layouts/libqquicklayoutsplugin_debug.a ${QT5_QML_ROOT}/QtQuick/Templates.2/libqtquicktemplates2plugin_debug.a ${QT5_QML_ROOT}/QtQuick/Window.2/libwindowplugin_debug.a @@ -652,6 +655,7 @@ ELSE(WIN32) ${QT5_QML_ROOT}/QtQuick.2/libqtquick2plugin.a ${QT5_QML_ROOT}/QtQuick/Controls/libqtquickcontrolsplugin.a ${QT5_QML_ROOT}/QtQuick/Controls.2/libqtquickcontrols2plugin.a + ${QT5_QML_ROOT}/QtQuick/Dialogs/libdialogplugin.a ${QT5_QML_ROOT}/QtQuick/Layouts/libqquicklayoutsplugin.a ${QT5_QML_ROOT}/QtQuick/Templates.2/libqtquicktemplates2plugin.a ${QT5_QML_ROOT}/QtQuick/Window.2/libwindowplugin.a @@ -743,6 +747,7 @@ ELSE(WIN32) ${QT5_QML_ROOT}/QtQuick.2/libqtquick2plugin.a ${QT5_QML_ROOT}/QtQuick/Controls/libqtquickcontrolsplugin.a ${QT5_QML_ROOT}/QtQuick/Controls.2/libqtquickcontrols2plugin.a + ${QT5_QML_ROOT}/QtQuick/Dialogs/libdialogplugin.a ${QT5_QML_ROOT}/QtQuick/PrivateWidgets/libwidgetsplugin.a ${QT5_QML_ROOT}/QtQuick/Layouts/libqquicklayoutsplugin.a ${QT5_QML_ROOT}/QtQuick/Templates.2/libqtquicktemplates2plugin.a From bf482da14669d525c8278c43b82bf9ab9f8d6a30 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sun, 1 Jan 2023 08:02:37 +0200 Subject: [PATCH 029/436] add ImportWallet + fix bugs --- GUI/QtQuick/qml/CreateWallet.qml | 39 +++- GUI/QtQuick/qml/ImportWallet.qml | 182 ++++++++++++++++++ GUI/QtQuick/qml/ImportWatchingWallet.qml | 7 + GUI/QtQuick/qml/OverviewPage.qml | 2 +- .../qml/StyledControls/CustomRadioButton.qml | 16 +- GUI/QtQuick/qml/TermsAndConditions.qml | 2 +- GUI/QtQuick/qml/WalletSeed.qml | 1 - GUI/QtQuick/qml/main.qml | 1 + GUI/QtQuick/qtquick.qrc | 1 + 9 files changed, 236 insertions(+), 15 deletions(-) create mode 100644 GUI/QtQuick/qml/ImportWallet.qml diff --git a/GUI/QtQuick/qml/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet.qml index f9c9dc3ac..6dfbde7ac 100644 --- a/GUI/QtQuick/qml/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet.qml @@ -80,7 +80,8 @@ Window { StackView { id: stack_create_wallet - initialItem: bsApp.settingActivated? start_create : terms_conditions + + initialItem: terms_conditions anchors.top: close_button.bottom anchors.topMargin: 0 @@ -123,13 +124,19 @@ Window { duration: 200 } } + + replaceEnter: Transition { + } + + replaceExit: Transition { + } } TermsAndConditions { id: terms_conditions visible: false onSig_continue: { - stack_create_wallet.push(start_create) + stack_create_wallet.replace(start_create) } } @@ -141,10 +148,10 @@ Window { stack_create_wallet.push(wallet_seed) } onSig_import_wallet: { - stack_create_wallet.push(import_hardware) + stack_create_wallet.push(import_wallet) } onSig_hardware_wallet: { - stack_create_wallet.push(import_watching_wallet) + stack_create_wallet.push(import_hardware) } } @@ -206,6 +213,30 @@ Window { root.close() stack_create_wallet.pop(null) } + onSig_full: { + stack_create_wallet.replace(import_wallet) + } + } + + ImportWallet { + id: import_wallet + visible: false + onSig_import: { + stack_create_wallet.push(confirm_password) + root.phrase = import_wallet.phrase + } + onSig_only_watching: { + stack_create_wallet.replace(import_watching_wallet) + } + } + } + + function init() { + //bsApp.settingActivated = true + if (bsApp.settingActivated === true) + { + stack_create_wallet.pop() + stack_create_wallet.replace(start_create) } } } diff --git a/GUI/QtQuick/qml/ImportWallet.qml b/GUI/QtQuick/qml/ImportWallet.qml new file mode 100644 index 000000000..7b0a3352f --- /dev/null +++ b/GUI/QtQuick/qml/ImportWallet.qml @@ -0,0 +1,182 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "StyledControls" +import "BsStyles" + + +ColumnLayout { + + id: layout + + signal sig_import() + signal sig_only_watching() + + property bool isFileChoosen: false + property var phrase: [] + + property var grid_model_12: ["1", "2", "3", "4", + "5", "6", "7", "8", + "9", "10", "11", "12"] + property var grid_model_24: ["1", "2", "3", "4", + "5", "6", "7", "8", + "9", "10", "11", "12", + "13", "14", "15", "16", + "17", "18", "19", "20", + "21", "22", "23", "24"] + + height: radbut_12.checked ? 511 : 735 + width: 580 + + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Import wallet") + } + + CustomTextSwitch { + id: type_switch + + Layout.alignment: Qt.AlignCenter + Layout.topMargin: 24 + + onSig_full_changed: (isFull) => { + if (isFull === false) + { + type_switch.isFullChoosed = true + layout.sig_only_watching() + } + } + + Component.onCompleted: { + type_switch.isFullChoosed = true + } + } + + RowLayout { + id: row + spacing: 12 + + Layout.alignment: Qt.AlignCenter + Layout.topMargin: 32 + Layout.preferredHeight: 19 + + Label { + Layout.fillWidth: true + } + + Label { + id: radbut_text + + text: "Seed phrase type:" + + Layout.leftMargin: 25 + + width: 126 + height: 19 + + color: "#E2E7FF" + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Normal + } + + CustomRadioButton { + id: radbut_12 + + text: "12 words" + + spacing: 6 + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Normal + + checked: true + } + + CustomRadioButton { + id: radbut_24 + + text: "24 words" + + spacing: 6 + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Normal + + checked: false + } + + Label { + Layout.fillWidth: true + } + } + + Rectangle { + id: hor_line + + Layout.topMargin: 16 + Layout.fillWidth: true + + height: 1 + + color: "#3C435A" + } + + GridView { + id: grid + + Layout.fillHeight: true + Layout.fillWidth: true + Layout.leftMargin: 25 + Layout.topMargin: 24 + + cellHeight : 56 + cellWidth : 180 + + property var isComplete: false + + model: radbut_12.checked ? layout.grid_model_12 : layout.grid_model_24 + delegate: CustomSeedTextInput { + width: 170 + title_text: modelData + onTextChanged : { + grid.isComplete = true + for (var i = 0; i < grid.count; i++) + { + if(grid.itemAtIndex(i).input_text === "") + { + grid.isComplete = false + break + } + } + } + } + } + + CustomButton { + id: import_but + text: qsTr("Import") + Layout.leftMargin: 25 + Layout.bottomMargin: 40 + width: 530 + enabled: grid.isComplete + + Component.onCompleted: { + import_but.preferred = true + } + onClicked: { + for (var i=0; i { if (isFull === true) { + type_switch.isFullChoosed = false layout.sig_full() } } + + Component.onCompleted: { + type_switch.isFullChoosed = false + } } Image { diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 387d7ebc8..6f9d7f7f2 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -100,7 +100,7 @@ Item { text: qsTr("Create new wallet") font.pointSize: 10 onClicked: { - stack.push(createNewWalletPage) + //stack.push(createNewWalletPage) newWalletClicked() } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml b/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml index 87f4abaa4..6d39a0dca 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml @@ -12,18 +12,19 @@ import QtQuick 2.9 import QtQuick.Controls 2.3 import "../BsStyles" + RadioButton { id: control - text: parent.text - focusPolicy: Qt.NoFocus + text: qsTr("RadioButton") + checked: true indicator: Rectangle { implicitWidth: 16 implicitHeight: 16 x: control.leftPadding y: parent.height / 2 - height / 2 - radius: 11 - border.color: control.checked ? BSStyle.buttonsBorderColor : BSStyle.buttonsUncheckedColor + radius: 8 + border.color: "#45A6FF" color: "transparent" Rectangle { @@ -31,8 +32,8 @@ RadioButton { height: 8 x: 4 y: 4 - radius: 7 - color: control.checked ? BSStyle.buttonsPrimaryMainColor : BSStyle.buttonsUncheckedColor + radius: 4 + color: "#45A6FF" visible: control.checked } } @@ -40,8 +41,7 @@ RadioButton { contentItem: Text { text: control.text font: control.font - opacity: enabled ? 1.0 : 0.3 - color: control.checked ? BSStyle.textColor : BSStyle.buttonsUncheckedColor + color: control.checked ? "#E2E7FF" : "#7A88B0" verticalAlignment: Text.AlignVCenter leftPadding: control.indicator.width + control.spacing } diff --git a/GUI/QtQuick/qml/TermsAndConditions.qml b/GUI/QtQuick/qml/TermsAndConditions.qml index 76b788d25..775f14c0c 100644 --- a/GUI/QtQuick/qml/TermsAndConditions.qml +++ b/GUI/QtQuick/qml/TermsAndConditions.qml @@ -99,8 +99,8 @@ ColumnLayout { continue_but.preferred = true } onClicked: { - sig_continue() bsApp.settingActivated = true + sig_continue() } } diff --git a/GUI/QtQuick/qml/WalletSeed.qml b/GUI/QtQuick/qml/WalletSeed.qml index 7a186e9b2..4b29722d9 100644 --- a/GUI/QtQuick/qml/WalletSeed.qml +++ b/GUI/QtQuick/qml/WalletSeed.qml @@ -54,7 +54,6 @@ ColumnLayout { seed_text: modelData serial_num: index + 1 } - } RowLayout { diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index e70b38d03..86187d753 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -174,6 +174,7 @@ ApplicationWindow { OverviewPage { id: overviewPage onNewWalletClicked: { + createWallet.init() createWallet.show() createWallet.raise() createWallet.requestActivate() diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 3c03b2cc2..07f07832a 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -88,5 +88,6 @@ qml/ImportWatchingWallet.qml images/folder_icon.png images/File.png + qml/ImportWallet.qml From 11f8b9b6271b29d7717c9dfbe15836b1d44d3656 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Sun, 1 Jan 2023 14:18:37 +0300 Subject: [PATCH 030/436] fix dialogs plugin linkage --- BlockSettleApp/main.cpp | 4 +++- CMakeLists.txt | 12 +++++++++++- GUI/QtQuick/QtQuickAdapter.cpp | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/BlockSettleApp/main.cpp b/BlockSettleApp/main.cpp index f80bf14b3..dcd752297 100644 --- a/BlockSettleApp/main.cpp +++ b/BlockSettleApp/main.cpp @@ -61,12 +61,14 @@ Q_IMPORT_PLUGIN(QICOPlugin) Q_IMPORT_PLUGIN(QtQuick2PrivateWidgetsPlugin) #endif +Q_IMPORT_PLUGIN(QtQmlPlugin) Q_IMPORT_PLUGIN(QtQuick2Plugin) Q_IMPORT_PLUGIN(QtQuick2WindowPlugin) Q_IMPORT_PLUGIN(QtQuickControls2Plugin) Q_IMPORT_PLUGIN(QtQuick2DialogsPlugin) +Q_IMPORT_PLUGIN(QtQuick2DialogsPrivatePlugin) Q_IMPORT_PLUGIN(QtQuickTemplates2Plugin) -//Q_IMPORT_PLUGIN(QtQuickControls1Plugin) +Q_IMPORT_PLUGIN(QtQuickControls1Plugin) Q_IMPORT_PLUGIN(QtQuickLayoutsPlugin) Q_IMPORT_PLUGIN(QtQmlModelsPlugin) Q_IMPORT_PLUGIN(QmlFolderListModelPlugin) diff --git a/CMakeLists.txt b/CMakeLists.txt index 293e9c8d5..5ae09cf1d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -481,10 +481,12 @@ IF(WIN32) LIST(APPEND QT_QUICK_LIBS ${QT5_QML_ROOT}/QtQml/Models.2/modelsplugind.lib + ${QT5_QML_ROOT}/QtQml/qmlplugind.lib ${QT5_QML_ROOT}/QtQuick.2/qtquick2plugind.lib ${QT5_QML_ROOT}/QtQuick/Controls/qtquickcontrolsplugind.lib ${QT5_QML_ROOT}/QtQuick/Controls.2/qtquickcontrols2plugind.lib ${QT5_QML_ROOT}/QtQuick/Dialogs/dialogplugind.lib + ${QT5_QML_ROOT}/QtQuick/Dialogs/Private/dialogsprivateplugind.lib ${QT5_QML_ROOT}/QtQuick/Layouts/qquicklayoutsplugind.lib ${QT5_QML_ROOT}/QtQuick/Templates.2/qtquicktemplates2plugind.lib ${QT5_QML_ROOT}/QtQuick/Window.2/windowplugind.lib @@ -532,10 +534,12 @@ IF(WIN32) LIST(APPEND QT_QUICK_LIBS ${QT5_QML_ROOT}/QtQml/Models.2/modelsplugin.lib + ${QT5_QML_ROOT}/QtQml/qmlplugin.lib ${QT5_QML_ROOT}/QtQuick.2/qtquick2plugin.lib ${QT5_QML_ROOT}/QtQuick/Controls/qtquickcontrolsplugin.lib ${QT5_QML_ROOT}/QtQuick/Controls.2/qtquickcontrols2plugin.lib ${QT5_QML_ROOT}/QtQuick/Dialogs/dialogplugin.lib + ${QT5_QML_ROOT}/QtQuick/Dialogs/Private/dialogsprivateplugin.lib ${QT5_QML_ROOT}/QtQuick/Layouts/qquicklayoutsplugin.lib ${QT5_QML_ROOT}/QtQuick/Templates.2/qtquicktemplates2plugin.lib ${QT5_QML_ROOT}/QtQuick/Window.2/windowplugin.lib @@ -614,10 +618,12 @@ ELSE(WIN32) ) SET(QT_QUICK_LIBS ${QT5_QML_ROOT}/QtQml/Models.2/libmodelsplugin_debug.a + ${QT5_QML_ROOT}/QtQml/libqmlplugin_debug.a ${QT5_QML_ROOT}/QtQuick.2/libqtquick2plugin_debug.a ${QT5_QML_ROOT}/QtQuick/Controls/libqtquickcontrolsplugin_debug.a ${QT5_QML_ROOT}/QtQuick/Controls.2/libqtquickcontrols2plugin_debug.a - ${QT5_QML_ROOT}/QtQuick/Dialogs/libdialogplugin_debug.lib + ${QT5_QML_ROOT}/QtQuick/Dialogs/libdialogplugin_debug.a + ${QT5_QML_ROOT}/QtQuick/Dialogs/Private/libdialogsprivateplugin_debug.a ${QT5_QML_ROOT}/QtQuick/Layouts/libqquicklayoutsplugin_debug.a ${QT5_QML_ROOT}/QtQuick/Templates.2/libqtquicktemplates2plugin_debug.a ${QT5_QML_ROOT}/QtQuick/Window.2/libwindowplugin_debug.a @@ -652,10 +658,12 @@ ELSE(WIN32) ) SET(QT_QUICK_LIBS ${QT5_QML_ROOT}/QtQml/Models.2/libmodelsplugin.a + ${QT5_QML_ROOT}/QtQml/libqmlplugin.a ${QT5_QML_ROOT}/QtQuick.2/libqtquick2plugin.a ${QT5_QML_ROOT}/QtQuick/Controls/libqtquickcontrolsplugin.a ${QT5_QML_ROOT}/QtQuick/Controls.2/libqtquickcontrols2plugin.a ${QT5_QML_ROOT}/QtQuick/Dialogs/libdialogplugin.a + ${QT5_QML_ROOT}/QtQuick/Dialogs/Private/libdialogsprivateplugin.a ${QT5_QML_ROOT}/QtQuick/Layouts/libqquicklayoutsplugin.a ${QT5_QML_ROOT}/QtQuick/Templates.2/libqtquicktemplates2plugin.a ${QT5_QML_ROOT}/QtQuick/Window.2/libwindowplugin.a @@ -744,10 +752,12 @@ ELSE(WIN32) SET(QT_QUICK_LIBS ${QT5_QML_ROOT}/QtQml/Models.2/libmodelsplugin.a + ${QT5_QML_ROOT}/QtQml/libqmlplugin.a ${QT5_QML_ROOT}/QtQuick.2/libqtquick2plugin.a ${QT5_QML_ROOT}/QtQuick/Controls/libqtquickcontrolsplugin.a ${QT5_QML_ROOT}/QtQuick/Controls.2/libqtquickcontrols2plugin.a ${QT5_QML_ROOT}/QtQuick/Dialogs/libdialogplugin.a + ${QT5_QML_ROOT}/QtQuick/Dialogs/Private/libdialogsprivateplugin.a ${QT5_QML_ROOT}/QtQuick/PrivateWidgets/libwidgetsplugin.a ${QT5_QML_ROOT}/QtQuick/Layouts/libqquicklayoutsplugin.a ${QT5_QML_ROOT}/QtQuick/Templates.2/libqtquicktemplates2plugin.a diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 21d3f4d40..2ecaf8d42 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -334,7 +334,7 @@ ProcessingResult QtQuickAdapter::processSettingsGetResponse(const SettingsMessag #endif // _WIN32 //onResetSettings({}); } - break; + [[fallthrough]]; default: settings[setting.request().index()] = fromResponse(setting); From 001c84f09a7d0f636a195d83d0016ea57705fe06 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 2 Jan 2023 06:48:49 +0200 Subject: [PATCH 031/436] add filedialog to ImportWatchingWallet --- GUI/QtQuick/images/file_drop.png | Bin 4011 -> 2285 bytes GUI/QtQuick/qml/CreateWallet.qml | 1 - GUI/QtQuick/qml/ImportWatchingWallet.qml | 20 +++++++++++++++----- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/GUI/QtQuick/images/file_drop.png b/GUI/QtQuick/images/file_drop.png index ff2204028d68873e41974c228546e562e9121201..f90d6c3c9d992097e3cc188c1e3d3cf3d35686db 100755 GIT binary patch literal 2285 zcmc&#domYuh|C}tWuDR%a4EDghmXVE z)Zy$D6!<)DicQmcM~L?R&4atEHGp?Nylq6_y)r9d-7A)y0t%Wk0#9TqJh6-DZAtiE z5K~%Y_Oji1))4Ke`o?>JR@Y7aR0Qh-E92Y`mC zxstdOzijym{`Sso01hrDI9WecIRF|_y*SzhtS~w#*r%j8VZ_&CivL7{IM`16%lg*O zhs2UxInYkqtpRK=X&KN?Nd(B3K@1N*(JUJU+Gk>>JyhSkc@|AW!ej=4TH=^VciU;sA> zG>+(-*SuRE;N<%0rn0p|0;&=gAYpdcmJ)6RuLW3{^~HuZJGF%)^OSi87~Rvo1ORnRLc7%8w? zC5M{wT^or|XSGON=Rt9u}H{RGv9WT@|zCxzB&>^$7`@5vJp{#QHof&u20LuR* zcdb>Iw8SbxNN;w3?en#nP$72-{;Obo3v2E!pG}EaMMpRcWXf;h=Kx1Z=aYH=f>PMk z{`mEh3OAalFA~qn7Y9i!qp%q>fo!pxe;E{bNs9bb&uawxwZ_*mdyZN7z(L&sUvt7w zggmSUC4U*f@~82I6!+U?M&9I1vPw9z_Idku-jA}5soI-J(P z;UB_cO$UWP13V27lwg--S}J;TG{bsZFW+M71oJuBDZgwJ*^`fUE-^y(arUXWf!6fA z4+Zu`BR&~wf=l&73wXON27gG`45QTvax4F4g_$6$l+oIb#qz!z7|m(w*xi2k#Bgqz zS9rInh;r44NXxNoJ-Z6D51#A67ItjS5eVgFyH}@a9KeWnA~%P9hWo`cL*$JILPcHn zdf^Gp;RGVRcIp~sH9E7nLPB3fMUoxiD2sAKbblAobm?g=p|5LSvwPQ2JBjDoh0Pm_ rzy7~nqJ@n`j0WN1{*V!4i{C{kjNxWk-9VwKcsDq1a>C`>_#FQSQ5R#E literal 4011 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 diff --git a/GUI/QtQuick/qml/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet.qml index 6dfbde7ac..d4fe704b5 100644 --- a/GUI/QtQuick/qml/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet.qml @@ -232,7 +232,6 @@ Window { } function init() { - //bsApp.settingActivated = true if (bsApp.settingActivated === true) { stack_create_wallet.pop() diff --git a/GUI/QtQuick/qml/ImportWatchingWallet.qml b/GUI/QtQuick/qml/ImportWatchingWallet.qml index 7d4fe5ed5..7636fc0bd 100644 --- a/GUI/QtQuick/qml/ImportWatchingWallet.qml +++ b/GUI/QtQuick/qml/ImportWatchingWallet.qml @@ -2,6 +2,8 @@ import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 +import QtQuick.Dialogs 1.3 + import "StyledControls" import "BsStyles" @@ -56,7 +58,7 @@ ColumnLayout { Layout.preferredHeight: 282 height: 282 - source: layout.isFileChoosen ? "qrc:/images/file_drop.png" : "qrc:/images/wallet_file.png" + source: "qrc:/images/file_drop.png" Image { id: file_icon @@ -117,18 +119,20 @@ ColumnLayout { font.weight: Font.Normal } - /*FileDialog { + FileDialog { id: fileDialog visible: false onAccepted: { - label_file.text = fileDialog.fileUrl + label_file.text = basename(fileDialog.fileUrl.toString()) + layout.isFileChoosen = true + dashed_border.source = "qrc:/images/wallet_file.png" } - }*/ + } MouseArea { anchors.fill: parent onClicked: { - //fileDialog.visible = true + fileDialog.visible = true } } @@ -155,4 +159,10 @@ ColumnLayout { Layout.fillHeight: true Layout.fillWidth: true } + + function basename(str) + { + return (str.slice(str.lastIndexOf("/")+1)) + } + } From 2778ae7405010f0c3d557df15de3996a51e46f6a Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 2 Jan 2023 15:22:55 +0300 Subject: [PATCH 032/436] fix for activated setting reset --- Core/SettingsAdapter.cpp | 3 --- GUI/QtQuick/QtQuickAdapter.cpp | 5 ----- 2 files changed, 8 deletions(-) diff --git a/Core/SettingsAdapter.cpp b/Core/SettingsAdapter.cpp index d9c0ec749..0da376c4d 100644 --- a/Core/SettingsAdapter.cpp +++ b/Core/SettingsAdapter.cpp @@ -41,9 +41,6 @@ SettingsAdapter::SettingsAdapter(const std::shared_ptr &set logMgr_->add(appSettings_->GetLogsConfig()); logger_ = logMgr_->logger(); - if (!appSettings_->get(ApplicationSettings::initialized)) { - appSettings_->SetDefaultSettings(true); - } appSettings_->selectNetwork(); logger_->debug("Settings loaded from {}", appSettings_->GetSettingsPath().toStdString()); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 2ecaf8d42..6d27fd715 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -715,11 +715,6 @@ void QtQuickAdapter::requestInitialSettings() setReq->set_index(SetIdx_ArmoryDbPort); setReq->set_type(SettingType_String); - setReq = msgReq->add_requests(); - setReq->set_source(SettingSource_Local); - setReq->set_index(SetIdx_Initialized); - setReq->set_type(SettingType_Bool); - pushRequest(user_, userSettings_, msg.SerializeAsString()); } From c264f7d612caf3b9a1b38c7a965f8dcc53a3f51c Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 9 Jan 2023 05:01:20 +0200 Subject: [PATCH 033/436] ConfirmPassword.qml: fix store password --- GUI/QtQuick/qml/ConfirmPassword.qml | 2 ++ GUI/QtQuick/qml/StartCreateWallet.qml | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/ConfirmPassword.qml b/GUI/QtQuick/qml/ConfirmPassword.qml index 677133fb9..a5b84bdd5 100644 --- a/GUI/QtQuick/qml/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/ConfirmPassword.qml @@ -93,6 +93,8 @@ ColumnLayout { layout.sig_confirm() password.isValid = true confirm_password.isValid = true + password.input_text = "" + confirm_password.input_text = "" } else { diff --git a/GUI/QtQuick/qml/StartCreateWallet.qml b/GUI/QtQuick/qml/StartCreateWallet.qml index 74c9b0a0a..315afb29b 100644 --- a/GUI/QtQuick/qml/StartCreateWallet.qml +++ b/GUI/QtQuick/qml/StartCreateWallet.qml @@ -51,7 +51,8 @@ ColumnLayout { Text { Layout.alignment: Qt.AlignCenter Layout.preferredHeight : 16 - text: "

Need help? Please consult our Getting Started Guides

" + text: "

Need help? Please consult our Getting Started Guides

" + color: "#7A88B0" onLinkActivated: Qt.openUrlExternally(link) } From 5e366cab873828f563c404e2d0818ae9a21f297f Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 9 Jan 2023 09:21:27 +0200 Subject: [PATCH 034/436] UI/UX improvements --- GUI/QtQuick/qml/ConfirmPassword.qml | 18 ++++++++++++- GUI/QtQuick/qml/CreateWallet.qml | 18 ++++++++++--- .../qml/StyledControls/CustomTextInput.qml | 2 ++ GUI/QtQuick/qml/WalletSeed.qml | 7 +++++ GUI/QtQuick/qml/WalletSeedSkipAccept.qml | 20 +++++++++++--- GUI/QtQuick/qml/WalletSeedVerify.qml | 26 ++++++++++++++++++- 6 files changed, 83 insertions(+), 8 deletions(-) diff --git a/GUI/QtQuick/qml/ConfirmPassword.qml b/GUI/QtQuick/qml/ConfirmPassword.qml index a5b84bdd5..673c9e0bf 100644 --- a/GUI/QtQuick/qml/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/ConfirmPassword.qml @@ -86,7 +86,10 @@ ColumnLayout { Component.onCompleted: { confirm_but.preferred = true } - onClicked: { + + function click_enter() { + if (!confirm_but.enabled) return + if(password.input_text === confirm_password.input_text) { bsApp.createWallet("", phrase, password.input_text) @@ -102,5 +105,18 @@ ColumnLayout { confirm_password.isValid = false } } + + onClicked: { + click_enter() + } } + + Keys.onEnterPressed: { + confirm_but.click_enter() + } + + Keys.onReturnPressed: { + confirm_but.click_enter() + } + } diff --git a/GUI/QtQuick/qml/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet.qml index d4fe704b5..6789125d9 100644 --- a/GUI/QtQuick/qml/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet.qml @@ -126,9 +126,21 @@ Window { } replaceEnter: Transition { + PropertyAnimation { + property: "opacity" + from: 0 + to:1 + duration: 10 + } } replaceExit: Transition { + PropertyAnimation { + property: "opacity" + from: 1 + to:0 + duration: 10 + } } } @@ -160,7 +172,7 @@ Window { visible: false phrase: root.phrase onSig_continue: { - wallet_seed_verify.createRandomIndexes() + wallet_seed_verify.init() stack_create_wallet.push(wallet_seed_verify) } } @@ -181,7 +193,7 @@ Window { id: wallet_seed_accept visible: false onSig_skip: { - stack_create_wallet.push(confirm_password) + stack_create_wallet.replace(confirm_password) } onSig_not_skip: { stack_create_wallet.pop() @@ -235,7 +247,7 @@ Window { if (bsApp.settingActivated === true) { stack_create_wallet.pop() - stack_create_wallet.replace(start_create) + stack_create_wallet.replace(start_create, StackView.Immediate) } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index 688907242..4070c5679 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -22,6 +22,8 @@ Rectangle { property alias title_leftMargin: title.anchors.leftMargin property alias title_topMargin: title.anchors.topMargin + property alias input_item: input + property bool isValid: true property bool isPassword: false property bool isHiddenText: false diff --git a/GUI/QtQuick/qml/WalletSeed.qml b/GUI/QtQuick/qml/WalletSeed.qml index 4b29722d9..c64213b22 100644 --- a/GUI/QtQuick/qml/WalletSeed.qml +++ b/GUI/QtQuick/qml/WalletSeed.qml @@ -88,6 +88,13 @@ ColumnLayout { onClicked: { layout.sig_continue() } + + Keys.onPressed: (event)=> { + if (event.key === Qt.Key_Enter) + { + state = layout.sig_continue() + } + } } } diff --git a/GUI/QtQuick/qml/WalletSeedSkipAccept.qml b/GUI/QtQuick/qml/WalletSeedSkipAccept.qml index 8a5685972..21adf862f 100644 --- a/GUI/QtQuick/qml/WalletSeedSkipAccept.qml +++ b/GUI/QtQuick/qml/WalletSeedSkipAccept.qml @@ -41,7 +41,7 @@ ColumnLayout { Label { id: warning_description - text: "Are you sure you want to skip the seed verifying?" + text: qsTr("Are you sure you do not want to verify your seed?") Layout.alignment: Qt.AlignHCenter | Qt.AlignTop @@ -78,7 +78,7 @@ ColumnLayout { } onClicked: { - sig_skip() + layout.sig_skip() } } @@ -91,10 +91,24 @@ ColumnLayout { no_but.preferred = true } + function click_enter() { + if (!no_but.enabled) return +`` + layout.sig_not_skip() + } + onClicked: { - sig_not_skip() + click_enter() } } } + + Keys.onEnterPressed: { + no_but.click_enter() + } + + Keys.onReturnPressed: { + no_but.click_enter() + } } diff --git a/GUI/QtQuick/qml/WalletSeedVerify.qml b/GUI/QtQuick/qml/WalletSeedVerify.qml index 99f4cc177..257bfdf16 100644 --- a/GUI/QtQuick/qml/WalletSeedVerify.qml +++ b/GUI/QtQuick/qml/WalletSeedVerify.qml @@ -44,6 +44,7 @@ ColumnLayout { delegate: CustomSeedTextInput { width: 530 title_text: layout.indexes[index] + //focus: list.currentIndex === index isValid: list.isValid onTextChanged : { list.isComplete = true @@ -56,6 +57,9 @@ ColumnLayout { } } } + + //KeyNavigation.tab: list.currentIndex = index Date: Mon, 9 Jan 2023 19:57:42 +0300 Subject: [PATCH 035/436] Worker test added --- .../QtQuick}/hwcommonstructure.cpp | 0 .../QtQuick}/hwcommonstructure.h | 0 .../QtQuick}/hwdevicemodel.cpp | 0 .../QtQuick}/hwdevicemodel.h | 0 UnitTests/TestCommon.cpp | 142 ++++++++++++++++++ UnitTests/TestEnv.cpp | 33 ++-- UnitTests/TestEnv.h | 5 +- common | 2 +- 8 files changed, 160 insertions(+), 22 deletions(-) rename {BlockSettleHW => GUI/QtQuick}/hwcommonstructure.cpp (100%) rename {BlockSettleHW => GUI/QtQuick}/hwcommonstructure.h (100%) rename {BlockSettleHW => GUI/QtQuick}/hwdevicemodel.cpp (100%) rename {BlockSettleHW => GUI/QtQuick}/hwdevicemodel.h (100%) diff --git a/BlockSettleHW/hwcommonstructure.cpp b/GUI/QtQuick/hwcommonstructure.cpp similarity index 100% rename from BlockSettleHW/hwcommonstructure.cpp rename to GUI/QtQuick/hwcommonstructure.cpp diff --git a/BlockSettleHW/hwcommonstructure.h b/GUI/QtQuick/hwcommonstructure.h similarity index 100% rename from BlockSettleHW/hwcommonstructure.h rename to GUI/QtQuick/hwcommonstructure.h diff --git a/BlockSettleHW/hwdevicemodel.cpp b/GUI/QtQuick/hwdevicemodel.cpp similarity index 100% rename from BlockSettleHW/hwdevicemodel.cpp rename to GUI/QtQuick/hwdevicemodel.cpp diff --git a/BlockSettleHW/hwdevicemodel.h b/GUI/QtQuick/hwdevicemodel.h similarity index 100% rename from BlockSettleHW/hwdevicemodel.h rename to GUI/QtQuick/hwdevicemodel.h diff --git a/UnitTests/TestCommon.cpp b/UnitTests/TestCommon.cpp index 61f09ff62..ac29cbc1e 100644 --- a/UnitTests/TestCommon.cpp +++ b/UnitTests/TestCommon.cpp @@ -28,6 +28,7 @@ #include "CacheFile.h" #include "CurrencyPair.h" #include "EasyCoDec.h" +#include "Message/Worker.h" #include "Wallets/HeadlessContainer.h" #include "Wallets/InprocSigner.h" #include "MDCallbacksQt.h" @@ -425,3 +426,144 @@ TEST(TestCommon, PriceAmount) EXPECT_EQ(bs::CentAmount(0.12345).to_string(), "0.12"); EXPECT_EQ(bs::CentAmount(-0.12345).to_string(), "0.12"); } + +TEST(TestCommon, Workers) +{ + struct DataIn1 : public bs::InData + { + ~DataIn1() override = default; + std::string message; + }; + struct DataOut1 : public bs::OutData + { + ~DataOut1() override = default; + std::string message; + }; + struct DataIn2 : public bs::InData + { + ~DataIn2() override = default; + std::string message; + }; + struct DataOut2 : public bs::OutData + { + ~DataOut2() override = default; + std::string message; + }; + + class Handler1 : public bs::HandlerImpl + { + protected: + std::shared_ptr processData(const std::shared_ptr& in) override + { + DataOut1 out; + out.message = in->message; + for (auto& c : out.message) { + c = std::tolower(c); + } + out.message = "h1: " + out.message; + return std::make_shared(out); + } + }; + + class Handler2 : public bs::HandlerImpl + { + protected: + std::shared_ptr processData(const std::shared_ptr& in) override + { + DataOut2 out; + out.message = in->message; + for (auto& c : out.message) { + c = std::toupper(c); + } + out.message = "h2: " + out.message; + return std::make_shared(out); + } + }; + + class TestWorkerMgr : public bs::WorkerPool + { + public: + TestWorkerMgr() : bs::WorkerPool() {} + + void test1() + { + DataIn1 data; + data.message = "TEST1 message"; + const auto& inData = std::make_shared(data); + + const auto& cb = [](const std::shared_ptr& result) + { + auto data = std::static_pointer_cast(result); + StaticLogger::loggerPtr->debug("[TestWorkerMgr::test1] {}", data ? data->message : "null"); + ASSERT_NE(data, nullptr); + EXPECT_EQ(data->message, "h1: test1 message"); + }; + processQueued(inData, cb); + } + + void test2() + { + DataIn2 data; + data.message = "TEST2 message"; + const auto& inData = std::make_shared(data); + + const auto& cb = [](const std::shared_ptr& result) + { + auto data = std::static_pointer_cast(result); + StaticLogger::loggerPtr->debug("[TestWorkerMgr::test2] {}", data ? data->message : "null"); + ASSERT_NE(data, nullptr); + EXPECT_EQ(data->message, "h2: TEST2 MESSAGE"); + }; + processQueued(inData, cb); + } + + void testNested() + { + DataIn1 data1; + data1.message = "NESTED message"; + const auto& inData1 = std::make_shared(data1); + + const auto& cb1 = [](const std::shared_ptr& result) + { + auto data = std::static_pointer_cast(result); + StaticLogger::loggerPtr->debug("[TestWorkerMgr::nested1] {}", data ? data->message : "null"); + ASSERT_NE(data, nullptr); + EXPECT_EQ(data->message, "h1: nested message"); + }; + + DataIn2 data2; + data2.message = "NORMAL message"; + const auto& inData2 = std::make_shared(data2); + + const auto& cb2 = [this, cb1, inData1] + (const std::shared_ptr& result) + { + auto data = std::static_pointer_cast(result); + StaticLogger::loggerPtr->debug("[TestWorkerMgr::nested2] {}", data ? data->message : "null"); + ASSERT_NE(data, nullptr); + EXPECT_EQ(data->message, "h2: NORMAL MESSAGE"); + processQueued(inData1, cb1); + }; + processQueued(inData2, cb2); + } + + protected: + std::shared_ptr worker(const std::shared_ptr&) override + { + const std::vector> handlers{ + std::make_shared(), std::make_shared() }; + return std::make_shared(handlers); + } + }; + + TestWorkerMgr wm; + for (int i = 0; i < 5; ++i) { + wm.test1(); + wm.test2(); + wm.testNested(); + } + StaticLogger::loggerPtr->debug("{} thread[s] used", wm.nbThreads()); + while (!wm.finished()) { + std::this_thread::sleep_for(std::chrono::milliseconds{ 1 }); + } +} diff --git a/UnitTests/TestEnv.cpp b/UnitTests/TestEnv.cpp index 675de4822..7abbf3daf 100644 --- a/UnitTests/TestEnv.cpp +++ b/UnitTests/TestEnv.cpp @@ -102,7 +102,7 @@ void TestEnv::requireArmory(bool waitForReady) armoryInstance_ = std::make_shared(); auto armoryConnection = std::make_shared( - armoryInstance_, logger_, "", false); + armoryInstance_, logger_, ""); ArmorySettings settings; settings.runLocally = false; settings.socketType = appSettings()->GetArmorySocketType(); @@ -111,28 +111,25 @@ void TestEnv::requireArmory(bool waitForReady) settings.armoryDBPort = armoryInstance_->port_; settings.dataDir = QLatin1String("armory_regtest_db"); - auto keyCb = [](const BinaryData&, const std::string&)->bool + const auto& keyCb = [](const BinaryData&, const std::string&)->bool { return true; }; - armoryConnection->setupConnection(settings, keyCb); - armoryConnection_ = armoryConnection; - - blockMonitor_ = std::make_shared(armoryConnection_); + const auto& cbConnected = [this, armoryConnection, waitForReady] + { + armoryConnection_ = armoryConnection; + blockMonitor_ = std::make_shared(armoryConnection_); + armoryConnection_->goOnline(); + }; + const auto& cbConnFailed = [] + { + ASSERT_TRUE(false) << "ArmoryDB connection failed"; + }; + armoryConnection->setupConnection(settings, cbConnected, cbConnFailed, keyCb); - qDebug() << "Waiting for ArmoryDB connection..."; - while (armoryConnection_->state() != ArmoryState::Connected) { - std::this_thread::sleep_for(std::chrono::milliseconds{ 1 }); - } - if (waitForReady) { - qDebug() << "Armory connected - waiting for ready state..."; - } - else { - qDebug() << "Armory connected - go online"; - } - armoryConnection_->goOnline(); if (waitForReady) { - while (armoryConnection_->state() != ArmoryState::Ready) { + qDebug() << "Waiting for ArmoryDB connection..."; + while (armoryConnection->state() != ArmoryState::Ready) { std::this_thread::sleep_for(std::chrono::milliseconds{ 1 }); } logger_->debug("Armory is ready - continue execution"); diff --git a/UnitTests/TestEnv.h b/UnitTests/TestEnv.h index 74424054f..1dff0b4d0 100644 --- a/UnitTests/TestEnv.h +++ b/UnitTests/TestEnv.h @@ -416,9 +416,8 @@ class TestArmoryConnection : public ArmoryObject TestArmoryConnection( std::shared_ptr armoryInstance, const std::shared_ptr &loggerRef, - const std::string &txCacheFN, - bool cbInMainThread = true) : - ArmoryObject(loggerRef, txCacheFN, cbInMainThread) + const std::string &txCacheFN) : + ArmoryObject(loggerRef, txCacheFN) , armoryInstance_(armoryInstance) {} diff --git a/common b/common index 0d70f4173..240c0d849 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 0d70f41734934aa34d39b8ad984e4b7398f9d5ac +Subproject commit 240c0d849c601bde6a476c18fd66627fb3d9484a From 53370606a4474d2c7ef8c06e2bebe29aac68ba31 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 9 Jan 2023 19:59:19 +0300 Subject: [PATCH 036/436] [WIP] hardware wallets implementation --- BlockSettleApp/main.cpp | 2 +- BlockSettleHW/CMakeLists.txt | 3 + BlockSettleHW/hwdeviceinterface.h | 124 ++- BlockSettleHW/hwdevicemanager.cpp | 494 +++++---- BlockSettleHW/hwdevicemanager.h | 198 ++-- BlockSettleHW/ledger/ledgerClient.cpp | 70 +- BlockSettleHW/ledger/ledgerClient.h | 48 +- BlockSettleHW/ledger/ledgerDevice.cpp | 1156 ++++++++++------------ BlockSettleHW/ledger/ledgerDevice.h | 224 +++-- BlockSettleHW/ledger/ledgerStructure.cpp | 3 +- BlockSettleHW/ledger/ledgerStructure.h | 57 +- BlockSettleHW/trezor/trezorClient.cpp | 423 ++++---- BlockSettleHW/trezor/trezorClient.h | 153 +-- BlockSettleHW/trezor/trezorDevice.cpp | 528 +++++----- BlockSettleHW/trezor/trezorDevice.h | 189 ++-- BlockSettleHW/trezor/trezorStructure.h | 66 +- BlockSettleUILib/UiUtils.cpp | 3 +- CMakeLists.txt | 23 +- Core/TerminalMessage.h | 1 + GUI/QtQuick/QtQuickAdapter.cpp | 10 + GUI/QtQuick/QtQuickAdapter.h | 10 +- GUI/QtQuick/hwcommonstructure.cpp | 25 - GUI/QtQuick/hwcommonstructure.h | 39 - GUI/QtQuick/hwdevicemodel.cpp | 17 +- GUI/QtQuick/hwdevicemodel.h | 4 + 25 files changed, 1957 insertions(+), 1913 deletions(-) diff --git a/BlockSettleApp/main.cpp b/BlockSettleApp/main.cpp index dcd752297..802c8d2d3 100644 --- a/BlockSettleApp/main.cpp +++ b/BlockSettleApp/main.cpp @@ -214,7 +214,7 @@ int main(int argc, char** argv) //inprocBus.addAdapter(std::make_shared(logMgr->logger("mdh"))); //inprocBus.addAdapter(std::make_shared(logMgr->logger("chat"))); inprocBus.addAdapterWithQueue(std::make_shared(logMgr->logger() - , userBlockchain), /*"blkchain_conn"*/"signer"); + , userBlockchain), "signer"); if (!inprocBus.run(argc, argv)) { logMgr->logger()->error("No runnable adapter found on main inproc bus"); diff --git a/BlockSettleHW/CMakeLists.txt b/BlockSettleHW/CMakeLists.txt index f38c35db5..65ff3f5b6 100644 --- a/BlockSettleHW/CMakeLists.txt +++ b/BlockSettleHW/CMakeLists.txt @@ -11,6 +11,7 @@ PROJECT( ${BLOCKSETTLE_HW_LIBRARY_NAME} ) SET(BLOCKSETTLE_HW_ROOT ${CMAKE_CURRENT_SOURCE_DIR}) +ADD_DEFINITIONS(-DBUILD_HW_WALLETS) file(COPY ${THIRD_PARTY_COMMON_DIR}/hidapi/hidapi.h DESTINATION ${BLOCKSETTLE_HW_ROOT}/ledger/hidapi) @@ -34,6 +35,8 @@ FILE(GLOB HEADERS INCLUDE_DIRECTORIES( ${WALLET_LIB_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${BS_NETWORK_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${COMMON_LIB_INCLUDE_DIR} ) +INCLUDE_DIRECTORIES(${BLOCK_SETTLE_ROOT}/Core) +INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR}) if (UNIX) INCLUDE_DIRECTORIES( ${LIBUSB_INCLUDE_DIR} ) diff --git a/BlockSettleHW/hwdeviceinterface.h b/BlockSettleHW/hwdeviceinterface.h index 5191b9c09..654b83afc 100644 --- a/BlockSettleHW/hwdeviceinterface.h +++ b/BlockSettleHW/hwdeviceinterface.h @@ -11,10 +11,9 @@ #ifndef HWDEVICEABSTRACT_H #define HWDEVICEABSTRACT_H -#include "hwcommonstructure.h" -#include -#include -#include +#include +#include "CoreWallet.h" +#include "SecureBinaryData.h" namespace bs { namespace core { @@ -24,56 +23,71 @@ namespace bs { } } -class HwDeviceInterface : public QObject -{ - Q_OBJECT - -public: - HwDeviceInterface(QObject* parent = nullptr) - : QObject(parent) {} - ~HwDeviceInterface() override = default; - - virtual DeviceKey key() const = 0; - virtual DeviceType type() const = 0; - - // lifecycle - virtual void init(AsyncCallBack&& cb = nullptr) = 0; - virtual void cancel() = 0; - virtual void clearSession(AsyncCallBack&& cb = nullptr) = 0; - - // operation - virtual void getPublicKey(AsyncCallBackCall&& cb = nullptr) = 0; - virtual void signTX(const bs::core::wallet::TXSignRequest& reqTX, AsyncCallBackCall&& cb = nullptr) = 0; - virtual void retrieveXPubRoot(AsyncCallBack&& cb) = 0; - - // Management - virtual void setMatrixPin(const std::string& pin) {}; - virtual void setPassword(const std::string& password, bool enterOnDevice) {}; - - // State - virtual bool isBlocked() = 0; - virtual QString lastError() { return {}; }; - - // xpub root - bool inited() { - return !xpubRoot_.empty(); - } - -signals: - // operation result informing - void publicKeyReady(); - void deviceTxStatusChanged(QString status); - void operationFailed(QString reason); - void requestForRescan(); - - // Management - void requestPinMatrix(); - void requestHWPass(bool allowedOnDevice); - void cancelledOnDevice(); - void invalidPin(); - -protected: - std::string xpubRoot_; -}; +namespace bs { + namespace hww { + enum class DeviceType { + Unknown, + HWLedger, + HWTrezor + }; + + struct DeviceKey + { + std::string label; + std::string id; + std::string vendor; + std::string walletId; + std::string status; + + DeviceType type{ DeviceType::Unknown }; + }; + + class DeviceInterface + { + public: + virtual DeviceKey key() const = 0; + virtual DeviceType type() const = 0; + + // lifecycle + virtual void init() = 0; + virtual void cancel() = 0; + virtual void clearSession() = 0; + + // operation + virtual void getPublicKey() = 0; + virtual void signTX(const bs::core::wallet::TXSignRequest& reqTX) = 0; + virtual void retrieveXPubRoot() = 0; + + // Management + virtual void setMatrixPin(const SecureBinaryData& pin) {}; + virtual void setPassword(const SecureBinaryData& password, bool enterOnDevice) {}; + + // State + virtual bool isBlocked() const = 0; + virtual std::string lastError() const { return {}; }; + + virtual bool inited() + { + return !xpubRoot_.empty(); + } + + // operation result informing + virtual void publicKeyReady() = 0; + virtual void deviceTxStatusChanged(const std::string& status) = 0; + virtual void operationFailed(const std::string& reason) = 0; + virtual void requestForRescan() = 0; + + // Management + virtual void requestPinMatrix() = 0; + virtual void requestHWPass(bool allowedOnDevice) = 0; + virtual void cancelledOnDevice() = 0; + virtual void invalidPin() = 0; + + protected: + BinaryData xpubRoot_; + }; + + } //hw +} //bs #endif // HWDEVICEABSTRACT_H diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index 88396ca11..521af3d7b 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -9,96 +9,106 @@ */ #include "hwdevicemanager.h" -#include "trezor/trezorClient.h" +#include #include "trezor/trezorDevice.h" -#include "ledger/ledgerClient.h" #include "ledger/ledgerDevice.h" -#include "ConnectionManager.h" +#include "TerminalMessage.h" #include "Wallets/SyncWalletsManager.h" #include "Wallets/SyncHDWallet.h" #include "Wallets/ProtobufHeadlessUtils.h" -using namespace Armory::Signer; +#include "common.pb.h" +#include "hardware_wallet.pb.h" -HwDeviceManager::HwDeviceManager(const std::shared_ptr& connectionManager, std::shared_ptr walletManager, - bool testNet, QObject* parent /*= nullptr*/) - : QObject(parent) - , logger_(connectionManager->GetLogger()) - , testNet_(testNet) -{ - walletManager_ = walletManager; - trezorClient_ = std::make_unique(connectionManager, walletManager, testNet, this); - ledgerClient_ = std::make_unique(logger_, walletManager, testNet); +//using namespace Armory::Signer; +using namespace bs::hww; +using namespace BlockSettle::Common; - model_ = new HwDeviceModel(this); +DeviceManager::DeviceManager(const std::shared_ptr& logger) + : logger_(logger), testNet_(true) + , user_(std::make_shared(bs::message::TerminalUsers::HWWallets)) + , userWallets_(std::make_shared(bs::message::TerminalUsers::Wallets)) +{ + trezorClient_ = std::make_unique(logger_, testNet_, this); + ledgerClient_ = std::make_unique(logger_, testNet_, this); } -HwDeviceManager::~HwDeviceManager() +DeviceManager::~DeviceManager() { - releaseConnection(nullptr); -}; + releaseConnection(); +} -void HwDeviceManager::scanDevices() +bs::message::ProcessingResult DeviceManager::process(const bs::message::Envelope& env) { - if (isScanning_) { - return; + if (env.isRequest()) { + return processOwnRequest(env); } - - setScanningFlag(true); - - auto doneScanning = [this, expectedClients = 2, finished = std::make_shared(0)]() { - ++(*finished); - - if (*finished == expectedClients) { - scanningDone(); + else { + switch (env.sender->value()) { + case bs::message::TerminalUsers::Wallets: + return processWallet(env); + default: break; } - }; + } + return bs::message::ProcessingResult::Ignored; +} - ledgerClient_->scanDevices(doneScanning); - releaseConnection([this, doneScanning] { - trezorClient_->initConnection(true, [this, doneScanning]() { - doneScanning(); - }); - }); +bool DeviceManager::processBroadcast(const bs::message::Envelope& env) +{ + if (env.sender->isSystem()) { + AdministrativeMessage msg; + if (msg.ParseFromString(env.message)) { + if (msg.data_case() == AdministrativeMessage::kStart) { + start(); + return true; + } + } + } + return false; } -void HwDeviceManager::requestPublicKey(int deviceIndex) +void DeviceManager::scanDevices() { - auto device = getDevice(model_->getDevice(deviceIndex)); - if (!device) { + if (nbScanning_ > 0) { return; } - device->getPublicKey([this](QVariant&& data) { - emit publicKeyReady(data); - }); - - connectDevice(device); + setScanningFlag(2); + ledgerClient_->scanDevices(); + trezorClient_->listDevices(); } -void HwDeviceManager::setMatrixPin(int deviceIndex, QString pin) +void DeviceManager::requestPublicKey(const DeviceKey& key) { - auto device = getDevice(model_->getDevice(deviceIndex)); + auto device = getDevice(key); if (!device) { return; } - - device->setMatrixPin(pin.toStdString()); + device->getPublicKey(); } -void HwDeviceManager::setPassphrase(int deviceIndex, QString passphrase, bool enterOnDevice) +void DeviceManager::setMatrixPin(const DeviceKey& key, const std::string& pin) { - auto device = getDevice(model_->getDevice(deviceIndex)); + auto device = getDevice(key); if (!device) { return; } + device->setMatrixPin(SecureBinaryData::fromString(pin)); +} - device->setPassword(passphrase.toStdString(), enterOnDevice); +void DeviceManager::setPassphrase(const DeviceKey& key, const std::string& passphrase + , bool enterOnDevice) +{ + auto device = getDevice(key); + if (!device) { + return; + } + device->setPassword(SecureBinaryData::fromString(passphrase), enterOnDevice); } -void HwDeviceManager::cancel(int deviceIndex) +void DeviceManager::cancel(const DeviceKey& key) { - auto device = getDevice(model_->getDevice(deviceIndex)); + auto device = getDevice(key); if (!device) { return; } @@ -106,60 +116,92 @@ void HwDeviceManager::cancel(int deviceIndex) device->cancel(); } -void HwDeviceManager::prepareHwDeviceForSign(QString walletId) +void bs::hww::DeviceManager::start() { - auto hdWallet = walletManager_->getHDWalletById(walletId.toStdString()); - assert(hdWallet->isHardwareWallet()); - auto encKeys = hdWallet->encryptionKeys(); - bs::wallet::HardwareEncKey hwEncType(encKeys[0]); +} - if (bs::wallet::HardwareEncKey::WalletType::Ledger == hwEncType.deviceType()) { - ledgerClient_->scanDevices([caller = QPointer(this), walletId]() { - if (!caller) { - return; - } +bs::message::ProcessingResult DeviceManager::processPrepareDeviceForSign(const bs::message::Envelope& env + , const std::string& walletId) +{ + WalletsMessage msg; + msg.set_hd_wallet_get(walletId); + const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); + prepareDeviceReq_[msgId] = {walletId, env}; + return bs::message::ProcessingResult::Success; +} - auto devices = caller->ledgerClient_->deviceKeys(); - if (devices.empty()) { - caller->lastOperationError_ = caller->ledgerClient_->lastScanError(); - caller->deviceNotFound(QString::fromStdString(kDeviceLedgerId)); - return; - } +bs::message::ProcessingResult bs::hww::DeviceManager::processOwnRequest(const bs::message::Envelope&) +{ + return bs::message::ProcessingResult(); +} - bool found = false; - DeviceKey deviceKey; - for (auto Key : devices) { - if (Key.walletId_ == walletId) { - deviceKey = Key; - found = true; - break; - } - } +bs::message::ProcessingResult bs::hww::DeviceManager::processWallet(const bs::message::Envelope& env) +{ + WalletsMessage msg; + if (!msg.ParseFromString(env.message)) { + logger_->error("[hww::DeviceManager::processWallet] failed to parse #{}" + , env.foreignId()); + return bs::message::ProcessingResult::Error; + } + switch (msg.data_case()) { + case WalletsMessage::kHdWallet: + return prepareDeviceForSign(env.responseId(), msg.hd_wallet()); + } + return bs::message::ProcessingResult::Ignored; +} - if (!found) { - if (!devices.isEmpty()) { - caller->lastOperationError_ = caller->getDevice(devices.front())->lastError(); - } +bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::SeqId msgId + , const HDWalletData& hdWallet) +{ + const auto& itWallet = prepareDeviceReq_.find(msgId); + if (itWallet == prepareDeviceReq_.end()) { + logger_->warn("[{}] unknown response #{}", __func__, msgId); + return bs::message::ProcessingResult::Error; + } + prepareDeviceReq_.erase(itWallet); + if (!hdWallet.is_hardware() || !hdWallet.encryption_keys_size()) { + logger_->error("[{}] wallet {} is not suitable", __func__, hdWallet.wallet_id()); + return bs::message::ProcessingResult::Error; - caller->deviceNotFound(QString::fromStdString(kDeviceLedgerId)); - } - else { - caller->model_->resetModel({ std::move(deviceKey) }); - caller->deviceReady(QString::fromStdString(kDeviceLedgerId)); + } + bs::wallet::HardwareEncKey hwEncType(BinaryData::fromString(hdWallet.encryption_keys(0))); + + if (bs::wallet::HardwareEncKey::WalletType::Ledger == hwEncType.deviceType()) { + ledgerClient_->scanDevices(); + const auto& devices = ledgerClient_->deviceKeys(); + if (devices.empty()) { + lastOperationError_ = ledgerClient_->lastScanError(); + deviceNotFound(kDeviceLedgerId); + return bs::message::ProcessingResult::Error; + } + + bool found = false; + DeviceKey deviceKey; + for (const auto& key : devices) { + if (key.walletId == hdWallet.wallet_id()) { + deviceKey = key; + found = true; + break; + } + } + if (!found) { + if (!devices.empty()) { + lastOperationError_ = getDevice(devices.front())->lastError(); } - }); + deviceNotFound(kDeviceLedgerId); + } + else { + deviceReady(kDeviceLedgerId); + } } else if (bs::wallet::HardwareEncKey::WalletType::Trezor == hwEncType.deviceType()) { auto deviceId = hwEncType.deviceId(); - const bool cleanPrevSession = (lastUsedTrezorWallet_ != walletId); - trezorClient_->initConnection(QString::fromStdString(deviceId), cleanPrevSession, [this](QVariant&& deviceId) { + const bool cleanPrevSession = (lastUsedTrezorWallet_ != hdWallet.wallet_id()); + { DeviceKey deviceKey; - - const auto id = deviceId.toString(); - bool found = false; for (auto key : trezorClient_->deviceKeys()) { - if (key.deviceId_ == id) { + if (key.id == deviceId) { found = true; deviceKey = key; break; @@ -167,229 +209,173 @@ void HwDeviceManager::prepareHwDeviceForSign(QString walletId) } if (!found) { - emit deviceNotFound(id); + deviceNotFound(deviceId); } else { - model_->resetModel({ std::move(deviceKey) }); - emit deviceReady(id); + deviceReady(deviceId); } - }); - lastUsedTrezorWallet_ = walletId; + } + lastUsedTrezorWallet_ = hdWallet.wallet_id(); } } -void HwDeviceManager::signTX(QVariant reqTX) +void DeviceManager::signTX(const DeviceKey& key, const bs::core::wallet::TXSignRequest& signReq) { - auto device = getDevice(model_->getDevice(0)); + auto device = getDevice(key); if (!device) { + deviceNotFound(key.id); return; } - - Blocksettle::Communication::headless::SignTxRequest pbSignReq; - bool rc = pbSignReq.ParseFromString(reqTX.toByteArray().toStdString()); - if (!rc) { - SPDLOG_LOGGER_ERROR(logger_, "parse TX failed"); - emit operationFailed(tr("Invalid sign request")); - return; - } - - auto signReq = bs::signer::pbTxRequestToCore(pbSignReq); - auto cbSigned = [this, signReq, device](QVariant&& data) { - assert(data.canConvert()); - auto tx = data.value(); - - if (device->key().type_ == DeviceType::HWTrezor) { - // According to architecture, Trezor allow us to sign tx with incorrect - // passphrase, so let's check that the final tx is correct. In Ledger case - // this situation is impossible, since the wallets with different passphrase will be treated - // as different devices, which will be verified in sign part. - try { - std::map> utxoMap; - for (unsigned i=0; igetUtxo(); - auto& idMap = utxoMap[utxo.getTxHash()]; - idMap.emplace(utxo.getTxOutIndex(), utxo); - } - unsigned flags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_SEGWIT | SCRIPT_VERIFY_P2SH_SHA256; - bool validSign = Signer::verify(SecureBinaryData::fromString(tx.signedTx) - , utxoMap, flags, true).isValid(); - if (!validSign) { - SPDLOG_LOGGER_ERROR(logger_, "sign verification failed"); - releaseConnection(); - emit operationFailed(tr("Signing failed. Please ensure you type the correct passphrase.")); - return; - } - } - catch (const std::exception &e) { - SPDLOG_LOGGER_ERROR(logger_, "sign verification failed: {}", e.what()); - releaseConnection(); - emit operationFailed(tr("Signing failed. Please ensure you type the correct passphrase.")); - return; - } - } - txSigned({ BinaryData::fromString(tx.signedTx) }); - }; - - device->signTX(signReq, std::move(cbSigned)); - - connectDevice(qobject_cast(device)); - - // tx specific connections - connect(device, &HwDeviceInterface::deviceTxStatusChanged, - this, &HwDeviceManager::deviceTxStatusChanged, Qt::UniqueConnection); - connect(device, &HwDeviceInterface::cancelledOnDevice, - this, &HwDeviceManager::cancelledOnDevice, Qt::UniqueConnection); - connect(device, &HwDeviceInterface::operationFailed, - this, &HwDeviceManager::deviceTxStatusChanged, Qt::UniqueConnection); - connect(device, &HwDeviceInterface::invalidPin, - this, &HwDeviceManager::invalidPin, Qt::UniqueConnection); - connect(device, &HwDeviceInterface::requestForRescan, - this, [this]() { - auto deviceInfo = model_->getDevice(0); - lastOperationError_ = getDevice(deviceInfo)->lastError(); - emit deviceNotFound(deviceInfo.deviceId_); - }, Qt::UniqueConnection); + device->signTX(signReq); } -void HwDeviceManager::releaseDevices() +void DeviceManager::releaseDevices() { releaseConnection(); } -void HwDeviceManager::hwOperationDone() -{ - model_->resetModel({}); -} - -bool HwDeviceManager::awaitingUserAction(int deviceIndex) +bool DeviceManager::awaitingUserAction(const DeviceKey& key) { - if (model_->rowCount() <= deviceIndex) { - return false; - } - - auto device = getDevice(model_->getDevice(deviceIndex)); + const auto& device = getDevice(key); return device && device->isBlocked(); } -QString HwDeviceManager::lastDeviceError() +void DeviceManager::releaseConnection() { - return lastOperationError_; + trezorClient_->releaseConnection(); } -void HwDeviceManager::releaseConnection(AsyncCallBack&& cb/*= nullptr*/) +void DeviceManager::scanningDone(bool initDevices) { - for (int i = 0; i < model_->rowCount(); ++i) { - auto device = getDevice(model_->getDevice(i)); - if (device) { - trezorClient_->initConnection(true, [this, cbCopy = std::move(cb)] { - trezorClient_->releaseConnection([this, cb = std::move(cbCopy)]() { - if (cb) { - cb(); - } - }); - }); - model_->resetModel({}); - return; - } - } - - if (cb) { - cb(); - } -} - -void HwDeviceManager::scanningDone(bool initDevices /* = true */) -{ - setScanningFlag(false); - auto allDevices = ledgerClient_->deviceKeys(); - allDevices.append(trezorClient_->deviceKeys()); - model_->resetModel(std::move(allDevices)); - emit devicesChanged(); + const auto& ledgerKeys = ledgerClient_->deviceKeys(); + auto allDevices = ledgerKeys; + const auto& trezorKeys = trezorClient_->deviceKeys(); + allDevices.insert(allDevices.end(), trezorKeys.cbegin(), trezorKeys.cend()); if (!initDevices) { + //TODO: send response with all devices return; } - - for (const auto& key : trezorClient_->deviceKeys()) { - auto device = trezorClient_->getTrezorDevice(key.deviceId_); + for (const auto& key : ledgerKeys) { + auto device = ledgerClient_->getDevice(key.id); if (!device->inited()) { - connectDevice(qobject_cast(device)); - device->retrieveXPubRoot([caller = QPointer(this)]() { - if (!caller) { - return; - } - - caller->scanningDone(false); - }); + device->init(); + } + } + for (const auto& key : trezorKeys) { + auto device = trezorClient_->getDevice(key.id); + if (!device->inited()) { + device->retrieveXPubRoot(); } } } -void HwDeviceManager::connectDevice(QPointer device) -{ - connect(device, &HwDeviceInterface::requestPinMatrix, - this, &HwDeviceManager::onRequestPinMatrix, Qt::UniqueConnection); - connect(device, &HwDeviceInterface::requestHWPass, - this, &HwDeviceManager::onRequestHWPass, Qt::UniqueConnection); - connect(device, &HwDeviceInterface::operationFailed, - this, &HwDeviceManager::operationFailed, Qt::UniqueConnection); -} - -QPointer HwDeviceManager::getDevice(DeviceKey key) +std::shared_ptr DeviceManager::getDevice(const DeviceKey& key) const { - switch (key.type_) + switch (key.type) { case DeviceType::HWTrezor: - return static_cast>(trezorClient_->getTrezorDevice(key.deviceId_)); - break; + return trezorClient_->getDevice(key.id); case DeviceType::HWLedger: - return static_cast>(ledgerClient_->getDevice(key.deviceId_)); - break; + return ledgerClient_->getDevice(key.id); default: // Add new device type assert(false); break; } - return nullptr; } -void HwDeviceManager::onRequestPinMatrix() +void DeviceManager::setScanningFlag(unsigned nbLeft) { - auto sender = qobject_cast(QObject::sender()); - int index = model_->getDeviceIndex(sender->key()); + if (nbScanning_ == nbLeft) { + return; + } + nbScanning_ = nbLeft; - if (index >= 0) { - emit requestPinMatrix(index); + if (nbLeft == 0) { + scanningDone(false); } } -void HwDeviceManager::onRequestHWPass(bool allowedOnDevice) +void DeviceManager::publicKeyReady(void* walletInfo) { - auto sender = qobject_cast(QObject::sender()); - int index = model_->getDeviceIndex(sender->key()); +} - if (index >= 0) { - emit requestHWPass(index, allowedOnDevice); - } +void DeviceManager::requestPinMatrix(const DeviceKey&) +{ +} + +void DeviceManager::requestHWPass(const DeviceKey&, bool allowedOnDevice) +{ +} + +void DeviceManager::deviceNotFound(const std::string& deviceId) +{ +} + +void DeviceManager::deviceReady(const std::string& deviceId) +{ +} + +void DeviceManager::deviceTxStatusChanged(const std::string& status) +{ +} + +void DeviceManager::txSigned(const SecureBinaryData& signData) +{ } -void HwDeviceManager::setScanningFlag(bool isScanning) +void DeviceManager::scanningDone() { - if (isScanning_ == isScanning) { + if (nbScanning_ == 0) { + logger_->error("[DeviceManager::scanningDone] more scanning done events than expected"); return; } + if (--nbScanning_ == 0) { + logger_->debug("[DeviceManager::scanningDone] all devices scanned"); + scanningDone(false); + } +} - isScanning_ = isScanning; - emit isScanningChanged(); +void DeviceManager::operationFailed(const std::string& deviceId, const std::string& reason) +{ } -HwDeviceModel* HwDeviceManager::devices() +void DeviceManager::cancelledOnDevice() { - return model_; } -bool HwDeviceManager::isScanning() const +void DeviceManager::invalidPin() { - return isScanning_; } + +using namespace bs::hd; + +namespace bs { + namespace hww { + Path getDerivationPath(bool testNet, Purpose element) + { + Path path; + path.append(hardFlag | element); + path.append(testNet ? CoinType::Bitcoin_test : CoinType::Bitcoin_main); + path.append(hardFlag); + return path; + } + + bool isNestedSegwit(const bs::hd::Path& path) + { + return path.get(0) == (bs::hd::Purpose::Nested | bs::hd::hardFlag); + } + + bool isNativeSegwit(const bs::hd::Path& path) + { + return path.get(0) == (bs::hd::Purpose::Native | bs::hd::hardFlag); + } + + bool isNonSegwit(const bs::hd::Path& path) + { + return path.get(0) == (bs::hd::Purpose::NonSegWit | bs::hd::hardFlag); + } + } //hww +} //bs diff --git a/BlockSettleHW/hwdevicemanager.h b/BlockSettleHW/hwdevicemanager.h index dc20a23a0..72f270d08 100644 --- a/BlockSettleHW/hwdevicemanager.h +++ b/BlockSettleHW/hwdevicemanager.h @@ -11,97 +11,123 @@ #ifndef HWDEVICESCANNER_H #define HWDEVICESCANNER_H -#include "hwcommonstructure.h" -#include "hwdevicemodel.h" -#include "SecureBinaryData.h" #include +#include "HDPath.h" +#include "hwdeviceinterface.h" +#include "Message/Adapter.h" +#include "ledger/ledgerClient.h" +#include "trezor/trezorClient.h" +#include "SecureBinaryData.h" -#include -#include -#include -class HwDeviceInterface; -class TrezorClient; -class LedgerClient; -class ConnectionManager; -namespace bs { - namespace sync { - class WalletsManager; +namespace spdlog { + class logger; +} +namespace BlockSettle { + namespace Common { + class HDWalletData; } } - -class HwDeviceManager : public QObject -{ - Q_OBJECT - Q_PROPERTY(HwDeviceModel* devices READ devices NOTIFY devicesChanged) - Q_PROPERTY(bool isScanning READ isScanning NOTIFY isScanningChanged) - -public: - HwDeviceManager(const std::shared_ptr& connectionManager, - std::shared_ptr walletManager, bool testNet, QObject* parent = nullptr); - ~HwDeviceManager() override; - - /// Property - HwDeviceModel* devices(); - bool isScanning() const; - - // Actions from UI - Q_INVOKABLE void scanDevices(); - Q_INVOKABLE void requestPublicKey(int deviceIndex); - Q_INVOKABLE void setMatrixPin(int deviceIndex, QString pin); - Q_INVOKABLE void setPassphrase(int deviceIndex, QString passphrase, bool enterOnDevice); - Q_INVOKABLE void cancel(int deviceIndex); - Q_INVOKABLE void prepareHwDeviceForSign(QString walletId); - Q_INVOKABLE void signTX(QVariant reqTX); - Q_INVOKABLE void releaseDevices(); - Q_INVOKABLE void hwOperationDone(); - - // Info asked from UI - Q_INVOKABLE bool awaitingUserAction(int deviceIndex); - Q_INVOKABLE QString lastDeviceError(); - -signals: - void devicesChanged(); - void publicKeyReady(QVariant walletInfo); - void requestPinMatrix(int deviceIndex); - void requestHWPass(int deviceIndex, bool allowedOnDevice); - - void deviceNotFound(QString deviceId); - void deviceReady(QString deviceId); - void deviceTxStatusChanged(QString status); - - void txSigned(SecureBinaryData signData); - void isScanningChanged(); - void operationFailed(QString reason); - void cancelledOnDevice(); - void invalidPin(); - -protected slots: - void onRequestPinMatrix(); - void onRequestHWPass(bool allowedOnDevice); - -private: - void setScanningFlag(bool isScanning); - void releaseConnection(AsyncCallBack&& cb = nullptr); - void scanningDone(bool initDevices = true); - void connectDevice(QPointer device); - - QPointer getDevice(DeviceKey key); - - std::shared_ptr logger_; - -public: - std::unique_ptr trezorClient_; - std::unique_ptr ledgerClient_; - std::shared_ptr walletManager_; - - HwDeviceModel* model_; - bool testNet_{}; - bool isScanning_{}; - bool isSigning_{}; - QString lastOperationError_; - QString lastUsedTrezorWallet_; -}; +namespace bs { + namespace hww { + + // There is no way to determinate difference between ledger devices + // so we use vendor name for identification + const std::string kDeviceLedgerId = "Ledger"; + + struct DeviceCallbacks + { + virtual void publicKeyReady(void* walletInfo) = 0; + virtual void requestPinMatrix(const DeviceKey&) = 0; + virtual void requestHWPass(const DeviceKey&, bool allowedOnDevice) = 0; + + virtual void deviceNotFound(const std::string& deviceId) = 0; + virtual void deviceReady(const std::string& deviceId) = 0; + virtual void deviceTxStatusChanged(const std::string& status) = 0; + + virtual void txSigned(const SecureBinaryData& signData) = 0; + virtual void scanningDone() = 0; + virtual void operationFailed(const std::string& deviceId, const std::string& reason) = 0; + virtual void cancelledOnDevice() = 0; + virtual void invalidPin() = 0; + }; + + class DeviceManager : public bs::message::Adapter, public DeviceCallbacks + { + public: + DeviceManager(const std::shared_ptr&); + ~DeviceManager() override; + + bs::message::ProcessingResult process(const bs::message::Envelope&) override; + bool processBroadcast(const bs::message::Envelope&) override; + + Users supportedReceivers() const override { return { user_ }; } + std::string name() const override { return "HWWallets"; } + + private: // signals + void publicKeyReady(void* walletInfo) override; + void requestPinMatrix(const DeviceKey&) override; + void requestHWPass(const DeviceKey&, bool allowedOnDevice) override; + + void deviceNotFound(const std::string& deviceId) override; + void deviceReady(const std::string& deviceId) override; + void deviceTxStatusChanged(const std::string& status) override; + + void txSigned(const SecureBinaryData& signData) override; + void scanningDone() override; + void operationFailed(const std::string& deviceId, const std::string& reason) override; + void cancelledOnDevice() override; + void invalidPin() override; + + //former invokables: + void scanDevices(); + void requestPublicKey(const DeviceKey&); + void setMatrixPin(const DeviceKey&, const std::string& pin); + void setPassphrase(const DeviceKey&, const std::string& passphrase + , bool enterOnDevice); + void cancel(const DeviceKey&); + bs::message::ProcessingResult prepareDeviceForSign(bs::message::SeqId + , const BlockSettle::Common::HDWalletData&); + void signTX(const DeviceKey&, const bs::core::wallet::TXSignRequest& reqTX); + void releaseDevices(); + //void hwOperationDone(); + bool awaitingUserAction(const DeviceKey&); + + void setScanningFlag(unsigned nbLeft); + void releaseConnection(); + void scanningDone(bool initDevices = true); + + std::shared_ptr getDevice(const DeviceKey& key) const; + + void start(); + bs::message::ProcessingResult processPrepareDeviceForSign(const bs::message::Envelope& + , const std::string& walletId); + bs::message::ProcessingResult processOwnRequest(const bs::message::Envelope&); + bs::message::ProcessingResult processWallet(const bs::message::Envelope&); + + private: + std::shared_ptr logger_; + std::unique_ptr trezorClient_; + std::unique_ptr ledgerClient_; + std::shared_ptr user_, userWallets_; + + bool testNet_{}; + unsigned nbScanning_{}; + bool isSigning_{}; + std::string lastOperationError_; + std::string lastUsedTrezorWallet_; + unsigned nbWaitScanReplies_{ 0 }; + + std::map> prepareDeviceReq_; //value: walletId + }; + + bs::hd::Path getDerivationPath(bool testNet, bs::hd::Purpose element); + bool isNestedSegwit(const bs::hd::Path& path); + bool isNativeSegwit(const bs::hd::Path& path); + bool isNonSegwit(const bs::hd::Path& path); + + } //hw +} //bs #endif // HWDEVICESCANNER_H diff --git a/BlockSettleHW/ledger/ledgerClient.cpp b/BlockSettleHW/ledger/ledgerClient.cpp index 6ba0ddebc..eb8a6b5ab 100644 --- a/BlockSettleHW/ledger/ledgerClient.cpp +++ b/BlockSettleHW/ledger/ledgerClient.cpp @@ -13,27 +13,26 @@ #include #include #endif - +#include +#include +#include #include "ledger/ledgerClient.h" #include "ledger/ledgerDevice.h" #include "ledger/hidapi/hidapi.h" -#include -#include "Wallets/SyncWalletsManager.h" - -#include -#include +#include "hwdevicemanager.h" +using namespace bs::hww; namespace { HidDeviceInfo fromHidOriginal(hid_device_info* info) { return { - QString::fromUtf8(info->path), + QString::fromUtf8(info->path).toStdString(), info->vendor_id, info->product_id, - QString::fromWCharArray(info->serial_number), + QString::fromWCharArray(info->serial_number).toStdString(), info->release_number, - QString::fromWCharArray(info->manufacturer_string), - QString::fromWCharArray(info->product_string), + QString::fromWCharArray(info->manufacturer_string).toStdString(), + QString::fromWCharArray(info->product_string).toStdString(), info->usage_page, info->usage, info->interface_number, @@ -41,18 +40,16 @@ namespace { } } -LedgerClient::LedgerClient(std::shared_ptr logger, std::shared_ptr walletManager, bool testNet, QObject *parent /*= nullptr*/) - : QObject(parent) - , logger_(logger) - , testNet_(testNet) - , walletManager_(walletManager) +LedgerClient::LedgerClient(const std::shared_ptr& logger + , bool testNet, DeviceCallbacks *cb) + : logger_(logger), testNet_(testNet), cb_(cb) { hidLock_ = std::make_shared(); } -QVector LedgerClient::deviceKeys() const +std::vector LedgerClient::deviceKeys() const { - QVector keys; + std::vector keys; keys.reserve(availableDevices_.size()); for (const auto device : availableDevices_) { if (device->inited()) { @@ -62,61 +59,44 @@ QVector LedgerClient::deviceKeys() const return keys; } -QPointer LedgerClient::getDevice(const QString& deviceId) +std::shared_ptr LedgerClient::getDevice(const std::string& deviceId) { for (auto device : availableDevices_) { - if (device->key().deviceId_ == deviceId) { + if (device->key().id == deviceId) { return device; } } - return nullptr; } -QString LedgerClient::lastScanError() const +std::string LedgerClient::lastScanError() const { return lastScanError_; } -void LedgerClient::scanDevices(AsyncCallBack&& cb) +void LedgerClient::scanDevices() { availableDevices_.clear(); hid_device_info* info = hid_enumerate(0, 0); for (; info; info = info->next) { if (checkLedgerDevice(info)) { - auto device = new LedgerDevice{ fromHidOriginal(info), testNet_, walletManager_, logger_, this, hidLock_}; + auto device = std::make_shared(fromHidOriginal(info), testNet_, logger_, cb_, hidLock_); availableDevices_.push_back({ device }); } } if (availableDevices_.empty()) { - logger_->error( - "[LedgerClient] scanDevices - No ledger device available"); + logger_->error("[LedgerClient::scanDevices] no ledger device available"); } else { - logger_->info( - "[LedgerClient] scanDevices - Enumerate request succeeded. Total device available : " - + QString::number(availableDevices_.size()).toUtf8() + "."); + logger_->info("[LedgerClient::scanDevices] found {} device[s]", availableDevices_.size()); } - hid_exit(); // Init first one - if (availableDevices_.empty()) { - if (cb) { - cb(); - } - } - else { - auto cbSaveScanError = [caller = QPointer(this), cbCopy = std::move(cb)]() { - caller->lastScanError_ = caller->availableDevices_[0]->lastError(); - - if (cbCopy) { - cbCopy(); - } - }; - - availableDevices_[0]->init(std::move(cbSaveScanError)); - } + /*if (!availableDevices_.empty()) { + availableDevices_.at(0)->init(); + }*/ + cb_->scanningDone(); } diff --git a/BlockSettleHW/ledger/ledgerClient.h b/BlockSettleHW/ledger/ledgerClient.h index 3b14238f2..8fdcc61cd 100644 --- a/BlockSettleHW/ledger/ledgerClient.h +++ b/BlockSettleHW/ledger/ledgerClient.h @@ -11,14 +11,11 @@ #ifndef LEDGERCLIENT_H #define LEDGERCLIENT_H -#include "ledgerStructure.h" - #include #include +#include +#include "hwdeviceinterface.h" -#include - -class LedgerDevice; namespace spdlog { class logger; } @@ -28,30 +25,35 @@ namespace bs { } } -class LedgerClient : public QObject -{ - Q_OBJECT -public: - LedgerClient(std::shared_ptr logger, std::shared_ptr walletManager, bool testNet, QObject *parent = nullptr); - ~LedgerClient() override = default; +namespace bs { + namespace hww { + struct DeviceCallbacks; + class DeviceInterface; - void scanDevices(AsyncCallBack&& cb); + class LedgerClient + { + public: + LedgerClient(const std::shared_ptr&, bool testNet, DeviceCallbacks*); + ~LedgerClient() = default; - QVector deviceKeys() const; + void scanDevices(); - QPointer getDevice(const QString& deviceId); + std::vector deviceKeys() const; - QString lastScanError() const; + std::shared_ptr getDevice(const std::string& deviceId); -private: - QVector> availableDevices_; - bool testNet_; - QString lastScanError_; + std::string lastScanError() const; - std::shared_ptr logger_; - std::shared_ptr walletManager_; - std::shared_ptr hidLock_; + private: + std::shared_ptr logger_; + const bool testNet_; + DeviceCallbacks* cb_{ nullptr }; + std::vector> availableDevices_; + std::string lastScanError_; + std::shared_ptr hidLock_; + }; -}; + } //hw +} //bs #endif // LEDGERCLIENT_H diff --git a/BlockSettleHW/ledger/ledgerDevice.cpp b/BlockSettleHW/ledger/ledgerDevice.cpp index aa5214db3..8b1b957f2 100644 --- a/BlockSettleHW/ledger/ledgerDevice.cpp +++ b/BlockSettleHW/ledger/ledgerDevice.cpp @@ -12,14 +12,14 @@ #include "ledger/ledgerDevice.h" #include "ledger/ledgerClient.h" #include "Assets.h" -#include "Wallets/ProtobufHeadlessUtils.h" #include "CoreWallet.h" +#include "hwdevicemanager.h" +#include "Wallets/ProtobufHeadlessUtils.h" #include "Wallets/SyncWalletsManager.h" #include "Wallets/SyncHDWallet.h" #include "ScopeGuard.h" #include "QByteArray" -#include "QDataStream" namespace { const uint16_t kHidapiBrokenSequence = 191; @@ -133,46 +133,26 @@ namespace { } } -LedgerDevice::LedgerDevice(HidDeviceInfo&& hidDeviceInfo, bool testNet, - std::shared_ptr walletManager - , const std::shared_ptr &logger, QObject* parent - , const std::shared_ptr& hidLock) - : HwDeviceInterface{parent} - , hidDeviceInfo_{std::move(hidDeviceInfo)} - , logger_{logger} - , testNet_{testNet} - , walletManager_{walletManager} - , hidLock_{hidLock} -{ -} +using namespace bs::hww; -LedgerDevice::~LedgerDevice() -{ - cancelCommandThread(); -} +LedgerDevice::LedgerDevice(const HidDeviceInfo& hidDeviceInfo, bool testNet + , const std::shared_ptr &logger, DeviceCallbacks* cb + , const std::shared_ptr& hidLock) + : WorkerPool(1, 1), hidDeviceInfo_{hidDeviceInfo} + , logger_{logger}, cb_(cb), testNet_{testNet}, hidLock_{hidLock} +{} DeviceKey LedgerDevice::key() const { - QString walletId; + std::string walletId; if (!xpubRoot_.empty()) { - auto expectedWalletId = bs::core::wallet::computeID( - BinaryData::fromString(xpubRoot_)).toBinStr(); - - auto importedWallets = walletManager_->getHwWallets( - bs::wallet::HardwareEncKey::WalletType::Ledger, {}); - - for (const auto imported : importedWallets) { - if (expectedWalletId == imported) { - walletId = QString::fromStdString(expectedWalletId); - break; - } - } + walletId = bs::core::wallet::computeID(xpubRoot_).toBinStr(); } return { - hidDeviceInfo_.productString_, - hidDeviceInfo_.manufacturerString_, - hidDeviceInfo_.manufacturerString_, + hidDeviceInfo_.product, + hidDeviceInfo_.manufacturer, + hidDeviceInfo_.manufacturer, walletId, {}, DeviceType::HWLedger @@ -184,341 +164,117 @@ DeviceType LedgerDevice::type() const return DeviceType::HWLedger; } -void LedgerDevice::init(AsyncCallBack&& cb /*= nullptr*/) -{ - auto saveRootKey = [caller = QPointer(this), cbCopy = std::move(cb)](QVariant result) { - caller->xpubRoot_ = result.value().info_.xpubRoot; - - if (cbCopy) { - cbCopy(); - } - }; - - auto commandThread = blankCommand(std::move(saveRootKey)); - commandThread->prepareGetRootKey(); - connect(commandThread, &LedgerCommandThread::finished, commandThread, &QObject::deleteLater); - commandThread->start(); -} - -void LedgerDevice::cancel() +void LedgerDevice::init() { - cancelCommandThread(); + retrieveXPubRoot(); } -void LedgerDevice::getPublicKey(AsyncCallBackCall&& cb /*= nullptr*/) -{ - auto commandThread = blankCommand(std::move(cb)); - commandThread->prepareGetPublicKey(key()); - connect(commandThread, &LedgerCommandThread::finished, commandThread, &QObject::deleteLater); - commandThread->start(); -} -void LedgerDevice::signTX(const bs::core::wallet::TXSignRequest& coreReq, AsyncCallBackCall&& cb /*= nullptr*/) +bool DeviceIOHandler::writeData(const QByteArray& input, const std::string& logHeader) { - // retrieve inputs paths - std::vector inputPathes; - for (int i = 0; i < coreReq.armorySigner_.getTxInCount(); ++i) { - auto spender = coreReq.armorySigner_.getSpender(i); - const auto& bip32Paths = spender->getBip32Paths(); - if (bip32Paths.size() != 1) { - throw std::logic_error("spender should only have one bip32 path"); - } - auto pathFromRoot = bip32Paths.begin()->second.getDerivationPathFromSeed(); - - bs::hd::Path path; - for (unsigned i=0; i 0) { - const auto purp = bs::hd::purpose(coreReq.change.address.getType()); - if (coreReq.change.index.empty()) { - throw std::logic_error(fmt::format("can't find change address index for '{}'", coreReq.change.address.display())); - } - - changePath = getDerivationPath(testNet_, purp); - changePath.append(bs::hd::Path::fromString(coreReq.change.index)); + logger_->debug("{} - >>> {}", logHeader, input.toHex().toStdString()); + if (sendApdu(dongle_, input) < 0) { + logger_->error("{} - Cannot write to device.", logHeader); + throw std::runtime_error("Cannot write to device"); } - - // create different thread because hidapi is working in blocking mode - auto commandThread = blankCommand(std::move(cb)); - commandThread->prepareSignTx( - key(), coreReq, std::move(inputPathes), std::move(changePath)); - commandThread->start(); -} - -QPointer LedgerDevice::blankCommand(AsyncCallBackCall&& cb /*= nullptr*/) -{ - commandThread_ = new LedgerCommandThread(hidDeviceInfo_, testNet_, logger_, this, hidLock_); - connect(commandThread_, &LedgerCommandThread::resultReady, this, [cbCopy = std::move(cb)](QVariant result) { - if (cbCopy) { - cbCopy(std::move(result)); - } - }); - connect(commandThread_, &LedgerCommandThread::info, this, [caller = QPointer(this)](QString info) { - if (!caller) { - return; - } - - if (info == HWInfoStatus::kTransaction) { - caller->isBlocked_ = true; - } - else if (info == HWInfoStatus::kReceiveSignedTx) { - caller->isBlocked_ = true; - } - caller->deviceTxStatusChanged(info); - }, Qt::BlockingQueuedConnection); - connect(commandThread_, &LedgerCommandThread::error, this, [caller = QPointer(this)](qint32 errorCode) { - if (!caller) { - return; - } - - QString error; - switch (errorCode) - { - case Ledger::SW_NO_ENVIRONMENT: - caller->requestForRescan(); - error = HWInfoStatus::kErrorNoEnvironment; - break; - case Ledger::SW_CANCELED_BY_USER: - caller->cancelledOnDevice(); - error = HWInfoStatus::kCancelledByUser; - break; - case Ledger::NO_DEVICE: - caller->requestForRescan(); - error = HWInfoStatus::kErrorNoDevice; - break; - case Ledger::SW_RECONNECT_DEVICE: - caller->requestForRescan(); - error = HWInfoStatus::kErrorReconnectDevice; - break; - case Ledger::NO_INPUTDATA: - default: - error = HWInfoStatus::kErrorInternalError; - break; - } - - caller->lastError_ = error; - caller->operationFailed(error); - }, Qt::BlockingQueuedConnection); - connect(commandThread_, &LedgerCommandThread::finished, commandThread_, &QObject::deleteLater); - - return commandThread_; + return true; } -void LedgerDevice::cancelCommandThread() +bool DeviceIOHandler::readData(QByteArray& output, const std::string& logHeader) { - if (commandThread_ && commandThread_->isRunning()) { - commandThread_->disconnect(); - commandThread_->quit(); + const auto res = receiveApduResult(dongle_, output); + if (res != Ledger::SW_OK) { + logger_->error("{} - Cannot read from device. APDU error code : {}", + logHeader, QByteArray::number(res, 16).toStdString()); + throw std::runtime_error("Can't read from device: " + std::to_string(res)); } + logger_->debug("{} - <<< {}", logHeader, BinaryData::fromString(output.toStdString()).toHexStr() + "9000"); + return true; } -LedgerCommandThread::LedgerCommandThread(const HidDeviceInfo &hidDeviceInfo, bool testNet - , const std::shared_ptr &logger, QObject *parent - , const std::shared_ptr& hidLock) - : QThread{parent} - , hidDeviceInfo_{hidDeviceInfo} - , testNet_{testNet} - , logger_{logger} - , hidLock_{hidLock} -{ -} - -LedgerCommandThread::~LedgerCommandThread() -{ - releaseDevice(); -} - -void LedgerCommandThread::run() +bool DeviceIOHandler::initDevice() { - const std::lock_guard lock(*hidLock_); - - if (!initDevice()) { - logger_->info( - "[LedgerCommandThread] processTXLegacy - Cannot open device."); - emit error(Ledger::NO_DEVICE); - return; + if (hid_init() < 0 || hidDeviceInfo_.serialNumber.empty()) { + logger_->info("[DeviceIOHandler::initDevice] cannot init hid"); + return false; } - try { - switch (threadPurpose_) - { - case HardwareCommand::GetPublicKey: - processGetPublicKey(); - break; - case HardwareCommand::SignTX: - if (!coreReq_) { - logger_->error("[LedgerCommandThread] run - the core request is no valid"); - emit error(Ledger::NO_INPUTDATA); + { // make sure that user does not switch off device in the middle of operation + auto* info = hid_enumerate(hidDeviceInfo_.vendorId, hidDeviceInfo_.productId); + if (!info) { + return false; + } + + bool bFound = false; + for (; info; info = info->next) { + if (checkLedgerDevice(info)) { + bFound = true; break; } - if (isNonSegwit(inputPaths_[0])) { - processTXLegacy(); - } - else { - processTXSegwit(); - } - break; - case HardwareCommand::GetRootPublicKey: - processGetRootKey(); - break; - case HardwareCommand::None: - default: - // Please add handler for a new command - assert(false); - break; } - } - catch (std::exception& exc) { - releaseDevice(); - logger_->error("[LedgerCommandThread] run - Done command with exception"); - emit error(lastError_); - if (threadPurpose_ == HardwareCommand::GetRootPublicKey) { - emit resultReady({}); - } - return; - } - if (lastError_ != Ledger::SW_OK) { - emit error(lastError_); + if (!bFound) { + return false; + } } - releaseDevice(); -} - -void LedgerCommandThread::prepareGetPublicKey(const DeviceKey &deviceKey) -{ - threadPurpose_ = HardwareCommand::GetPublicKey; - deviceKey_ = deviceKey; -} + std::unique_ptr serNumb(new wchar_t[hidDeviceInfo_.serialNumber.length() + 1]); + QString::fromStdString(hidDeviceInfo_.serialNumber).toWCharArray(serNumb.get()); + serNumb.get()[hidDeviceInfo_.serialNumber.length()] = 0x00; + dongle_ = nullptr; + dongle_ = hid_open(hidDeviceInfo_.vendorId, static_cast(hidDeviceInfo_.productId), serNumb.get()); -void LedgerCommandThread::prepareSignTx(const DeviceKey &deviceKey, - bs::core::wallet::TXSignRequest coreReq, - std::vector&& paths, bs::hd::Path&& changePath) -{ - threadPurpose_ = HardwareCommand::SignTX; - deviceKey_ = deviceKey; - coreReq_ = std::make_unique(std::move(coreReq)); - inputPaths_ = std::move(paths); - changePath_ = std::move(changePath); + return dongle_ != nullptr; } -void LedgerCommandThread::prepareGetRootKey() +void DeviceIOHandler::releaseDevice() { - threadPurpose_ = HardwareCommand::GetRootPublicKey; + if (dongle_) { + hid_close(dongle_); + hid_exit(); + dongle_ = nullptr; + } } -void LedgerCommandThread::processGetPublicKey() +bool DeviceIOHandler::exchangeData(const QByteArray& input, QByteArray& output + , std::string&& logHeader) { - auto deviceKey = deviceKey_; - HwWalletWrapper walletInfo; - walletInfo.info_.type = bs::wallet::HardwareEncKey::WalletType::Ledger; - walletInfo.info_.vendor = deviceKey.vendor_.toStdString(); - walletInfo.info_.label = deviceKey.deviceLabel_.toStdString(); - walletInfo.info_.deviceId = {}; - - logger_->debug("[LedgerCommandThread] processGetPublicKey - Start retrieve root xpub key."); - - auto pubKey = retrievePublicKeyFromPath({ { bs::hd::hardFlag } }); - try { - walletInfo.info_.xpubRoot = pubKey.getBase58().toBinStr(); - } - catch (...) { - logger_->error("[LedgerCommandThread] getPublicKey - Cannot retrieve root xpub key."); - emit error(Ledger::INTERNAL_ERROR); - return; - } - - logger_->debug("[LedgerCommandThread] processGetPublicKey - Start retrieve nested segwit xpub key."); - pubKey = retrievePublicKeyFromPath(getDerivationPath(testNet_, bs::hd::Nested)); - try { - walletInfo.info_.xpubNestedSegwit = pubKey.getBase58().toBinStr(); - } - catch (...) { - logger_->error( - "[LedgerCommandThread] getPublicKey - Cannot retrieve nested segwit xpub key."); - emit error(Ledger::INTERNAL_ERROR); - return; - } - - logger_->debug("[LedgerCommandThread] processGetPublicKey - Start retrieve native segwit xpub key."); - pubKey = retrievePublicKeyFromPath(getDerivationPath(testNet_, bs::hd::Native)); - - try { - walletInfo.info_.xpubNativeSegwit = pubKey.getBase58().toBinStr(); - } - catch (...) { - logger_->error( - "[LedgerCommandThread] getPublicKey - Cannot retrieve native segwit xpub key."); - emit error(Ledger::INTERNAL_ERROR); - return; - } - - logger_->debug("[LedgerCommandThread] processGetPublicKey - Start retrieve legacy xpub key."); - pubKey = retrievePublicKeyFromPath(getDerivationPath(testNet_, bs::hd::NonSegWit)); - try { - walletInfo.info_.xpubLegacy = pubKey.getBase58().toBinStr(); - } - catch (...) { - logger_->error( - "[LedgerCommandThread] getPublicKey - Cannot retrieve legacy xpub key."); - emit error(Ledger::INTERNAL_ERROR); - return; - } - - if (!walletInfo.isValid()) { - logger_->error( - "[LedgerCommandThread] getPublicKey - Wallet info is not correct."); - emit error(Ledger::INTERNAL_ERROR); - return; - } - else { - logger_->debug("[LedgerCommandThread] getPublicKey - Operation succeeded."); + if (!writeData(input, logHeader)) { + return false; } - emit resultReady(QVariant::fromValue<>(walletInfo)); -} - -void LedgerCommandThread::processGetRootKey() -{ - HwWalletWrapper walletInfo; - walletInfo.info_.type = bs::wallet::HardwareEncKey::WalletType::Ledger; - auto pubKey = retrievePublicKeyFromPath({ { bs::hd::hardFlag } }); try { - walletInfo.info_.xpubRoot = pubKey.getBase58().toBinStr(); - } - catch (...) { - logger_->error( - "[LedgerCommandThread] getPublicKey - Cannot retrieve root xpub key."); - emit error(Ledger::INTERNAL_ERROR); - return; + return readData(output, logHeader); } - logger_->debug("[LedgerCommandThread] processGetPublicKey - Done retrieve root xpub key."); - + catch (std::exception& e) { + // Special case : sometimes hidapi return incorrect sequence_index as response + // and there is really now good solution for it, except restart dongle session + // till the moment error gone. + // https://github.com/obsidiansystems/ledger-app-tezos/blob/191-troubleshooting/README.md#error-unexpected-sequence-number-expected-0-got-191-on-macos + // (solution in link above is not working, given here for reference) + // Also it's a general issue for OSX really, but let's left it for all system, just in case + // And let's have 10 times threshold to avoid trying infinitively + static int maxAttempts = 10; + if (e.what() == kHidapiSequence191 && maxAttempts > 0) { + --maxAttempts; + ScopedGuard guard([] { + ++maxAttempts; + }); - emit resultReady(QVariant::fromValue<>(walletInfo)); -} + releaseDevice(); + initDevice(); + output.clear(); -BIP32_Node LedgerCommandThread::retrievePublicKeyFromPath(bs::hd::Path&& derivationPath) -{ - // Parent - std::unique_ptr parent = nullptr; - if (derivationPath.length() > 1) { - auto parentPath = derivationPath; - parentPath.pop(); - parent.reset(new BIP32_Node(getPublicKeyApdu(std::move(parentPath)))); + return exchangeData(input, output, std::move(logHeader)); + } + else { + throw e; + } } - - return getPublicKeyApdu(std::move(derivationPath), parent); } -BIP32_Node LedgerCommandThread::getPublicKeyApdu(bs::hd::Path&& derivationPath, const std::unique_ptr& parent) +BIP32_Node GetPubKeyHandler::getPublicKeyApdu(const bs::hd::Path& derivationPath + , const std::unique_ptr& parent) { QByteArray payload; payload.append(derivationPath.length()); @@ -531,16 +287,16 @@ BIP32_Node LedgerCommandThread::getPublicKeyApdu(bs::hd::Path&& derivationPath, command.append(payload); QByteArray response; - if (!exchangeData(command, response, "[LedgerCommandThread] getPublicKeyApdu - ")) { + if (!exchangeData(command, response, "[GetPubKeyHandler::getPublicKeyApdu] ")) { return {}; } LedgerPublicKey pubKey; bool result = pubKey.parseFromResponse(response); - auto data = SecureBinaryData::fromString(pubKey.pubKey_.toStdString()); + auto data = SecureBinaryData::fromString(pubKey.pubKey.toStdString()); Armory::Assets::Asset_PublicKey pubKeyAsset(data); - SecureBinaryData chainCode = SecureBinaryData::fromString(pubKey.chainCode_.toStdString()); + SecureBinaryData chainCode = SecureBinaryData::fromString(pubKey.chainCode.toStdString()); uint32_t fingerprint = 0; if (parent) { @@ -558,116 +314,266 @@ BIP32_Node LedgerCommandThread::getPublicKeyApdu(bs::hd::Path&& derivationPath, return pubNode; } -QByteArray LedgerCommandThread::getTrustedInput(const BinaryData& hash, unsigned txOutId) +std::shared_ptr GetPubKeyHandler::processData(const std::shared_ptr& in) { - logger_->debug("[LedgerCommandThread] getTrustedInput - Start retrieve trusted input for legacy address."); + if (!in) { + return nullptr; + } + auto result = std::make_shared(); + const std::lock_guard lock(*hidLock_); + if (!initDevice()) { + logger_->info("[GetPubKeyHandler::processData] cannot init device"); + //emit error(Ledger::NO_DEVICE); + return result; + } + for (const auto& path : in->paths) { + result->pubKeys.push_back(retrievePublicKeyFromPath(path)); + } + releaseDevice(); + return result; +} - //find the supporting tx - auto tx = coreReq_->armorySigner_.getSupportingTx(hash); - QVector inputCommands; +BIP32_Node GetPubKeyHandler::retrievePublicKeyFromPath(const bs::hd::Path& derivationPath) +{ + std::unique_ptr parent; + if (derivationPath.length() > 1) { + auto parentPath = derivationPath; + parentPath.pop(); + parent = std::make_unique(getPublicKeyApdu(parentPath, {})); + } + return getPublicKeyApdu(derivationPath, parent); +} +void LedgerDevice::getPublicKey() +{ + auto deviceKey = key(); + auto walletInfo = std::make_shared(); + walletInfo->type = bs::wallet::HardwareEncKey::WalletType::Ledger; + walletInfo->vendor = deviceKey.vendor; + walletInfo->label = deviceKey.label; + walletInfo->deviceId = {}; + + logger_->debug("[LedgerDevice::getPublicKey] start retrieve root xpub key"); + + auto inData = std::make_shared(); + inData->paths.push_back({ { bs::hd::hardFlag } }); + inData->paths.push_back(getDerivationPath(testNet_, bs::hd::Nested)); + inData->paths.push_back(getDerivationPath(testNet_, bs::hd::Native)); + inData->paths.push_back(getDerivationPath(testNet_, bs::hd::NonSegWit)); + + const auto& cb = [this, walletInfo](const std::shared_ptr& data) { - //trusted input request header - QByteArray txPayload; - writeUintBE(txPayload, txOutId); //outpoint index + const auto& result = std::static_pointer_cast(data); - writeUintLE(txPayload, tx.getVersion()); //supporting tx version - writeVarInt(txPayload, tx.getNumTxIn()); //supporting tx input count - auto command = getApduCommand( - Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x00, 0x00, std::move(txPayload)); - inputCommands.push_back(std::move(command)); - } + if (result->pubKeys.size() != 4) { + logger_->error("[LedgerDevice::getPublicKey] invalid amount of public " + "keys: {}", result->pubKeys.size()); + operationFailed("invalid amount of public keys: " + std::to_string(result->pubKeys.size())); + return; + } + auto pubKey = result->pubKeys.at(0); + try { + walletInfo->xpubRoot = pubKey.getBase58().toBinStr(); + } + catch (const std::exception& e) { + logger_->error("[LedgerDevice::getPublicKey] cannot retrieve root xpub key: {}", e.what()); + //error(Ledger::INTERNAL_ERROR); + operationFailed("internal error"); + return; + } - //supporting tx inputs - for (unsigned i=0; ipubKeys.at(1); + try { + walletInfo->xpubNestedSegwit = pubKey.getBase58().toBinStr(); + } + catch (const std::exception& e) { + logger_->error("[LedgerDevice::getPublicKey] cannot retrieve nested segwit xpub key: {}", e.what()); + //emit error(Ledger::INTERNAL_ERROR); + return; + } - //36 bytes of outpoint - QByteArray txInPayload; - txInPayload.push_back(QByteArray::fromRawData( - outpointRaw.getCharPtr(), outpointRaw.getSize())); + pubKey = result->pubKeys.at(2); + try { + walletInfo->xpubNativeSegwit = pubKey.getBase58().toBinStr(); + } + catch (const std::exception& e) { + logger_->error("[LedgerDevice::getPublicKey] cannot retrieve native segwit xpub key: {}", e.what()); + //emit error(Ledger::INTERNAL_ERROR); + return; + } - //txin scriptSig size as varint - writeVarInt(txInPayload, scriptSig.getSize()); + pubKey = result->pubKeys.at(3); + try { + walletInfo->xpubLegacy = pubKey.getBase58().toBinStr(); + } + catch (const std::exception& e) { + logger_->error("[LedgerDevice::getPublicKey] cannot retrieve legacy xpub key: {}", e.what()); + //emit error(Ledger::INTERNAL_ERROR); + return; + } - auto commandInput = getApduCommand( - Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x80, 0x00, std::move(txInPayload)); - inputCommands.push_back(std::move(commandInput)); + const auto& isValid = [](const bs::core::wallet::HwWalletInfo& info) + { + return !info.xpubRoot.empty() && !info.xpubNestedSegwit.empty() && + !info.xpubNativeSegwit.empty() && !info.xpubLegacy.empty(); + }; + if (!isValid(*walletInfo)) { + logger_->error("[LedgerDevice::getPublicKey] wallet info is invalid"); + //emit error(Ledger::INTERNAL_ERROR); + return; + } + else { + logger_->debug("[LedgerDevice::getPublicKey] operation succeeded"); + } + //TODO: invoke callback with walletInfo + }; + processQueued(inData, cb); +} - //txin scriptSig, assuming it's less than 251 bytes for the sake of simplicity - QByteArray txInScriptSig; - txInScriptSig.push_back(QByteArray::fromRawData( - scriptSig.toCharPtr(), scriptSig.getSize())); - writeUintLE(txInScriptSig, txIn.getSequence()); //sequence +void LedgerDevice::signTX(const bs::core::wallet::TXSignRequest& coreReq) +{ + // retrieve inputs paths + std::vector inputPaths; + for (int i = 0; i < coreReq.armorySigner_.getTxInCount(); ++i) { + auto spender = coreReq.armorySigner_.getSpender(i); + const auto& bip32Paths = spender->getBip32Paths(); + if (bip32Paths.size() != 1) { + throw std::logic_error("spender should only have one bip32 path"); + } + auto pathFromRoot = bip32Paths.begin()->second.getDerivationPathFromSeed(); - auto commandScriptSig = getApduCommand( - Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x80, 0x00, std::move(txInScriptSig)); - inputCommands.push_back(std::move(commandScriptSig)); + bs::hd::Path path; + for (unsigned i=0; i 0) { + const auto purp = bs::hd::purpose(coreReq.change.address.getType()); + if (coreReq.change.index.empty()) { + throw std::logic_error(fmt::format("can't find change address index for '{}'", coreReq.change.address.display())); + } + + changePath = getDerivationPath(testNet_, purp); + changePath.append(bs::hd::Path::fromString(coreReq.change.index)); } - //supporting tx outputs - for (unsigned i=0; i(); + inPubData->paths = inputPaths; - QByteArray txOutput; - writeUintLE(txOutput, txout.getValue()); //txout value - writeVarInt(txOutput, script.getSize()); //txout script len + const auto& cb = [this](const std::shared_ptr& data) + { + const auto& reply = std::static_pointer_cast(data); + if (!reply) { + logger_->error("[LedgerDevice::signTX] invalid callback data"); + operationFailed("invalid data"); + return; + } + cb_->txSigned(reply->serInputSigs); + }; + auto inData = std::make_shared(); + inData->key = key(); + inData->txReq = coreReq; + inData->inputPaths = std::move(inputPaths); + inData->changePath = std::move(changePath); - auto commandTxOut = getApduCommand( - Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x80, 0x00, std::move(txOutput)); - inputCommands.push_back(std::move(commandTxOut)); + const auto& cbPub = [this, inData, cb](const std::shared_ptr& data) + { + const auto& pubResult = std::static_pointer_cast(data); + inData->inputNodes = std::move(pubResult->pubKeys); + processQueued(inData, cb); + }; + processQueued(inPubData, cbPub); +} - //again, assuming the txout script is shorter than 255 bytes - QByteArray txOutScript; - txOutScript.push_back(QByteArray::fromRawData( - script.toCharPtr(), script.getSize())); +void bs::hww::LedgerDevice::retrieveXPubRoot() +{ + auto deviceKey = key(); + auto walletInfo = std::make_shared(); + walletInfo->type = bs::wallet::HardwareEncKey::WalletType::Ledger; + walletInfo->vendor = deviceKey.vendor; + walletInfo->label = deviceKey.label; + walletInfo->deviceId = {}; - auto commandScript= getApduCommand( - Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x80, 0x00, std::move(txOutScript)); - inputCommands.push_back(std::move(commandScript)); - } + auto inData = std::make_shared(); + inData->paths.push_back({ { bs::hd::hardFlag } }); - for (auto &inputCommand : inputCommands) { - QByteArray responseInput; - if (!exchangeData(inputCommand, responseInput, "[LedgerCommandThread] signTX - getting trusted input")) { - releaseDevice(); - throw std::runtime_error("failed to get trusted input"); - } - } + const auto& cb = [this, walletInfo](const std::shared_ptr& data) + { + const auto& result = std::static_pointer_cast(data); - //locktime - QByteArray locktime; - writeUintLE(locktime, tx.getLockTime()); - auto command = getApduCommand( - Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x80, 0x00, std::move(locktime)); + if (result->pubKeys.size() != 1) { + logger_->error("[LedgerDevice::retrieveXPubRoot] invalid amount of public " + "keys: {}", result->pubKeys.size()); + handleError(Ledger::NO_INPUTDATA); + return; + } + const auto& pubKey = result->pubKeys.at(0); + if (xpubRoot_.empty()) { + xpubRoot_ = pubKey.getPublicKey(); + } + try { + walletInfo->xpubRoot = pubKey.getBase58().toBinStr(); + } + catch (const std::exception& e) { + logger_->error("[LedgerDevice::retrieveXPubRoot] cannot retrieve root xpub key: {}", e.what()); + handleError(Ledger::INTERNAL_ERROR); + return; + } + //TODO: invoke callback with walletInfo + }; + processQueued(inData, cb); +} - QByteArray trustedInput; - if (!exchangeData(command, trustedInput, "[LedgerCommandThread] signTX - getting trusted input")) { - releaseDevice(); - throw std::runtime_error("failed to get trusted input"); - } +void bs::hww::LedgerDevice::requestForRescan() +{ +} - logger_->debug( - "[LedgerCommandThread] getTrustedInput - Done retrieve trusted input for legacy address."); +std::shared_ptr bs::hww::LedgerDevice::worker(const std::shared_ptr&) +{ + const std::vector> handlers{ + std::make_shared(logger_, hidDeviceInfo_, hidLock_) + , std::make_shared(logger_, hidDeviceInfo_, hidLock_) + }; + return std::make_shared(handlers); +} - return trustedInput; +void LedgerDevice::handleError(int32_t errorCode) +{ + QString error; + switch (errorCode) + { + case Ledger::SW_NO_ENVIRONMENT: + requestForRescan(); + //error = InfoStatus::kErrorNoEnvironment; + break; + case Ledger::SW_CANCELED_BY_USER: + cancelledOnDevice(); + //error = HWInfoStatus::kCancelledByUser; + break; + case Ledger::NO_DEVICE: + requestForRescan(); + error = HWInfoStatus::kErrorNoDevice; + break; + case Ledger::SW_RECONNECT_DEVICE: + requestForRescan(); + error = HWInfoStatus::kErrorReconnectDevice; + break; + case Ledger::NO_INPUTDATA: + default: + error = HWInfoStatus::kErrorInternalError; + break; + } +// lastError_ = error; +// operationFailed(error); } -// DO NOT DELETE JUST FOR HISTORICAL REFFERENCE -QByteArray LedgerCommandThread::getTrustedInputSegWit_outdated(const UTXO& utxo) +#if 0 // DO NOT DELETE JUST FOR HISTORICAL REFFERENCE +QByteArray getTrustedInputSegWit(const UTXO& utxo) { QByteArray trustedInput; trustedInput.push_back(QByteArray::fromStdString(utxo.getTxHash().toBinStr())); @@ -676,15 +582,15 @@ QByteArray LedgerCommandThread::getTrustedInputSegWit_outdated(const UTXO& utxo) return trustedInput; } +#endif //0 -void LedgerCommandThread::startUntrustedTransaction( - const std::vector& trustedInputs, +void SignTXHandler::startUntrustedTransaction(const std::vector& trustedInputs, const std::vector& redeemScripts, unsigned txOutIndex, bool isNew, bool isSW, bool isRbf) { { //setup untrusted transaction - logger_->debug("[LedgerCommandThread] startUntrustedTransaction - Start Init section"); + logger_->debug("[SignTXHandler::startUntrustedTransaction] start Init section"); QByteArray initPayload; writeUintLE(initPayload, Ledger::DEFAULT_VERSION); writeVarInt(initPayload, trustedInputs.size()); @@ -693,20 +599,20 @@ void LedgerCommandThread::startUntrustedTransaction( if (isSW) { p2 = isNew ? 0x02 : 0x80; } - auto initCommand = getApduCommand( - Ledger::CLA, Ledger::INS_HASH_INPUT_START, 0x00, p2, std::move(initPayload)); + auto initCommand = getApduCommand(Ledger::CLA, Ledger::INS_HASH_INPUT_START + , 0x00, p2, std::move(initPayload)); QByteArray responseInit; - if (!exchangeData(initCommand, responseInit, "[LedgerCommandThread] startUntrustedTransaction - InitPayload")) { + if (!exchangeData(initCommand, responseInit, "[SignTXHandler::startUntrustedTransaction] InitPayload")) { releaseDevice(); throw std::runtime_error("failed to init untrusted tx"); } - logger_->debug("[LedgerCommandThread] startUntrustedTransaction - Done Init section"); + logger_->debug("[SignTXHandler::startUntrustedTransaction] done Init section"); } //pass each input - logger_->debug("[LedgerCommandThread] startUntrustedTransaction - Start Input section"); - QVector inputCommands; + logger_->debug("[SignTXHandler::startUntrustedTransaction] start Input section"); + std::vector inputCommands; for (unsigned i=0; idebug("[LedgerCommandThread] startUntrustedTransaction - Done Input section"); + logger_->debug("[SignTXHandler::startUntrustedTransaction] done Input section"); } -void LedgerCommandThread::finalizeInputFull() +void SignTXHandler::finalizeInputFull(const std::shared_ptr& inData) { - const bool hasChangeOutput = (changePath_.length() != 0); - if (hasChangeOutput) { - logger_->debug("[LedgerCommandThread] finalizeInputFull - Start Change section"); + if (inData->changePath.length() != 0) { + logger_->debug("[SignTXHandler::finalizeInputFull] start Change section"); // If tx has change, we send derivation path of return address in prio // before send all output addresses and change with it, so device could detect it QByteArray changeOutputPayload; - changeOutputPayload.append(static_cast(changePath_.length())); + changeOutputPayload.append(static_cast(inData->changePath.length())); - for (auto el : changePath_) { + for (const auto& el : inData->changePath) { writeUintBE(changeOutputPayload, el); } - auto changeCommand = getApduCommand(Ledger::CLA, Ledger::INS_HASH_INPUT_FINALIZE_FULL, 0xFF, 0x00, std::move(changeOutputPayload)); + auto changeCommand = getApduCommand(Ledger::CLA, Ledger::INS_HASH_INPUT_FINALIZE_FULL + , 0xFF, 0x00, std::move(changeOutputPayload)); QByteArray responseInput; - if (!exchangeData(changeCommand, responseInput, "[LedgerCommandThread] finalizeInputFull - changePayload ")) { + if (!exchangeData(changeCommand, responseInput, "[SignTXHandler::finalizeInputFull] changePayload ")) { releaseDevice(); return; } - logger_->debug("[LedgerCommandThread] finalizeInputFull - Done Change section"); + logger_->debug("[SignTXHandler::finalizeInputFull] done Change section"); } - logger_->debug("[LedgerCommandThread] finalizeInputFull - Start output section"); - size_t totalOutput = coreReq_->armorySigner_.getTxOutCount(); + logger_->debug("[SignTXHandler::finalizeInputFull] start output section"); + size_t totalOutput = inData->txReq.armorySigner_.getTxOutCount(); QByteArray outputFullPayload; writeVarInt(outputFullPayload, totalOutput); - for (unsigned i=0; iarmorySigner_.getTxOutCount(); i++) { - auto recipient = coreReq_->armorySigner_.getRecipient(i); + for (unsigned i=0; i < inData->txReq.armorySigner_.getTxOutCount(); i++) { + auto recipient = inData->txReq.armorySigner_.getRecipient(i); outputFullPayload.push_back(QByteArray::fromStdString(recipient->getSerializedScript().toBinStr())); } @@ -792,65 +698,67 @@ void LedgerCommandThread::finalizeInputFull() outputCommands.push_back(std::move(outputCommand)); } - emit info(HWInfoStatus::kPressButton); + //emit info(HWInfoStatus::kPressButton); for (auto &outputCommand : outputCommands) { QByteArray responseOutput; - if (!exchangeData(outputCommand, responseOutput, "[LedgerCommandThread] finalizeInputFull - outputPayload ")) { + if (!exchangeData(outputCommand, responseOutput, "[SignTXHandler::finalizeInputFull] outputPayload")) { releaseDevice(); throw std::runtime_error("failed to upload recipients"); } } - - logger_->debug("[LedgerCommandThread] finalizeInputFull - Done output section"); + logger_->debug("[SignTXHandler::finalizeInputFull] done output section"); } -void LedgerCommandThread::processTXLegacy() +void SignTXHandler::processTXLegacy(const std::shared_ptr& inData + , const std::shared_ptr& outData) { //upload supporting tx to ledger, get trusted input back for our outpoints - emit info(HWInfoStatus::kTransaction); + //emit info(HWInfoStatus::kTransaction); std::vector trustedInputs; - for (unsigned i=0; iarmorySigner_.getTxInCount(); i++) { - auto spender = coreReq_->armorySigner_.getSpender(i); - auto trustedInput = getTrustedInput(spender->getOutputHash(), spender->getOutputIndex()); + for (unsigned i=0; i < inData->txReq.armorySigner_.getTxInCount(); i++) { + auto spender = inData->txReq.armorySigner_.getSpender(i); + auto trustedInput = getTrustedInput(inData, spender->getOutputHash() + , spender->getOutputIndex()); trustedInputs.push_back(trustedInput); } // -- collect all redeem scripts std::vector redeemScripts; - for (int i = 0; i < coreReq_->armorySigner_.getTxInCount(); ++i) { - auto& utxo = coreReq_->armorySigner_.getSpender(i)->getUtxo(); + for (int i = 0; i < inData->txReq.armorySigner_.getTxInCount(); ++i) { + auto& utxo = inData->txReq.armorySigner_.getSpender(i)->getUtxo(); auto redeemScript = utxo.getScript(); - auto redeemScriptQ = QByteArray( - redeemScript.getCharPtr(), redeemScript.getSize()); + auto redeemScriptQ = QByteArray(redeemScript.getCharPtr(), redeemScript.getSize()); redeemScripts.push_back(redeemScriptQ); } // -- Start input upload section -- //upload the redeem script for each outpoint - QVector responseSigned; - for (int i = 0; i < coreReq_->armorySigner_.getTxInCount(); ++i) { + if (inData->inputPaths.size() != inData->txReq.armorySigner_.getTxInCount()) { + //TODO: report error + return; + } + std::map responseSigned; + for (int i = 0; i < inData->txReq.armorySigner_.getTxInCount(); ++i) { //pass true as this is a newly presented redeem script - startUntrustedTransaction( - trustedInputs, redeemScripts, i, i == 0, false, coreReq_->RBF); - + startUntrustedTransaction(trustedInputs, redeemScripts, i, i == 0, false + , inData->txReq.RBF); // -- Done input section -- // -- Start output section -- - //upload our recipients as serialized outputs - finalizeInputFull(); + finalizeInputFull(inData); // -- Done output section -- // At this point user verified all outputs and we can start signing inputs - emit info(HWInfoStatus::kReceiveSignedTx); + //emit info(HWInfoStatus::kReceiveSignedTx); // -- Start signing one by one all addresses -- logger_->debug("[LedgerCommandThread] processTXLegacy - Start signing section"); - auto &path = inputPaths_[i]; + auto &path = inData->inputPaths.at(i); QByteArray signPayload; signPayload.append(static_cast(path.length())); @@ -872,7 +780,7 @@ void LedgerCommandThread::processTXLegacy() return; } responseInputSign[0] = 0x30; // force first but to be 0x30 for a newer version of ledger - responseSigned.push_back(responseInputSign); + responseSigned[i] = responseInputSign; } logger_->debug("[LedgerCommandThread] processTXLegacy - Done signing section"); @@ -881,78 +789,71 @@ void LedgerCommandThread::processTXLegacy() // Done with device in this point // Composing and send data back - std::vector inputNodes; - for (auto const &path : inputPaths_) { - auto pubKeyNode = retrievePublicKeyFromPath(std::move(bs::hd::Path(path))); - inputNodes.push_back(pubKeyNode); - } - - emit info(HWInfoStatus::kTransactionFinished); + //emit info(HWInfoStatus::kTransactionFinished); // Debug check - debugPrintLegacyResult(responseSigned[0], inputNodes[0]); + debugPrintLegacyResult(inData, responseSigned.at(0), inData->inputNodes[0]); - sendTxSigningResult(responseSigned, inputNodes); + sendTxSigningResult(outData, responseSigned); } -void LedgerCommandThread::processTXSegwit() +void SignTXHandler::processTXSegwit(const std::shared_ptr& inData + , const std::shared_ptr& outData) { - emit info(HWInfoStatus::kTransaction); + //emit info(HWInfoStatus::kTransaction); // ---- Prepare all pib32 nodes for input from device ----- - auto segwitData = getSegwitData(); + auto segwitData = getSegwitData(inData); //upload supporting tx to ledger, get trusted input back for our outpoints std::vector trustedInputs; - for (unsigned i=0; iarmorySigner_.getTxInCount(); i++) { - auto spender = coreReq_->armorySigner_.getSpender(i); - auto trustedInput = getTrustedInput(spender->getOutputHash(), spender->getOutputIndex()); + for (unsigned i=0; i < inData->txReq.armorySigner_.getTxInCount(); i++) { + auto spender = inData->txReq.armorySigner_.getSpender(i); + auto trustedInput = getTrustedInput(inData, spender->getOutputHash() + , spender->getOutputIndex()); trustedInputs.push_back(trustedInput); } // -- Collect all redeem scripts std::vector redeemScripts; - for (int i = 0; i < coreReq_->armorySigner_.getTxInCount(); ++i) { - auto path = inputPaths_[i]; + for (int i = 0; i < inData->txReq.armorySigner_.getTxInCount(); ++i) { + const auto& path = inData->inputPaths.at(i); BinaryData redeemScriptWitness; if (isNativeSegwit(path)) { - auto& utxo = coreReq_->armorySigner_.getSpender(i)->getUtxo(); + const auto& utxo = inData->txReq.armorySigner_.getSpender(i)->getUtxo(); auto redeemScript = utxo.getScript(); - redeemScriptWitness = - BtcUtils::getP2WPKHWitnessScript(redeemScript.getSliceRef(2, 20)); + redeemScriptWitness = BtcUtils::getP2WPKHWitnessScript(redeemScript.getSliceRef(2, 20)); } else if (isNestedSegwit(path)) { - redeemScriptWitness = segwitData.redeemScripts_[i]; + redeemScriptWitness = segwitData.redeemScripts.at(i); } redeemScripts.push_back(QByteArray(redeemScriptWitness.toBinStr().c_str())); } // -- Start input upload section -- - { startUntrustedTransaction(trustedInputs, redeemScripts, - std::numeric_limits::max(), true, true, coreReq_->RBF); + std::numeric_limits::max(), true, true, inData->txReq.RBF); } - // -- Done input section -- // -- Start output section -- { //upload our recipients as serialized outputs - finalizeInputFull(); + finalizeInputFull(inData); } // -- Done output section -- // At this point user verified all outputs and we can start signing inputs - emit info(HWInfoStatus::kReceiveSignedTx); + //emit info(HWInfoStatus::kReceiveSignedTx); // -- Start signing one by one all addresses -- + std::map responseSigned; + for (int i = 0; i < inData->txReq.armorySigner_.getTxInCount(); ++i) { + const auto& path = inData->inputPaths.at(i); - QVector responseSigned; - for (int i = 0; i < coreReq_->armorySigner_.getTxInCount(); ++i) { - auto path = inputPaths_[i]; - - startUntrustedTransaction({ trustedInputs[i] }, { redeemScripts[i] }, 0, false, true, coreReq_->RBF); + startUntrustedTransaction({ trustedInputs.at(i) }, { redeemScripts.at(i) } + , 0, false, true, inData->txReq.RBF); QByteArray signPayload; signPayload.append(static_cast(path.length())); @@ -969,37 +870,32 @@ void LedgerCommandThread::processTXSegwit() auto commandSign = getApduCommand(Ledger::CLA, Ledger::INS_HASH_SIGN, 0x00, 0x00, std::move(signPayload)); QByteArray responseInputSign; - if (!exchangeData(commandSign, responseInputSign, "[LedgerCommandThread] signTX - Sign Payload")) { + if (!exchangeData(commandSign, responseInputSign, "[SignTXHandler::processTXSegwit] sign Payload")) { releaseDevice(); return; } responseInputSign[0] = 0x30; // force first but to be 0x30 for a newer version of ledger - responseSigned.push_back(responseInputSign); + responseSigned[i] = responseInputSign; } - emit info(HWInfoStatus::kTransactionFinished); + //emit info(HWInfoStatus::kTransactionFinished); // -- Done signing one by one all addresses -- - - sendTxSigningResult(responseSigned, segwitData.inputNodes_); + sendTxSigningResult(outData, responseSigned); } -SegwitInputData LedgerCommandThread::getSegwitData(void) +SegwitInputData SignTXHandler::getSegwitData(const std::shared_ptr& inData) { - logger_->info( - "[LedgerCommandThread] getSegwitData - Start retrieving segwit data."); - + logger_->info("[SignTXHandler::getSegwitData] start retrieving segwit data"); SegwitInputData data; - for (unsigned i = 0; i < coreReq_->armorySigner_.getTxInCount(); i++) { - const auto& path = inputPaths_[i]; - auto spender = coreReq_->armorySigner_.getSpender(i); - - auto pubKeyNode = retrievePublicKeyFromPath(std::move(bs::hd::Path(path))); - data.inputNodes_.push_back(pubKeyNode); + for (unsigned i = 0; i < inData->txReq.armorySigner_.getTxInCount(); i++) { + const auto& path = inData->inputPaths.at(i); + auto spender = inData->txReq.armorySigner_.getSpender(i); if (!isNestedSegwit(path)) { continue; } + const auto& pubKeyNode = inData->inputNodes.at(i); //recreate the p2wpkh & witness scripts auto compressedKey = CryptoECDSA().CompressPoint(pubKeyNode.getPublicKey()); @@ -1010,7 +906,7 @@ SegwitInputData LedgerCommandThread::getSegwitData(void) BinaryWriter bwSwScript; bwSwScript.put_uint8_t(16); bwSwScript.put_BinaryData(BtcUtils::getP2WPKHOutputScript(pubKeyHash)); - auto& swScript = bwSwScript.getData(); + const auto& swScript = bwSwScript.getData(); /* sanity check: make sure the swScript is the preimage to the utxo's p2sh script */ @@ -1026,40 +922,34 @@ SegwitInputData LedgerCommandThread::getSegwitData(void) throw std::runtime_error("p2sh script mismatch"); } - data.preimages_[i] = std::move(swScript); - data.redeemScripts_[i] = std::move(witnessScript); + data.preimages[i] = swScript; + data.redeemScripts[i] = std::move(witnessScript); } - - logger_->info( - "[LedgerCommandThread] getSegwitData - Done retrieving segwit data."); - + logger_->info("[SignTXHandler::getSegwitData] done retrieving segwit data"); return data; } -void LedgerCommandThread::sendTxSigningResult(const QVector& responseSigned, const std::vector& inputNodes) +void SignTXHandler::sendTxSigningResult(const std::shared_ptr& outData + , const std::map& responseSigned) { - Blocksettle::Communication::headless::InputSigs sigs; - for (std::size_t i = 0; i < responseSigned.size(); ++i) { - auto &signedInput = responseSigned[i]; - - auto *sig = sigs.add_inputsig(); - sig->set_index(static_cast(i)); - sig->set_data(signedInput.toStdString().c_str(), signedInput.size()); + BinaryWriter bw; + bw.put_var_int(responseSigned.size()); + for (const auto& signedInput : responseSigned) { + bw.put_uint32_t(signedInput.first); + bw.put_BinaryData(BinaryData::fromString(signedInput.second.toStdString())); } - - HWSignedTx wrapper; - wrapper.signedTx = sigs.SerializeAsString(); - emit resultReady(QVariant::fromValue(wrapper)); + outData->serInputSigs = bw.getData(); } -void LedgerCommandThread::debugPrintLegacyResult(const QByteArray& responseSigned, const BIP32_Node& node) +void SignTXHandler::debugPrintLegacyResult(const std::shared_ptr& inData + , const QByteArray& responseSigned, const BIP32_Node& node) { BinaryWriter bw; bw.put_uint32_t(1); //version bw.put_var_int(1); //txin count //inputs - auto utxo = coreReq_->armorySigner_.getSpender(0)->getUtxo(); + const auto& utxo = inData->txReq.armorySigner_.getSpender(0)->getUtxo(); //outpoint bw.put_BinaryData(utxo.getTxHash()); @@ -1082,123 +972,143 @@ void LedgerCommandThread::debugPrintLegacyResult(const QByteArray& responseSigne bw.put_BinaryData(bwSigScript.getData()); //sequence - bw.put_uint32_t(coreReq_->RBF ? Ledger::DEFAULT_SEQUENCE - 2 : Ledger::DEFAULT_SEQUENCE); + bw.put_uint32_t(inData->txReq.RBF ? Ledger::DEFAULT_SEQUENCE - 2 : Ledger::DEFAULT_SEQUENCE); //txouts bw.put_var_int(1); //count - bw.put_BinaryData(coreReq_->armorySigner_.getRecipient(0)->getSerializedScript()); + bw.put_BinaryData(inData->txReq.armorySigner_.getRecipient(0)->getSerializedScript()); bw.put_uint32_t(0); - std::cout << bw.getData().toHexStr() << std::endl; + logger_->debug("[LedgerDevice::SignTXHandler] legacy result: {}", bw.getData().toHexStr()); } -bool LedgerCommandThread::initDevice() +std::shared_ptr SignTXHandler::processData(const std::shared_ptr& inData) { - if (hid_init() < 0 || hidDeviceInfo_.serialNumber_.isEmpty()) { - logger_->info( - "[LedgerCommandThread] getPublicKey - Cannot init hid."); - return false; + auto result = std::make_shared(); + if (!initDevice()) { + logger_->info("[SignTXHandler::processData] cannot init device"); + //emit error(Ledger::NO_DEVICE); + return result; + } + if (!inData || !inData->txReq.isValid() || inData->inputPaths.empty()) { + logger_->error("[SignTXHandler::processData] invalid request"); + //emit error(Ledger::NO_INPUTDATA); + return result; + } + if (isNonSegwit(inData->inputPaths.at(0))) { + processTXLegacy(inData, result); } + else { + processTXSegwit(inData, result); + } + releaseDevice(); + return result; +} - // make sure that user do not switch off device in the middle of operation - { - auto* info = hid_enumerate(hidDeviceInfo_.vendorId_, hidDeviceInfo_.productId_); - if (!info) { - return false; - } +QByteArray SignTXHandler::getTrustedInput(const std::shared_ptr& inData + , const BinaryData& hash, unsigned txOutId) +{ + logger_->debug("[SignTXHandler::getTrustedInput] start retrieve trusted input for legacy address"); - bool bFound = false; - for (; info; info = info->next) { - if (checkLedgerDevice(info)) { - bFound = true; - break; - } - } + //find the supporting tx + auto tx = inData->txReq.armorySigner_.getSupportingTx(hash); + std::vector inputCommands; - if (!bFound) { - return false; - } + { + //trusted input request header + QByteArray txPayload; + writeUintBE(txPayload, txOutId); //outpoint index + + writeUintLE(txPayload, tx.getVersion()); //supporting tx version + writeVarInt(txPayload, tx.getNumTxIn()); //supporting tx input count + auto command = getApduCommand( + Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x00, 0x00, std::move(txPayload)); + inputCommands.push_back(std::move(command)); } - std::unique_ptr serNumb(new wchar_t[hidDeviceInfo_.serialNumber_.length() + 1]); - hidDeviceInfo_.serialNumber_.toWCharArray(serNumb.get()); - serNumb.get()[hidDeviceInfo_.serialNumber_.length()] = 0x00; - dongle_ = nullptr; - dongle_ = hid_open(hidDeviceInfo_.vendorId_, static_cast(hidDeviceInfo_.productId_), serNumb.get()); + //supporting tx inputs + for (unsigned i = 0; i < tx.getNumTxIn(); i++) { + auto txIn = tx.getTxInCopy(i); + auto outpoint = txIn.getOutPoint(); + auto outpointRaw = outpoint.serialize(); + auto scriptSig = txIn.getScriptRef(); - return dongle_ != nullptr; -} + //36 bytes of outpoint + QByteArray txInPayload; + txInPayload.push_back(QByteArray::fromRawData( + outpointRaw.getCharPtr(), outpointRaw.getSize())); -void LedgerCommandThread::releaseDevice() -{ - if (dongle_) { - hid_close(dongle_); - hid_exit(); - dongle_ = nullptr; - } -} + //txin scriptSig size as varint + writeVarInt(txInPayload, scriptSig.getSize()); -bool LedgerCommandThread::exchangeData(const QByteArray& input, - QByteArray& output, std::string&& logHeader) -{ - if (!writeData(input, logHeader)) { - return false; + auto commandInput = getApduCommand( + Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x80, 0x00, std::move(txInPayload)); + inputCommands.push_back(std::move(commandInput)); + + //txin scriptSig, assuming it's less than 251 bytes for the sake of simplicity + QByteArray txInScriptSig; + txInScriptSig.push_back(QByteArray::fromRawData( + scriptSig.toCharPtr(), scriptSig.getSize())); + writeUintLE(txInScriptSig, txIn.getSequence()); //sequence + + auto commandScriptSig = getApduCommand( + Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x80, 0x00, std::move(txInScriptSig)); + inputCommands.push_back(std::move(commandScriptSig)); } - try { - return readData(output, logHeader); + { + //number of outputs + QByteArray txPayload; + writeVarInt(txPayload, tx.getNumTxOut()); //supporting tx input count + auto command = getApduCommand( + Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x80, 0x00, std::move(txPayload)); + inputCommands.push_back(std::move(command)); } - catch (std::exception &e){ - // Special case : sometimes hidapi return incorrect sequence_index as response - // and there is really now good solution for it, except restart dongle session - // till the moment error gone. - // https://github.com/obsidiansystems/ledger-app-tezos/blob/191-troubleshooting/README.md#error-unexpected-sequence-number-expected-0-got-191-on-macos - // (solution in link above is not working, given here for reference) - // Also it's a general issue for OSX really, but let's left it for all system, just in case - // And let's have 10 times threshold to avoid trying infinitively - static int maxAttempts = 10; - if (e.what() == kHidapiSequence191 && maxAttempts > 0) { - --maxAttempts; - ScopedGuard guard([] { - ++maxAttempts; - }); - releaseDevice(); - initDevice(); - output.clear(); + //supporting tx outputs + for (unsigned i = 0; i < tx.getNumTxOut(); i++) { + auto txout = tx.getTxOutCopy(i); + auto script = txout.getScriptRef(); - return exchangeData(input, output, std::move(logHeader)); - } - else { - throw e; - } + QByteArray txOutput; + writeUintLE(txOutput, txout.getValue()); //txout value + writeVarInt(txOutput, script.getSize()); //txout script len + + auto commandTxOut = getApduCommand( + Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x80, 0x00, std::move(txOutput)); + inputCommands.push_back(std::move(commandTxOut)); + + //again, assuming the txout script is shorter than 255 bytes + QByteArray txOutScript; + txOutScript.push_back(QByteArray::fromRawData( + script.toCharPtr(), script.getSize())); + + auto commandScript = getApduCommand( + Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x80, 0x00, std::move(txOutScript)); + inputCommands.push_back(std::move(commandScript)); } -} -// Do not use this function anywhere except inside exchangeData -bool LedgerCommandThread::writeData(const QByteArray& input, const std::string& logHeader) -{ - logger_->debug("{} - >>> {}", logHeader, input.toHex().toStdString()); - if (sendApdu(dongle_, input) < 0) { - logger_->error("{} - Cannot write to device.", logHeader); - throw std::logic_error("Cannot write to device"); + for (auto& inputCommand : inputCommands) { + QByteArray responseInput; + if (!exchangeData(inputCommand, responseInput, "[LedgerCommandThread] signTX - getting trusted input")) { + releaseDevice(); + throw std::runtime_error("failed to get trusted input"); + } } - return true; -} + //locktime + QByteArray locktime; + writeUintLE(locktime, tx.getLockTime()); + auto command = getApduCommand( + Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x80, 0x00, std::move(locktime)); -// Do not use this function anywhere except inside exchangeData -bool LedgerCommandThread::readData(QByteArray& output, const std::string& logHeader) -{ - auto res = receiveApduResult(dongle_, output); - if (res != Ledger::SW_OK) { - logger_->error("{} - Cannot read from device. APDU error code : {}", - logHeader, QByteArray::number(res, 16).toStdString()); - lastError_ = res; - throw std::logic_error("Can't read from device"); + QByteArray trustedInput; + if (!exchangeData(command, trustedInput, "[SignTXHandler::getTrustedInput] ")) { + releaseDevice(); + throw std::runtime_error("failed to get trusted input"); } - logger_->debug("{} - <<< {}", logHeader, BinaryData::fromString(output.toStdString()).toHexStr() + "9000"); - return true; + logger_->debug("[SignTXHandler::getTrustedInput] done retrieve trusted input for legacy address"); + return trustedInput; } diff --git a/BlockSettleHW/ledger/ledgerDevice.h b/BlockSettleHW/ledger/ledgerDevice.h index 914238402..e5b39744b 100644 --- a/BlockSettleHW/ledger/ledgerDevice.h +++ b/BlockSettleHW/ledger/ledgerDevice.h @@ -11,74 +11,177 @@ #ifndef LEDGERDEVICE_H #define LEDGERDEVICE_H -#include "ledger/ledgerStructure.h" +#include +#include "BinaryData.h" #include "hwdeviceinterface.h" +#include "ledger/ledgerStructure.h" #include "ledger/hidapi/hidapi.h" -#include "BinaryData.h" - -#include +#include "Message/Worker.h" namespace spdlog { class logger; } namespace bs { - namespace sync { - class WalletsManager; - } namespace core { namespace wallet { struct TXSignRequest; } } -} - -class LedgerCommandThread; -class LedgerDevice : public HwDeviceInterface -{ - Q_OBJECT - -public: - LedgerDevice(HidDeviceInfo&& hidDeviceInfo, bool testNet, - std::shared_ptr walletManager - , const std::shared_ptr &logger, QObject* parent - , const std::shared_ptr& hidLock); - ~LedgerDevice() override; - - DeviceKey key() const override; - DeviceType type() const override; - - // lifecycle - void init(AsyncCallBack&& cb = nullptr) override; - void cancel() override; - void clearSession(AsyncCallBack&& cb = nullptr) {} - - // operation - void getPublicKey(AsyncCallBackCall&& cb = nullptr) override; - void signTX(const bs::core::wallet::TXSignRequest &reqTX, AsyncCallBackCall&& cb = nullptr) override; - void retrieveXPubRoot(AsyncCallBack&& cb) override {} // no special rule for ledger device - - bool isBlocked() override { - return isBlocked_; - } - QString lastError() override { - return lastError_; - } - -private: - QPointer blankCommand(AsyncCallBackCall&& cb = nullptr); - void cancelCommandThread(); - -private: - HidDeviceInfo hidDeviceInfo_; - bool testNet_{}; - std::shared_ptr logger_; - std::shared_ptr walletManager_; - QPointer commandThread_; - bool isBlocked_{}; - QString lastError_{}; - std::shared_ptr hidLock_; -}; + namespace hww { + struct DeviceCallbacks; + + class LedgerDevice : public DeviceInterface, protected WorkerPool + { + public: + LedgerDevice(const HidDeviceInfo& hidDeviceInfo, bool testNet + , const std::shared_ptr&, DeviceCallbacks* + , const std::shared_ptr& hidLock); + ~LedgerDevice() override = default; + + DeviceKey key() const override; + DeviceType type() const override; + + // lifecycle + void init() override; + void clearSession() {} + void cancel() override { WorkerPool::cancel(); } + + // operation + void getPublicKey() override; + void signTX(const bs::core::wallet::TXSignRequest& reqTX) override; + void retrieveXPubRoot() override; + + bool isBlocked() const override { + return isBlocked_; + } + std::string lastError() const override { + return lastError_; + } + + protected: + void requestForRescan() override; + std::shared_ptr worker(const std::shared_ptr&) override; + + // operation result informing + void publicKeyReady() override {} //TODO: implement + void deviceTxStatusChanged(const std::string& status) override {} //TODO: implement + void operationFailed(const std::string& reason) override {} //TODO: implement + + // Management + void requestPinMatrix() override {} //TODO: implement + void requestHWPass(bool allowedOnDevice) override {} //TODO: implement + void cancelledOnDevice() override {} //TODO: implement + void invalidPin() override {} //TODO: implement + + private: + void handleError(int32_t errorCode); + + private: + const HidDeviceInfo hidDeviceInfo_; + const bool testNet_; + std::shared_ptr logger_; + DeviceCallbacks* cb_{ nullptr }; + bool isBlocked_{false}; + std::string lastError_{}; + std::shared_ptr hidLock_; + }; + + + class DeviceIOHandler + { + public: + DeviceIOHandler(const std::shared_ptr& logger + , const HidDeviceInfo& devInfo, const std::shared_ptr& hidLock) + : logger_(logger), hidDeviceInfo_(devInfo), hidLock_(hidLock) + {} + ~DeviceIOHandler() { + releaseDevice(); + } + + bool initDevice(); + void releaseDevice(); + bool writeData(const QByteArray& input, const std::string& logHeader); + bool readData(QByteArray& output, const std::string& logHeader); + bool exchangeData(const QByteArray& input, QByteArray& output, std::string&& logHeader); + + protected: + std::shared_ptr logger_; + const HidDeviceInfo hidDeviceInfo_; + std::shared_ptr hidLock_; + hid_device* dongle_{ nullptr }; + }; + + struct SignTXIn : public bs::InData + { + ~SignTXIn() override = default; + DeviceKey key; + bs::core::wallet::TXSignRequest txReq; + std::vector inputPaths; + bs::hd::Path changePath; + std::vector inputNodes; + }; + struct SignTXOut : public bs::OutData + { + ~SignTXOut() override = default; + SecureBinaryData serInputSigs; + }; + + class SignTXHandler : public bs::HandlerImpl, protected DeviceIOHandler + { + public: + SignTXHandler(const std::shared_ptr& logger + , const HidDeviceInfo& devInfo, const std::shared_ptr& hidLock) + : DeviceIOHandler(logger, devInfo, hidLock) {} + + protected: + std::shared_ptr processData(const std::shared_ptr&) override; + + private: + void processTXLegacy(const std::shared_ptr&, const std::shared_ptr&); + void processTXSegwit(const std::shared_ptr&, const std::shared_ptr&); + QByteArray getTrustedInput(const std::shared_ptr&, const BinaryData& hash + , unsigned txOutId); + SegwitInputData getSegwitData(const std::shared_ptr&); + void sendTxSigningResult(const std::shared_ptr&, const std::map&); + void startUntrustedTransaction(const std::vector& trustedInputs + , const std::vector& redeemScripts, unsigned txOutIndex + , bool isNew, bool isSW, bool isRbf); + void finalizeInputFull(const std::shared_ptr&); + void debugPrintLegacyResult(const std::shared_ptr& + , const QByteArray& responseSigned, const BIP32_Node&); + }; + + struct PubKeyIn : public bs::InData + { + ~PubKeyIn() override = default; + std::vector paths; + }; + struct PubKeyOut : public bs::OutData + { + ~PubKeyOut() override = default; + std::vector pubKeys; + }; + + class GetPubKeyHandler : public bs::HandlerImpl, protected DeviceIOHandler + { + public: + GetPubKeyHandler(const std::shared_ptr& logger + , const HidDeviceInfo& devInfo, const std::shared_ptr& hidLock) + : DeviceIOHandler(logger, devInfo, hidLock) + {} + + protected: + BIP32_Node getPublicKeyApdu(const bs::hd::Path&, const std::unique_ptr& parent); + BIP32_Node retrievePublicKeyFromPath(const bs::hd::Path&); + + std::shared_ptr processData(const std::shared_ptr&) override; + }; + + } //hw +} //bs + +#if 0 class LedgerCommandThread : public QThread { Q_OBJECT @@ -94,7 +197,7 @@ class LedgerCommandThread : public QThread const DeviceKey &deviceKey, bs::core::wallet::TXSignRequest coreReq, std::vector&& paths, bs::hd::Path&& changePath); - void prepareGetRootKey(); + void getRootKey(); signals: // Done with success @@ -117,12 +220,6 @@ class LedgerCommandThread : public QThread bool writeData(const QByteArray& input, const std::string& logHeader); bool readData(QByteArray& output, const std::string& logHeader); - // Get public key processing - void processGetPublicKey(); - void processGetRootKey(); - BIP32_Node retrievePublicKeyFromPath(bs::hd::Path&& derivationPath); - BIP32_Node getPublicKeyApdu(bs::hd::Path&& derivationPath, const std::unique_ptr& parent = nullptr); - // Sign tx processing QByteArray getTrustedInput(const BinaryData&, unsigned); QByteArray getTrustedInputSegWit_outdated(const UTXO&); @@ -163,8 +260,7 @@ class LedgerCommandThread : public QThread std::unique_ptr coreReq_{}; std::vector inputPaths_; bs::hd::Path changePath_; - uint32_t lastError_ = 0x9000; - std::shared_ptr hidLock_; }; +#endif #endif // LEDGERDEVICE_H diff --git a/BlockSettleHW/ledger/ledgerStructure.cpp b/BlockSettleHW/ledger/ledgerStructure.cpp index ca1963ba2..d604dc070 100644 --- a/BlockSettleHW/ledger/ledgerStructure.cpp +++ b/BlockSettleHW/ledger/ledgerStructure.cpp @@ -26,7 +26,8 @@ void writeVarInt(QByteArray &output, size_t size) { } } -bool checkLedgerDevice(hid_device_info* info) { +bool checkLedgerDevice(hid_device_info* info) +{ if (!info) { return false; } diff --git a/BlockSettleHW/ledger/ledgerStructure.h b/BlockSettleHW/ledger/ledgerStructure.h index acaafac3c..b50859ed7 100644 --- a/BlockSettleHW/ledger/ledgerStructure.h +++ b/BlockSettleHW/ledger/ledgerStructure.h @@ -11,8 +11,10 @@ #ifndef LEDGERSTRUCTURE_H #define LEDGERSTRUCTURE_H -#include "hwcommonstructure.h" -#include "QDataStream" +#include +#include +#include "BinaryData.h" +#include "BIP32_Node.h" namespace Ledger { @@ -144,29 +146,28 @@ void writeUintLE(QByteArray& out, T value) { void writeVarInt(QByteArray &output, size_t size); struct HidDeviceInfo { - QString path_; - uint16_t vendorId_; - uint16_t productId_; - QString serialNumber_; - uint16_t releaseNumber_; - QString manufacturerString_; - QString productString_; - uint16_t usagePage_; - uint16_t usage_; - int interfaceNumber_; + std::string path; + uint16_t vendorId; + uint16_t productId; + std::string serialNumber; + uint16_t releaseNumber; + std::string manufacturer; + std::string product; + uint16_t usagePage; + uint16_t usage; + int interfaceNumber; }; struct SegwitInputData { - std::unordered_map preimages_; - std::unordered_map redeemScripts_; - std::vector inputNodes_; + std::map preimages; + std::map redeemScripts; }; struct LedgerPublicKey { - QByteArray pubKey_; - QByteArray address_; - QByteArray chainCode_; + QByteArray pubKey; + QByteArray address; + QByteArray chainCode; bool parseFromResponse(QByteArray response) { QDataStream stream(response); @@ -174,26 +175,26 @@ struct LedgerPublicKey uint8_t pubKeyLength; stream >> pubKeyLength; - pubKey_.clear(); - pubKey_.resize(pubKeyLength); - stream.readRawData(pubKey_.data(), pubKeyLength); + pubKey.clear(); + pubKey.resize(pubKeyLength); + stream.readRawData(pubKey.data(), pubKeyLength); uint8_t addressLength; stream >> addressLength; - address_.clear(); - address_.resize(addressLength); - stream.readRawData(address_.data(), addressLength); + address.clear(); + address.resize(addressLength); + stream.readRawData(address.data(), addressLength); - chainCode_.clear(); - chainCode_.resize(Ledger::CHAIN_CODE_SIZE); - stream.readRawData(chainCode_.data(), Ledger::CHAIN_CODE_SIZE); + chainCode.clear(); + chainCode.resize(Ledger::CHAIN_CODE_SIZE); + stream.readRawData(chainCode.data(), Ledger::CHAIN_CODE_SIZE); return stream.atEnd(); } bool isValid() { - return !pubKey_.isEmpty() && !address_.isEmpty() && !chainCode_.isEmpty(); + return !pubKey.isEmpty() && !address.isEmpty() && !chainCode.isEmpty(); } }; diff --git a/BlockSettleHW/trezor/trezorClient.cpp b/BlockSettleHW/trezor/trezorClient.cpp index 12dab254a..53770a1c1 100644 --- a/BlockSettleHW/trezor/trezorClient.cpp +++ b/BlockSettleHW/trezor/trezorClient.cpp @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2020 - 2021, BlockSettle AB +* Copyright (C) 2020 - 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * @@ -9,318 +9,247 @@ */ #include "trezorClient.h" -#include "ConnectionManager.h" +#include +#include "hwdevicemanager.h" #include "trezorDevice.h" #include "Wallets/SyncWalletsManager.h" #include "Wallets/SyncHDWallet.h" #include "ScopeGuard.h" -#include -#include -#include -#include -#include -#include -#include +using namespace bs::hww; -TrezorClient::TrezorClient(const std::shared_ptr& logger, - std::shared_ptr walletManager, bool testNet, QObject* parent /*= nullptr*/) - : QObject(parent) - , logger_(logger) - , walletManager_(walletManager) - , testNet_(testNet) -{ -} - -QByteArray TrezorClient::getSessionId() -{ - return deviceData_.sessionId_; -} +TrezorClient::TrezorClient(const std::shared_ptr& logger + , bool testNet, DeviceCallbacks* cb) + : bs::WorkerPool(1, 1), logger_(logger), cb_(cb), testNet_(testNet) +{} -void TrezorClient::initConnection(bool force, AsyncCallBack&& cb) +void TrezorClient::initConnection() { - auto initCallBack = [this, cbCopy = std::move(cb), force](QNetworkReply* reply) mutable { - ScopedGuard guard([cb = std::move(cbCopy)]{ - if (cb) { - cb(); - } - }); - if (!reply || reply->error() != QNetworkReply::NoError) { - logger_->error("[TrezorClient] initConnection - Network error: {}", reply->errorString().toUtf8()); + const auto& cb = [this](const std::shared_ptr& data) + { + const auto& reply = std::static_pointer_cast(data); + if (!reply || !reply->error.empty()) { + logger_->error("[TrezorClient::initConnection] network error: {}", reply ? reply->error : ""); return; } - - QByteArray loadData = reply ? reply->readAll().simplified() : ""; - - QJsonParseError jsonError; - QJsonDocument loadDoc = QJsonDocument::fromJson(loadData, &jsonError); - if (jsonError.error != QJsonParseError::NoError) { - logger_->error("[TrezorClient] initConnection - Invalid json structure: {}", jsonError.errorString().toUtf8()); - return; + nlohmann::json response; + try { + response = nlohmann::json::parse(reply->response); } - - const auto bridgeInfo = loadDoc.object(); - logger_->info("[TrezorClient] initConnection - Connection initialized. Bridge version: {}" - , bridgeInfo.value(QString::fromUtf8("version")).toString().toUtf8()); - - state_ = State::Init; - emit initialized(); - - enumDevices(force, std::move(guard.releaseCb())); - reply->deleteLater(); - }; - - logger_->info("[TrezorClient] Initialize connection"); - postToTrezor("/", std::move(initCallBack), true); -} - -void TrezorClient::initConnection(QString&& deviceId, bool force, AsyncCallBackCall&& cb /*= nullptr*/) -{ - AsyncCallBack cbWrapper = [copyDeviceId = std::move(deviceId), originCb = std::move(cb)]() { - originCb({ copyDeviceId }); - }; - - initConnection(force, std::move(cbWrapper)); -} - -void TrezorClient::releaseConnection(AsyncCallBack&& cb) -{ - if (deviceData_.sessionId_.isEmpty()) { - cleanDeviceData(); - if (cb) { - cb(); - } - return; - } - - auto releaseCallback = [this, cbCopy = std::move(cb)](QNetworkReply* reply) mutable { - ScopedGuard ensureCb([this, cb = std::move(cbCopy)]{ - cleanDeviceData(); - if (cb) { - cb(); - } - }); - - if (!reply || reply->error() != QNetworkReply::NoError) { - logger_->error("[TrezorClient] releaseConnection - Network error: {}", reply->errorString().toUtf8()); + catch (const nlohmann::json::exception& e) { + logger_->error("[TrezorClient::acquireDevice] failed to parse '{}': {}", reply->response, e.what()); return; } - logger_->info("[TrezorClient] releaseConnection - Connection successfully released"); - - state_ = State::Released; - emit deviceReleased(); + logger_->info("[TrezorClient::initConnection] connection inited, bridge version: {}" + , response["version"].get()); - reply->deleteLater(); + state_ = trezor::State::Init; + //emit initialized(); }; - - logger_->info("[TrezorClient] Release connection. Connection id: {}", deviceData_.sessionId_.toStdString()); - - QByteArray releaseUrl = "/release/" + deviceData_.sessionId_; - postToTrezor(std::move(releaseUrl), std::move(releaseCallback)); - + logger_->info("[TrezorClient::initConnection]"); + auto inData = std::make_shared(); + inData->path = "/"; + processQueued(inData, cb); } -void TrezorClient::postToTrezor(QByteArray&& urlMethod, std::function &&cb, bool timeout /* = false */) +void bs::hww::TrezorClient::releaseConnection() { - post(std::move(urlMethod), std::move(cb), QByteArray(), timeout); + for (const auto& device : devices_) { + device->releaseConnection(); + } } -void TrezorClient::postToTrezorInput(QByteArray&& urlMethod, std::function &&cb, QByteArray&& input) +std::vector TrezorClient::deviceKeys() const { - post(std::move(urlMethod), std::move(cb), std::move(input)); + std::vector result; + for (const auto& dev : devices_) { + result.push_back(dev->key()); + } + return result; } -void TrezorClient::call(QByteArray&& input, AsyncCallBackCall&& cb) +std::shared_ptr TrezorClient::getDevice(const std::string& deviceId) { - auto callCallback = [this, cbCopy = std::move(cb)](QNetworkReply* reply) mutable { - - if (!reply || reply->error() != QNetworkReply::NoError) { - logger_->error("[TrezorClient] call - Network error: {}", reply->errorString().toUtf8()); - if (cbCopy) { - cbCopy({}); - } - return; + for (const auto& dev : devices_) { + if (dev->key().id == deviceId) { + return dev; } - - QByteArray loadData = reply->readAll().simplified(); - cbCopy(std::move(loadData)); - }; - - logger_->info("[TrezorClient] Call to trezor."); - - QByteArray callUrl = "/call/" + deviceData_.sessionId_; - postToTrezorInput(std::move(callUrl), std::move(callCallback), std::move(input)); -} - -QVector TrezorClient::deviceKeys() const -{ - if (!trezorDevice_) { - return {}; } - auto key = trezorDevice_->key(); - return { key }; + return nullptr; } -QPointer TrezorClient::getTrezorDevice(const QString& deviceId) +std::shared_ptr TrezorClient::worker(const std::shared_ptr&) { - // #TREZOR_INTEGRATION: need lookup for several devices - if (!trezorDevice_) { - return nullptr; - } - - assert(trezorDevice_->key().deviceId_ == deviceId); - return trezorDevice_; + const std::vector> handlers{ std::make_shared + (logger_, trezorEndPoint_) }; + return std::make_shared(handlers); } -void TrezorClient::enumDevices(bool forceAcquire, AsyncCallBack&& cb) +void TrezorClient::listDevices() { - auto enumCallback = [this, cbCopy = std::move(cb), forceAcquire](QNetworkReply* reply) mutable { - ScopedGuard ensureCb([cb = std::move(cbCopy)]{ - if (cb) { - cb(); - } - }); - - if (!reply || reply->error() != QNetworkReply::NoError) { - logger_->error("[TrezorClient] enumDevices - Network error: {}", reply->errorString().toUtf8()); + if (state_ == trezor::State::None) { + initConnection(); + } + const auto& cb = [this](const std::shared_ptr& data) + { + const auto& reply = std::static_pointer_cast(data); + if (!reply || !reply->error.empty()) { + logger_->error("[TrezorClient::listDevices] network error: {}", reply ? reply->error : ""); return; } - - QByteArray loadData = reply ? reply->readAll().simplified() : ""; - - QJsonParseError jsonError; - QJsonDocument loadDoc = QJsonDocument::fromJson(loadData, &jsonError); - if (jsonError.error != QJsonParseError::NoError) { - logger_->error("[TrezorClient] enumDevices - Invalid json structure: {}", jsonError.errorString().toUtf8()); - return; + nlohmann::json response; + try { + response = nlohmann::json::parse(reply->response); } - - QJsonArray devices = loadDoc.array(); - const int deviceCount = devices.count(); - if (deviceCount == 0) { - logger_->info("[TrezorClient] enumDevices - No trezor device available"); + catch (const nlohmann::json::exception& e) { + logger_->error("[TrezorClient::acquireDevice] failed to parse '{}': {}", reply->response, e.what()); return; } - QVector trezorDevices; - for (const QJsonValueRef &deviceRef : devices) { - const QJsonObject deviceObj = deviceRef.toObject(); - trezorDevices.push_back({ - deviceObj[QLatin1String("path")].toString().toUtf8(), - deviceObj[QLatin1String("vendor")].toString().toUtf8(), - deviceObj[QLatin1String("product")].toString().toUtf8(), - deviceObj[QLatin1String("session")].toString().toUtf8(), - deviceObj[QLatin1String("debug")].toString().toUtf8(), - deviceObj[QLatin1String("debugSession")].toString().toUtf8() }); - } - - // If there will be a few trezor devices connected, let's choose first one for now - // later we could expand this functionality to many of them - if (!forceAcquire && trezorDevice_ && trezorDevices.first().sessionId_ == deviceData_.sessionId_) { - // this is our previous session so we could go straight away on it - return; + std::vector trezorDevices; + for (const auto& device : response) { + trezorDevices.push_back({device["path"].get() + , device["vendor"].get(), device["product"].get() + , device["session"].get(), device["debug"].get() + , device["debugSession"].get() }); } + logger_->info("[TrezorClient::listDevices] enumeration finished, #devices: {}" + , trezorDevices.size()); - deviceData_ = trezorDevices.first(); - logger_->info("[TrezorClient] enumDevices - Enumerate request succeeded. " - "Total devices available: {}. Trying to acquire first one...", deviceCount); - - state_ = State::Enumerated; - emit devicesScanned(); + state_ = trezor::State::Enumerated; - acquireDevice(std::move(ensureCb.releaseCb())); - reply->deleteLater(); + nbDevices_ = trezorDevices.size(); + for (const auto& dev : trezorDevices) { + acquireDevice(dev); + } }; - - logger_->info("[TrezorClient] Request to enumerate devices."); - postToTrezor("/enumerate", std::move(enumCallback)); + logger_->info("[TrezorClient::listDevices]"); + auto inData = std::make_shared(); + inData->path = "/enumerate"; + processQueued(inData, cb); } -void TrezorClient::acquireDevice(AsyncCallBack&& cb) +void TrezorClient::acquireDevice(const trezor::DeviceData& devData, bool init) { - QByteArray previousSessionId = deviceData_.sessionId_.isEmpty() ? - "null" : deviceData_.sessionId_; - - auto acquireCallback = [this, previousSessionId, cbCopy = std::move(cb)](QNetworkReply* reply) mutable { - ScopedGuard ensureCb([cb = std::move(cbCopy)]{ - if (cb) { - cb(); + const auto& prevSessionId = devices_.empty() ? "null" + : devices_.at(devices_.size() - 1)->data().sessionId; + auto inData = std::make_shared(); + inData->path = "/acquire/" + devData.path + "/" + prevSessionId; + + auto acquireCallback = [this, prevSessionId, devData, init] + (const std::shared_ptr& data) + { + if (nbDevices_ == 0) { + cb_->scanningDone(); + } + --nbDevices_; + const auto& scanDone = [this] + { + if (nbDevices_ == 0) { + cb_->scanningDone(); } - }); - - if (!reply || reply->error() != QNetworkReply::NoError) { - logger_->error("[TrezorClient] acquireDevice - Network error: {}", reply->errorString().toUtf8()); + }; + const auto& reply = std::static_pointer_cast(data); + if (!reply || !reply->error.empty()) { + logger_->error("[TrezorClient::acquireDevice] network error: {}", reply ? reply->error : ""); + scanDone(); return; } - - QByteArray loadData = reply ? reply->readAll().simplified() : ""; - QJsonObject acuiredDevice = QJsonDocument::fromJson(loadData).object(); - - deviceData_.sessionId_ = acuiredDevice[QLatin1String("session")].toString().toUtf8(); - - if (deviceData_.sessionId_.isEmpty() || deviceData_.sessionId_ == previousSessionId) { - logger_->error("[TrezorClient] acquireDevice - Cannot acquire device"); + nlohmann::json response; + try { + response = nlohmann::json::parse(reply->response); + } + catch (const nlohmann::json::exception& e) { + logger_->error("[TrezorClient::acquireDevice] failed to parse '{}': {}", reply->response, e.what()); + scanDone(); return; } - logger_->info("[TrezorClient] Connection has successfully acquired. Old " - "connection id: {}, new connection id: {}", previousSessionId.toStdString() - , deviceData_.sessionId_.toStdString()); + trezor::DeviceData devData; + devData.sessionId = response["session"].get(); - state_ = State::Acquired; - emit deviceReady(); + if (devData.sessionId.empty() || devData.sessionId == prevSessionId) { + logger_->error("[TrezorClient::acquireDevice] cannot acquire device"); + scanDone(); + return; + } - trezorDevice_ = new TrezorDevice(logger_, walletManager_, testNet_, { this }, this) ; - trezorDevice_->init(std::move(ensureCb.releaseCb())); + logger_->info("[TrezorClient::acquireDevice] Connection has successfully acquired. Old " + "connection id: {}, new connection id: {}", prevSessionId, devData.sessionId); - reply->deleteLater(); + state_ = trezor::State::Acquired; + //emit deviceReady(); + const auto& newDevice = std::make_shared(logger_, devData + , testNet_, cb_, trezorEndPoint_); + if (init) { + newDevice->init(); + } + devices_.push_back(newDevice); + scanDone(); }; + logger_->info("[TrezorClient::acquireDevice] old session id: {}", prevSessionId); + processQueued(inData, acquireCallback); +} - logger_->info("[TrezorClient] Acquire new connection. Old connection id: {}", previousSessionId); - QByteArray acquireUrl = "/acquire/" + deviceData_.path_ + "/" + previousSessionId; - postToTrezor(std::move(acquireUrl), std::move(acquireCallback)); +namespace { + static const std::string kBlockSettleOrigin{ "Origin: https://blocksettle.trezor.io" }; } -void TrezorClient::post(QByteArray&& urlMethod, std::function &&cb, QByteArray&& input, bool timeout /* = false*/) +static size_t writeToString(void* ptr, size_t size, size_t count, std::string* stream) { - QNetworkRequest request; - request.setRawHeader({ "Origin" }, { blocksettleOrigin }); - request.setUrl(QUrl(QString::fromLocal8Bit(trezorEndPoint_ + urlMethod))); - - if (!input.isEmpty()) { - request.setHeader(QNetworkRequest::ContentTypeHeader, { QByteArray("application/x-www-form-urlencoded") }); - } + const size_t resSize = size * count; + stream->append((char*)ptr, resSize); + return resSize; +} - QNetworkReply *reply = QNetworkAccessManager().post(request, input); - auto connection = connect(reply, &QNetworkReply::finished, this - , [cbCopy = cb, repCopy = reply, sender = QPointer(this)] - { - if (!sender) { - return; // TREZOR client already destroyed - } +TrezorPostHandler::TrezorPostHandler(const std::shared_ptr& logger + , const std::string& baseURL) + : logger_(logger), baseURL_(baseURL) +{ + curl_ = curl_easy_init(); + curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, writeToString); - cbCopy(repCopy); - repCopy->deleteLater(); - }); + curlHeaders_ = curl_slist_append(curlHeaders_, kBlockSettleOrigin.c_str()); + curlHeaders_ = curl_slist_append(curlHeaders_, "content-type: application/x-www-form-urlencoded;"); + curl_easy_setopt(curl_, CURLOPT_HTTPHEADER, curlHeaders_); +} - // Timeout - if (timeout) { - QTimer::singleShot(2000, [replyCopy = QPointer(reply)]() { - if (!replyCopy) { - return; - } - replyCopy->abort(); - }); - } +bs::hww::TrezorPostHandler::~TrezorPostHandler() +{ + curl_slist_free_all(curlHeaders_); + curl_easy_cleanup(curl_); } -void TrezorClient::cleanDeviceData() +std::shared_ptr bs::hww::TrezorPostHandler::processData(const std::shared_ptr& inData) { - if (trezorDevice_) { - trezorDevice_->deleteLater(); - trezorDevice_ = nullptr; + auto result = std::make_shared(); + if (!curl_) { + result->error = "curl not inited"; + return result; + } + const std::string url{ baseURL_ + inData->path }; + curl_easy_setopt(curl_, CURLOPT_URL, url.c_str()); + if (!inData->input.empty()) { + curl_easy_setopt(curl_, CURLOPT_POSTFIELDS, inData->input.data()); + } + if (inData->timeout) { + curl_easy_setopt(curl_, CURLOPT_TIMEOUT_MS, 2000L); + } + else { + curl_easy_setopt(curl_, CURLOPT_TIMEOUT, 0L); + } + + std::string response; + curl_easy_setopt(curl_, CURLOPT_WRITEDATA, &response); + + const auto res = curl_easy_perform(curl_); + if (res != CURLE_OK) { + result->error = fmt::format("failed to post {} to {}: {}" + , inData->input, url, res); + return result; } - deviceData_ = {}; + result->response = std::move(response); + return result; } diff --git a/BlockSettleHW/trezor/trezorClient.h b/BlockSettleHW/trezor/trezorClient.h index 45a3336be..88000d984 100644 --- a/BlockSettleHW/trezor/trezorClient.h +++ b/BlockSettleHW/trezor/trezorClient.h @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2020 - 2021, BlockSettle AB +* Copyright (C) 2020 - 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * @@ -11,78 +11,95 @@ #ifndef TREZORCLIENT_H #define TREZORCLIENT_H -#include "trezorStructure.h" #include - -#include -#include -#include +#include +#include "hwdeviceinterface.h" +#include "Message/Worker.h" +#include "trezorStructure.h" namespace spdlog { class logger; } -namespace bs { - namespace sync { - class WalletsManager; - } -} -class QNetworkRequest; -class TrezorDevice; - -class TrezorClient : public QObject -{ - Q_OBJECT - -public: - - TrezorClient(const std::shared_ptr&, - std::shared_ptr, bool testNet, QObject* parent = nullptr); - ~TrezorClient() override = default; - - QByteArray getSessionId(); - - void initConnection(bool force, AsyncCallBack&& cb = nullptr); - void initConnection(QString&& deviceId, bool force, AsyncCallBackCall&& cb = nullptr); - void releaseConnection(AsyncCallBack&& cb = nullptr); - - void call(QByteArray&& input, AsyncCallBackCall&& cb); +struct curl_slist; - QVector deviceKeys() const; - QPointer getTrezorDevice(const QString& deviceId); - -private: - void postToTrezor(QByteArray&& urlMethod, std::function &&cb, bool timeout = false); - void postToTrezorInput(QByteArray&& urlMethod, std::function &&cb, QByteArray&& input); - - void enumDevices(bool forceAcquire, AsyncCallBack&& cb = nullptr); - void acquireDevice(AsyncCallBack&& cb = nullptr); - void post(QByteArray&& urlMethod, std::function &&cb, QByteArray&& input, bool timeout = false); - - void cleanDeviceData(); - -signals: - void initialized(); - void devicesScanned(); - void deviceReady(); - void deviceReleased(); - - void publicKeyReady(); - void onRequestPinMatrix(); - -private: - std::shared_ptr logger_; - std::shared_ptr walletManager_; - - const QByteArray trezorEndPoint_ = "http://127.0.0.1:21325"; - const QByteArray blocksettleOrigin = "https://blocksettle.trezor.io"; - DeviceData deviceData_; - State state_ = State::None; - bool testNet_{}; - - // There should really be a bunch of devices - QPointer trezorDevice_{}; - - -}; +namespace bs { + namespace hww { + class TrezorDevice; + class DeviceCallbacks; + + struct TrezorPostIn : public bs::InData + { + ~TrezorPostIn() override = default; + std::string path; + std::string input; + bool timeout{ true }; + }; + struct TrezorPostOut : public bs::OutData + { + ~TrezorPostOut() override = default; + std::string response; + std::string error; + }; + + class TrezorPostHandler : public bs::HandlerImpl + { + public: + TrezorPostHandler(const std::shared_ptr& logger + , const std::string& baseURL); + ~TrezorPostHandler() override; + + protected: + std::shared_ptr processData(const std::shared_ptr&) override; + + private: + std::shared_ptr logger_; + const std::string baseURL_; + struct curl_slist* curlHeaders_{ NULL }; + void* curl_{ nullptr }; + }; + + + class TrezorClient : protected bs::WorkerPool + { + friend class TrezorDevice; + public: + TrezorClient(const std::shared_ptr& + , bool testNet, DeviceCallbacks*); + ~TrezorClient() override = default; + + void initConnection(); + void releaseConnection(); + void listDevices(); + + std::vector deviceKeys() const; + std::shared_ptr getDevice(const std::string& deviceId); + + protected: + std::shared_ptr worker(const std::shared_ptr&) override final; + + private: + void acquireDevice(const trezor::DeviceData&, bool init = false); + + //former signals + void initialized(); + void devicesScanned(); + void deviceReady(); + void deviceReleased(); + + void publicKeyReady(); + void onRequestPinMatrix(); + + private: + std::shared_ptr logger_; + DeviceCallbacks* cb_{ nullptr }; + const std::string trezorEndPoint_{ "http://127.0.0.1:21325" }; + trezor::State state_{ trezor::State::None }; + bool testNet_{}; + std::vector> devices_; + unsigned int nbDevices_{ 0 }; + }; + + } //hw +} //bs #endif // TREZORCLIENT_H diff --git a/BlockSettleHW/trezor/trezorDevice.cpp b/BlockSettleHW/trezor/trezorDevice.cpp index b9da4f89c..0e5c717b5 100644 --- a/BlockSettleHW/trezor/trezorDevice.cpp +++ b/BlockSettleHW/trezor/trezorDevice.cpp @@ -8,22 +8,27 @@ ********************************************************************************** */ +#include +#include +#include "hwdevicemanager.h" #include "trezorDevice.h" #include "trezorClient.h" -#include "ConnectionManager.h" -#include "headless.pb.h" #include "Wallets/ProtobufHeadlessUtils.h" #include "CoreWallet.h" #include "Wallets/SyncWalletsManager.h" #include "Wallets/SyncHDWallet.h" -#include - +#include "headless.pb.h" -// Protobuf +// Trezor interface (source - https://github.com/trezor/trezor-common/tree/master/protob) +#include "trezor/generated_proto/messages.pb.h" +#include "trezor/generated_proto/messages-management.pb.h" +#include "trezor/generated_proto/messages-common.pb.h" +#include "trezor/generated_proto/messages-bitcoin.pb.h" #include using namespace hw::trezor::messages; +using namespace bs::hww; namespace { const auto kModel1 = "1"; @@ -60,14 +65,14 @@ namespace { return packed; } - MessageData unpackMessage(const QByteArray& response) + trezor::MessageData unpackMessage(const QByteArray& response) { QDataStream stream(response); - MessageData ret; + trezor::MessageData ret; - ret.msg_type_ = QByteArray::fromHex(response.mid(0, 4).toHex()).toInt(nullptr, 16); - ret.length_ = QByteArray::fromHex(response.mid(4, 8).toHex()).toInt(nullptr, 16); - ret.message_ = QByteArray::fromHex(response.mid(12, 2 * ret.length_)).toStdString(); + ret.type = QByteArray::fromHex(response.mid(0, 4).toHex()).toInt(nullptr, 16); + ret.length = QByteArray::fromHex(response.mid(4, 8).toHex()).toInt(nullptr, 16); + ret.message = QByteArray::fromHex(response.mid(12, 2 * ret.length)).toStdString(); return ret; } @@ -82,50 +87,65 @@ namespace { return output; } - const std::string tesNetCoin = "Testnet"; + static const std::string kTesNetCoin = "Testnet"; } TrezorDevice::TrezorDevice(const std::shared_ptr &logger - , std::shared_ptr walletManager - , bool testNet, const QPointer &client, QObject* parent) - : HwDeviceInterface(parent) - , logger_(logger), walletManager_(walletManager) - , client_(std::move(client)) - , testNet_(testNet) + , const trezor::DeviceData& data, bool testNet, DeviceCallbacks* cb + , const std::string& endpoint) + : bs::WorkerPool(1, 1) + , logger_(logger), data_(data), testNet_(testNet), cb_(cb), endpoint_(endpoint) + , features_{std::make_shared()} {} TrezorDevice::~TrezorDevice() = default; -DeviceKey TrezorDevice::key() const +std::shared_ptr TrezorDevice::worker(const std::shared_ptr&) { - QString walletId; - QString status; - if (!xpubRoot_.empty()) { - auto expectedWalletId = bs::core::wallet::computeID( - BinaryData::fromString(xpubRoot_)).toBinStr(); + const std::vector> handlers{ std::make_shared + (logger_, endpoint_) }; + return std::make_shared(handlers); +} - auto importedWallets = walletManager_->getHwWallets( - bs::wallet::HardwareEncKey::WalletType::Trezor, features_.device_id()); +void bs::hww::TrezorDevice::operationFailed(const std::string& reason) +{ + releaseConnection(); + cb_->operationFailed(features_->device_id(), reason); +} - for (const auto &imported : importedWallets) { - if (expectedWalletId == imported) { - walletId = QString::fromStdString(expectedWalletId); - break; - } +void TrezorDevice::releaseConnection() +{ + auto releaseCallback = [this](const std::shared_ptr& data) + { + const auto& reply = std::static_pointer_cast(data); + if (!reply || !reply->error.empty()) { + logger_->error("[TrezorDevice::releaseConnection] network error: {}" + , reply ? reply->error : ""); + return; } + + logger_->info("[TrezorClient] releaseConnection - Connection successfully released"); + + state_ = trezor::State::Released; + //emit deviceReleased(); + }; + auto inData = std::make_shared(); + inData->path = "/release/" + data_.sessionId; + processQueued(inData, releaseCallback); +} + +DeviceKey TrezorDevice::key() const +{ + std::string walletId; + std::string status; + if (!xpubRoot_.empty()) { + walletId = bs::core::wallet::computeID(xpubRoot_).toBinStr(); } else { - status = tr("Not initialized"); + status = "not inited"; } - - return { - QString::fromStdString(features_.label()) - , QString::fromStdString(features_.device_id()) - , QString::fromStdString(features_.vendor()) - , walletId - , status - , type() - }; + return { features_->label(), features_->device_id(), features_->vendor() + , walletId, status, type() }; } DeviceType TrezorDevice::type() const @@ -133,111 +153,138 @@ DeviceType TrezorDevice::type() const return DeviceType::HWTrezor; } -void TrezorDevice::init(AsyncCallBack&& cb) +void TrezorDevice::init() { - logger_->debug("[TrezorDevice] init - start init call"); + logger_->debug("[TrezorDevice::init] start"); management::Initialize message; - message.set_session_id(client_->getSessionId()); + message.set_session_id(data_.sessionId); + const auto& cb = [this](const std::shared_ptr& data) + { + const auto& reply = std::static_pointer_cast(data); + if (!reply || !reply->error.empty()) { + logger_->error("[TrezorDevice::makeCall] network error: {}", reply ? reply->error : ""); + //emit operationFailed(QLatin1String("Network error")); + reset(); + return; + } + state_ = trezor::State::Init; + const auto& msg = unpackMessage(QByteArray::fromStdString(reply->response)); + handleMessage(msg); - setCallbackNoData(MessageType_Features, std::move(cb)); - makeCall(message); + retrieveXPubRoot(); + }; + auto inData = std::make_shared(); + inData->path = "/call/" + data_.sessionId; + inData->input = packMessage(message).toStdString(); + processQueued(inData, cb); } -void TrezorDevice::getPublicKey(AsyncCallBackCall&& cb) +struct NoDataOut : public bs::OutData +{ + ~NoDataOut() override = default; + MessageType msgType; +}; + +struct XPubOut : public bs::OutData +{ + ~XPubOut() override = default; + std::string xpub; +}; + +struct TXOut : public bs::OutData +{ + ~TXOut() override = default; + std::string signedTX; +}; + +void TrezorDevice::getPublicKey() { awaitingWalletInfo_ = {}; // General data - awaitingWalletInfo_.info_.type = bs::wallet::HardwareEncKey::WalletType::Trezor; - awaitingWalletInfo_.info_.label = features_.label(); - awaitingWalletInfo_.info_.deviceId = features_.device_id(); - awaitingWalletInfo_.info_.vendor = features_.vendor(); - awaitingWalletInfo_.info_.xpubRoot = xpubRoot_; - - awaitingWalletInfo_.isFirmwareSupported_ = isFirmwareSupported(); - if (!awaitingWalletInfo_.isFirmwareSupported_) { - awaitingWalletInfo_.firmwareSupportedMsg_ = firmwareSupportedVersion(); - cb(QVariant::fromValue<>(awaitingWalletInfo_)); + awaitingWalletInfo_.type = bs::wallet::HardwareEncKey::WalletType::Trezor; + awaitingWalletInfo_.label = features_->label(); + awaitingWalletInfo_.deviceId = features_->device_id(); + awaitingWalletInfo_.vendor = features_->vendor(); + awaitingWalletInfo_.xpubRoot = xpubRoot_.toBinStr(); + + if (!isFirmwareSupported()) { + logger_->warn("[TrezorDevice::getPublicKey] unsupported firmware. {}" + , firmwareSupportedVersion()); + //TODO: invoke callback return; } - // We cannot get all data from one call so we make four calls: - // fetching first address for "m/0'" as wallet id - // fetching first address for "m/84'" as native segwit xpub - // fetching first address for "m/49'" as nested segwit xpub - // fetching first address for "m/44'" as legacy xpub - - AsyncCallBackCall cbLegacy = [this, cb = std::move(cb)](QVariant &&data) mutable { - awaitingWalletInfo_.info_.xpubLegacy = data.toByteArray().toStdString(); - - cb(QVariant::fromValue<>(awaitingWalletInfo_)); - }; - - AsyncCallBackCall cbNested = [this, cbLegacy = std::move(cbLegacy)](QVariant &&data) mutable { - awaitingWalletInfo_.info_.xpubNestedSegwit = data.toByteArray().toStdString(); - - logger_->debug("[TrezorDevice] init - start retrieving legacy public key from device {}" - , features_.label()); - bitcoin::GetPublicKey message; - for (const uint32_t add : getDerivationPath(testNet_, bs::hd::Purpose::NonSegWit)) { - message.add_address_n(add); - } - if (testNet_) { - message.set_coin_name(tesNetCoin); + const auto& cbLegacy = [this](const std::shared_ptr& data) + { + const auto& reply = std::dynamic_pointer_cast(data); + if (!reply) { + logger_->error("[TrezorDevice::getPublicKey::legacy] invalid callback data"); + return; } - - setDataCallback(MessageType_PublicKey, std::move(cbLegacy)); - makeCall(message); + awaitingWalletInfo_.xpubLegacy = reply->xpub; + //TODO: invoke callback }; - AsyncCallBackCall cbNative = [this, cbNested = std::move(cbNested)](QVariant &&data) mutable { - awaitingWalletInfo_.info_.xpubNativeSegwit = data.toByteArray().toStdString(); - - logger_->debug("[TrezorDevice] init - start retrieving nested segwit public key from device {}" - , features_.label()); - bitcoin::GetPublicKey message; - for (const uint32_t add : getDerivationPath(testNet_, bs::hd::Purpose::Nested)) { - message.add_address_n(add); + const auto& cbNested = [this](const std::shared_ptr& data) + { + const auto& reply = std::dynamic_pointer_cast(data); + if (!reply) { + logger_->error("[TrezorDevice::getPublicKey::nested] invalid callback data"); + return; } + awaitingWalletInfo_.xpubNestedSegwit = reply->xpub; + }; - if (testNet_) { - message.set_coin_name(tesNetCoin); + const auto& cbNative = [this](const std::shared_ptr &data) + { + const auto& reply = std::dynamic_pointer_cast(data); + if (!reply) { + logger_->error("[TrezorDevice::getPublicKey::native] invalid callback data"); + return; } - - setDataCallback(MessageType_PublicKey, std::move(cbNested)); - makeCall(message); + awaitingWalletInfo_.xpubNativeSegwit = reply->xpub; }; - logger_->debug("[TrezorDevice] init - start retrieving native segwit public key from device {}" - , features_.label()); + logger_->debug("[TrezorDevice::getPublicKey] start public keys from device {}" + , features_->label()); bitcoin::GetPublicKey message; for (const uint32_t add : getDerivationPath(testNet_, bs::hd::Purpose::Native)) { message.add_address_n(add); } - if (testNet_) { - message.set_coin_name(tesNetCoin); + message.set_coin_name(kTesNetCoin); } + makeCall(message, cbNative); - setDataCallback(MessageType_PublicKey, std::move(cbNative)); - makeCall(message); + message.clear_address_n(); + for (const uint32_t add : getDerivationPath(testNet_, bs::hd::Purpose::Nested)) { + message.add_address_n(add); + } + makeCall(message, cbNested); + + message.clear_address_n(); + for (const uint32_t add : getDerivationPath(testNet_, bs::hd::Purpose::NonSegWit)) { + message.add_address_n(add); + } + makeCall(message, cbLegacy); } -void TrezorDevice::setMatrixPin(const std::string& pin) +void TrezorDevice::setMatrixPin(const SecureBinaryData& pin) { - logger_->debug("[TrezorDevice] setMatrixPin - send matrix pin response"); + logger_->debug("[TrezorDevice::setMatrixPin] {}", data_.path); common::PinMatrixAck message; - message.set_pin(pin); + message.set_pin(pin.toBinStr()); makeCall(message); } -void TrezorDevice::setPassword(const std::string& password, bool enterOnDevice) +void TrezorDevice::setPassword(const SecureBinaryData& password, bool enterOnDevice) { - logger_->debug("[TrezorDevice] setPassword - send passphrase response"); + logger_->debug("[TrezorDevice::setPassword] {}", data_.path); common::PassphraseAck message; if (enterOnDevice) { message.set_on_device(true); } else { - message.set_passphrase(password); + message.set_passphrase(password.toBinStr()); } makeCall(message); } @@ -247,84 +294,114 @@ void TrezorDevice::cancel() logger_->debug("[TrezorDevice] cancel previous operation"); management::Cancel message; makeCall(message); - sendTxMessage(HWInfoStatus::kCancelledByUser); + sendTxMessage(/*HWInfoStatus::kCancelledByUser*/"cancelled by user"); } -void TrezorDevice::clearSession(AsyncCallBack&& cb) +void TrezorDevice::clearSession() { logger_->debug("[TrezorDevice] cancel previous operation"); management::/*ClearSession*/EndSession message; - - if (cb) { - setCallbackNoData(MessageType_Success, std::move(cb)); - } - makeCall(message); } -void TrezorDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX, AsyncCallBackCall&& cb /*= nullptr*/) +void TrezorDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX) { currentTxSignReq_.reset(new bs::core::wallet::TXSignRequest(reqTX)); - logger_->debug("[TrezorDevice] SignTX - specify init data to " + features_.label()); + logger_->debug("[TrezorDevice::signTX] specify init data to {}", features_->label()); bitcoin::SignTx message; message.set_inputs_count(currentTxSignReq_->armorySigner_.getTxInCount()); message.set_outputs_count(currentTxSignReq_->armorySigner_.getTxOutCount()); if (testNet_) { - message.set_coin_name(tesNetCoin); - } - - if (cb) { - setDataCallback(MessageType_TxRequest, std::move(cb)); + message.set_coin_name(kTesNetCoin); } - - awaitingTransaction_ = {}; - makeCall(message); + const auto& cb = [this, reqTX](const std::shared_ptr& data) + { + const auto& reply = std::dynamic_pointer_cast(data); + if (!reply) { + logger_->error("[TrezorDevice::signTX] invalid callback data"); + return; + } + // According to architecture, Trezor allow us to sign tx with incorrect + // passphrase, so let's check that the final tx is correct. In Ledger case + // this situation is impossible, since the wallets with different passphrase will be treated + // as different devices, which will be verified in sign part. + try { + std::map> utxoMap; + for (unsigned i = 0; i < reqTX.armorySigner_.getTxInCount(); i++) { + const auto& utxo = reqTX.armorySigner_.getSpender(i)->getUtxo(); + auto& idMap = utxoMap[utxo.getTxHash()]; + idMap.emplace(utxo.getTxOutIndex(), utxo); + } + unsigned flags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_SEGWIT | SCRIPT_VERIFY_P2SH_SHA256; + bool validSign = Armory::Signer::Signer::verify(SecureBinaryData::fromString(reply->signedTX) + , utxoMap, flags, true).isValid(); + if (!validSign) { + SPDLOG_LOGGER_ERROR(logger_, "sign verification failed"); + operationFailed("Signing failed. Please ensure you typed the correct passphrase."); + return; + } + } + catch (const std::exception& e) { + SPDLOG_LOGGER_ERROR(logger_, "sign verification failed: {}", e.what()); + operationFailed("Signing failed. Please ensure you typed the correct passphrase."); + return; + } + cb_->txSigned(SecureBinaryData::fromString(reply->signedTX)); + }; + makeCall(message, cb); } -void TrezorDevice::retrieveXPubRoot(AsyncCallBack&& cb) +void TrezorDevice::retrieveXPubRoot() { - // Fetching walletId - logger_->debug("[TrezorDevice] init - start retrieving root public key from device " - + features_.label()); + logger_->debug("[TrezorDevice::retrieveXPubRoot] start retrieving root public" + " key from device {}", features_->label()); bitcoin::GetPublicKey message; message.add_address_n(bs::hd::hardFlag); if (testNet_) { - message.set_coin_name(tesNetCoin); + message.set_coin_name(kTesNetCoin); } - auto saveXpubRoot = [caller = QPointer(this), cb = std::move(cb)](QVariant&& data) { - if (!caller) { + const auto& saveXpubRoot = [this](const std::shared_ptr& data) + { + const auto& reply = std::dynamic_pointer_cast(data); + if (!reply) { + logger_->error("[TrezorDevice::retrieveXPubRoot] invalid callback data"); return; } - - caller->xpubRoot_ = data.toByteArray().toStdString(); - if (cb) { - cb(); - } + xpubRoot_ = BinaryData::fromString(reply->xpub); }; - - setDataCallback(MessageType_PublicKey, std::move(saveXpubRoot)); - makeCall(message); + makeCall(message, saveXpubRoot); } -void TrezorDevice::makeCall(const google::protobuf::Message &msg) +void TrezorDevice::makeCall(const google::protobuf::Message &msg + , const bs::WorkerPool::callback& cb) { - client_->call(packMessage(msg), [this](QVariant&& answer) { - if (answer.isNull()) { - emit operationFailed(QLatin1String("Network error")); - resetCaches(); + if (state_ == trezor::State::None) { + init(); + } + const auto& cbWrap = [this, cb](const std::shared_ptr& data) + { + const auto& reply = std::static_pointer_cast(data); + if (!reply || !reply->error.empty()) { + logger_->error("[TrezorDevice::makeCall] network error: {}", reply ? reply->error : ""); + //emit operationFailed(QLatin1String("Network error")); + reset(); + return; } - - MessageData data = unpackMessage(answer.toByteArray()); - handleMessage(data); - }); + const auto& msg = unpackMessage(QByteArray::fromStdString(reply->response)); + handleMessage(msg, cb); + }; + auto inData = std::make_shared(); + inData->path = "/call/" + data_.sessionId; + inData->input = packMessage(msg).toStdString(); + processQueued(inData, cbWrap); } -void TrezorDevice::handleMessage(const MessageData& data) +void TrezorDevice::handleMessage(const trezor::MessageData& data, const bs::WorkerPool::callback& cb) { - switch (static_cast(data.msg_type_)) { + switch (static_cast(data.type)) { case MessageType_Success: { common::Success success; @@ -333,32 +410,33 @@ void TrezorDevice::handleMessage(const MessageData& data) break; case MessageType_Failure: { + state_ = trezor::State::None; common::Failure failure; if (parseResponse(failure, data)) { - logger_->debug("[TrezorDevice] handleMessage last message failure " - + getJSONReadableMessage(failure)); + logger_->warn("[TrezorDevice::handleMessage] last message failure: {}" + , getJSONReadableMessage(failure)); } - sendTxMessage(QString::fromStdString(failure.message())); - resetCaches(); + sendTxMessage(failure.message()); + reset(); switch (failure.code()) { case common::Failure_FailureType_Failure_ActionCancelled: - emit cancelledOnDevice(); + cancelledOnDevice(); break; case common::Failure_FailureType_Failure_PinInvalid: - emit invalidPin(); + invalidPin(); break; default: - emit operationFailed(QString::fromStdString(failure.message())); + operationFailed(failure.message()); break; } } break; case MessageType_Features: { - if (parseResponse(features_, data)) { + if (parseResponse(*features_, data)) { logger_->debug("[TrezorDevice] handleMessage Features, model: '{}' - {}.{}.{}" - , features_.model(), features_.major_version(), features_.minor_version(), features_.patch_version()); + , features_->model(), features_->major_version(), features_->minor_version(), features_->patch_version()); // + getJSONReadableMessage(features_)); } } @@ -372,7 +450,7 @@ void TrezorDevice::handleMessage(const MessageData& data) } common::ButtonAck response; makeCall(response); - sendTxMessage(HWInfoStatus::kPressButton); + sendTxMessage(/*HWInfoStatus::kPressButton*/"press the button"); txSignedByUser_ = true; } break; @@ -380,8 +458,8 @@ void TrezorDevice::handleMessage(const MessageData& data) { common::PinMatrixRequest request; if (parseResponse(request, data)) { - emit requestPinMatrix(); - sendTxMessage(HWInfoStatus::kRequestPin); + requestPinMatrix(); + sendTxMessage(/*HWInfoStatus::kRequestPin*/"enter pin"); } } break; @@ -389,8 +467,8 @@ void TrezorDevice::handleMessage(const MessageData& data) { common::PassphraseRequest request; if (parseResponse(request, data)) { - emit requestHWPass(hasCapability(management::Features_Capability_Capability_PassphraseEntry)); - sendTxMessage(HWInfoStatus::kRequestPassphrase); + requestHWPass(hasCapability(management::Features_Capability_Capability_PassphraseEntry)); + sendTxMessage(/*HWInfoStatus::kRequestPassphrase*/"enter passphrase"); } } break; @@ -398,10 +476,15 @@ void TrezorDevice::handleMessage(const MessageData& data) { bitcoin::PublicKey publicKey; if (parseResponse(publicKey, data)) { - logger_->debug("[TrezorDevice] handleMessage PublicKey" //); - + getJSONReadableMessage(publicKey)); + logger_->debug("[TrezorDevice::handleMessage] PublicKey: {}" + , getJSONReadableMessage(publicKey)); + } + if (cb) { + const auto& outData = std::make_shared(); + outData->xpub = publicKey.xpub(); + cb(outData); + return; } - dataCallback(MessageType_PublicKey, QByteArray::fromStdString(publicKey.xpub())); } break; case MessageType_Address: @@ -412,75 +495,45 @@ void TrezorDevice::handleMessage(const MessageData& data) break; case MessageType_TxRequest: { - handleTxRequest(data); - sendTxMessage(txSignedByUser_ ? HWInfoStatus::kReceiveSignedTx : HWInfoStatus::kTransaction); + handleTxRequest(data, cb); + sendTxMessage(txSignedByUser_ ? /*HWInfoStatus::kReceiveSignedTx*/"signed TX" + : /*HWInfoStatus::kTransaction*/"transaction"); } - break; + return; default: - { - logger_->debug("[TrezorDevice] handleMessage " + std::to_string(data.msg_type_) + " - Unhandled message type"); - } + logger_->info("[TrezorDevice::handleMessage] {} - Unhandled message type", data.type); break; } - - callbackNoData(static_cast(data.msg_type_)); + if (cb) { + const auto& noData = std::make_shared(); + noData->msgType = static_cast(data.type); + cb(noData); + } } -bool TrezorDevice::parseResponse(google::protobuf::Message &msg, const MessageData& data) +bool TrezorDevice::parseResponse(google::protobuf::Message &msg, const trezor::MessageData& data) { - bool ok = msg.ParseFromString(data.message_); + bool ok = msg.ParseFromString(data.message); if (ok) { - logger_->debug("[TrezorDevice] handleMessage " + - std::to_string(data.msg_type_) + " - successfully parsed response"); + logger_->debug("[TrezorDevice::parseResponse] {} - successfully parsed " + "response", data.type); } else { - logger_->debug("[TrezorDevice] handleMessage " + - std::to_string(data.msg_type_) + " - failed to parse response"); + logger_->error("[TrezorDevice::parseResponse] {} - failed to parse response" + , data.type); } - return ok; } -void TrezorDevice::resetCaches() +void TrezorDevice::reset() { - awaitingCallbackNoData_.clear(); - awaitingCallbackData_.clear(); - currentTxSignReq_.reset(nullptr); - awaitingTransaction_ = {}; + currentTxSignReq_.reset(); + awaitingSignedTX_.clear(); awaitingWalletInfo_ = {}; } -void TrezorDevice::setCallbackNoData(MessageType type, AsyncCallBack&& cb) -{ - awaitingCallbackNoData_[type] = std::move(cb); -} - -void TrezorDevice::callbackNoData(MessageType type) -{ - auto iAwaiting = awaitingCallbackNoData_.find(type); - if (iAwaiting != awaitingCallbackNoData_.end()) { - auto cb = std::move(iAwaiting->second); - awaitingCallbackNoData_.erase(iAwaiting); - cb(); - } -} - -void TrezorDevice::setDataCallback(MessageType type, AsyncCallBackCall&& cb) -{ - awaitingCallbackData_[type] = std::move(cb); -} - -void TrezorDevice::dataCallback(MessageType type, QVariant&& response) -{ - auto iAwaiting = awaitingCallbackData_.find(type); - if (iAwaiting != awaitingCallbackData_.end()) { - auto cb = std::move(iAwaiting->second); - awaitingCallbackData_.erase(iAwaiting); - cb(std::move(response)); - } -} - -void TrezorDevice::handleTxRequest(const MessageData& data) +void TrezorDevice::handleTxRequest(const trezor::MessageData& data + , const bs::WorkerPool::callback& cb) { assert(currentTxSignReq_); bitcoin::TxRequest txRequest; @@ -490,7 +543,7 @@ void TrezorDevice::handleTxRequest(const MessageData& data) } if (txRequest.has_serialized() && txRequest.serialized().has_serialized_tx()) { - awaitingTransaction_.signedTx += txRequest.serialized().serialized_tx(); + awaitingSignedTX_ += txRequest.serialized().serialized_tx(); } bitcoin::TxAck txAck; @@ -661,9 +714,13 @@ void TrezorDevice::handleTxRequest(const MessageData& data) break; case bitcoin::TxRequest_RequestType_TXFINISHED: { - dataCallback(MessageType_TxRequest, QVariant::fromValue<>(awaitingTransaction_)); - sendTxMessage(HWInfoStatus::kTransactionFinished); - resetCaches(); + if (cb) { + const auto& txOut = std::make_shared(); + txOut->signedTX = awaitingSignedTX_; + cb(txOut); + } + sendTxMessage(/*HWInfoStatus::kTransactionFinished*/"TX finished"); + reset(); } break; default: @@ -671,13 +728,12 @@ void TrezorDevice::handleTxRequest(const MessageData& data) } } -void TrezorDevice::sendTxMessage(const QString& status) +void TrezorDevice::sendTxMessage(const std::string &status) { if (!currentTxSignReq_) { return; } - - emit deviceTxStatusChanged(status); + //emit deviceTxStatusChanged(status); } Tx TrezorDevice::prevTx(const bitcoin::TxRequest &txRequest) @@ -694,40 +750,40 @@ Tx TrezorDevice::prevTx(const bitcoin::TxRequest &txRequest) } } -bool TrezorDevice::hasCapability(management::Features::Capability cap) const +bool TrezorDevice::hasCapability(const management::Features_Capability& cap) const { - return std::find(features_.capabilities().begin(), features_.capabilities().end(), cap) - != features_.capabilities().end(); + return std::find(features_->capabilities().begin(), features_->capabilities().end(), cap) + != features_->capabilities().end(); } bool TrezorDevice::isFirmwareSupported() const { - auto verIt = kMinVersion.find(features_.model()); + auto verIt = kMinVersion.find(features_->model()); if (verIt == kMinVersion.end()) { return false; } const auto &minVer = verIt->second; - if (features_.major_version() > minVer[0]) { + if (features_->major_version() > minVer[0]) { return true; } - if (features_.major_version() < minVer[0]) { + if (features_->major_version() < minVer[0]) { return false; } - if (features_.minor_version() > minVer[1]) { + if (features_->minor_version() > minVer[1]) { return true; } - if (features_.minor_version() < minVer[1]) { + if (features_->minor_version() < minVer[1]) { return false; } - return features_.patch_version() >= minVer[2]; + return features_->patch_version() >= minVer[2]; } std::string TrezorDevice::firmwareSupportedVersion() const { - auto verIt = kMinVersion.find(features_.model()); + auto verIt = kMinVersion.find(features_->model()); if (verIt == kMinVersion.end()) { - return fmt::format("Unknown model: {}", features_.model()); + return fmt::format("Unknown model: {}", features_->model()); } const auto &minVer = verIt->second; return fmt::format("Please update wallet firmware to version {}.{}.{} or later" diff --git a/BlockSettleHW/trezor/trezorDevice.h b/BlockSettleHW/trezor/trezorDevice.h index 905baa233..59d943593 100644 --- a/BlockSettleHW/trezor/trezorDevice.h +++ b/BlockSettleHW/trezor/trezorDevice.h @@ -11,17 +11,10 @@ #ifndef TREZORDEVICE_H #define TREZORDEVICE_H +#include "Message/Worker.h" #include "trezorStructure.h" #include "hwdeviceinterface.h" -#include -#include -#include - -// Trezor interface (source - https://github.com/trezor/trezor-common/tree/master/protob) -#include "trezor/generated_proto/messages.pb.h" -#include "trezor/generated_proto/messages-management.pb.h" -#include "trezor/generated_proto/messages-common.pb.h" -#include "trezor/generated_proto/messages-bitcoin.pb.h" +#include "trezorClient.h" namespace spdlog { class logger; @@ -32,87 +25,105 @@ namespace bs { struct TXSignRequest; } } - namespace sync { - class WalletsManager; - } } -class QNetworkRequest; -class TrezorClient; - -class TrezorDevice : public HwDeviceInterface -{ - Q_OBJECT - -public: - TrezorDevice(const std::shared_ptr & - , std::shared_ptr, bool testNet - , const QPointer &, QObject* parent = nullptr); - ~TrezorDevice() override; - - DeviceKey key() const override; - DeviceType type() const override; - - // lifecycle - void init(AsyncCallBack&& cb = nullptr) override; - void cancel() override; - void clearSession(AsyncCallBack&& cb = nullptr) override; - - // operation - void getPublicKey(AsyncCallBackCall&& cb = nullptr) override; - void signTX(const bs::core::wallet::TXSignRequest& reqTX, AsyncCallBackCall&& cb = nullptr) override; - void retrieveXPubRoot(AsyncCallBack&& cb) override; - - // Management - void setMatrixPin(const std::string& pin) override; - void setPassword(const std::string& password, bool enterOnDevice) override; - - // State - bool isBlocked() override { - // There is no blocking state for Trezor - return false; +namespace hw { + namespace trezor { + namespace messages { + namespace bitcoin { + class TxRequest; + } + namespace management { + class Features; + enum Features_Capability: int; + } + enum MessageType: int; + } } +} -private: - void makeCall(const google::protobuf::Message &msg); - - void handleMessage(const MessageData& data); - bool parseResponse(google::protobuf::Message &msg, const MessageData& data); - - // callbacks - void resetCaches(); - - void setCallbackNoData(hw::trezor::messages::MessageType, AsyncCallBack&& cb); - void callbackNoData(hw::trezor::messages::MessageType); - - void setDataCallback(hw::trezor::messages::MessageType, AsyncCallBackCall&& cb); - void dataCallback(hw::trezor::messages::MessageType, QVariant&& response); - - void handleTxRequest(const MessageData& data); - void sendTxMessage(const QString& status); - - // Returns previous Tx for legacy inputs - // Trezor could request non-existing hash if wrong passphrase entered - Tx prevTx(const hw::trezor::messages::bitcoin::TxRequest &txRequest); - -private: - bool hasCapability(hw::trezor::messages::management::Features::Capability cap) const; - - bool isFirmwareSupported() const; - std::string firmwareSupportedVersion() const; - - std::shared_ptr logger_; - std::shared_ptr walletManager_; - - QPointer client_{}; - hw::trezor::messages::management::Features features_{}; - bool testNet_{}; - std::unique_ptr currentTxSignReq_; - HWSignedTx awaitingTransaction_; - HwWalletWrapper awaitingWalletInfo_; - - bool txSignedByUser_ = false; - std::unordered_map awaitingCallbackNoData_; - std::unordered_map awaitingCallbackData_; -}; - +namespace bs { + namespace hww { + + class TrezorDevice : public DeviceInterface, protected WorkerPool + { + public: + TrezorDevice(const std::shared_ptr&, const trezor::DeviceData& + , bool testNet, DeviceCallbacks*, const std::string& endpoint); + ~TrezorDevice() override; + + trezor::DeviceData data() const { return data_; } + DeviceKey key() const override; + DeviceType type() const override; + + // lifecycle + void init() override; + void cancel() override; + void clearSession() override; + void releaseConnection(); + + // operation + void getPublicKey() override; + void signTX(const bs::core::wallet::TXSignRequest& reqTX) override; + void retrieveXPubRoot() override; + + // Management + void setMatrixPin(const SecureBinaryData& pin) override; + void setPassword(const SecureBinaryData& password, bool enterOnDevice) override; + + // State + bool isBlocked() const override { + // There is no blocking state for Trezor + return false; + } + + protected: + std::shared_ptr worker(const std::shared_ptr&) override final; + + // operation result informing + void publicKeyReady() override {} //TODO: implement + void deviceTxStatusChanged(const std::string& status) override {} //TODO: implement + void operationFailed(const std::string& reason) override; + void requestForRescan() override {} //TODO: implement + + // Management + void requestPinMatrix() override {} //TODO: implement + void requestHWPass(bool allowedOnDevice) override {} //TODO: implement + void cancelledOnDevice() override {} //TODO: implement + void invalidPin() override {} //TODO: implement + + private: + void makeCall(const google::protobuf::Message&, const bs::WorkerPool::callback& cb = nullptr); + void handleMessage(const trezor::MessageData&, const bs::WorkerPool::callback& cb = nullptr); + bool parseResponse(google::protobuf::Message&, const trezor::MessageData&); + + void reset(); + + void handleTxRequest(const trezor::MessageData&, const bs::WorkerPool::callback& cb); + void sendTxMessage(const std::string& status); + + // Returns previous Tx for legacy inputs + // Trezor could request non-existing hash if wrong passphrase entered + Tx prevTx(const ::hw::trezor::messages::bitcoin::TxRequest& txRequest); + + bool hasCapability(const ::hw::trezor::messages::management::Features_Capability&) const; + bool isFirmwareSupported() const; + std::string firmwareSupportedVersion() const; + + private: + std::shared_ptr logger_; + const trezor::DeviceData data_; + const bool testNet_; + DeviceCallbacks* cb_{ nullptr }; + const std::string endpoint_; + trezor::State state_{ trezor::State::None }; + std::shared_ptr<::hw::trezor::messages::management::Features> features_{}; + + std::unique_ptr currentTxSignReq_; + bs::core::wallet::HwWalletInfo awaitingWalletInfo_; + std::string awaitingSignedTX_; + bool txSignedByUser_{ false }; + }; + + } //hw +} //bs #endif // TREZORDEVICE_H diff --git a/BlockSettleHW/trezor/trezorStructure.h b/BlockSettleHW/trezor/trezorStructure.h index 0b71a300d..f69c5d13f 100644 --- a/BlockSettleHW/trezor/trezorStructure.h +++ b/BlockSettleHW/trezor/trezorStructure.h @@ -11,26 +11,50 @@ #ifndef TREZORSTRUCTURE_H #define TREZORSTRUCTURE_H -#include "hwcommonstructure.h" - -enum class State { - None = 0, - Init, - Enumerated, - Acquired, - Released -}; - -struct MessageData -{ - int msg_type_ = -1; - int length_ = -1; - std::string message_; -}; - -namespace HWInfoStatus { - const QString kRequestPassphrase = QObject::tr("Please enter the trezor passphrase"); - const QString kRequestPin = QObject::tr("Please enter the pin from device"); -} +#include + +namespace bs { + namespace hww { + namespace trezor { + + struct DeviceData + { + std::string path; + std::string vendor; + std::string product; + std::string sessionId; + std::string debug; + std::string debugSession; + }; + + enum class State { + None = 0, + Init, + Enumerated, + Acquired, + Released + }; + + struct MessageData + { + int type = -1; + int length = -1; + std::string message; + }; + + enum class InfoStatus { + Unknown, + RequestPassphrase, + RequestPIN + }; + + } //trezor + } //hw +} //bs + +//namespace HWInfoStatus { + //const QString kRequestPassphrase = QObject::tr("Please enter the trezor passphrase"); + //const QString kRequestPin = QObject::tr("Please enter the pin from device"); +//} #endif // TREZORSTRUCTURE_H diff --git a/BlockSettleUILib/UiUtils.cpp b/BlockSettleUILib/UiUtils.cpp index a2d8948ce..42f8479a2 100644 --- a/BlockSettleUILib/UiUtils.cpp +++ b/BlockSettleUILib/UiUtils.cpp @@ -243,7 +243,8 @@ int UiUtils::fillHDWalletsComboBox(QComboBox* comboBox, const std::shared_ptrcanMixLeaves()) { - if (hdWallet->isHardwareOfflineWallet() && !(walletTypes & WalletsTypes::WatchOnly)) { + if (hdWallet->isHardwareWallet() && hdWallet->isOffline() && + !(walletTypes & WalletsTypes::WatchOnly)) { continue; } diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ae09cf1d..430418163 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,7 @@ ELSE() ENDIF() add_definitions(-DNOMINMAX) +add_definitions(-DCURL_STATICLIB) # Force Armory to ignore Crypto++ and use libbtc instead. add_definitions(-DLIBBTC_ONLY) @@ -356,6 +357,25 @@ IF( NOT MPIR_LIB) MESSAGE( FATAL_ERROR "Could not find MPIR lib in ${MPIR_LIB_DIR}") ENDIF() + +SET(CURL_ROOT ${THIRD_PARTY_COMMON_DIR}/curl) +SET(CURL_INCLUDE_DIR ${CURL_ROOT}/include) + +set(CURL_LIBRARY "-lcurl") +find_package(CURL REQUIRED) + +IF (WIN32) + SET(CURL_LIB_NAME libcurl-d.lib libcurl.lib) +ELSE(WIN32) + SET(CURL_LIB_NAME libcurl-d.a libcurl.a curl-d curl) +ENDIF(WIN32) + +FIND_LIBRARY( CURL_LIB NAMES ${CURL_LIB_NAME} PATHS ${CURL_ROOT}/lib NO_DEFAULT_PATH ) +IF( NOT CURL_LIB) + MESSAGE( FATAL_ERROR "Could not find curl lib in ${CURL_ROOT}/lib") +ENDIF() + + IF(BUILD_TESTS) SET(GTEST_PACKAGE_ROOT ${THIRD_PARTY_COMMON_DIR}/Gtest) INCLUDE_DIRECTORIES( ${GTEST_PACKAGE_ROOT}/include ) @@ -854,10 +874,9 @@ ADD_SUBDIRECTORY(common/WalletsLib) ADD_SUBDIRECTORY(common/cppForSwig) ADD_SUBDIRECTORY(common/CommonLib) ADD_SUBDIRECTORY(CommonUI) -#ADD_SUBDIRECTORY(BlockSettleHW) +ADD_SUBDIRECTORY(BlockSettleHW) ADD_SUBDIRECTORY(BlockSettleApp) -#ADD_SUBDIRECTORY(BlockSettleSigner) IF(BUILD_TESTS) ADD_SUBDIRECTORY(UnitTests) diff --git a/Core/TerminalMessage.h b/Core/TerminalMessage.h index 3ec4c2e45..bdbe1ee9f 100644 --- a/Core/TerminalMessage.h +++ b/Core/TerminalMessage.h @@ -48,6 +48,7 @@ namespace bs { OnChainTracker,// Auth & CC tracker combined in one adapter Settlement, // All settlements (FX, XBT, CC) for both dealer and requester Chat, // Chat network routines + HWWallets, // Hardware wallets device manager UsersCount }; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 6d27fd715..ffab8fc2f 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -975,6 +975,16 @@ QStringList QtQuickAdapter::settingEnvironments() const return { tr("Main"), tr("Test") }; } +HwDeviceModel* QtQuickAdapter::devices() +{ + return nullptr; +} + +bool QtQuickAdapter::scanningDevices() const +{ + return false; +} + QStringList QtQuickAdapter::newSeedPhrase() { auto seed = CryptoPRNG::generateRandom(16); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index be3df139e..a5b2ea3d8 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -17,11 +17,12 @@ #include "AddressListModel.h" #include "ApiAdapter.h" #include "ApplicationSettings.h" -#include "Wallets/SignContainer.h" +#include "hwdevicemodel.h" #include "ThreadSafeClasses.h" #include "TxInputsModel.h" #include "TxListModel.h" #include "UiUtils.h" +#include "Wallets/SignContainer.h" namespace bs { namespace gui { @@ -149,6 +150,11 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_PROPERTY(int armoryState READ armoryState NOTIFY armoryStateChanged) int armoryState() const { return armoryState_; } + Q_PROPERTY(HwDeviceModel* devices READ devices NOTIFY devicesChanged) + HwDeviceModel* devices(); + Q_PROPERTY(bool scanningDevices READ scanningDevices NOTIFY scanningChanged) + bool scanningDevices() const; + // QML-invokable methods Q_INVOKABLE QStringList newSeedPhrase(); Q_INVOKABLE void copySeedToClipboard(const QStringList&); @@ -172,6 +178,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void addressGenerated(); void settingChanged(); void armoryStateChanged(); + void devicesChanged(); + void scanningChanged(); private slots: void walletSelected(int); diff --git a/GUI/QtQuick/hwcommonstructure.cpp b/GUI/QtQuick/hwcommonstructure.cpp index 5243a6dfd..8832a9675 100644 --- a/GUI/QtQuick/hwcommonstructure.cpp +++ b/GUI/QtQuick/hwcommonstructure.cpp @@ -10,28 +10,3 @@ */ #include "hwcommonstructure.h" -using namespace bs::hd; - -Path getDerivationPath(bool testNet, Purpose element) -{ - Path path; - path.append(hardFlag | element); - path.append(testNet ? CoinType::Bitcoin_test : CoinType::Bitcoin_main); - path.append(hardFlag); - return path; -} - -bool isNestedSegwit(const bs::hd::Path& path) -{ - return path.get(0) == (bs::hd::Purpose::Nested | bs::hd::hardFlag); -} - -bool isNativeSegwit(const bs::hd::Path& path) -{ - return path.get(0) == (bs::hd::Purpose::Native | bs::hd::hardFlag); -} - -bool isNonSegwit(const bs::hd::Path& path) -{ - return path.get(0) == (bs::hd::Purpose::NonSegWit | bs::hd::hardFlag); -} diff --git a/GUI/QtQuick/hwcommonstructure.h b/GUI/QtQuick/hwcommonstructure.h index 6448d7ed4..360e967b3 100644 --- a/GUI/QtQuick/hwcommonstructure.h +++ b/GUI/QtQuick/hwcommonstructure.h @@ -17,41 +17,7 @@ #include #include #include "CoreWallet.h" -#include "HDPath.h" -using AsyncCallBack = std::function; -using AsyncCallBackCall = std::function; - -// There is no way to determinate difference between ledger devices -// so we use vendor name for identification -const std::string kDeviceLedgerId = "Ledger"; - -struct DeviceData -{ - QByteArray path_ = {}; - QByteArray vendor_ = {}; - QByteArray product_ = {}; - QByteArray sessionId_ = {}; - QByteArray debug_ = {}; - QByteArray debugSession_ = {}; -}; - -enum class DeviceType { - None = 0, - HWLedger, - HWTrezor -}; - -struct DeviceKey -{ - QString deviceLabel_; - QString deviceId_; - QString vendor_; - QString walletId_; - QString status_; - - DeviceType type_ = DeviceType::None; -}; class HwWalletWrapper { Q_GADGET @@ -80,11 +46,6 @@ struct HWSignedTx { }; Q_DECLARE_METATYPE(HWSignedTx) -bs::hd::Path getDerivationPath(bool testNet, bs::hd::Purpose element); -bool isNestedSegwit(const bs::hd::Path& path); -bool isNativeSegwit(const bs::hd::Path& path); -bool isNonSegwit(const bs::hd::Path& path); - namespace HWInfoStatus { const QString kPressButton = QObject::tr("Confirm transaction output(s) on your device"); const QString kTransaction = QObject::tr("Loading transaction to your device...."); diff --git a/GUI/QtQuick/hwdevicemodel.cpp b/GUI/QtQuick/hwdevicemodel.cpp index f465caad0..8778ae8a4 100644 --- a/GUI/QtQuick/hwdevicemodel.cpp +++ b/GUI/QtQuick/hwdevicemodel.cpp @@ -12,8 +12,7 @@ HwDeviceModel::HwDeviceModel(QObject *parent /*= nullptr*/) : QAbstractItemModel(parent) -{ -} +{} QVariant HwDeviceModel::data(const QModelIndex& index, int role /*= Qt::DisplayRole*/) const { @@ -22,11 +21,14 @@ QVariant HwDeviceModel::data(const QModelIndex& index, int role /*= Qt::DisplayR } const int row = index.row(); +#ifdef BUILD_HW_WALLETS if (row < 0 || row > devices_.size()) { assert(false); return {}; } +#endif +#ifdef BUILD_HW_WALLETS switch (static_cast(role)) { case HwDeviceRoles::DeviceId: @@ -42,7 +44,7 @@ QVariant HwDeviceModel::data(const QModelIndex& index, int role /*= Qt::DisplayR default: break; } - +#endif return {}; } @@ -66,7 +68,11 @@ QModelIndex HwDeviceModel::parent(const QModelIndex& index) const int HwDeviceModel::rowCount(const QModelIndex& parent /*= QModelIndex()*/) const { +#ifdef BUILD_HW_WALLETS return devices_.size(); +#else + return 0; +#endif } int HwDeviceModel::columnCount(const QModelIndex& parent /*= QModelIndex()*/) const @@ -74,6 +80,7 @@ int HwDeviceModel::columnCount(const QModelIndex& parent /*= QModelIndex()*/) co return 1; } +#ifdef BUILD_HW_WALLETS void HwDeviceModel::resetModel(QVector&& deviceKeys) { beginResetModel(); @@ -101,9 +108,11 @@ int HwDeviceModel::getDeviceIndex(DeviceKey key) return -1; } +#endif int HwDeviceModel::toppestImport() const { +#ifdef BUILD_HW_WALLETS if (devices_.empty()) { return -1; } @@ -113,7 +122,7 @@ int HwDeviceModel::toppestImport() const return i; } } - +#endif return -1; } diff --git a/GUI/QtQuick/hwdevicemodel.h b/GUI/QtQuick/hwdevicemodel.h index d33510d9a..1e3fb89eb 100644 --- a/GUI/QtQuick/hwdevicemodel.h +++ b/GUI/QtQuick/hwdevicemodel.h @@ -38,9 +38,11 @@ class HwDeviceModel : public QAbstractItemModel QHash roleNames() const override; +#ifdef BUILD_HW_WALLETS void resetModel(QVector&& deviceKey); DeviceKey getDevice(int index); int getDeviceIndex(DeviceKey key); +#endif Q_INVOKABLE int toppestImport() const; @@ -48,7 +50,9 @@ class HwDeviceModel : public QAbstractItemModel void toppestImportChanged(); private: +#ifdef BUILD_HW_WALLETS QVector devices_; +#endif }; Q_DECLARE_METATYPE(HwDeviceModel*) From 9e072131eb15f98bee9de25d5c377f40dc303c43 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 10 Jan 2023 09:38:56 +0300 Subject: [PATCH 037/436] build fixes --- BlockSettleApp/CMakeLists.txt | 4 ++- BlockSettleApp/main.cpp | 3 ++ BlockSettleHW/hwdevicemanager.cpp | 58 +++++++++++++++++++++++++------ BlockSettleHW/hwdevicemanager.h | 3 +- generate.py | 2 ++ 5 files changed, 58 insertions(+), 12 deletions(-) diff --git a/BlockSettleApp/CMakeLists.txt b/BlockSettleApp/CMakeLists.txt index b520e142b..576c70b33 100644 --- a/BlockSettleApp/CMakeLists.txt +++ b/BlockSettleApp/CMakeLists.txt @@ -19,6 +19,7 @@ INCLUDE_DIRECTORIES( ${BLOCKSETTLE_UI_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${BS_NETWORK_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${BS_COMMON_ENUMS_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${BS_COMMUNICATION_INCLUDE_DIR} ) +INCLUDE_DIRECTORIES( ${BS_HW_LIB_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${WALLET_LIB_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${CRYPTO_LIB_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${BOTAN_INCLUDE_DIR} ) @@ -48,11 +49,12 @@ ENDIF () TARGET_LINK_LIBRARIES( ${BLOCKSETTLE_APP_NAME} ${TERMINAL_CORE_NAME} -# ${BLOCKSETTLE_HW_LIBRARY_NAME} + ${BLOCKSETTLE_HW_LIBRARY_NAME} ${TERMINAL_GUI_QT_NAME} ${TERMINAL_GUI_QTQUICK_NAME} ${BLOCKSETTLE_UI_LIBRARY_NAME} ${BS_NETWORK_LIB_NAME} + ${CURL_LIB} ${CPP_WALLET_LIB_NAME} ${CRYPTO_LIB_NAME} ${BOTAN_LIB} diff --git a/BlockSettleApp/main.cpp b/BlockSettleApp/main.cpp index 802c8d2d3..2f0f6abfc 100644 --- a/BlockSettleApp/main.cpp +++ b/BlockSettleApp/main.cpp @@ -29,6 +29,7 @@ #include "ApiJson.h" #include "AssetsAdapter.h" #include "BsServerAdapter.h" +#include "hwdevicemanager.h" #include "QtGuiAdapter.h" #include "QtQuickAdapter.h" #include "SettingsAdapter.h" @@ -207,6 +208,8 @@ int main(int argc, char** argv) //inprocBus.addAdapter(std::make_shared(logMgr->logger())); inprocBus.addAdapterWithQueue(std::make_shared(logMgr->logger() , userWallets, signAdapter->createClient(), userBlockchain), "wallets"); + inprocBus.addAdapterWithQueue(std::make_shared( + logMgr->logger()), "wallets"); inprocBus.addAdapter(std::make_shared(logMgr->logger("bscon"))); //inprocBus.addAdapter(std::make_shared(logMgr->logger("match"))); //inprocBus.addAdapter(std::make_shared(logMgr->logger("settl"))); diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index 521af3d7b..a450668d0 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -19,19 +19,18 @@ #include "common.pb.h" #include "hardware_wallet.pb.h" +#include "terminal.pb.h" //using namespace Armory::Signer; using namespace bs::hww; using namespace BlockSettle::Common; +using namespace BlockSettle::Terminal; DeviceManager::DeviceManager(const std::shared_ptr& logger) - : logger_(logger), testNet_(true) + : logger_(logger) , user_(std::make_shared(bs::message::TerminalUsers::HWWallets)) , userWallets_(std::make_shared(bs::message::TerminalUsers::Wallets)) -{ - trezorClient_ = std::make_unique(logger_, testNet_, this); - ledgerClient_ = std::make_unique(logger_, testNet_, this); -} +{} DeviceManager::~DeviceManager() { @@ -45,6 +44,8 @@ bs::message::ProcessingResult DeviceManager::process(const bs::message::Envelope } else { switch (env.sender->value()) { + case bs::message::TerminalUsers::Settings: + return processSettings(env); case bs::message::TerminalUsers::Wallets: return processWallet(env); default: break; @@ -116,8 +117,18 @@ void DeviceManager::cancel(const DeviceKey& key) device->cancel(); } -void bs::hww::DeviceManager::start() +void DeviceManager::start() { + logger_->debug("[hww::DeviceManager::start]"); + SettingsMessage msg; + auto msgReq = msg.mutable_get_request(); + auto setReq = msgReq->add_requests(); + setReq->set_source(SettingSource_Local); + setReq->set_index(SetIdx_NetType); + setReq->set_type(SettingType_Int); + + pushRequest(user_, std::make_shared(bs::message::TerminalUsers::Settings) + , msg.SerializeAsString()); } bs::message::ProcessingResult DeviceManager::processPrepareDeviceForSign(const bs::message::Envelope& env @@ -130,12 +141,15 @@ bs::message::ProcessingResult DeviceManager::processPrepareDeviceForSign(const b return bs::message::ProcessingResult::Success; } -bs::message::ProcessingResult bs::hww::DeviceManager::processOwnRequest(const bs::message::Envelope&) +bs::message::ProcessingResult DeviceManager::processOwnRequest(const bs::message::Envelope& env) { - return bs::message::ProcessingResult(); + if (!trezorClient_ || !ledgerClient_) { + return bs::message::ProcessingResult::Retry; + } + return bs::message::ProcessingResult::Ignored; } -bs::message::ProcessingResult bs::hww::DeviceManager::processWallet(const bs::message::Envelope& env) +bs::message::ProcessingResult DeviceManager::processWallet(const bs::message::Envelope& env) { WalletsMessage msg; if (!msg.ParseFromString(env.message)) { @@ -150,6 +164,28 @@ bs::message::ProcessingResult bs::hww::DeviceManager::processWallet(const bs::me return bs::message::ProcessingResult::Ignored; } +bs::message::ProcessingResult DeviceManager::processSettings(const bs::message::Envelope& env) +{ + SettingsMessage msg; + if (!msg.ParseFromString(env.message)) { + logger_->error("[hww::DeviceManager::processSettings] failed to parse #{}" + , env.foreignId()); + return bs::message::ProcessingResult::Error; + } + if (msg.data_case() == SettingsMessage::kGetResponse) { + for (const auto& setting : msg.get_response().responses()) { + if (setting.request().index() == SetIdx_NetType) { + testNet_ = (static_cast(setting.i()) == NetworkType::TestNet); + logger_->debug("[hww::DeviceManager::processSettings] testnet={}", testNet_); + trezorClient_ = std::make_unique(logger_, testNet_, this); + ledgerClient_ = std::make_unique(logger_, testNet_, this); + return bs::message::ProcessingResult::Success; + } + } + } + return bs::message::ProcessingResult::Ignored; +} + bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::SeqId msgId , const HDWalletData& hdWallet) { @@ -242,7 +278,9 @@ bool DeviceManager::awaitingUserAction(const DeviceKey& key) void DeviceManager::releaseConnection() { - trezorClient_->releaseConnection(); + if (trezorClient_) { + trezorClient_->releaseConnection(); + } } void DeviceManager::scanningDone(bool initDevices) diff --git a/BlockSettleHW/hwdevicemanager.h b/BlockSettleHW/hwdevicemanager.h index 72f270d08..4c35cbbb4 100644 --- a/BlockSettleHW/hwdevicemanager.h +++ b/BlockSettleHW/hwdevicemanager.h @@ -105,6 +105,7 @@ namespace bs { , const std::string& walletId); bs::message::ProcessingResult processOwnRequest(const bs::message::Envelope&); bs::message::ProcessingResult processWallet(const bs::message::Envelope&); + bs::message::ProcessingResult processSettings(const bs::message::Envelope&); private: std::shared_ptr logger_; @@ -112,7 +113,7 @@ namespace bs { std::unique_ptr ledgerClient_; std::shared_ptr user_, userWallets_; - bool testNet_{}; + bool testNet_{false}; unsigned nbScanning_{}; bool isSigning_{}; std::string lastOperationError_; diff --git a/generate.py b/generate.py index b67f28ae8..b25c1838e 100644 --- a/generate.py +++ b/generate.py @@ -41,6 +41,7 @@ from build_scripts.trezor_common_settings import TrezorCommonSettings from build_scripts.websockets_settings import WebsocketsSettings from build_scripts.zeromq_settings import ZeroMQSettings +from build_scripts.curl_settings import CurlSettings def generate_project(build_mode, link_mode, build_production, hide_warnings, cmake_flags, build_tests, build_tracker): project_settings = Settings(build_mode, link_mode) @@ -59,6 +60,7 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma required_3rdparty += [ ProtobufSettings(project_settings), OpenSslSettings(project_settings), + CurlSettings(project_settings), SpdlogSettings(project_settings), ZeroMQSettings(project_settings), LibQREncode(project_settings), From 3d3abdc65fef3203e2398564d939d5ddbee06e57 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 10 Jan 2023 14:39:00 +0300 Subject: [PATCH 038/436] update common --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index 240c0d849..64192ddbf 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 240c0d849c601bde6a476c18fd66627fb3d9484a +Subproject commit 64192ddbf480ff42b080837f3b8876f7fd2c5fc1 From 0a883abe3279967b16b33e84379c1d00c769b71c Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 10 Jan 2023 20:22:03 +0300 Subject: [PATCH 039/436] [QT-5] CSV export of TX list --- GUI/QtQuick/TxListModel.cpp | 29 ++++++++++++++++++++++++++++ GUI/QtQuick/TxListModel.h | 2 ++ GUI/QtQuick/qml/TransactionsPage.qml | 22 +++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 3a142d411..ce2cc6878 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -9,6 +9,7 @@ */ #include "TxListModel.h" +#include #include #include #include "StringUtils.h" @@ -349,6 +350,34 @@ void TxListModel::setCurrentBlock(uint32_t nbBlock) emit dataChanged(createIndex(1, 5), createIndex(data_.size(), 5)); } +bool TxListModel::exportCSVto(const QString& filename) +{ + const std::string& prefix = "file:///"; + std::string fileName = filename.toStdString(); + const auto itPrefix = fileName.find(prefix); + if (itPrefix != std::string::npos) { + fileName.replace(itPrefix, prefix.size(), ""); + } + logger_->debug("[{}] {}", __func__, fileName); + std::ofstream fstrm(fileName); + if (!fstrm.is_open()) { + return false; + } + fstrm << "sep=;\nTimestamp;Wallet;Type;Address;TxId;Amount;Comment\n"; + for (int i = 1; i < rowCount(); ++i) { + const auto& entry = data_.at(i - 1); + std::time_t txTime = entry.txTime; + fstrm << "\"" << std::put_time(std::localtime(&txTime), "%Y-%m-%d %X") << "\";" + << "\"" << getData(i, 1).toUtf8().toStdString() << "\";" + << getData(i, 2).toStdString() << ";" + << getData(i, 3).toStdString() << ";" + << txId(i - 1).toStdString() << ";" + << fmt::format("{:.8f}", entry.value / BTCNumericTypes::BalanceDivider) << ";" + << "\"" << getData(i, 7).toStdString() << "\"\n"; + } + return true; +} + TxListForAddr::TxListForAddr(const std::shared_ptr& logger, QObject* parent) : QAbstractTableModel(parent), logger_(logger) diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 70261dd3d..fe83c1a91 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -39,6 +39,8 @@ class TxListModel : public QAbstractTableModel Q_PROPERTY(int nbTx READ nbTx NOTIFY nbTxChanged); int nbTx() const { return data_.size(); } + Q_INVOKABLE bool exportCSVto(const QString&); + void prependRow(const bs::TXEntry&); void addRow(const bs::TXEntry&); void addRows(const std::vector&); diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index fff04614a..8afaa811f 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -12,6 +12,7 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtQml.Models 2 +import QtQuick.Dialogs 1.3 import "StyledControls" import "BsStyles" @@ -22,6 +23,24 @@ import "BsStyles" Item { id: transactions + FileDialog { + id: fileDialogCSV + visible: false + title: qsTr("Choose CSV file name") + folder: shortcuts.home + defaultSuffix: "csv" + selectExisting: false + onAccepted: { + var csvFile = fileUrl.toString() + if (txListModel.exportCSVto(csvFile)) { + ibInfo.displayMessage(qsTr("TX list CSV saved to %1").arg(csvFile)) + } + else { + ibFailure.displayMessage(qsTr("Failed to save CSV to %1").arg(csvFile)) + } + } + } + Column { spacing: 23 anchors.fill: parent @@ -75,6 +94,9 @@ Item { Button { text: qsTr("CSV download") font.pointSize: 8 + onClicked: { + fileDialogCSV.visible = true + } } } From d52595f6ffb50e4525903181f74a450b2bd4200e Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 12 Jan 2023 00:17:01 +0300 Subject: [PATCH 040/436] [WIP] HWW scan at wallet import --- BlockSettleHW/hwdeviceinterface.h | 3 +- BlockSettleHW/hwdevicemanager.cpp | 97 ++++++++++++++++++++------- BlockSettleHW/hwdevicemanager.h | 18 +++-- BlockSettleHW/ledger/ledgerClient.cpp | 4 -- BlockSettleHW/ledger/ledgerDevice.cpp | 57 +++++++--------- BlockSettleHW/ledger/ledgerDevice.h | 2 +- BlockSettleHW/trezor/trezorDevice.cpp | 18 ++--- BlockSettleHW/trezor/trezorDevice.h | 2 +- CMakeLists.txt | 8 +-- GUI/CMakeLists.txt | 4 +- GUI/QtQuick/QtQuickAdapter.cpp | 81 +++++++++++++++++++++- GUI/QtQuick/QtQuickAdapter.h | 13 ++++ GUI/QtQuick/hwcommonstructure.cpp | 12 ---- GUI/QtQuick/hwcommonstructure.h | 7 +- GUI/QtQuick/hwdevicemodel.cpp | 71 ++++++++++---------- GUI/QtQuick/hwdevicemodel.h | 25 +++---- GUI/QtQuick/qml/CreateWallet.qml | 7 ++ GUI/QtQuick/qml/ImportHardware.qml | 2 +- common | 2 +- generate.py | 2 - 20 files changed, 280 insertions(+), 155 deletions(-) delete mode 100644 GUI/QtQuick/hwcommonstructure.cpp diff --git a/BlockSettleHW/hwdeviceinterface.h b/BlockSettleHW/hwdeviceinterface.h index 654b83afc..b884ae78c 100644 --- a/BlockSettleHW/hwdeviceinterface.h +++ b/BlockSettleHW/hwdeviceinterface.h @@ -38,7 +38,6 @@ namespace bs { std::string vendor; std::string walletId; std::string status; - DeviceType type{ DeviceType::Unknown }; }; @@ -54,7 +53,7 @@ namespace bs { virtual void clearSession() = 0; // operation - virtual void getPublicKey() = 0; + virtual void getPublicKeys() = 0; virtual void signTX(const bs::core::wallet::TXSignRequest& reqTX) = 0; virtual void retrieveXPubRoot() = 0; diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index a450668d0..39ac8d74e 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -25,6 +25,7 @@ using namespace bs::hww; using namespace BlockSettle::Common; using namespace BlockSettle::Terminal; +using namespace BlockSettle; DeviceManager::DeviceManager(const std::shared_ptr& logger) : logger_(logger) @@ -68,26 +69,18 @@ bool DeviceManager::processBroadcast(const bs::message::Envelope& env) return false; } -void DeviceManager::scanDevices() +void DeviceManager::scanDevices(const bs::message::Envelope& env) { if (nbScanning_ > 0) { return; } - - setScanningFlag(2); + envReqScan_ = env; + devices_.clear(); + nbScanning_ = 2; // # of callbacks to receive ledgerClient_->scanDevices(); trezorClient_->listDevices(); } -void DeviceManager::requestPublicKey(const DeviceKey& key) -{ - auto device = getDevice(key); - if (!device) { - return; - } - device->getPublicKey(); -} - void DeviceManager::setMatrixPin(const DeviceKey& key, const std::string& pin) { auto device = getDevice(key); @@ -113,7 +106,6 @@ void DeviceManager::cancel(const DeviceKey& key) if (!device) { return; } - device->cancel(); } @@ -146,6 +138,20 @@ bs::message::ProcessingResult DeviceManager::processOwnRequest(const bs::message if (!trezorClient_ || !ledgerClient_) { return bs::message::ProcessingResult::Retry; } + HW::DeviceMgrMessage msg; + if (!msg.ParseFromString(env.message)) { + logger_->error("[hww::DeviceManager::processOwnRequest] failed to parse #{}" + , env.foreignId()); + return bs::message::ProcessingResult::Error; + } + switch (msg.data_case()) { + case HW::DeviceMgrMessage::kStartScan: + scanDevices(env); + return bs::message::ProcessingResult::Success; + case HW::DeviceMgrMessage::kImportDevice: + return processImport(env, msg.import_device()); + default: break; + } return bs::message::ProcessingResult::Ignored; } @@ -186,6 +192,21 @@ bs::message::ProcessingResult DeviceManager::processSettings(const bs::message:: return bs::message::ProcessingResult::Ignored; } +bs::message::ProcessingResult DeviceManager::processImport(const bs::message::Envelope& env + , const HW::DeviceKey& key) +{ + const DeviceKey devKey{ key.label(), key.id(), key.vendor(), key.wallet_id() + , key.status(), static_cast(key.type()) }; + const auto& device = getDevice(devKey); + if (!device) { + logger_->error("[hww::DeviceManager::processImport] no device found for id {}" + , devKey.id); + return bs::message::ProcessingResult::Error; + } + device->getPublicKeys(); + return bs::message::ProcessingResult::Success; +} + bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::SeqId msgId , const HDWalletData& hdWallet) { @@ -283,15 +304,32 @@ void DeviceManager::releaseConnection() } } +void DeviceManager::devicesResponse() +{ + HW::DeviceMgrMessage msg; + auto msgResp = msg.mutable_available_devices(); + for (const auto& key : devices_) { + auto msgKey = msgResp->add_device_keys(); + msgKey->set_label(key.label); + msgKey->set_id(key.id); + msgKey->set_vendor(key.vendor); + msgKey->set_wallet_id(key.walletId); + msgKey->set_status(key.status); + msgKey->set_type((int)key.type); + } + pushResponse(user_, envReqScan_, msg.SerializeAsString()); + envReqScan_ = {}; +} + void DeviceManager::scanningDone(bool initDevices) { const auto& ledgerKeys = ledgerClient_->deviceKeys(); - auto allDevices = ledgerKeys; + devices_ = ledgerKeys; const auto& trezorKeys = trezorClient_->deviceKeys(); - allDevices.insert(allDevices.end(), trezorKeys.cbegin(), trezorKeys.cend()); + devices_.insert(devices_.end(), trezorKeys.cbegin(), trezorKeys.cend()); if (!initDevices) { - //TODO: send response with all devices + devicesResponse(); return; } for (const auto& key : ledgerKeys) { @@ -324,20 +362,29 @@ std::shared_ptr DeviceManager::getDevice(const DeviceKey& key) return nullptr; } -void DeviceManager::setScanningFlag(unsigned nbLeft) +void DeviceManager::publicKeyReady(const std::string& devId, const std::string& walletId) { - if (nbScanning_ == nbLeft) { - return; + size_t nbCompleted = 0; + for (int i = 0; i < devices_.size(); ++i) { + if (devices_[i].id == devId) { + devices_[i].walletId = walletId; + nbCompleted++; + } + else if (!devices_.at(i).walletId.empty()) { + nbCompleted++; + } } - nbScanning_ = nbLeft; - - if (nbLeft == 0) { - scanningDone(false); + if (nbCompleted >= devices_.size()) { + devicesResponse(); } } -void DeviceManager::publicKeyReady(void* walletInfo) +void bs::hww::DeviceManager::walletInfoReady(const DeviceKey& key + , const bs::core::wallet::HwWalletInfo& walletInfo) { + logger_->debug("[hww::DeviceManager::walletInfoReady] importing device {} " + "(not implemented)", key.id); + //TODO: send request to WA } void DeviceManager::requestPinMatrix(const DeviceKey&) @@ -372,7 +419,7 @@ void DeviceManager::scanningDone() } if (--nbScanning_ == 0) { logger_->debug("[DeviceManager::scanningDone] all devices scanned"); - scanningDone(false); + scanningDone(true); } } diff --git a/BlockSettleHW/hwdevicemanager.h b/BlockSettleHW/hwdevicemanager.h index 4c35cbbb4..6c8e3b56e 100644 --- a/BlockSettleHW/hwdevicemanager.h +++ b/BlockSettleHW/hwdevicemanager.h @@ -27,6 +27,9 @@ namespace BlockSettle { namespace Common { class HDWalletData; } + namespace HW { + class DeviceKey; + } } namespace bs { @@ -38,7 +41,8 @@ namespace bs { struct DeviceCallbacks { - virtual void publicKeyReady(void* walletInfo) = 0; + virtual void publicKeyReady(const std::string& devId, const std::string& walletId) = 0; + virtual void walletInfoReady(const DeviceKey&, const bs::core::wallet::HwWalletInfo&) = 0; virtual void requestPinMatrix(const DeviceKey&) = 0; virtual void requestHWPass(const DeviceKey&, bool allowedOnDevice) = 0; @@ -66,7 +70,8 @@ namespace bs { std::string name() const override { return "HWWallets"; } private: // signals - void publicKeyReady(void* walletInfo) override; + void publicKeyReady(const std::string& devId, const std::string& walletId) override; + void walletInfoReady(const DeviceKey&, const bs::core::wallet::HwWalletInfo&) override; void requestPinMatrix(const DeviceKey&) override; void requestHWPass(const DeviceKey&, bool allowedOnDevice) override; @@ -81,8 +86,7 @@ namespace bs { void invalidPin() override; //former invokables: - void scanDevices(); - void requestPublicKey(const DeviceKey&); + void scanDevices(const bs::message::Envelope&); void setMatrixPin(const DeviceKey&, const std::string& pin); void setPassphrase(const DeviceKey&, const std::string& passphrase , bool enterOnDevice); @@ -107,11 +111,16 @@ namespace bs { bs::message::ProcessingResult processWallet(const bs::message::Envelope&); bs::message::ProcessingResult processSettings(const bs::message::Envelope&); + void devicesResponse(); + bs::message::ProcessingResult processImport(const bs::message::Envelope& + , const BlockSettle::HW::DeviceKey&); + private: std::shared_ptr logger_; std::unique_ptr trezorClient_; std::unique_ptr ledgerClient_; std::shared_ptr user_, userWallets_; + std::vector devices_; bool testNet_{false}; unsigned nbScanning_{}; @@ -119,6 +128,7 @@ namespace bs { std::string lastOperationError_; std::string lastUsedTrezorWallet_; unsigned nbWaitScanReplies_{ 0 }; + bs::message::Envelope envReqScan_; std::map> prepareDeviceReq_; //value: walletId }; diff --git a/BlockSettleHW/ledger/ledgerClient.cpp b/BlockSettleHW/ledger/ledgerClient.cpp index eb8a6b5ab..e92bff76a 100644 --- a/BlockSettleHW/ledger/ledgerClient.cpp +++ b/BlockSettleHW/ledger/ledgerClient.cpp @@ -94,9 +94,5 @@ void LedgerClient::scanDevices() } hid_exit(); - // Init first one - /*if (!availableDevices_.empty()) { - availableDevices_.at(0)->init(); - }*/ cb_->scanningDone(); } diff --git a/BlockSettleHW/ledger/ledgerDevice.cpp b/BlockSettleHW/ledger/ledgerDevice.cpp index 8b1b957f2..a8d53e062 100644 --- a/BlockSettleHW/ledger/ledgerDevice.cpp +++ b/BlockSettleHW/ledger/ledgerDevice.cpp @@ -149,14 +149,8 @@ DeviceKey LedgerDevice::key() const walletId = bs::core::wallet::computeID(xpubRoot_).toBinStr(); } - return { - hidDeviceInfo_.product, - hidDeviceInfo_.manufacturer, - hidDeviceInfo_.manufacturer, - walletId, - {}, - DeviceType::HWLedger - }; + return { hidDeviceInfo_.product, hidDeviceInfo_.serialNumber + , hidDeviceInfo_.manufacturer, walletId, {}, DeviceType::HWLedger }; } DeviceType LedgerDevice::type() const @@ -344,7 +338,7 @@ BIP32_Node GetPubKeyHandler::retrievePublicKeyFromPath(const bs::hd::Path& deriv return getPublicKeyApdu(derivationPath, parent); } -void LedgerDevice::getPublicKey() +void LedgerDevice::getPublicKeys() { auto deviceKey = key(); auto walletInfo = std::make_shared(); @@ -353,8 +347,7 @@ void LedgerDevice::getPublicKey() walletInfo->label = deviceKey.label; walletInfo->deviceId = {}; - logger_->debug("[LedgerDevice::getPublicKey] start retrieve root xpub key"); - + logger_->debug("[LedgerDevice::getPublicKeys] start retrieving device keys"); auto inData = std::make_shared(); inData->paths.push_back({ { bs::hd::hardFlag } }); inData->paths.push_back(getDerivationPath(testNet_, bs::hd::Nested)); @@ -366,7 +359,7 @@ void LedgerDevice::getPublicKey() const auto& result = std::static_pointer_cast(data); if (result->pubKeys.size() != 4) { - logger_->error("[LedgerDevice::getPublicKey] invalid amount of public " + logger_->error("[LedgerDevice::getPublicKeys] invalid amount of public " "keys: {}", result->pubKeys.size()); operationFailed("invalid amount of public keys: " + std::to_string(result->pubKeys.size())); return; @@ -376,9 +369,8 @@ void LedgerDevice::getPublicKey() walletInfo->xpubRoot = pubKey.getBase58().toBinStr(); } catch (const std::exception& e) { - logger_->error("[LedgerDevice::getPublicKey] cannot retrieve root xpub key: {}", e.what()); - //error(Ledger::INTERNAL_ERROR); - operationFailed("internal error"); + logger_->error("[LedgerDevice::getPublicKeys] cannot retrieve root xpub key: {}", e.what()); + handleError(Ledger::INTERNAL_ERROR); return; } @@ -387,8 +379,8 @@ void LedgerDevice::getPublicKey() walletInfo->xpubNestedSegwit = pubKey.getBase58().toBinStr(); } catch (const std::exception& e) { - logger_->error("[LedgerDevice::getPublicKey] cannot retrieve nested segwit xpub key: {}", e.what()); - //emit error(Ledger::INTERNAL_ERROR); + logger_->error("[LedgerDevice::getPublicKeys] cannot retrieve nested segwit xpub key: {}", e.what()); + handleError(Ledger::INTERNAL_ERROR); return; } @@ -397,8 +389,8 @@ void LedgerDevice::getPublicKey() walletInfo->xpubNativeSegwit = pubKey.getBase58().toBinStr(); } catch (const std::exception& e) { - logger_->error("[LedgerDevice::getPublicKey] cannot retrieve native segwit xpub key: {}", e.what()); - //emit error(Ledger::INTERNAL_ERROR); + logger_->error("[LedgerDevice::getPublicKeys] cannot retrieve native segwit xpub key: {}", e.what()); + handleError(Ledger::INTERNAL_ERROR); return; } @@ -407,8 +399,8 @@ void LedgerDevice::getPublicKey() walletInfo->xpubLegacy = pubKey.getBase58().toBinStr(); } catch (const std::exception& e) { - logger_->error("[LedgerDevice::getPublicKey] cannot retrieve legacy xpub key: {}", e.what()); - //emit error(Ledger::INTERNAL_ERROR); + logger_->error("[LedgerDevice::getPublicKeys] cannot retrieve legacy xpub key: {}", e.what()); + handleError(Ledger::INTERNAL_ERROR); return; } @@ -418,14 +410,14 @@ void LedgerDevice::getPublicKey() !info.xpubNativeSegwit.empty() && !info.xpubLegacy.empty(); }; if (!isValid(*walletInfo)) { - logger_->error("[LedgerDevice::getPublicKey] wallet info is invalid"); - //emit error(Ledger::INTERNAL_ERROR); + logger_->error("[LedgerDevice::getPublicKeys] wallet info is invalid"); + handleError(Ledger::INTERNAL_ERROR); return; } else { - logger_->debug("[LedgerDevice::getPublicKey] operation succeeded"); + logger_->debug("[LedgerDevice::getPublicKeys] operation succeeded"); } - //TODO: invoke callback with walletInfo + cb_->walletInfoReady(key(), *walletInfo); }; processQueued(inData, cb); } @@ -515,6 +507,9 @@ void bs::hww::LedgerDevice::retrieveXPubRoot() const auto& pubKey = result->pubKeys.at(0); if (xpubRoot_.empty()) { xpubRoot_ = pubKey.getPublicKey(); + const auto& devKey = key(); + cb_->publicKeyReady(devKey.id, devKey.walletId); + return; } try { walletInfo->xpubRoot = pubKey.getBase58().toBinStr(); @@ -544,7 +539,7 @@ std::shared_ptr bs::hww::LedgerDevice::worker(const std::shared_ptr< void LedgerDevice::handleError(int32_t errorCode) { - QString error; + std::string error; switch (errorCode) { case Ledger::SW_NO_ENVIRONMENT: @@ -557,19 +552,19 @@ void LedgerDevice::handleError(int32_t errorCode) break; case Ledger::NO_DEVICE: requestForRescan(); - error = HWInfoStatus::kErrorNoDevice; + error = HWInfoStatus::kErrorNoDevice.toStdString(); break; case Ledger::SW_RECONNECT_DEVICE: requestForRescan(); - error = HWInfoStatus::kErrorReconnectDevice; + error = HWInfoStatus::kErrorReconnectDevice.toStdString(); break; case Ledger::NO_INPUTDATA: default: - error = HWInfoStatus::kErrorInternalError; + error = HWInfoStatus::kErrorInternalError.toStdString(); break; } -// lastError_ = error; -// operationFailed(error); + lastError_ = error; + operationFailed(error); } #if 0 // DO NOT DELETE JUST FOR HISTORICAL REFFERENCE diff --git a/BlockSettleHW/ledger/ledgerDevice.h b/BlockSettleHW/ledger/ledgerDevice.h index e5b39744b..a525852ca 100644 --- a/BlockSettleHW/ledger/ledgerDevice.h +++ b/BlockSettleHW/ledger/ledgerDevice.h @@ -48,7 +48,7 @@ namespace bs { void cancel() override { WorkerPool::cancel(); } // operation - void getPublicKey() override; + void getPublicKeys() override; void signTX(const bs::core::wallet::TXSignRequest& reqTX) override; void retrieveXPubRoot() override; diff --git a/BlockSettleHW/trezor/trezorDevice.cpp b/BlockSettleHW/trezor/trezorDevice.cpp index 0e5c717b5..c2def51de 100644 --- a/BlockSettleHW/trezor/trezorDevice.cpp +++ b/BlockSettleHW/trezor/trezorDevice.cpp @@ -197,7 +197,7 @@ struct TXOut : public bs::OutData std::string signedTX; }; -void TrezorDevice::getPublicKey() +void TrezorDevice::getPublicKeys() { awaitingWalletInfo_ = {}; // General data @@ -208,9 +208,9 @@ void TrezorDevice::getPublicKey() awaitingWalletInfo_.xpubRoot = xpubRoot_.toBinStr(); if (!isFirmwareSupported()) { - logger_->warn("[TrezorDevice::getPublicKey] unsupported firmware. {}" + logger_->warn("[TrezorDevice::getPublicKeys] unsupported firmware. {}" , firmwareSupportedVersion()); - //TODO: invoke callback + cb_->walletInfoReady(key(), awaitingWalletInfo_); return; } @@ -218,18 +218,18 @@ void TrezorDevice::getPublicKey() { const auto& reply = std::dynamic_pointer_cast(data); if (!reply) { - logger_->error("[TrezorDevice::getPublicKey::legacy] invalid callback data"); + logger_->error("[TrezorDevice::getPublicKeys::legacy] invalid callback data"); return; } awaitingWalletInfo_.xpubLegacy = reply->xpub; - //TODO: invoke callback + cb_->walletInfoReady(key(), awaitingWalletInfo_); }; const auto& cbNested = [this](const std::shared_ptr& data) { const auto& reply = std::dynamic_pointer_cast(data); if (!reply) { - logger_->error("[TrezorDevice::getPublicKey::nested] invalid callback data"); + logger_->error("[TrezorDevice::getPublicKeys::nested] invalid callback data"); return; } awaitingWalletInfo_.xpubNestedSegwit = reply->xpub; @@ -239,13 +239,13 @@ void TrezorDevice::getPublicKey() { const auto& reply = std::dynamic_pointer_cast(data); if (!reply) { - logger_->error("[TrezorDevice::getPublicKey::native] invalid callback data"); + logger_->error("[TrezorDevice::getPublicKeys::native] invalid callback data"); return; } awaitingWalletInfo_.xpubNativeSegwit = reply->xpub; }; - logger_->debug("[TrezorDevice::getPublicKey] start public keys from device {}" + logger_->debug("[TrezorDevice::getPublicKeys] start public keys from device {}" , features_->label()); bitcoin::GetPublicKey message; for (const uint32_t add : getDerivationPath(testNet_, bs::hd::Purpose::Native)) { @@ -371,6 +371,8 @@ void TrezorDevice::retrieveXPubRoot() return; } xpubRoot_ = BinaryData::fromString(reply->xpub); + const auto& devKey = key(); + cb_->publicKeyReady(devKey.id, devKey.walletId); }; makeCall(message, saveXpubRoot); } diff --git a/BlockSettleHW/trezor/trezorDevice.h b/BlockSettleHW/trezor/trezorDevice.h index 59d943593..bae8f1b1c 100644 --- a/BlockSettleHW/trezor/trezorDevice.h +++ b/BlockSettleHW/trezor/trezorDevice.h @@ -62,7 +62,7 @@ namespace bs { void releaseConnection(); // operation - void getPublicKey() override; + void getPublicKeys() override; void signTX(const bs::core::wallet::TXSignRequest& reqTX) override; void retrieveXPubRoot() override; diff --git a/CMakeLists.txt b/CMakeLists.txt index 430418163..51df6d293 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -259,8 +259,7 @@ if (UNIX) ENDIF() endif (UNIX) - -# setup libwebsockets +# use only existing lws temporarily, don't try to build it (build fails on Windows) SET(WS_PACKAGE_ROOT ${THIRD_PARTY_COMMON_DIR}/libwebsockets) SET(WS_LIB_DIR ${WS_PACKAGE_ROOT}/lib) SET(WS_INCLUDE_DIR ${WS_PACKAGE_ROOT}/include) @@ -829,11 +828,6 @@ IF(BSTERMINAL_SHARED_LIBS) add_custom_command(TARGET ${COPY_SHARED_LIBS_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<$:${QRENCODE_LIB_DLL}> $<$>:${QRENCODE_LIB_DLL}> ${LIBRARY_OUTPUT_PATH}/${CMAKE_BUILD_TYPE}) - # websockets - STRING(REPLACE ".lib" ".dll" WS_LIB_DLL ${WS_LIB}) - add_custom_command(TARGET ${COPY_SHARED_LIBS_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different $<$:${WS_LIB_DLL}> $<$>:${WS_LIB_DLL}> ${LIBRARY_OUTPUT_PATH}/${CMAKE_BUILD_TYPE}) - string(REGEX REPLACE "([0-9])\.([0-9])\.([0-9]\.*)" "\\1;\\2" VERSION_MATCHES ${OPENSSL_VERSION}) list(GET VERSION_MATCHES 0 version_major) list(GET VERSION_MATCHES 1 version_minor) diff --git a/GUI/CMakeLists.txt b/GUI/CMakeLists.txt index 249175835..483f4af98 100644 --- a/GUI/CMakeLists.txt +++ b/GUI/CMakeLists.txt @@ -1,7 +1,7 @@ # # # *********************************************************************************** -# * Copyright (C) 2020 - 2022, BlockSettle AB +# * Copyright (C) 2020 - 2023, BlockSettle AB # * Distributed under the GNU Affero General Public License (AGPL v3) # * See LICENSE or http://www.gnu.org/licenses/agpl.html # * @@ -9,5 +9,7 @@ # # +INCLUDE_DIRECTORIES(${BS_HW_LIB_INCLUDE_DIR}) + ADD_SUBDIRECTORY(QtWidgets) ADD_SUBDIRECTORY(QtQuick) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index ffab8fc2f..40eda7741 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -37,8 +37,10 @@ #include "SettingsAdapter.h" #include "common.pb.h" +#include "hardware_wallet.pb.h" #include "terminal.pb.h" +using namespace BlockSettle; using namespace BlockSettle::Common; using namespace BlockSettle::Terminal; using namespace bs::message; @@ -100,6 +102,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) , userWallets_(std::make_shared(TerminalUsers::Wallets)) , userBlockchain_(std::make_shared(TerminalUsers::Blockchain)) , userSigner_(std::make_shared(TerminalUsers::Signer)) + , userHWW_(bs::message::UserTerminal::create(bs::message::TerminalUsers::HWWallets)) , txTypes_({ tr("All transactions") }) { staticLogger = logger; @@ -109,6 +112,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) expTxByAddrModel_ = new TxListForAddr(logger, this); txOutputsModel_ = new TxOutputsModel(logger, this); txInputsModel_ = new TxInputsModel(logger, txOutputsModel_, this); + hwDeviceModel_ = new HwDeviceModel(this); } QtQuickAdapter::~QtQuickAdapter() @@ -201,6 +205,7 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("txListByAddrModel"), expTxByAddrModel_); rootCtxt_->setContextProperty(QLatin1Literal("txInputsModel"), txInputsModel_); rootCtxt_->setContextProperty(QLatin1Literal("txOutputsModel"), txOutputsModel_); + rootCtxt_->setContextProperty(QLatin1Literal("hwDeviceModel"), hwDeviceModel_); engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); if (engine.rootObjects().empty()) { @@ -257,6 +262,8 @@ ProcessingResult QtQuickAdapter::process(const Envelope &env) return processSigner(env); case TerminalUsers::Wallets: return processWallets(env); + case TerminalUsers::HWWallets: + return processHWW(env); default: break; } } @@ -582,6 +589,21 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) return ProcessingResult::Success; } +bs::message::ProcessingResult QtQuickAdapter::processHWW(const bs::message::Envelope& env) +{ + HW::DeviceMgrMessage msg; + if (!msg.ParseFromString(env.message)) { + logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); + return ProcessingResult::Error; + } + switch (msg.data_case()) { + case HW::DeviceMgrMessage::kAvailableDevices: + return processHWDevices(msg.available_devices()); + default: break; + } + return bs::message::ProcessingResult::Ignored; +} + void QtQuickAdapter::updateStates() { //TODO @@ -778,8 +800,10 @@ void QtQuickAdapter::walletSelected(int index) void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) { const bool isInitialLoad = hdWallets_.empty(); - hdWallets_[*wi.ids.cbegin()] = wi; - logger_->debug("[QtQuickAdapter::processWalletLoaded] {}", wi.name); + const auto& walletId = *wi.ids.cbegin(); + hdWallets_[walletId] = wi; + hwDeviceModel_->setLoaded(walletId); + logger_->debug("[QtQuickAdapter::processWalletLoaded] {} {}", wi.name, walletId); QMetaObject::invokeMethod(this, [this, isInitialLoad, walletName = QString::fromStdString(wi.name)] { walletsList_.push_back(walletName); if (isInitialLoad) { @@ -1131,6 +1155,36 @@ QTxDetails* QtQuickAdapter::getTXDetails(const QString& txHash) return txDet; } +void QtQuickAdapter::pollHWWallets() +{ + hwDevicesPolling_ = true; + HW::DeviceMgrMessage msg; + msg.mutable_startscan(); + pushRequest(user_, userHWW_, msg.SerializeAsString()); +} + +void QtQuickAdapter::stopHWWalletsPolling() +{ + hwDevicesPolling_ = false; +} + +void QtQuickAdapter::importHWWallet(int deviceIndex) +{ + const auto& devKey = hwDeviceModel_->getDevice(deviceIndex); + if (devKey.id.empty()) { + return; + } + HW::DeviceMgrMessage msg; + auto msgReq = msg.mutable_import_device(); + msgReq->set_label(devKey.label); + msgReq->set_id(devKey.id); + msgReq->set_vendor(devKey.vendor); + msgReq->set_wallet_id(devKey.walletId); + msgReq->set_status(devKey.status); + msgReq->set_type((int)devKey.type); + pushRequest(user_, userHWW_, msg.SerializeAsString()); +} + ProcessingResult QtQuickAdapter::processAddressHist(const ArmoryMessage_AddressHistory& response) { bs::Address addr; @@ -1349,6 +1403,29 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq return bs::message::ProcessingResult::Success; } +bs::message::ProcessingResult QtQuickAdapter::processHWDevices(const HW::DeviceMgrMessage_Devices& response) +{ + std::vector devices; + for (const auto& key : response.device_keys()) { + devices.push_back({ key.label(), key.id(), key.vendor(), key.wallet_id() + , key.status(), static_cast(key.type())}); + } + hwDeviceModel_->setDevices(devices); + if (devices.empty() && hwDevicesPolling_) { + HW::DeviceMgrMessage msg; + msg.mutable_startscan(); + pushRequest(user_, userHWW_, msg.SerializeAsString() + , bs::message::bus_clock::now() + std::chrono::seconds{ 1 }); + } + else { + for (const auto& hdWallet : hdWallets_) { + hwDeviceModel_->setLoaded(hdWallet.first); + } + hwDeviceModel_->findNewDevice(); + } + return bs::message::ProcessingResult::Success; +} + QVariant QtQuickAdapter::getSetting(ApplicationSettings::Setting s) const { try { diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index a5b2ea3d8..eece3efab 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -51,6 +51,9 @@ namespace BlockSettle { class WalletsMessage_WalletData; class WalletsMessage_WalletsListResponse; } + namespace HW { + class DeviceMgrMessage_Devices; + } namespace Terminal { class AssetsMessage_Balance; class AssetsMessage_SubmittedAuthAddresses; @@ -73,6 +76,7 @@ namespace BlockSettle { } } class BSTerminalSplashScreen; +class HwDeviceModel; class QQmlContext; class QmlWalletsList; class QTxDetails; @@ -171,6 +175,9 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); Q_INVOKABLE int startSearch(const QString&); Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); + Q_INVOKABLE void pollHWWallets(); + Q_INVOKABLE void stopHWWalletsPolling(); + Q_INVOKABLE void importHWWallet(int deviceIndex); signals: void walletsListChanged(); @@ -193,6 +200,7 @@ private slots: bs::message::ProcessingResult processBlockchain(const bs::message::Envelope &); bs::message::ProcessingResult processSigner(const bs::message::Envelope &); bs::message::ProcessingResult processWallets(const bs::message::Envelope &); + bs::message::ProcessingResult processHWW(const bs::message::Envelope&); void requestInitialSettings(); void updateSplashProgress(); @@ -223,6 +231,8 @@ private slots: bs::message::ProcessingResult processTxResponse(bs::message::SeqId , const BlockSettle::Common::WalletsMessage_TxResponse&); + bs::message::ProcessingResult processHWDevices(const BlockSettle::HW::DeviceMgrMessage_Devices&); + QVariant getSetting(ApplicationSettings::Setting) const; QString getSettingStringAt(ApplicationSettings::Setting, int idx); void setSetting(ApplicationSettings::Setting, const QVariant&); @@ -235,6 +245,7 @@ private slots: QQmlContext* rootCtxt_{nullptr}; std::shared_ptr userSettings_, userWallets_; std::shared_ptr userBlockchain_, userSigner_; + std::shared_ptr userHWW_; bool loadingDone_{ false }; std::recursive_mutex mutex_; @@ -262,7 +273,9 @@ private slots: TxListForAddr* expTxByAddrModel_{ nullptr }; TxInputsModel* txInputsModel_{ nullptr }; TxOutputsModel* txOutputsModel_{ nullptr }; + HwDeviceModel* hwDeviceModel_{ nullptr }; bs::Address generatedAddress_; + bool hwDevicesPolling_{ false }; std::map txReqs_; std::map txDetailReqs_; diff --git a/GUI/QtQuick/hwcommonstructure.cpp b/GUI/QtQuick/hwcommonstructure.cpp deleted file mode 100644 index 8832a9675..000000000 --- a/GUI/QtQuick/hwcommonstructure.cpp +++ /dev/null @@ -1,12 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2020 - 2021, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ - -#include "hwcommonstructure.h" diff --git a/GUI/QtQuick/hwcommonstructure.h b/GUI/QtQuick/hwcommonstructure.h index 360e967b3..ba90dba44 100644 --- a/GUI/QtQuick/hwcommonstructure.h +++ b/GUI/QtQuick/hwcommonstructure.h @@ -19,7 +19,8 @@ #include "CoreWallet.h" -class HwWalletWrapper { +class HwWalletWrapper +{ Q_GADGET public: bs::core::wallet::HwWalletInfo info_; @@ -41,10 +42,6 @@ class HwWalletWrapper { }; Q_DECLARE_METATYPE(HwWalletWrapper) -struct HWSignedTx { - std::string signedTx; -}; -Q_DECLARE_METATYPE(HWSignedTx) namespace HWInfoStatus { const QString kPressButton = QObject::tr("Confirm transaction output(s) on your device"); diff --git a/GUI/QtQuick/hwdevicemodel.cpp b/GUI/QtQuick/hwdevicemodel.cpp index 8778ae8a4..598f0438a 100644 --- a/GUI/QtQuick/hwdevicemodel.cpp +++ b/GUI/QtQuick/hwdevicemodel.cpp @@ -19,32 +19,27 @@ QVariant HwDeviceModel::data(const QModelIndex& index, int role /*= Qt::DisplayR if (!index.isValid()) { return {}; } - const int row = index.row(); -#ifdef BUILD_HW_WALLETS - if (row < 0 || row > devices_.size()) { + if (row < 0 || row >= devices_.size()) { assert(false); return {}; } -#endif -#ifdef BUILD_HW_WALLETS switch (static_cast(role)) { case HwDeviceRoles::DeviceId: - return devices_[row].deviceId_; + return QString::fromStdString(devices_.at(row).id); case HwDeviceRoles::Label: - return devices_[row].deviceLabel_; + return QString::fromStdString(devices_.at(row).label); case HwDeviceRoles::Vendor: - return devices_[row].vendor_; + return QString::fromStdString(devices_.at(row).vendor); case HwDeviceRoles::PairedWallet: - return devices_[row].walletId_; + return QString::fromStdString(devices_.at(row).walletId); case HwDeviceRoles::Status: - return devices_[row].status_; + return QString::fromStdString(devices_.at(row).status); default: break; } -#endif return {}; } @@ -66,66 +61,70 @@ QModelIndex HwDeviceModel::parent(const QModelIndex& index) const return {}; } -int HwDeviceModel::rowCount(const QModelIndex& parent /*= QModelIndex()*/) const +int HwDeviceModel::rowCount(const QModelIndex&) const { -#ifdef BUILD_HW_WALLETS return devices_.size(); -#else - return 0; -#endif } -int HwDeviceModel::columnCount(const QModelIndex& parent /*= QModelIndex()*/) const +int HwDeviceModel::columnCount(const QModelIndex&) const { return 1; } -#ifdef BUILD_HW_WALLETS -void HwDeviceModel::resetModel(QVector&& deviceKeys) +void HwDeviceModel::setDevices(const std::vector& deviceKeys) { beginResetModel(); - devices_ = std::move(deviceKeys); + loaded_.clear(); + loaded_.resize(deviceKeys.size(), false); + devices_ = deviceKeys; endResetModel(); - emit toppestImportChanged(); } -DeviceKey HwDeviceModel::getDevice(int index) +bs::hww::DeviceKey HwDeviceModel::getDevice(int index) { - if (index < 0 || index > devices_.size()) { + if (index < 0 || index >= devices_.size()) { return {}; } - - return devices_[index]; + return devices_.at(index); } -int HwDeviceModel::getDeviceIndex(DeviceKey key) +int HwDeviceModel::getDeviceIndex(bs::hww::DeviceKey key) { for (int i = 0; i < devices_.size(); ++i) { - if (devices_[i].deviceId_ == key.deviceId_) { + if (devices_.at(i).id == key.id) { return i; } } - return -1; } -#endif -int HwDeviceModel::toppestImport() const +void HwDeviceModel::setLoaded(const std::string& walletId) { -#ifdef BUILD_HW_WALLETS - if (devices_.empty()) { - return -1; + for (int i = 0; i < devices_.size(); ++i) { + const auto& device = devices_.at(i); + if (device.walletId == walletId) { + loaded_[i] = true; + } } +} - for (int i = 0; i < devices_.size(); ++i) { - if (devices_[i].status_.isEmpty() && devices_[i].walletId_.isEmpty()) { +int HwDeviceModel::selDevice() const +{ + for (int i = 0; i < loaded_.size(); ++i) { + if (!loaded_.at(i)) { return i; } } -#endif return -1; } +void HwDeviceModel::findNewDevice() +{ + if (selDevice() >= 0) { + emit selected(); + } +} + QHash HwDeviceModel::roleNames() const { return { diff --git a/GUI/QtQuick/hwdevicemodel.h b/GUI/QtQuick/hwdevicemodel.h index 1e3fb89eb..9f211a532 100644 --- a/GUI/QtQuick/hwdevicemodel.h +++ b/GUI/QtQuick/hwdevicemodel.h @@ -12,6 +12,7 @@ #define HWDEVICEMODEL_H #include +#include "hwdeviceinterface.h" #include "hwcommonstructure.h" enum HwDeviceRoles { @@ -25,7 +26,7 @@ enum HwDeviceRoles { class HwDeviceModel : public QAbstractItemModel { Q_OBJECT - Q_PROPERTY(int toppestImport READ toppestImport NOTIFY toppestImportChanged) + Q_PROPERTY(int selDevice READ selDevice NOTIFY selected) public: HwDeviceModel(QObject *parent = nullptr); ~HwDeviceModel() override = default; @@ -38,21 +39,21 @@ class HwDeviceModel : public QAbstractItemModel QHash roleNames() const override; -#ifdef BUILD_HW_WALLETS - void resetModel(QVector&& deviceKey); - DeviceKey getDevice(int index); - int getDeviceIndex(DeviceKey key); -#endif - - Q_INVOKABLE int toppestImport() const; + void setDevices(const std::vector&); + void setLoaded(const std::string& walletId); + bs::hww::DeviceKey getDevice(int index); + int getDeviceIndex(bs::hww::DeviceKey key); + void findNewDevice(); signals: - void toppestImportChanged(); + void selected(); + +private: + int selDevice() const; private: -#ifdef BUILD_HW_WALLETS - QVector devices_; -#endif + std::vector devices_; + std::vector loaded_; }; Q_DECLARE_METATYPE(HwDeviceModel*) diff --git a/GUI/QtQuick/qml/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet.qml index 6789125d9..c9c151c1b 100644 --- a/GUI/QtQuick/qml/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet.qml @@ -163,6 +163,7 @@ Window { stack_create_wallet.push(import_wallet) } onSig_hardware_wallet: { + bsApp.pollHWWallets() stack_create_wallet.push(import_hardware) } } @@ -213,9 +214,15 @@ Window { id: import_hardware visible: false onSig_import: { + bsApp.importHWWallet(hwDeviceModel.selDevice) root.close() stack_create_wallet.pop(null) } + onVisibleChanged: { + if (!visible) { + bsApp.stopHWWalletsPolling() + } + } } ImportWatchingWallet { diff --git a/GUI/QtQuick/qml/ImportHardware.qml b/GUI/QtQuick/qml/ImportHardware.qml index 902776e0c..b5b85887f 100644 --- a/GUI/QtQuick/qml/ImportHardware.qml +++ b/GUI/QtQuick/qml/ImportHardware.qml @@ -67,7 +67,7 @@ ColumnLayout { Layout.leftMargin: 25 Layout.bottomMargin: 40 width: 530 - enabled: layout.isConnected + enabled: layout.isConnected && (hwDeviceModel.selDevice >= 0) Component.onCompleted: { confirm_but.preferred = true diff --git a/common b/common index 64192ddbf..a628e73cb 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 64192ddbf480ff42b080837f3b8876f7fd2c5fc1 +Subproject commit a628e73cb985f3506a6c9e1308fcf398f8c50c19 diff --git a/generate.py b/generate.py index b25c1838e..9d70991a9 100644 --- a/generate.py +++ b/generate.py @@ -39,7 +39,6 @@ from build_scripts.settings import Settings from build_scripts.spdlog_settings import SpdlogSettings from build_scripts.trezor_common_settings import TrezorCommonSettings -from build_scripts.websockets_settings import WebsocketsSettings from build_scripts.zeromq_settings import ZeroMQSettings from build_scripts.curl_settings import CurlSettings @@ -67,7 +66,6 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma MPIRSettings(project_settings), LibBTC(project_settings), # static LibChaCha20Poly1305Settings(project_settings), # static - WebsocketsSettings(project_settings), BotanSettings(project_settings), QtSettings(project_settings), HidapiSettings(project_settings), From 4aa33ca302bf6d6331ce49ae70f4230d2843e1ee Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 12 Jan 2023 00:29:01 +0300 Subject: [PATCH 041/436] fixup --- BlockSettleHW/hwdevicemanager.cpp | 3 ++- BlockSettleHW/trezor/trezorClient.cpp | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index 39ac8d74e..5dcadad5f 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -323,12 +323,13 @@ void DeviceManager::devicesResponse() void DeviceManager::scanningDone(bool initDevices) { + logger_->debug("[{}] init:{}", __func__, initDevices); const auto& ledgerKeys = ledgerClient_->deviceKeys(); devices_ = ledgerKeys; const auto& trezorKeys = trezorClient_->deviceKeys(); devices_.insert(devices_.end(), trezorKeys.cbegin(), trezorKeys.cend()); - if (!initDevices) { + if (!initDevices || devices_.empty()) { devicesResponse(); return; } diff --git a/BlockSettleHW/trezor/trezorClient.cpp b/BlockSettleHW/trezor/trezorClient.cpp index 53770a1c1..c76f9b57d 100644 --- a/BlockSettleHW/trezor/trezorClient.cpp +++ b/BlockSettleHW/trezor/trezorClient.cpp @@ -96,6 +96,7 @@ void TrezorClient::listDevices() const auto& reply = std::static_pointer_cast(data); if (!reply || !reply->error.empty()) { logger_->error("[TrezorClient::listDevices] network error: {}", reply ? reply->error : ""); + cb_->scanningDone(); return; } nlohmann::json response; @@ -104,6 +105,7 @@ void TrezorClient::listDevices() } catch (const nlohmann::json::exception& e) { logger_->error("[TrezorClient::acquireDevice] failed to parse '{}': {}", reply->response, e.what()); + cb_->scanningDone(); return; } @@ -246,8 +248,7 @@ std::shared_ptr bs::hww::TrezorPostHandler::processData(const std const auto res = curl_easy_perform(curl_); if (res != CURLE_OK) { - result->error = fmt::format("failed to post {} to {}: {}" - , inData->input, url, res); + result->error = fmt::format("failed to post to {}: {}", url, res); return result; } result->response = std::move(response); From b5bd3c6cbf07fed5bbbd71585be171ba1abd3246 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 12 Jan 2023 09:41:40 +0200 Subject: [PATCH 042/436] Qt-1 Wallet Wizard - UI/UX improvements --- GUI/QtQuick/qml/ConfirmPassword.qml | 22 +++++--------- GUI/QtQuick/qml/CreateWallet.qml | 2 +- GUI/QtQuick/qml/ImportHardware.qml | 10 +++++-- GUI/QtQuick/qml/ImportWallet.qml | 2 +- GUI/QtQuick/qml/ImportWatchingWallet.qml | 3 +- GUI/QtQuick/qml/StartCreateWallet.qml | 12 ++++---- .../qml/StyledControls/CustomButton.qml | 17 ++++++++++- .../qml/StyledControls/CustomTextInput.qml | 15 ++++++---- GUI/QtQuick/qml/TermsAndConditions.qml | 2 +- GUI/QtQuick/qml/WalletSeed.qml | 13 +++----- GUI/QtQuick/qml/WalletSeedSkipAccept.qml | 21 +++---------- GUI/QtQuick/qml/WalletSeedVerify.qml | 30 ++++++------------- 12 files changed, 69 insertions(+), 80 deletions(-) diff --git a/GUI/QtQuick/qml/ConfirmPassword.qml b/GUI/QtQuick/qml/ConfirmPassword.qml index 673c9e0bf..e27fa0d29 100644 --- a/GUI/QtQuick/qml/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/ConfirmPassword.qml @@ -76,11 +76,15 @@ ColumnLayout { CustomButton { id: confirm_but text: qsTr("Confirm") - Layout.leftMargin: 25 + //Layout.leftMargin: 25 + //Layout.bottomMargin: 40 + + //Layout.leftMargin: 24 Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + width: 530 - enabled: (wallet_name.input_text !== "") - && (password.input_text !== "") + enabled: (password.input_text !== "") && (confirm_password.input_text !== "") Component.onCompleted: { @@ -105,18 +109,6 @@ ColumnLayout { confirm_password.isValid = false } } - - onClicked: { - click_enter() - } - } - - Keys.onEnterPressed: { - confirm_but.click_enter() - } - - Keys.onReturnPressed: { - confirm_but.click_enter() } } diff --git a/GUI/QtQuick/qml/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet.qml index 6789125d9..7ce9d2a56 100644 --- a/GUI/QtQuick/qml/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet.qml @@ -172,8 +172,8 @@ Window { visible: false phrase: root.phrase onSig_continue: { - wallet_seed_verify.init() stack_create_wallet.push(wallet_seed_verify) + wallet_seed_verify.init() } } diff --git a/GUI/QtQuick/qml/ImportHardware.qml b/GUI/QtQuick/qml/ImportHardware.qml index 902776e0c..e95ac0a24 100644 --- a/GUI/QtQuick/qml/ImportHardware.qml +++ b/GUI/QtQuick/qml/ImportHardware.qml @@ -64,15 +64,21 @@ ColumnLayout { CustomButton { id: confirm_but text: qsTr("Import") - Layout.leftMargin: 25 + + //Layout.leftMargin: 25 + //Layout.bottomMargin: 40 + + //Layout.leftMargin: 24 Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + width: 530 enabled: layout.isConnected Component.onCompleted: { confirm_but.preferred = true } - onClicked: { + function click_enter() { sig_import() } } diff --git a/GUI/QtQuick/qml/ImportWallet.qml b/GUI/QtQuick/qml/ImportWallet.qml index 7b0a3352f..fa1bd3cb4 100644 --- a/GUI/QtQuick/qml/ImportWallet.qml +++ b/GUI/QtQuick/qml/ImportWallet.qml @@ -170,7 +170,7 @@ ColumnLayout { Component.onCompleted: { import_but.preferred = true } - onClicked: { + function click_enter() { for (var i=0; i Date: Thu, 12 Jan 2023 11:25:29 +0200 Subject: [PATCH 043/436] Qt-9 Pages of Create new wallet widget with unstandard size show cutted off --- GUI/QtQuick/qml/CreateWallet.qml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GUI/QtQuick/qml/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet.qml index 7ce9d2a56..f461f88a3 100644 --- a/GUI/QtQuick/qml/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet.qml @@ -19,6 +19,9 @@ Window { minimumHeight: rect.height minimumWidth: rect.width + height: rect.height + width: rect.width + objectName: "create_wallet" color: "transparent" @@ -89,6 +92,7 @@ Window { implicitHeight: currentItem.height implicitWidth: currentItem.width + pushEnter: Transition { PropertyAnimation { property: "opacity" From b99eb01f7e8a4c47109060bae0bea055b5c4c786 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 12 Jan 2023 16:21:29 +0200 Subject: [PATCH 044/436] add Success screen + add focus to buttons --- GUI/QtQuick/images/success.png | Bin 0 -> 4652 bytes GUI/QtQuick/qml/BsStyles/BSStyle.qml | 2 + GUI/QtQuick/qml/ConfirmPassword.qml | 12 +++ GUI/QtQuick/qml/CreateWallet.qml | 23 ++++- GUI/QtQuick/qml/ImportHardware.qml | 10 +++ GUI/QtQuick/qml/ImportWallet.qml | 14 +++ GUI/QtQuick/qml/ImportWatchingWallet.qml | 11 +++ GUI/QtQuick/qml/StartCreateWallet.qml | 5 ++ .../qml/StyledControls/CustomButton.qml | 5 +- GUI/QtQuick/qml/SuccessNewWallet.qml | 81 ++++++++++++++++++ GUI/QtQuick/qml/TermsAndConditions.qml | 9 ++ GUI/QtQuick/qml/WalletSeed.qml | 6 +- GUI/QtQuick/qml/WalletSeedSkipAccept.qml | 6 +- GUI/QtQuick/qtquick.qrc | 2 + 14 files changed, 181 insertions(+), 5 deletions(-) create mode 100644 GUI/QtQuick/images/success.png create mode 100644 GUI/QtQuick/qml/SuccessNewWallet.qml diff --git a/GUI/QtQuick/images/success.png b/GUI/QtQuick/images/success.png new file mode 100644 index 0000000000000000000000000000000000000000..e65d912a299313cbad4ede61ecfc5228e04f7906 GIT binary patch literal 4652 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/folder_icon.png images/File.png qml/ImportWallet.qml + images/success.png + qml/SuccessNewWallet.qml From 788f8aac6cf5df6fba84c19c81e60022dddd8c31 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 13 Jan 2023 04:15:52 +0200 Subject: [PATCH 045/436] fix qt1 pr issues --- GUI/QtQuick/qml/ConfirmPassword.qml | 4 ++-- GUI/QtQuick/qml/StyledControls/CustomButton.qml | 6 +++--- GUI/QtQuick/qml/SuccessNewWallet.qml | 4 ++-- GUI/QtQuick/qml/TermsAndConditions.qml | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/GUI/QtQuick/qml/ConfirmPassword.qml b/GUI/QtQuick/qml/ConfirmPassword.qml index 763e08497..96288fa20 100644 --- a/GUI/QtQuick/qml/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/ConfirmPassword.qml @@ -112,11 +112,11 @@ ColumnLayout { } Keys.onEnterPressed: { - confirm_but.click_enter() + confirm_but.click_enter() } Keys.onReturnPressed: { - confirm_but.click_enter() + confirm_but.click_enter() } function init() diff --git a/GUI/QtQuick/qml/StyledControls/CustomButton.qml b/GUI/QtQuick/qml/StyledControls/CustomButton.qml index 54ab97dda..ffc9848a8 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButton.qml @@ -46,15 +46,15 @@ Button { } Keys.onEnterPressed: { - click_enter() + click_enter() } Keys.onReturnPressed: { - click_enter() + click_enter() } onClicked: { - click_enter() + click_enter() } } diff --git a/GUI/QtQuick/qml/SuccessNewWallet.qml b/GUI/QtQuick/qml/SuccessNewWallet.qml index 19c704882..4af2f78fe 100644 --- a/GUI/QtQuick/qml/SuccessNewWallet.qml +++ b/GUI/QtQuick/qml/SuccessNewWallet.qml @@ -72,10 +72,10 @@ ColumnLayout { } Keys.onEnterPressed: { - finish_but.click_enter() + finish_but.click_enter() } Keys.onReturnPressed: { - finish_but.click_enter() + finish_but.click_enter() } } diff --git a/GUI/QtQuick/qml/TermsAndConditions.qml b/GUI/QtQuick/qml/TermsAndConditions.qml index ac1930e63..c3b195c7f 100644 --- a/GUI/QtQuick/qml/TermsAndConditions.qml +++ b/GUI/QtQuick/qml/TermsAndConditions.qml @@ -111,11 +111,11 @@ ColumnLayout { Keys.onEnterPressed: { - continue_but.click_enter() + continue_but.click_enter() } Keys.onReturnPressed: { - continue_but.click_enter() + continue_but.click_enter() } } From fca0c83b765eb39dbb60380ca04e40aea9350758 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 13 Jan 2023 18:29:59 +0300 Subject: [PATCH 046/436] BIP39 prefix completion method --- GUI/QtQuick/QtQuickAdapter.cpp | 44 ++++++++++++++++++++++++++++++++++ GUI/QtQuick/QtQuickAdapter.h | 1 + common | 2 +- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 40eda7741..c9fe9420d 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -95,6 +96,22 @@ static void checkStyleSheet(QApplication& app) app.setStyleSheet(QString::fromLatin1(stylesheetFile.readAll())); } +class QRImageProvider : public QQuickImageProvider +{ +public: + QRImageProvider() : QQuickImageProvider(QQuickImageProvider::Pixmap) + {} + + QPixmap requestPixmap(const QString& id, QSize* size, const QSize& requestedSize) override + { + const int sz = std::max(requestedSize.width(), requestedSize.height()); + if (size) { + *size = QSize(sz, sz); + } + return UiUtils::getQRCode(id, sz); + } +}; + QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) : QObject(nullptr), logger_(logger) @@ -206,6 +223,7 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("txInputsModel"), txInputsModel_); rootCtxt_->setContextProperty(QLatin1Literal("txOutputsModel"), txOutputsModel_); rootCtxt_->setContextProperty(QLatin1Literal("hwDeviceModel"), hwDeviceModel_); + engine.addImageProvider(QLatin1Literal("QR"), new QRImageProvider); engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); if (engine.rootObjects().empty()) { @@ -1024,6 +1042,32 @@ QStringList QtQuickAdapter::newSeedPhrase() return result; } +QStringList QtQuickAdapter::completeBIP39dic(const QString& pfx) +{ + const auto& prefix = pfx.toLower().toStdString(); + if (prefix.empty()) { + return {}; + } + QStringList result; + for (int i = 0; i < BIP39::NUM_BIP39_WORDS; ++i) { + const auto& word = BIP39::get_word(i); + bool prefixMatched = true; + for (int j = 0; j < std::min(prefix.length(), word.length()); ++j) { + if (word.at(j) != prefix.at(j)) { + prefixMatched = false; + break; + } + } + if (prefixMatched) { + result.append(QString::fromStdString(word)); + } + if (result.size() >= 5) { + break; + } + } + return result; +} + void QtQuickAdapter::copySeedToClipboard(const QStringList& seed) { const auto& str = seed.join(QLatin1Char(' ')); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index eece3efab..17366b8e2 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -161,6 +161,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop // QML-invokable methods Q_INVOKABLE QStringList newSeedPhrase(); + Q_INVOKABLE QStringList completeBIP39dic(const QString& prefix); Q_INVOKABLE void copySeedToClipboard(const QStringList&); Q_INVOKABLE void createWallet(const QString& name, const QStringList& seed , const QString& password); diff --git a/common b/common index a628e73cb..fd8484e1e 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit a628e73cb985f3506a6c9e1308fcf398f8c50c19 +Subproject commit fd8484e1e4ae1c39199e6b6d43a6971637963119 From 7fa8f2cf88d2feb512f53a03f56b89ec4346a78a Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 14 Jan 2023 05:38:55 +0200 Subject: [PATCH 047/436] add Receive popup, unstead of qr code test image --- .../images/{copy_seed.png => copy_icon.png} | Bin GUI/QtQuick/qml/CreateWallet.qml | 341 ++++++------------ GUI/QtQuick/qml/OverviewPage.qml | 9 + GUI/QtQuick/qml/Receive/ReceivePopup.qml | 23 ++ GUI/QtQuick/qml/Receive/ReceiveQrCode.qml | 106 ++++++ GUI/QtQuick/qml/Receive/qmldir | 4 + .../qml/StyledControls/CustomPopup.qml | 151 ++++++++ GUI/QtQuick/qml/main.qml | 35 +- GUI/QtQuick/qtquick.qrc | 6 +- 9 files changed, 424 insertions(+), 251 deletions(-) rename GUI/QtQuick/images/{copy_seed.png => copy_icon.png} (100%) mode change 100755 => 100644 create mode 100644 GUI/QtQuick/qml/Receive/ReceivePopup.qml create mode 100644 GUI/QtQuick/qml/Receive/ReceiveQrCode.qml create mode 100644 GUI/QtQuick/qml/Receive/qmldir create mode 100644 GUI/QtQuick/qml/StyledControls/CustomPopup.qml diff --git a/GUI/QtQuick/images/copy_seed.png b/GUI/QtQuick/images/copy_icon.png old mode 100755 new mode 100644 similarity index 100% rename from GUI/QtQuick/images/copy_seed.png rename to GUI/QtQuick/images/copy_icon.png diff --git a/GUI/QtQuick/qml/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet.qml index dbb3ba63e..52808440d 100644 --- a/GUI/QtQuick/qml/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet.qml @@ -4,279 +4,146 @@ import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 import "BsStyles" +import "StyledControls" -Window { +CustomPopup { id: root property var phrase - visible: true - flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog - - maximumHeight: rect.height - maximumWidth: rect.width - - minimumHeight: rect.height - minimumWidth: rect.width - - height: rect.height - width: rect.width - objectName: "create_wallet" - color: "transparent" - - x: mainWindow.x + (mainWindow.width - width)/2 - y: mainWindow.y + 28 - - Rectangle { - id: rect - - property var phrase - color: "#191E2A" - opacity: 1 - radius: 16 - height: stack_create_wallet.height + 40 - width: stack_create_wallet.width - border.color : "#3C435A" - border.width : 1 - - Image { - id: close_button + _stack_view.initialItem: terms_conditions + _arrow_but_visibility: !(terms_conditions.visible || start_create.visible || success_wallet.visible) - anchors.top: parent.top - anchors.topMargin: 24 - anchors.right: parent.right - anchors.rightMargin: 24 - - source: "qrc:/images/close_button.png" - width: 16 - height: 16 - MouseArea { - anchors.fill: parent - onClicked: { - root.close() - stack_create_wallet.pop(null) - } - } + TermsAndConditions { + id: terms_conditions + visible: false + onSig_continue: { + _stack_view.replace(start_create) + start_create.init() } + } - Image { - id: back_arrow_button - visible: !(terms_conditions.visible || start_create.visible) - - anchors.top: parent.top - anchors.topMargin: 24 - anchors.left: parent.left - anchors.leftMargin: 24 - - source: "qrc:/images/back_arrow.png" - width: 20 - height: 16 - MouseArea { - anchors.fill: parent - onClicked: { - stack_create_wallet.pop() - } - } + StartCreateWallet { + id: start_create + visible: false + onSig_create_new: { + root.phrase = bsApp.newSeedPhrase() + _stack_view.push(wallet_seed) + wallet_seed.init() } - - StackView { - id: stack_create_wallet - - initialItem: terms_conditions - - anchors.top: close_button.bottom - anchors.topMargin: 0 - - implicitHeight: currentItem.height - implicitWidth: currentItem.width - - - pushEnter: Transition { - PropertyAnimation { - property: "opacity" - from: 0 - to:1 - duration: 200 - } - } - - pushExit: Transition { - PropertyAnimation { - property: "opacity" - from: 1 - to:0 - duration: 200 - } - } - - popEnter: Transition { - PropertyAnimation { - property: "opacity" - from: 0 - to:1 - duration: 200 - } - } - - popExit: Transition { - PropertyAnimation { - property: "opacity" - from: 1 - to:0 - duration: 200 - } - } - - replaceEnter: Transition { - PropertyAnimation { - property: "opacity" - from: 0 - to:1 - duration: 10 - } - } - - replaceExit: Transition { - PropertyAnimation { - property: "opacity" - from: 1 - to:0 - duration: 10 - } - } + onSig_import_wallet: { + _stack_view.push(import_wallet) + import_wallet.init() } - - TermsAndConditions { - id: terms_conditions - visible: false - onSig_continue: { - stack_create_wallet.replace(start_create) - start_create.init() - } + onSig_hardware_wallet: { + bsApp.pollHWWallets() + _stack_view.push(import_hardware) } + } - StartCreateWallet { - id: start_create - visible: false - onSig_create_new: { - root.phrase = bsApp.newSeedPhrase() - stack_create_wallet.push(wallet_seed) - wallet_seed.init() - } - onSig_import_wallet: { - stack_create_wallet.push(import_wallet) - import_wallet.init() - } - onSig_hardware_wallet: { - bsApp.pollHWWallets() - stack_create_wallet.push(import_hardware) - } + WalletSeed { + id: wallet_seed + visible: false + phrase: root.phrase + onSig_continue: { + _stack_view.push(wallet_seed_verify) + wallet_seed_verify.init() } + } - WalletSeed { - id: wallet_seed - visible: false - phrase: root.phrase - onSig_continue: { - stack_create_wallet.push(wallet_seed_verify) - wallet_seed_verify.init() - } + WalletSeedVerify { + id: wallet_seed_verify + visible: false + phrase: root.phrase + onSig_verified: { + _stack_view.push(confirm_password) + confirm_password.init() } - - WalletSeedVerify { - id: wallet_seed_verify - visible: false - phrase: root.phrase - onSig_verified: { - stack_create_wallet.push(confirm_password) - confirm_password.init() - } - onSig_skipped: { - stack_create_wallet.push(wallet_seed_accept) - wallet_seed_accept.init() - } + onSig_skipped: { + _stack_view.push(wallet_seed_accept) + wallet_seed_accept.init() } + } - WalletSeedSkipAccept { - id: wallet_seed_accept - visible: false - onSig_skip: { - stack_create_wallet.replace(confirm_password) - confirm_password.init() - } - onSig_not_skip: { - stack_create_wallet.pop() - } + WalletSeedSkipAccept { + id: wallet_seed_accept + visible: false + onSig_skip: { + _stack_view.replace(confirm_password) + confirm_password.init() + } + onSig_not_skip: { + _stack_view.pop() } + } - ConfirmPassword { - id: confirm_password - visible: false - onSig_confirm: { - back_arrow_button.visible = false - stack_create_wallet.push(success_wallet) - } + ConfirmPassword { + id: confirm_password + visible: false + onSig_confirm: { + back_arrow_button.visible = false + _stack_view.push(success_wallet) } + } - ImportHardware { - id: import_hardware - visible: false - onSig_import: { - bsApp.importHWWallet(hwDeviceModel.selDevice) - root.close() - stack_create_wallet.pop(null) - } - onVisibleChanged: { - if (!visible) { - bsApp.stopHWWalletsPolling() - } + ImportHardware { + id: import_hardware + visible: false + onSig_import: { + bsApp.importHWWallet(hwDeviceModel.selDevice) + root.close() + _stack_view.pop(null) + } + onVisibleChanged: { + if (!visible) { + bsApp.stopHWWalletsPolling() } } + } - ImportWatchingWallet { - id: import_watching_wallet - visible: false - onSig_import: { - root.close() - stack_create_wallet.pop(null) - } - onSig_full: { - stack_create_wallet.replace(import_wallet) - import_wallet.init() - } + ImportWatchingWallet { + id: import_watching_wallet + visible: false + onSig_import: { + root.close() + _stack_view.pop(null) } + onSig_full: { + _stack_view.replace(import_wallet) + import_wallet.init() + } + } - ImportWallet { - id: import_wallet - visible: false - onSig_import: { - stack_create_wallet.push(confirm_password) - confirm_password.init() - root.phrase = import_wallet.phrase - } - onSig_only_watching: { - stack_create_wallet.replace(import_watching_wallet) - } + ImportWallet { + id: import_wallet + visible: false + onSig_import: { + _stack_view.push(confirm_password) + confirm_password.init() + root.phrase = import_wallet.phrase } + onSig_only_watching: { + _stack_view.replace(import_watching_wallet) + } + } - SuccessNewWallet { - id: success_wallet - visible: false - onSig_finish: { - back_arrow_button.visible = true - root.close() - stack_create_wallet.pop(null) - } + SuccessNewWallet { + id: success_wallet + visible: false + onSig_finish: { + set_visible_arrow(true) + root.close() + _stack_view.pop(null) } } function init() { if (bsApp.settingActivated === true) { - stack_create_wallet.pop() - stack_create_wallet.replace(start_create, StackView.Immediate) + _stack_view.pop() + _stack_view.replace(start_create, StackView.Immediate) start_create.init() } } diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 6f9d7f7f2..97567a0e1 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -23,6 +23,7 @@ Item { id: overview signal newWalletClicked(); + signal curWalletIndexChanged(index : int) CreateNewWallet { id: createNewWalletPage @@ -46,6 +47,14 @@ Item { objectName: "walletsComboBox" model: bsApp.walletsList font.pointSize: 12 + + Component.onCompleted: { + curWalletIndexChanged(0) + } + + onActivated: (ind) => { + curWalletIndexChanged(ind) + } } Column { Label { diff --git a/GUI/QtQuick/qml/Receive/ReceivePopup.qml b/GUI/QtQuick/qml/Receive/ReceivePopup.qml new file mode 100644 index 000000000..fadf2a6c3 --- /dev/null +++ b/GUI/QtQuick/qml/Receive/ReceivePopup.qml @@ -0,0 +1,23 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +CustomPopup { + id: root + + property var phrase + + objectName: "create_wallet" + + _stack_view.initialItem: receive_qr_code + _arrow_but_visibility: !receive_qr_code.visible + + ReceiveQrCode { + id: receive_qr_code + visible: false + } +} diff --git a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml new file mode 100644 index 000000000..1695cec26 --- /dev/null +++ b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml @@ -0,0 +1,106 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + + +ColumnLayout { + + id: layout + + signal sig_finish() + + height: 544 + width: 580 + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: "Generate address" + } + + + Label { + id: subtitle + Layout.alignment: Qt.AlignCenter + Layout.topMargin: 16 + Layout.preferredHeight : 16 + text: qsTr("Bitcoins sent to this address will appear in:") + color: "#7A88B0" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + + Label { + id: wallet_name + Layout.alignment: Qt.AlignCenter + Layout.topMargin: 6 + Layout.preferredHeight : 16 + text: bsApp.walletsList[currentWalletIndex] + color: "#E2E7FF" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + + Image { + id: wallet_icon + + Layout.topMargin: 48 + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : 214 + Layout.preferredWidth : 214 + + source: "qrc:/images/success.png" + width: 214 + height: 214 + } + + Label { + Layout.topMargin: 30 + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + text: bsApp.generatedAddress + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Medium + color: "#E2E7FF" + } + + Label { + Layout.fillWidth: true + Layout.fillHeight: true + } + + CustomButton { + id: copy_but + + width: 530 + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + text: qsTr("Copy to clipboard") + + icon.source: "qrc:/images/copy_icon.png" + icon.width: 24 + icon.height: 24 + icon.color: "#FFFFFF" + + Component.onCompleted: { + copy_but.preferred = true + } + + function click_enter() { + bsApp.copySeedToClipboard(bsApp.generatedAddress) + } + + } +} diff --git a/GUI/QtQuick/qml/Receive/qmldir b/GUI/QtQuick/qml/Receive/qmldir new file mode 100644 index 000000000..880ab8d50 --- /dev/null +++ b/GUI/QtQuick/qml/Receive/qmldir @@ -0,0 +1,4 @@ +module ReceiveControls + +ReceivePopup 1.0 ReceivePopup.qml +ReceiveQrCode 1.0 ReceiveQrCode.qml \ No newline at end of file diff --git a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml new file mode 100644 index 000000000..3ddc89ad7 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml @@ -0,0 +1,151 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + + +Window { + id: root + + property var phrase + + property int navig_bar_width: 40 + property alias _stack_view: stack_create_wallet + property alias _arrow_but_visibility: back_arrow_button.visible + + visible: true + flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog + + maximumHeight: rect.height + maximumWidth: rect.width + + minimumHeight: rect.height + minimumWidth: rect.width + + height: rect.height + width: rect.width + + color: "transparent" + + x: mainWindow.x + (mainWindow.width - width)/2 + y: mainWindow.y + 28 + + Rectangle { + id: rect + + property var phrase + color: "#191E2A" + opacity: 1 + radius: 16 + height: stack_create_wallet.height + navig_bar_width + width: stack_create_wallet.width + border.color : "#3C435A" + border.width : 1 + + Image { + id: close_button + + anchors.top: parent.top + anchors.topMargin: 24 + anchors.right: parent.right + anchors.rightMargin: 24 + + source: "qrc:/images/close_button.png" + width: 16 + height: 16 + MouseArea { + anchors.fill: parent + onClicked: { + root.close() + stack_create_wallet.pop(null) + } + } + } + + Image { + id: back_arrow_button + + anchors.top: parent.top + anchors.topMargin: 24 + anchors.left: parent.left + anchors.leftMargin: 24 + + source: "qrc:/images/back_arrow.png" + width: 20 + height: 16 + MouseArea { + anchors.fill: parent + onClicked: { + stack_create_wallet.pop() + } + } + } + + StackView { + id: stack_create_wallet + + anchors.top: close_button.bottom + anchors.topMargin: 0 + + implicitHeight: currentItem.height + implicitWidth: currentItem.width + + + pushEnter: Transition { + PropertyAnimation { + property: "opacity" + from: 0 + to:1 + duration: 200 + } + } + + pushExit: Transition { + PropertyAnimation { + property: "opacity" + from: 1 + to:0 + duration: 200 + } + } + + popEnter: Transition { + PropertyAnimation { + property: "opacity" + from: 0 + to:1 + duration: 200 + } + } + + popExit: Transition { + PropertyAnimation { + property: "opacity" + from: 1 + to:0 + duration: 200 + } + } + + replaceEnter: Transition { + PropertyAnimation { + property: "opacity" + from: 0 + to:1 + duration: 10 + } + } + + replaceExit: Transition { + PropertyAnimation { + property: "opacity" + from: 1 + to:0 + duration: 10 + } + } + } + + } + +} diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 86187d753..d9f5452ee 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -12,15 +12,10 @@ import QtQuick 2 import QtQuick.Controls 2.9 import QtQuick.Layouts 1.3 import QtQuick.Window 2 + import "StyledControls" 1 import "BsStyles" 1 -//import Qt.labs.settings 1.0 - -/* -import "BsControls" -import "BsDialogs" -import "js/helper.js" as JsHelper -*/ +import "Receive" 1 ApplicationWindow { id: mainWindow @@ -31,6 +26,7 @@ ApplicationWindow { title: qsTr("BlockSettle Terminal") property var currentDialog: ({}) + property int currentWalletIndex readonly property int resizeAnimationDuration: 25 Component.onCompleted: { @@ -40,7 +36,12 @@ ApplicationWindow { } CreateWallet { - id: createWallet + id: create_wallet + visible: false + } + + ReceivePopup { + id: receive_popup visible: false } @@ -145,7 +146,11 @@ ApplicationWindow { onClicked: { topMenuBtnClicked(btnReceive) - stack.push(receivePage) + //stack.push(receivePage) + bsApp.generateNewAddress(currentWalletIndex, true) + receive_popup.show() + receive_popup.raise() + receive_popup.requestActivate() } } CustomTitleToolButton { @@ -174,10 +179,14 @@ ApplicationWindow { OverviewPage { id: overviewPage onNewWalletClicked: { - createWallet.init() - createWallet.show() - createWallet.raise() - createWallet.requestActivate() + create_wallet.init() + create_wallet.show() + create_wallet.raise() + create_wallet.requestActivate() + } + + onCurWalletIndexChanged: (ind) => { + currentWalletIndex = ind } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 582154574..2626f35e7 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -71,7 +71,6 @@ images/back_arrow.png qml/WalletSeed.qml qml/StyledControls/CustomSeedLabel.qml - images/copy_seed.png qml/WalletSeedVerify.qml qml/StyledControls/CustomSeedTextInput.qml images/warning_icon.png @@ -91,5 +90,10 @@ qml/ImportWallet.qml images/success.png qml/SuccessNewWallet.qml + qml/StyledControls/CustomPopup.qml + qml/Receive/ReceiveQrCode.qml + images/copy_icon.png + qml/Receive/qmldir + qml/Receive/ReceivePopup.qml From 9aff476030d1cf994ec47e75c975310d14006206 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 14 Jan 2023 06:00:54 +0200 Subject: [PATCH 048/436] qml: refactoring: create folder CreateWallet --- .../{ => CreateWallet}/ConfirmPassword.qml | 4 ++-- .../qml/{ => CreateWallet}/CreateWallet.qml | 4 ++-- .../qml/{ => CreateWallet}/ImportHardware.qml | 4 ++-- .../qml/{ => CreateWallet}/ImportWallet.qml | 4 ++-- .../ImportWatchingWallet.qml | 4 ++-- .../{ => CreateWallet}/StartCreateWallet.qml | 4 ++-- .../{ => CreateWallet}/SuccessNewWallet.qml | 4 ++-- .../{ => CreateWallet}/TermsAndConditions.qml | 4 ++-- .../qml/{ => CreateWallet}/WalletSeed.qml | 5 ++-- .../WalletSeedSkipAccept.qml | 4 ++-- .../{ => CreateWallet}/WalletSeedVerify.qml | 5 ++-- GUI/QtQuick/qml/CreateWallet/qmldir | 13 +++++++++++ GUI/QtQuick/qml/main.qml | 1 + GUI/QtQuick/qtquick.qrc | 23 ++++++++++--------- 14 files changed, 48 insertions(+), 35 deletions(-) rename GUI/QtQuick/qml/{ => CreateWallet}/ConfirmPassword.qml (98%) rename GUI/QtQuick/qml/{ => CreateWallet}/CreateWallet.qml (98%) rename GUI/QtQuick/qml/{ => CreateWallet}/ImportHardware.qml (97%) rename GUI/QtQuick/qml/{ => CreateWallet}/ImportWallet.qml (98%) rename GUI/QtQuick/qml/{ => CreateWallet}/ImportWatchingWallet.qml (98%) rename GUI/QtQuick/qml/{ => CreateWallet}/StartCreateWallet.qml (98%) rename GUI/QtQuick/qml/{ => CreateWallet}/SuccessNewWallet.qml (96%) rename GUI/QtQuick/qml/{ => CreateWallet}/TermsAndConditions.qml (98%) rename GUI/QtQuick/qml/{ => CreateWallet}/WalletSeed.qml (97%) rename GUI/QtQuick/qml/{ => CreateWallet}/WalletSeedSkipAccept.qml (97%) rename GUI/QtQuick/qml/{ => CreateWallet}/WalletSeedVerify.qml (98%) create mode 100644 GUI/QtQuick/qml/CreateWallet/qmldir diff --git a/GUI/QtQuick/qml/ConfirmPassword.qml b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml similarity index 98% rename from GUI/QtQuick/qml/ConfirmPassword.qml rename to GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml index 96288fa20..9180d8d28 100644 --- a/GUI/QtQuick/qml/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml @@ -3,8 +3,8 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 -import "StyledControls" -import "BsStyles" +import "../BsStyles" +import "../StyledControls" ColumnLayout { diff --git a/GUI/QtQuick/qml/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml similarity index 98% rename from GUI/QtQuick/qml/CreateWallet.qml rename to GUI/QtQuick/qml/CreateWallet/CreateWallet.qml index 52808440d..1e1c6bb53 100644 --- a/GUI/QtQuick/qml/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml @@ -3,8 +3,8 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 -import "BsStyles" -import "StyledControls" +import "../BsStyles" +import "../StyledControls" CustomPopup { id: root diff --git a/GUI/QtQuick/qml/ImportHardware.qml b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml similarity index 97% rename from GUI/QtQuick/qml/ImportHardware.qml rename to GUI/QtQuick/qml/CreateWallet/ImportHardware.qml index f110b42b9..8ed47525a 100644 --- a/GUI/QtQuick/qml/ImportHardware.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml @@ -3,8 +3,8 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 -import "StyledControls" -import "BsStyles" +import "../BsStyles" +import "../StyledControls" ColumnLayout { diff --git a/GUI/QtQuick/qml/ImportWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml similarity index 98% rename from GUI/QtQuick/qml/ImportWallet.qml rename to GUI/QtQuick/qml/CreateWallet/ImportWallet.qml index f9e6d5f66..803027bf3 100644 --- a/GUI/QtQuick/qml/ImportWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml @@ -3,8 +3,8 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 -import "StyledControls" -import "BsStyles" +import "../BsStyles" +import "../StyledControls" ColumnLayout { diff --git a/GUI/QtQuick/qml/ImportWatchingWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml similarity index 98% rename from GUI/QtQuick/qml/ImportWatchingWallet.qml rename to GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml index 4096c76db..6e05cbdf3 100644 --- a/GUI/QtQuick/qml/ImportWatchingWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml @@ -5,8 +5,8 @@ import QtQuick.Layouts 1.15 import QtQuick.Dialogs 1.3 -import "StyledControls" -import "BsStyles" +import "../BsStyles" +import "../StyledControls" ColumnLayout { diff --git a/GUI/QtQuick/qml/StartCreateWallet.qml b/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml similarity index 98% rename from GUI/QtQuick/qml/StartCreateWallet.qml rename to GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml index 68f4395b3..ac71d8046 100644 --- a/GUI/QtQuick/qml/StartCreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml @@ -3,8 +3,8 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 -import "StyledControls" -import "BsStyles" +import "../BsStyles" +import "../StyledControls" ColumnLayout { diff --git a/GUI/QtQuick/qml/SuccessNewWallet.qml b/GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml similarity index 96% rename from GUI/QtQuick/qml/SuccessNewWallet.qml rename to GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml index 4af2f78fe..30a2ba92b 100644 --- a/GUI/QtQuick/qml/SuccessNewWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml @@ -3,8 +3,8 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 -import "StyledControls" -import "BsStyles" +import "../BsStyles" +import "../StyledControls" ColumnLayout { diff --git a/GUI/QtQuick/qml/TermsAndConditions.qml b/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml similarity index 98% rename from GUI/QtQuick/qml/TermsAndConditions.qml rename to GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml index c3b195c7f..f7b3cba30 100644 --- a/GUI/QtQuick/qml/TermsAndConditions.qml +++ b/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml @@ -3,8 +3,8 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 -import "StyledControls" -import "BsStyles" +import "../BsStyles" +import "../StyledControls" ColumnLayout { diff --git a/GUI/QtQuick/qml/WalletSeed.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml similarity index 97% rename from GUI/QtQuick/qml/WalletSeed.qml rename to GUI/QtQuick/qml/CreateWallet/WalletSeed.qml index 71a4998b9..d6357cfb5 100644 --- a/GUI/QtQuick/qml/WalletSeed.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml @@ -3,9 +3,8 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 -import "StyledControls" -import "BsStyles" - +import "../BsStyles" +import "../StyledControls" ColumnLayout { diff --git a/GUI/QtQuick/qml/WalletSeedSkipAccept.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml similarity index 97% rename from GUI/QtQuick/qml/WalletSeedSkipAccept.qml rename to GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml index decd5a237..4ef1e9aa5 100644 --- a/GUI/QtQuick/qml/WalletSeedSkipAccept.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml @@ -3,8 +3,8 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 -import "StyledControls" -import "BsStyles" +import "../BsStyles" +import "../StyledControls" ColumnLayout { diff --git a/GUI/QtQuick/qml/WalletSeedVerify.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml similarity index 98% rename from GUI/QtQuick/qml/WalletSeedVerify.qml rename to GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml index 149ad2678..d610c92e8 100644 --- a/GUI/QtQuick/qml/WalletSeedVerify.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml @@ -3,9 +3,8 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 -import "StyledControls" -import "BsStyles" - +import "../BsStyles" +import "../StyledControls" ColumnLayout { id: layout diff --git a/GUI/QtQuick/qml/CreateWallet/qmldir b/GUI/QtQuick/qml/CreateWallet/qmldir new file mode 100644 index 000000000..d12ffe5ab --- /dev/null +++ b/GUI/QtQuick/qml/CreateWallet/qmldir @@ -0,0 +1,13 @@ +module CreateWalletControls + +ConfirmPassword 1.0 ConfirmPassword.qml +CreateWallet 1.0 CreateWallet.qml +ImportHardware 1.0 ImportHardware.qml +ImportWallet 1.0 ImportWallet.qml +ImportWatchingWallet 1.0 ImportWatchingWallet.qml +StartCreateWallet 1.0 StartCreateWallet.qml +SuccessNewWallet 1.0 SuccessNewWallet.qml +TermsAndConditions 1.0 TermsAndConditions.qml +WalletSeed 1.0 WalletSeed.qml +WalletSeedSkipAccept 1.0 WalletSeedSkipAccept.qml +WalletSeedVerify 1.0 WalletSeedVerify.qml \ No newline at end of file diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index d9f5452ee..7652b8956 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -16,6 +16,7 @@ import QtQuick.Window 2 import "StyledControls" 1 import "BsStyles" 1 import "Receive" 1 +import "CreateWallet" 1 ApplicationWindow { id: mainWindow diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 2626f35e7..e8feba983 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -61,39 +61,40 @@ images/plugins_icon_unchoosed.png images/transactions_icon_unchoosed.png images/explorer_icon_unchoosed.png - qml/TermsAndConditions.qml TermsAndConditions.txt images/close_button.png - qml/CreateWallet.qml qml/StyledControls/CustomTitleLabel.qml images/wallet icon.png - qml/StartCreateWallet.qml images/back_arrow.png - qml/WalletSeed.qml qml/StyledControls/CustomSeedLabel.qml - qml/WalletSeedVerify.qml qml/StyledControls/CustomSeedTextInput.qml images/warning_icon.png - qml/WalletSeedSkipAccept.qml images/Eye_icon _unvisible.png images/Eye_icon _visible.png - qml/ConfirmPassword.qml images/USB_icon_conn.png images/USB_icon_disconn.png - qml/ImportHardware.qml qml/StyledControls/CustomTextSwitch.qml images/wallet_file.png images/file_drop.png - qml/ImportWatchingWallet.qml images/folder_icon.png images/File.png - qml/ImportWallet.qml images/success.png - qml/SuccessNewWallet.qml qml/StyledControls/CustomPopup.qml qml/Receive/ReceiveQrCode.qml images/copy_icon.png qml/Receive/qmldir qml/Receive/ReceivePopup.qml + qml/CreateWallet/ConfirmPassword.qml + qml/CreateWallet/CreateWallet.qml + qml/CreateWallet/ImportHardware.qml + qml/CreateWallet/ImportWallet.qml + qml/CreateWallet/ImportWatchingWallet.qml + qml/CreateWallet/qmldir + qml/CreateWallet/StartCreateWallet.qml + qml/CreateWallet/SuccessNewWallet.qml + qml/CreateWallet/TermsAndConditions.qml + qml/CreateWallet/WalletSeed.qml + qml/CreateWallet/WalletSeedSkipAccept.qml + qml/CreateWallet/WalletSeedVerify.qml From 4d3eb2f2b538f23ee76ad9d016360eef5f362a41 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 14 Jan 2023 10:21:37 +0200 Subject: [PATCH 049/436] QT-7 - Receive dialog add qr code icon --- GUI/QtQuick/qml/Receive/ReceiveQrCode.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml index 1695cec26..9ee358ae4 100644 --- a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml +++ b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml @@ -59,7 +59,9 @@ ColumnLayout { Layout.preferredHeight : 214 Layout.preferredWidth : 214 - source: "qrc:/images/success.png" + source: "image://QR/" + bsApp.generatedAddress + sourceSize.width: 214 + sourceSize.height: 214 width: 214 height: 214 } From b2a49520cbb1bb35ce5c455ce08e211663566838 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 14 Jan 2023 10:39:00 +0200 Subject: [PATCH 050/436] ReceiveQrCode.qml: add to label title Native segwit --- GUI/QtQuick/qml/Receive/ReceiveQrCode.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml index 9ee358ae4..b6b23dc41 100644 --- a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml +++ b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml @@ -43,7 +43,7 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: 6 Layout.preferredHeight : 16 - text: bsApp.walletsList[currentWalletIndex] + text: bsApp.walletsList[currentWalletIndex] + " / Native SegWit" color: "#E2E7FF" font.pixelSize: 14 font.family: "Roboto" From 06f7d4d7fc59c813bc54181368270aa73f75e607 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 14 Jan 2023 11:03:20 +0200 Subject: [PATCH 051/436] bug fix --- GUI/QtQuick/qml/CreateWallet/CreateWallet.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml index 1e1c6bb53..2d6f3f849 100644 --- a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml @@ -83,7 +83,6 @@ CustomPopup { id: confirm_password visible: false onSig_confirm: { - back_arrow_button.visible = false _stack_view.push(success_wallet) } } From 04606c33f75b10af9bc9fb4a6fb3de6cf800404e Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 14 Jan 2023 11:08:21 +0200 Subject: [PATCH 052/436] bug fix --- GUI/QtQuick/qml/CreateWallet/CreateWallet.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml index 2d6f3f849..68376119b 100644 --- a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml @@ -132,7 +132,6 @@ CustomPopup { id: success_wallet visible: false onSig_finish: { - set_visible_arrow(true) root.close() _stack_view.pop(null) } From 8f709acedfbcd470ad52d94c43405a5546733013 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sun, 15 Jan 2023 02:49:02 +0200 Subject: [PATCH 053/436] qml improvements --- GUI/QtQuick/images/explorer_icon.png | Bin 233 -> 482 bytes GUI/QtQuick/images/plugins_icon.png | Bin 287 -> 330 bytes GUI/QtQuick/images/success.png | Bin 4652 -> 3273 bytes GUI/QtQuick/images/transactions_icon.png | Bin 389 -> 615 bytes GUI/QtQuick/qml/BsStyles/BSStyle.qml | 19 +++++++++++------- .../qml/CreateWallet/SuccessNewWallet.qml | 8 ++++---- .../qml/StyledControls/CustomButton.qml | 4 ++-- 7 files changed, 18 insertions(+), 13 deletions(-) diff --git a/GUI/QtQuick/images/explorer_icon.png b/GUI/QtQuick/images/explorer_icon.png index 0d8f97e4a6ddb0cbbdd67dcaf6d9f7fb5df66650..2b4579dc4e3ede6ac596bccdf4886d90da985351 100755 GIT binary patch delta 422 zcmV;X0a^a(0pbIY83+ad007{3J@}Dc7?C6#e*t$%L_t(|0o_zxPQpMC{Gt;=g5cSH!4LWm85eqYUCLJ+NJU<3Ds!5~wZ4bN4azpcrEhQsf7a@N3A zfBDu5V&HW}(Mw9Vhh#-YWTPdMwldD1=L+kV3R@0|?m^+Up6{ZFWZrE2jXWWMA%uXV zaCh&mYS+PtGd6)Cq!>8yn#skt7{| z-$_J4RCod1RnZNCFc5u3mf*+eCa%B;PNJJQf^hcZm>#Xlq-I_!3CD zT<<;Zu07zxP$q|irpX9c@p2~LM96D}begCmED)I-V#1n${Wwud9+tGZ5r#pjS+j-h zslaB@O~t#!#?)0O$_hsBYTT8WnFul oq6;vOSZ!%J6CMVRNB8|Ut`oefjU!ud9RL6T07*qoM6N<$g4xA-MgRZ+ delta 247 zcmVZ(;r@8ttZ;`JVT=}XBxAZoB4_ZB~Uy$;v0T{?h~%1o!& xc)U@oGNcz_?^3W_j}ymA(AH4`o42hR=N9rs{7;#?ZY%%*002ovPDHLkV1nTpZK?nO diff --git a/GUI/QtQuick/images/success.png b/GUI/QtQuick/images/success.png index e65d912a299313cbad4ede61ecfc5228e04f7906..a3ce070b59776ab34d8df546005d728b78b00bca 100644 GIT binary patch literal 3273 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 delta 319 zcmV-F0l@y}1cd{TB#}8Bks}p<0UAj}K~zXft(H3u!Y~Ym+nxYM79KZZL`)r#kQfo& ziUfjlvTzKLBmc$C!$}%G$!cQ9{+%>MR2tj1pS|9nk7m2}vF7FJP?A&V@GC@PC!Q)K zlV}I*R*^aE@`FWFwk>zft}!LWK~MyNlH$Ny%d1*|tk*zkxu|P;Y9P^nHVzM*y6c>t zbV+I~ND+|8!oFO@8#Bwq*L4UZaJk)+Uv8{(aPFQPGtj!RV>E}cE1I8tM6yuM`!WLi z<85VT0kq;FG2Bk|7TMd+=^VMqN0d`s(#Vg(cmhyIFm^>5-K3nv7_y!@A}Iaq$Bv#u z_W-ITB9tq;cPJ5w76(`|6kW*Je+<~IBfEj^4*jqz8aweRN9z-^O~2k%^#wjNq>t`f R?D7Br002ovPDHLkV1k6Rl+geH diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index ba7e87005..54d93c5aa 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -19,7 +19,7 @@ QtObject { readonly property color backgroundModalColor: "#737373" readonly property color backgroundModeLessColor: "#939393" - readonly property color disabledColor: "#22293B" + readonly property color disabledTextColor: "#71787f" readonly property color disabledBgColor: "#31383f" @@ -81,12 +81,17 @@ QtObject { //new properties readonly property color buttonsStandardColor: "#3C435A" - readonly property color buttonsStandardPressedColor: "#55000000" - readonly property color buttonsStandardHoveredColor: "#22000000" - readonly property color buttonsStandardBorderColor: "#45A6FF" + readonly property color buttonsStandardPressedColor: "#232734" + readonly property color buttonsStandardHoveredColor: "#2E3343" + readonly property color buttonsStandardBorderColor: "#FFFFFF" readonly property color buttonsPreferredColor: "#45A6FF" - readonly property color buttonsPreferredPressedColor: "#55000000" - readonly property color buttonsPreferredHoveredColor: "#22000000" - readonly property color buttonsPreferredBorderColor: "#E2E7FF" + readonly property color buttonsPreferredPressedColor: "#0077E4" + readonly property color buttonsPreferredHoveredColor: "#0085FF" + readonly property color buttonsPreferredBorderColor: "#FFFFFF" + + readonly property color buttonsTextColor: "#FFFFFF" + readonly property color buttonsDisabledTextColor: "#1C2130" + + readonly property color buttonsDisabledColor: "#32394F" } diff --git a/GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml b/GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml index 30a2ba92b..0438ab8b6 100644 --- a/GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml @@ -27,7 +27,7 @@ ColumnLayout { Image { id: wallet_icon - Layout.topMargin: 48 + Layout.topMargin: 24 Layout.alignment: Qt.AlignTop | Qt.AlignHCenter Layout.preferredHeight : 120 Layout.preferredWidth : 120 @@ -39,12 +39,12 @@ ColumnLayout { Label { - Layout.topMargin: 48 + Layout.topMargin: 16 Layout.alignment: Qt.AlignTop | Qt.AlignHCenter text: "Your wallet has successfully been created" - font.pixelSize: 16 + font.pixelSize: 14 font.family: "Roboto" - font.weight: Font.Medium + font.weight: Font.Normal color: "#E2E7FF" } diff --git a/GUI/QtQuick/qml/StyledControls/CustomButton.qml b/GUI/QtQuick/qml/StyledControls/CustomButton.qml index ffc9848a8..af5cd6fae 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButton.qml @@ -21,7 +21,7 @@ Button { font.pixelSize: 16 font.family: "Roboto" font.weight: Font.Bold - palette.buttonText: enabled ? "#FFFFFF" : "#020817" + palette.buttonText: enabled ? BSStyle.buttonsTextColor : BSStyle.buttonsDisabledTextColor icon.color: "transparent" @@ -31,7 +31,7 @@ Button { background: Rectangle { implicitWidth: control.width implicitHeight: 50 - color: preferred ? (!control.enabled ? BSStyle.disabledColor : + color: preferred ? (!control.enabled ? BSStyle.buttonsDisabledColor : (control.down ? BSStyle.buttonsPreferredPressedColor : (control.hovered ? BSStyle.buttonsPreferredHoveredColor : BSStyle.buttonsPreferredColor))): (!control.enabled ? BSStyle.disabledColor : From 0f9fee18fb533c4c23dcfee55735c6bb1e702397 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 16 Jan 2023 23:50:45 +0300 Subject: [PATCH 054/436] wallet balance model supercedes wallets list --- GUI/QtQuick/AddressListModel.cpp | 113 +++++++++++++---------- GUI/QtQuick/AddressListModel.h | 12 ++- GUI/QtQuick/FeeSuggModel.cpp | 72 +++++++++++++++ GUI/QtQuick/FeeSuggModel.h | 48 ++++++++++ GUI/QtQuick/QtQuickAdapter.cpp | 72 ++++++++------- GUI/QtQuick/QtQuickAdapter.h | 19 +--- GUI/QtQuick/WalletBalancesModel.cpp | 135 ++++++++++++++++++++++++++++ GUI/QtQuick/WalletBalancesModel.h | 75 ++++++++++++++++ GUI/QtQuick/qml/OverviewPage.qml | 21 +++-- common | 2 +- 10 files changed, 465 insertions(+), 104 deletions(-) create mode 100644 GUI/QtQuick/FeeSuggModel.cpp create mode 100644 GUI/QtQuick/FeeSuggModel.h create mode 100644 GUI/QtQuick/WalletBalancesModel.cpp create mode 100644 GUI/QtQuick/WalletBalancesModel.h diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index f3a0b6da2..ff557c378 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -9,7 +9,7 @@ */ #include "AddressListModel.h" -#include "Address.h" +#include #include "BTCNumericTypes.h" namespace { @@ -20,30 +20,45 @@ namespace { }; } -QmlAddressListModel::QmlAddressListModel(const std::shared_ptr&, QObject* parent) - : QAbstractTableModel(parent) -{ - table.append({tr("Address"), tr("Balance (BTC)"), tr("#Tx"), tr("Comment")}); -} +QmlAddressListModel::QmlAddressListModel(const std::shared_ptr& logger + , QObject* parent) + : QAbstractTableModel(parent), logger_(logger) + , header_({ tr("Address"), tr("Balance (BTC)"), tr("#Tx"), tr("Comment") }) +{} int QmlAddressListModel::rowCount(const QModelIndex &) const { - return table.size(); + return table_.size() + 1; } int QmlAddressListModel::columnCount(const QModelIndex &) const { - return 4; + return header_.size(); } QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const { - if (index.column() > 3) { - return {}; - } switch (role) { case TableDataRole: - return table.at(index.row()).at(index.column()); + if (index.row() == 0) { + return header_.at(index.column()); + } + else { + const int row = index.row() - 1; + try { + switch (index.column()) { + case 0: return table_.at(row).at(0); + case 1: return QString::number(pendingBalances_.at(addresses_.at(row).id()).balance / BTCNumericTypes::BalanceDivider, 'f', 8); + case 2: return QString::number(pendingBalances_.at(addresses_.at(row).id()).nbTx); + case 3: return table_.at(row).at(1); + default: return QString{}; + } + } + catch (const std::exception&) { + return QString{}; + } + } + break; case HeadingRole: return (index.row() == 0); case FirstColRole: @@ -58,55 +73,63 @@ QHash QmlAddressListModel::roleNames() const return kRoles; } -void QmlAddressListModel::addRow(const QVector& row) +void QmlAddressListModel::addRow(const std::string& walletId, const QVector& row) { - beginInsertRows(QModelIndex(), rowCount(), rowCount()); + if (walletId != expectedWalletId_) { + logger_->warn("[QmlAddressListModel::addRow] wallet {} not expected ({})", walletId, expectedWalletId_); + return; + } try { - const auto& addr = bs::Address::fromAddressString(row.at(0).toStdString()); - const auto& itAddr = pendingBalances_.find(addr.id()); - if (itAddr != pendingBalances_.end()) { - auto rowCopy = row; - rowCopy[1] = QString::number(itAddr->second.balance / BTCNumericTypes::BalanceDivider, 'f', 8); - rowCopy[2] = QString::number(itAddr->second.nbTx); - pendingBalances_.erase(itAddr); - table.append(rowCopy); - } - else { - table.append(row); - } + addresses_.push_back(bs::Address::fromAddressString(row.at(0).toStdString())); } catch (const std::exception&) { - table.append(row); + addresses_.push_back(bs::Address{}); } + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + table_.append(row); endInsertRows(); } -void QmlAddressListModel::updateRow(const BinaryData& addrPubKey, uint64_t bal, uint32_t nbTx) +void QmlAddressListModel::addRows(const std::string& walletId, const QVector>& rows) { - bool updated = false; - for (int i = 1; i < table.size(); ++ i) { - auto& row = table[i]; + if (walletId != expectedWalletId_) { + logger_->warn("[QmlAddressListModel::addRows] wallet {} not expected ({})", walletId, expectedWalletId_); + return; + } + if (rows.empty()) { + return; + } + for (const auto& row : rows) { try { - const auto& addr = bs::Address::fromAddressString(row.at(0).toStdString()); - if (addr.id() == addrPubKey) { - row[1] = QString::number(bal / BTCNumericTypes::BalanceDivider, 'f', 8); - row[2] = QString::number(nbTx); - emit dataChanged(createIndex(i, 1), createIndex(i, 2)); - updated = true; - break; - } + addresses_.push_back(bs::Address::fromAddressString(row.at(0).toStdString())); + } + catch (const std::exception&) { + addresses_.push_back(bs::Address{}); } - catch (const std::exception&) {} } - if (!updated) { - pendingBalances_[addrPubKey] = { bal, nbTx }; + beginInsertRows(QModelIndex(), rowCount(), rowCount() + rows.size() - 1); + table_.append(rows); + endInsertRows(); +} + +void QmlAddressListModel::updateRow(const BinaryData& addrPubKey, uint64_t bal, uint32_t nbTx) +{ + pendingBalances_[addrPubKey] = { bal, nbTx }; + for (int i = 0; i < table_.size(); ++i) { + const auto& addr = addresses_.at(i); + //logger_->debug("[QmlAddressListModel::updateRow] {} {} {}", addr.display(), bal, nbTx); + if (addr.id() == addrPubKey) { + emit dataChanged(createIndex(i + 1, 1), createIndex(i + 1, 2)); + break; + } } } -void QmlAddressListModel::clear() +void QmlAddressListModel::reset(const std::string& expectedWalletId) { - pendingBalances_.clear(); + expectedWalletId_ = expectedWalletId; beginResetModel(); - table.remove(1, table.size() - 1); + addresses_.clear(); + table_.clear(); endResetModel(); } diff --git a/GUI/QtQuick/AddressListModel.h b/GUI/QtQuick/AddressListModel.h index e852b2079..c79d2667d 100644 --- a/GUI/QtQuick/AddressListModel.h +++ b/GUI/QtQuick/AddressListModel.h @@ -14,6 +14,7 @@ #include #include #include +#include "Address.h" #include "BinaryData.h" namespace spdlog { @@ -32,18 +33,23 @@ class QmlAddressListModel : public QAbstractTableModel QVariant data(const QModelIndex& index, int role) const override; QHash roleNames() const override; - void addRow(const QVector&); + void addRow(const std::string& walletId, const QVector&); + void addRows(const std::string& walletId, const QVector>&); void updateRow(const BinaryData& addr, uint64_t bal, uint32_t nbTx); - void clear(); + void reset(const std::string& expectedWalletId); private: - QVector> table; + std::shared_ptr logger_; + const QStringList header_; + QVector> table_; + std::vector addresses_; struct PendingBalance { uint64_t balance{ 0 }; uint32_t nbTx{ 0 }; }; std::map pendingBalances_; + std::string expectedWalletId_; }; #endif // ADDRESS_LIST_MODEL_H diff --git a/GUI/QtQuick/FeeSuggModel.cpp b/GUI/QtQuick/FeeSuggModel.cpp new file mode 100644 index 000000000..fe5ab6e34 --- /dev/null +++ b/GUI/QtQuick/FeeSuggModel.cpp @@ -0,0 +1,72 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "FeeSuggModel.h" +#include "Address.h" +#include "BTCNumericTypes.h" + +namespace { + static const QHash kRoles{ + {FeeSuggestionModel::TextRole, "text"}, + {FeeSuggestionModel::BlocksRole, "nb_blocks"}, + {FeeSuggestionModel::TimeRole, "time"}, + {FeeSuggestionModel::ValueRole, "value"} + }; +} + +FeeSuggestionModel::FeeSuggestionModel(const std::shared_ptr& logger, QObject* parent) + : QAbstractTableModel(parent), logger_(logger) +{} + +int FeeSuggestionModel::rowCount(const QModelIndex &) const +{ + return data_.size(); +} + +int FeeSuggestionModel::columnCount(const QModelIndex &) const +{ + return 1; +} + +QVariant FeeSuggestionModel::data(const QModelIndex& index, int role) const +{ + switch (role) { + case TextRole: + return tr("%1 blocks (%2 minutes): %3 s/b").arg(data_.at(index.row()).nbBlocks) + .arg(data_.at(index.row()).minutes).arg(data_.at(index.row()).satoshis); + case BlocksRole: + return data_.at(index.row()).nbBlocks; + case TimeRole: + return data_.at(index.row()).minutes; + case ValueRole: + return data_.at(index.row()).satoshis; + default: break; + } + return QVariant(); +} + +QHash FeeSuggestionModel::roleNames() const +{ + return kRoles; +} + +void FeeSuggestionModel::addRow(const FeeSuggestion& row) +{ + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + data_.push_back(row); + endInsertRows(); +} + +void FeeSuggestionModel::clear() +{ + beginResetModel(); + data_.clear(); + endResetModel(); +} diff --git a/GUI/QtQuick/FeeSuggModel.h b/GUI/QtQuick/FeeSuggModel.h new file mode 100644 index 000000000..e00a53fc9 --- /dev/null +++ b/GUI/QtQuick/FeeSuggModel.h @@ -0,0 +1,48 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef FEE_SUGG_MODEL_H +#define FEE_SUGG_MODEL_H + +#include +#include +#include +#include "BinaryData.h" + +namespace spdlog { + class logger; +} + +class FeeSuggestionModel : public QAbstractTableModel +{ + Q_OBJECT +public: + enum TableRoles { TextRole = Qt::DisplayRole, BlocksRole = Qt::UserRole, TimeRole, ValueRole }; + FeeSuggestionModel(const std::shared_ptr&, QObject* parent = nullptr); + + int rowCount(const QModelIndex & = QModelIndex()) const override; + int columnCount(const QModelIndex & = QModelIndex()) const override; + QVariant data(const QModelIndex& index, int role) const override; + QHash roleNames() const override; + + struct FeeSuggestion { + uint32_t nbBlocks; + unsigned minutes; + uint64_t satoshis; + }; + void addRow(const FeeSuggestion&); + void clear(); + +private: + std::shared_ptr logger_; + std::vector data_; +}; + +#endif // FEE_SUGG_MODEL_H diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index c9fe9420d..5c3975a4a 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -34,8 +34,9 @@ #include "BSTerminalSplashScreen.h" #include "QTXSignRequest.h" #include "TxOutputsModel.h" -#include "Wallets/ProtobufHeadlessUtils.h" #include "SettingsAdapter.h" +#include "Wallets/ProtobufHeadlessUtils.h" +#include "WalletBalancesModel.h" #include "common.pb.h" #include "hardware_wallet.pb.h" @@ -130,6 +131,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) txOutputsModel_ = new TxOutputsModel(logger, this); txInputsModel_ = new TxInputsModel(logger, txOutputsModel_, this); hwDeviceModel_ = new HwDeviceModel(this); + walletBalances_ = new WalletBalancesModel(logger, this); } QtQuickAdapter::~QtQuickAdapter() @@ -206,6 +208,8 @@ void QtQuickAdapter::run(int &argc, char **argv) qmlRegisterInterface("QUTXO"); qmlRegisterInterface("QUTXOList"); qmlRegisterInterface("QTxDetails"); + qmlRegisterUncreatableMetaObject(WalletBalance::staticMetaObject, "wallet.balance" + , 1, 0, "WalletBalance", tr("Error: only enums")); //need to read files in qml qputenv("QML_XHR_ALLOW_FILE_READ", QByteArray("1")); @@ -223,6 +227,7 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("txInputsModel"), txInputsModel_); rootCtxt_->setContextProperty(QLatin1Literal("txOutputsModel"), txOutputsModel_); rootCtxt_->setContextProperty(QLatin1Literal("hwDeviceModel"), hwDeviceModel_); + rootCtxt_->setContextProperty(QLatin1Literal("walletBalances"), walletBalances_); engine.addImageProvider(QLatin1Literal("QR"), new QRImageProvider); engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); @@ -264,7 +269,7 @@ void QtQuickAdapter::run(int &argc, char **argv) QStringList QtQuickAdapter::txWalletsList() const { QStringList result = { tr("All wallets") }; - result.append(walletsList_); + result.append(walletBalances_->wallets()); return result; } @@ -515,7 +520,7 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) } break; case SignerMessage::kCreatedWallet: - walletsList_.clear(); + walletBalances_->clear(); logger_->debug("[{}] wallet {} created: {}", __func__ //TODO: show something in the GUI if needed , msg.created_wallet().wallet_id(), msg.created_wallet().error_msg()); break; @@ -564,7 +569,7 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) } catch (const std::exception &) {} } - processWalletAddresses(addresses); + processWalletAddresses(msg.wallet_addresses().wallet_id(), addresses); } break; @@ -765,18 +770,17 @@ void QtQuickAdapter::createWallet(bool primary) std::string QtQuickAdapter::hdWalletIdByIndex(int index) { - if ((index < 0) || (index >= walletsList_.size())) { + const auto& walletsList = walletBalances_->wallets(); + if ((index < 0) || (index >= walletsList.size())) { return {}; } - const auto& walletName = walletsList_.at(index).toStdString(); - std::string walletId; + const auto& walletName = walletsList.at(index).toStdString(); for (const auto& wallet : hdWallets_) { if (wallet.second.name == walletName) { - walletId = wallet.first; - break; + return wallet.first; } } - return walletId; + return {}; } std::string QtQuickAdapter::generateWalletName() const @@ -799,20 +803,14 @@ std::string QtQuickAdapter::generateWalletName() const void QtQuickAdapter::walletSelected(int index) { - curWalletIndex_ = index; - const auto& walletName = walletsList_.at(index).toStdString(); + const auto& walletName = walletBalances_->wallets().at(index).toStdString(); const auto& walletId = hdWalletIdByIndex(index); - confWalletBalance_ = unconfWalletBalance_ = totalWalletBalance_ = 0; - nbUsedWalletAddresses_ = 0; - WalletsMessage msg; - msg.set_get_wallet_balances(walletId); - pushRequest(user_, userWallets_, msg.SerializeAsString(), {}, 10, std::chrono::milliseconds{500}); - addrModel_->clear(); + addrModel_->reset(walletId); + WalletsMessage msg; msg.set_wallet_get(walletId); const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); walletInfoReq_[msgId] = walletName; - walletNames_[walletId] = walletName; } void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) @@ -822,13 +820,20 @@ void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) hdWallets_[walletId] = wi; hwDeviceModel_->setLoaded(walletId); logger_->debug("[QtQuickAdapter::processWalletLoaded] {} {}", wi.name, walletId); - QMetaObject::invokeMethod(this, [this, isInitialLoad, walletName = QString::fromStdString(wi.name)] { - walletsList_.push_back(walletName); + QMetaObject::invokeMethod(this, [this, isInitialLoad, walletId, walletName = wi.name] { + walletBalances_->addWallet({ walletId, walletName }); if (isInitialLoad) { + auto comboWalletsList = rootObj_->findChild(QLatin1Literal("walletsComboBox")); + comboWalletsList->setProperty("currentIndex", 0); walletSelected(0); } emit walletsListChanged(); }); + + WalletsMessage msg; + msg.set_get_wallet_balances(walletId); + pushRequest(user_, userWallets_, msg.SerializeAsString(), {}, 10 + , std::chrono::milliseconds{ 500 }); } ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId @@ -852,10 +857,12 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId } walletInfoReq_.erase(itReq); } + QVector> addresses; for (const auto& addr : response.used_addresses()) { - addrModel_->addRow({ QString::fromStdString(addr.address()), {}, {} - , QString::fromStdString(addr.comment().empty() ? addr.index() : addr.comment()) }); + addresses.append({ QString::fromStdString(addr.address()) + , QString::fromStdString(addr.comment().empty() ? addr.index() : addr.comment()) }); } + addrModel_->addRows(response.wallet_id(), addresses); return ProcessingResult::Success; } @@ -863,13 +870,9 @@ ProcessingResult QtQuickAdapter::processWalletBalances(bs::message::SeqId respon , const WalletsMessage_WalletBalances &response) { //logger_->debug("[{}] {}", __func__, response.DebugString()); - if (response.wallet_id() != hdWalletIdByIndex(curWalletIndex_)) { - return ProcessingResult::Ignored; - } - totalWalletBalance_ = response.total_balance(); - confWalletBalance_ = response.spendable_balance(); - unconfWalletBalance_ = response.unconfirmed_balance(); - nbUsedWalletAddresses_ = response.nb_addresses(); + const WalletBalancesModel::Balance bal{ response.spendable_balance(), response.unconfirmed_balance() + , response.total_balance(), response.nb_addresses() }; + walletBalances_->setWalletBalance(response.wallet_id(), bal); for (const auto& addrBal : response.address_balances()) { addrModel_->updateRow(BinaryData::fromString(addrBal.address()), addrBal.total_balance(), addrBal.tx_count()); @@ -1283,10 +1286,10 @@ ProcessingResult QtQuickAdapter::processFeeLevels(const ArmoryMessage_FeeLevelsR ProcessingResult QtQuickAdapter::processWalletsList(const WalletsMessage_WalletsListResponse& response) { logger_->debug("[QtQuickAdapter::processWalletsList] {}", response.DebugString()); - walletsList_.clear(); + walletBalances_->clear(); for (const auto& wallet : response.wallets()) { const auto& hdWallet = bs::sync::HDWalletData::fromCommonMessage(wallet); - walletsList_.push_back(QString::fromStdString(hdWallet.name)); + walletBalances_->addWallet({hdWallet.id, hdWallet.name}); } emit walletsListChanged(); return ProcessingResult::Success; @@ -1414,14 +1417,15 @@ ProcessingResult QtQuickAdapter::processReservedUTXOs(const WalletsMessage_Reser return ProcessingResult::Success; } -void QtQuickAdapter::processWalletAddresses(const std::vector& addresses) +void QtQuickAdapter::processWalletAddresses(const std::string& walletId + , const std::vector& addresses) { if (addresses.empty()) { return; } const auto lastAddr = addresses.at(addresses.size() - 1); logger_->debug("[{}] last address: {}", __func__, lastAddr.address.display()); - addrModel_->addRow({ QString::fromStdString(lastAddr.address.display()), {}, {} + addrModel_->addRow(walletId, { QString::fromStdString(lastAddr.address.display()) , QString::fromStdString(lastAddr.index) }); generatedAddress_ = lastAddr.address; emit addressGenerated(); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 17366b8e2..524591175 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -83,6 +83,7 @@ class QTxDetails; class QTXSignRequest; class TxInputsModel; class TxOutputsModel; +class WalletBalancesModel; class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoopRuner { @@ -100,22 +101,11 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void run(int &argc, char **argv) override; - Q_PROPERTY(QStringList walletsList READ walletsList NOTIFY walletsListChanged) - QStringList walletsList() const { return walletsList_; } Q_PROPERTY(QStringList txWalletsList READ txWalletsList NOTIFY walletsListChanged) QStringList txWalletsList() const; Q_PROPERTY(QStringList txTypesList READ txTypesList) QStringList txTypesList() const { return txTypes_; } - Q_PROPERTY(QString confirmedBalance READ confirmedBalance NOTIFY walletBalanceChanged) - QString confirmedBalance() const { return QString::number(confWalletBalance_, 'f', 8); } - Q_PROPERTY(QString unconfirmedBalance READ unconfirmedBalance NOTIFY walletBalanceChanged) - QString unconfirmedBalance() const { return QString::number(unconfWalletBalance_, 'f', 8); } - Q_PROPERTY(QString totalBalance READ totalBalance NOTIFY walletBalanceChanged) - QString totalBalance() const { return QString::number(totalWalletBalance_, 'f', 8); } - Q_PROPERTY(quint32 nbUsedWalletAddresses READ nbUsedWalletAddresses NOTIFY walletBalanceChanged) - quint32 nbUsedWalletAddresses() const { return nbUsedWalletAddresses_; } - Q_PROPERTY(QString generatedAddress READ generatedAddress NOTIFY addressGenerated) QString generatedAddress() const { return QString::fromStdString(generatedAddress_.display()); } @@ -228,7 +218,7 @@ private slots: bs::message::ProcessingResult processZCInvalidated(const BlockSettle::Common::ArmoryMessage_ZCInvalidated&); bs::message::ProcessingResult processTransactions(bs::message::SeqId, const BlockSettle::Common::ArmoryMessage_Transactions&); bs::message::ProcessingResult processReservedUTXOs(const BlockSettle::Common::WalletsMessage_ReservedUTXOs&); - void processWalletAddresses(const std::vector&); + void processWalletAddresses(const std::string& walletId, const std::vector&); bs::message::ProcessingResult processTxResponse(bs::message::SeqId , const BlockSettle::Common::WalletsMessage_TxResponse&); @@ -263,11 +253,7 @@ private slots: std::map walletInfoReq_; std::map addrComments_; - QStringList walletsList_; const QStringList txTypes_; - unsigned nbUsedWalletAddresses_{ 0 }; - double confWalletBalance_{ 0 }, unconfWalletBalance_{ 0 }, totalWalletBalance_{ 0 }; - int curWalletIndex_{ 0 }; QmlAddressListModel* addrModel_{ nullptr }; TxListModel* pendingTxModel_{ nullptr }; TxListModel* txModel_{ nullptr }; @@ -275,6 +261,7 @@ private slots: TxInputsModel* txInputsModel_{ nullptr }; TxOutputsModel* txOutputsModel_{ nullptr }; HwDeviceModel* hwDeviceModel_{ nullptr }; + WalletBalancesModel* walletBalances_{ nullptr }; bs::Address generatedAddress_; bool hwDevicesPolling_{ false }; diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp new file mode 100644 index 000000000..087016a8e --- /dev/null +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -0,0 +1,135 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "WalletBalancesModel.h" +#include +#include +#include +#include "StringUtils.h" + +namespace { + static const QHash kWalletBalanceRoles{ + {WalletBalance::NameRole, "name"}, + {WalletBalance::IdRole, "id"}, + {WalletBalance::TotalRole, "total"}, + {WalletBalance::ConfirmedRole, "confirmed"}, + {WalletBalance::UnconfirmedRole, "unconfirmed"}, + {WalletBalance::NbAddrRole, "nb_used_addrs"} + }; +} + +WalletBalancesModel::WalletBalancesModel(const std::shared_ptr& logger, QObject* parent) + : QAbstractTableModel(parent), logger_(logger) +{} + +int WalletBalancesModel::rowCount(const QModelIndex &) const +{ + return wallets_.size(); +} + +QVariant WalletBalancesModel::data(const QModelIndex& index, int role) const +{ + if (index.row() < 0) { + return {}; + } + logger_->debug("[WalletBalancesModel::data] #{} {}", index.row(), role); + FieldFunc ff{ nullptr }; + switch (role) { + case WalletBalance::NameRole: + logger_->debug("[WalletBalancesModel::data] name: {}", wallets_.at(index.row()).walletName); + return QString::fromStdString(wallets_.at(index.row()).walletName); + case WalletBalance::IdRole: + return QString::fromStdString(wallets_.at(index.row()).walletId); + case WalletBalance::TotalRole: + ff = [](const Balance& bal) { return QString::number(bal.total, 'f', 8); }; + break; + case WalletBalance::ConfirmedRole: + ff = [](const Balance& bal) { return QString::number(bal.confirmed, 'f', 8); }; + break; + case WalletBalance::UnconfirmedRole: + ff = [](const Balance& bal) { return QString::number(bal.unconfirmed, 'f', 8); }; + break; + case WalletBalance::NbAddrRole: + ff = [](const Balance& bal) { return QString::number(bal.nbAddresses); }; + break; + default: break; + } + if (ff != nullptr) { + return getBalance(wallets_.at(index.row()).walletId, ff); + } + return QVariant(); +} + +QString WalletBalancesModel::getBalance(const std::string& walletId + , const FieldFunc& ff) const +{ + const auto& itBal = balances_.find(walletId); + if (itBal == balances_.end()) { + return tr("-"); + } + return ff(itBal->second); +} + +QHash WalletBalancesModel::roleNames() const +{ + return kWalletBalanceRoles; +} + +void WalletBalancesModel::addWallet(const const Wallet& wallet) +{ + for (int i = 0; i < wallets_.size(); ++i) { + const auto& w = wallets_.at(i); + if (wallet.walletId == w.walletId) { + return; + } + } + logger_->debug("[WalletBalancesModel::addWallet] adding #{}: {}", rowCount(), wallet.walletName); + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + wallets_.push_back(wallet); + endInsertRows(); +} + +QStringList WalletBalancesModel::wallets() const +{ + QStringList result; + for (const auto& w : wallets_) { + result.append(QString::fromStdString(w.walletName)); + } + return result; +} + +void WalletBalancesModel::clear() +{ + beginResetModel(); + wallets_.clear(); + balances_.clear(); + endResetModel(); +} + +void WalletBalancesModel::setWalletBalance(const std::string& walletId, const Balance& bal) +{ + balances_[walletId] = bal; + int row = -1; + for (int i = 0; i < wallets_.size(); ++i) { + const auto& w = wallets_.at(i); + if (w.walletId == walletId) { + row = i; + break; + } + } + if (row >= 0) { + //logger_->debug("[{}] {} {} found at row {}", __func__, txDet.txHash.toHexStr(), txDet.hdWalletId, row); + emit dataChanged(createIndex(row, 0), createIndex(row, 0), { WalletBalance::TotalRole + , WalletBalance::ConfirmedRole, WalletBalance::UnconfirmedRole, WalletBalance::NbAddrRole }); + } + else { + logger_->warn("[{}] {} not found", __func__, walletId); + } +} diff --git a/GUI/QtQuick/WalletBalancesModel.h b/GUI/QtQuick/WalletBalancesModel.h new file mode 100644 index 000000000..b68309079 --- /dev/null +++ b/GUI/QtQuick/WalletBalancesModel.h @@ -0,0 +1,75 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef WALLET_BALANCES_MODEL_H +#define WALLET_BALANCES_MODEL_H + +#include +#include +#include +#include +#include + +namespace spdlog { + class logger; +} + +namespace WalletBalance { + Q_NAMESPACE + enum WalletBalancesRoles { + NameRole = Qt::DisplayRole, + IdRole = Qt::UserRole, + TotalRole, + ConfirmedRole, + UnconfirmedRole, + NbAddrRole + }; + Q_ENUM_NS(WalletBalancesRoles) +} + +class WalletBalancesModel : public QAbstractTableModel +{ + Q_OBJECT +public: + + WalletBalancesModel(const std::shared_ptr&, QObject* parent = nullptr); + + int rowCount(const QModelIndex & = QModelIndex()) const override; + int columnCount(const QModelIndex & = QModelIndex()) const override { return 1; } // only wallet names + QVariant data(const QModelIndex& index, int role) const override; + QHash roleNames() const override; + + QStringList wallets() const; + void clear(); + struct Wallet { + std::string walletId; + std::string walletName; + }; + void addWallet(const Wallet&); + + struct Balance { + double confirmed{ 0 }; + double unconfirmed{ 0 }; + double total{ 0 }; + uint32_t nbAddresses{ 0 }; + }; + void setWalletBalance(const std::string& walletId, const Balance&); + +private: + using FieldFunc = std::function; + QString getBalance(const std::string& walletId, const FieldFunc&) const; + +private: + std::shared_ptr logger_; + std::vector wallets_; + std::unordered_map balances_; //key: walletId +}; + +#endif // WALLET_BALANCES_MODEL_H diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 97567a0e1..51c75ba79 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -18,6 +18,7 @@ import "BsStyles" //import "BsControls" //import "BsDialogs" //import "js/helper.js" as JsHelper +import wallet.balance 1.0 Item { id: overview @@ -45,7 +46,9 @@ Item { ComboBox { id: walletsComboBox objectName: "walletsComboBox" - model: bsApp.walletsList + model: walletBalances + textRole: "name" + valueRole: "name" font.pointSize: 12 Component.onCompleted: { @@ -62,7 +65,9 @@ Item { font.pointSize: 8 } Label { - text: qsTr("%1 BTC").arg(bsApp.confirmedBalance) + text: qsTr("%1 BTC") + .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) + , WalletBalance.ConfirmedRole)) font.pointSize: 12 } } @@ -72,7 +77,9 @@ Item { font.pointSize: 8 } Label { - text: qsTr("%1 BTC").arg(bsApp.unconfirmedBalance) + text: qsTr("%1 BTC") + .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) + , WalletBalance.UnconfirmedRole)) font.pointSize: 12 } } @@ -82,7 +89,9 @@ Item { font.pointSize: 8 } Label { - text: qsTr("%1 BTC").arg(bsApp.totalBalance) + text: qsTr("%1 BTC") + .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) + , WalletBalance.TotalRole)) font.pointSize: 12 } } @@ -92,7 +101,9 @@ Item { font.pointSize: 8 } Label { - text: qsTr("%1").arg(bsApp.nbUsedWalletAddresses) + text: qsTr("%1") + .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) + , WalletBalance.NbAddrRole)) font.pointSize: 12 } } diff --git a/common b/common index fd8484e1e..087b648d9 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit fd8484e1e4ae1c39199e6b6d43a6971637963119 +Subproject commit 087b648d97f60eff5782474aaad29793ecabd5ae From f2e46c42711e8a6f747dc4c6565f5956efe104b6 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 17 Jan 2023 16:57:27 +0300 Subject: [PATCH 055/436] Fee suggestions --- GUI/QtQuick/FeeSuggModel.cpp | 44 +++++++++++++++++++++++++---- GUI/QtQuick/FeeSuggModel.h | 8 ++++-- GUI/QtQuick/QtQuickAdapter.cpp | 17 +++++++++-- GUI/QtQuick/QtQuickAdapter.h | 3 ++ GUI/QtQuick/WalletBalancesModel.cpp | 3 +- GUI/QtQuick/qml/SendPage.qml | 21 +++++++++++--- GUI/QtQuick/qml/main.qml | 1 + 7 files changed, 80 insertions(+), 17 deletions(-) diff --git a/GUI/QtQuick/FeeSuggModel.cpp b/GUI/QtQuick/FeeSuggModel.cpp index fe5ab6e34..a8eaff301 100644 --- a/GUI/QtQuick/FeeSuggModel.cpp +++ b/GUI/QtQuick/FeeSuggModel.cpp @@ -39,12 +39,12 @@ QVariant FeeSuggestionModel::data(const QModelIndex& index, int role) const { switch (role) { case TextRole: - return tr("%1 blocks (%2 minutes): %3 s/b").arg(data_.at(index.row()).nbBlocks) - .arg(data_.at(index.row()).minutes).arg(data_.at(index.row()).satoshis); + return tr("%1 blocks (%2): %3 s/b").arg(data_.at(index.row()).nbBlocks) + .arg(data_.at(index.row()).estTime).arg(QString::number(data_.at(index.row()).satoshis, 'f', 1)); case BlocksRole: return data_.at(index.row()).nbBlocks; case TimeRole: - return data_.at(index.row()).minutes; + return data_.at(index.row()).estTime; case ValueRole: return data_.at(index.row()).satoshis; default: break; @@ -57,10 +57,42 @@ QHash FeeSuggestionModel::roleNames() const return kRoles; } -void FeeSuggestionModel::addRow(const FeeSuggestion& row) +std::map FeeSuggestionModel::feeLevels() { - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - data_.push_back(row); + return { + { 2, tr("20 minutes")}, + { 4, tr("40 minutes")}, + { 6, tr("60 minutes")}, + { 12, tr("2 hours")}, + { 24, tr("4 hours")}, + { 48, tr("8 hours")}, + { 144, tr("24 hours")}, + { 504, tr("3 days")}, + { 1008, tr("7 days")} + }; +} + +void FeeSuggestionModel::addRows(const std::map& feeLevels) +{ + if (feeLevels.empty()) { + return; + } + const auto& levelMapping = FeeSuggestionModel::feeLevels(); + decltype(data_) newRows; + for (const auto& feeLevel : feeLevels) { + QString estTime; + const auto& itLevel = levelMapping.find(feeLevel.first); + if (itLevel == levelMapping.end()) { + estTime = tr("%1 minutes").arg(feeLevel.first * 10); + } + else { + estTime = itLevel->second; + } + FeeSuggestion row{ feeLevel.first, std::move(estTime), feeLevel.second }; + newRows.emplace_back(std::move(row)); + } + beginInsertRows(QModelIndex(), rowCount(), rowCount() + newRows.size() - 1); + data_.insert(data_.cend(), newRows.begin(), newRows.end()); endInsertRows(); } diff --git a/GUI/QtQuick/FeeSuggModel.h b/GUI/QtQuick/FeeSuggModel.h index e00a53fc9..0c574997b 100644 --- a/GUI/QtQuick/FeeSuggModel.h +++ b/GUI/QtQuick/FeeSuggModel.h @@ -11,6 +11,7 @@ #ifndef FEE_SUGG_MODEL_H #define FEE_SUGG_MODEL_H +#include #include #include #include @@ -32,12 +33,13 @@ class FeeSuggestionModel : public QAbstractTableModel QVariant data(const QModelIndex& index, int role) const override; QHash roleNames() const override; + static std::map feeLevels(); struct FeeSuggestion { uint32_t nbBlocks; - unsigned minutes; - uint64_t satoshis; + QString estTime; + float satoshis; }; - void addRow(const FeeSuggestion&); + void addRows(const std::map&); void clear(); private: diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 5c3975a4a..c595927dc 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -32,6 +32,7 @@ #include "bip39/bip39.h" #include "BSMessageBox.h" #include "BSTerminalSplashScreen.h" +#include "FeeSuggModel.h" #include "QTXSignRequest.h" #include "TxOutputsModel.h" #include "SettingsAdapter.h" @@ -132,6 +133,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) txInputsModel_ = new TxInputsModel(logger, txOutputsModel_, this); hwDeviceModel_ = new HwDeviceModel(this); walletBalances_ = new WalletBalancesModel(logger, this); + feeSuggModel_ = new FeeSuggestionModel(logger, this); } QtQuickAdapter::~QtQuickAdapter() @@ -228,6 +230,7 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("txOutputsModel"), txOutputsModel_); rootCtxt_->setContextProperty(QLatin1Literal("hwDeviceModel"), hwDeviceModel_); rootCtxt_->setContextProperty(QLatin1Literal("walletBalances"), walletBalances_); + rootCtxt_->setContextProperty(QLatin1Literal("feeSuggestions"), feeSuggModel_); engine.addImageProvider(QLatin1Literal("QR"), new QRImageProvider); engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); @@ -1135,6 +1138,16 @@ void QtQuickAdapter::copyAddressToClipboard(const QString& addr) } } +void QtQuickAdapter::requestFeeSuggestions() +{ + ArmoryMessage msg; + auto msgReq = msg.mutable_fee_levels_request(); + for (const auto& feeLevel : FeeSuggestionModel::feeLevels()) { + msgReq->add_levels(feeLevel.first); + } + pushRequest(user_, userBlockchain_, msg.SerializeAsString()); +} + QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QString& recvAddr , double amount, double fee, const QString& comment, QUTXOList* utxos) { @@ -1275,11 +1288,11 @@ ProcessingResult QtQuickAdapter::processAddressHist(const ArmoryMessage_AddressH ProcessingResult QtQuickAdapter::processFeeLevels(const ArmoryMessage_FeeLevelsResponse& response) { - std::map feeLevels; + std::map feeLevels; for (const auto& pair : response.fee_levels()) { feeLevels[pair.level()] = pair.fee(); } - //TODO + feeSuggModel_->addRows(feeLevels); return ProcessingResult::Success; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 524591175..13e5bf2e0 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -76,6 +76,7 @@ namespace BlockSettle { } } class BSTerminalSplashScreen; +class FeeSuggestionModel; class HwDeviceModel; class QQmlContext; class QmlWalletsList; @@ -160,6 +161,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void generateNewAddress(int walletIndex, bool isNative); Q_INVOKABLE void copyAddressToClipboard(const QString& addr); + Q_INVOKABLE void requestFeeSuggestions(); Q_INVOKABLE QTXSignRequest* createTXSignRequest(int walletIndex, const QString& recvAddr , double amount, double fee, const QString& comment = {}, QUTXOList* utxos = nullptr); Q_INVOKABLE void getUTXOsForWallet(int walletIndex); @@ -262,6 +264,7 @@ private slots: TxOutputsModel* txOutputsModel_{ nullptr }; HwDeviceModel* hwDeviceModel_{ nullptr }; WalletBalancesModel* walletBalances_{ nullptr }; + FeeSuggestionModel* feeSuggModel_{ nullptr }; bs::Address generatedAddress_; bool hwDevicesPolling_{ false }; diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index 087016a8e..eed168641 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -39,7 +39,6 @@ QVariant WalletBalancesModel::data(const QModelIndex& index, int role) const if (index.row() < 0) { return {}; } - logger_->debug("[WalletBalancesModel::data] #{} {}", index.row(), role); FieldFunc ff{ nullptr }; switch (role) { case WalletBalance::NameRole: @@ -90,7 +89,7 @@ void WalletBalancesModel::addWallet(const const Wallet& wallet) return; } } - logger_->debug("[WalletBalancesModel::addWallet] adding #{}: {}", rowCount(), wallet.walletName); + //logger_->debug("[WalletBalancesModel::addWallet] adding #{}: {}", rowCount(), wallet.walletName); beginInsertRows(QModelIndex(), rowCount(), rowCount()); wallets_.push_back(wallet); endInsertRows(); diff --git a/GUI/QtQuick/qml/SendPage.qml b/GUI/QtQuick/qml/SendPage.qml index 05602f1f7..845fda857 100644 --- a/GUI/QtQuick/qml/SendPage.qml +++ b/GUI/QtQuick/qml/SendPage.qml @@ -18,6 +18,7 @@ import "BsStyles" //import "BsControls" //import "BsDialogs" //import "js/helper.js" as JsHelper +import wallet.balance 1.0 Item { id: send @@ -118,18 +119,30 @@ Item { spacing: 23 ComboBox { id: sendWalletsComboBox - model: bsApp.walletsList + model: walletBalances + textRole: "name" + valueRole: "name" currentIndex: walletsComboBox.currentIndex font.pointSize: 14 enabled: (bsApp.walletsList.length > 1) width: 350 } Label { - text: qsTr("%1 BTC").arg(bsApp.totalBalance) + text: qsTr("%1 BTC").arg(walletBalances.data( + walletBalances.index(sendWalletsComboBox, 0), WalletBalance.TotalRole)) font.pointSize: 14 } - TextInput { + ComboBox { id: fees + model: feeSuggestions + font.pointSize: 14 + textRole: "text" + valueRole: "value" + width: 500 + editable: true + } +/* TextInput { + id: fees_ width: 500 height: 32 color: 'lightgrey' @@ -150,7 +163,7 @@ Item { anchors.right: parent anchors.horizontalCenter: parent } - } + }*/ } TextEdit { id: txComment diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 7652b8956..bb960d734 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -132,6 +132,7 @@ ApplicationWindow { font.pointSize: 16 Layout.fillHeight: true onClicked: { + bsApp.requestFeeSuggestions() topMenuBtnClicked(btnSend) stack.push(sendPage) } From 32bb0510c79a4c75008c0778aabfb1c77e6ebec6 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 18 Jan 2023 09:32:31 +0300 Subject: [PATCH 056/436] possible fix for crash on start --- GUI/QtQuick/QtQuickAdapter.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index c595927dc..07b960511 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -821,13 +821,15 @@ void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) const bool isInitialLoad = hdWallets_.empty(); const auto& walletId = *wi.ids.cbegin(); hdWallets_[walletId] = wi; - hwDeviceModel_->setLoaded(walletId); logger_->debug("[QtQuickAdapter::processWalletLoaded] {} {}", wi.name, walletId); QMetaObject::invokeMethod(this, [this, isInitialLoad, walletId, walletName = wi.name] { + hwDeviceModel_->setLoaded(walletId); walletBalances_->addWallet({ walletId, walletName }); if (isInitialLoad) { auto comboWalletsList = rootObj_->findChild(QLatin1Literal("walletsComboBox")); - comboWalletsList->setProperty("currentIndex", 0); + if (comboWalletsList) { + comboWalletsList->setProperty("currentIndex", 0); + } walletSelected(0); } emit walletsListChanged(); From 9b4960a844bd1b28cf72a62482ea6d508893960c Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 18 Jan 2023 11:15:02 +0200 Subject: [PATCH 057/436] send popup: simple details --- GUI/QtQuick/images/advanced_icon.png | Bin 0 -> 591 bytes GUI/QtQuick/images/paste_icon.png | Bin 0 -> 545 bytes GUI/QtQuick/images/success.png | Bin 3273 -> 2667 bytes GUI/QtQuick/qml/BsStyles/BSStyle.qml | 10 +- .../qml/CreateWallet/ConfirmPassword.qml | 18 +- .../qml/CreateWallet/ImportHardware.qml | 4 +- GUI/QtQuick/qml/CreateWallet/ImportWallet.qml | 44 ++- .../qml/CreateWallet/ImportWatchingWallet.qml | 2 +- .../qml/CreateWallet/StartCreateWallet.qml | 2 +- .../qml/CreateWallet/SuccessNewWallet.qml | 6 +- .../qml/CreateWallet/TermsAndConditions.qml | 4 +- GUI/QtQuick/qml/CreateWallet/WalletSeed.qml | 2 +- .../qml/CreateWallet/WalletSeedSkipAccept.qml | 2 +- .../qml/CreateWallet/WalletSeedVerify.qml | 2 +- GUI/QtQuick/qml/Receive/ReceivePopup.qml | 4 +- GUI/QtQuick/qml/Receive/ReceiveQrCode.qml | 4 +- GUI/QtQuick/qml/Send/SendPopup.qml | 23 ++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 262 +++++++++++++ .../qml/Send/SimpleDetails.qml.autosave | 266 +++++++++++++ GUI/QtQuick/qml/Send/qmldir | 4 + .../qml/StyledControls/CustomButton.qml | 15 +- .../qml/StyledControls/CustomComboBox.qml | 172 ++++++--- .../StyledControls/CustomCompleterWidget.qml | 49 +++ .../qml/StyledControls/CustomPopup.qml | 2 +- .../StyledControls/CustomSeedTextInput.qml | 1 + .../qml/StyledControls/CustomTextEdit.qml | 108 ++++++ .../qml/StyledControls/CustomTextInput.qml | 17 +- GUI/QtQuick/qml/main.qml | 15 +- GUI/QtQuick/qml/main.qml.autosave | 363 ++++++++++++++++++ GUI/QtQuick/qtquick.qrc | 12 + 30 files changed, 1328 insertions(+), 85 deletions(-) create mode 100644 GUI/QtQuick/images/advanced_icon.png create mode 100644 GUI/QtQuick/images/paste_icon.png create mode 100644 GUI/QtQuick/qml/Send/SendPopup.qml create mode 100644 GUI/QtQuick/qml/Send/SimpleDetails.qml create mode 100644 GUI/QtQuick/qml/Send/SimpleDetails.qml.autosave create mode 100644 GUI/QtQuick/qml/Send/qmldir create mode 100644 GUI/QtQuick/qml/StyledControls/CustomCompleterWidget.qml create mode 100644 GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml create mode 100644 GUI/QtQuick/qml/main.qml.autosave diff --git a/GUI/QtQuick/images/advanced_icon.png b/GUI/QtQuick/images/advanced_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..08223fc50815c75338f6a350dbb3b3a36c011126 GIT binary patch literal 591 zcmV-V0_93ATY*x6>k}+KxG#bx50DCCD%flVBo%}XLI>d`D&)(ZoO9tW zDkPux`*wGB?);pYGo$j4(;MVxqWX!lsa*^@@o1Z!1|iAvT6IrOOl89VNOkPYnh@(z zr1|}W9Z^r4hlP9{W$~;GKri&A9h`ak-8exRO`^C?TgON;+pEe+i68@lMOA;$AVB-yxxD@I^N+J* zB$>XUf*uEWc6X(YkMBY6wzyI;kHU%G4La{GD0c^W-Au|PQSW_met_(V`1!+SJXvNa zhUVPSFCbzjaqbYTWV~Zm@KUhJWGWJ8BN)X`YlguY8kMmeI#lM8fR^*8J@E{I=4hpx zzO3_czJ~c&k=kY_e7O=KQX3SFQ@}3sJNvl*R)?&Y6a(&+Ly7Aq7DLVk2TVg_c0}`q zvv%kMxd+5k?}32*G|qx8oWDO~jLIIUkyjqlNMybQzSN`vY9_&e0be>j)4_IgkXEA% zO~bs+ntM;HSqt|yIwM&vjB>e53^HFW3bFlO&PEJz$|l=#u{_$1W!iSqex7Kg!(|Ws dZrp9N`wKSE5zykZTY>-p002ovPDHLkV1oR^1uXyo literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/paste_icon.png b/GUI/QtQuick/images/paste_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..015a12ebc66e16c3a8047a35222ad7cc5e3dd782 GIT binary patch literal 545 zcmV++0^a?JP)AVBlcTL#CA?*NolN z+5TbVC6V)w5{q``QU%5B~2cH#P*SKBm+(BX)U z<$f0>^Jzn-csPnrp&s;mIBUjVw!my8`Ig@_@YOTdE2D8RC00000NkvXXu0mjfYuxP{ literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/success.png b/GUI/QtQuick/images/success.png index a3ce070b59776ab34d8df546005d728b78b00bca..c1219c590a888eaf99902066c53df6f4d4337f18 100644 GIT binary patch delta 2644 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 pos) + { + input.remove(pos, input.length); + } + } + + Keys.onTabPressed: { + tabNavigated() + } + + Keys.onBacktabPressed: { + backTabNavigated() + } + } + + MouseArea { + anchors.fill: parent + propagateComposedEvents: true + onClicked: { + input.forceActiveFocus() + mouse.accepted = false + } + } + + function setActiveFocus() { + input.forceActiveFocus() + } +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index e60cce8ae..cb01fc0ee 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -15,12 +15,18 @@ import "../BsStyles" Rectangle { id: rect + //aliases - title property alias title_text: title.text + property alias title_leftMargin: title.anchors.leftMargin + property alias title_topMargin: title.anchors.topMargin + property alias title_font_size: title.font.pixelSize + + //aliases - input property alias input_text: input.text property alias horizontalAlignment: input.horizontalAlignment property alias input_topMargin: input.anchors.topMargin - property alias title_leftMargin: title.anchors.leftMargin - property alias title_topMargin: title.anchors.topMargin + property alias input_validator: input.validator + property alias input_item: input @@ -28,6 +34,8 @@ Rectangle { property bool isPassword: false property bool isHiddenText: false + property var completer: null + signal textChanged() @@ -42,9 +50,11 @@ Rectangle { id: title anchors.top: rect.top + anchors.topMargin: 16 anchors.left: rect.left + anchors.leftMargin: 16 - font.pixelSize: 12 + font.pixelSize: 13 font.family: "Roboto" font.weight: Font.Normal @@ -58,6 +68,7 @@ Rectangle { activeFocusOnTab: true anchors.top: rect.top + anchors.topMargin: 35 anchors.left: rect.left anchors.leftMargin: title.anchors.leftMargin width: rect.width - 2*title.anchors.leftMargin diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 7652b8956..82a4d268f 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -16,6 +16,7 @@ import QtQuick.Window 2 import "StyledControls" 1 import "BsStyles" 1 import "Receive" 1 +import "Send" 1 import "CreateWallet" 1 ApplicationWindow { @@ -27,7 +28,7 @@ ApplicationWindow { title: qsTr("BlockSettle Terminal") property var currentDialog: ({}) - property int currentWalletIndex + property int overviewWalletIndex readonly property int resizeAnimationDuration: 25 Component.onCompleted: { @@ -46,6 +47,11 @@ ApplicationWindow { visible: false } + SendPopup { + id: send_popup + visible: false + } + color: BSStyle.backgroundColor overlay.modal: Rectangle { @@ -134,6 +140,9 @@ ApplicationWindow { onClicked: { topMenuBtnClicked(btnSend) stack.push(sendPage) + send_popup.show() + send_popup.raise() + send_popup.requestActivate() } } CustomTitleToolButton { @@ -148,7 +157,7 @@ ApplicationWindow { onClicked: { topMenuBtnClicked(btnReceive) //stack.push(receivePage) - bsApp.generateNewAddress(currentWalletIndex, true) + bsApp.generateNewAddress(overviewWalletIndex, true) receive_popup.show() receive_popup.raise() receive_popup.requestActivate() @@ -187,7 +196,7 @@ ApplicationWindow { } onCurWalletIndexChanged: (ind) => { - currentWalletIndex = ind + overviewWalletIndex = ind } } diff --git a/GUI/QtQuick/qml/main.qml.autosave b/GUI/QtQuick/qml/main.qml.autosave new file mode 100644 index 000000000..bfd63ec41 --- /dev/null +++ b/GUI/QtQuick/qml/main.qml.autosave @@ -0,0 +1,363 @@ +/* + +*********************************************************************************** +* Copyright (C) 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQuick.Window 2 + +import "StyledControls" 1 +import "BsStyles" 1 +import "Receive" 1 +import "Send" 1 +import "CreateWallet" 1 + +ApplicationWindow { + id: mainWindow + minimumWidth: 1200 + minimumHeight: 900 + + visible: false + title: qsTr("BlockSettle Terminal") + + property var currentDialog: ({}) + property int overviewWalletIndex + readonly property int resizeAnimationDuration: 25 + + Component.onCompleted: { + hide() +// qmlFactory.installEventFilterToObj(mainWindow) +// qmlFactory.applyWindowFix(mainWindow) + } + + CreateWallet { + id: create_wallet + visible: false + } + + ReceivePopup { + id: receive_popup + visible: false + } + + SendPopup { + id: send_popup + visible: false + } + + color: BSStyle.backgroundColor + + overlay.modal: Rectangle { + color: BSStyle.backgroundModalColor + } + overlay.modeless: Rectangle { + color: BSStyle.backgroundModeLessColor + } + + // attached to use from c++ +/* function messageBoxCritical(title, text, details) { + return JsHelper.messageBoxCritical(title, text, details) + }*/ + + InfoBanner { + id: ibSuccess + bgColor: "darkgreen" + } + InfoBanner { + id: ibFailure + bgColor: "darkred" + } + InfoBanner { + id: ibInfo + bgColor: "darkgrey" + } + + StackView { + id: stack + initialItem: swipeView + anchors.fill: parent + } + + SendPage { + id: sendPage + visible: false + } + + ReceivePage { + id: receivePage + visible: false + } + + SettingsPage { + id: settingsPage + visible: false + } + + header: Column { + height: 57 + width: parent.width + spacing: 0 + + RowLayout { + height: 56 + width: parent.width + spacing: 0 + + Image { + width: 129 + height: 24 + source: "qrc:/images/logo.png" + Layout.leftMargin : 18 + } + + Label { + width: 13 + } + + Image { + id: imgArmoryStatus + source: (bsApp.armoryState === 7) ? "qrc:/images/conn_ind.png" : "qrc:/images/conn_inactive.png" + } + + Label { + Layout.fillWidth: true + } + + CustomTitleToolButton { + id: btnSend + enabled: !bsApp.walletsList.empty + text: qsTr("Send") + icon.source: "qrc:/images/send_icon.png" + font.pointSize: 16 + Layout.fillHeight: true + onClicked: { + topMenuBtnClicked(btnSend) + stack.push(sendPage) + send_popup.show() + send_popup.raise() + send_popup.requestActivate() + } + } + CustomTitleToolButton { + id: btnReceive + text: qsTr("Receive") + icon.source: "qrc:/images/receive_icon.png" + + font.pointSize: 16 + Layout.fillHeight: true + enabled: !bsApp.walletsList.empty + + onClicked: { + topMenuBtnClicked(btnReceive) + //stack.push(receivePage) + bsApp.generateNewAddress(overviewWalletIndex, true) + receive_popup.show() + receive_popup.raise() + receive_popup.requestActivate() + } + } + CustomTitleToolButton { + id: btnSettings + text: qsTr("Settings") + icon.source: "qrc:/images/settings_icon.png" + onClicked: { + topMenuBtnClicked(btnSettings) + stack.push(settingsPage) + } + } + } + + Rectangle { + width: parent.width + height: 1 + color: "#3C435A" + } + } + + SwipeView { + anchors.fill: parent + id: swipeView + currentIndex: tabBar.currentIndex + + OverviewPage { + id: overviewPage + onNewWalletClicked: { + create_wallet.init() + create_wallet.show() + create_wallet.raise() + create_wallet.requestActivate() + } + + onCurWalletIndexChanged: (ind) => { + overviewWalletIndex = ind + } + } + + TransactionsPage { + id: transactionsPage + } + + ExplorerPage { + id: explorerPage + } + } + + footer: Rectangle { + height: 56 + width: parent.width + color :"#191E2A" + + RowLayout { + spacing: 0 + anchors.fill: parent + + Label { + Layout.fillWidth: true + } + + TabBar { + id: tabBar + currentIndex: swipeView.currentIndex + padding: 0 + spacing: 0 + Layout.fillWidth: false + + background: Rectangle { + color: "transparent" + } + + CustomTabButton { + id: btnOverview + text: qsTr("Overview") + Component.onCompleted: { + btnOverview.setIcons ("qrc:/images/overview_icon.png", "qrc:/images/overview_icon_not_choosed.png") + } + } + CustomTabButton { + id: btnTransactions + text: qsTr("Transactions") + Component.onCompleted: { + btnTransactions.setIcons ("qrc:/images/transactions_icon.png", "qrc:/images/transactions_icon_unchoosed.png") + } + } + + CustomTabButton { + id: btnExplorer + text: qsTr("Explorer") + Component.onCompleted: { + btnExplorer.setIcons ("qrc:/images/explorer_icon.png", "qrc:/images/explorer_icon_unchoosed.png") + } + } + + CustomTabButton { + id: btnPlugins + text: qsTr("Plugins") + Component.onCompleted: { + btnPlugins.setIcons ("qrc:/images/plugins_icon.png", "qrc:/images/plugins_icon_unchoosed.png") + } + } + } + + Label { + Layout.fillWidth: true + } + } + } + + function topMenuBtnClicked(clickedBtn) + { + btnSend.select(false) + btnReceive.select(false) + btnSettings.select(false) + + clickedBtn.select(true) + } + + +/* function raiseWindow() { + JsHelper.raiseWindow(mainWindow) + } + function hideWindow() { + JsHelper.hideWindow(mainWindow) + } + + function customDialogRequest(dialogName, data) { + var newDialog = JsHelper.customDialogRequest(dialogName, data) + if (newDialog) { + raiseWindow() + JsHelper.prepareDialog(newDialog) + } + } + + function invokeQmlMethod(method, cppCallback, argList) { + JsHelper.evalWorker(method, cppCallback, argList) + }*/ + + function moveMainWindowToScreenCenter() { + mainWindow.x = Screen.virtualX + (Screen.width - mainWindow.width) / 2 + mainWindow.y = Screen.virtualY + (Screen.height - mainWindow.height) / 2 + } + + function resizeAnimated(w,h) { + mwWidthAnimation.from = mainWindow.width + mwWidthAnimation.to = w + mwWidthAnimation.restart() + + mwHeightAnimation.from = mainWindow.height + mwHeightAnimation.to = h + mwHeightAnimation.restart() + + mwXAnimation.from = mainWindow.x + mwXAnimation.to = Screen.virtualX + (Screen.width - w) / 2 + mwXAnimation.restart() + + mwYAnimation.from = mainWindow.y + mwYAnimation.to = Screen.virtualY + (Screen.height - h) / 2 + mwYAnimation.restart() + } + + NumberAnimation { + id: mwWidthAnimation + target: mainWindow + property: "width" + duration: resizeAnimationDuration + } + NumberAnimation { + id: mwHeightAnimation + target: mainWindow + property: "height" + duration: resizeAnimationDuration + } + + NumberAnimation { + id: mwXAnimation + target: mainWindow + property: "x" + duration: resizeAnimationDuration + } + NumberAnimation { + id: mwYAnimation + target: mainWindow + property: "y" + duration: resizeAnimationDuration + } + + + //global functions + function getWalletData (index: int, role: string) + { + return walletBalances.data(walletBalances.index(index, 0), role) + } + + function getFeeSuggData (index: int, role: string) + { + return walletBalances.data(walletBalances.index(index, 0), role) + } +} diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index e8feba983..98547bf47 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -96,5 +96,17 @@ qml/CreateWallet/WalletSeed.qml qml/CreateWallet/WalletSeedSkipAccept.qml qml/CreateWallet/WalletSeedVerify.qml + qml/StyledControls/CustomCompleterWidget.qml + images/advanced_icon.png + qml/StyledControls/CustomContextMenu.qml + qml/StyledControls/CustomDialogWindow.qml + qml/StyledControls/CustomLabelCopyableValue.qml + qml/StyledControls/CustomPasswordTextInput.qml + qml/StyledControls/CustomTextEdit.qml + qml/StyledControls/CustomTitleDialogWindow.qml + qml/StyledControls/CustomTitleDialogWindowWithExpander.qml + qml/Send/qmldir + qml/Send/SendPopup.qml + qml/Send/SimpleDetails.qml From 5002e87813ca967e4c6686e6a77dd7d8ea2ea81d Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 18 Jan 2023 11:18:48 +0200 Subject: [PATCH 058/436] gitignore autosave --- .gitignore | 10 + GUI/QtQuick/qml/Send/SimpleDetails.qml | 8 +- .../qml/Send/SimpleDetails.qml.autosave | 266 ------------- GUI/QtQuick/qml/main.qml | 12 + GUI/QtQuick/qml/main.qml.autosave | 363 ------------------ 5 files changed, 28 insertions(+), 631 deletions(-) delete mode 100644 GUI/QtQuick/qml/Send/SimpleDetails.qml.autosave delete mode 100644 GUI/QtQuick/qml/main.qml.autosave diff --git a/.gitignore b/.gitignore index 2cf37b67d..846f050b9 100755 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,13 @@ generated_proto/ terminal.*/ BlockSettleHW/ledger/hidapi/* GUI/QtWidgets/ui/* + +*.autosave + +# dvajdual test environment +GUI/QtQuick/main.cpp +GUI/QtQuick/qml/main_test.qml +GUI/QtQuick/qml.qrc +GUI/QtQuick/qml_test.pro +GUI/QtQuick/qml_test.pro.user + diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 2ca581cde..dc7fe46d5 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -179,10 +179,14 @@ ColumnLayout { model: walletBalances + currentIndex: 0 + //aliases title_text: qsTr("From Wallet") - details_text: walletBalances.data(walletBalances.index(currentIndex, 0), WalletBalance.TotalRole) - input_text: walletBalances.data(walletBalances.index(currentIndex, 0), WalletBalance.NameRole) + details_text: getWalletData(currentIndex, WalletBalance.TotalRole) + input_text: getWalletData(currentIndex, WalletBalance.NameRole) + //details_text: walletBalances.data(walletBalances.index(currentIndex, 0), WalletBalance.TotalRole) + //input_text: walletBalances.data(walletBalances.index(currentIndex, 0), WalletBalance.NameRole) delega_role: "name" } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml.autosave b/GUI/QtQuick/qml/Send/SimpleDetails.qml.autosave deleted file mode 100644 index 5fbfee80f..000000000 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml.autosave +++ /dev/null @@ -1,266 +0,0 @@ -import QtQuick 2.12 -import QtQuick.Window 2.12 -import QtQuick.Controls 2.12 -import QtQuick.Layouts 1.15 - -import "../BsStyles" -import "../StyledControls" - -import wallet.balance 1.0 - -ColumnLayout { - - id: layout - - signal sig_continue() - - height: 554 - width: 580 - spacing: 0 - - RowLayout { - - Layout.fillWidth: true - Layout.preferredHeight : 34 - - Button { - id: advanced_but - - Layout.leftMargin: 24 - Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter - - enabled: false - activeFocusOnTab: true - - font.pixelSize: 13 - font.family: "Roboto" - font.weight: Font.Normal - palette.buttonText: "#7A88B0" - - - icon.color: "transparent" - icon.source: "qrc:/images/advanced_icon.png" - icon.width: 16 - icon.height: 16 - - background: Rectangle { - implicitWidth: 116 - implicitHeight: 34 - color: "transparent" - - radius: 14 - - border.color: "#3C435A" - border.width: 1 - - } - } - - CustomTitleLabel { - id: title - - Layout.leftMargin: 94 - Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter - - text: qsTr("Send Bitcoin") - } - - Label { - Layout.fillWidth: true - Layout.preferredHeight : 34 - } - - } - - CustomTextInput { - - id: rec_addr_input - - Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 23 - - //aliases - title_text: qsTr("Receiver address") - - Image { - id: paste_but - - z: 1 - - anchors.top: rec_addr_input.top - anchors.topMargin: 23 - anchors.right: rec_addr_input.right - anchors.rightMargin: 23 - - source: "qrc:/images/paste_icon.png" - width: 24 - height: 24 - - MouseArea { - anchors.fill: parent - onClicked: { - console.log("paste clicked") - } - } - } - } - - CustomTextInput { - - id: amount_input - - Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 - - //aliases - title_text: qsTr("Amount") - input_text: "0" - - input_validator: DoubleValidator{bottom: 0; notation :DoubleValidator.StandardNotation;} - - CustomButton { - - id: max_but - - z: 1 - - width: 55 - height: 28 - back_radius: 37 - - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: 23 - - text: qsTr("MAX") - font.pixelSize: 12 - - function click_enter() { - console.log ("MAX clicked") - } - } - - Label { - - id: currency - - anchors.verticalCenter: parent.verticalCenter - anchors.right: max_but.left - anchors.rightMargin: 16 - - text: "BTC" - font.pixelSize: 14 - font.family: "Roboto" - font.weight: Font.Normal - color: "#7A88B0" - } - } - - RowLayout { - - Layout.fillWidth: true - Layout.preferredHeight : 70 - Layout.topMargin: 10 - - - CustomComboBox { - - id: from_wallet_combo - - Layout.leftMargin: 24 - Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter - - width: 261 - height: 70 - - model: walletBalances - - currentIndex: 0 - - //aliases - title_text: qsTr("From Wallet") - details_text: getWalletData(currentIndex, WalletBalance.TotalRole) - input_text: getWalletData(currentIndex, WalletBalance.NameRole) - //details_text: walletBalances.data(walletBalances.index(currentIndex, 0), WalletBalance.TotalRole) - //input_text: walletBalances.data(walletBalances.index(currentIndex, 0), WalletBalance.NameRole) - delega_role: "name" - } - - Label { - Layout.fillWidth: true - Layout.preferredHeight: 70 - } - - - CustomComboBox { - - id: fee_suggest_combo - - Layout.rightMargin: 24 - Layout.alignment: Qt.AlignRight | Qt.AlingVCenter - - model: ["2 blocks (20 minutes): 1 s/b", "3 blocks (30 minutes): 2 s/b"] - //aliases - title_text: qsTr("Fee Suggestions") - - width: 261 - height: 70 - - } - } - - CustomTextEdit { - - id: comment_input - - Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 90 - Layout.preferredWidth: 532 - Layout.topMargin: 10 - - //aliases - title_text: qsTr("Comment") - - onTabNavigated: continue_but.forceActiveFocus() - onBackTabNavigated: fee_suggest_combo.forceActiveFocus() - } - - Label { - Layout.fillWidth: true - Layout.fillHeight: true - } - - CustomButton { - id: continue_but - - width: 532 - - Layout.bottomMargin: 40 - Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - - text: qsTr("Continue") - - Component.onCompleted: { - continue_but.preferred = true - } - - function click_enter() { - layout.sig_continue() - } - - } - - - Keys.onEnterPressed: { - continue_but.click_enter() - } - - Keys.onReturnPressed: { - continue_but.click_enter() - } -} - diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 82a4d268f..5384c80ca 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -348,4 +348,16 @@ ApplicationWindow { property: "y" duration: resizeAnimationDuration } + + + //global functions + function getWalletData (index: int, role: string) + { + return walletBalances.data(walletBalances.index(index, 0), role) + } + + function getFeeSuggData (index: int, role: string) + { + return walletBalances.data(walletBalances.index(index, 0), role) + } } diff --git a/GUI/QtQuick/qml/main.qml.autosave b/GUI/QtQuick/qml/main.qml.autosave deleted file mode 100644 index bfd63ec41..000000000 --- a/GUI/QtQuick/qml/main.qml.autosave +++ /dev/null @@ -1,363 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2022, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2 -import QtQuick.Controls 2.9 -import QtQuick.Layouts 1.3 -import QtQuick.Window 2 - -import "StyledControls" 1 -import "BsStyles" 1 -import "Receive" 1 -import "Send" 1 -import "CreateWallet" 1 - -ApplicationWindow { - id: mainWindow - minimumWidth: 1200 - minimumHeight: 900 - - visible: false - title: qsTr("BlockSettle Terminal") - - property var currentDialog: ({}) - property int overviewWalletIndex - readonly property int resizeAnimationDuration: 25 - - Component.onCompleted: { - hide() -// qmlFactory.installEventFilterToObj(mainWindow) -// qmlFactory.applyWindowFix(mainWindow) - } - - CreateWallet { - id: create_wallet - visible: false - } - - ReceivePopup { - id: receive_popup - visible: false - } - - SendPopup { - id: send_popup - visible: false - } - - color: BSStyle.backgroundColor - - overlay.modal: Rectangle { - color: BSStyle.backgroundModalColor - } - overlay.modeless: Rectangle { - color: BSStyle.backgroundModeLessColor - } - - // attached to use from c++ -/* function messageBoxCritical(title, text, details) { - return JsHelper.messageBoxCritical(title, text, details) - }*/ - - InfoBanner { - id: ibSuccess - bgColor: "darkgreen" - } - InfoBanner { - id: ibFailure - bgColor: "darkred" - } - InfoBanner { - id: ibInfo - bgColor: "darkgrey" - } - - StackView { - id: stack - initialItem: swipeView - anchors.fill: parent - } - - SendPage { - id: sendPage - visible: false - } - - ReceivePage { - id: receivePage - visible: false - } - - SettingsPage { - id: settingsPage - visible: false - } - - header: Column { - height: 57 - width: parent.width - spacing: 0 - - RowLayout { - height: 56 - width: parent.width - spacing: 0 - - Image { - width: 129 - height: 24 - source: "qrc:/images/logo.png" - Layout.leftMargin : 18 - } - - Label { - width: 13 - } - - Image { - id: imgArmoryStatus - source: (bsApp.armoryState === 7) ? "qrc:/images/conn_ind.png" : "qrc:/images/conn_inactive.png" - } - - Label { - Layout.fillWidth: true - } - - CustomTitleToolButton { - id: btnSend - enabled: !bsApp.walletsList.empty - text: qsTr("Send") - icon.source: "qrc:/images/send_icon.png" - font.pointSize: 16 - Layout.fillHeight: true - onClicked: { - topMenuBtnClicked(btnSend) - stack.push(sendPage) - send_popup.show() - send_popup.raise() - send_popup.requestActivate() - } - } - CustomTitleToolButton { - id: btnReceive - text: qsTr("Receive") - icon.source: "qrc:/images/receive_icon.png" - - font.pointSize: 16 - Layout.fillHeight: true - enabled: !bsApp.walletsList.empty - - onClicked: { - topMenuBtnClicked(btnReceive) - //stack.push(receivePage) - bsApp.generateNewAddress(overviewWalletIndex, true) - receive_popup.show() - receive_popup.raise() - receive_popup.requestActivate() - } - } - CustomTitleToolButton { - id: btnSettings - text: qsTr("Settings") - icon.source: "qrc:/images/settings_icon.png" - onClicked: { - topMenuBtnClicked(btnSettings) - stack.push(settingsPage) - } - } - } - - Rectangle { - width: parent.width - height: 1 - color: "#3C435A" - } - } - - SwipeView { - anchors.fill: parent - id: swipeView - currentIndex: tabBar.currentIndex - - OverviewPage { - id: overviewPage - onNewWalletClicked: { - create_wallet.init() - create_wallet.show() - create_wallet.raise() - create_wallet.requestActivate() - } - - onCurWalletIndexChanged: (ind) => { - overviewWalletIndex = ind - } - } - - TransactionsPage { - id: transactionsPage - } - - ExplorerPage { - id: explorerPage - } - } - - footer: Rectangle { - height: 56 - width: parent.width - color :"#191E2A" - - RowLayout { - spacing: 0 - anchors.fill: parent - - Label { - Layout.fillWidth: true - } - - TabBar { - id: tabBar - currentIndex: swipeView.currentIndex - padding: 0 - spacing: 0 - Layout.fillWidth: false - - background: Rectangle { - color: "transparent" - } - - CustomTabButton { - id: btnOverview - text: qsTr("Overview") - Component.onCompleted: { - btnOverview.setIcons ("qrc:/images/overview_icon.png", "qrc:/images/overview_icon_not_choosed.png") - } - } - CustomTabButton { - id: btnTransactions - text: qsTr("Transactions") - Component.onCompleted: { - btnTransactions.setIcons ("qrc:/images/transactions_icon.png", "qrc:/images/transactions_icon_unchoosed.png") - } - } - - CustomTabButton { - id: btnExplorer - text: qsTr("Explorer") - Component.onCompleted: { - btnExplorer.setIcons ("qrc:/images/explorer_icon.png", "qrc:/images/explorer_icon_unchoosed.png") - } - } - - CustomTabButton { - id: btnPlugins - text: qsTr("Plugins") - Component.onCompleted: { - btnPlugins.setIcons ("qrc:/images/plugins_icon.png", "qrc:/images/plugins_icon_unchoosed.png") - } - } - } - - Label { - Layout.fillWidth: true - } - } - } - - function topMenuBtnClicked(clickedBtn) - { - btnSend.select(false) - btnReceive.select(false) - btnSettings.select(false) - - clickedBtn.select(true) - } - - -/* function raiseWindow() { - JsHelper.raiseWindow(mainWindow) - } - function hideWindow() { - JsHelper.hideWindow(mainWindow) - } - - function customDialogRequest(dialogName, data) { - var newDialog = JsHelper.customDialogRequest(dialogName, data) - if (newDialog) { - raiseWindow() - JsHelper.prepareDialog(newDialog) - } - } - - function invokeQmlMethod(method, cppCallback, argList) { - JsHelper.evalWorker(method, cppCallback, argList) - }*/ - - function moveMainWindowToScreenCenter() { - mainWindow.x = Screen.virtualX + (Screen.width - mainWindow.width) / 2 - mainWindow.y = Screen.virtualY + (Screen.height - mainWindow.height) / 2 - } - - function resizeAnimated(w,h) { - mwWidthAnimation.from = mainWindow.width - mwWidthAnimation.to = w - mwWidthAnimation.restart() - - mwHeightAnimation.from = mainWindow.height - mwHeightAnimation.to = h - mwHeightAnimation.restart() - - mwXAnimation.from = mainWindow.x - mwXAnimation.to = Screen.virtualX + (Screen.width - w) / 2 - mwXAnimation.restart() - - mwYAnimation.from = mainWindow.y - mwYAnimation.to = Screen.virtualY + (Screen.height - h) / 2 - mwYAnimation.restart() - } - - NumberAnimation { - id: mwWidthAnimation - target: mainWindow - property: "width" - duration: resizeAnimationDuration - } - NumberAnimation { - id: mwHeightAnimation - target: mainWindow - property: "height" - duration: resizeAnimationDuration - } - - NumberAnimation { - id: mwXAnimation - target: mainWindow - property: "x" - duration: resizeAnimationDuration - } - NumberAnimation { - id: mwYAnimation - target: mainWindow - property: "y" - duration: resizeAnimationDuration - } - - - //global functions - function getWalletData (index: int, role: string) - { - return walletBalances.data(walletBalances.index(index, 0), role) - } - - function getFeeSuggData (index: int, role: string) - { - return walletBalances.data(walletBalances.index(index, 0), role) - } -} From 91ce1ea871f2acd2d828b6e2a5c6c98624291368 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 18 Jan 2023 23:28:12 +0300 Subject: [PATCH 059/436] HW wallet import routine --- BlockSettleHW/hwdevicemanager.cpp | 23 +++++++++++++++++++---- BlockSettleHW/hwdevicemanager.h | 6 +++--- BlockSettleHW/ledger/ledgerDevice.cpp | 6 +++--- BlockSettleHW/trezor/trezorDevice.h | 2 +- Core/SettingsAdapter.cpp | 2 +- Core/SignerAdapter.cpp | 26 ++++++++++++++++++++++++++ Core/SignerAdapter.h | 3 +++ GUI/QtQuick/QtQuickAdapter.h | 6 +++--- GUI/QtQuick/hwcommonstructure.h | 24 ------------------------ common | 2 +- 10 files changed, 60 insertions(+), 40 deletions(-) diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index 5dcadad5f..ab7a71880 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -31,6 +31,7 @@ DeviceManager::DeviceManager(const std::shared_ptr& logger) : logger_(logger) , user_(std::make_shared(bs::message::TerminalUsers::HWWallets)) , userWallets_(std::make_shared(bs::message::TerminalUsers::Wallets)) + , userSigner_(std::make_shared(bs::message::TerminalUsers::Signer)) {} DeviceManager::~DeviceManager() @@ -381,11 +382,25 @@ void DeviceManager::publicKeyReady(const std::string& devId, const std::string& } void bs::hww::DeviceManager::walletInfoReady(const DeviceKey& key - , const bs::core::wallet::HwWalletInfo& walletInfo) + , const bs::core::HwWalletInfo& walletInfo) { - logger_->debug("[hww::DeviceManager::walletInfoReady] importing device {} " - "(not implemented)", key.id); - //TODO: send request to WA + if (walletInfo.xpubRoot.empty()) { + logger_->error("[{}] failed to obtain wallet public keys for {}", key.id); + return; + } + logger_->debug("[hww::DeviceManager::walletInfoReady] importing device {}", key.id); + + SignerMessage msg; + auto msgReq = msg.mutable_import_hw_wallet(); + msgReq->set_type((int)walletInfo.type); + msgReq->set_vendor(walletInfo.vendor); + msgReq->set_label(walletInfo.label); + msgReq->set_device_id(walletInfo.deviceId); + msgReq->set_xpub_root(walletInfo.xpubRoot); + msgReq->set_xpub_nested_segwit(walletInfo.xpubNestedSegwit); + msgReq->set_xpub_native_segwit(walletInfo.xpubNativeSegwit); + msgReq->set_xpub_legacy(walletInfo.xpubLegacy); + pushRequest(user_, userSigner_, msg.SerializeAsString()); } void DeviceManager::requestPinMatrix(const DeviceKey&) diff --git a/BlockSettleHW/hwdevicemanager.h b/BlockSettleHW/hwdevicemanager.h index 6c8e3b56e..a3f193ff0 100644 --- a/BlockSettleHW/hwdevicemanager.h +++ b/BlockSettleHW/hwdevicemanager.h @@ -42,7 +42,7 @@ namespace bs { struct DeviceCallbacks { virtual void publicKeyReady(const std::string& devId, const std::string& walletId) = 0; - virtual void walletInfoReady(const DeviceKey&, const bs::core::wallet::HwWalletInfo&) = 0; + virtual void walletInfoReady(const DeviceKey&, const bs::core::HwWalletInfo&) = 0; virtual void requestPinMatrix(const DeviceKey&) = 0; virtual void requestHWPass(const DeviceKey&, bool allowedOnDevice) = 0; @@ -71,7 +71,7 @@ namespace bs { private: // signals void publicKeyReady(const std::string& devId, const std::string& walletId) override; - void walletInfoReady(const DeviceKey&, const bs::core::wallet::HwWalletInfo&) override; + void walletInfoReady(const DeviceKey&, const bs::core::HwWalletInfo&) override; void requestPinMatrix(const DeviceKey&) override; void requestHWPass(const DeviceKey&, bool allowedOnDevice) override; @@ -119,7 +119,7 @@ namespace bs { std::shared_ptr logger_; std::unique_ptr trezorClient_; std::unique_ptr ledgerClient_; - std::shared_ptr user_, userWallets_; + std::shared_ptr user_, userWallets_, userSigner_; std::vector devices_; bool testNet_{false}; diff --git a/BlockSettleHW/ledger/ledgerDevice.cpp b/BlockSettleHW/ledger/ledgerDevice.cpp index a8d53e062..e00d7eed0 100644 --- a/BlockSettleHW/ledger/ledgerDevice.cpp +++ b/BlockSettleHW/ledger/ledgerDevice.cpp @@ -341,7 +341,7 @@ BIP32_Node GetPubKeyHandler::retrievePublicKeyFromPath(const bs::hd::Path& deriv void LedgerDevice::getPublicKeys() { auto deviceKey = key(); - auto walletInfo = std::make_shared(); + auto walletInfo = std::make_shared(); walletInfo->type = bs::wallet::HardwareEncKey::WalletType::Ledger; walletInfo->vendor = deviceKey.vendor; walletInfo->label = deviceKey.label; @@ -404,7 +404,7 @@ void LedgerDevice::getPublicKeys() return; } - const auto& isValid = [](const bs::core::wallet::HwWalletInfo& info) + const auto& isValid = [](const bs::core::HwWalletInfo& info) { return !info.xpubRoot.empty() && !info.xpubNestedSegwit.empty() && !info.xpubNativeSegwit.empty() && !info.xpubLegacy.empty(); @@ -485,7 +485,7 @@ void LedgerDevice::signTX(const bs::core::wallet::TXSignRequest& coreReq) void bs::hww::LedgerDevice::retrieveXPubRoot() { auto deviceKey = key(); - auto walletInfo = std::make_shared(); + auto walletInfo = std::make_shared(); walletInfo->type = bs::wallet::HardwareEncKey::WalletType::Ledger; walletInfo->vendor = deviceKey.vendor; walletInfo->label = deviceKey.label; diff --git a/BlockSettleHW/trezor/trezorDevice.h b/BlockSettleHW/trezor/trezorDevice.h index bae8f1b1c..ad7748cd3 100644 --- a/BlockSettleHW/trezor/trezorDevice.h +++ b/BlockSettleHW/trezor/trezorDevice.h @@ -119,7 +119,7 @@ namespace bs { std::shared_ptr<::hw::trezor::messages::management::Features> features_{}; std::unique_ptr currentTxSignReq_; - bs::core::wallet::HwWalletInfo awaitingWalletInfo_; + bs::core::HwWalletInfo awaitingWalletInfo_; std::string awaitingSignedTX_; bool txSignedByUser_{ false }; }; diff --git a/Core/SettingsAdapter.cpp b/Core/SettingsAdapter.cpp index 0da376c4d..b5c23eb80 100644 --- a/Core/SettingsAdapter.cpp +++ b/Core/SettingsAdapter.cpp @@ -613,7 +613,7 @@ ProcessingResult SettingsAdapter::processSignerSettings(const bs::message::Envel keyVal->set_key(signer.serverId()); keyVal->set_value(signer.key.toStdString()); } - msgResp->set_home_dir(appSettings_->GetHomeDir().toStdString()); + msgResp->set_home_dir(appSettings_->GetHomeDir().toUtf8().toStdString()); msgResp->set_auto_sign_spend_limit(appSettings_->get(ApplicationSettings::autoSignSpendLimit)); pushResponse(user_, env, msg.SerializeAsString()); diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 2c318b561..ee607d642 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -138,6 +138,8 @@ ProcessingResult SignerAdapter::processOwnRequest(const bs::message::Envelope &e return processCreateWallet(env, true, request.import_wallet()); case SignerMessage::kDeleteWallet: return processDeleteWallet(env, request.delete_wallet()); + case SignerMessage::kImportHwWallet: + return processImportHwWallet(env, request.import_hw_wallet()); default: logger_->warn("[{}] unknown signer request: {}", __func__, request.data_case()); break; @@ -600,6 +602,30 @@ ProcessingResult SignerAdapter::processCreateWallet(const bs::message::Envelope& return ProcessingResult::Success; } +bs::message::ProcessingResult SignerAdapter::processImportHwWallet(const bs::message::Envelope& env + , const BlockSettle::Common::SignerMessage_ImportHWWallet& request) +{ + const bs::core::HwWalletInfo hwwInfo{ static_cast(request.type()) + , request.vendor(), request.label(), request.device_id(), request.xpub_root() + , request.xpub_nested_segwit(), request.xpub_native_segwit(), request.xpub_legacy() }; + SignerMessage msg; + auto msgResp = msg.mutable_created_wallet(); + try { + const auto& hwWallet = std::make_shared(netType_ + , hwwInfo, walletsDir_ + "/bs_hw_.lmdb", logger_); + walletsMgr_->addWallet(hwWallet); + msgResp->set_wallet_id(hwWallet->walletId()); + walletsChanged(true); + logger_->debug("[{}] wallet {} created", __func__, hwWallet->walletId()); + } + catch (const std::exception& e) { + logger_->error("[{}] failed to create HW wallet: {}", __func__, e.what()); + msgResp->set_error_msg(e.what()); + } + pushResponse(user_, env, msg.SerializeAsString()); + return bs::message::ProcessingResult::Success; +} + ProcessingResult SignerAdapter::processDeleteWallet(const bs::message::Envelope& env , const std::string& rootId) { diff --git a/Core/SignerAdapter.h b/Core/SignerAdapter.h index 44866a784..69fbc8714 100644 --- a/Core/SignerAdapter.h +++ b/Core/SignerAdapter.h @@ -33,6 +33,7 @@ namespace BlockSettle { class SignerMessage_DialogRequest; class SignerMessage_ExtendAddrChain; class SignerMessage_GetSettlPayinAddr; + class SignerMessage_ImportHWWallet; class SignerMessage_SetSettlementId; class SignerMessage_SignSettlementTx; class SignerMessage_SignTxRequest; @@ -104,6 +105,8 @@ class SignerAdapter : public bs::message::Adapter, public SignerCallbackTarget , const BlockSettle::Common::SignerMessage_DialogRequest&); bs::message::ProcessingResult processCreateWallet(const bs::message::Envelope&, bool rescan , const BlockSettle::Common::SignerMessage_CreateWalletRequest&); + bs::message::ProcessingResult processImportHwWallet(const bs::message::Envelope& + , const BlockSettle::Common::SignerMessage_ImportHWWallet&); bs::message::ProcessingResult processDeleteWallet(const bs::message::Envelope&, const std::string& rootId); private: diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 13e5bf2e0..878193f8a 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -158,6 +158,9 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop , const QString& password); Q_INVOKABLE void importWallet(const QString& name, const QStringList& seed , const QString& password); + Q_INVOKABLE void pollHWWallets(); + Q_INVOKABLE void stopHWWalletsPolling(); + Q_INVOKABLE void importHWWallet(int deviceIndex); Q_INVOKABLE void generateNewAddress(int walletIndex, bool isNative); Q_INVOKABLE void copyAddressToClipboard(const QString& addr); @@ -168,9 +171,6 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); Q_INVOKABLE int startSearch(const QString&); Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); - Q_INVOKABLE void pollHWWallets(); - Q_INVOKABLE void stopHWWalletsPolling(); - Q_INVOKABLE void importHWWallet(int deviceIndex); signals: void walletsListChanged(); diff --git a/GUI/QtQuick/hwcommonstructure.h b/GUI/QtQuick/hwcommonstructure.h index ba90dba44..421a28366 100644 --- a/GUI/QtQuick/hwcommonstructure.h +++ b/GUI/QtQuick/hwcommonstructure.h @@ -19,30 +19,6 @@ #include "CoreWallet.h" -class HwWalletWrapper -{ - Q_GADGET -public: - bs::core::wallet::HwWalletInfo info_; - Q_INVOKABLE QString walletName() { - return QString::fromStdString(info_.label); - } - Q_INVOKABLE QString walletDesc() { - return QString::fromStdString(info_.vendor); - } - bool isValid() { - return !info_.xpubRoot.empty() && - !info_.xpubNestedSegwit.empty() && - !info_.xpubNativeSegwit.empty() && - !info_.xpubLegacy.empty(); - } - - bool isFirmwareSupported_{true}; - std::string firmwareSupportedMsg_; -}; -Q_DECLARE_METATYPE(HwWalletWrapper) - - namespace HWInfoStatus { const QString kPressButton = QObject::tr("Confirm transaction output(s) on your device"); const QString kTransaction = QObject::tr("Loading transaction to your device...."); diff --git a/common b/common index 087b648d9..9d0c7a175 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 087b648d97f60eff5782474aaad29793ecabd5ae +Subproject commit 9d0c7a1755c8653a5b956d9782c422dd40d0072b From 52a91b915e71bf3857b37c7ea108a5a77d57fed0 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 20 Jan 2023 00:23:55 +0300 Subject: [PATCH 060/436] HWW signing --- BlockSettleHW/hwdevicemanager.cpp | 134 +++++++++++++++++++++++++- BlockSettleHW/hwdevicemanager.h | 20 +++- BlockSettleHW/ledger/ledgerDevice.cpp | 3 +- BlockSettleHW/trezor/trezorDevice.cpp | 2 +- Core/SignerAdapter.cpp | 37 ++++++- GUI/QtQuick/QtQuickAdapter.cpp | 64 +++++++++--- GUI/QtQuick/QtQuickAdapter.h | 3 +- common | 2 +- 8 files changed, 238 insertions(+), 27 deletions(-) diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index ab7a71880..1f306e982 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -50,6 +50,8 @@ bs::message::ProcessingResult DeviceManager::process(const bs::message::Envelope return processSettings(env); case bs::message::TerminalUsers::Wallets: return processWallet(env); + case bs::message::TerminalUsers::Signer: + return processSigner(env); default: break; } } @@ -151,6 +153,8 @@ bs::message::ProcessingResult DeviceManager::processOwnRequest(const bs::message return bs::message::ProcessingResult::Success; case HW::DeviceMgrMessage::kImportDevice: return processImport(env, msg.import_device()); + case HW::DeviceMgrMessage::kSignTx: + return processSignTX(env, msg.sign_tx()); default: break; } return bs::message::ProcessingResult::Ignored; @@ -193,6 +197,22 @@ bs::message::ProcessingResult DeviceManager::processSettings(const bs::message:: return bs::message::ProcessingResult::Ignored; } +bs::message::ProcessingResult DeviceManager::processSigner(const bs::message::Envelope& env) +{ + SignerMessage msg; + if (!msg.ParseFromString(env.message)) { + logger_->error("[hww::DeviceManager::processSigner] failed to parse #{}" + , env.foreignId()); + return bs::message::ProcessingResult::Error; + } + switch (msg.data_case()) { + case SignerMessage::kSignTxResponse: + return processSignTxResponse(msg.sign_tx_response()); + default: break; + } + return bs::message::ProcessingResult::Ignored; +} + bs::message::ProcessingResult DeviceManager::processImport(const bs::message::Envelope& env , const HW::DeviceKey& key) { @@ -208,6 +228,76 @@ bs::message::ProcessingResult DeviceManager::processImport(const bs::message::En return bs::message::ProcessingResult::Success; } +bs::message::ProcessingResult bs::hww::DeviceManager::processSignTX(const bs::message::Envelope& env + , const Blocksettle::Communication::headless::SignTxRequest& request) +{ + HW::DeviceMgrMessage msg; + auto msgResp = msg.mutable_signed_tx(); + if (envReqSign_.sender || txSignReq_.isValid()) { + logger_->error("[{}] another sign request is already in progress", __func__); + msgResp->set_error_msg("another sign request is already in progress"); + pushResponse(user_, env, msg.SerializeAsString()); + return bs::message::ProcessingResult::Error; + } + const auto& txSignReq = bs::signer::pbTxRequestToCore(request); + if (!txSignReq.isValid() || (txSignReq.walletIds.size() != 1)) { + logger_->error("[{}] invalid TX sign request (nb wallets: {})", __func__ + , txSignReq.walletIds.size()); + msgResp->set_error_msg("invalid TX sign request"); + pushResponse(user_, env, msg.SerializeAsString()); + return bs::message::ProcessingResult::Error; + } + envReqSign_ = env; + txSignReq_ = txSignReq; + DeviceKey foundDevice; + for (const auto& device : devices_) { + if (device.walletId == txSignReq.walletIds.at(0)) { + foundDevice = device; + break; + } + } + if (foundDevice.id.empty()) { + logger_->info("[{}] device for {} not found - obtaining the list", __func__ + , txSignReq.walletIds.at(0)); + scanDevices({}); + } + else { + signTxWithDevice(foundDevice); + } + return bs::message::ProcessingResult::Success; +} + +void DeviceManager::signTxWithDevice(const DeviceKey& key) +{ + const auto& device = getDevice(key); + if (!device) { + HW::DeviceMgrMessage msg; + auto msgResp = msg.mutable_signed_tx(); + msgResp->set_error_msg("failed to get device for key " + key.id); + pushResponse(user_, envReqSign_, msg.SerializeAsString()); + envReqSign_ = {}; + txSignReq_ = {}; + return; + } + device->signTX(txSignReq_); +} + +bs::message::ProcessingResult DeviceManager::processSignTxResponse(const SignerMessage_SignTxResponse& response) +{ + if (response.signed_tx().empty() && !response.error_text().empty()) { + operationFailed({}, response.error_text()); + } + else { + HW::DeviceMgrMessage msg; + auto msgResp = msg.mutable_signed_tx(); + msgResp->set_signed_tx(response.signed_tx()); + pushResponse(user_, envReqSign_, msg.SerializeAsString()); + envReqSign_ = {}; + txSignReq_ = {}; + } + return bs::message::ProcessingResult::Success; +} + bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::SeqId msgId , const HDWalletData& hdWallet) { @@ -331,8 +421,10 @@ void DeviceManager::scanningDone(bool initDevices) devices_.insert(devices_.end(), trezorKeys.cbegin(), trezorKeys.cend()); if (!initDevices || devices_.empty()) { - devicesResponse(); - return; + if (envReqScan_.sender) { + devicesResponse(); + return; + } } for (const auto& key : ledgerKeys) { auto device = ledgerClient_->getDevice(key.id); @@ -377,7 +469,17 @@ void DeviceManager::publicKeyReady(const std::string& devId, const std::string& } } if (nbCompleted >= devices_.size()) { - devicesResponse(); + if (envReqScan_.sender) { + devicesResponse(); + } + else if (envReqScan_.sender && txSignReq_.isValid()) { + for (const auto& device : devices_) { + if (device.walletId == txSignReq_.walletIds.at(0)) { + signTxWithDevice(device); + break; + } + } + } } } @@ -421,10 +523,26 @@ void DeviceManager::deviceReady(const std::string& deviceId) void DeviceManager::deviceTxStatusChanged(const std::string& status) { + logger_->debug("[{}] {}", __func__, status); } -void DeviceManager::txSigned(const SecureBinaryData& signData) +void DeviceManager::txSigned(const DeviceKey& device, const SecureBinaryData& signData) { + if (device.type != DeviceType::HWLedger) { + HW::DeviceMgrMessage msg; + auto msgResp = msg.mutable_signed_tx(); + msgResp->set_signed_tx(signData.toBinStr()); + pushResponse(user_, envReqSign_, msg.SerializeAsString()); + envReqSign_ = {}; + txSignReq_ = {}; + } + else { + SignerMessage msg; + auto msgReq = msg.mutable_sign_tx_request(); + *msgReq->mutable_tx_request() = bs::signer::coreTxRequestToPb(txSignReq_); + msgReq->set_passphrase(signData.toBinStr()); + pushRequest(user_, userSigner_, msg.SerializeAsString()); + } } void DeviceManager::scanningDone() @@ -441,6 +559,14 @@ void DeviceManager::scanningDone() void DeviceManager::operationFailed(const std::string& deviceId, const std::string& reason) { + if (envReqSign_.sender) { + HW::DeviceMgrMessage msg; + auto msgResp = msg.mutable_signed_tx(); + msgResp->set_error_msg(reason); + pushResponse(user_, envReqSign_, msg.SerializeAsString()); + envReqSign_ = {}; + txSignReq_ = {}; + } } void DeviceManager::cancelledOnDevice() diff --git a/BlockSettleHW/hwdevicemanager.h b/BlockSettleHW/hwdevicemanager.h index a3f193ff0..afa5b4575 100644 --- a/BlockSettleHW/hwdevicemanager.h +++ b/BlockSettleHW/hwdevicemanager.h @@ -26,11 +26,19 @@ namespace spdlog { namespace BlockSettle { namespace Common { class HDWalletData; + class SignerMessage_SignTxResponse; } namespace HW { class DeviceKey; } } +namespace Blocksettle { + namespace Communication { + namespace headless { + class SignTxRequest; + } + } +} namespace bs { namespace hww { @@ -50,7 +58,7 @@ namespace bs { virtual void deviceReady(const std::string& deviceId) = 0; virtual void deviceTxStatusChanged(const std::string& status) = 0; - virtual void txSigned(const SecureBinaryData& signData) = 0; + virtual void txSigned(const DeviceKey&, const SecureBinaryData& signData) = 0; virtual void scanningDone() = 0; virtual void operationFailed(const std::string& deviceId, const std::string& reason) = 0; virtual void cancelledOnDevice() = 0; @@ -79,7 +87,7 @@ namespace bs { void deviceReady(const std::string& deviceId) override; void deviceTxStatusChanged(const std::string& status) override; - void txSigned(const SecureBinaryData& signData) override; + void txSigned(const DeviceKey&, const SecureBinaryData& signData) override; void scanningDone() override; void operationFailed(const std::string& deviceId, const std::string& reason) override; void cancelledOnDevice() override; @@ -110,10 +118,15 @@ namespace bs { bs::message::ProcessingResult processOwnRequest(const bs::message::Envelope&); bs::message::ProcessingResult processWallet(const bs::message::Envelope&); bs::message::ProcessingResult processSettings(const bs::message::Envelope&); + bs::message::ProcessingResult processSigner(const bs::message::Envelope&); void devicesResponse(); bs::message::ProcessingResult processImport(const bs::message::Envelope& , const BlockSettle::HW::DeviceKey&); + bs::message::ProcessingResult processSignTX(const bs::message::Envelope& + , const Blocksettle::Communication::headless::SignTxRequest&); + void signTxWithDevice(const DeviceKey&); + bs::message::ProcessingResult processSignTxResponse(const BlockSettle::Common::SignerMessage_SignTxResponse&); private: std::shared_ptr logger_; @@ -128,7 +141,8 @@ namespace bs { std::string lastOperationError_; std::string lastUsedTrezorWallet_; unsigned nbWaitScanReplies_{ 0 }; - bs::message::Envelope envReqScan_; + bs::message::Envelope envReqScan_, envReqSign_; + bs::core::wallet::TXSignRequest txSignReq_; std::map> prepareDeviceReq_; //value: walletId }; diff --git a/BlockSettleHW/ledger/ledgerDevice.cpp b/BlockSettleHW/ledger/ledgerDevice.cpp index e00d7eed0..4eedc3fa9 100644 --- a/BlockSettleHW/ledger/ledgerDevice.cpp +++ b/BlockSettleHW/ledger/ledgerDevice.cpp @@ -465,7 +465,7 @@ void LedgerDevice::signTX(const bs::core::wallet::TXSignRequest& coreReq) operationFailed("invalid data"); return; } - cb_->txSigned(reply->serInputSigs); + cb_->txSigned(key(), reply->serInputSigs); }; auto inData = std::make_shared(); inData->key = key(); @@ -931,6 +931,7 @@ void SignTXHandler::sendTxSigningResult(const std::shared_ptr& outDat bw.put_var_int(responseSigned.size()); for (const auto& signedInput : responseSigned) { bw.put_uint32_t(signedInput.first); + bw.put_var_int(signedInput.second.size()); bw.put_BinaryData(BinaryData::fromString(signedInput.second.toStdString())); } outData->serInputSigs = bw.getData(); diff --git a/BlockSettleHW/trezor/trezorDevice.cpp b/BlockSettleHW/trezor/trezorDevice.cpp index c2def51de..67b399940 100644 --- a/BlockSettleHW/trezor/trezorDevice.cpp +++ b/BlockSettleHW/trezor/trezorDevice.cpp @@ -348,7 +348,7 @@ void TrezorDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX) operationFailed("Signing failed. Please ensure you typed the correct passphrase."); return; } - cb_->txSigned(SecureBinaryData::fromString(reply->signedTX)); + cb_->txSigned(key(), SecureBinaryData::fromString(reply->signedTX)); }; makeCall(message, cb); } diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index ee607d642..18c64b0a6 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -526,10 +526,39 @@ ProcessingResult SignerAdapter::processSignTx(const bs::message::Envelope& env pushResponse(user_, env, msg.SerializeAsString()); }; const auto& txReq = bs::signer::pbTxRequestToCore(request.tx_request(), logger_); - passphrase_ = SecureBinaryData::fromString(request.passphrase()); - signer_->signTXRequest(txReq, cbSigned - , static_cast(request.sign_mode()) - , request.keep_dup_recips()); + bs::core::WalletsManager::HDWalletPtr hdWallet; + if ((txReq.walletIds.size() == 1)) { + hdWallet = walletsMgr_->getHDWalletById(txReq.walletIds.at(0)); + if (hdWallet) { + if (!hdWallet->isHardwareWallet()) { + hdWallet.reset(); + } + } + else { + logger_->error("[{}] failed to get HD wallet by {}", __func__, txReq.walletIds.at(0)); + } + } + if (hdWallet) { + const auto& signData = SecureBinaryData::fromString(request.passphrase()); + hdWallet->pushPasswordPrompt([signData]() { return signData; }); + SignerMessage msg; + auto msgResp = msg.mutable_sign_tx_response(); + try { + const auto& signedTX = hdWallet->signTXRequestWithWallet(txReq); + msgResp->set_signed_tx(signedTX.toBinStr()); + } + catch (const std::exception& e) { + msgResp->set_error_text(e.what()); + } + hdWallet->popPasswordPrompt(); + pushResponse(user_, env, msg.SerializeAsString()); + } + else { + passphrase_ = SecureBinaryData::fromString(request.passphrase()); + signer_->signTXRequest(txReq, cbSigned + , static_cast(request.sign_mode()) + , request.keep_dup_recips()); + } return ProcessingResult::Success; } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 07b960511..86f10469f 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -625,6 +625,8 @@ bs::message::ProcessingResult QtQuickAdapter::processHWW(const bs::message::Enve switch (msg.data_case()) { case HW::DeviceMgrMessage::kAvailableDevices: return processHWDevices(msg.available_devices()); + case HW::DeviceMgrMessage::kSignedTx: + return processHWSignedTX(msg.signed_tx()); default: break; } return bs::message::ProcessingResult::Ignored; @@ -1507,6 +1509,16 @@ QString QtQuickAdapter::getSettingStringAt(ApplicationSettings::Setting s, int i return {}; } +bs::message::ProcessingResult QtQuickAdapter::processHWSignedTX(const HW::DeviceMgrMessage_SignTxResponse& response) +{ + ArmoryMessage msg; + auto msgReq = msg.mutable_tx_push(); + auto msgTx = msgReq->add_txs_to_push(); + msgTx->set_tx(response.signed_tx()); + pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + return ProcessingResult::Success; +} + void QtQuickAdapter::setSetting(ApplicationSettings::Setting s, const QVariant& val) { if (settingsCache_.empty()) { @@ -1531,10 +1543,6 @@ void QtQuickAdapter::setSetting(ApplicationSettings::Setting s, const QVariant& pushRequest(user_, userSettings_, msg.SerializeAsString()); } -void QtQuickAdapter::resetArmoryConnection() -{ -} - void QtQuickAdapter::signAndBroadcast(QTXSignRequest* txReq, const QString& password) { if (!txReq) { @@ -1542,14 +1550,46 @@ void QtQuickAdapter::signAndBroadcast(QTXSignRequest* txReq, const QString& pass return; } const auto& txSignReq = txReq->txReq(); - SignerMessage msg; - auto msgReq = msg.mutable_sign_tx_request(); - //msgReq->set_id(id); - *msgReq->mutable_tx_request() = bs::signer::coreTxRequestToPb(txSignReq); - msgReq->set_sign_mode((int)SignContainer::TXSignMode::Full); - //msgReq->set_keep_dup_recips(keepDupRecips); - msgReq->set_passphrase(password.toStdString()); - pushRequest(user_, userSigner_, msg.SerializeAsString()); + bool needHWSign = false; + for (const auto& walletId : txSignReq.walletIds) { + try { + if (hdWallets_.at(walletId).isHardware) { + needHWSign = true; + break; + } + } + catch (const std::exception&) {} + } + if (needHWSign) { + unsigned nbNonHW = 0; + for (const auto& walletId : txSignReq.walletIds) { + try { + if (!hdWallets_.at(walletId).isHardware) { + logger_->warn("[{}] can't mix HW and non-HW wallets now " + "(non-HW wallet {})", __func__, walletId); + nbNonHW++; + } + } + catch (const std::exception&) {} + } + if (nbNonHW > 0) { + logger_->error("[{}] {} non-HW wallet[s] in sign request", __func__, nbNonHW); + return; + } + HW::DeviceMgrMessage msg; + *msg.mutable_sign_tx() = bs::signer::coreTxRequestToPb(txSignReq); + pushRequest(user_, userHWW_, msg.SerializeAsString()); + } + else { + SignerMessage msg; + auto msgReq = msg.mutable_sign_tx_request(); + //msgReq->set_id(id); + *msgReq->mutable_tx_request() = bs::signer::coreTxRequestToPb(txSignReq); + msgReq->set_sign_mode((int)SignContainer::TXSignMode::Full); + //msgReq->set_keep_dup_recips(keepDupRecips); + msgReq->set_passphrase(password.toStdString()); + pushRequest(user_, userSigner_, msg.SerializeAsString()); + } } int QtQuickAdapter::startSearch(const QString& s) diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 878193f8a..e5c68ad72 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -53,6 +53,7 @@ namespace BlockSettle { } namespace HW { class DeviceMgrMessage_Devices; + class DeviceMgrMessage_SignTxResponse; } namespace Terminal { class AssetsMessage_Balance; @@ -225,11 +226,11 @@ private slots: , const BlockSettle::Common::WalletsMessage_TxResponse&); bs::message::ProcessingResult processHWDevices(const BlockSettle::HW::DeviceMgrMessage_Devices&); + bs::message::ProcessingResult processHWSignedTX(const BlockSettle::HW::DeviceMgrMessage_SignTxResponse&); QVariant getSetting(ApplicationSettings::Setting) const; QString getSettingStringAt(ApplicationSettings::Setting, int idx); void setSetting(ApplicationSettings::Setting, const QVariant&); - void resetArmoryConnection(); private: std::shared_ptr logger_; diff --git a/common b/common index 9d0c7a175..d9f978fac 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 9d0c7a1755c8653a5b956d9782c422dd40d0072b +Subproject commit d9f978face95f9435bdb2144ebe56125b00b246a From d195a0e3b177ffbc46129b95b8bb57c8ad55da0b Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 20 Jan 2023 17:56:33 +0300 Subject: [PATCH 061/436] HW devices UI --- GUI/QtQuick/hwdevicemodel.cpp | 2 ++ GUI/QtQuick/hwdevicemodel.h | 4 +++ .../qml/CreateWallet/ImportHardware.qml | 31 +++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/GUI/QtQuick/hwdevicemodel.cpp b/GUI/QtQuick/hwdevicemodel.cpp index 598f0438a..51197d7d7 100644 --- a/GUI/QtQuick/hwdevicemodel.cpp +++ b/GUI/QtQuick/hwdevicemodel.cpp @@ -78,6 +78,7 @@ void HwDeviceModel::setDevices(const std::vector& deviceKeys loaded_.resize(deviceKeys.size(), false); devices_ = deviceKeys; endResetModel(); + emit dataSet(); } bs::hww::DeviceKey HwDeviceModel::getDevice(int index) @@ -106,6 +107,7 @@ void HwDeviceModel::setLoaded(const std::string& walletId) loaded_[i] = true; } } + emit dataSet(); } int HwDeviceModel::selDevice() const diff --git a/GUI/QtQuick/hwdevicemodel.h b/GUI/QtQuick/hwdevicemodel.h index 9f211a532..ef26f3195 100644 --- a/GUI/QtQuick/hwdevicemodel.h +++ b/GUI/QtQuick/hwdevicemodel.h @@ -27,6 +27,9 @@ class HwDeviceModel : public QAbstractItemModel { Q_OBJECT Q_PROPERTY(int selDevice READ selDevice NOTIFY selected) + Q_PROPERTY(bool empty READ empty NOTIFY dataSet) + bool empty() const { return devices_.empty(); } + public: HwDeviceModel(QObject *parent = nullptr); ~HwDeviceModel() override = default; @@ -47,6 +50,7 @@ class HwDeviceModel : public QAbstractItemModel signals: void selected(); + void dataSet(); private: int selDevice() const; diff --git a/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml index 8ed47525a..1a463bea5 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml @@ -45,6 +45,7 @@ ColumnLayout { Label { id: subtitle + visible: hwDeviceModel.empty Layout.alignment: Qt.AlignCenter Layout.topMargin: 16 Layout.preferredHeight : 16 @@ -54,6 +55,36 @@ ColumnLayout { font.family: "Roboto" font.weight: Font.Normal } + TableView { + visible: !hwDeviceModel.empty + width: 800 + height: 200 + columnSpacing: 1 + rowSpacing: 1 + clip: true + ScrollIndicator.horizontal: ScrollIndicator { } + ScrollIndicator.vertical: ScrollIndicator { } + model: hwDeviceModel + delegate: Rectangle { + implicitWidth: 750 + implicitHeight: 20 + border.color: "black" + border.width: 1 + color: 'darkslategrey' + Text { + text: label + font.pointSize: 12 + color: heading ? 'darkgrey' : 'lightgrey' + anchors.centerIn: parent + } + MouseArea { + anchors.fill: parent + onClicked: { + //TODO: select device + } + } + } + } Label { id: spacer From fd5c557192e8a62cd51ac228e7104bf86a0a88fa Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sun, 22 Jan 2023 21:24:02 +0200 Subject: [PATCH 062/436] qml: CustomComboBox --- GUI/QtQuick/images/success.png | Bin 2667 -> 3082 bytes GUI/QtQuick/qml/BsStyles/BSStyle.qml | 8 +++++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 30 +++++++++--------- .../qml/StyledControls/CustomComboBox.qml | 20 +++++++----- GUI/QtQuick/qml/main.qml | 2 +- 5 files changed, 36 insertions(+), 24 deletions(-) diff --git a/GUI/QtQuick/images/success.png b/GUI/QtQuick/images/success.png index c1219c590a888eaf99902066c53df6f4d4337f18..0d83d2c5d37e6a436e0513e30f0898931d362a46 100644 GIT binary patch delta 3062 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 Ef;es5!~g&Q delta 2644 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 Date: Mon, 23 Jan 2023 12:23:11 +0300 Subject: [PATCH 063/436] potential fix for race condition --- BlockSettleHW/ledger/ledgerClient.cpp | 9 ++++++--- BlockSettleHW/trezor/trezorClient.cpp | 24 +++++++++++++++--------- BlockSettleHW/trezor/trezorDevice.cpp | 15 ++++++++------- GUI/QtQuick/QtQuickAdapter.cpp | 18 ++++++++++-------- 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/BlockSettleHW/ledger/ledgerClient.cpp b/BlockSettleHW/ledger/ledgerClient.cpp index e92bff76a..9fa9eef67 100644 --- a/BlockSettleHW/ledger/ledgerClient.cpp +++ b/BlockSettleHW/ledger/ledgerClient.cpp @@ -77,22 +77,25 @@ std::string LedgerClient::lastScanError() const void LedgerClient::scanDevices() { availableDevices_.clear(); + logger_->debug("[LedgerClient::scanDevices] start HID enumeration"); hid_device_info* info = hid_enumerate(0, 0); for (; info; info = info->next) { + logger_->debug("[{}] found: vendor {0:x}, product {0:x} ({}), iface: {0:x}, serial: {}", __func__ + , info->vendor_id, info->product_id, (char*)info->product_string + , info->interface_number, (char*)info->serial_number); if (checkLedgerDevice(info)) { auto device = std::make_shared(fromHidOriginal(info), testNet_, logger_, cb_, hidLock_); availableDevices_.push_back({ device }); } } + hid_exit(); if (availableDevices_.empty()) { - logger_->error("[LedgerClient::scanDevices] no ledger device available"); + logger_->info("[LedgerClient::scanDevices] no ledger devices available"); } else { logger_->info("[LedgerClient::scanDevices] found {} device[s]", availableDevices_.size()); } - hid_exit(); - cb_->scanningDone(); } diff --git a/BlockSettleHW/trezor/trezorClient.cpp b/BlockSettleHW/trezor/trezorClient.cpp index c76f9b57d..b1f0416d0 100644 --- a/BlockSettleHW/trezor/trezorClient.cpp +++ b/BlockSettleHW/trezor/trezorClient.cpp @@ -28,8 +28,9 @@ void TrezorClient::initConnection() const auto& cb = [this](const std::shared_ptr& data) { const auto& reply = std::static_pointer_cast(data); - if (!reply || !reply->error.empty()) { - logger_->error("[TrezorClient::initConnection] network error: {}", reply ? reply->error : ""); + if (!reply || !reply->error.empty() || reply->response.empty()) { + logger_->error("[TrezorClient::initConnection] network error: {}" + , (reply && !reply->error.empty()) ? reply->error : ""); return; } nlohmann::json response; @@ -37,7 +38,8 @@ void TrezorClient::initConnection() response = nlohmann::json::parse(reply->response); } catch (const nlohmann::json::exception& e) { - logger_->error("[TrezorClient::acquireDevice] failed to parse '{}': {}", reply->response, e.what()); + logger_->error("[TrezorClient::initConnection] failed to parse '{}': {}" + , reply->response, e.what()); return; } @@ -94,8 +96,9 @@ void TrezorClient::listDevices() const auto& cb = [this](const std::shared_ptr& data) { const auto& reply = std::static_pointer_cast(data); - if (!reply || !reply->error.empty()) { - logger_->error("[TrezorClient::listDevices] network error: {}", reply ? reply->error : ""); + if (!reply || !reply->error.empty() || reply->response.empty()) { + logger_->error("[TrezorClient::listDevices] network error: {}" + , (reply && !reply->error.empty()) ? reply->error : ""); cb_->scanningDone(); return; } @@ -104,7 +107,7 @@ void TrezorClient::listDevices() response = nlohmann::json::parse(reply->response); } catch (const nlohmann::json::exception& e) { - logger_->error("[TrezorClient::acquireDevice] failed to parse '{}': {}", reply->response, e.what()); + logger_->error("[TrezorClient::listDevices] failed to parse '{}': {}", reply->response, e.what()); cb_->scanningDone(); return; } @@ -153,8 +156,9 @@ void TrezorClient::acquireDevice(const trezor::DeviceData& devData, bool init) } }; const auto& reply = std::static_pointer_cast(data); - if (!reply || !reply->error.empty()) { - logger_->error("[TrezorClient::acquireDevice] network error: {}", reply ? reply->error : ""); + if (!reply || !reply->error.empty() || reply->response.empty()) { + logger_->error("[TrezorClient::acquireDevice] network error: {}" + , (reply && !reply->error.empty()) ? reply->error : ""); scanDone(); return; } @@ -196,7 +200,7 @@ void TrezorClient::acquireDevice(const trezor::DeviceData& devData, bool init) namespace { - static const std::string kBlockSettleOrigin{ "Origin: https://blocksettle.trezor.io" }; + static const std::string kBlockSettleOrigin{ "Origin: https://blocksettle.trezor.io;" }; } static size_t writeToString(void* ptr, size_t size, size_t count, std::string* stream) @@ -232,6 +236,7 @@ std::shared_ptr bs::hww::TrezorPostHandler::processData(const std return result; } const std::string url{ baseURL_ + inData->path }; + logger_->debug("[{}] request: '{}' to {}", __func__, inData->input, url); curl_easy_setopt(curl_, CURLOPT_URL, url.c_str()); if (!inData->input.empty()) { curl_easy_setopt(curl_, CURLOPT_POSTFIELDS, inData->input.data()); @@ -251,6 +256,7 @@ std::shared_ptr bs::hww::TrezorPostHandler::processData(const std result->error = fmt::format("failed to post to {}: {}", url, res); return result; } + logger_->debug("[{}] response: {}", __func__, response); result->response = std::move(response); return result; } diff --git a/BlockSettleHW/trezor/trezorDevice.cpp b/BlockSettleHW/trezor/trezorDevice.cpp index 67b399940..18014b1c6 100644 --- a/BlockSettleHW/trezor/trezorDevice.cpp +++ b/BlockSettleHW/trezor/trezorDevice.cpp @@ -87,7 +87,7 @@ namespace { return output; } - static const std::string kTesNetCoin = "Testnet"; + static const std::string kTestNetCoin = "Testnet"; } TrezorDevice::TrezorDevice(const std::shared_ptr &logger @@ -120,7 +120,7 @@ void TrezorDevice::releaseConnection() const auto& reply = std::static_pointer_cast(data); if (!reply || !reply->error.empty()) { logger_->error("[TrezorDevice::releaseConnection] network error: {}" - , reply ? reply->error : ""); + , (reply && !reply->error.empty()) ? reply->error : ""); return; } @@ -162,7 +162,7 @@ void TrezorDevice::init() { const auto& reply = std::static_pointer_cast(data); if (!reply || !reply->error.empty()) { - logger_->error("[TrezorDevice::makeCall] network error: {}", reply ? reply->error : ""); + logger_->error("[TrezorDevice::makeCall] network error: {}", (reply && !reply->error.empty()) ? reply->error : ""); //emit operationFailed(QLatin1String("Network error")); reset(); return; @@ -252,7 +252,7 @@ void TrezorDevice::getPublicKeys() message.add_address_n(add); } if (testNet_) { - message.set_coin_name(kTesNetCoin); + message.set_coin_name(kTestNetCoin); } makeCall(message, cbNative); @@ -314,7 +314,7 @@ void TrezorDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX) message.set_inputs_count(currentTxSignReq_->armorySigner_.getTxInCount()); message.set_outputs_count(currentTxSignReq_->armorySigner_.getTxOutCount()); if (testNet_) { - message.set_coin_name(kTesNetCoin); + message.set_coin_name(kTestNetCoin); } const auto& cb = [this, reqTX](const std::shared_ptr& data) { @@ -360,7 +360,7 @@ void TrezorDevice::retrieveXPubRoot() bitcoin::GetPublicKey message; message.add_address_n(bs::hd::hardFlag); if (testNet_) { - message.set_coin_name(kTesNetCoin); + message.set_coin_name(kTestNetCoin); } const auto& saveXpubRoot = [this](const std::shared_ptr& data) @@ -387,7 +387,8 @@ void TrezorDevice::makeCall(const google::protobuf::Message &msg { const auto& reply = std::static_pointer_cast(data); if (!reply || !reply->error.empty()) { - logger_->error("[TrezorDevice::makeCall] network error: {}", reply ? reply->error : ""); + logger_->error("[TrezorDevice::makeCall] network error: {}" + , (reply && !reply->error.empty()) ? reply->error : ""); //emit operationFailed(QLatin1String("Network error")); reset(); return; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 86f10469f..7ab28a5db 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -808,14 +808,16 @@ std::string QtQuickAdapter::generateWalletName() const void QtQuickAdapter::walletSelected(int index) { - const auto& walletName = walletBalances_->wallets().at(index).toStdString(); - const auto& walletId = hdWalletIdByIndex(index); - - addrModel_->reset(walletId); - WalletsMessage msg; - msg.set_wallet_get(walletId); - const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); - walletInfoReq_[msgId] = walletName; + QMetaObject::invokeMethod(this, [this, index] { + const auto& walletName = walletBalances_->wallets().at(index).toStdString(); + const auto& walletId = hdWalletIdByIndex(index); + + addrModel_->reset(walletId); + WalletsMessage msg; + msg.set_wallet_get(walletId); + const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); + walletInfoReq_[msgId] = walletName; + }); } void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) From 01cd29256d480e2acf4ef65958892b4128f63027 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 23 Jan 2023 20:14:50 +0300 Subject: [PATCH 064/436] fix old wallets duplication after import --- BlockSettleHW/trezor/trezorClient.cpp | 3 ++- GUI/QtQuick/QtQuickAdapter.cpp | 2 ++ common | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/BlockSettleHW/trezor/trezorClient.cpp b/BlockSettleHW/trezor/trezorClient.cpp index b1f0416d0..d9ae5286d 100644 --- a/BlockSettleHW/trezor/trezorClient.cpp +++ b/BlockSettleHW/trezor/trezorClient.cpp @@ -200,7 +200,8 @@ void TrezorClient::acquireDevice(const trezor::DeviceData& devData, bool init) namespace { - static const std::string kBlockSettleOrigin{ "Origin: https://blocksettle.trezor.io;" }; + //static const std::string kBlockSettleOrigin{ "Origin: https://blocksettle.trezor.io" }; + static const std::string kBlockSettleOrigin{ "Origin: https://localhost" }; } static size_t writeToString(void* ptr, size_t size, size_t count, std::string* stream) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 7ab28a5db..1a193c9da 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1103,6 +1103,7 @@ void QtQuickAdapter::createWallet(const QString& name, const QStringList& seed msgReq->set_seed(binSeed.toBinStr()); msgReq->set_password(password.toStdString()); pushRequest(user_, userSigner_, msg.SerializeAsString()); + walletBalances_->clear(); } void QtQuickAdapter::importWallet(const QString& name, const QStringList& seed @@ -1123,6 +1124,7 @@ void QtQuickAdapter::importWallet(const QString& name, const QStringList& seed msgReq->set_seed(binSeed.toBinStr()); msgReq->set_password(password.toStdString()); pushRequest(user_, userSigner_, msg.SerializeAsString()); + walletBalances_->clear(); } void QtQuickAdapter::generateNewAddress(int walletIndex, bool isNative) diff --git a/common b/common index d9f978fac..56f989057 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit d9f978face95f9435bdb2144ebe56125b00b246a +Subproject commit 56f9890570f7622b3d237f90f5ae0dcb235699a8 From 55c36208decd6c08d0b1add26c8064f16963d83a Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 23 Jan 2023 21:02:00 +0200 Subject: [PATCH 065/436] test balance erros --- GUI/QtQuick/qml/Send/SendPopup.qml | 4 ++++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index ba8cb65c0..c65b6c44f 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -19,5 +19,9 @@ CustomPopup { SimpleDetails { id: simple_details visible: false + + onSig_continue: (signature) => { + console.log(signature) + } } } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index afa386297..0d3761ce8 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -12,7 +12,7 @@ ColumnLayout { id: layout - signal sig_continue() + signal sig_continue(signature: var) height: 554 width: 600 @@ -120,7 +120,7 @@ ColumnLayout { title_text: qsTr("Amount") input_text: "0" - input_validator: DoubleValidator{bottom: 0; notation :DoubleValidator.StandardNotation;} + input_validator: DoubleValidator{bottom: 0; decimals: 20; notation :DoubleValidator.StandardNotation;} CustomButton { @@ -249,7 +249,10 @@ ColumnLayout { } function click_enter() { - layout.sig_continue() + layout.sig_continue( bsApp.createTXSignRequest( + from_wallet_combo.currentIndex, rec_addr_input.text, + parseFloat(from_wallet_combo.details_text), parseFloat(fee_suggest_combo.currentValue), + comment_input.text)) } } From 90f08e31ef46a94ce741f835159660ef35b8effc Mon Sep 17 00:00:00 2001 From: dvajdual Date: Tue, 24 Jan 2023 19:11:57 +0200 Subject: [PATCH 066/436] qml: send widget --- GUI/QtQuick/qml/Send/SendPopup.qml | 19 +- GUI/QtQuick/qml/Send/SignTransaction.qml | 419 ++++++++++++++++++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 12 +- GUI/QtQuick/qml/Send/qmldir | 1 + GUI/QtQuick/qml/SendPage.qml | 7 +- .../qml/StyledControls/CustomProgressBar.qml | 23 +- GUI/QtQuick/qtquick.qrc | 1 + 7 files changed, 463 insertions(+), 19 deletions(-) create mode 100644 GUI/QtQuick/qml/Send/SignTransaction.qml diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index c65b6c44f..de543ca3e 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -21,7 +21,24 @@ CustomPopup { visible: false onSig_continue: (signature) => { - console.log(signature) + sign_trans.init() + sign_trans.txSignRequest = signature + _stack_view.push(sign_trans) + } + } + + SignTransaction { + id: sign_trans + visible: false + + onSig_broadcast: { + root.close() + _stack_view.pop(null) + } + + onSig_time_finished: { + root.close() + _stack_view.pop(null) } } } diff --git a/GUI/QtQuick/qml/Send/SignTransaction.qml b/GUI/QtQuick/qml/Send/SignTransaction.qml new file mode 100644 index 000000000..2537087bb --- /dev/null +++ b/GUI/QtQuick/qml/Send/SignTransaction.qml @@ -0,0 +1,419 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + + id: layout + + property var txSignRequest + + property int time_progress + + signal sig_broadcast() + signal sig_time_finished() + + height: 554 + width: 580 + spacing: 0 + + CustomTitleLabel { + id: title + Layout.topMargin: 6 + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : title.height + text: "Sign Transaction" + } + + Label { + Layout.fillWidth: true + height: 24 + } + + Rectangle { + + id: output_rect + + width: 532 + height: 82 + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + + radius: 14 + + color: "#32394F" + + Label { + + id: out_addr_title + + anchors.top: parent.top + anchors.topMargin: 18 + anchors.left: parent.left + anchors.leftMargin: 20 + + text: qsTr("Output address:") + + color: "#45A6FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: out_amount_title + + anchors.top: out_addr_title.bottom + anchors.topMargin: 14 + anchors.left: parent.left + anchors.leftMargin: 20 + + text: qsTr("Output amount:") + + color: "#45A6FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: out_addr + + anchors.top: parent.top + anchors.topMargin: 18 + anchors.right: parent.right + anchors.rightMargin: 20 + + text: txSignRequest.outputAddresses[0] + + color: "#FFFFFF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: out_amount + + anchors.top: out_addr.bottom + anchors.topMargin: 14 + anchors.right: parent.right + anchors.rightMargin: 20 + + text: txSignRequest.outputAmount + + color: "#FFFFFF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + } + + Rectangle { + + id: input_rect + + width: 532 + height: 188 + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + + color: "transparent" + + Label { + + id: in_amount_title + + anchors.top: parent.top + anchors.topMargin: 18 + anchors.left: parent.left + anchors.leftMargin: 20 + + text: qsTr("Input amount:") + + color: "#7A88B0" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: in_amount + + anchors.top: parent.top + anchors.topMargin: 18 + anchors.right: parent.right + anchors.rightMargin: 20 + + text: txSignRequest.inputAmount + + color: "#E2E7FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: return_amount_title + + anchors.top: in_amount_title.bottom + anchors.topMargin: 15 + anchors.left: parent.left + anchors.leftMargin: 20 + + text: qsTr("Return amount:") + + color: "#7A88B0" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: return_amount + + anchors.top: in_amount.bottom + anchors.topMargin: 15 + anchors.right: parent.right + anchors.rightMargin: 20 + + text: txSignRequest.returnAmount + + color: "#E2E7FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: transaction_fee_title + + anchors.top: return_amount_title.bottom + anchors.topMargin: 15 + anchors.left: parent.left + anchors.leftMargin: 20 + + text: qsTr("Transaction fee:") + + color: "#7A88B0" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: transaction_fee + + anchors.top: return_amount.bottom + anchors.topMargin: 15 + anchors.right: parent.right + anchors.rightMargin: 20 + + text: txSignRequest.fee + + color: "#E2E7FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: transaction_size_title + + anchors.top: transaction_fee_title.bottom + anchors.topMargin: 15 + anchors.left: parent.left + anchors.leftMargin: 20 + + text: qsTr("Transaction size:") + + color: "#7A88B0" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: transaction_size + + anchors.top: transaction_fee.bottom + anchors.topMargin: 15 + anchors.right: parent.right + anchors.rightMargin: 20 + + text: txSignRequest.txSize + + color: "#E2E7FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: fee_per_byte_title + + anchors.top: transaction_size_title.bottom + anchors.topMargin: 15 + anchors.left: parent.left + anchors.leftMargin: 20 + + text: qsTr("Fee-per-byte:") + + color: "#7A88B0" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: fee_per_byte + + anchors.top: transaction_size.bottom + anchors.topMargin: 15 + anchors.right: parent.right + anchors.rightMargin: 20 + + text: txSignRequest.feePerByte + + color: "#E2E7FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + } + + CustomTextInput { + id: password + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + + title_text: qsTr("Password") + + Component.onCompleted: { + password.isPassword = true + password.isHiddenText = true + } + } + + CustomProgressBar { + id: progress_bar + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.topMargin: 16 + + from: 0 + to: 120 + + value: layout.time_progress + } + + Label { + id: progress_label + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.topMargin: 8 + + text: Number(layout.time_progress).toLocaleString() +" seconds left" + + color: "#45A6FF" + + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + Layout.fillWidth: true + Layout.fillHeight: true + } + + CustomButton { + id: broadcast_but + text: qsTr("Broadcast") + width: 532 + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + enabled: password.input_text.length + + Component.onCompleted: { + broadcast_but.preferred = false + } + function click_enter() { + bsApp.signAndBroadcast(txSignRequest, password.input_text) + password.input_text = "" + sig_broadcast() + } + } + + Keys.onEnterPressed: { + broadcast_but.click_enter() + } + + Keys.onReturnPressed: { + broadcast_but.click_enter() + } + + Timer { + interval: 1000 + running: true + repeat: true + onTriggered: { + layout.time_progress = layout.time_progress - 1 + + if (time_progress === 0) + { + running = false + password.input_text = "" + sig_time_finished() + } + } + } + + function init() + { + password.input_text = "" + time_progress = 120 + } + +} diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 0d3761ce8..3fff2129f 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -120,7 +120,9 @@ ColumnLayout { title_text: qsTr("Amount") input_text: "0" - input_validator: DoubleValidator{bottom: 0; decimals: 20; notation :DoubleValidator.StandardNotation;} + input_validator: DoubleValidator{bottom: 0; top: from_wallet_combo.currentIndex ? getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole) : 0; + decimals: 20; + notation :DoubleValidator.StandardNotation; locale: "en_US";} CustomButton { @@ -140,7 +142,7 @@ ColumnLayout { font.pixelSize: 12 function click_enter() { - console.log ("MAX clicked") + amount_input.input_text = getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole) } } @@ -250,9 +252,9 @@ ColumnLayout { function click_enter() { layout.sig_continue( bsApp.createTXSignRequest( - from_wallet_combo.currentIndex, rec_addr_input.text, - parseFloat(from_wallet_combo.details_text), parseFloat(fee_suggest_combo.currentValue), - comment_input.text)) + from_wallet_combo.currentIndex, rec_addr_input.input_text, + parseFloat(amount_input.input_text), parseFloat(fee_suggest_combo.currentValue), + comment_input.input_text)) } } diff --git a/GUI/QtQuick/qml/Send/qmldir b/GUI/QtQuick/qml/Send/qmldir index 77e337294..48ee06b69 100644 --- a/GUI/QtQuick/qml/Send/qmldir +++ b/GUI/QtQuick/qml/Send/qmldir @@ -2,3 +2,4 @@ module SendControls SendPopup 1.0 SendPopup.qml SimpleDetails 1.0 SimpleDetails.qml +SignTransaction 1.0 SignTransaction.qml diff --git a/GUI/QtQuick/qml/SendPage.qml b/GUI/QtQuick/qml/SendPage.qml index 845fda857..42e15a0f1 100644 --- a/GUI/QtQuick/qml/SendPage.qml +++ b/GUI/QtQuick/qml/SendPage.qml @@ -185,10 +185,13 @@ Item { width: 900 text: qsTr("Continue") font.pointSize: 14 - enabled: recvAddress.text.length && (parseFloat(amount.text) >= 0.00001) - && (parseFloat(fees.text) >= 1.0) +// enabled: recvAddress.text.length && (parseFloat(amount.text) >= 0.00001) +// && (parseFloat(fees.text) >= 1.0) onClicked: { + console.log("fees.text = " + parseFloat(fees.text)) + console.log("amount.text = " + parseFloat(amount.text)) + console.log("recvAddress.text.length = " + recvAddress.text.length) verifySignTX.txSignRequest = bsApp.createTXSignRequest( sendWalletsComboBox.currentIndex, recvAddress.text, parseFloat(amount.text), parseFloat(fees.text), diff --git a/GUI/QtQuick/qml/StyledControls/CustomProgressBar.qml b/GUI/QtQuick/qml/StyledControls/CustomProgressBar.qml index 08387d148..18101abe7 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomProgressBar.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomProgressBar.qml @@ -14,26 +14,27 @@ import "../BsStyles" ProgressBar { id: control - value: 0.5 - topPadding: 1 - bottomPadding: 1 + padding: 0 background: Rectangle { - implicitWidth: 200 - implicitHeight: 6 - color: BSStyle.progressBarBgColor - radius: 3 + implicitWidth: 532 + implicitHeight: 8 + color: "transparent" + radius: 32 + + border.width: 1 + border.color: "#3C435A" } contentItem: Item { - implicitWidth: 200 - implicitHeight: 4 + implicitWidth: 532 + implicitHeight: 8 Rectangle { width: control.visualPosition * parent.width height: parent.height - radius: 2 - color: BSStyle.progressBarColor + radius: 32 + color: "#45A6FF" } } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 98547bf47..492f7862f 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -108,5 +108,6 @@ qml/Send/qmldir qml/Send/SendPopup.qml qml/Send/SimpleDetails.qml + qml/Send/SignTransaction.qml From 4d935614186f7f8799b2eb315507f1497de4d102 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Tue, 24 Jan 2023 19:35:03 +0200 Subject: [PATCH 067/436] qml: dont show old send page --- GUI/QtQuick/qml/main.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 34a26c9ae..6b20d6a88 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -140,7 +140,7 @@ ApplicationWindow { onClicked: { bsApp.requestFeeSuggestions() topMenuBtnClicked(btnSend) - stack.push(sendPage) + //stack.push(sendPage) send_popup.show() send_popup.raise() send_popup.requestActivate() From bcc72ac1dc18ce1d00c34f30bb6a1453b170f6b6 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Tue, 24 Jan 2023 20:00:11 +0200 Subject: [PATCH 068/436] qml: deselect send/receive after closing --- GUI/QtQuick/qml/main.qml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 6b20d6a88..0206f4cba 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -45,11 +45,17 @@ ApplicationWindow { ReceivePopup { id: receive_popup visible: false + onClosing: { + btnReceive.select(false) + } } SendPopup { id: send_popup visible: false + onClosing: { + btnSend.select(false) + } } color: BSStyle.backgroundColor From 978ee628d29e70b9067471645b0037858d1d02cb Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 25 Jan 2023 18:49:24 +0300 Subject: [PATCH 069/436] address validation --- BlockSettleHW/trezor/trezorClient.cpp | 6 +++--- Core/SettingsAdapter.cpp | 14 +++++++++++++- GUI/QtQuick/QtQuickAdapter.cpp | 13 +++++++++++++ GUI/QtQuick/QtQuickAdapter.h | 1 + GUI/QtQuick/qml/SendPage.qml | 6 +++--- common | 2 +- 6 files changed, 34 insertions(+), 8 deletions(-) diff --git a/BlockSettleHW/trezor/trezorClient.cpp b/BlockSettleHW/trezor/trezorClient.cpp index d9ae5286d..bc21378d2 100644 --- a/BlockSettleHW/trezor/trezorClient.cpp +++ b/BlockSettleHW/trezor/trezorClient.cpp @@ -200,8 +200,7 @@ void TrezorClient::acquireDevice(const trezor::DeviceData& devData, bool init) namespace { - //static const std::string kBlockSettleOrigin{ "Origin: https://blocksettle.trezor.io" }; - static const std::string kBlockSettleOrigin{ "Origin: https://localhost" }; + static const std::string kBlockSettleOrigin{ "Origin: https://blocksettle.trezor.io" }; } static size_t writeToString(void* ptr, size_t size, size_t count, std::string* stream) @@ -219,8 +218,9 @@ TrezorPostHandler::TrezorPostHandler(const std::shared_ptr& logg curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, writeToString); curlHeaders_ = curl_slist_append(curlHeaders_, kBlockSettleOrigin.c_str()); - curlHeaders_ = curl_slist_append(curlHeaders_, "content-type: application/x-www-form-urlencoded;"); + //curlHeaders_ = curl_slist_append(curlHeaders_, "content-type: application/x-www-form-urlencoded;"); curl_easy_setopt(curl_, CURLOPT_HTTPHEADER, curlHeaders_); + curl_easy_setopt(curl_, CURLOPT_POST, 1); } bs::hww::TrezorPostHandler::~TrezorPostHandler() diff --git a/Core/SettingsAdapter.cpp b/Core/SettingsAdapter.cpp index b5c23eb80..2cf17799c 100644 --- a/Core/SettingsAdapter.cpp +++ b/Core/SettingsAdapter.cpp @@ -592,6 +592,18 @@ ProcessingResult SettingsAdapter::processUpdArmoryServer(const bs::message::Enve return processGetArmoryServers(env); } +#include +static std::string convertPathname(const QString& pathname) +{ +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + const QByteArray baFilename = QTextCodec::codecForLocale()->fromUnicode(pathname); +#else + auto fromUtf16 = QStringEncoder(QStringEncoder::System); + const QByteArray baFilename = fromUtf16(mFileName); +#endif + return baFilename.toStdString(); +} + ProcessingResult SettingsAdapter::processSignerSettings(const bs::message::Envelope &env) { SettingsMessage msg; @@ -613,7 +625,7 @@ ProcessingResult SettingsAdapter::processSignerSettings(const bs::message::Envel keyVal->set_key(signer.serverId()); keyVal->set_value(signer.key.toStdString()); } - msgResp->set_home_dir(appSettings_->GetHomeDir().toUtf8().toStdString()); + msgResp->set_home_dir(convertPathname(appSettings_->GetHomeDir())); msgResp->set_auto_sign_spend_limit(appSettings_->get(ApplicationSettings::autoSignSpendLimit)); pushResponse(user_, env, msg.SerializeAsString()); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 1a193c9da..539bbd671 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1146,6 +1146,19 @@ void QtQuickAdapter::copyAddressToClipboard(const QString& addr) } } +bool QtQuickAdapter::validateAddress(const QString& addr) +{ + const auto& addrStr = addr.toStdString(); + try { + bs::Address::fromAddressString(addrStr); + } + catch (const std::exception& e) { + logger_->warn("[{}] invalid address {}: {}", __func__, addrStr, e.what()); + return false; + } + return true; +} + void QtQuickAdapter::requestFeeSuggestions() { ArmoryMessage msg; diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index e5c68ad72..508ab6c7e 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -164,6 +164,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void importHWWallet(int deviceIndex); Q_INVOKABLE void generateNewAddress(int walletIndex, bool isNative); Q_INVOKABLE void copyAddressToClipboard(const QString& addr); + Q_INVOKABLE bool validateAddress(const QString& addr); Q_INVOKABLE void requestFeeSuggestions(); Q_INVOKABLE QTXSignRequest* createTXSignRequest(int walletIndex, const QString& recvAddr diff --git a/GUI/QtQuick/qml/SendPage.qml b/GUI/QtQuick/qml/SendPage.qml index 42e15a0f1..7392f95f0 100644 --- a/GUI/QtQuick/qml/SendPage.qml +++ b/GUI/QtQuick/qml/SendPage.qml @@ -185,8 +185,8 @@ Item { width: 900 text: qsTr("Continue") font.pointSize: 14 -// enabled: recvAddress.text.length && (parseFloat(amount.text) >= 0.00001) -// && (parseFloat(fees.text) >= 1.0) + enabled: recvAddress.text.length && (parseFloat(amount.text) >= 0.00001) + /*&& (parseFloat(fees.text) >= 1.0)*/ onClicked: { console.log("fees.text = " + parseFloat(fees.text)) @@ -194,7 +194,7 @@ Item { console.log("recvAddress.text.length = " + recvAddress.text.length) verifySignTX.txSignRequest = bsApp.createTXSignRequest( sendWalletsComboBox.currentIndex, recvAddress.text, - parseFloat(amount.text), parseFloat(fees.text), + parseFloat(amount.text), /*parseFloat(fees.text)*/1.0, txComment.text) stack.push(verifySignTX) } diff --git a/common b/common index 56f989057..c10ef9eeb 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 56f9890570f7622b3d237f90f5ae0dcb235699a8 +Subproject commit c10ef9eeb7891f991e052425885ee0a439eef7de From 7884ee081e6a86c3e124435d578a6f8c6fbfcd00 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 25 Jan 2023 20:18:56 +0200 Subject: [PATCH 070/436] send dialog issues 1-2 --- GUI/QtQuick/QtQuickAdapter.cpp | 5 +++++ GUI/QtQuick/QtQuickAdapter.h | 1 + GUI/QtQuick/qml/Send/SendPopup.qml | 4 ++++ GUI/QtQuick/qml/Send/SignTransaction.qml | 1 + GUI/QtQuick/qml/Send/SimpleDetails.qml | 7 ++++++- GUI/QtQuick/qml/main.qml | 1 + GUI/QtQuick/qtquick.qrc | 1 + 7 files changed, 19 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 1a193c9da..1447aa313 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1146,6 +1146,11 @@ void QtQuickAdapter::copyAddressToClipboard(const QString& addr) } } +QString QtQuickAdapter::pasteTextFromClipboard() +{ + return QGuiApplication::clipboard()->text(); +} + void QtQuickAdapter::requestFeeSuggestions() { ArmoryMessage msg; diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index e5c68ad72..910498947 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -164,6 +164,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void importHWWallet(int deviceIndex); Q_INVOKABLE void generateNewAddress(int walletIndex, bool isNative); Q_INVOKABLE void copyAddressToClipboard(const QString& addr); + Q_INVOKABLE QString pasteTextFromClipboard(); Q_INVOKABLE void requestFeeSuggestions(); Q_INVOKABLE QTXSignRequest* createTXSignRequest(int walletIndex, const QString& recvAddr diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index de543ca3e..ddb7af3c1 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -41,4 +41,8 @@ CustomPopup { _stack_view.pop(null) } } + + function init() { + simple_details.init() + } } diff --git a/GUI/QtQuick/qml/Send/SignTransaction.qml b/GUI/QtQuick/qml/Send/SignTransaction.qml index 2537087bb..25a1097dd 100644 --- a/GUI/QtQuick/qml/Send/SignTransaction.qml +++ b/GUI/QtQuick/qml/Send/SignTransaction.qml @@ -414,6 +414,7 @@ ColumnLayout { { password.input_text = "" time_progress = 120 + broadcast_but.forceActiveFocus() } } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 3fff2129f..8a84df8e2 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -101,7 +101,7 @@ ColumnLayout { MouseArea { anchors.fill: parent onClicked: { - console.log("paste clicked") + rec_addr_input.input_text = bsApp.pasteTextFromClipboard() } } } @@ -267,5 +267,10 @@ ColumnLayout { Keys.onReturnPressed: { continue_but.click_enter() } + + function init() + { + rec_addr_input.setActiveFocus() + } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 0206f4cba..562c2be3e 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -147,6 +147,7 @@ ApplicationWindow { bsApp.requestFeeSuggestions() topMenuBtnClicked(btnSend) //stack.push(sendPage) + send_popup.init() send_popup.show() send_popup.raise() send_popup.requestActivate() diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 492f7862f..477907fb8 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -109,5 +109,6 @@ qml/Send/SendPopup.qml qml/Send/SimpleDetails.qml qml/Send/SignTransaction.qml + images/paste_icon.png From 1dcaf8559ed24f5cea78e2fe0cfad82f0f713075 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 25 Jan 2023 23:35:02 +0200 Subject: [PATCH 071/436] qml: fix send popup issues --- GUI/QtQuick/FeeSuggModel.cpp | 9 +++++++- GUI/QtQuick/FeeSuggModel.h | 5 +++++ GUI/QtQuick/WalletBalancesModel.cpp | 7 +++++- GUI/QtQuick/WalletBalancesModel.h | 5 +++++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 30 ++++++++++++++++++++++++++ 5 files changed, 54 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/FeeSuggModel.cpp b/GUI/QtQuick/FeeSuggModel.cpp index a8eaff301..c66c602dc 100644 --- a/GUI/QtQuick/FeeSuggModel.cpp +++ b/GUI/QtQuick/FeeSuggModel.cpp @@ -12,6 +12,8 @@ #include "Address.h" #include "BTCNumericTypes.h" +#include + namespace { static const QHash kRoles{ {FeeSuggestionModel::TextRole, "text"}, @@ -23,7 +25,10 @@ namespace { FeeSuggestionModel::FeeSuggestionModel(const std::shared_ptr& logger, QObject* parent) : QAbstractTableModel(parent), logger_(logger) -{} +{ + //connect(this, &FeeSuggestionModel::rowsInserted, this, &FeeSuggestionModel::rowCountChanged); + //connect(this, &FeeSuggestionModel::rowsRemoved, this, &FeeSuggestionModel::rowCountChanged); +} int FeeSuggestionModel::rowCount(const QModelIndex &) const { @@ -94,6 +99,7 @@ void FeeSuggestionModel::addRows(const std::map& feeLevels) beginInsertRows(QModelIndex(), rowCount(), rowCount() + newRows.size() - 1); data_.insert(data_.cend(), newRows.begin(), newRows.end()); endInsertRows(); + emit rowCountChanged(); } void FeeSuggestionModel::clear() @@ -101,4 +107,5 @@ void FeeSuggestionModel::clear() beginResetModel(); data_.clear(); endResetModel(); + emit rowCountChanged(); } diff --git a/GUI/QtQuick/FeeSuggModel.h b/GUI/QtQuick/FeeSuggModel.h index 0c574997b..868a58199 100644 --- a/GUI/QtQuick/FeeSuggModel.h +++ b/GUI/QtQuick/FeeSuggModel.h @@ -24,6 +24,8 @@ namespace spdlog { class FeeSuggestionModel : public QAbstractTableModel { Q_OBJECT + + Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) public: enum TableRoles { TextRole = Qt::DisplayRole, BlocksRole = Qt::UserRole, TimeRole, ValueRole }; FeeSuggestionModel(const std::shared_ptr&, QObject* parent = nullptr); @@ -45,6 +47,9 @@ class FeeSuggestionModel : public QAbstractTableModel private: std::shared_ptr logger_; std::vector data_; + +signals: + void rowCountChanged(); }; #endif // FEE_SUGG_MODEL_H diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index eed168641..ce051c3cf 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -27,7 +27,8 @@ namespace { WalletBalancesModel::WalletBalancesModel(const std::shared_ptr& logger, QObject* parent) : QAbstractTableModel(parent), logger_(logger) -{} +{ +} int WalletBalancesModel::rowCount(const QModelIndex &) const { @@ -93,6 +94,8 @@ void WalletBalancesModel::addWallet(const const Wallet& wallet) beginInsertRows(QModelIndex(), rowCount(), rowCount()); wallets_.push_back(wallet); endInsertRows(); + + emit rowCountChanged(); } QStringList WalletBalancesModel::wallets() const @@ -110,6 +113,8 @@ void WalletBalancesModel::clear() wallets_.clear(); balances_.clear(); endResetModel(); + + emit rowCountChanged(); } void WalletBalancesModel::setWalletBalance(const std::string& walletId, const Balance& bal) diff --git a/GUI/QtQuick/WalletBalancesModel.h b/GUI/QtQuick/WalletBalancesModel.h index b68309079..b4d3ca742 100644 --- a/GUI/QtQuick/WalletBalancesModel.h +++ b/GUI/QtQuick/WalletBalancesModel.h @@ -37,6 +37,8 @@ namespace WalletBalance { class WalletBalancesModel : public QAbstractTableModel { Q_OBJECT + + Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) public: WalletBalancesModel(const std::shared_ptr&, QObject* parent = nullptr); @@ -70,6 +72,9 @@ class WalletBalancesModel : public QAbstractTableModel std::shared_ptr logger_; std::vector wallets_; std::unordered_map balances_; //key: walletId + +signals: + void rowCountChanged(); }; #endif // WALLET_BALANCES_MODEL_H diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 8a84df8e2..7b443e8b4 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -105,6 +105,13 @@ ColumnLayout { } } } + + onTextChanged : { + if (rec_addr_input.input_text.length) + { + rec_addr_input.isValid = bsApp.validateAddress(rec_addr_input.input_text) + } + } } CustomTextInput { @@ -189,6 +196,15 @@ ColumnLayout { valueRole: "name" } + Connections + { + target:walletBalances + function onRowCountChanged () + { + from_wallet_combo.currentIndex = 0 + } + } + Label { Layout.fillWidth: true Layout.preferredHeight: 70 @@ -213,6 +229,17 @@ ColumnLayout { textRole: "text" valueRole: "value" } + + Connections + { + target:feeSuggestions + function onRowCountChanged () + { + //fee_suggest_combo.model = feeSuggestions + fee_suggest_combo.currentIndex = 0 + } + } + } CustomTextEdit { @@ -239,6 +266,9 @@ ColumnLayout { CustomButton { id: continue_but + enabled: rec_addr_input.isValid && rec_addr_input.input_text.length + && parseFloat(amount_input.input_text) !== 0 + width: 552 Layout.bottomMargin: 40 From 86c41a38de860329f4ea68ebf2b136ff3876d828 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 25 Jan 2023 23:41:07 +0200 Subject: [PATCH 072/436] remove comments --- GUI/QtQuick/FeeSuggModel.cpp | 5 +---- GUI/QtQuick/WalletBalancesModel.cpp | 3 +-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/GUI/QtQuick/FeeSuggModel.cpp b/GUI/QtQuick/FeeSuggModel.cpp index c66c602dc..0349b9586 100644 --- a/GUI/QtQuick/FeeSuggModel.cpp +++ b/GUI/QtQuick/FeeSuggModel.cpp @@ -25,10 +25,7 @@ namespace { FeeSuggestionModel::FeeSuggestionModel(const std::shared_ptr& logger, QObject* parent) : QAbstractTableModel(parent), logger_(logger) -{ - //connect(this, &FeeSuggestionModel::rowsInserted, this, &FeeSuggestionModel::rowCountChanged); - //connect(this, &FeeSuggestionModel::rowsRemoved, this, &FeeSuggestionModel::rowCountChanged); -} +{} int FeeSuggestionModel::rowCount(const QModelIndex &) const { diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index ce051c3cf..3ee26b8b9 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -27,8 +27,7 @@ namespace { WalletBalancesModel::WalletBalancesModel(const std::shared_ptr& logger, QObject* parent) : QAbstractTableModel(parent), logger_(logger) -{ -} +{} int WalletBalancesModel::rowCount(const QModelIndex &) const { From 4f49dcfcae2100778d40715126aa192c89410726 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 25 Jan 2023 23:42:09 +0200 Subject: [PATCH 073/436] remove comments --- GUI/QtQuick/qml/Send/SimpleDetails.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 7b443e8b4..fe6db449b 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -235,7 +235,6 @@ ColumnLayout { target:feeSuggestions function onRowCountChanged () { - //fee_suggest_combo.model = feeSuggestions fee_suggest_combo.currentIndex = 0 } } From d28e6a5de4ee8cf13f83e0d37bd32b3ab5e8009d Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 26 Jan 2023 18:15:44 +0300 Subject: [PATCH 074/436] updated ubuntu build instructions --- README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index cb926dab4..a2d3acf07 100644 --- a/README.md +++ b/README.md @@ -43,9 +43,9 @@ This section is for those who are interested in running Terminal application for The BlockSettle terminal is available for download for Microsoft Windows 7 and Above, which meets the following minimum system requirements. To get started visit our [Download](http://blocksettle.com/downloads/terminal) Page, and download the windows or macOS binary file that matches your operating system. ### Operating System Requirements. -- Linux - [Ubuntu](https://www.ubuntu.com/) (16.04 LTS/18.04 LTS/18.10/19.04) +- Linux - [Ubuntu](https://www.ubuntu.com/) (20.04 LTS/22.04 LTS) - [macOS](https://www.apple.com/macos/) (10.12 or higher) -- [Windows](https://www.microsoft.com/en-us/windows) (Windows 7 or higher) +- [Windows](https://www.microsoft.com/en-us/windows) (Windows 10 or higher) ### Hardware Requirements. * Dual Core CPU @@ -112,15 +112,14 @@ For access to trade our FX and XBT products please upgrade your account to Tradi 4. Check your home directory for spaces, which aren't allowed. For example, `C:\Satoshi Nakamoto` won't work. (`C:\Satoshi` would be okay.) If your home directory has a space in it, add the `DEV_3RD_ROOT` environment variable to Windows, as seen in the ["Terminal prerequisites"](#terminal-prerequisites) section. - 5. Click the Start button and select the `x64 Native Tools Command Prompt for VS 2017` program. You may have to type the name until the option appears. It is *critical* that you type `x64` and *not* `x86`. + 5. Click the Start button and select the `x64 Native Tools Command Prompt for VS 2022` program. You may have to type the name until the option appears. It is *critical* that you type `x64` and *not* `x86`. ## Ubuntu - 1. Open Software Updates -> Ubuntu Software. Set the "Source Code" checkbox (required for `qt5-default`). - - 2. Execute the following commands. + Execute the following commands: - sudo apt install python-pip cmake libmysqlclient-dev autoconf libtool yasm nasm g++ - sudo apt build-dep qt5-default + sudo apt install python-pip cmake libmysqlclient-dev autoconf libtool yasm nasm libgmp3-dev libdouble-conversion-dev + sudo apt install qttools5-dev-tools libfreetype-dev libfontconfig-dev libcups2-dev xcb + sudo apt install libx11-xcb-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-sync-dev libxcb-render-util0-dev libxcb-xfixes0-dev libxcb-xinerama0-dev libxcb-randr0-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-icccm4-dev libxcb-glx0-dev libxkbcommon-x11-dev ### MacOS 1. Get an Apple developer account (free), log in, and download the latest version of `Command Line Tools for Xcode`. As an alternative, install the latest version of [Xcode](https://itunes.apple.com/us/app/xcode/id497799835) and download `Command Line Tools` via Xcode. Either choice will be updated via the App Store. From 10b2d778461db0084a1cb3f6059ed7deda6c0891 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 26 Jan 2023 18:17:21 +0300 Subject: [PATCH 075/436] Fix Ubunut 22.04 build --- CMakeLists.txt | 7 ++++--- GUI/QtQuick/WalletBalancesModel.cpp | 2 +- UnitTests/CMakeLists.txt | 1 + generate.py | 8 ++++++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 51df6d293..a33630c8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -345,13 +345,14 @@ SET(MPIR_LIB_DIR ${MPIR_PACKAGE_ROOT}/lib) IF (WIN32) SET(MPIR_LIB_NAME mpir) ELSE(WIN32) +# SET(MPIR_LIB_DIR ${MPIR_PACKAGE_ROOT}/lib) IF(BSTERMINAL_SHARED_LIBS) SET(MPIR_LIB_NAME libgmp.so) ELSE() SET(MPIR_LIB_NAME libgmp.a) ENDIF() ENDIF(WIN32) -FIND_LIBRARY( MPIR_LIB NAMES ${MPIR_LIB_NAME} PATHS ${MPIR_LIB_DIR} NO_DEFAULT_PATH ) +FIND_LIBRARY(MPIR_LIB NAMES ${MPIR_LIB_NAME} PATHS ${MPIR_LIB_DIR}) IF( NOT MPIR_LIB) MESSAGE( FATAL_ERROR "Could not find MPIR lib in ${MPIR_LIB_DIR}") ENDIF() @@ -718,8 +719,8 @@ ELSE(WIN32) libQt5ThemeSupport.a libQt5EventDispatcherSupport.a libQt5FontDatabaseSupport.a - libQt5LinuxAccessibilitySupport.a - libQt5AccessibilitySupport.a +# libQt5LinuxAccessibilitySupport.a +# libQt5AccessibilitySupport.a libQt5EdidSupport.a ) LIST(APPEND QT_LINUX_LIBS diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index 3ee26b8b9..96c2e3c4e 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -81,7 +81,7 @@ QHash WalletBalancesModel::roleNames() const return kWalletBalanceRoles; } -void WalletBalancesModel::addWallet(const const Wallet& wallet) +void WalletBalancesModel::addWallet(const Wallet& wallet) { for (int i = 0; i < wallets_.size(); ++i) { const auto& w = wallets_.at(i); diff --git a/UnitTests/CMakeLists.txt b/UnitTests/CMakeLists.txt index c7adb7c63..c13094af2 100644 --- a/UnitTests/CMakeLists.txt +++ b/UnitTests/CMakeLists.txt @@ -43,6 +43,7 @@ LIST (APPEND SOURCES ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/txio.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/ZeroConf.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/gtest/NodeUnitTest.cpp + ${TERMINAL_GUI_ROOT}/common/WalletsLib/WalletBackupFile.cpp ) INCLUDE_DIRECTORIES( ${BLOCKSETTLE_UI_INCLUDE_DIR} ) diff --git a/generate.py b/generate.py index 9d70991a9..a16686f9f 100644 --- a/generate.py +++ b/generate.py @@ -41,6 +41,7 @@ from build_scripts.trezor_common_settings import TrezorCommonSettings from build_scripts.zeromq_settings import ZeroMQSettings from build_scripts.curl_settings import CurlSettings +from build_scripts.websockets_settings import WebsocketsSettings def generate_project(build_mode, link_mode, build_production, hide_warnings, cmake_flags, build_tests, build_tracker): project_settings = Settings(build_mode, link_mode) @@ -63,7 +64,6 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma SpdlogSettings(project_settings), ZeroMQSettings(project_settings), LibQREncode(project_settings), - MPIRSettings(project_settings), LibBTC(project_settings), # static LibChaCha20Poly1305Settings(project_settings), # static BotanSettings(project_settings), @@ -72,9 +72,13 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma LibusbSettings(project_settings), TrezorCommonSettings(project_settings), BipProtocolsSettings(project_settings), - NLohmanJson(project_settings) + NLohmanJson(project_settings), + WebsocketsSettings(project_settings) ] + if project_settings._is_windows: + required_3rdparty.append(MPIRSettings(project_settings)) + if build_tests: required_3rdparty.append(GtestSettings(project_settings)) From 051432b16e7bc5e48a9bbc1edbfe59b2309ee614 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 26 Jan 2023 17:30:16 +0200 Subject: [PATCH 076/436] qml: fix send issues 6,9,10,14 --- GUI/QtQuick/qml/Send/SendPopup.qml | 2 +- GUI/QtQuick/qml/Send/SignTransaction.qml | 5 +- GUI/QtQuick/qml/Send/SimpleDetails.qml | 58 ++++++++++++++----- .../qml/StyledControls/CustomTextInput.qml | 4 ++ 4 files changed, 52 insertions(+), 17 deletions(-) diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index ddb7af3c1..289ab5a39 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -21,9 +21,9 @@ CustomPopup { visible: false onSig_continue: (signature) => { - sign_trans.init() sign_trans.txSignRequest = signature _stack_view.push(sign_trans) + sign_trans.init() } } diff --git a/GUI/QtQuick/qml/Send/SignTransaction.qml b/GUI/QtQuick/qml/Send/SignTransaction.qml index 25a1097dd..310d1bbd2 100644 --- a/GUI/QtQuick/qml/Send/SignTransaction.qml +++ b/GUI/QtQuick/qml/Send/SignTransaction.qml @@ -395,6 +395,8 @@ ColumnLayout { } Timer { + id: timer + interval: 1000 running: true repeat: true @@ -414,7 +416,8 @@ ColumnLayout { { password.input_text = "" time_progress = 120 - broadcast_but.forceActiveFocus() + password.setActiveFocus() + timer.running = true } } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index fe6db449b..d4f7d4cbb 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -127,9 +127,13 @@ ColumnLayout { title_text: qsTr("Amount") input_text: "0" - input_validator: DoubleValidator{bottom: 0; top: from_wallet_combo.currentIndex ? getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole) : 0; - decimals: 20; - notation :DoubleValidator.StandardNotation; locale: "en_US";} + input_validator: DoubleValidator{ + bottom: 0 + top: (from_wallet_combo.currentIndex >= 0) ? + getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole) : 0 + notation :DoubleValidator.StandardNotation + locale: "en_US" + } CustomButton { @@ -167,6 +171,7 @@ ColumnLayout { font.weight: Font.Normal color: "#7A88B0" } + } RowLayout { @@ -194,14 +199,26 @@ ColumnLayout { textRole: "name" valueRole: "name" - } - Connections - { - target:walletBalances - function onRowCountChanged () + Connections { - from_wallet_combo.currentIndex = 0 + target:walletBalances + function onRowCountChanged () + { + from_wallet_combo.currentIndex = overviewWalletIndex + } + } + + onActivated: { + //I dont understand why but acceptableInput dont work... + var amount_max = getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole) + var cur_value = parseFloat(amount_input.input_text) + var bottom = amount_input.input_validator.bottom + var top = amount_input.input_validator.top + if(cur_value < bottom || cur_value > top) + { + amount_input.input_text = amount_max + } } } @@ -228,14 +245,14 @@ ColumnLayout { textRole: "text" valueRole: "value" - } - Connections - { - target:feeSuggestions - function onRowCountChanged () + Connections { - fee_suggest_combo.currentIndex = 0 + target:feeSuggestions + function onRowCountChanged () + { + fee_suggest_combo.currentIndex = 0 + } } } @@ -300,6 +317,17 @@ ColumnLayout { function init() { rec_addr_input.setActiveFocus() + + //we need set first time currentIndex to 0 + //only after we will have signal rowchanged + if (fee_suggest_combo.currentIndex >= 0) + fee_suggest_combo.currentIndex = 0 + if (from_wallet_combo.currentIndex >= 0) + from_wallet_combo.currentIndex = overviewWalletIndex + + amount_input.input_text = "0" + comment_input.input_text = "" + rec_addr_input.input_text = "" } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index cb01fc0ee..2d1dbd6c4 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -84,6 +84,10 @@ Rectangle { onTextChanged : { rect.textChanged() + if(!acceptableInput) + { + input.text = input.text.substring(0, input.text.length - 1) + } } } From d7773c82f15e6f8e3dd9e6ff92d19ed03b91ab2a Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 27 Jan 2023 02:26:29 +0200 Subject: [PATCH 077/436] QML: add dictionary to seeds in import --- GUI/QtQuick/qml/CreateWallet/ImportWallet.qml | 96 +++++++++++++---- GUI/QtQuick/qml/Send/SimpleDetails.qml | 2 +- .../StyledControls/CustomCompleterPopup.qml | 102 ++++++++++++++++++ .../StyledControls/CustomCompleterWidget.qml | 49 --------- .../qml/StyledControls/CustomTextInput.qml | 10 ++ GUI/QtQuick/qtquick.qrc | 2 +- 6 files changed, 189 insertions(+), 72 deletions(-) create mode 100644 GUI/QtQuick/qml/StyledControls/CustomCompleterPopup.qml delete mode 100644 GUI/QtQuick/qml/StyledControls/CustomCompleterWidget.qml diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml index 0dec4110d..57abe5cfb 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml @@ -145,47 +145,101 @@ ColumnLayout { delegate: CustomSeedTextInput { id: _delega - property var _component + property bool isAccepted: false width: 170 title_text: modelData onTextChanged : { grid.isComplete = true + for (var i = 0; i < grid.count; i++) { - if(grid.itemAtIndex(i).input_text === "") + if(grid.itemAtIndex(i).input_text === "" || !grid.itemAtIndex(i).isAccepted) { grid.isComplete = false break } } - - if(_delega.input_text.length && _delega.completer === null) + if(input_text.length <= 1) + { + comp_popup.close() + _delega.isAccepted = false + } + else { - _component = Qt.createComponent("CustomCompleterWidget.qml"); - if (_component.status === Component.Ready) - finishCreation(); + if (!comp_popup.visible) + { + comp_popup.x = _delega.x + comp_popup.y = _delega.y + _delega.height + comp_popup.width = _delega.width + + comp_popup.open() + } + + var _comp_vars = bsApp.completeBIP39dic(input_text) + + _delega.isValid = true + comp_popup.not_valid_word = false + + if (_comp_vars.length === 1) + { + if (!_delega.isAccepted) + { + completer_accepted() + } + } else - _component.statusChanged.connect(finishCreation); + { + _delega.isAccepted = false + if (_comp_vars.length === 0) + { + _delega.isValid = false + comp_popup.not_valid_word = true + _comp_vars = ["Not a valid word"] + } + + comp_popup.comp_vars = _comp_vars + } } } - function finishCreation() { - if (_component.status === Component.Ready) { - _delega.completer = completer.createObject(mainWindow, {x: _delega.x, y: _delega.y}); - _delega.completer.completer_vars = bsApp.completeBIP39dic(_delega.input_text) - if (_delega.completer === null) { - // Error Handling - console.debug("Error creating completer"); - } - else { - console.debug("Success creating completer"); + onActiveFocusChanged: { + if(!_delega.activeFocus) + comp_popup.close() + } + + Keys.onDownPressed: comp_popup.current_increment() + + Keys.onUpPressed: comp_popup.current_decrement() + + function completer_accepted() + { + + if (comp_popup.visible) + { + if (_delega.isValid) + { + input_text = comp_popup.comp_vars[comp_popup.current_index] + _delega.isAccepted = true } - } else if (_component.status === Component.Error) { - // Error Handling - console.debug("Error loading component:", component.errorString()); + comp_popup.close() + if(index < grid.count - 1) + grid.itemAtIndex(index+1).setActiveFocus() + else + nextItemInFocusChain().forceActiveFocus() } } + + Keys.onEnterPressed: completer_accepted() + + Keys.onReturnPressed: completer_accepted() + + } + + CustomCompleterPopup { + id: comp_popup + + visible: false } } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index d4f7d4cbb..f4fe47f44 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -130,7 +130,7 @@ ColumnLayout { input_validator: DoubleValidator{ bottom: 0 top: (from_wallet_combo.currentIndex >= 0) ? - getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole) : 0 + parseFloat(getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole)) : 0 notation :DoubleValidator.StandardNotation locale: "en_US" } diff --git a/GUI/QtQuick/qml/StyledControls/CustomCompleterPopup.qml b/GUI/QtQuick/qml/StyledControls/CustomCompleterPopup.qml new file mode 100644 index 000000000..5bbff35c7 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomCompleterPopup.qml @@ -0,0 +1,102 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" + + +Popup { + + id: _popup + + property var comp_vars + property bool not_valid_word: false + property alias current_index: comp_list.currentIndex + + padding: 6 + focus: false + + contentItem: ListView { + id: comp_list + + clip: true + implicitHeight: contentHeight + model: comp_vars + + delegate: ItemDelegate { + + id: delega + + width: _popup.width - 12 + height: 27 + + leftPadding: 6 + topPadding: 4 + bottomPadding: 4 + + contentItem: Text { + + text: comp_vars[index] + color: delega.highlighted ? BSStyle.comboBoxItemTextHighlightedColor : + BSStyle.comboBoxItemTextColor + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Normal + + elide: Text.ElideNone + verticalAlignment: Text.AlignVCenter + } + + highlighted: comp_list.currentIndex === index && !_popup.not_valid_word + + background: Rectangle { + color: delega.highlighted ? BSStyle.comboBoxItemHighlightedColor : "transparent" + opacity: delega.highlighted ? 0.2 : 1 + radius: 14 + } + + MouseArea { + anchors.fill: parent + onClicked: { + comp_list.currentIndex = index + } + } + } + } + + background: Rectangle { + color: "#FFFFFF" + radius: 14 + } + + function current_increment () + { + if (_popup.visible) + { + comp_list.currentIndex = comp_list.currentIndex + 1 + if (comp_list.currentIndex >= comp_list.count) + comp_list.currentIndex = 0 + } + } + + function current_decrement () + { + if (_popup.visible) + { + comp_list.currentIndex = comp_list.currentIndex - 1 + if (comp_list.currentIndex < 0) + comp_list.currentIndex = comp_list.count - 1 + } + } +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomCompleterWidget.qml b/GUI/QtQuick/qml/StyledControls/CustomCompleterWidget.qml deleted file mode 100644 index 9f0677050..000000000 --- a/GUI/QtQuick/qml/StyledControls/CustomCompleterWidget.qml +++ /dev/null @@ -1,49 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2.9 -import QtQuick.Controls 2.3 - -import "../BsStyles" - - -Rectangle { - id: rect - - property var completer_vars: [] - - radius: 14 - height: list.height + 30 - width: 170 - color : "#FFFFFF" - - ListView { - id: list - - anchors.centerIn: parent - spacing: 8 - - keyNavigationEnabled: true - - model: completer_vars - - delegate: Label { - id: _delegate - - width: 142 - text: completer_vars[index] - - color: "#020817" - font.pixelSize: 16 - font.family: "Roboto" - font.weight: Font.Normal - } - } -} diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index 2d1dbd6c4..9a37a15ef 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -37,6 +37,8 @@ Rectangle { property var completer: null signal textChanged() + signal editingFinished() + signal activeFocusChanged() color: "#020817" @@ -90,6 +92,14 @@ Rectangle { } } + onEditingFinished : { + rect.editingFinished() + } + + onActiveFocusChanged: { + rect.activeFocusChanged() + } + } Image { diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 477907fb8..8cd480a99 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -96,7 +96,6 @@ qml/CreateWallet/WalletSeed.qml qml/CreateWallet/WalletSeedSkipAccept.qml qml/CreateWallet/WalletSeedVerify.qml - qml/StyledControls/CustomCompleterWidget.qml images/advanced_icon.png qml/StyledControls/CustomContextMenu.qml qml/StyledControls/CustomDialogWindow.qml @@ -110,5 +109,6 @@ qml/Send/SimpleDetails.qml qml/Send/SignTransaction.qml images/paste_icon.png + qml/StyledControls/CustomCompleterPopup.qml From 92dcc05fff8cc77e68e1d60aaee25cbd5ceddc27 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 27 Jan 2023 16:50:38 +0200 Subject: [PATCH 078/436] fix bugs --- GUI/QtQuick/qml/CreateWallet/ImportWallet.qml | 12 ++++++++++-- .../qml/StyledControls/CustomCompleterPopup.qml | 10 +++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml index 57abe5cfb..06d267533 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml @@ -172,6 +172,7 @@ ColumnLayout { comp_popup.x = _delega.x comp_popup.y = _delega.y + _delega.height comp_popup.width = _delega.width + comp_popup.index = index comp_popup.open() } @@ -183,6 +184,7 @@ ColumnLayout { if (_comp_vars.length === 1) { + comp_popup.comp_vars = _comp_vars if (!_delega.isAccepted) { completer_accepted() @@ -196,6 +198,7 @@ ColumnLayout { _delega.isValid = false comp_popup.not_valid_word = true _comp_vars = ["Not a valid word"] + console.log("comp_popup.not_valid_word === true") } comp_popup.comp_vars = _comp_vars @@ -205,7 +208,7 @@ ColumnLayout { onActiveFocusChanged: { if(!_delega.activeFocus) - comp_popup.close() + completer_accepted() } Keys.onDownPressed: comp_popup.current_increment() @@ -215,7 +218,7 @@ ColumnLayout { function completer_accepted() { - if (comp_popup.visible) + if (comp_popup.visible && comp_popup.index === index) { if (_delega.isValid) { @@ -223,6 +226,7 @@ ColumnLayout { _delega.isAccepted = true } comp_popup.close() + comp_popup.comp_vars = [] if(index < grid.count - 1) grid.itemAtIndex(index+1).setActiveFocus() else @@ -240,6 +244,10 @@ ColumnLayout { id: comp_popup visible: false + + onCompChoosed: { + grid.itemAtIndex(comp_popup.index).completer_accepted() + } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomCompleterPopup.qml b/GUI/QtQuick/qml/StyledControls/CustomCompleterPopup.qml index 5bbff35c7..1fd440e4a 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomCompleterPopup.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomCompleterPopup.qml @@ -22,10 +22,12 @@ Popup { property var comp_vars property bool not_valid_word: false + property int index property alias current_index: comp_list.currentIndex + signal compChoosed () + padding: 6 - focus: false contentItem: ListView { id: comp_list @@ -68,8 +70,14 @@ Popup { MouseArea { anchors.fill: parent + hoverEnabled: true + onPositionChanged: { + if (containsMouse) + comp_list.currentIndex = index + } onClicked: { comp_list.currentIndex = index + compChoosed() } } } From c2e1830df40aa3a8db45e3c1c720b5a1196bd39c Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 28 Jan 2023 21:44:51 +0200 Subject: [PATCH 079/436] qml: simplified send: fix 9, 15-18 --- GUI/QtQuick/qml/Send/SignTransaction.qml | 2 +- GUI/QtQuick/qml/Send/SimpleDetails.qml | 59 +++++++++++++++---- .../qml/StyledControls/CustomTextInput.qml | 6 +- 3 files changed, 51 insertions(+), 16 deletions(-) diff --git a/GUI/QtQuick/qml/Send/SignTransaction.qml b/GUI/QtQuick/qml/Send/SignTransaction.qml index 310d1bbd2..c70bdffab 100644 --- a/GUI/QtQuick/qml/Send/SignTransaction.qml +++ b/GUI/QtQuick/qml/Send/SignTransaction.qml @@ -377,7 +377,7 @@ ColumnLayout { enabled: password.input_text.length Component.onCompleted: { - broadcast_but.preferred = false + broadcast_but.preferred = true } function click_enter() { bsApp.signAndBroadcast(txSignRequest, password.input_text) diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index f4fe47f44..ffb8f0d4d 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -102,6 +102,7 @@ ColumnLayout { anchors.fill: parent onClicked: { rec_addr_input.input_text = bsApp.pasteTextFromClipboard() + amount_input.setActiveFocus() } } } @@ -125,14 +126,52 @@ ColumnLayout { //aliases title_text: qsTr("Amount") - input_text: "0" - - input_validator: DoubleValidator{ - bottom: 0 - top: (from_wallet_combo.currentIndex >= 0) ? - parseFloat(getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole)) : 0 - notation :DoubleValidator.StandardNotation - locale: "en_US" + +// input_validator: DoubleValidator{ +// bottom: 0 +// top: (from_wallet_combo.currentIndex >= 0) ? +// parseFloat(getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole)) : 0 +// notation :DoubleValidator.StandardNotation +// } + + //visual studio crashes when there is input_validator + //and we change text inside of onTextChanged + //it is why I have realized my validator inside of onTextChanged + property string prev_text : "" + onTextChanged : { + + amount_input.input_text = amount_input.input_text.replace(",", ".") + + if (amount_input.input_text.startsWith("0") + && !amount_input.input_text.startsWith("0.") + && amount_input.input_text.length > 1) + { + amount_input.input_text = "0." + + amount_input.input_text.substring(1, amount_input.input_text.length) + } + try { + var input_number = Number.fromLocaleString(Qt.locale("en_US"), amount_input.input_text) + } + catch (error) + { + amount_input.input_text = prev_text + return + } + console.log("start amount test") + console.log("amout text - " + amount_input.input_text) + console.log("amout number - " + input_number) + console.log("prev_textr - " + prev_text) + + var max_value = (from_wallet_combo.currentIndex >= 0) ? + parseFloat(getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole)) : 0 + console.log("max_value - " + max_value) + if (input_number < 0 || input_number>max_value) + { + amount_input.input_text = prev_text + return + } + + prev_text = amount_input.input_text } CustomButton { @@ -283,7 +322,7 @@ ColumnLayout { id: continue_but enabled: rec_addr_input.isValid && rec_addr_input.input_text.length - && parseFloat(amount_input.input_text) !== 0 + && parseFloat(amount_input.input_text) !== 0 && amount_input.input_text.length width: 552 @@ -325,7 +364,7 @@ ColumnLayout { if (from_wallet_combo.currentIndex >= 0) from_wallet_combo.currentIndex = overviewWalletIndex - amount_input.input_text = "0" + amount_input.input_text = "" comment_input.input_text = "" rec_addr_input.input_text = "" } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index 9a37a15ef..b04196db1 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -84,12 +84,8 @@ Rectangle { color: "#E2E7FF" - onTextChanged : { + onTextEdited : { rect.textChanged() - if(!acceptableInput) - { - input.text = input.text.substring(0, input.text.length - 1) - } } onEditingFinished : { From ad6b2a07aac8b4e7be3b8baa8f59f759183c1eeb Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 28 Jan 2023 22:00:29 +0200 Subject: [PATCH 080/436] refactoring: change TextChanged to TextEdited --- GUI/QtQuick/qml/CreateWallet/ImportWallet.qml | 2 +- GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml | 2 +- GUI/QtQuick/qml/Send/SimpleDetails.qml | 14 +++++--------- GUI/QtQuick/qml/StyledControls/CustomTextInput.qml | 4 ++-- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml index 06d267533..ae609a272 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml @@ -149,7 +149,7 @@ ColumnLayout { width: 170 title_text: modelData - onTextChanged : { + onTextEdited : { grid.isComplete = true for (var i = 0; i < grid.count; i++) diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml index ba47489f2..7746c6495 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml @@ -45,7 +45,7 @@ ColumnLayout { width: 530 title_text: layout.indexes[index] isValid: list.isValid - onTextChanged : { + onTextEdited : { list.isComplete = true for (var i = 0; i < list.count; i++) { diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index ffb8f0d4d..33373b4e4 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -107,7 +107,7 @@ ColumnLayout { } } - onTextChanged : { + onTextEdited : { if (rec_addr_input.input_text.length) { rec_addr_input.isValid = bsApp.validateAddress(rec_addr_input.input_text) @@ -135,10 +135,10 @@ ColumnLayout { // } //visual studio crashes when there is input_validator - //and we change text inside of onTextChanged - //it is why I have realized my validator inside of onTextChanged + //and we change text inside of onTextEdited + //it is why I have realized my validator inside of onTextEdited property string prev_text : "" - onTextChanged : { + onTextEdited : { amount_input.input_text = amount_input.input_text.replace(",", ".") @@ -157,14 +157,10 @@ ColumnLayout { amount_input.input_text = prev_text return } - console.log("start amount test") - console.log("amout text - " + amount_input.input_text) - console.log("amout number - " + input_number) - console.log("prev_textr - " + prev_text) var max_value = (from_wallet_combo.currentIndex >= 0) ? parseFloat(getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole)) : 0 - console.log("max_value - " + max_value) + if (input_number < 0 || input_number>max_value) { amount_input.input_text = prev_text diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index b04196db1..67cffe594 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -36,7 +36,7 @@ Rectangle { property var completer: null - signal textChanged() + signal textEdited() signal editingFinished() signal activeFocusChanged() @@ -85,7 +85,7 @@ Rectangle { color: "#E2E7FF" onTextEdited : { - rect.textChanged() + rect.textEdited() } onEditingFinished : { From 50623df036cc9096a30088f69e0c3657c5429654 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sun, 29 Jan 2023 16:19:43 +0200 Subject: [PATCH 081/436] qml: seed completer: improvements --- GUI/QtQuick/qml/CreateWallet/ImportWallet.qml | 149 ++++++++++++++---- 1 file changed, 121 insertions(+), 28 deletions(-) diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml index ae609a272..de5959820 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml @@ -27,7 +27,7 @@ ColumnLayout { "17", "18", "19", "20", "21", "22", "23", "24"] - height: radbut_12.checked ? 515 : 739 + height: radbut_12.checked ? 555 : 779 width: 580 spacing: 0 @@ -139,7 +139,8 @@ ColumnLayout { cellHeight : 56 cellWidth : 180 - property bool isComplete: false + property bool isValid: true + property bool hasEmptyWords: true model: radbut_12.checked ? layout.grid_model_12 : layout.grid_model_24 delegate: CustomSeedTextInput { @@ -150,16 +151,26 @@ ColumnLayout { width: 170 title_text: modelData onTextEdited : { - grid.isComplete = true + show_fill_in_completer() + } - for (var i = 0; i < grid.count; i++) - { - if(grid.itemAtIndex(i).input_text === "" || !grid.itemAtIndex(i).isAccepted) - { - grid.isComplete = false - break - } - } + onActiveFocusChanged: { + if(_delega.activeFocus) + show_fill_in_completer() + } + + onEditingFinished: { + completer_accepted() + check_input() + grid.validate() + } + + Keys.onDownPressed: comp_popup.current_increment() + + Keys.onUpPressed: comp_popup.current_decrement() + + function show_fill_in_completer() + { if(input_text.length <= 1) { comp_popup.close() @@ -188,6 +199,7 @@ ColumnLayout { if (!_delega.isAccepted) { completer_accepted() + change_focus() } } else @@ -198,46 +210,66 @@ ColumnLayout { _delega.isValid = false comp_popup.not_valid_word = true _comp_vars = ["Not a valid word"] - console.log("comp_popup.not_valid_word === true") } comp_popup.comp_vars = _comp_vars } } - } - onActiveFocusChanged: { - if(!_delega.activeFocus) - completer_accepted() + grid.validate() + grid.check_empty_words() } - Keys.onDownPressed: comp_popup.current_increment() - - Keys.onUpPressed: comp_popup.current_decrement() - function completer_accepted() { - if (comp_popup.visible && comp_popup.index === index) { if (_delega.isValid) { input_text = comp_popup.comp_vars[comp_popup.current_index] _delega.isAccepted = true + _delega.isValid = true + + grid.validate() } comp_popup.close() comp_popup.comp_vars = [] - if(index < grid.count - 1) - grid.itemAtIndex(index+1).setActiveFocus() - else - nextItemInFocusChain().forceActiveFocus() + comp_popup.not_valid_word = false } } - Keys.onEnterPressed: completer_accepted() + function change_focus() + { + if(index < grid.count - 1) + grid.itemAtIndex(index+1).setActiveFocus() + else + import_but.forceActiveFocus() + } + + function check_input() + { + _delega.isValid = false + + var _comp_vars = bsApp.completeBIP39dic(input_text) + for(var i=0; i<_comp_vars.length; i++) + { + if (input_text === _comp_vars[i]) + { + _delega.isValid = true + break + } + } + + return _delega.isValid + } - Keys.onReturnPressed: completer_accepted() + Keys.onEnterPressed: { + change_focus() + } + Keys.onReturnPressed: { + change_focus() + } } CustomCompleterPopup { @@ -249,6 +281,53 @@ ColumnLayout { grid.itemAtIndex(comp_popup.index).completer_accepted() } } + + function validate() + { + grid.isValid = true + for (var i = 0; i < grid.count; i++) + { + if(!grid.itemAtIndex(i).isValid) + { + grid.isValid = false + break + } + } + } + + function check_empty_words() + { + grid.hasEmptyWords = false + for (var i = 0; i < grid.count; i++) + { + var text = grid.itemAtIndex(i).input_text + if(!text.length) + { + grid.hasEmptyWords = true + } + } + } + } + + + Label { + id: error_description + + visible: !grid.isValid + + text: "Not a valid words" + + Layout.bottomMargin: 24 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + Layout.preferredHeight : 16 + + height: 16 + width: 136 + + color: "#EB6060" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal } CustomButton { @@ -256,8 +335,9 @@ ColumnLayout { text: qsTr("Import") Layout.leftMargin: 25 Layout.bottomMargin: 40 + width: 530 - enabled: grid.isComplete + enabled: !grid.hasEmptyWords Component.onCompleted: { import_but.preferred = true @@ -265,6 +345,15 @@ ColumnLayout { function click_enter() { if (!import_but.enabled) return + for (var i = 0; i < grid.count; i++) + { + grid.itemAtIndex(i).check_input() + } + + if (!grid.isValid) + return + + //Success!!! for (var i=0; i Date: Sun, 29 Jan 2023 22:08:55 +0200 Subject: [PATCH 082/436] qml: add PIN entries widget --- .../qml/CreateWallet/ConfirmPassword.qml | 3 - GUI/QtQuick/qml/Pin/PinEntriesPopup.qml | 186 ++++++++++++++++++ GUI/QtQuick/qml/Pin/qmldir | 3 + .../qml/StyledControls/CustomPopup.qml | 3 +- .../qml/StyledControls/CustomTextInput.qml | 3 - GUI/QtQuick/qml/main.qml | 18 ++ GUI/QtQuick/qtquick.qrc | 2 + 7 files changed, 210 insertions(+), 8 deletions(-) create mode 100644 GUI/QtQuick/qml/Pin/PinEntriesPopup.qml create mode 100644 GUI/QtQuick/qml/Pin/qmldir diff --git a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml index 8fff7a315..0f88eb0bc 100644 --- a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml @@ -74,10 +74,7 @@ ColumnLayout { CustomButton { id: confirm_but text: qsTr("Confirm") - //Layout.leftMargin: 25 - //Layout.bottomMargin: 40 - //Layout.leftMargin: 24 Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter diff --git a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml new file mode 100644 index 000000000..675fa3cfa --- /dev/null +++ b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml @@ -0,0 +1,186 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +Window { + id: root + + visible: true + flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog + modality: Qt.WindowModality + + maximumHeight: rect.height + maximumWidth: rect.width + + minimumHeight: rect.height + minimumWidth: rect.width + + height: rect.height + width: rect.width + + color: "transparent" + + x: mainWindow.x + (mainWindow.width - width)/2 + y: mainWindow.y + 28 + + property var placeholders: ["?", "?", "?", "?", "?", + "?", "?", "?", "?"] + + Rectangle { + id: rect + + color: "#191E2A" + opacity: 1 + radius: 16 + height: 580 + width: 430 + border.color : "#3C435A" + border.width : 1 + + CustomTitleLabel { + id: title + + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + anchors.topMargin: 36 + + text: qsTr("PIN") + } + + Item { + id: grid_item + + width: 390 + height: 330 + + anchors.left: parent.left + anchors.leftMargin: 25 + anchors.top: title.bottom + anchors.topMargin: 24 + + GridView { + id: grid + + property bool isComplete: false + property bool isValid: false + + anchors.fill: parent + + cellHeight : 110 + cellWidth : 130 + + model: placeholders + + delegate: TextField { + id: input + + focus: true + activeFocusOnTab: true + + placeholderText: qsTr("?") + horizontalAlignment: TextInput.AlignHCenter + + height: 100 + width: 120 + + color: "#E2E7FF" + font.pixelSize: 20 + font.family: "Roboto" + font.weight: Font.Normal + + validator: IntValidator { + bottom: 0 + top: 9 + } + + background: Rectangle { + implicitWidth: 100 + implicitHeight: 100 + + color: "#020817" + opacity: 1 + radius: 14 + + border.color: grid.isValid ? (input.activeFocus ? "#45A6FF" : "#3C435A") : "#EB6060" + border.width: 1 + } + + onTextEdited: { + grid.isComplete = true + for (var i = 0; i < grid.count; i++) + { + if (!grid.itemAtIndex(i).text.length) + { + grid.isComplete = false + break + } + } + } + } + + } + } + + + Label { + id: error_description + + visible: !grid.isValid + + text: qsTr("PIN is wrong") + + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: grid_item.bottom + anchors.topMargin: 24 + + height: 16 + + color: "#EB6060" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + CustomButton { + id: accept_but + text: qsTr("Accept") + + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + anchors.bottomMargin: 40 + + width: 380 + + enabled: grid.isComplete + + Component.onCompleted: { + accept_but.preferred = true + } + + function click_enter() { + if (!accept_but.enabled) return + + //TODO: check that password correct + //and fill in grid.isValid + + root.close() + } + } + + + } + + function init() { + grid.isComplete = false + grid.isValid = true + + for (var i = 0; i < grid.count; i++) + { + grid.itemAtIndex(i).text = "" + } + } +} diff --git a/GUI/QtQuick/qml/Pin/qmldir b/GUI/QtQuick/qml/Pin/qmldir new file mode 100644 index 000000000..78a71adf3 --- /dev/null +++ b/GUI/QtQuick/qml/Pin/qmldir @@ -0,0 +1,3 @@ +module SendControls + +PinEntriesPopup 1.0 PinEntriesPopup.qml diff --git a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml index e9dc5de89..031688ba1 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml @@ -7,14 +7,13 @@ import QtQuick.Layouts 1.15 Window { id: root - property var phrase - property int navig_bar_width: 36 property alias _stack_view: stack_create_wallet property alias _arrow_but_visibility: back_arrow_button.visible visible: true flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog + modality: Qt.WindowModal maximumHeight: rect.height maximumWidth: rect.width diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index 9a37a15ef..7437371c2 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -27,9 +27,6 @@ Rectangle { property alias input_topMargin: input.anchors.topMargin property alias input_validator: input.validator - - property alias input_item: input - property bool isValid: true property bool isPassword: false property bool isHiddenText: false diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 562c2be3e..2eac9f16f 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -18,6 +18,7 @@ import "BsStyles" 1 import "Receive" 1 import "Send" 1 import "CreateWallet" 1 +import "Pin" 1 ApplicationWindow { id: mainWindow @@ -58,6 +59,23 @@ ApplicationWindow { } } + PinEntriesPopup { + id: pin_popup + visible: false + } + + Connections + { + target:bsApp + function onInvokePINentry () + { + pin_popup.init() + pin_popup.show() + pin_popup.raise() + pin_popup.requestActivate() + } + } + color: BSStyle.backgroundColor overlay.modal: Rectangle { diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 8cd480a99..7ce03d5a5 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -110,5 +110,7 @@ qml/Send/SignTransaction.qml images/paste_icon.png qml/StyledControls/CustomCompleterPopup.qml + qml/Pin/PinEntriesPopup.qml + qml/Pin/qmldir From 1085f5875a7398ea896b0f754f10940b143078b7 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 30 Jan 2023 12:26:23 +0200 Subject: [PATCH 083/436] start work --- GUI/QtQuick/QtQuick.zip | Bin 0 -> 3912 bytes GUI/QtQuick/qml/Send/AdvancedDetails.qml | 185 ++++++++++++++++++ GUI/QtQuick/qml/Send/SendPopup.qml | 20 +- GUI/QtQuick/qml/Send/SimpleDetails.qml | 10 +- GUI/QtQuick/qml/Send/qmldir | 1 + .../qml/StyledControls/CustomButton.qml | 4 +- GUI/QtQuick/qtquick.qrc | 1 + 7 files changed, 216 insertions(+), 5 deletions(-) create mode 100644 GUI/QtQuick/QtQuick.zip create mode 100644 GUI/QtQuick/qml/Send/AdvancedDetails.qml diff --git a/GUI/QtQuick/QtQuick.zip b/GUI/QtQuick/QtQuick.zip new file mode 100644 index 0000000000000000000000000000000000000000..68976b59c7aa82332899fe6a5b5f575497a9ceec GIT binary patch literal 3912 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 literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml new file mode 100644 index 000000000..08eb9bb67 --- /dev/null +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -0,0 +1,185 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +//import wallet.balance 1.0 + +ColumnLayout { + + id: layout + + signal sig_continue(signature: var) + signal sig_simple() + + height: 748 + width: 1132 + spacing: 0 + + RowLayout { + + Layout.fillWidth: true + Layout.preferredHeight : 34 + + Button { + id: simple_but + + Layout.leftMargin: 24 + Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter + + activeFocusOnTab: true + + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Normal + palette.buttonText: "#7A88B0" + + text: qsTr("Simple") + + icon.color: "transparent" + icon.source: "qrc:/images/advanced_icon.png" + icon.width: 16 + icon.height: 16 + + background: Rectangle { + implicitWidth: 100 + implicitHeight: 34 + color: "transparent" + + radius: 14 + + border.color: "#3C435A" + border.width: 1 + + } + + onClicked: { + layout.sig_simple() + } + } + + CustomTitleLabel { + id: title + + Layout.leftMargin: 378 + Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter + + text: qsTr("Send Bitcoin") + } + + Label { + Layout.fillWidth: true + Layout.preferredHeight : 34 + } + + } + + RowLayout { + + id: rects_row + + Layout.fillWidth: true + Layout.preferredHeight : 580 + Layout.topMargin: 20 + + spacing: 12 + + Rectangle { + id: inputs_rect + + Layout.leftMargin: 24 + Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter + + width: 536 + height: 580 + color: "transparent" + + radius: 16 + + border.color: "#3C435A" + border.width: 1 + + ColumnLayout { + id: inputs_layout + + anchors.fill: parent + + spacing: 0 + + Label { + id: inputs_title + + Layout.leftMargin: 16 + Layout.topMargin: 16 + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + text: qsTr("Inputs") + + height : 19 + color: "#E2E7FF" + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Medium + } + + Label { + Layout.fillWidth: true + Layout.fillHeight : true + } + } + } + + Rectangle { + id: outputs_rect + + Layout.rightMargin: 24 + Layout.alignment: Qt.AlignRight | Qt.AlingVCenter + + width: 536 + height: 580 + color: "transparent" + + radius: 16 + + border.color: "#3C435A" + border.width: 1 + } + } + + + Label { + Layout.fillWidth: true + Layout.fillHeight : true + } + + + CustomButton { + id: broadcast_but + + enabled: false + + width: 1084 + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + text: qsTr("Broadcast") + + Component.onCompleted: { + broadcast_but.preferred = true + } + + function click_enter() { + + } + + } + + + function init() + { + } +} diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 289ab5a39..7c15114db 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -14,7 +14,7 @@ CustomPopup { navig_bar_width: 30 _stack_view.initialItem: simple_details - _arrow_but_visibility: !simple_details.visible + _arrow_but_visibility: !simple_details.visible && !advanced_details.visible SimpleDetails { id: simple_details @@ -25,6 +25,11 @@ CustomPopup { _stack_view.push(sign_trans) sign_trans.init() } + + onSig_advanced: { + _stack_view.replace(advanced_details) + advanced_details.init() + } } SignTransaction { @@ -42,6 +47,19 @@ CustomPopup { } } + AdvancedDetails { + id: advanced_details + visible: false + + onSig_continue: (signature) => { + } + + onSig_simple: { + _stack_view.replace(simple_details) + simple_details.init() + } + } + function init() { simple_details.init() } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index f4fe47f44..e110317f9 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -6,13 +6,14 @@ import QtQuick.Layouts 1.15 import "../BsStyles" import "../StyledControls" -import wallet.balance 1.0 +//import wallet.balance 1.0 ColumnLayout { id: layout signal sig_continue(signature: var) + signal sig_advanced() height: 554 width: 600 @@ -29,7 +30,6 @@ ColumnLayout { Layout.leftMargin: 24 Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter - enabled: false activeFocusOnTab: true font.pixelSize: 13 @@ -37,6 +37,8 @@ ColumnLayout { font.weight: Font.Normal palette.buttonText: "#7A88B0" + text: qsTr("Advanced") + icon.color: "transparent" icon.source: "qrc:/images/advanced_icon.png" @@ -54,6 +56,10 @@ ColumnLayout { border.width: 1 } + + onClicked: { + layout.sig_advanced() + } } CustomTitleLabel { diff --git a/GUI/QtQuick/qml/Send/qmldir b/GUI/QtQuick/qml/Send/qmldir index 48ee06b69..7d3a31c01 100644 --- a/GUI/QtQuick/qml/Send/qmldir +++ b/GUI/QtQuick/qml/Send/qmldir @@ -3,3 +3,4 @@ module SendControls SendPopup 1.0 SendPopup.qml SimpleDetails 1.0 SimpleDetails.qml SignTransaction 1.0 SignTransaction.qml +AdvancedDetails 1.0 AdvancedDetails.qml diff --git a/GUI/QtQuick/qml/StyledControls/CustomButton.qml b/GUI/QtQuick/qml/StyledControls/CustomButton.qml index 0d9ee9c9e..7e38b5a72 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButton.qml @@ -64,8 +64,8 @@ Button { click_enter() } - onClicked: { + onClicked: { click_enter() - } + } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 8cd480a99..7736333e5 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -110,5 +110,6 @@ qml/Send/SignTransaction.qml images/paste_icon.png qml/StyledControls/CustomCompleterPopup.qml + qml/Send/AdvancedDetails.qml From b1033af6c48cc2629887c0055f03685b1fec6408 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 30 Jan 2023 12:38:10 +0200 Subject: [PATCH 084/436] pr fixes --- GUI/QtQuick/qml/CreateWallet/ImportWallet.qml | 3 ++- GUI/QtQuick/qml/Send/SimpleDetails.qml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml index de5959820..3d000d129 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml @@ -304,6 +304,7 @@ ColumnLayout { if(!text.length) { grid.hasEmptyWords = true + break } } } @@ -315,7 +316,7 @@ ColumnLayout { visible: !grid.isValid - text: "Not a valid words" + text: "Words are not valid" Layout.bottomMargin: 24 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 33373b4e4..1112fb940 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -134,7 +134,7 @@ ColumnLayout { // notation :DoubleValidator.StandardNotation // } - //visual studio crashes when there is input_validator + //app (if was launched from visual studio) crashes when there is input_validator //and we change text inside of onTextEdited //it is why I have realized my validator inside of onTextEdited property string prev_text : "" From 34cfe6763fcb36b306e97a961491f12eae280eb7 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 30 Jan 2023 14:06:56 +0300 Subject: [PATCH 085/436] fix shared build on Ubuntu --- CMakeLists.txt | 9 +-------- common | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a33630c8a..30a93f8a0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -399,14 +399,7 @@ ENDIF(BUILD_TESTS) SET( CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${THIRD_PARTY_COMMON_DIR}/Protobuf ) FIND_PACKAGE( Protobuf REQUIRED ) INCLUDE_DIRECTORIES( ${PROTOBUF_INCLUDE_DIRS} ) - -IF ( UNIX ) - GET_FILENAME_COMPONENT(ProtoLibDir ${Protobuf_LIBRARY} DIRECTORY) - FIND_LIBRARY( PROTO_LIB NAMES "libprotobuf.a" PATHS ${ProtoLibDir} NO_DEFAULT_PATH ) -ELSE ( UNIX ) - SET( PROTO_LIB ${PROTOBUF_LIBRARIES} ) -ENDIF ( UNIX ) - +SET( PROTO_LIB ${PROTOBUF_LIBRARIES} ) SET( PROTO_ROOT_DIR ${TERMINAL_GUI_ROOT} ) SET( PATH_TO_GENERATED ${TERMINAL_GUI_ROOT}/generated_proto ) FILE( MAKE_DIRECTORY ${PATH_TO_GENERATED} ) diff --git a/common b/common index c10ef9eeb..ab024e439 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit c10ef9eeb7891f991e052425885ee0a439eef7de +Subproject commit ab024e43947421209c7a6c9d5289eeb3ef3a6d86 From 278bc9427288cbcc608e2080c135c10133e8c4e2 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 30 Jan 2023 13:13:29 +0200 Subject: [PATCH 086/436] pr fixes --- GUI/QtQuick/qml/CreateWallet/ImportWallet.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml index 3d000d129..963e654e8 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml @@ -316,7 +316,7 @@ ColumnLayout { visible: !grid.isValid - text: "Words are not valid" + text: qsTr("Words are not valid") Layout.bottomMargin: 24 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter From 351de38c6f306b7a5e2ce6d4cb2cb5e16a598c2e Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 30 Jan 2023 19:32:59 +0200 Subject: [PATCH 087/436] fix bugs --- GUI/QtQuick/qtquick.qrc | 1 + 1 file changed, 1 insertion(+) diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index e5305266e..7d2d1d786 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -114,3 +114,4 @@ qml/Pin/PinEntriesPopup.qml qml/Pin/qmldir + From e2bc5db869e427f769000484fdee798302ef9269 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 30 Jan 2023 20:33:18 +0300 Subject: [PATCH 088/436] PIN/password entry flow --- BlockSettleHW/CMakeLists.txt | 2 + BlockSettleHW/hwdeviceinterface.h | 5 +- BlockSettleHW/hwdevicemanager.cpp | 85 ++++++++++++++--- BlockSettleHW/hwdevicemanager.h | 7 ++ BlockSettleHW/jade/jadeClient.cpp | 53 +++++++++++ BlockSettleHW/jade/jadeClient.h | 55 +++++++++++ BlockSettleHW/jade/jadeDevice.cpp | 120 ++++++++++++++++++++++++ BlockSettleHW/jade/jadeDevice.h | 92 ++++++++++++++++++ BlockSettleHW/ledger/ledgerClient.cpp | 18 ++-- BlockSettleHW/ledger/ledgerDevice.h | 2 - BlockSettleHW/trezor/trezorClient.cpp | 41 +++++--- BlockSettleHW/trezor/trezorClient.h | 1 + BlockSettleHW/trezor/trezorDevice.cpp | 21 ++++- BlockSettleHW/trezor/trezorDevice.h | 3 +- BlockSettleHW/trezor/trezorStructure.h | 6 +- GUI/QtQuick/QtQuickAdapter.cpp | 39 ++++++-- GUI/QtQuick/QtQuickAdapter.h | 4 + GUI/QtQuick/qml/Pin/PinEntriesPopup.qml | 5 +- common | 2 +- 19 files changed, 496 insertions(+), 65 deletions(-) create mode 100644 BlockSettleHW/jade/jadeClient.cpp create mode 100644 BlockSettleHW/jade/jadeClient.h create mode 100644 BlockSettleHW/jade/jadeDevice.cpp create mode 100644 BlockSettleHW/jade/jadeDevice.h diff --git a/BlockSettleHW/CMakeLists.txt b/BlockSettleHW/CMakeLists.txt index 65ff3f5b6..3a754455a 100644 --- a/BlockSettleHW/CMakeLists.txt +++ b/BlockSettleHW/CMakeLists.txt @@ -23,6 +23,7 @@ FILE(GLOB SOURCES trezor/*.cpp ledger/*.cpp ledger/hidapi/*.c + jade/*.cpp ) FILE(GLOB HEADERS @@ -30,6 +31,7 @@ FILE(GLOB HEADERS trezor/*.h ledger/*.h ledger/hidapi/*.h + jade/*.h ) INCLUDE_DIRECTORIES( ${WALLET_LIB_INCLUDE_DIR} ) diff --git a/BlockSettleHW/hwdeviceinterface.h b/BlockSettleHW/hwdeviceinterface.h index b884ae78c..ca879ff02 100644 --- a/BlockSettleHW/hwdeviceinterface.h +++ b/BlockSettleHW/hwdeviceinterface.h @@ -28,7 +28,8 @@ namespace bs { enum class DeviceType { Unknown, HWLedger, - HWTrezor + HWTrezor, + HWJade }; struct DeviceKey @@ -77,8 +78,6 @@ namespace bs { virtual void requestForRescan() = 0; // Management - virtual void requestPinMatrix() = 0; - virtual void requestHWPass(bool allowedOnDevice) = 0; virtual void cancelledOnDevice() = 0; virtual void invalidPin() = 0; diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index 1f306e982..9fdbb79ba 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -155,6 +155,10 @@ bs::message::ProcessingResult DeviceManager::processOwnRequest(const bs::message return processImport(env, msg.import_device()); case HW::DeviceMgrMessage::kSignTx: return processSignTX(env, msg.sign_tx()); + case HW::DeviceMgrMessage::kSetPin: + return processSetPIN(msg.set_pin()); + case HW::DeviceMgrMessage::kSetPassword: + return processSetPassword(msg.set_password()); default: break; } return bs::message::ProcessingResult::Ignored; @@ -216,8 +220,7 @@ bs::message::ProcessingResult DeviceManager::processSigner(const bs::message::En bs::message::ProcessingResult DeviceManager::processImport(const bs::message::Envelope& env , const HW::DeviceKey& key) { - const DeviceKey devKey{ key.label(), key.id(), key.vendor(), key.wallet_id() - , key.status(), static_cast(key.type()) }; + const DeviceKey devKey{ fromMsg(key) }; const auto& device = getDevice(devKey); if (!device) { logger_->error("[hww::DeviceManager::processImport] no device found for id {}" @@ -298,6 +301,31 @@ bs::message::ProcessingResult DeviceManager::processSignTxResponse(const SignerM return bs::message::ProcessingResult::Success; } +bs::message::ProcessingResult DeviceManager::processSetPIN(const HW::DeviceMgrMessage_SetPIN& request) +{ + const auto& key = fromMsg(request.key()); + const auto& device = getDevice(key); + if (!device) { + logger_->error("[{}] unknown device {}", __func__, key.id); + return bs::message::ProcessingResult::Error; + } + device->setMatrixPin(SecureBinaryData::fromString(request.pin())); + return bs::message::ProcessingResult::Success; +} + +bs::message::ProcessingResult DeviceManager::processSetPassword(const HW::DeviceMgrMessage_SetPassword& request) +{ + const auto& key = fromMsg(request.key()); + const auto& device = getDevice(key); + if (!device) { + logger_->error("[{}] unknown device {}", __func__, key.id); + return bs::message::ProcessingResult::Error; + } + device->setPassword(SecureBinaryData::fromString(request.password()) + , request.set_on_device()); + return bs::message::ProcessingResult::Success; +} + bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::SeqId msgId , const HDWalletData& hdWallet) { @@ -400,31 +428,31 @@ void DeviceManager::devicesResponse() HW::DeviceMgrMessage msg; auto msgResp = msg.mutable_available_devices(); for (const auto& key : devices_) { - auto msgKey = msgResp->add_device_keys(); - msgKey->set_label(key.label); - msgKey->set_id(key.id); - msgKey->set_vendor(key.vendor); - msgKey->set_wallet_id(key.walletId); - msgKey->set_status(key.status); - msgKey->set_type((int)key.type); + deviceKeyToMsg(key, msgResp->add_device_keys()); } + logger_->debug("[{}] {}", __func__, msg.DebugString()); pushResponse(user_, envReqScan_, msg.SerializeAsString()); envReqScan_ = {}; } void DeviceManager::scanningDone(bool initDevices) { - logger_->debug("[{}] init:{}", __func__, initDevices); - const auto& ledgerKeys = ledgerClient_->deviceKeys(); + const auto ledgerKeys = ledgerClient_->deviceKeys(); devices_ = ledgerKeys; - const auto& trezorKeys = trezorClient_->deviceKeys(); + const auto trezorKeys = trezorClient_->deviceKeys(); devices_.insert(devices_.end(), trezorKeys.cbegin(), trezorKeys.cend()); + for (const auto& device : devices_) { + logger_->debug("[{}] found: {} {} {}", __func__, device.id, device.label, device.vendor); + } if (!initDevices || devices_.empty()) { + if (devices_.empty()) { + logger_->info("[{}] no devices scanned", __func__); + } if (envReqScan_.sender) { devicesResponse(); - return; } + return; } for (const auto& key : ledgerKeys) { auto device = ledgerClient_->getDevice(key.id); @@ -458,6 +486,7 @@ std::shared_ptr DeviceManager::getDevice(const DeviceKey& key) void DeviceManager::publicKeyReady(const std::string& devId, const std::string& walletId) { + logger_->debug("[{}] walletId = {} for {}", __func__, walletId, devId); size_t nbCompleted = 0; for (int i = 0; i < devices_.size(); ++i) { if (devices_[i].id == devId) { @@ -469,6 +498,7 @@ void DeviceManager::publicKeyReady(const std::string& devId, const std::string& } } if (nbCompleted >= devices_.size()) { + logger_->debug("[{}] all public keys retrieved", __func__); if (envReqScan_.sender) { devicesResponse(); } @@ -505,12 +535,22 @@ void bs::hww::DeviceManager::walletInfoReady(const DeviceKey& key pushRequest(user_, userSigner_, msg.SerializeAsString()); } -void DeviceManager::requestPinMatrix(const DeviceKey&) +void DeviceManager::requestPinMatrix(const DeviceKey& key) { + logger_->debug("[{}] {}", __func__, key.id); + HW::DeviceMgrMessage msg; + deviceKeyToMsg(key, msg.mutable_request_pin()); + pushBroadcast(user_, msg.SerializeAsString()); } -void DeviceManager::requestHWPass(const DeviceKey&, bool allowedOnDevice) +void DeviceManager::requestHWPass(const DeviceKey& key, bool allowedOnDevice) { + logger_->debug("[{}] {}", __func__, key.id); + HW::DeviceMgrMessage msg; + auto msgReq = msg.mutable_password_request(); + deviceKeyToMsg(key, msgReq->mutable_key()); + msgReq->set_allowed_on_device(allowedOnDevice); + pushBroadcast(user_, msg.SerializeAsString()); } void DeviceManager::deviceNotFound(const std::string& deviceId) @@ -581,6 +621,21 @@ using namespace bs::hd; namespace bs { namespace hww { + void deviceKeyToMsg(const DeviceKey& key, HW::DeviceKey* msgKey) + { + msgKey->set_label(key.label); + msgKey->set_id(key.id); + msgKey->set_vendor(key.vendor); + msgKey->set_wallet_id(key.walletId); + msgKey->set_status(key.status); + msgKey->set_type((int)key.type); + } + bs::hww::DeviceKey fromMsg(const BlockSettle::HW::DeviceKey& msg) + { + return { msg.label(), msg.id(), msg.vendor(), msg.wallet_id() + , msg.status(), static_cast(msg.type()) }; + } + Path getDerivationPath(bool testNet, Purpose element) { Path path; diff --git a/BlockSettleHW/hwdevicemanager.h b/BlockSettleHW/hwdevicemanager.h index afa5b4575..de5d6234c 100644 --- a/BlockSettleHW/hwdevicemanager.h +++ b/BlockSettleHW/hwdevicemanager.h @@ -30,6 +30,8 @@ namespace BlockSettle { } namespace HW { class DeviceKey; + class DeviceMgrMessage_SetPassword; + class DeviceMgrMessage_SetPIN; } } namespace Blocksettle { @@ -127,6 +129,8 @@ namespace bs { , const Blocksettle::Communication::headless::SignTxRequest&); void signTxWithDevice(const DeviceKey&); bs::message::ProcessingResult processSignTxResponse(const BlockSettle::Common::SignerMessage_SignTxResponse&); + bs::message::ProcessingResult processSetPIN(const BlockSettle::HW::DeviceMgrMessage_SetPIN&); + bs::message::ProcessingResult processSetPassword(const BlockSettle::HW::DeviceMgrMessage_SetPassword&); private: std::shared_ptr logger_; @@ -147,6 +151,9 @@ namespace bs { std::map> prepareDeviceReq_; //value: walletId }; + void deviceKeyToMsg(const DeviceKey&, BlockSettle::HW::DeviceKey*); + DeviceKey fromMsg(const BlockSettle::HW::DeviceKey&); + bs::hd::Path getDerivationPath(bool testNet, bs::hd::Purpose element); bool isNestedSegwit(const bs::hd::Path& path); bool isNativeSegwit(const bs::hd::Path& path); diff --git a/BlockSettleHW/jade/jadeClient.cpp b/BlockSettleHW/jade/jadeClient.cpp new file mode 100644 index 000000000..6daaf6d9e --- /dev/null +++ b/BlockSettleHW/jade/jadeClient.cpp @@ -0,0 +1,53 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "jadeClient.h" +#include +#include "hwdevicemanager.h" +#include "jadeDevice.h" +#include "Wallets/SyncWalletsManager.h" +#include "Wallets/SyncHDWallet.h" + +using namespace bs::hww; + +JadeClient::JadeClient(const std::shared_ptr& logger + , bool testNet, DeviceCallbacks* cb) + : bs::WorkerPool(1, 1), logger_(logger), cb_(cb), testNet_(testNet) +{} + +void JadeClient::initConnection() +{ + logger_->info("[JadeClient::initConnection]"); +} + +std::vector JadeClient::deviceKeys() const +{ + std::vector result; + return result; +} + +std::shared_ptr JadeClient::getDevice(const std::string& deviceId) +{ + return nullptr; +} + +#if 0 +std::shared_ptr JadeClient::worker(const std::shared_ptr&) +{ + const std::vector> handlers{ std::make_shared + (logger_, trezorEndPoint_) }; + return std::make_shared(handlers); +} +#endif + +void JadeClient::scanDevices() +{ + logger_->info("[JadeClient::scanDevices]"); +} diff --git a/BlockSettleHW/jade/jadeClient.h b/BlockSettleHW/jade/jadeClient.h new file mode 100644 index 000000000..d56b3c29b --- /dev/null +++ b/BlockSettleHW/jade/jadeClient.h @@ -0,0 +1,55 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef JADE_CLIENT_H +#define JADE_CLIENT_H + +#include +#include +#include "hwdeviceinterface.h" +#include "Message/Worker.h" + +namespace spdlog { + class logger; +} +struct curl_slist; + +namespace bs { + namespace hww { + class JadeDevice; + class DeviceCallbacks; + + class JadeClient : protected bs::WorkerPool + { + friend class JadeDevice; + public: + JadeClient(const std::shared_ptr& + , bool testNet, DeviceCallbacks*); + ~JadeClient() override = default; + + void initConnection(); + void scanDevices(); + + std::vector deviceKeys() const; + std::shared_ptr getDevice(const std::string& deviceId); + + protected: + //std::shared_ptr worker(const std::shared_ptr&) override final; + + private: + std::shared_ptr logger_; + DeviceCallbacks* cb_{ nullptr }; + const bool testNet_; + }; + + } //hw +} //bs + +#endif // JADE_CLIENT_H diff --git a/BlockSettleHW/jade/jadeDevice.cpp b/BlockSettleHW/jade/jadeDevice.cpp new file mode 100644 index 000000000..0609d287e --- /dev/null +++ b/BlockSettleHW/jade/jadeDevice.cpp @@ -0,0 +1,120 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include +#include +#include "hwdevicemanager.h" +#include "jadeDevice.h" +#include "jadeClient.h" +#include "CoreWallet.h" + + +using namespace bs::hww; + +JadeDevice::JadeDevice(const std::shared_ptr &logger + , bool testNet, DeviceCallbacks* cb, const std::string& endpoint) + : bs::WorkerPool(1, 1) + , logger_(logger), testNet_(testNet), cb_(cb), endpoint_(endpoint) +{} + +JadeDevice::~JadeDevice() = default; + +#if 0 +std::shared_ptr JadeDevice::worker(const std::shared_ptr&) +{ + const std::vector> handlers{ std::make_shared + (logger_, endpoint_) }; + return std::make_shared(handlers); +} +#endif + +void bs::hww::JadeDevice::operationFailed(const std::string& reason) +{ + releaseConnection(); + //cb_->operationFailed(features_->device_id(), reason); +} + +void JadeDevice::releaseConnection() +{ +} + +DeviceKey JadeDevice::key() const +{ + std::string walletId; + std::string status; + if (!xpubRoot_.empty()) { + walletId = bs::core::wallet::computeID(xpubRoot_).toBinStr(); + } + else { + status = "not inited"; + } +/* return {features_->label(), features_->device_id(), features_->vendor() + , walletId, status, type() };*/ + return {}; +} + +DeviceType JadeDevice::type() const +{ + return DeviceType::HWJade; +} + +void JadeDevice::init() +{ + logger_->debug("[JadeDevice::init] start"); +} + +void JadeDevice::getPublicKeys() +{ + awaitingWalletInfo_ = {}; + // General data + awaitingWalletInfo_.type = bs::wallet::HardwareEncKey::WalletType::Trezor; +/* awaitingWalletInfo_.label = features_->label(); + awaitingWalletInfo_.deviceId = features_->device_id(); + awaitingWalletInfo_.vendor = features_->vendor(); + awaitingWalletInfo_.xpubRoot = xpubRoot_.toBinStr();*/ + +} + +void JadeDevice::setMatrixPin(const SecureBinaryData& pin) +{ + logger_->debug("[JadeDevice::setMatrixPin]"); +} + +void JadeDevice::setPassword(const SecureBinaryData& password, bool enterOnDevice) +{ + logger_->debug("[JadeDevice::setPassword]"); +} + +void JadeDevice::cancel() +{ + logger_->debug("[JadeDevice] cancel previous operation"); +} + +void JadeDevice::clearSession() +{ + logger_->debug("[JadeDevice] cancel session"); +} + + +void JadeDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX) +{ + logger_->debug("[JadeDevice::signTX]"); +} + +void JadeDevice::retrieveXPubRoot() +{ + logger_->debug("[JadeDevice::retrieveXPubRoot]"); +} + +void JadeDevice::reset() +{ + awaitingSignedTX_.clear(); + awaitingWalletInfo_ = {}; +} diff --git a/BlockSettleHW/jade/jadeDevice.h b/BlockSettleHW/jade/jadeDevice.h new file mode 100644 index 000000000..c4efb52fa --- /dev/null +++ b/BlockSettleHW/jade/jadeDevice.h @@ -0,0 +1,92 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef JADE_DEVICE_H +#define JADE_DEVICE_H + +#include "Message/Worker.h" +#include "hwdeviceinterface.h" +#include "jadeClient.h" + +namespace spdlog { + class logger; +} +namespace bs { + namespace core { + namespace wallet { + struct TXSignRequest; + } + } +} + +namespace bs { + namespace hww { + + class JadeDevice : public DeviceInterface, protected WorkerPool + { + public: + JadeDevice(const std::shared_ptr& + , bool testNet, DeviceCallbacks*, const std::string& endpoint); + ~JadeDevice() override; + + trezor::DeviceData data() const { return data_; } + DeviceKey key() const override; + DeviceType type() const override; + + // lifecycle + void init() override; + void cancel() override; + void clearSession() override; + void releaseConnection(); + + // operation + void getPublicKeys() override; + void signTX(const bs::core::wallet::TXSignRequest& reqTX) override; + void retrieveXPubRoot() override; + + // Management + void setMatrixPin(const SecureBinaryData& pin) override; + void setPassword(const SecureBinaryData& password, bool enterOnDevice) override; + + // State + bool isBlocked() const override { + // There is no blocking state for Trezor + return false; + } + + protected: + //std::shared_ptr worker(const std::shared_ptr&) override final; + + // operation result informing + void publicKeyReady() override {} //TODO: implement + void deviceTxStatusChanged(const std::string& status) override {} //TODO: implement + void operationFailed(const std::string& reason) override; + void requestForRescan() override {} //TODO: implement + + // Management + void cancelledOnDevice() override {} //TODO: implement + void invalidPin() override {} //TODO: implement + + private: + void reset(); + + private: + std::shared_ptr logger_; + const trezor::DeviceData data_; + const bool testNet_; + DeviceCallbacks* cb_{ nullptr }; + const std::string endpoint_; + bs::core::HwWalletInfo awaitingWalletInfo_; + std::string awaitingSignedTX_; + }; + + } //hw +} //bs +#endif // JADE_DEVICE_H diff --git a/BlockSettleHW/ledger/ledgerClient.cpp b/BlockSettleHW/ledger/ledgerClient.cpp index 9fa9eef67..33012e2a9 100644 --- a/BlockSettleHW/ledger/ledgerClient.cpp +++ b/BlockSettleHW/ledger/ledgerClient.cpp @@ -52,10 +52,9 @@ std::vector LedgerClient::deviceKeys() const std::vector keys; keys.reserve(availableDevices_.size()); for (const auto device : availableDevices_) { - if (device->inited()) { - keys.push_back(device->key()); - } + keys.push_back(device->key()); } + logger_->debug("[{}] {} keys", __func__, keys.size()); return keys; } @@ -81,12 +80,15 @@ void LedgerClient::scanDevices() hid_device_info* info = hid_enumerate(0, 0); for (; info; info = info->next) { - logger_->debug("[{}] found: vendor {0:x}, product {0:x} ({}), iface: {0:x}, serial: {}", __func__ - , info->vendor_id, info->product_id, (char*)info->product_string - , info->interface_number, (char*)info->serial_number); + logger_->debug("[{}] found: vendor {}, product {} ({}), serial {}, iface {}" + , __func__, info->vendor_id, info->product_id + , QString::fromWCharArray(info->product_string).toStdString() + , QString::fromWCharArray(info->serial_number).toStdString() + , info->interface_number); if (checkLedgerDevice(info)) { - auto device = std::make_shared(fromHidOriginal(info), testNet_, logger_, cb_, hidLock_); - availableDevices_.push_back({ device }); + const auto& device = std::make_shared(fromHidOriginal(info) + , testNet_, logger_, cb_, hidLock_); + availableDevices_.push_back(device); } } hid_exit(); diff --git a/BlockSettleHW/ledger/ledgerDevice.h b/BlockSettleHW/ledger/ledgerDevice.h index a525852ca..e050653bc 100644 --- a/BlockSettleHW/ledger/ledgerDevice.h +++ b/BlockSettleHW/ledger/ledgerDevice.h @@ -69,8 +69,6 @@ namespace bs { void operationFailed(const std::string& reason) override {} //TODO: implement // Management - void requestPinMatrix() override {} //TODO: implement - void requestHWPass(bool allowedOnDevice) override {} //TODO: implement void cancelledOnDevice() override {} //TODO: implement void invalidPin() override {} //TODO: implement diff --git a/BlockSettleHW/trezor/trezorClient.cpp b/BlockSettleHW/trezor/trezorClient.cpp index bc21378d2..7848333fe 100644 --- a/BlockSettleHW/trezor/trezorClient.cpp +++ b/BlockSettleHW/trezor/trezorClient.cpp @@ -97,8 +97,13 @@ void TrezorClient::listDevices() { const auto& reply = std::static_pointer_cast(data); if (!reply || !reply->error.empty() || reply->response.empty()) { - logger_->error("[TrezorClient::listDevices] network error: {}" - , (reply && !reply->error.empty()) ? reply->error : ""); + if (!reply) { + logger_->error("[TrezorClient::listDevices] invalid reply type"); + } + else { + logger_->error("[TrezorClient::listDevices] network error: {}" + , !reply->error.empty() ? reply->error : ""); + } cb_->scanningDone(); return; } @@ -107,26 +112,34 @@ void TrezorClient::listDevices() response = nlohmann::json::parse(reply->response); } catch (const nlohmann::json::exception& e) { - logger_->error("[TrezorClient::listDevices] failed to parse '{}': {}", reply->response, e.what()); + logger_->error("[TrezorClient::listDevices] failed to parse '{}': {}" + , reply->response, e.what()); cb_->scanningDone(); return; } std::vector trezorDevices; for (const auto& device : response) { + const auto& session = device["session"].is_null() ? "null" + : device["session"].get(); + const auto& debugSession = device["debugSession"].is_null() ? "null" + : device["debugSession"].get(); trezorDevices.push_back({device["path"].get() - , device["vendor"].get(), device["product"].get() - , device["session"].get(), device["debug"].get() - , device["debugSession"].get() }); + , device["vendor"].get(), device["product"].get() + , session, device["debug"].get(), debugSession }); } logger_->info("[TrezorClient::listDevices] enumeration finished, #devices: {}" , trezorDevices.size()); - state_ = trezor::State::Enumerated; nbDevices_ = trezorDevices.size(); - for (const auto& dev : trezorDevices) { - acquireDevice(dev); + if (nbDevices_ == 0) { + cb_->scanningDone(); + } + else { + for (const auto& dev : trezorDevices) { + acquireDevice(dev); + } } }; logger_->info("[TrezorClient::listDevices]"); @@ -173,7 +186,8 @@ void TrezorClient::acquireDevice(const trezor::DeviceData& devData, bool init) } trezor::DeviceData devData; - devData.sessionId = response["session"].get(); + devData.sessionId = response["session"].is_null() ? "null" + : response["session"].get(); if (devData.sessionId.empty() || devData.sessionId == prevSessionId) { logger_->error("[TrezorClient::acquireDevice] cannot acquire device"); @@ -243,7 +257,7 @@ std::shared_ptr bs::hww::TrezorPostHandler::processData(const std curl_easy_setopt(curl_, CURLOPT_POSTFIELDS, inData->input.data()); } if (inData->timeout) { - curl_easy_setopt(curl_, CURLOPT_TIMEOUT_MS, 2000L); + curl_easy_setopt(curl_, CURLOPT_TIMEOUT_MS, 3000L); } else { curl_easy_setopt(curl_, CURLOPT_TIMEOUT, 0L); @@ -255,9 +269,10 @@ std::shared_ptr bs::hww::TrezorPostHandler::processData(const std const auto res = curl_easy_perform(curl_); if (res != CURLE_OK) { result->error = fmt::format("failed to post to {}: {}", url, res); + result->timedOut = (res == CURLE_OPERATION_TIMEDOUT); return result; } - logger_->debug("[{}] response: {}", __func__, response); - result->response = std::move(response); + result->response = response; + logger_->debug("[{}] response: {}", __func__, result->response); return result; } diff --git a/BlockSettleHW/trezor/trezorClient.h b/BlockSettleHW/trezor/trezorClient.h index 88000d984..e84c3b57b 100644 --- a/BlockSettleHW/trezor/trezorClient.h +++ b/BlockSettleHW/trezor/trezorClient.h @@ -39,6 +39,7 @@ namespace bs { ~TrezorPostOut() override = default; std::string response; std::string error; + bool timedOut{ false }; }; class TrezorPostHandler : public bs::HandlerImpl diff --git a/BlockSettleHW/trezor/trezorDevice.cpp b/BlockSettleHW/trezor/trezorDevice.cpp index 18014b1c6..113d78983 100644 --- a/BlockSettleHW/trezor/trezorDevice.cpp +++ b/BlockSettleHW/trezor/trezorDevice.cpp @@ -378,11 +378,16 @@ void TrezorDevice::retrieveXPubRoot() } void TrezorDevice::makeCall(const google::protobuf::Message &msg - , const bs::WorkerPool::callback& cb) + , const bs::WorkerPool::callback& callback) { if (state_ == trezor::State::None) { init(); } + auto cb = callback; + if ((cb == nullptr) && (awaitingCallbacks_.empty())) { + cb = awaitingCallbacks_.front(); + awaitingCallbacks_.pop_front(); + } const auto& cbWrap = [this, cb](const std::shared_ptr& data) { const auto& reply = std::static_pointer_cast(data); @@ -461,7 +466,9 @@ void TrezorDevice::handleMessage(const trezor::MessageData& data, const bs::Work { common::PinMatrixRequest request; if (parseResponse(request, data)) { - requestPinMatrix(); + if (cb_) { + cb_->requestPinMatrix(key()); + } sendTxMessage(/*HWInfoStatus::kRequestPin*/"enter pin"); } } @@ -470,7 +477,10 @@ void TrezorDevice::handleMessage(const trezor::MessageData& data, const bs::Work { common::PassphraseRequest request; if (parseResponse(request, data)) { - requestHWPass(hasCapability(management::Features_Capability_Capability_PassphraseEntry)); + if (cb_) { + cb_->requestHWPass(key(), + hasCapability(management::Features_Capability_Capability_PassphraseEntry)); + } sendTxMessage(/*HWInfoStatus::kRequestPassphrase*/"enter passphrase"); } } @@ -508,9 +518,10 @@ void TrezorDevice::handleMessage(const trezor::MessageData& data, const bs::Work break; } if (cb) { - const auto& noData = std::make_shared(); +/* const auto& noData = std::make_shared(); noData->msgType = static_cast(data.type); - cb(noData); + cb(noData);*/ + awaitingCallbacks_.push_back(cb); } } diff --git a/BlockSettleHW/trezor/trezorDevice.h b/BlockSettleHW/trezor/trezorDevice.h index ad7748cd3..bf102ff31 100644 --- a/BlockSettleHW/trezor/trezorDevice.h +++ b/BlockSettleHW/trezor/trezorDevice.h @@ -86,8 +86,6 @@ namespace bs { void requestForRescan() override {} //TODO: implement // Management - void requestPinMatrix() override {} //TODO: implement - void requestHWPass(bool allowedOnDevice) override {} //TODO: implement void cancelledOnDevice() override {} //TODO: implement void invalidPin() override {} //TODO: implement @@ -121,6 +119,7 @@ namespace bs { std::unique_ptr currentTxSignReq_; bs::core::HwWalletInfo awaitingWalletInfo_; std::string awaitingSignedTX_; + std::deque awaitingCallbacks_; bool txSignedByUser_{ false }; }; diff --git a/BlockSettleHW/trezor/trezorStructure.h b/BlockSettleHW/trezor/trezorStructure.h index f69c5d13f..72cd8bf9e 100644 --- a/BlockSettleHW/trezor/trezorStructure.h +++ b/BlockSettleHW/trezor/trezorStructure.h @@ -20,10 +20,10 @@ namespace bs { struct DeviceData { std::string path; - std::string vendor; - std::string product; + int vendor; + int product; std::string sessionId; - std::string debug; + bool debug{ false }; std::string debugSession; }; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 35c907d09..cfc37856d 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -33,6 +33,7 @@ #include "BSMessageBox.h" #include "BSTerminalSplashScreen.h" #include "FeeSuggModel.h" +#include "hwdevicemanager.h" #include "QTXSignRequest.h" #include "TxOutputsModel.h" #include "SettingsAdapter.h" @@ -310,6 +311,8 @@ bool QtQuickAdapter::processBroadcast(const bs::message::Envelope& env) return (processSigner(env) != ProcessingResult::Ignored); case TerminalUsers::Wallets: return (processWallets(env) != ProcessingResult::Ignored); + case TerminalUsers::HWWallets: + return (processHWW(env) != ProcessingResult::Ignored); default: break; } } @@ -627,6 +630,15 @@ bs::message::ProcessingResult QtQuickAdapter::processHWW(const bs::message::Enve return processHWDevices(msg.available_devices()); case HW::DeviceMgrMessage::kSignedTx: return processHWSignedTX(msg.signed_tx()); + case HW::DeviceMgrMessage::kRequestPin: + curAuthDevice_ = bs::hww::fromMsg(msg.request_pin()); + QMetaObject::invokeMethod(this, [this] { emit invokePINentry(); }); + return bs::message::ProcessingResult::Success; + case HW::DeviceMgrMessage::kPasswordRequest: + curAuthDevice_ = bs::hww::fromMsg(msg.password_request().key()); + QMetaObject::invokeMethod(this, [this, onDevice=msg.password_request().allowed_on_device()] + { emit invokePasswordEntry(onDevice); }); + return bs::message::ProcessingResult::Success; default: break; } return bs::message::ProcessingResult::Ignored; @@ -1255,6 +1267,20 @@ void QtQuickAdapter::stopHWWalletsPolling() hwDevicesPolling_ = false; } +void QtQuickAdapter::setHWpin(const QString& pin) +{ + if (curAuthDevice_.id.empty()) { + logger_->error("[{}] no device requested PIN", __func__); + return; + } + HW::DeviceMgrMessage msg; + auto msgReq = msg.mutable_set_pin(); + bs::hww::deviceKeyToMsg(curAuthDevice_, msgReq->mutable_key()); + msgReq->set_pin(pin.toStdString()); + pushRequest(user_, userHWW_, msg.SerializeAsString()); + curAuthDevice_ = {}; +} + void QtQuickAdapter::importHWWallet(int deviceIndex) { const auto& devKey = hwDeviceModel_->getDevice(deviceIndex); @@ -1262,13 +1288,7 @@ void QtQuickAdapter::importHWWallet(int deviceIndex) return; } HW::DeviceMgrMessage msg; - auto msgReq = msg.mutable_import_device(); - msgReq->set_label(devKey.label); - msgReq->set_id(devKey.id); - msgReq->set_vendor(devKey.vendor); - msgReq->set_wallet_id(devKey.walletId); - msgReq->set_status(devKey.status); - msgReq->set_type((int)devKey.type); + bs::hww::deviceKeyToMsg(devKey, msg.mutable_import_device()); pushRequest(user_, userHWW_, msg.SerializeAsString()); } @@ -1493,10 +1513,10 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq bs::message::ProcessingResult QtQuickAdapter::processHWDevices(const HW::DeviceMgrMessage_Devices& response) { + logger_->debug("[{}] {}", __func__, response.DebugString()); std::vector devices; for (const auto& key : response.device_keys()) { - devices.push_back({ key.label(), key.id(), key.vendor(), key.wallet_id() - , key.status(), static_cast(key.type())}); + devices.push_back(bs::hww::fromMsg(key)); } hwDeviceModel_->setDevices(devices); if (devices.empty() && hwDevicesPolling_) { @@ -1506,6 +1526,7 @@ bs::message::ProcessingResult QtQuickAdapter::processHWDevices(const HW::DeviceM , bs::message::bus_clock::now() + std::chrono::seconds{ 1 }); } else { + hwDevicesPolling_ = false; for (const auto& hdWallet : hdWallets_) { hwDeviceModel_->setLoaded(hdWallet.first); } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index bd660476d..359c4818c 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -161,6 +161,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop , const QString& password); Q_INVOKABLE void pollHWWallets(); Q_INVOKABLE void stopHWWalletsPolling(); + Q_INVOKABLE void setHWpin(const QString&); Q_INVOKABLE void importHWWallet(int deviceIndex); Q_INVOKABLE void generateNewAddress(int walletIndex, bool isNative); Q_INVOKABLE void copyAddressToClipboard(const QString& addr); @@ -183,6 +184,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void armoryStateChanged(); void devicesChanged(); void scanningChanged(); + void invokePINentry(); + void invokePasswordEntry(bool); private slots: void walletSelected(int); @@ -270,6 +273,7 @@ private slots: FeeSuggestionModel* feeSuggModel_{ nullptr }; bs::Address generatedAddress_; bool hwDevicesPolling_{ false }; + bs::hww::DeviceKey curAuthDevice_{}; std::map txReqs_; std::map txDetailReqs_; diff --git a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml index 675fa3cfa..6b73124be 100644 --- a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml +++ b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml @@ -163,10 +163,7 @@ Window { function click_enter() { if (!accept_but.enabled) return - - //TODO: check that password correct - //and fill in grid.isValid - + bsApp.setHWpin(input.text) root.close() } } diff --git a/common b/common index ab024e439..77ac07f46 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit ab024e43947421209c7a6c9d5289eeb3ef3a6d86 +Subproject commit 77ac07f466186d26aff8dc685fc71abaa0d2fedc From e897607dbb28816700701be73d67164b1474987e Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 30 Jan 2023 19:39:36 +0200 Subject: [PATCH 089/436] qml: pin screen: calc result --- GUI/QtQuick/qml/Pin/PinEntriesPopup.qml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml index 6b73124be..0fd4d6ef6 100644 --- a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml +++ b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml @@ -163,7 +163,12 @@ Window { function click_enter() { if (!accept_but.enabled) return - bsApp.setHWpin(input.text) + var res = "" + for (var i = 0; i < grid.count; i++) + { + res += grid.itemAtIndex(i).text + } + bsApp.setHWpin(res) root.close() } } From 410fae6cded0e476ebaefd99e06098b597483a1d Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 30 Jan 2023 20:50:50 +0300 Subject: [PATCH 090/436] PIN entry --- GUI/QtQuick/QtQuickAdapter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index cfc37856d..d70c06230 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1605,6 +1605,7 @@ void QtQuickAdapter::signAndBroadcast(QTXSignRequest* txReq, const QString& pass catch (const std::exception&) {} } if (needHWSign) { + pollHWWallets(); unsigned nbNonHW = 0; for (const auto& walletId : txSignReq.walletIds) { try { From 8820a79df3a255f3f71abdd6851aa3ffc840e34c Mon Sep 17 00:00:00 2001 From: dvajdual Date: Tue, 31 Jan 2023 01:29:07 +0200 Subject: [PATCH 091/436] qml: PinPopup fix bugs --- GUI/QtQuick/qml/Pin/PinEntriesPopup.qml | 151 +++++++++++++++--------- GUI/QtQuick/qtquick.qrc | 1 + 2 files changed, 93 insertions(+), 59 deletions(-) diff --git a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml index 0fd4d6ef6..36d125f66 100644 --- a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml +++ b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml @@ -11,7 +11,7 @@ Window { visible: true flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog - modality: Qt.WindowModality + modality: Qt.WindowModal maximumHeight: rect.height maximumWidth: rect.width @@ -27,8 +27,10 @@ Window { x: mainWindow.x + (mainWindow.width - width)/2 y: mainWindow.y + 28 - property var placeholders: ["?", "?", "?", "?", "?", - "?", "?", "?", "?"] + property var numbers: [ "7", "8", "9", + "4", "5", "6", + "1", "2", "3"] + property string output Rectangle { id: rect @@ -36,11 +38,31 @@ Window { color: "#191E2A" opacity: 1 radius: 16 - height: 580 + height: 610 width: 430 border.color : "#3C435A" border.width : 1 + Image { + id: close_button + + anchors.top: parent.top + anchors.topMargin: 24 + anchors.right: parent.right + anchors.rightMargin: 24 + + source: "qrc:/images/close_button.png" + width: 16 + height: 16 + MouseArea { + anchors.fill: parent + onClicked: { + output = "" + root.close() + } + } + } + CustomTitleLabel { id: title @@ -48,7 +70,7 @@ Window { anchors.top: parent.top anchors.topMargin: 36 - text: qsTr("PIN") + text: qsTr("Enter PIN") } Item { @@ -66,59 +88,45 @@ Window { id: grid property bool isComplete: false - property bool isValid: false anchors.fill: parent cellHeight : 110 cellWidth : 130 - model: placeholders + model: numbers - delegate: TextField { - id: input - - focus: true - activeFocusOnTab: true + interactive: false - placeholderText: qsTr("?") - horizontalAlignment: TextInput.AlignHCenter + delegate: Button { + id: input height: 100 width: 120 - color: "#E2E7FF" font.pixelSize: 20 font.family: "Roboto" font.weight: Font.Normal + palette.buttonText: BSStyle.buttonsTextColor - validator: IntValidator { - bottom: 0 - top: 9 - } + text: String.fromCodePoint(0x2022) background: Rectangle { implicitWidth: 100 - implicitHeight: 100 + implicitHeight: 120 + + color: input.down ? BSStyle.buttonsStandardPressedColor : + (input.hovered ? BSStyle.buttonsStandardHoveredColor : BSStyle.buttonsStandardColor) - color: "#020817" - opacity: 1 radius: 14 - border.color: grid.isValid ? (input.activeFocus ? "#45A6FF" : "#3C435A") : "#EB6060" - border.width: 1 + border.color: BSStyle.buttonsStandardBorderColor + border.width: input.down? 1 : 0 } - onTextEdited: { - grid.isComplete = true - for (var i = 0; i < grid.count; i++) - { - if (!grid.itemAtIndex(i).text.length) - { - grid.isComplete = false - break - } - } + onClicked: { + output += numbers[index] + pin_field.text += String.fromCodePoint(0x2022) } } @@ -126,23 +134,46 @@ Window { } - Label { - id: error_description + TextField { + id: pin_field - visible: !grid.isValid - - text: qsTr("PIN is wrong") - - anchors.horizontalCenter: parent.horizontalCenter + anchors.left: parent.left + anchors.leftMargin: 25 anchors.top: grid_item.bottom anchors.topMargin: 24 - height: 16 - - color: "#EB6060" - font.pixelSize: 14 + font.pixelSize: 20 font.family: "Roboto" font.weight: Font.Normal + color: BSStyle.buttonsTextColor + + leftPadding: 14 + rightPadding: 14 + + readOnly: true + + background: Rectangle { + implicitWidth: 380 + implicitHeight: 46 + color: "#020817" + radius: 14 + } + + Image { + id: clear_button + + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 24 + + source: "qrc:/images/close_button.png" + width: 16 + height: 16 + MouseArea { + anchors.fill: parent + onClicked: clean() + } + } } CustomButton { @@ -155,34 +186,36 @@ Window { width: 380 - enabled: grid.isComplete - Component.onCompleted: { accept_but.preferred = true } function click_enter() { if (!accept_but.enabled) return - var res = "" - for (var i = 0; i < grid.count; i++) - { - res += grid.itemAtIndex(i).text - } - bsApp.setHWpin(res) + + bsApp.setHWpin(output) + clean() root.close() } } + Keys.onEnterPressed: { + accept_but.click_enter() + } + + Keys.onReturnPressed: { + accept_but.click_enter() + } } function init() { - grid.isComplete = false - grid.isValid = true + clean() + } - for (var i = 0; i < grid.count; i++) - { - grid.itemAtIndex(i).text = "" - } + function clean() { + output = "" + pin_field.text = "" } + } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 7ce03d5a5..ebab013db 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -112,5 +112,6 @@ qml/StyledControls/CustomCompleterPopup.qml qml/Pin/PinEntriesPopup.qml qml/Pin/qmldir + images/clear.png From cf5f3577026e4f9d322435154bf3e048ffc1f835 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Tue, 31 Jan 2023 02:37:31 +0200 Subject: [PATCH 092/436] qml: send advanced: buttons+combo boxes --- GUI/QtQuick/images/plus.png | Bin 0 -> 170 bytes GUI/QtQuick/qml/Send/AdvancedDetails.qml | 299 +++++++++++++++++- GUI/QtQuick/qml/Send/SimpleDetails.qml | 4 +- .../qml/StyledControls/CustomTextInput.qml | 5 + GUI/QtQuick/qtquick.qrc | 1 + 5 files changed, 306 insertions(+), 3 deletions(-) create mode 100644 GUI/QtQuick/images/plus.png diff --git a/GUI/QtQuick/images/plus.png b/GUI/QtQuick/images/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..311b160a10b6bcaafb03fa5253d77a961a440181 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^{2``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBzP+c5V@L(#+lvbY85DS&FYvA{E=et top) + { + amount_input.input_text = amount_max + } + } + } + + CustomComboBox { + + id: fee_suggest_combo + + Layout.leftMargin: 16 + Layout.topMargin: 10 + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + width: 504 + height: 70 + + model: feeSuggestions + + //aliases + title_text: qsTr("Fee Suggestions") + + textRole: "text" + valueRole: "value" + + Connections + { + target:feeSuggestions + function onRowCountChanged () + { + fee_suggest_combo.currentIndex = 0 + } + } + } + + Rectangle { + + height: 1 + + Layout.fillWidth: true + Layout.topMargin: 196 + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + color: "#3C435A" + } + Label { Layout.fillWidth: true Layout.fillHeight : true @@ -146,6 +228,221 @@ ColumnLayout { border.color: "#3C435A" border.width: 1 + + ColumnLayout { + id: outputs_layout + + anchors.fill: parent + + spacing: 0 + + Label { + id: outputs_title + + Layout.leftMargin: 16 + Layout.topMargin: 16 + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + text: qsTr("Outputs") + + height : 19 + color: "#E2E7FF" + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Medium + } + + CustomTextInput { + + id: rec_addr_input + + Layout.leftMargin: 16 + Layout.topMargin: 16 + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + width: 504 + height: 70 + + //aliases + title_text: qsTr("Receiver address") + + Image { + id: paste_but + + z: 1 + + anchors.top: rec_addr_input.top + anchors.topMargin: 23 + anchors.right: rec_addr_input.right + anchors.rightMargin: 23 + + source: "qrc:/images/paste_icon.png" + width: 24 + height: 24 + + MouseArea { + anchors.fill: parent + onClicked: { + rec_addr_input.input_text = bsApp.pasteTextFromClipboard() + amount_input.setActiveFocus() + } + } + } + + onTextChanged : { + if (rec_addr_input.input_text.length) + { + rec_addr_input.isValid = bsApp.validateAddress(rec_addr_input.input_text) + } + } + } + + CustomTextInput { + + id: amount_input + + Layout.leftMargin: 16 + Layout.topMargin: 10 + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + width: 504 + height: 70 + + //aliases + title_text: qsTr("Amount") + + //app (if was launched from visual studio) crashes when there is input_validator + //and we change text inside of onTextEdited + //it is why I have realized my validator inside of onTextEdited + property string prev_text : "" + onTextEdited : { + + amount_input.input_text = amount_input.input_text.replace(",", ".") + + if (amount_input.input_text.startsWith("0") + && !amount_input.input_text.startsWith("0.") + && amount_input.input_text.length > 1) + { + amount_input.input_text = "0." + + amount_input.input_text.substring(1, amount_input.input_text.length) + } + try { + var input_number = Number.fromLocaleString(Qt.locale("en_US"), amount_input.input_text) + } + catch (error) + { + amount_input.input_text = prev_text + return + } + + var max_value = (from_wallet_combo.currentIndex >= 0) ? + parseFloat(getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole)) : 0 + + if (input_number < 0 || input_number>max_value) + { + amount_input.input_text = prev_text + return + } + + prev_text = amount_input.input_text + } + + CustomButton { + + id: max_but + + z: 1 + + width: 55 + height: 28 + back_radius: 37 + + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 23 + + text: qsTr("MAX") + font.pixelSize: 12 + + function click_enter() { + amount_input.input_text = getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole) + } + } + + Label { + + id: currency + + anchors.verticalCenter: parent.verticalCenter + anchors.right: max_but.left + anchors.rightMargin: 16 + + text: "BTC" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + color: "#7A88B0" + } + + } + + CustomTextEdit { + + id: comment_input + + Layout.leftMargin: 16 + Layout.topMargin: 10 + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + Layout.preferredHeight : 90 + Layout.preferredWidth: 504 + + //aliases + title_text: qsTr("Comment") + + onTabNavigated: continue_but.forceActiveFocus() + onBackTabNavigated: fee_suggest_combo.forceActiveFocus() + } + + CustomButton { + id: include_output_but + text: qsTr("Include Output") + + Layout.leftMargin: 16 + Layout.topMargin: 16 + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + icon.source: "qrc:/images/plus.png" + icon.color: include_output_but.enabled ? "#45A6FF" : "#020817" + + width: 504 + + Component.onCompleted: { + confirm_but.preferred = false + } + + function click_enter() { + if (!confirm_but.enabled) return + + } + } + + Rectangle { + + height: 1 + + Layout.fillWidth: true + Layout.topMargin: 30 + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + color: "#3C435A" + } + + Label { + Layout.fillWidth: true + Layout.fillHeight : true + } + } } } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 3ff425eac..a7106059e 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -6,7 +6,7 @@ import QtQuick.Layouts 1.15 import "../BsStyles" import "../StyledControls" -//import wallet.balance 1.0 +import wallet.balance 1.0 ColumnLayout { @@ -113,7 +113,7 @@ ColumnLayout { } } - onTextEdited : { + onTextChanged : { if (rec_addr_input.input_text.length) { rec_addr_input.isValid = bsApp.validateAddress(rec_addr_input.input_text) diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index a6fd9dd1f..c4f3c264c 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -34,6 +34,7 @@ Rectangle { property var completer: null signal textEdited() + signal textChanged() signal editingFinished() signal activeFocusChanged() @@ -85,6 +86,10 @@ Rectangle { rect.textEdited() } + onTextChanged : { + rect.textChanged() + } + onEditingFinished : { rect.editingFinished() } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 7d2d1d786..ddedb8df6 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -113,5 +113,6 @@ qml/Send/AdvancedDetails.qml qml/Pin/PinEntriesPopup.qml qml/Pin/qmldir + images/plus.png From 3732936b94971d5558a07030d33eed75d9dfef59 Mon Sep 17 00:00:00 2001 From: YZ Date: Tue, 31 Jan 2023 10:54:47 +0100 Subject: [PATCH 093/436] Overview page redesign: combobox, balance bar, address table --- GUI/QtQuick/AddressListModel.cpp | 2 +- GUI/QtQuick/images/overview/copy_button.svg | 3 + .../qml/Overview/AddressesTableView.qml | 144 +++++++ GUI/QtQuick/qml/Overview/BalanceBar.qml | 83 ++++ GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml | 52 +++ GUI/QtQuick/qml/Overview/BaseCombobox.qml | 154 ++++++++ GUI/QtQuick/qml/Overview/BaseWalletButton.qml | 46 +++ GUI/QtQuick/qml/Overview/OverviewPanel.qml | 113 ++++++ .../qml/Overview/OverviewWalletBar.qml | 79 ++++ GUI/QtQuick/qml/OverviewPage.qml | 370 +++++++++--------- GUI/QtQuick/qtquick.qrc | 9 + 11 files changed, 874 insertions(+), 181 deletions(-) create mode 100644 GUI/QtQuick/images/overview/copy_button.svg create mode 100644 GUI/QtQuick/qml/Overview/AddressesTableView.qml create mode 100644 GUI/QtQuick/qml/Overview/BalanceBar.qml create mode 100644 GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml create mode 100644 GUI/QtQuick/qml/Overview/BaseCombobox.qml create mode 100644 GUI/QtQuick/qml/Overview/BaseWalletButton.qml create mode 100644 GUI/QtQuick/qml/Overview/OverviewPanel.qml create mode 100644 GUI/QtQuick/qml/Overview/OverviewWalletBar.qml diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index ff557c378..a4e244197 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -14,7 +14,7 @@ namespace { static const QHash kRoles{ - {QmlAddressListModel::TableDataRole, "tabledata"}, + {QmlAddressListModel::TableDataRole, "tableData"}, {QmlAddressListModel::HeadingRole, "heading"}, {QmlAddressListModel::FirstColRole, "firstcol"} }; diff --git a/GUI/QtQuick/images/overview/copy_button.svg b/GUI/QtQuick/images/overview/copy_button.svg new file mode 100644 index 000000000..f00ca0002 --- /dev/null +++ b/GUI/QtQuick/images/overview/copy_button.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/qml/Overview/AddressesTableView.qml b/GUI/QtQuick/qml/Overview/AddressesTableView.qml new file mode 100644 index 000000000..dd137ef79 --- /dev/null +++ b/GUI/QtQuick/qml/Overview/AddressesTableView.qml @@ -0,0 +1,144 @@ + +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +TableView { + id: component + width: 1200 + height: 200 + + columnSpacing: 0 + rowSpacing: 0 + clip: true + boundsBehavior: Flickable.StopAtBounds + + signal copyRequested(var id) + + property bool has_copy: true + + property color text_header_color: "#7A88B0" + property int text_header_size: 10 + + property color cell_text_color: "#FFFFFF" + property int cell_text_size: 11 + + property color separator_color: "#3C435A" + property color cell_background_color: "#333C435A" + property color selected_cell_background_color: "#22293B" + property color header_background_color: "#333C435A" + + property var columnWidths: [350, 100, 120, 100] + columnWidthProvider: function (column) { + return (column === (columnWidths.length + - 1)) ? Math.max( + columnWidths[column], + component.width - columnWidths.reduce( + (sum, a) => sum + a, + 0) + columnWidths.slice( + -1)[0]) : columnWidths[column] + } + + property int selected_row_index: -1 + + delegate: Rectangle { + implicitHeight: 34 + color: row === 0 ? component.header_background_color : (row === selected_row_index ? component.selected_cell_background_color : component.cell_background_color) + + Row { + anchors.fill: parent + + Text { + id: internal_text + text: tableData + + color: row === 0 ? component.text_header_color : component.cell_text_color + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: row === 0 ? component.text_header_size : component.cell_text_size + + leftPadding: 10 + + anchors.verticalCenter: parent.verticalCenter + } + + Image { + width: 24 + height: 24 + visible: column === 0 && row == selected_row_index && component.has_copy + anchors.verticalCenter: parent.verticalCenter + source: "qrc:/images/overview/copy_button.svg" + + MouseArea { + anchors.fill: parent + + ToolTip { + id: tool_tip + timeout: 1000 + text: "Copied" + + font.pixelSize: 10 + font.family: "Roboto" + font.weight: Font.Normal + + contentItem: Text { + text: tool_tip.text + font: tool_tip.font + color: "#FFFFFF" + } + + background: Rectangle { + color: "#191E2A" + border.color: "#3C435A" + border.width: 1 + radius: 14 + } + } + + onClicked: { + component.copyRequested(tableData) + tool_tip.visible = true + } + } + } + } + + Rectangle { + height: 1 + width: parent.width + color: component.separator_color + + anchors.bottom: parent.bottom + } + + MouseArea { + anchors.fill: parent + preventStealing: true + propagateComposedEvents: true + hoverEnabled: true + + onClicked: mouse.accepted = false + + onEntered: { + if (row !== 0) { + component.selected_row_index = row + } + } + + onExited: { + if (row !== 0) { + component.selected_row_index = -1 + } + } + } + } +} diff --git a/GUI/QtQuick/qml/Overview/BalanceBar.qml b/GUI/QtQuick/qml/Overview/BalanceBar.qml new file mode 100644 index 000000000..abe16bdd1 --- /dev/null +++ b/GUI/QtQuick/qml/Overview/BalanceBar.qml @@ -0,0 +1,83 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 + +import "." as OverviewControls + +Rectangle { + id: control + + width: 520 + height: 100 + color: "#191E2A" + + property alias confirmed_balance_value: confirmed_balance.label_value + property alias uncorfirmed_balance_value: unconfirmed_balance.label_value + property alias total_balance_value: total_balance.label_value + property alias used_addresses_value: used_addresses.label_value + + property int spacer_height: 36 + property color spacer_color: "#3C435A" + + Row { + anchors.fill: parent + spacing: 10 + + OverviewControls.BaseBalanceLabel { + id: confirmed_balance + width: 130 + label_text: "Confirmed balance" + anchors.verticalCenter: parent.verticalCenter + } + + Rectangle { + width: 1 + height: control.spacer_height + color: control.spacer_color + anchors.verticalCenter: parent.verticalCenter + } + + OverviewControls.BaseBalanceLabel { + id: unconfirmed_balance + width: 140 + label_text: "Unconfirmed balance" + anchors.verticalCenter: parent.verticalCenter + } + + Rectangle { + width: 1 + height: control.spacer_height + color: control.spacer_color + anchors.verticalCenter: parent.verticalCenter + } + + OverviewControls.BaseBalanceLabel { + id: total_balance + width: 120 + label_text: "Total balance" + anchors.verticalCenter: parent.verticalCenter + } + + Rectangle { + width: 1 + height: control.spacer_height + color: control.spacer_color + anchors.verticalCenter: parent.verticalCenter + } + + OverviewControls.BaseBalanceLabel { + id: used_addresses + label_text: "#Used addresses" + value_suffix: "" + anchors.verticalCenter: parent.verticalCenter + } + } +} diff --git a/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml b/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml new file mode 100644 index 000000000..83d833a1f --- /dev/null +++ b/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml @@ -0,0 +1,52 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 + +Rectangle { + id: control + + property string label_text: "Confirmed balance" + property color label_text_color: "#7A88B0" + property int label_text_font_size: 12 + + property string label_value: "0.00999889" + property color label_value_color: "#E2E7FF" + property int label_value_font_size: 13 + + property string value_suffix: "BTC" + property int left_text_padding: 10 + + width: 120 + height: 53 + color: "#191E2A" + + Column { + anchors.verticalCenter: parent.verticalCenter + spacing: 5 + + Text { + text: control.label_text + leftPadding: control.left_text_padding + + color: control.label_text_color + font.pixelSize: control.label_text_font_size + } + + Text { + text: control.label_value + " " + control.value_suffix + leftPadding: control.left_text_padding + + color: control.label_value_color + font.weight: Font.Medium + font.pixelSize: control.label_value_font_size + } + } +} diff --git a/GUI/QtQuick/qml/Overview/BaseCombobox.qml b/GUI/QtQuick/qml/Overview/BaseCombobox.qml new file mode 100644 index 000000000..c68ffa935 --- /dev/null +++ b/GUI/QtQuick/qml/Overview/BaseCombobox.qml @@ -0,0 +1,154 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.3 + +ComboBox { + id: control + + width: 263 + height: 53 + + property color font_color: "#ffffff" + + property color hightligh_color: "gray" + property color background_color: "#020817" + property color background_border_color: "#3C435A" + property int background_border_width: 1 + property int background_radius: 14 + + property int text_margin: 16 + property int text_size: 14 + + property int indicator_width: 10 + property int indicator_height: 6 + property color indicator_fill_color: "#DCE2FF" + + model: ['Alex wallet', 'B', 'C', 'D'] + + activeFocusOnTab: true + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + + contentItem: Rectangle { + + width: control.width + height: control.height + color: "transparent" + + Text { + text: control.currentText + color: control.font_color + font: control.font + verticalAlignment: Text.AlignVCenter + + anchors.fill: parent + anchors.margins: control.text_margin + } + } + + background: Rectangle { + color: control.background_color + radius: control.background_radius + + border.color: control.background_border_color + border.width: control.background_border_width + } + + indicator: Canvas { + id: indicator_shape + + width: control.indicator_width + height: control.indicator_height + + anchors.margins: control.text_margin + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + + + transform: Rotation { + origin.x: control.popup.visible ? indicator_shape.width / 2 : 0 + origin.y: control.popup.visible ? indicator_shape.height / 2 : 0 + angle: control.popup.visible ? 180 : 0 + } + + onPaint: { + var ctx = getContext("2d") + ctx.lineWidth = 1 + ctx.strokeStyle = "transparent" + ctx.fillStyle = control.indicator_fill_color + + ctx.beginPath() + ctx.moveTo(0, 0) + ctx.lineTo(indicator_shape.width,0) + ctx.lineTo(indicator_shape.width / 2, indicator_shape.height) + ctx.lineTo(0, 0) + ctx.closePath() + ctx.fill() + ctx.stroke() + } + } + + delegate: ItemDelegate { + id: delegate_item + + width: control.width + height: 27 + + contentItem: Rectangle { + radius: control.background_radius + color: delegate_item.highlighted ? "#3345A6FF": "transparent" + + anchors.fill: parent + anchors.margins: 4 + + Text { + text: model[textRole] + color: delegate_item.highlighted ? "#45A6FF" : "black" + + font: control.font + verticalAlignment: Text.AlignVCenter + + anchors.fill: parent + anchors.margins: control.text_margin - parent.anchors.margins + } + } + + background: Rectangle { + color: 'transparent' + } + + highlighted: control.highlightedIndex === index + } + + popup: Popup { + y: control.height + width: control.width + padding: 0 + + contentItem: ListView { + clip: true + implicitHeight: contentHeight + model: control.popup.visible ? control.delegateModel : null + currentIndex: control.highlightedIndex + + ScrollIndicator.vertical: ScrollIndicator { } + } + + background: Rectangle { + color: "#FFFFFFFF" + radius: control.background_radius + } + } +} + diff --git a/GUI/QtQuick/qml/Overview/BaseWalletButton.qml b/GUI/QtQuick/qml/Overview/BaseWalletButton.qml new file mode 100644 index 000000000..5ff7d301d --- /dev/null +++ b/GUI/QtQuick/qml/Overview/BaseWalletButton.qml @@ -0,0 +1,46 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.3 + +Button { + id: control + + property color background_color: "#32394F" + property color background_border_color: "white" + property int background_radius: 14 + property int background_border_size: 0 + + text: "Wallet properties" + + width: 136 + height: 36 + + font.pixelSize: 12 + font.family: "Roboto" + font.weight: Font.Normal + + background: Rectangle { + color: control.background_color + radius: control.background_radius + + border.width: control.background_border_size + border.color: control.background_border_color + } + + contentItem: Text { + text: control.text + font: control.font + color: "#FFFFFF" + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } +} diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml new file mode 100644 index 000000000..394ea6c10 --- /dev/null +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -0,0 +1,113 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 + +import "." as OverviewControls + +Rectangle { + id: control + + width: 1200 + height: 788 + color: "#191E2A" + + signal copyWallet(var id) + signal requestWalletProperties() + signal createNewWallet() + signal walletIndexChanged(index : int) + + Column { + anchors.margins: 20 + anchors.fill: parent + spacing: 0 + + OverviewControls.OverviewWalletBar { + id: overview_panel + width: parent.width + height: 100 + + onRequestWalletProperties: control.requestWalletProperties() + onCreateNewWallet: control.createNewWallet() + onWalletIndexChanged: control.walletIndexChanged(index) + } + + Rectangle { + height: (parent.height - overview_panel.height) * 0.6 + width: parent.width + anchors.horizontalCenter: parent.horizontalCenter + + radius: 16 + color: "#333C435A" + border.width: 1 + border.color: "#3C435A" + + Column { + anchors.fill: parent + anchors.margins: 20 + spacing: 10 + + Text { + text: "Addresses" + color: "#FFFFFF" + font.pixelSize: 19 + font.family: "Roboto" + font.weight: Font.DemiBold + + } + + OverviewControls.AddressesTableView { + width: parent.width + height: parent.height - 40 + + header_background_color: "transparent" + cell_background_color: "transparent" + + model: addressListModel + + onCopyRequested: control.copyWallet(id) + } + } + } + + Rectangle { + color: "transparent" + width: parent.width + height: (parent.height - overview_panel.height) * 0.4 + + Column { + anchors.fill: parent + anchors.topMargin: 20 + spacing: 10 + + Text { + text: "Non-settled Transactions" + color: "#FFFFFF" + font.pixelSize: 19 + font.family: "Roboto" + font.weight: Font.DemiBold + + } + + OverviewControls.AddressesTableView { + width: parent.width + height: parent.height - 40 + + has_copy: false + header_background_color: "transparent" + cell_background_color: "transparent" + + columnWidths: [150, 150, 150, 150, 150, 150, 150, 150] + model: pendingTxListModel + } + } + } + } +} diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml new file mode 100644 index 000000000..df85af2a2 --- /dev/null +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -0,0 +1,79 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import wallet.balance 1.0 + +import "." as OverviewControls + +Rectangle { + id: control + + width: 1200 + height: 100 + color: "#191E2A" + + signal requestWalletProperties() + signal createNewWallet() + signal walletIndexChanged(index : int) + + Row { + anchors.fill:parent + spacing: 20 + + OverviewControls.BaseCombobox { + id: wallet_selection_combobox + anchors.verticalCenter: parent.verticalCenter + + objectName: "walletsComboBox" + model: walletBalances + textRole: "name" + valueRole: "name" + + Component.onCompleted: { + control.walletIndexChanged(0) + } + + onActivated: (ind) => { + control.walletIndexChanged(ind) + } + } + + OverviewControls.BalanceBar { + id: balance_bar + anchors.verticalCenter: parent.verticalCenter + + confirmed_balance_value: walletBalances.data(walletBalances.index(wallet_selection_combobox.currentIndex, 0), + WalletBalance.ConfirmedRole).toFixed(5) + uncorfirmed_balance_value: walletBalances.data(walletBalances.index(wallet_selection_combobox.currentIndex, 0), + WalletBalance.UnconfirmedRole).toFixed(5) + total_balance_value: walletBalances.data(walletBalances.index(wallet_selection_combobox.currentIndex, 0), + WalletBalance.TotalRole).toFixed(5) + used_addresses_value: walletBalances.data(walletBalances.index(wallet_selection_combobox.currentIndex, 0), + WalletBalance.NbAddrRole) + } + } + + Row { + spacing: 10 + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + + OverviewControls.BaseWalletButton { + text: "Wallet properties" + onClicked: control.requestWalletProperties() + } + + OverviewControls.BaseWalletButton { + text: "Create new wallet" + onClicked: control.createNewWallet() + } + } +} diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 51c75ba79..0f36d51d5 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -13,6 +13,7 @@ import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtQml.Models 2 +import "Overview" as Overview import "StyledControls" import "BsStyles" //import "BsControls" @@ -36,187 +37,196 @@ Item { visible: false } - Column { - spacing: 23 + Overview.OverviewPanel { anchors.fill: parent - Row { - spacing: 15 - - ComboBox { - id: walletsComboBox - objectName: "walletsComboBox" - model: walletBalances - textRole: "name" - valueRole: "name" - font.pointSize: 12 - - Component.onCompleted: { - curWalletIndexChanged(0) - } - - onActivated: (ind) => { - curWalletIndexChanged(ind) - } - } - Column { - Label { - text: qsTr("Confirmed balance") - font.pointSize: 8 - } - Label { - text: qsTr("%1 BTC") - .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) - , WalletBalance.ConfirmedRole)) - font.pointSize: 12 - } - } - Column { - Label { - text: qsTr("Unconfirmed balance") - font.pointSize: 8 - } - Label { - text: qsTr("%1 BTC") - .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) - , WalletBalance.UnconfirmedRole)) - font.pointSize: 12 - } - } - Column { - Label { - text: qsTr("Total balance") - font.pointSize: 8 - } - Label { - text: qsTr("%1 BTC") - .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) - , WalletBalance.TotalRole)) - font.pointSize: 12 - } - } - Column { - Label { - text: qsTr("#Used addresses") - font.pointSize: 8 - } - Label { - text: qsTr("%1") - .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) - , WalletBalance.NbAddrRole)) - font.pointSize: 12 - } - } - Item { // spacer item - Layout.fillWidth: true - Layout.fillHeight: true - Rectangle { anchors.fill: parent; color: "#ffaaaa" } - } - Button { - text: qsTr("Wallet Properties") - font.pointSize: 10 - } - Button { - text: qsTr("Create new wallet") - font.pointSize: 10 - onClicked: { - //stack.push(createNewWalletPage) - newWalletClicked() - } - } - } - - Row { - spacing: 15 - - Label { - text: qsTr("Addresses") - font.pointSize: 14 - } - Item { // spacer item - Layout.fillWidth: true - Layout.fillHeight: true - Rectangle { anchors.fill: parent; color: "#ffaaaa" } - } - Button { - text: qsTr("Hide used") - font.pointSize: 8 - } - Button { - text: qsTr("Hide internal") - font.pointSize: 8 - } - Button { - text: qsTr("Hide external") - font.pointSize: 8 - } - Button { - text: qsTr("Hide empty") - font.pointSize: 8 - } - } - TableView { - width: 1000 - height: 300 - columnSpacing: 1 - rowSpacing: 1 - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } - model: addressListModel - delegate: Rectangle { - implicitWidth: firstcol ? 550 : 150 - implicitHeight: 20 - border.color: "black" - border.width: 1 - color: heading ? 'black' : 'darkslategrey' - Text { - text: tabledata - font.pointSize: heading ? 8 : 10 - color: heading ? 'darkgrey' : 'lightgrey' - anchors.centerIn: parent - } - MouseArea { - anchors.fill: parent - onClicked: { - if (!heading && (model.column === 0)) { - bsApp.copyAddressToClipboard(tabledata) - ibInfo.displayMessage(qsTr("address %1 copied to clipboard").arg(tabledata)) - } - } - onDoubleClicked: { - stack.push(addressDetails) - } - } - } - } - - Label { - text: qsTr("Non-Settled Transactions") - font.pointSize: 14 - } - TableView { - width: 1000 - height: 200 - columnSpacing: 1 - rowSpacing: 1 - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } - model: pendingTxListModel - delegate: Rectangle { - implicitWidth: 125 * colWidth - implicitHeight: 20 - border.color: "black" - border.width: 1 - color: heading ? 'black' : 'darkslategrey' - Text { - text: tableData - font.pointSize: heading ? 8 : 10 - color: dataColor - anchors.centerIn: parent - } - } - } + onRequestWalletProperties: console.log("Nothing to do") + onCreateNewWallet: overview.newWalletClicked() + onWalletIndexChanged: overview.curWalletIndexChanged(index) + onCopyWallet: bsApp.copyAddressToClipboard(id) } + // Column { + // spacing: 23 + // anchors.fill: parent + + // Row { + // spacing: 15 + + // ComboBox { + // id: walletsComboBox + // objectName: "walletsComboBox" + // model: walletBalances + // textRole: "name" + // valueRole: "name" + // font.pointSize: 12 + + // Component.onCompleted: { + // curWalletIndexChanged(0) + // } + + // onActivated: (ind) => { + // curWalletIndexChanged(ind) + // } + // } + // Column { + // Label { + // text: qsTr("Confirmed balance") + // font.pointSize: 8 + // } + // Label { + // text: qsTr("%1 BTC") + // .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) + // , WalletBalance.ConfirmedRole)) + // font.pointSize: 12 + // } + // } + // Column { + // Label { + // text: qsTr("Unconfirmed balance") + // font.pointSize: 8 + // } + // Label { + // text: qsTr("%1 BTC") + // .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) + // , WalletBalance.UnconfirmedRole)) + // font.pointSize: 12 + // } + // } + // Column { + // Label { + // text: qsTr("Total balance") + // font.pointSize: 8 + // } + // Label { + // text: qsTr("%1 BTC") + // .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) + // , WalletBalance.TotalRole)) + // font.pointSize: 12 + // } + // } + // Column { + // Label { + // text: qsTr("#Used addresses") + // font.pointSize: 8 + // } + // Label { + // text: qsTr("%1") + // .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) + // , WalletBalance.NbAddrRole)) + // font.pointSize: 12 + // } + // } + // Item { // spacer item + // Layout.fillWidth: true + // Layout.fillHeight: true + // Rectangle { anchors.fill: parent; color: "#ffaaaa" } + // } + // Button { + // text: qsTr("Wallet Properties") + // font.pointSize: 10 + // } + // Button { + // text: qsTr("Create new wallet") + // font.pointSize: 10 + // onClicked: { + // //stack.push(createNewWalletPage) + // newWalletClicked() + // } + // } + // } + + // Row { + // spacing: 15 + + // Label { + // text: qsTr("Addresses") + // font.pointSize: 14 + // } + // Item { // spacer item + // Layout.fillWidth: true + // Layout.fillHeight: true + // Rectangle { anchors.fill: parent; color: "#ffaaaa" } + // } + // Button { + // text: qsTr("Hide used") + // font.pointSize: 8 + // } + // Button { + // text: qsTr("Hide internal") + // font.pointSize: 8 + // } + // Button { + // text: qsTr("Hide external") + // font.pointSize: 8 + // } + // Button { + // text: qsTr("Hide empty") + // font.pointSize: 8 + // } + // } + // TableView { + // width: 1000 + // height: 300 + // columnSpacing: 1 + // rowSpacing: 1 + // clip: true + // ScrollIndicator.horizontal: ScrollIndicator { } + // ScrollIndicator.vertical: ScrollIndicator { } + // model: addressListModel + // delegate: Rectangle { + // implicitWidth: firstcol ? 550 : 150 + // implicitHeight: 20 + // border.color: "black" + // border.width: 1 + // color: heading ? 'black' : 'darkslategrey' + // Text { + // text: tabledata + // font.pointSize: heading ? 8 : 10 + // color: heading ? 'darkgrey' : 'lightgrey' + // anchors.centerIn: parent + // } + // MouseArea { + // anchors.fill: parent + // onClicked: { + // if (!heading && (model.column === 0)) { + // bsApp.copyAddressToClipboard(tabledata) + // ibInfo.displayMessage(qsTr("address %1 copied to clipboard").arg(tabledata)) + // } + // } + // onDoubleClicked: { + // stack.push(addressDetails) + // } + // } + // } + // } + + // Label { + // text: qsTr("Non-Settled Transactions") + // font.pointSize: 14 + // } + + // TableView { + // width: 1000 + // height: 200 + // columnSpacing: 1 + // rowSpacing: 1 + // clip: true + // ScrollIndicator.horizontal: ScrollIndicator { } + // ScrollIndicator.vertical: ScrollIndicator { } + // model: pendingTxListModel + // delegate: Rectangle { + // implicitWidth: 125 * colWidth + // implicitHeight: 20 + // border.color: "black" + // border.width: 1 + // color: heading ? 'black' : 'darkslategrey' + // Text { + // text: tableData + // font.pointSize: heading ? 8 : 10 + // color: dataColor + // anchors.centerIn: parent + // } + // } + // } + // } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index ebab013db..2f3fef0af 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -113,5 +113,14 @@ qml/Pin/PinEntriesPopup.qml qml/Pin/qmldir images/clear.png + + qml/Overview/AddressesTableView.qml + qml/Overview/BalanceBar.qml + qml/Overview/BaseBalanceLabel.qml + qml/Overview/BaseCombobox.qml + qml/Overview/BaseWalletButton.qml + qml/Overview/OverviewPanel.qml + qml/Overview/OverviewWalletBar.qml + images/overview/copy_button.svg From e9abb2fbb368bb6b91203cd48f9a47ac270346c7 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Tue, 31 Jan 2023 12:54:09 +0200 Subject: [PATCH 094/436] qml: remove missing files --- GUI/QtQuick/qtquick.qrc | 1 - 1 file changed, 1 deletion(-) diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index ebab013db..7ce03d5a5 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -112,6 +112,5 @@ qml/StyledControls/CustomCompleterPopup.qml qml/Pin/PinEntriesPopup.qml qml/Pin/qmldir - images/clear.png From 4da815b3accf3510936cf3cdce7ccc57d654cc8a Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 31 Jan 2023 14:49:59 +0300 Subject: [PATCH 095/436] preparation for HWW password entry --- BlockSettleHW/hwdevicemanager.cpp | 4 +++- BlockSettleHW/ledger/ledgerClient.cpp | 2 +- BlockSettleHW/trezor/trezorClient.cpp | 11 ++++++----- BlockSettleHW/trezor/trezorDevice.cpp | 24 +++++++++++++++--------- GUI/QtQuick/QtQuickAdapter.cpp | 26 +++++++++++++++++++++++--- GUI/QtQuick/QtQuickAdapter.h | 3 ++- common | 2 +- 7 files changed, 51 insertions(+), 21 deletions(-) diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index 9fdbb79ba..41000b151 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -159,6 +159,8 @@ bs::message::ProcessingResult DeviceManager::processOwnRequest(const bs::message return processSetPIN(msg.set_pin()); case HW::DeviceMgrMessage::kSetPassword: return processSetPassword(msg.set_password()); + case HW::DeviceMgrMessage::kPrepareWalletForTxSign: + return processPrepareDeviceForSign(env, msg.prepare_wallet_for_tx_sign()); default: break; } return bs::message::ProcessingResult::Ignored; @@ -463,7 +465,7 @@ void DeviceManager::scanningDone(bool initDevices) for (const auto& key : trezorKeys) { auto device = trezorClient_->getDevice(key.id); if (!device->inited()) { - device->retrieveXPubRoot(); + device->init(); } } } diff --git a/BlockSettleHW/ledger/ledgerClient.cpp b/BlockSettleHW/ledger/ledgerClient.cpp index 33012e2a9..4d9aa3850 100644 --- a/BlockSettleHW/ledger/ledgerClient.cpp +++ b/BlockSettleHW/ledger/ledgerClient.cpp @@ -54,7 +54,7 @@ std::vector LedgerClient::deviceKeys() const for (const auto device : availableDevices_) { keys.push_back(device->key()); } - logger_->debug("[{}] {} keys", __func__, keys.size()); + logger_->debug("[LedgerClient::deviceKeys] {} key[s]", keys.size()); return keys; } diff --git a/BlockSettleHW/trezor/trezorClient.cpp b/BlockSettleHW/trezor/trezorClient.cpp index 7848333fe..66287ede0 100644 --- a/BlockSettleHW/trezor/trezorClient.cpp +++ b/BlockSettleHW/trezor/trezorClient.cpp @@ -68,6 +68,7 @@ std::vector TrezorClient::deviceKeys() const for (const auto& dev : devices_) { result.push_back(dev->key()); } + logger_->debug("[TrezorClient::deviceKeys] {} key[s]", result.size()); return result; } @@ -185,11 +186,11 @@ void TrezorClient::acquireDevice(const trezor::DeviceData& devData, bool init) return; } - trezor::DeviceData devData; - devData.sessionId = response["session"].is_null() ? "null" + auto devDataCopy = devData; + devDataCopy.sessionId = response["session"].is_null() ? "null" : response["session"].get(); - if (devData.sessionId.empty() || devData.sessionId == prevSessionId) { + if (devDataCopy.sessionId.empty() || devDataCopy.sessionId == prevSessionId) { logger_->error("[TrezorClient::acquireDevice] cannot acquire device"); scanDone(); return; @@ -199,10 +200,10 @@ void TrezorClient::acquireDevice(const trezor::DeviceData& devData, bool init) "connection id: {}, new connection id: {}", prevSessionId, devData.sessionId); state_ = trezor::State::Acquired; - //emit deviceReady(); - const auto& newDevice = std::make_shared(logger_, devData + const auto& newDevice = std::make_shared(logger_, devDataCopy , testNet_, cb_, trezorEndPoint_); if (init) { + logger_->debug("[TrezorClient::acquireDevice] init {} from acquire", devData.path); newDevice->init(); } devices_.push_back(newDevice); diff --git a/BlockSettleHW/trezor/trezorDevice.cpp b/BlockSettleHW/trezor/trezorDevice.cpp index 113d78983..193a4c173 100644 --- a/BlockSettleHW/trezor/trezorDevice.cpp +++ b/BlockSettleHW/trezor/trezorDevice.cpp @@ -155,6 +155,10 @@ DeviceType TrezorDevice::type() const void TrezorDevice::init() { + if (state_ == trezor::State::Init) { + logger_->debug("[TrezorDevice::init] already inited"); + return; + } logger_->debug("[TrezorDevice::init] start"); management::Initialize message; message.set_session_id(data_.sessionId); @@ -170,8 +174,6 @@ void TrezorDevice::init() state_ = trezor::State::Init; const auto& msg = unpackMessage(QByteArray::fromStdString(reply->response)); handleMessage(msg); - - retrieveXPubRoot(); }; auto inData = std::make_shared(); inData->path = "/call/" + data_.sessionId; @@ -291,7 +293,7 @@ void TrezorDevice::setPassword(const SecureBinaryData& password, bool enterOnDev void TrezorDevice::cancel() { - logger_->debug("[TrezorDevice] cancel previous operation"); + logger_->debug("[TrezorDevice::cancel]"); management::Cancel message; makeCall(message); sendTxMessage(/*HWInfoStatus::kCancelledByUser*/"cancelled by user"); @@ -299,12 +301,11 @@ void TrezorDevice::cancel() void TrezorDevice::clearSession() { - logger_->debug("[TrezorDevice] cancel previous operation"); - management::/*ClearSession*/EndSession message; + logger_->debug("[TrezorDevice::clearSession]"); + management::EndSession message; makeCall(message); } - void TrezorDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX) { currentTxSignReq_.reset(new bs::core::wallet::TXSignRequest(reqTX)); @@ -370,6 +371,7 @@ void TrezorDevice::retrieveXPubRoot() logger_->error("[TrezorDevice::retrieveXPubRoot] invalid callback data"); return; } + logger_->debug("[TrezorDevice::retrieveXPubRoot] {}: {}", features_->label(), reply->xpub); xpubRoot_ = BinaryData::fromString(reply->xpub); const auto& devKey = key(); cb_->publicKeyReady(devKey.id, devKey.walletId); @@ -381,6 +383,7 @@ void TrezorDevice::makeCall(const google::protobuf::Message &msg , const bs::WorkerPool::callback& callback) { if (state_ == trezor::State::None) { + logger_->debug("[{}] re-initing device", __func__); init(); } auto cb = callback; @@ -443,9 +446,13 @@ void TrezorDevice::handleMessage(const trezor::MessageData& data, const bs::Work case MessageType_Features: { if (parseResponse(*features_, data)) { - logger_->debug("[TrezorDevice] handleMessage Features, model: '{}' - {}.{}.{}" + logger_->debug("[TrezorDevice::handleMessage] features: model '{}' v{}.{}.{}" , features_->model(), features_->major_version(), features_->minor_version(), features_->patch_version()); // + getJSONReadableMessage(features_)); + retrieveXPubRoot(); + } + else { + logger_->error("[TrezorDevice::handleMessage] failed to parse features response"); } } break; @@ -453,8 +460,7 @@ void TrezorDevice::handleMessage(const trezor::MessageData& data, const bs::Work { common::ButtonRequest request; if (parseResponse(request, data)) { - logger_->debug("[TrezorDevice] handleMessage ButtonRequest " - + getJSONReadableMessage(request)); + logger_->debug("[TrezorDevice::handleMessage] ButtonRequest {}", getJSONReadableMessage(request)); } common::ButtonAck response; makeCall(response); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index d70c06230..eb529a601 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -637,7 +637,7 @@ bs::message::ProcessingResult QtQuickAdapter::processHWW(const bs::message::Enve case HW::DeviceMgrMessage::kPasswordRequest: curAuthDevice_ = bs::hww::fromMsg(msg.password_request().key()); QMetaObject::invokeMethod(this, [this, onDevice=msg.password_request().allowed_on_device()] - { emit invokePasswordEntry(onDevice); }); + { emit invokePasswordEntry(QString::fromStdString(curAuthDevice_.label), onDevice); }); return bs::message::ProcessingResult::Success; default: break; } @@ -1281,6 +1281,25 @@ void QtQuickAdapter::setHWpin(const QString& pin) curAuthDevice_ = {}; } +void QtQuickAdapter::setHWpassword(const QString& password) +{ + if (curAuthDevice_.id.empty()) { + logger_->error("[{}] no device requested passphrase", __func__); + return; + } + HW::DeviceMgrMessage msg; + auto msgReq = msg.mutable_set_password(); + bs::hww::deviceKeyToMsg(curAuthDevice_, msgReq->mutable_key()); + if (password.isEmpty()) { + msgReq->set_set_on_device(true); + } + else { + msgReq->set_password(password.toStdString()); + } + pushRequest(user_, userHWW_, msg.SerializeAsString()); + curAuthDevice_ = {}; +} + void QtQuickAdapter::importHWWallet(int deviceIndex) { const auto& devKey = hwDeviceModel_->getDevice(deviceIndex); @@ -1599,13 +1618,14 @@ void QtQuickAdapter::signAndBroadcast(QTXSignRequest* txReq, const QString& pass try { if (hdWallets_.at(walletId).isHardware) { needHWSign = true; - break; + HW::DeviceMgrMessage msg; + msg.set_prepare_wallet_for_tx_sign(walletId); + pushRequest(user_, userHWW_, msg.SerializeAsString()); } } catch (const std::exception&) {} } if (needHWSign) { - pollHWWallets(); unsigned nbNonHW = 0; for (const auto& walletId : txSignReq.walletIds) { try { diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 359c4818c..99230218f 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -162,6 +162,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void pollHWWallets(); Q_INVOKABLE void stopHWWalletsPolling(); Q_INVOKABLE void setHWpin(const QString&); + Q_INVOKABLE void setHWpassword(const QString&); Q_INVOKABLE void importHWWallet(int deviceIndex); Q_INVOKABLE void generateNewAddress(int walletIndex, bool isNative); Q_INVOKABLE void copyAddressToClipboard(const QString& addr); @@ -185,7 +186,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void devicesChanged(); void scanningChanged(); void invokePINentry(); - void invokePasswordEntry(bool); + void invokePasswordEntry(const QString& devName, bool acceptOnDevice); private slots: void walletSelected(int); diff --git a/common b/common index 77ac07f46..7a8675f39 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 77ac07f466186d26aff8dc685fc71abaa0d2fedc +Subproject commit 7a8675f399407be0524039a184280a41ac7c09c3 From 22115e534975e6e10f7f772391f1c1b6ec48d347 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Tue, 31 Jan 2023 18:40:12 +0200 Subject: [PATCH 096/436] qml: fix bugs --- GUI/QtQuick/qml/CreateWallet/ImportWallet.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml index 963e654e8..86605e0e5 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml @@ -316,7 +316,7 @@ ColumnLayout { visible: !grid.isValid - text: qsTr("Words are not valid") + text: qsTr("Invalid seed") Layout.bottomMargin: 24 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter From 9fb7734ffb6c7253a42d61bb34cb2da3ecf3a6fb Mon Sep 17 00:00:00 2001 From: dvajdual Date: Tue, 31 Jan 2023 20:21:19 +0200 Subject: [PATCH 097/436] qml send: fix bugs --- GUI/QtQuick/qml/Send/SimpleDetails.qml | 11 +++++- GUI/QtQuick/qml/main.qml | 47 +++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 1112fb940..7bfdaf61b 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -102,16 +102,25 @@ ColumnLayout { anchors.fill: parent onClicked: { rec_addr_input.input_text = bsApp.pasteTextFromClipboard() - amount_input.setActiveFocus() + rec_addr_input.validate() } } } onTextEdited : { + rec_addr_input.validate() + } + + function validate() + { if (rec_addr_input.input_text.length) { rec_addr_input.isValid = bsApp.validateAddress(rec_addr_input.input_text) + if (rec_addr_input.isValid) + amount_input.setActiveFocus() } + else + rec_addr_input.isValid = true } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 562c2be3e..ad96f5f72 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -288,7 +288,6 @@ ApplicationWindow { clickedBtn.select(true) } - /* function raiseWindow() { JsHelper.raiseWindow(mainWindow) } @@ -368,4 +367,50 @@ ApplicationWindow { { return feeSuggestions.data(feeSuggestions.index(index, 0), role) } + + + Dialog { + id: errorDialog + + x: mainWindow.x + (mainWindow.width - width)/2 + y: mainWindow.y + (mainWindow.height - height)/2 + width: 100 + height: 50 + + title: "Error" + + modal: true + standardButtons: Dialog.Ok + + contentItem: Label { + id: errorLabel + + color: "#E2E7FF" + font.pixelSize: 20 + font.family: "Roboto" + font.weight: Font.Medium + + text: "Test Description" + + horizontalAlignment: Text.AlignHCenter + } + + + background: Rectangle { + color: "#191E2A" + radius: 14 + } + + visible: true + } + + Connections + { + target:bsApp + function onShowError (message) + { + errorLabel.text = message + errorDialog.open() + } + } } From 42a58144b51493b3431161c10547e3004e2d8a06 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 1 Feb 2023 00:54:42 +0300 Subject: [PATCH 098/436] TX max amount calc --- GUI/QtQuick/QTXSignRequest.cpp | 2 +- GUI/QtQuick/QTXSignRequest.h | 1 + GUI/QtQuick/QtQuickAdapter.cpp | 51 +++++++++++++++++--------- GUI/QtQuick/QtQuickAdapter.h | 1 + GUI/QtQuick/qml/Send/SimpleDetails.qml | 19 +++++++--- GUI/QtQuick/qml/main.qml | 4 ++ common | 2 +- 7 files changed, 56 insertions(+), 24 deletions(-) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index dd4e0bf0b..a07afd83d 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -71,7 +71,7 @@ QString QTXSignRequest::returnAmount() const if (!txReq_.isValid()) { return {}; } - return QString::number(txReq_.changeAmount([](const bs::Address&) { return true; }) / BTCNumericTypes::BalanceDivider + return QString::number(txReq_.changeAmount() / BTCNumericTypes::BalanceDivider , 'f', 8); } diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h index 1677c3b58..4e5edba8e 100644 --- a/GUI/QtQuick/QTXSignRequest.h +++ b/GUI/QtQuick/QTXSignRequest.h @@ -53,6 +53,7 @@ class QTXSignRequest : public QObject QString errorText() const { return error_; } Q_PROPERTY(bool isValid READ isValid NOTIFY txSignReqChanged) bool isValid() const { return (error_.isEmpty() && txReq_.isValid()); } + Q_PROPERTY(QString maxAmount READ outputAmount NOTIFY txSignReqChanged) signals: void txSignReqChanged(); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index eb529a601..ed866c80b 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -486,6 +486,12 @@ ProcessingResult QtQuickAdapter::processBlockchain(const Envelope &env) return processZCInvalidated(msg.zc_invalidated()); case ArmoryMessage::kTransactions: return processTransactions(env.responseId(), msg.transactions()); + case ArmoryMessage::kTxPushResult: + if (msg.tx_push_result().result() != ArmoryMessage::PushTxSuccess) { + emit showError(tr("TX broadcast failed: %1") + .arg(QString::fromStdString(msg.tx_push_result().error_message()))); + } + break; default: return ProcessingResult::Ignored; } return ProcessingResult::Success; @@ -890,7 +896,7 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId ProcessingResult QtQuickAdapter::processWalletBalances(bs::message::SeqId responseId , const WalletsMessage_WalletBalances &response) { - //logger_->debug("[{}] {}", __func__, response.DebugString()); + logger_->debug("[{}] {}", __func__, response.DebugString()); const WalletBalancesModel::Balance bal{ response.spendable_balance(), response.unconfirmed_balance() , response.total_balance(), response.nb_addresses() }; walletBalances_->setWalletBalance(response.wallet_id(), bal); @@ -1193,7 +1199,7 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri WalletsMessage msg; auto msgReq = msg.mutable_tx_request(); msgReq->set_hd_wallet_id(hdWalletIdByIndex(walletIndex)); - if (!recvAddr.isEmpty() && (amount > 0)) { + if (!recvAddr.isEmpty()) { auto msgOut = msgReq->add_outputs(); msgOut->set_address(recvAddr.toStdString()); msgOut->set_amount(amount); @@ -1388,16 +1394,21 @@ ProcessingResult QtQuickAdapter::processUTXOs(const WalletsMessage_UtxoListRespo ProcessingResult QtQuickAdapter::processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse& response) { - const auto& signedTX = BinaryData::fromString(response.signed_tx()); - logger_->debug("[{}] signed TX size: {}", __func__, signedTX.getSize()); - - ArmoryMessage msg; - auto msgReq = msg.mutable_tx_push(); - //msgReq->set_push_id(id); - auto msgTx = msgReq->add_txs_to_push(); - msgTx->set_tx(response.signed_tx()); - //not adding TX hashes atm - pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + if (!response.signed_tx().empty()) { + const auto& signedTX = BinaryData::fromString(response.signed_tx()); + logger_->debug("[{}] signed TX size: {}", __func__, signedTX.getSize()); + ArmoryMessage msg; + auto msgReq = msg.mutable_tx_push(); + //msgReq->set_push_id(id); + auto msgTx = msgReq->add_txs_to_push(); + msgTx->set_tx(response.signed_tx()); + //not adding TX hashes atm + pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + } + else { + emit showError(tr("TX sign failed, error %1: %2").arg(response.error_code()) + .arg(QString::fromStdString(response.error_text()))); + } return ProcessingResult::Success; } @@ -1513,6 +1524,7 @@ void QtQuickAdapter::processWalletAddresses(const std::string& walletId bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::SeqId msgId , const WalletsMessage_TxResponse& response) { +// logger_->debug("[{}] {}", __func__, response.DebugString()); const auto& itReq = txReqs_.find(msgId); if (itReq == txReqs_.end()) { logger_->error("[{}] unknown request #{}", __func__, msgId); @@ -1574,11 +1586,16 @@ QString QtQuickAdapter::getSettingStringAt(ApplicationSettings::Setting s, int i bs::message::ProcessingResult QtQuickAdapter::processHWSignedTX(const HW::DeviceMgrMessage_SignTxResponse& response) { - ArmoryMessage msg; - auto msgReq = msg.mutable_tx_push(); - auto msgTx = msgReq->add_txs_to_push(); - msgTx->set_tx(response.signed_tx()); - pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + if (!response.signed_tx().empty()) { + ArmoryMessage msg; + auto msgReq = msg.mutable_tx_push(); + auto msgTx = msgReq->add_txs_to_push(); + msgTx->set_tx(response.signed_tx()); + pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + } + else { + emit showError(QString::fromStdString(response.error_msg())); + } return ProcessingResult::Success; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 99230218f..05c39cfa7 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -187,6 +187,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void scanningChanged(); void invokePINentry(); void invokePasswordEntry(const QString& devName, bool acceptOnDevice); + void showError(const QString&); private slots: void walletSelected(int); diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 1112fb940..ef9ffbb7e 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -18,6 +18,8 @@ ColumnLayout { width: 600 spacing: 0 + property var tempRequest: null + RowLayout { Layout.fillWidth: true @@ -111,6 +113,12 @@ ColumnLayout { if (rec_addr_input.input_text.length) { rec_addr_input.isValid = bsApp.validateAddress(rec_addr_input.input_text) + + if (rec_addr_input.isValid) { + var fpb = parseFloat(fee_suggest_combo.currentValue) + tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , rec_addr_input.input_text, 0, (fpb > 0) ? fpb : 1.0) + } } } } @@ -157,11 +165,9 @@ ColumnLayout { amount_input.input_text = prev_text return } + var fpb = parseFloat(fee_suggest_combo.currentValue) - var max_value = (from_wallet_combo.currentIndex >= 0) ? - parseFloat(getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole)) : 0 - - if (input_number < 0 || input_number>max_value) + if (input_number < 0 || ((tempRequest != null) && (input_number > tempRequest.maxAmount))) { amount_input.input_text = prev_text return @@ -186,9 +192,12 @@ ColumnLayout { text: qsTr("MAX") font.pixelSize: 12 + enabled: (tempRequest != null) function click_enter() { - amount_input.input_text = getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole) + if (tempRequest != null) { + amount_input.input_text = tempRequest.maxAmount + } } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 2eac9f16f..9062e9181 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -74,6 +74,10 @@ ApplicationWindow { pin_popup.raise() pin_popup.requestActivate() } + function onShowError(text) + { + ibFailure.displayMessage(text) + } } color: BSStyle.backgroundColor diff --git a/common b/common index 7a8675f39..9ccea5e97 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 7a8675f399407be0524039a184280a41ac7c09c3 +Subproject commit 9ccea5e97a3e09203576aa64130013e660c55f99 From 9cfb2b3198b3692df720ecc529adb685ef87994d Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 1 Feb 2023 00:38:08 +0200 Subject: [PATCH 099/436] qml: send simplified fix bugs --- .../StyledControls/CustomMessageDialog.qml | 107 ++++++++++++++++++ GUI/QtQuick/qml/main.qml | 38 +------ GUI/QtQuick/qtquick.qrc | 1 + 3 files changed, 112 insertions(+), 34 deletions(-) create mode 100644 GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml diff --git a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml new file mode 100644 index 000000000..dd5cbea12 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml @@ -0,0 +1,107 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + + +Window { + id: root + + property alias error: errorLabel.text + + visible: true + flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog + modality: Qt.WindowModal + + maximumHeight: 200 + maximumWidth: 300 + + minimumHeight: 200 + minimumWidth: 300 + + height: 250 + width: 300 + + color: "transparent" + + x: mainWindow.x + (mainWindow.width - width)/2 + y: mainWindow.y + (mainWindow.height - height)/2 + + Rectangle { + id: rect + + color: "#191E2A" + opacity: 1 + radius: 16 + + anchors.fill: parent + + border.color : "#3C435A" + border.width : 1 + + Label { + id: tytleLabel + + anchors.top: rect.top + anchors.topMargin: 8 + anchors.horizontalCenter: rect.horizontalCenter + + color: "#E2E7FF" + font.pixelSize: 20 + font.family: "Roboto" + font.weight: Font.Medium + + text: "Error" + + horizontalAlignment: Text.AlignHCenter + } + + Label { + id: errorLabel + + anchors.bottom: ok_but.top + anchors.bottomMargin: 70 + anchors.horizontalCenter: rect.horizontalCenter + + color: "#E2E7FF" + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Medium + + text: "Test Description" + + horizontalAlignment: Text.AlignHCenter + } + + CustomButton { + id: ok_but + text: qsTr("Ok") + + anchors.bottom: rect.bottom + anchors.bottomMargin: 24 + anchors.horizontalCenter: rect.horizontalCenter + + width: 250 + height: 40 + + Component.onCompleted: { + ok_but.preferred = true + } + + function click_enter() { + root.close() + } + } + + Keys.onEnterPressed: { + ok_but.click_enter() + } + + Keys.onReturnPressed: { + ok_but.click_enter() + } + + } + +} + diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 0e3178c37..a11e388b1 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -387,39 +387,9 @@ ApplicationWindow { } - Dialog { - id: errorDialog + CustomMessageDialog { + id: error_dialog - x: mainWindow.x + (mainWindow.width - width)/2 - y: mainWindow.y + (mainWindow.height - height)/2 - width: 100 - height: 50 - - title: "Error" - - modal: true - standardButtons: Dialog.Ok - - contentItem: Label { - id: errorLabel - - color: "#E2E7FF" - font.pixelSize: 20 - font.family: "Roboto" - font.weight: Font.Medium - - text: "Test Description" - - horizontalAlignment: Text.AlignHCenter - } - - - background: Rectangle { - color: "#191E2A" - radius: 14 - } - - visible: true } Connections @@ -427,8 +397,8 @@ ApplicationWindow { target:bsApp function onShowError (message) { - errorLabel.text = message - errorDialog.open() + error_dialog.error = message + error_dialog.open() } } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 7ce03d5a5..e7e013ce2 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -112,5 +112,6 @@ qml/StyledControls/CustomCompleterPopup.qml qml/Pin/PinEntriesPopup.qml qml/Pin/qmldir + qml/StyledControls/CustomMessageDialog.qml From 3fdcf0f13cafda42c3cab66bae452622c437a2cb Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 1 Feb 2023 00:51:20 +0200 Subject: [PATCH 100/436] qml send simplified: retrieve tempRequest --- GUI/QtQuick/qml/Send/SimpleDetails.qml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 660fac549..6e0d4c06f 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -119,7 +119,12 @@ ColumnLayout { { rec_addr_input.isValid = bsApp.validateAddress(rec_addr_input.input_text) if (rec_addr_input.isValid) + { + var fpb = parseFloat(fee_suggest_combo.currentValue) + tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , rec_addr_input.input_text, 0, (fpb > 0) ? fpb : 1.0) amount_input.setActiveFocus() + } } else rec_addr_input.isValid = true From 8635a3f4aec1d28c811012b6c9728bb4dca8dce8 Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 1 Feb 2023 00:02:01 +0100 Subject: [PATCH 101/436] Colors cleanup --- BlockSettleHW/jade/jadeDevice.h | 2 +- GUI/QtQuick/qml/BsStyles/BSStyle.qml | 8 + .../qml/Overview/AddressesTableView.qml | 24 +-- GUI/QtQuick/qml/Overview/BalanceBar.qml | 18 +- GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml | 16 +- GUI/QtQuick/qml/Overview/BaseCombobox.qml | 154 ------------------ GUI/QtQuick/qml/Overview/OverviewPanel.qml | 20 +-- .../qml/Overview/OverviewWalletBar.qml | 22 ++- .../CustomButton2.qml} | 11 +- GUI/QtQuick/qtquick.qrc | 5 +- 10 files changed, 62 insertions(+), 218 deletions(-) delete mode 100644 GUI/QtQuick/qml/Overview/BaseCombobox.qml rename GUI/QtQuick/qml/{Overview/BaseWalletButton.qml => StyledControls/CustomButton2.qml} (76%) diff --git a/BlockSettleHW/jade/jadeDevice.h b/BlockSettleHW/jade/jadeDevice.h index c4efb52fa..7cd0c85f1 100644 --- a/BlockSettleHW/jade/jadeDevice.h +++ b/BlockSettleHW/jade/jadeDevice.h @@ -79,7 +79,7 @@ namespace bs { private: std::shared_ptr logger_; - const trezor::DeviceData data_; + const trezor::DeviceData data_{}; const bool testNet_; DeviceCallbacks* cb_{ nullptr }; const std::string endpoint_; diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index ce0ee5ed6..39ccb14b8 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -106,4 +106,12 @@ QtObject { readonly property color comboBoxIndicatorColor: "#DCE2FF" readonly property color comboBoxPopupedIndicatorColor: "#45A6FF" + + readonly property color tableSeparatorColor: "#3C435A" + readonly property color tableCellBackgroundColor: "transparent" + readonly property color tableCellSelectedBackgroundColor: "#22293B" + + readonly property color balanceValueTextColor: "#E2E7FF" + readonly property color addressesPanelBackgroundColor: "#333C435A" + } diff --git a/GUI/QtQuick/qml/Overview/AddressesTableView.qml b/GUI/QtQuick/qml/Overview/AddressesTableView.qml index dd137ef79..a2e292129 100644 --- a/GUI/QtQuick/qml/Overview/AddressesTableView.qml +++ b/GUI/QtQuick/qml/Overview/AddressesTableView.qml @@ -12,6 +12,8 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 +import "../BsStyles" + TableView { id: component width: 1200 @@ -26,17 +28,9 @@ TableView { property bool has_copy: true - property color text_header_color: "#7A88B0" property int text_header_size: 10 - - property color cell_text_color: "#FFFFFF" property int cell_text_size: 11 - property color separator_color: "#3C435A" - property color cell_background_color: "#333C435A" - property color selected_cell_background_color: "#22293B" - property color header_background_color: "#333C435A" - property var columnWidths: [350, 100, 120, 100] columnWidthProvider: function (column) { return (column === (columnWidths.length @@ -52,7 +46,7 @@ TableView { delegate: Rectangle { implicitHeight: 34 - color: row === 0 ? component.header_background_color : (row === selected_row_index ? component.selected_cell_background_color : component.cell_background_color) + color: row === 0 ? BSStyle.tableCellBackgroundColor : (row === selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor) Row { anchors.fill: parent @@ -61,7 +55,7 @@ TableView { id: internal_text text: tableData - color: row === 0 ? component.text_header_color : component.cell_text_color + color: row === 0 ? BSStyle.titleTextColor : BSStyle.textColor font.family: "Roboto" font.weight: Font.Normal font.pixelSize: row === 0 ? component.text_header_size : component.cell_text_size @@ -84,7 +78,7 @@ TableView { ToolTip { id: tool_tip timeout: 1000 - text: "Copied" + text: qsTr("Copied") font.pixelSize: 10 font.family: "Roboto" @@ -93,12 +87,12 @@ TableView { contentItem: Text { text: tool_tip.text font: tool_tip.font - color: "#FFFFFF" + color: BSStyle.textColor } background: Rectangle { - color: "#191E2A" - border.color: "#3C435A" + color: BSStyle.buttonsStandardColor + border.color: BSStyle.buttonsStandardColor border.width: 1 radius: 14 } @@ -115,7 +109,7 @@ TableView { Rectangle { height: 1 width: parent.width - color: component.separator_color + color: BSStyle.tableSeparatorColor anchors.bottom: parent.bottom } diff --git a/GUI/QtQuick/qml/Overview/BalanceBar.qml b/GUI/QtQuick/qml/Overview/BalanceBar.qml index abe16bdd1..766d6b5fa 100644 --- a/GUI/QtQuick/qml/Overview/BalanceBar.qml +++ b/GUI/QtQuick/qml/Overview/BalanceBar.qml @@ -10,6 +10,7 @@ */ import QtQuick 2.15 +import "../BsStyles" import "." as OverviewControls Rectangle { @@ -17,7 +18,7 @@ Rectangle { width: 520 height: 100 - color: "#191E2A" + color: "transparent" property alias confirmed_balance_value: confirmed_balance.label_value property alias uncorfirmed_balance_value: unconfirmed_balance.label_value @@ -25,7 +26,6 @@ Rectangle { property alias used_addresses_value: used_addresses.label_value property int spacer_height: 36 - property color spacer_color: "#3C435A" Row { anchors.fill: parent @@ -34,48 +34,48 @@ Rectangle { OverviewControls.BaseBalanceLabel { id: confirmed_balance width: 130 - label_text: "Confirmed balance" + label_text: qsTr("Confirmed balance") anchors.verticalCenter: parent.verticalCenter } Rectangle { width: 1 height: control.spacer_height - color: control.spacer_color + color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } OverviewControls.BaseBalanceLabel { id: unconfirmed_balance width: 140 - label_text: "Unconfirmed balance" + label_text: qsTr("Unconfirmed balance") anchors.verticalCenter: parent.verticalCenter } Rectangle { width: 1 height: control.spacer_height - color: control.spacer_color + color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } OverviewControls.BaseBalanceLabel { id: total_balance width: 120 - label_text: "Total balance" + label_text: qsTr("Total balance") anchors.verticalCenter: parent.verticalCenter } Rectangle { width: 1 height: control.spacer_height - color: control.spacer_color + color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } OverviewControls.BaseBalanceLabel { id: used_addresses - label_text: "#Used addresses" + label_text: qsTr("#Used addresses") value_suffix: "" anchors.verticalCenter: parent.verticalCenter } diff --git a/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml b/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml index 83d833a1f..56e1a63f6 100644 --- a/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml +++ b/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml @@ -10,23 +10,23 @@ */ import QtQuick 2.15 +import "../BsStyles" + Rectangle { id: control - property string label_text: "Confirmed balance" - property color label_text_color: "#7A88B0" + property string label_text property int label_text_font_size: 12 - property string label_value: "0.00999889" - property color label_value_color: "#E2E7FF" + property string label_value property int label_value_font_size: 13 - property string value_suffix: "BTC" + property string value_suffix property int left_text_padding: 10 width: 120 height: 53 - color: "#191E2A" + color: "transparent" Column { anchors.verticalCenter: parent.verticalCenter @@ -36,7 +36,7 @@ Rectangle { text: control.label_text leftPadding: control.left_text_padding - color: control.label_text_color + color: BSStyle.titleTextColor font.pixelSize: control.label_text_font_size } @@ -44,7 +44,7 @@ Rectangle { text: control.label_value + " " + control.value_suffix leftPadding: control.left_text_padding - color: control.label_value_color + color: BSStyle.balanceValueTextColor font.weight: Font.Medium font.pixelSize: control.label_value_font_size } diff --git a/GUI/QtQuick/qml/Overview/BaseCombobox.qml b/GUI/QtQuick/qml/Overview/BaseCombobox.qml deleted file mode 100644 index c68ffa935..000000000 --- a/GUI/QtQuick/qml/Overview/BaseCombobox.qml +++ /dev/null @@ -1,154 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2.15 -import QtQuick.Controls 2.3 - -ComboBox { - id: control - - width: 263 - height: 53 - - property color font_color: "#ffffff" - - property color hightligh_color: "gray" - property color background_color: "#020817" - property color background_border_color: "#3C435A" - property int background_border_width: 1 - property int background_radius: 14 - - property int text_margin: 16 - property int text_size: 14 - - property int indicator_width: 10 - property int indicator_height: 6 - property color indicator_fill_color: "#DCE2FF" - - model: ['Alex wallet', 'B', 'C', 'D'] - - activeFocusOnTab: true - - font.pixelSize: 14 - font.family: "Roboto" - font.weight: Font.Normal - - contentItem: Rectangle { - - width: control.width - height: control.height - color: "transparent" - - Text { - text: control.currentText - color: control.font_color - font: control.font - verticalAlignment: Text.AlignVCenter - - anchors.fill: parent - anchors.margins: control.text_margin - } - } - - background: Rectangle { - color: control.background_color - radius: control.background_radius - - border.color: control.background_border_color - border.width: control.background_border_width - } - - indicator: Canvas { - id: indicator_shape - - width: control.indicator_width - height: control.indicator_height - - anchors.margins: control.text_margin - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - - - transform: Rotation { - origin.x: control.popup.visible ? indicator_shape.width / 2 : 0 - origin.y: control.popup.visible ? indicator_shape.height / 2 : 0 - angle: control.popup.visible ? 180 : 0 - } - - onPaint: { - var ctx = getContext("2d") - ctx.lineWidth = 1 - ctx.strokeStyle = "transparent" - ctx.fillStyle = control.indicator_fill_color - - ctx.beginPath() - ctx.moveTo(0, 0) - ctx.lineTo(indicator_shape.width,0) - ctx.lineTo(indicator_shape.width / 2, indicator_shape.height) - ctx.lineTo(0, 0) - ctx.closePath() - ctx.fill() - ctx.stroke() - } - } - - delegate: ItemDelegate { - id: delegate_item - - width: control.width - height: 27 - - contentItem: Rectangle { - radius: control.background_radius - color: delegate_item.highlighted ? "#3345A6FF": "transparent" - - anchors.fill: parent - anchors.margins: 4 - - Text { - text: model[textRole] - color: delegate_item.highlighted ? "#45A6FF" : "black" - - font: control.font - verticalAlignment: Text.AlignVCenter - - anchors.fill: parent - anchors.margins: control.text_margin - parent.anchors.margins - } - } - - background: Rectangle { - color: 'transparent' - } - - highlighted: control.highlightedIndex === index - } - - popup: Popup { - y: control.height - width: control.width - padding: 0 - - contentItem: ListView { - clip: true - implicitHeight: contentHeight - model: control.popup.visible ? control.delegateModel : null - currentIndex: control.highlightedIndex - - ScrollIndicator.vertical: ScrollIndicator { } - } - - background: Rectangle { - color: "#FFFFFFFF" - radius: control.background_radius - } - } -} - diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 394ea6c10..96c7ca0d3 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -10,6 +10,7 @@ */ import QtQuick 2.15 +import "../BsStyles" import "." as OverviewControls Rectangle { @@ -17,7 +18,7 @@ Rectangle { width: 1200 height: 788 - color: "#191E2A" + color: "transparent" signal copyWallet(var id) signal requestWalletProperties() @@ -45,9 +46,9 @@ Rectangle { anchors.horizontalCenter: parent.horizontalCenter radius: 16 - color: "#333C435A" + color: BSStyle.addressesPanelBackgroundColor border.width: 1 - border.color: "#3C435A" + border.color: BSStyle.tableSeparatorColor Column { anchors.fill: parent @@ -55,8 +56,8 @@ Rectangle { spacing: 10 Text { - text: "Addresses" - color: "#FFFFFF" + text: qsTr("Addresses") + color: BSStyle.textColor font.pixelSize: 19 font.family: "Roboto" font.weight: Font.DemiBold @@ -67,9 +68,6 @@ Rectangle { width: parent.width height: parent.height - 40 - header_background_color: "transparent" - cell_background_color: "transparent" - model: addressListModel onCopyRequested: control.copyWallet(id) @@ -88,8 +86,8 @@ Rectangle { spacing: 10 Text { - text: "Non-settled Transactions" - color: "#FFFFFF" + text: qsTr("Non-settled Transactions") + color: BSStyle.textColor font.pixelSize: 19 font.family: "Roboto" font.weight: Font.DemiBold @@ -101,8 +99,6 @@ Rectangle { height: parent.height - 40 has_copy: false - header_background_color: "transparent" - cell_background_color: "transparent" columnWidths: [150, 150, 150, 150, 150, 150, 150, 150] model: pendingTxListModel diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index df85af2a2..f87239aea 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -12,13 +12,14 @@ import QtQuick 2.15 import wallet.balance 1.0 import "." as OverviewControls +import "../StyledControls" as Controls Rectangle { id: control width: 1200 height: 100 - color: "#191E2A" + color: "transparent" signal requestWalletProperties() signal createNewWallet() @@ -28,10 +29,13 @@ Rectangle { anchors.fill:parent spacing: 20 - OverviewControls.BaseCombobox { + Controls.CustomComboBox { id: wallet_selection_combobox anchors.verticalCenter: parent.verticalCenter + width: 263 + height: 53 + objectName: "walletsComboBox" model: walletBalances textRole: "name" @@ -42,8 +46,8 @@ Rectangle { } onActivated: (ind) => { - control.walletIndexChanged(ind) - } + control.walletIndexChanged(ind) + } } OverviewControls.BalanceBar { @@ -51,11 +55,11 @@ Rectangle { anchors.verticalCenter: parent.verticalCenter confirmed_balance_value: walletBalances.data(walletBalances.index(wallet_selection_combobox.currentIndex, 0), - WalletBalance.ConfirmedRole).toFixed(5) + WalletBalance.ConfirmedRole) uncorfirmed_balance_value: walletBalances.data(walletBalances.index(wallet_selection_combobox.currentIndex, 0), - WalletBalance.UnconfirmedRole).toFixed(5) + WalletBalance.UnconfirmedRole) total_balance_value: walletBalances.data(walletBalances.index(wallet_selection_combobox.currentIndex, 0), - WalletBalance.TotalRole).toFixed(5) + WalletBalance.TotalRole) used_addresses_value: walletBalances.data(walletBalances.index(wallet_selection_combobox.currentIndex, 0), WalletBalance.NbAddrRole) } @@ -66,12 +70,12 @@ Rectangle { anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - OverviewControls.BaseWalletButton { + Controls.CustomButton2 { text: "Wallet properties" onClicked: control.requestWalletProperties() } - OverviewControls.BaseWalletButton { + Controls.CustomButton2 { text: "Create new wallet" onClicked: control.createNewWallet() } diff --git a/GUI/QtQuick/qml/Overview/BaseWalletButton.qml b/GUI/QtQuick/qml/StyledControls/CustomButton2.qml similarity index 76% rename from GUI/QtQuick/qml/Overview/BaseWalletButton.qml rename to GUI/QtQuick/qml/StyledControls/CustomButton2.qml index 5ff7d301d..dc256394a 100644 --- a/GUI/QtQuick/qml/Overview/BaseWalletButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButton2.qml @@ -11,13 +11,13 @@ import QtQuick 2.15 import QtQuick.Controls 2.3 +import "../BsStyles" + Button { id: control - property color background_color: "#32394F" - property color background_border_color: "white" + property color background_color: BSStyle.buttonsDisabledColor property int background_radius: 14 - property int background_border_size: 0 text: "Wallet properties" @@ -32,14 +32,13 @@ Button { color: control.background_color radius: control.background_radius - border.width: control.background_border_size - border.color: control.background_border_color + border.width: 0 } contentItem: Text { text: control.text font: control.font - color: "#FFFFFF" + color: BSStyle.textColor horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 2f3fef0af..bf3904324 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -112,13 +112,10 @@ qml/StyledControls/CustomCompleterPopup.qml qml/Pin/PinEntriesPopup.qml qml/Pin/qmldir - images/clear.png - + qml/StyledControls/CustomButton2.qml qml/Overview/AddressesTableView.qml qml/Overview/BalanceBar.qml qml/Overview/BaseBalanceLabel.qml - qml/Overview/BaseCombobox.qml - qml/Overview/BaseWalletButton.qml qml/Overview/OverviewPanel.qml qml/Overview/OverviewWalletBar.qml images/overview/copy_button.svg From b183bee5225315ac51b989505195282b9e856d5e Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 1 Feb 2023 03:04:10 +0200 Subject: [PATCH 102/436] qml: add PasswordEntry.qml --- GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml | 197 +++++++++++++++++++++ GUI/QtQuick/qml/Pin/PinEntriesPopup.qml | 2 +- GUI/QtQuick/qml/main.qml | 17 ++ GUI/QtQuick/qtquick.qrc | 1 + 4 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml diff --git a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml new file mode 100644 index 000000000..f7b8f58dc --- /dev/null +++ b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml @@ -0,0 +1,197 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +Window { + id: root + + visible: true + flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog + modality: Qt.WindowModal + + maximumHeight: rect.height + maximumWidth: rect.width + + minimumHeight: rect.height + minimumWidth: rect.width + + height: rect.height + width: rect.width + + color: "transparent" + + x: mainWindow.x + (mainWindow.width - width)/2 + y: mainWindow.y + 28 + + property string device_name + property bool accept_on_device + + Rectangle { + id: rect + + color: "#191E2A" + opacity: 1 + radius: 16 + height: 510 + width: 430 + border.color : "#3C435A" + border.width : 1 + + Image { + id: close_button + + anchors.top: parent.top + anchors.topMargin: 24 + anchors.right: parent.right + anchors.rightMargin: 24 + + source: "qrc:/images/close_button.png" + width: 16 + height: 16 + MouseArea { + anchors.fill: parent + onClicked: { + root.clean() + root.close() + } + } + } + + CustomTitleLabel { + id: title + + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + anchors.topMargin: 36 + + text: qsTr("Enter Password") + } + + Label { + + id: device_name_title_lbl + + anchors.top: title.bottom + anchors.topMargin: 48 + anchors.left: parent.left + anchors.leftMargin: 20 + + text: qsTr("Device name:") + + color: "#45A6FF" + + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: device_name_lbl + + anchors.top: title.bottom + anchors.topMargin: 48 + anchors.right: parent.right + anchors.rightMargin: 20 + + text: device_name + + color: "#45A6FF" + + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Normal + } + + CustomTextInput { + id: password + + anchors.top: device_name_lbl.bottom + anchors.topMargin: 48 + anchors.horizontalCenter: parent.horizontalCenter + + visible: !root.accept_on_device + + height : 70 + width: 390 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + + title_text: qsTr("Password") + + Component.onCompleted: { + password.isPassword = true + password.isHiddenText = true + } + } + + RowLayout { + id: row + spacing: 10 + + anchors.bottom: parent.bottom + anchors.bottomMargin: 40 + anchors.horizontalCenter: parent.horizontalCenter + + CustomButton { + id: cancel_but + text: qsTr("Cancel") + width: 190 + + Component.onCompleted: { + copy_seed_but.preferred = false + } + function click_enter() { + root.clean() + root.close() + } + } + + CustomButton { + id: accept_but + text: qsTr("Accept") + width: 190 + + enabled: accept_on_device || password.input_text.length + + Component.onCompleted: { + accept_but.preferred = true + } + + function click_enter() { + bsApp.setHWpassword(password.input_text) + root.clean() + root.close() + } + + } + } + + + Keys.onEnterPressed: { + accept_but.click_enter() + } + + Keys.onReturnPressed: { + accept_but.click_enter() + } + + } + + function init() { + clean() + } + + function clean() { + password.input_text = "" + device_name = "" + accept_on_device = false + } + +} diff --git a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml index 36d125f66..31dd422c9 100644 --- a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml +++ b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml @@ -57,7 +57,7 @@ Window { MouseArea { anchors.fill: parent onClicked: { - output = "" + root.clean() root.close() } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 9062e9181..ec1b9b5e2 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -64,6 +64,11 @@ ApplicationWindow { visible: false } + PasswordEntryPopup { + id: password_popup + visible: false + } + Connections { target:bsApp @@ -74,6 +79,17 @@ ApplicationWindow { pin_popup.raise() pin_popup.requestActivate() } + + function onInvokePasswordEntry(devName, acceptOnDevice) + { + password_popup.device_name = devName + password_popup.accept_on_device = acceptOnDevice + password_popup.init() + password_popup.show() + password_popup.raise() + password_popup.requestActivate() + } + function onShowError(text) { ibFailure.displayMessage(text) @@ -390,4 +406,5 @@ ApplicationWindow { { return feeSuggestions.data(feeSuggestions.index(index, 0), role) } + } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 7ce03d5a5..392a32411 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -112,5 +112,6 @@ qml/StyledControls/CustomCompleterPopup.qml qml/Pin/PinEntriesPopup.qml qml/Pin/qmldir + qml/Pin/PasswordEntryPopup.qml From 54210f3327dfb660d7374c9f649e5850ae11e419 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 1 Feb 2023 10:33:47 +0300 Subject: [PATCH 103/436] remove obsoleted data_ --- BlockSettleHW/jade/jadeDevice.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/BlockSettleHW/jade/jadeDevice.h b/BlockSettleHW/jade/jadeDevice.h index c4efb52fa..1c5c6dc57 100644 --- a/BlockSettleHW/jade/jadeDevice.h +++ b/BlockSettleHW/jade/jadeDevice.h @@ -36,7 +36,6 @@ namespace bs { , bool testNet, DeviceCallbacks*, const std::string& endpoint); ~JadeDevice() override; - trezor::DeviceData data() const { return data_; } DeviceKey key() const override; DeviceType type() const override; @@ -79,7 +78,6 @@ namespace bs { private: std::shared_ptr logger_; - const trezor::DeviceData data_; const bool testNet_; DeviceCallbacks* cb_{ nullptr }; const std::string endpoint_; From e8540c58a5d0cb57a1824bbab2c8c99f9045e773 Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 1 Feb 2023 11:58:52 +0100 Subject: [PATCH 104/436] NST table UI hotfix --- .../qml/Overview/AddressesTableView.qml | 10 +- GUI/QtQuick/qml/Overview/NSTTableView.qml | 97 +++++++++++++++++++ GUI/QtQuick/qml/Overview/OverviewPanel.qml | 6 +- GUI/QtQuick/qtquick.qrc | 1 + 4 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 GUI/QtQuick/qml/Overview/NSTTableView.qml diff --git a/GUI/QtQuick/qml/Overview/AddressesTableView.qml b/GUI/QtQuick/qml/Overview/AddressesTableView.qml index a2e292129..4efe501ef 100644 --- a/GUI/QtQuick/qml/Overview/AddressesTableView.qml +++ b/GUI/QtQuick/qml/Overview/AddressesTableView.qml @@ -26,8 +26,6 @@ TableView { signal copyRequested(var id) - property bool has_copy: true - property int text_header_size: 10 property int cell_text_size: 11 @@ -54,6 +52,9 @@ TableView { Text { id: internal_text text: tableData + height: parent.height + wrapMode: Text.Wrap + verticalAlignment: Text.AlignVCenter color: row === 0 ? BSStyle.titleTextColor : BSStyle.textColor font.family: "Roboto" @@ -61,14 +62,13 @@ TableView { font.pixelSize: row === 0 ? component.text_header_size : component.cell_text_size leftPadding: 10 - - anchors.verticalCenter: parent.verticalCenter } Image { + id: copy_icon width: 24 height: 24 - visible: column === 0 && row == selected_row_index && component.has_copy + visible: column === 0 && row == selected_row_index anchors.verticalCenter: parent.verticalCenter source: "qrc:/images/overview/copy_button.svg" diff --git a/GUI/QtQuick/qml/Overview/NSTTableView.qml b/GUI/QtQuick/qml/Overview/NSTTableView.qml new file mode 100644 index 000000000..3a4b9453b --- /dev/null +++ b/GUI/QtQuick/qml/Overview/NSTTableView.qml @@ -0,0 +1,97 @@ + +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import "../BsStyles" + +TableView { + id: component + width: 1200 + height: 200 + + columnSpacing: 0 + rowSpacing: 0 + clip: true + boundsBehavior: Flickable.StopAtBounds + + property int text_header_size: 10 + property int cell_text_size: 10 + + property var columnWidths: [100, 120, 100, 300, 120, 80, 80, 100] + columnWidthProvider: function (column) { + return (column === (columnWidths.length + - 1)) ? Math.max( + columnWidths[column], + component.width - columnWidths.reduce( + (sum, a) => sum + a, + 0) + columnWidths.slice( + -1)[0]) : columnWidths[column] + } + + property int selected_row_index: -1 + + delegate: Rectangle { + implicitHeight: 34 + color: row === 0 ? BSStyle.tableCellBackgroundColor : (row === selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor) + + Row { + anchors.fill: parent + + Text { + id: internal_text + anchors.fill: parent + wrapMode: Text.Wrap + verticalAlignment: Text.AlignVCenter + text: tableData + clip: true + + color: dataColor + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: row === 0 ? component.text_header_size : component.cell_text_size + + leftPadding: 10 + + } + } + + Rectangle { + height: 1 + width: parent.width + color: BSStyle.tableSeparatorColor + + anchors.bottom: parent.bottom + } + + MouseArea { + anchors.fill: parent + preventStealing: true + propagateComposedEvents: true + hoverEnabled: true + + onClicked: mouse.accepted = false + + onEntered: { + if (row !== 0) { + component.selected_row_index = row + } + } + + onExited: { + if (row !== 0) { + component.selected_row_index = -1 + } + } + } + } +} diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 96c7ca0d3..8fb98da2b 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -94,13 +94,9 @@ Rectangle { } - OverviewControls.AddressesTableView { + OverviewControls.NSTTableView { width: parent.width height: parent.height - 40 - - has_copy: false - - columnWidths: [150, 150, 150, 150, 150, 150, 150, 150] model: pendingTxListModel } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index ace5ccaed..87842ac96 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -114,6 +114,7 @@ qml/Pin/qmldir qml/StyledControls/CustomButton2.qml qml/Overview/AddressesTableView.qml + qml/Overview/NSTTableView.qml qml/Overview/BalanceBar.qml qml/Overview/BaseBalanceLabel.qml qml/Overview/OverviewPanel.qml From 2e944d90665c7cde8165c8561eef61080249f91e Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 1 Feb 2023 15:38:44 +0200 Subject: [PATCH 105/436] qml: password: fix bugs --- GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml index f7b8f58dc..ce07e733a 100644 --- a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml +++ b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml @@ -98,9 +98,11 @@ Window { anchors.right: parent.right anchors.rightMargin: 20 + horizontalAlignment: Text.AlignRight + text: device_name - color: "#45A6FF" + color: "#E2E7FF" font.pixelSize: 16 font.family: "Roboto" From 37b11555c54bd801ed7438b6c84aff8b2ee403de Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 1 Feb 2023 15:50:09 +0200 Subject: [PATCH 106/436] qml: fix tabulation --- .../StyledControls/CustomMessageDialog.qml | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml index dd5cbea12..54219f294 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml @@ -40,37 +40,37 @@ Window { border.width : 1 Label { - id: tytleLabel + id: tytleLabel - anchors.top: rect.top - anchors.topMargin: 8 - anchors.horizontalCenter: rect.horizontalCenter + anchors.top: rect.top + anchors.topMargin: 8 + anchors.horizontalCenter: rect.horizontalCenter - color: "#E2E7FF" - font.pixelSize: 20 - font.family: "Roboto" - font.weight: Font.Medium + color: "#E2E7FF" + font.pixelSize: 20 + font.family: "Roboto" + font.weight: Font.Medium - text: "Error" + text: "Error" - horizontalAlignment: Text.AlignHCenter + horizontalAlignment: Text.AlignHCenter } Label { - id: errorLabel + id: errorLabel - anchors.bottom: ok_but.top - anchors.bottomMargin: 70 - anchors.horizontalCenter: rect.horizontalCenter + anchors.bottom: ok_but.top + anchors.bottomMargin: 70 + anchors.horizontalCenter: rect.horizontalCenter - color: "#E2E7FF" - font.pixelSize: 16 - font.family: "Roboto" - font.weight: Font.Medium + color: "#E2E7FF" + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Medium - text: "Test Description" + text: "Test Description" - horizontalAlignment: Text.AlignHCenter + horizontalAlignment: Text.AlignHCenter } CustomButton { From cb1821ccbc3a08a0db28055977cd76bf08a918a6 Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 2 Feb 2023 00:11:00 +0100 Subject: [PATCH 107/436] Beautifying transactions page --- GUI/QtQuick/images/calendar_icon.svg | 3 + GUI/QtQuick/images/combobox_open_button.svg | 3 + GUI/QtQuick/images/copy_icon.png | Bin 291 -> 0 bytes .../copy_button.svg => copy_icon.svg} | 0 GUI/QtQuick/images/download_icon.svg | 5 + GUI/QtQuick/images/search_icon.svg | 3 + .../qml/Overview/AddressesTableView.qml | 5 +- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 3 +- .../qml/Overview/OverviewWalletBar.qml | 4 +- GUI/QtQuick/qml/Receive/ReceiveQrCode.qml | 2 +- .../StyledControls/CustomButtonLeftIcon.qml | 38 ++++ .../StyledControls/CustomButtonRightIcon.qml | 25 +++ .../qml/StyledControls/CustomComboBox.qml | 10 +- ...stomButton2.qml => CustomMediumButton.qml} | 2 - .../qml/StyledControls/CustomSmallButton.qml | 45 +++++ .../StyledControls/CustomSmallComboBox.qml | 38 ++++ .../TransactionsTableView.qml} | 54 +++++- GUI/QtQuick/qml/TransactionsPage.qml | 163 +++++++++--------- GUI/QtQuick/qtquick.qrc | 17 +- 19 files changed, 322 insertions(+), 98 deletions(-) create mode 100644 GUI/QtQuick/images/calendar_icon.svg create mode 100644 GUI/QtQuick/images/combobox_open_button.svg delete mode 100644 GUI/QtQuick/images/copy_icon.png rename GUI/QtQuick/images/{overview/copy_button.svg => copy_icon.svg} (100%) create mode 100644 GUI/QtQuick/images/download_icon.svg create mode 100644 GUI/QtQuick/images/search_icon.svg create mode 100644 GUI/QtQuick/qml/StyledControls/CustomButtonLeftIcon.qml create mode 100644 GUI/QtQuick/qml/StyledControls/CustomButtonRightIcon.qml rename GUI/QtQuick/qml/StyledControls/{CustomButton2.qml => CustomMediumButton.qml} (97%) create mode 100644 GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml create mode 100644 GUI/QtQuick/qml/StyledControls/CustomSmallComboBox.qml rename GUI/QtQuick/qml/{Overview/NSTTableView.qml => Transactions/TransactionsTableView.qml} (60%) diff --git a/GUI/QtQuick/images/calendar_icon.svg b/GUI/QtQuick/images/calendar_icon.svg new file mode 100644 index 000000000..04aaa6f51 --- /dev/null +++ b/GUI/QtQuick/images/calendar_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/images/combobox_open_button.svg b/GUI/QtQuick/images/combobox_open_button.svg new file mode 100644 index 000000000..e987229de --- /dev/null +++ b/GUI/QtQuick/images/combobox_open_button.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/images/copy_icon.png b/GUI/QtQuick/images/copy_icon.png deleted file mode 100644 index f41388ca64710b780eaafab0a5862a7c073afeb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#9iA?ZAr*{orxZo?GL*K^mI?y+zCW;ZkU%@6sCx9=AwY4M-1)DVjL;G6H1>F~C7 zSJv6-ch)rg3=1#&u5wc diff --git a/GUI/QtQuick/images/overview/copy_button.svg b/GUI/QtQuick/images/copy_icon.svg similarity index 100% rename from GUI/QtQuick/images/overview/copy_button.svg rename to GUI/QtQuick/images/copy_icon.svg diff --git a/GUI/QtQuick/images/download_icon.svg b/GUI/QtQuick/images/download_icon.svg new file mode 100644 index 000000000..36c08f22f --- /dev/null +++ b/GUI/QtQuick/images/download_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/GUI/QtQuick/images/search_icon.svg b/GUI/QtQuick/images/search_icon.svg new file mode 100644 index 000000000..5ab55aa00 --- /dev/null +++ b/GUI/QtQuick/images/search_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/qml/Overview/AddressesTableView.qml b/GUI/QtQuick/qml/Overview/AddressesTableView.qml index 4efe501ef..7ec6418bb 100644 --- a/GUI/QtQuick/qml/Overview/AddressesTableView.qml +++ b/GUI/QtQuick/qml/Overview/AddressesTableView.qml @@ -24,6 +24,9 @@ TableView { clip: true boundsBehavior: Flickable.StopAtBounds + ScrollBar.horizontal: ScrollBar { } + ScrollBar.vertical: ScrollBar { } + signal copyRequested(var id) property int text_header_size: 10 @@ -70,7 +73,7 @@ TableView { height: 24 visible: column === 0 && row == selected_row_index anchors.verticalCenter: parent.verticalCenter - source: "qrc:/images/overview/copy_button.svg" + source: "qrc:/images/copy_icon.svg" MouseArea { anchors.fill: parent diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 8fb98da2b..7e0a8cfbd 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -12,6 +12,7 @@ import QtQuick 2.15 import "../BsStyles" import "." as OverviewControls +import "../Transactions" Rectangle { id: control @@ -94,7 +95,7 @@ Rectangle { } - OverviewControls.NSTTableView { + TransactionsTableView { width: parent.width height: parent.height - 40 model: pendingTxListModel diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index f87239aea..5111d7c56 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -70,12 +70,12 @@ Rectangle { anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - Controls.CustomButton2 { + Controls.CustomMediumButton { text: "Wallet properties" onClicked: control.requestWalletProperties() } - Controls.CustomButton2 { + Controls.CustomMediumButton { text: "Create new wallet" onClicked: control.createNewWallet() } diff --git a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml index c4a483464..b8a8bd27e 100644 --- a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml +++ b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml @@ -91,7 +91,7 @@ ColumnLayout { text: qsTr("Copy to clipboard") - icon.source: "qrc:/images/copy_icon.png" + icon.source: "qrc:/images/copy_icon.svg" icon.width: 24 icon.height: 24 icon.color: "#FFFFFF" diff --git a/GUI/QtQuick/qml/StyledControls/CustomButtonLeftIcon.qml b/GUI/QtQuick/qml/StyledControls/CustomButtonLeftIcon.qml new file mode 100644 index 000000000..06f3cfbc1 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomButtonLeftIcon.qml @@ -0,0 +1,38 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.3 + +import "../BsStyles" + +CustomSmallButton { + id: control + + property alias custom_icon: icon_item + + Image { + id: icon_item + width: 10 + height: 10 + anchors.left: parent.left + anchors.leftMargin: 14 + anchors.verticalCenter: parent.verticalCenter + } + + contentItem: Text { + text: control.text + font: control.font + color: BSStyle.titleTextColor + verticalAlignment: Text.AlignVCenter + + leftPadding: icon_item.width + 10 + } +} \ No newline at end of file diff --git a/GUI/QtQuick/qml/StyledControls/CustomButtonRightIcon.qml b/GUI/QtQuick/qml/StyledControls/CustomButtonRightIcon.qml new file mode 100644 index 000000000..cbdfea574 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomButtonRightIcon.qml @@ -0,0 +1,25 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.3 + +import "../BsStyles" + +CustomSmallButton { + property alias custom_icon: icon_item + + Image { + id: icon_item + anchors.right: parent.right + anchors.rightMargin: 14 + anchors.verticalCenter: parent.verticalCenter + } +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml index 22d028e37..a2e9a032e 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml @@ -16,7 +16,9 @@ ComboBox { id: control property alias title_text: title.text - property alias details_text: details.text + property alias details_text: details.text + property int fontSize: 16 + property color fontColor: "#FFFFFF" activeFocusOnTab: true @@ -75,11 +77,11 @@ ComboBox { width: details.text.length ? parent.width - details.width - 16 : parent.width height: 19 - font.pixelSize: 16 + font.pixelSize: control.fontSize font.family: "Roboto" font.weight: Font.Normal - color: "#FFFFFF" + color: control.fontColor text: control.currentText clip: true @@ -150,7 +152,7 @@ ComboBox { ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData color: menuItem.highlighted ? BSStyle.comboBoxItemTextHighlightedColor : ( menuItem.currented ? BSStyle.comboBoxItemTextCurrentColor : BSStyle.comboBoxItemTextColor) - font.pixelSize: 16 + font.pixelSize: control.fontSize font.family: "Roboto" font.weight: Font.Normal diff --git a/GUI/QtQuick/qml/StyledControls/CustomButton2.qml b/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml similarity index 97% rename from GUI/QtQuick/qml/StyledControls/CustomButton2.qml rename to GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml index dc256394a..8e83ab4cd 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButton2.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml @@ -19,8 +19,6 @@ Button { property color background_color: BSStyle.buttonsDisabledColor property int background_radius: 14 - text: "Wallet properties" - width: 136 height: 36 diff --git a/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml new file mode 100644 index 000000000..089b77d68 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml @@ -0,0 +1,45 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.3 + +import "../BsStyles" + +Button { + id: control + + width: 134 + height: 29 + + hoverEnabled: true + font.pixelSize: 11 + font.family: "Roboto" + font.weight: Font.Normal + + background: Rectangle { + color: "#020817" + radius: 14 + + border.color: + (control.hovered ? BSStyle.comboBoxHoveredBorderColor : + (control.activeFocus ? BSStyle.comboBoxFocusedBorderColor : BSStyle.comboBoxBorderColor)) + border.width: 1 + } + + contentItem: Text { + text: control.text + font: control.font + color: BSStyle.titleTextColor + verticalAlignment: Text.AlignVCenter + + leftPadding: 4 + } +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomSmallComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomSmallComboBox.qml new file mode 100644 index 000000000..a85ac980e --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomSmallComboBox.qml @@ -0,0 +1,38 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.9 +import QtQuick.Controls 2.3 + +import "../BsStyles" +import "." + +CustomComboBox { + id: control + + fontSize: 11 + fontColor: BSStyle.titleTextColor + + leftPadding: 10 + rightPadding: 0 + topPadding: 0 + bottomPadding: 2 + + indicator: Image { + width: 6 + height: 3 + anchors.verticalCenter: parent.verticalCenter + source: "qrc:/images/combobox_open_button.svg" + + anchors.right: parent.right + anchors.rightMargin: 14 + } +} + diff --git a/GUI/QtQuick/qml/Overview/NSTTableView.qml b/GUI/QtQuick/qml/Transactions/TransactionsTableView.qml similarity index 60% rename from GUI/QtQuick/qml/Overview/NSTTableView.qml rename to GUI/QtQuick/qml/Transactions/TransactionsTableView.qml index 3a4b9453b..80d6c8da7 100644 --- a/GUI/QtQuick/qml/Overview/NSTTableView.qml +++ b/GUI/QtQuick/qml/Transactions/TransactionsTableView.qml @@ -24,10 +24,15 @@ TableView { clip: true boundsBehavior: Flickable.StopAtBounds - property int text_header_size: 10 - property int cell_text_size: 10 + ScrollBar.horizontal: ScrollBar { } + ScrollBar.vertical: ScrollBar { } - property var columnWidths: [100, 120, 100, 300, 120, 80, 80, 100] + signal copyRequested(var id) + + property int text_header_size: 11 + property int cell_text_size: 12 + + property var columnWidths: [150, 120, 100, 350, 120, 80, 80, 80] columnWidthProvider: function (column) { return (column === (columnWidths.length - 1)) ? Math.max( @@ -49,10 +54,10 @@ TableView { Text { id: internal_text + text: tableData anchors.fill: parent wrapMode: Text.Wrap verticalAlignment: Text.AlignVCenter - text: tableData clip: true color: dataColor @@ -61,7 +66,48 @@ TableView { font.pixelSize: row === 0 ? component.text_header_size : component.cell_text_size leftPadding: 10 + } + Image { + id: copy_icon + x: internal_text.contentWidth + copy_icon.width / 2 + width: 24 + height: 24 + visible: column === 3 && row == selected_row_index + anchors.verticalCenter: parent.verticalCenter + source: "qrc:/images/copy_icon.svg" + + MouseArea { + anchors.fill: parent + + ToolTip { + id: tool_tip + timeout: 1000 + text: qsTr("Copied") + + font.pixelSize: 10 + font.family: "Roboto" + font.weight: Font.Normal + + contentItem: Text { + text: tool_tip.text + font: tool_tip.font + color: BSStyle.textColor + } + + background: Rectangle { + color: BSStyle.buttonsStandardColor + border.color: BSStyle.buttonsStandardColor + border.width: 1 + radius: 14 + } + } + + onClicked: { + component.copyRequested(tableData) + tool_tip.visible = true + } + } } } diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 8afaa811f..e174cb0a3 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -16,6 +16,7 @@ import QtQuick.Dialogs 1.3 import "StyledControls" import "BsStyles" +import "Transactions" as Transactions //import "BsControls" //import "BsDialogs" //import "js/helper.js" as JsHelper @@ -44,99 +45,103 @@ Item { Column { spacing: 23 anchors.fill: parent + anchors.margins: 18 Row { + width: parent.width + height: 45 spacing: 15 Label { - text: qsTr("Transactions list (%1)").arg(txListModel.nbTx) - font.pointSize: 14 - } - Item { // spacer item - Layout.fillWidth: true - Layout.fillHeight: true - Rectangle { anchors.fill: parent; color: "#ffaaaa" } - } - ComboBox { - id: txWalletsComboBox - objectName: "txWalletsComboBox" - model: bsApp.txWalletsList - font.pointSize: 8 - } - ComboBox { - id: txTypesComboBox - objectName: "txTypesComboBox" - model: bsApp.txTypesList - font.pointSize: 8 - } - Button { - text: qsTr("From") - font.pointSize: 8 - } - Label { - text: qsTr("-") - font.pointSize: 12 - } - Button { - text: qsTr("To") - font.pointSize: 8 + text: qsTr("Transactions list") + font.pixelSize: 20 + font.weight: Font.Bold + color: BSStyle.textColor + + anchors.verticalCenter: parent.verticalCenter } - TextEdit { - id: txSearchBox - width: 75 - height: 32 - Text { - text: qsTr("Search") - color: 'darkgrey' - visible: !txSearchBox.text && !txSearchBox.activeFocus + + Row + { + spacing: 8 + height: parent.height + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + + CustomSmallComboBox { + id: txWalletsComboBox + objectName: "txWalletsComboBox" + model: bsApp.txWalletsList + font.pointSize: 8 + + width: 124 + height: 29 + + anchors.verticalCenter: parent.verticalCenter } - } - Button { - text: qsTr("CSV download") - font.pointSize: 8 - onClicked: { - fileDialogCSV.visible = true + + CustomSmallComboBox { + id: txTypesComboBox + objectName: "txTypesComboBox" + model: bsApp.txTypesList + font.pointSize: 8 + + width: 124 + height: 29 + + anchors.verticalCenter: parent.verticalCenter } - } - } - TableView { - width: 1000 - height: 600 - columnSpacing: 1 - rowSpacing: 1 - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } - model: txListModel - delegate: Rectangle { - implicitWidth: 125 * colWidth - implicitHeight: 20 - border.color: "black" - border.width: 1 - clip: true - color: heading ? 'black' : 'darkslategrey' - Text { - text: tableData - font.pointSize: heading ? 8 : 10 - color: dataColor - anchors.centerIn: parent + + Row { + spacing: 4 + anchors.verticalCenter: parent.verticalCenter + + CustomButtonLeftIcon { + text: qsTr("From") + font.pointSize: 8 + + custom_icon.source: "qrc:/images/calendar_icon.svg" + + } + + Rectangle { + height: 1 + width: 8 + color: BSStyle.tableSeparatorColor + anchors.verticalCenter: parent.verticalCenter + } + + CustomButtonLeftIcon { + text: qsTr("To") + font.pointSize: 8 + + custom_icon.source: "qrc:/images/calendar_icon.svg" + } } - MouseArea { - anchors.fill: parent + + CustomButtonRightIcon { + text: qsTr("CSV download") + font.pointSize: 8 + + custom_icon.source: "qrc:/images/download_icon.svg" + custom_icon.width: 10 + custom_icon.height: 10 + onClicked: { - if (!heading) { - bsApp.copyAddressToClipboard(txId) - ibInfo.displayMessage(qsTr("TX id %1 copied to clipboard").arg(txId)) - } - } - onDoubleClicked: { - if (!heading) { - //TODO: show TX details - } + fileDialogCSV.visible = true } + anchors.verticalCenter: parent.verticalCenter } } } + + Transactions.TransactionsTableView { + width: parent.width + height: 600 + model: txListModel + + onCopyRequested: bsApp.copyAddressToClipboard(id) + } } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 147718dde..3ad98a077 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -38,6 +38,7 @@ qml/StyledControls/CustomButtonBar.qml qml/StyledControls/CustomCheckBox.qml qml/StyledControls/CustomComboBox.qml + qml/StyledControls/CustomSmallComboBox.qml qml/StyledControls/CustomContainer.qml qml/StyledControls/CustomDialog.qml qml/StyledControls/CustomHeader.qml @@ -81,7 +82,7 @@ images/success.png qml/StyledControls/CustomPopup.qml qml/Receive/ReceiveQrCode.qml - images/copy_icon.png + images/copy_icon.svg qml/Receive/qmldir qml/Receive/ReceivePopup.qml qml/CreateWallet/ConfirmPassword.qml @@ -113,14 +114,22 @@ qml/Pin/PinEntriesPopup.qml qml/Pin/qmldir qml/StyledControls/CustomMessageDialog.qml - qml/StyledControls/CustomButton2.qml + qml/StyledControls/CustomMediumButton.qml qml/Overview/AddressesTableView.qml - qml/Overview/NSTTableView.qml qml/Overview/BalanceBar.qml qml/Overview/BaseBalanceLabel.qml qml/Overview/OverviewPanel.qml qml/Overview/OverviewWalletBar.qml - images/overview/copy_button.svg qml/Pin/PasswordEntryPopup.qml + + images/combobox_open_button.svg + qml/Transactions/TransactionsTableView.qml + qml/StyledControls/CustomSmallButton.qml + qml/StyledControls/CustomButtonRightIcon.qml + qml/StyledControls/CustomButtonLeftIcon.qml + + images/calendar_icon.svg + images/download_icon.svg + images/search_icon.svg From a87e95bb233a6da6a99b2585f4946a4d9ca17b4b Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 2 Feb 2023 04:40:20 +0200 Subject: [PATCH 108/436] qml: settings (old design) --- GUI/QtQuick/images/about.png | Bin 0 -> 335 bytes GUI/QtQuick/images/arrow.png | Bin 0 -> 279 bytes GUI/QtQuick/images/delete.svg | 16 +++ GUI/QtQuick/images/general.png | Bin 0 -> 716 bytes GUI/QtQuick/images/network.png | Bin 0 -> 294 bytes GUI/QtQuick/images/plus.svg | 4 + GUI/QtQuick/qml/BsStyles/BSStyle.qml | 2 + .../qml/CreateWallet/ImportHardware.qml | 4 - GUI/QtQuick/qml/Settings/SettingsGeneral.qml | 126 ++++++++++++++++++ GUI/QtQuick/qml/Settings/SettingsMenu.qml | 91 +++++++++++++ GUI/QtQuick/qml/Settings/SettingsNetwork.qml | 107 +++++++++++++++ GUI/QtQuick/qml/Settings/SettingsPopup.qml | 59 ++++++++ GUI/QtQuick/qml/Settings/qmldir | 4 + .../qml/StyledControls/CustomCheckBox.qml | 18 +-- .../qml/StyledControls/CustomListItem.qml | 103 ++++++++++++++ .../StyledControls/CustomListRadioButton.qml | 39 ++++++ .../qml/StyledControls/CustomRadioButton.qml | 2 +- GUI/QtQuick/qml/main.qml | 14 +- GUI/QtQuick/qtquick.qrc | 18 +++ 19 files changed, 593 insertions(+), 14 deletions(-) create mode 100644 GUI/QtQuick/images/about.png create mode 100644 GUI/QtQuick/images/arrow.png create mode 100644 GUI/QtQuick/images/delete.svg create mode 100644 GUI/QtQuick/images/general.png create mode 100644 GUI/QtQuick/images/network.png create mode 100644 GUI/QtQuick/images/plus.svg create mode 100644 GUI/QtQuick/qml/Settings/SettingsGeneral.qml create mode 100644 GUI/QtQuick/qml/Settings/SettingsMenu.qml create mode 100644 GUI/QtQuick/qml/Settings/SettingsNetwork.qml create mode 100644 GUI/QtQuick/qml/Settings/SettingsPopup.qml create mode 100644 GUI/QtQuick/qml/Settings/qmldir create mode 100644 GUI/QtQuick/qml/StyledControls/CustomListItem.qml create mode 100644 GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml diff --git a/GUI/QtQuick/images/about.png b/GUI/QtQuick/images/about.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e25bf05a72581af9d3fadceaf006bd877f4d61 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#C!Q{jAr*{or+RZ8G7xY`|C49yR3*H7LwSJs zCFL(H-#G3$+_|zeI`H7VBXS4VYV--O5b%C^gpJ$jzS@)DPHK}CBv?3g=dozJNHqGC z?QfjlHY1eRX|s{%i%YH_zF&Uj`7>hE#1gL3)XhJn!*YH(Tl8OFlEWHbI4fDla}JA{ zkhr5%PNt@3ReXNFVMdXp00i_>zopr0DVt_kN^Mx literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/arrow.png b/GUI/QtQuick/images/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..da8dc11b8cf0239223feb8277a27f36f062a2b23 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#HJ&bxAr*{oCm!TIWWeLPpS#(BN!x(&EJqH* z@<}lo(_4xd)f#v&`5oX`b3o|`i^{ugM^>JiT=V;W{5N*4){hUI{%^3m77)}qRXA?p zqRDR`NpX27-)pl_UQ|7AcK)>LPWL*;X9;H~&lLBF*`0U8(`Hpeya$uC!FHj&Ru4We z;}R)8@IU@b>^y6RiVxSe2=(tsDeoy(>GG-J?6vf+4PGgrzw23(`N5fTtxk?drH?aO VY + + + + + + + + + + + + + + + diff --git a/GUI/QtQuick/images/general.png b/GUI/QtQuick/images/general.png new file mode 100644 index 0000000000000000000000000000000000000000..b446855008f6f08be0da92e1bcb76f7c38377c3f GIT binary patch literal 716 zcmV;-0yF)IP)k<5&NGdVH+!(Y-Yl+f_VpK_nHRY)1Xkt^}g zZo9P=@O+d6u4;BChFt&u||G7Nt~)yqC0GMtgw`^ykF<ZeR@FkafLl1$)&@&o<&rBFeL4*d!T4w!+LBUN|A<^cA<^yPdjE9(HpYn z70rt417&FAp9N!Paz;3}?@!Gl=77d$jJ(Y>V|66YV$|JaWXxtr2j}5FY&-|@EEq_W zDiO<&LIHV8Y^IbvyAYFqbs(tou*Vc*wIy%C9;6_x`( y{LooZI8QpJnny49A5A0W|6!&f(McU2hW-OL9UTnpIIxER0000Oaf? literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/network.png b/GUI/QtQuick/images/network.png new file mode 100644 index 0000000000000000000000000000000000000000..71f70be9b02d5be9816500f76c77d823c70f3a53 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#-JULvAr*{oCm-ZwG8AzAuj9CWnt=BPW?PMI z58~D&T5n*np0Ia~Zin197HSa#sa2BmhMY1P}xk42vP^*G_4!DIiDy*^J4xr)8cmb`v)NAe%D zTz}QGlXgA3^i|7A@lxrocjDGL={~^_`gI3FrJCu3E>17i5m?F=3C- m;0wAS + + + diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index 39ccb14b8..8c105793a 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -114,4 +114,6 @@ QtObject { readonly property color balanceValueTextColor: "#E2E7FF" readonly property color addressesPanelBackgroundColor: "#333C435A" + readonly property color listItemBorderColor: "#3C435A" + } diff --git a/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml index 954d419ef..e59039cec 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml @@ -94,10 +94,6 @@ ColumnLayout { id: confirm_but text: qsTr("Import") - //Layout.leftMargin: 25 - //Layout.bottomMargin: 40 - - //Layout.leftMargin: 24 Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter diff --git a/GUI/QtQuick/qml/Settings/SettingsGeneral.qml b/GUI/QtQuick/qml/Settings/SettingsGeneral.qml new file mode 100644 index 000000000..bcc63241a --- /dev/null +++ b/GUI/QtQuick/qml/Settings/SettingsGeneral.qml @@ -0,0 +1,126 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + + id: layout + + signal sig_save() + + height: 548 + width: 580 + + spacing: 0 + + CustomTitleLabel { + id: title + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + + text: qsTr("General") + } + + CustomTextInput { + id: log_file + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 24 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + + title_text: qsTr("Log file") + } + + CustomTextInput { + id: messages_log_file + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + + title_text: qsTr("Messages log file") + } + + CustomCheckBox { + id: checkbox_advanced_tx + + Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft + Layout.topMargin: 24 + Layout.leftMargin: 24 + + text: "Advanced TX dialog by default" + + spacing: 6 + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Normal + + checked: true + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + CustomButton { + id: save_but + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + enabled: log_file.input_text.length && messages_log_file.input_text.length + + width: 532 + + text: qsTr("Save") + + Component.onCompleted: { + save_but.preferred = true + } + + function click_enter() { + if (!save_but.enabled) + return + + bsApp.settingLogFile = log_file.input_text + bsApp.settingMsgLogFile = messages_log_file.input_text + bsApp.settingAdvancedTX = checkbox_advanced_tx.checked + + layout.sig_save() + } + } + + Keys.onEnterPressed: { + save_but.click_enter() + } + + Keys.onReturnPressed: { + save_but.click_enter() + } + + function init() + { + messages_log_file.input_text = bsApp.settingMsgLogFile + checkbox_advanced_tx.checked = bsApp.settingAdvancedTX + log_file.input_text = bsApp.settingLogFile + + log_file.setActiveFocus() + } +} diff --git a/GUI/QtQuick/qml/Settings/SettingsMenu.qml b/GUI/QtQuick/qml/Settings/SettingsMenu.qml new file mode 100644 index 000000000..8be07204e --- /dev/null +++ b/GUI/QtQuick/qml/Settings/SettingsMenu.qml @@ -0,0 +1,91 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + + id: layout + + signal sig_general() + signal sig_network() + signal sig_about() + + height: 548 + width: 580 + + spacing: 0 + + CustomTitleLabel { + id: title + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + + text: qsTr("Settings") + } + + CustomListItem { + id: general_item + + Layout.alignment: Qt.AlignCenter + Layout.topMargin: 24 + + //properties + isButton: true + + //aliases + icon_source: "qrc:/images/general.png" + icon_add_source: "qrc:/images/arrow.png" + tytle_text: "General" + + onClicked: sig_general() + } + + CustomListItem { + id: network_item + + Layout.alignment: Qt.AlignCenter + Layout.topMargin: 10 + + //properties + isButton: true + + //aliases + icon_source: "qrc:/images/network.png" + icon_add_source: "qrc:/images/arrow.png" + tytle_text: "Network" + + onClicked: sig_network() + } + + CustomListItem { + id: about_item + + Layout.alignment: Qt.AlignCenter + Layout.topMargin: 10 + + //properties + isButton: true + + //aliases + icon_source: "qrc:/images/about.png" + icon_add_source: "qrc:/images/arrow.png" + tytle_text: "About" + + onClicked: sig_about() + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + function init() + { + } +} diff --git a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml new file mode 100644 index 000000000..951523965 --- /dev/null +++ b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml @@ -0,0 +1,107 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + + id: layout + + signal sig_save() + + height: 548 + width: 580 + + spacing: 0 + + CustomTitleLabel { + id: title + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + + text: qsTr("Network") + } + + CustomTextInput { + id: host + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 24 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + + title_text: qsTr("Armory host") + } + + CustomTextInput { + id: port + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + + title_text: qsTr("Armory port") + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + CustomButton { + id: save_but + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + enabled: host.input_text.length && port.input_text.length + + width: 532 + + text: qsTr("Save") + + Component.onCompleted: { + save_but.preferred = true + } + + function click_enter() { + if (!save_but.enabled) + return + + bsApp.settingArmoryHost = host.input_text + bsApp.settingArmoryPort = port.input_text + + layout.sig_save() + } + } + + Keys.onEnterPressed: { + save_but.click_enter() + } + + Keys.onReturnPressed: { + save_but.click_enter() + } + + function init() + { + port.input_text = bsApp.settingArmoryPort + host.input_text = bsApp.settingArmoryHost + + host.setActiveFocus() + } +} diff --git a/GUI/QtQuick/qml/Settings/SettingsPopup.qml b/GUI/QtQuick/qml/Settings/SettingsPopup.qml new file mode 100644 index 000000000..9e12fa571 --- /dev/null +++ b/GUI/QtQuick/qml/Settings/SettingsPopup.qml @@ -0,0 +1,59 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +CustomPopup { + id: root + + objectName: "settings_popup" + + _stack_view.initialItem: settings_menu + _arrow_but_visibility: !settings_menu.visible + + SettingsMenu { + id: settings_menu + visible: false + + onSig_general: { + _stack_view.push(settings_general) + settings_general.init() + } + + onSig_network: { + _stack_view.push(settings_network) + settings_network.init() + } + + onSig_about: { + + } + } + + SettingsGeneral { + id: settings_general + visible: false + + onSig_save: { + root.close() + _stack_view.pop(null) + } + } + + SettingsNetwork { + id: settings_network + visible: false + + onSig_save: { + root.close() + _stack_view.pop(null) + } + } + + function init() { + settings_menu.init() + } +} diff --git a/GUI/QtQuick/qml/Settings/qmldir b/GUI/QtQuick/qml/Settings/qmldir new file mode 100644 index 000000000..659ef1b71 --- /dev/null +++ b/GUI/QtQuick/qml/Settings/qmldir @@ -0,0 +1,4 @@ +module Settings + +SettingsPopup 1.0 SettingsPopup.qml +SettingsMenu 1.0 SettingsMenu.qml diff --git a/GUI/QtQuick/qml/StyledControls/CustomCheckBox.qml b/GUI/QtQuick/qml/StyledControls/CustomCheckBox.qml index 49d89f54b..06fa83a19 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomCheckBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomCheckBox.qml @@ -12,16 +12,19 @@ import QtQuick 2.9 import QtQuick.Controls 2.3 import "../BsStyles" + CheckBox { id: control - text: parent.text + + checked: true indicator: Rectangle { implicitWidth: 16 implicitHeight: 16 + x: control.leftPadding y: parent.height / 2 - height / 2 - radius: 0 - border.color: control.checked ? BSStyle.buttonsBorderColor : BSStyle.buttonsUncheckedColor + radius: 8 + border.color: "#45A6FF" color: "transparent" Rectangle { @@ -29,17 +32,16 @@ CheckBox { height: 8 x: 4 y: 4 - radius: 0 - color: control.checked ? BSStyle.buttonsPrimaryMainColor : BSStyle.buttonsUncheckedColor + radius: 4 + color: "#45A6FF" visible: control.checked } } contentItem: Text { text: control.text - font.pixelSize: 11 - opacity: enabled ? 1.0 : 0.3 - color: control.checked ? BSStyle.textColor : BSStyle.buttonsUncheckedColor + font: control.font + color: control.checked ? "#E2E7FF" : "#7A88B0" verticalAlignment: Text.AlignVCenter leftPadding: control.indicator.width + control.spacing } diff --git a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml new file mode 100644 index 000000000..51443b4c4 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml @@ -0,0 +1,103 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ + +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import "../BsStyles" + +Rectangle { + id: rect + + //properties + property bool isButton: false + + //aliases + property alias icon_source: icon.source + property alias icon_visible: icon.visible + //usually we dont need only if custom margin and size + property alias _icon: icon + property alias icon_add_source: icon_add.source + property alias tytle_text: tytle.text + + signal clicked_add() + signal clicked() + + width: 532 + height: 50 + + color: "transparent" + opacity: 1 + radius: 14 + + border.color: BSStyle.listItemBorderColor + border.width: 1 + + Image { + id: icon + + anchors.verticalCenter: parent.verticalCenter + anchors.left: rect.left + anchors.leftMargin: 16 + + width: 24 + height: 24 + sourceSize.width: 24 + sourceSize.height: 24 + } + + Label { + id: tytle + + anchors.verticalCenter: parent.verticalCenter + anchors.left: icon.right + anchors.leftMargin: 8 + + horizontalAlignment : Text.AlignLeft + + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Normal + + color: "#7A88B0" + } + + Image { + id: icon_add + + visible: source.length + + anchors.verticalCenter: parent.verticalCenter + anchors.right: rect.right + anchors.rightMargin: 13 + + width: 24 + height: 24 + sourceSize.width: 24 + sourceSize.height: 24 + + MouseArea { + anchors.fill: parent + onClicked: { + rect.clicked_add() + } + } + } + + MouseArea { + anchors.fill: parent + propagateComposedEvents: true + onClicked: { + if (isButton) + rect.clicked() + mouse.accepted = false + } + } +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml b/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml new file mode 100644 index 000000000..5b18c4e4e --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml @@ -0,0 +1,39 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2022, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ + +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import "../BsStyles" + +CustomListItem { + id: root + + //properties + property bool rad_but_down: rad_but.down + + signal sig_rad_but_clicked() + + icon_visible: false + + CustomRadioButton { + id: rad_but + + anchors.horizontalCenter: parent.horizontalCenter + anchors.left: rect.left + anchors.leftMargin: 21 + + width: 15 + height: 15 + + onClicked: root.sig_rad_but_clicked() + } + +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml b/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml index 6d39a0dca..24b508ae3 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml @@ -15,7 +15,7 @@ import "../BsStyles" RadioButton { id: control - text: qsTr("RadioButton") + checked: true indicator: Rectangle { diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index ec1b9b5e2..1ba4341a2 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -19,6 +19,7 @@ import "Receive" 1 import "Send" 1 import "CreateWallet" 1 import "Pin" 1 +import "Settings" 1 ApplicationWindow { id: mainWindow @@ -59,6 +60,14 @@ ApplicationWindow { } } + SettingsPopup { + id: settings_popup + visible: false + onClosing: { + btnSettings.select(false) + } + } + PinEntriesPopup { id: pin_popup visible: false @@ -215,7 +224,10 @@ ApplicationWindow { icon.source: "qrc:/images/settings_icon.png" onClicked: { topMenuBtnClicked(btnSettings) - stack.push(settingsPage) + //stack.push(settingsPage) + settings_popup.show() + settings_popup.raise() + settings_popup.requestActivate() } } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 87842ac96..8dcf3f31c 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -121,5 +121,23 @@ qml/Overview/OverviewWalletBar.qml images/overview/copy_button.svg qml/Pin/PasswordEntryPopup.qml + images/about.png + images/arrow.png + images/general.png + images/network.png + images/notification_critical.png + images/notification_info.png + images/notification_question.png + images/notification_success.png + images/notification_warning.png + images/delete.svg + images/plus.svg + qml/Settings/qmldir + qml/Settings/SettingsMenu.qml + qml/Settings/SettingsNetwork.qml + qml/Settings/SettingsPopup.qml + qml/StyledControls/CustomListItem.qml + qml/StyledControls/CustomListRadioButton.qml + qml/Settings/SettingsGeneral.qml From 524a8976f2aa7d57be82c0bde77a1b8212d86168 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 2 Feb 2023 04:50:46 +0200 Subject: [PATCH 109/436] add validator --- GUI/QtQuick/qml/Settings/SettingsNetwork.qml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml index 951523965..356d6a57a 100644 --- a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml +++ b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml @@ -29,6 +29,8 @@ ColumnLayout { CustomTextInput { id: host + input_validator: RegExpValidator { regExp: /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}(,(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})*/ } + Layout.alignment: Qt.AlignCenter Layout.preferredHeight : 70 Layout.preferredWidth: 532 @@ -44,6 +46,8 @@ ColumnLayout { CustomTextInput { id: port + input_validator: IntValidator {bottom: 0; top: 65536;} + Layout.alignment: Qt.AlignCenter Layout.preferredHeight : 70 Layout.preferredWidth: 532 From bf24381cb6f01f68ffecdc7199e8e61f82796ffe Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 2 Feb 2023 14:37:46 +0200 Subject: [PATCH 110/436] qml: settings: fix pr issues --- GUI/QtQuick/qml/Settings/SettingsGeneral.qml | 2 +- GUI/QtQuick/qml/Settings/SettingsMenu.qml | 6 +++--- GUI/QtQuick/qml/StyledControls/CustomListItem.qml | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/GUI/QtQuick/qml/Settings/SettingsGeneral.qml b/GUI/QtQuick/qml/Settings/SettingsGeneral.qml index bcc63241a..3d9daefbe 100644 --- a/GUI/QtQuick/qml/Settings/SettingsGeneral.qml +++ b/GUI/QtQuick/qml/Settings/SettingsGeneral.qml @@ -63,7 +63,7 @@ ColumnLayout { Layout.topMargin: 24 Layout.leftMargin: 24 - text: "Advanced TX dialog by default" + text: qsTr("Advanced TX dialog by default") spacing: 6 font.pixelSize: 13 diff --git a/GUI/QtQuick/qml/Settings/SettingsMenu.qml b/GUI/QtQuick/qml/Settings/SettingsMenu.qml index 8be07204e..12c9db611 100644 --- a/GUI/QtQuick/qml/Settings/SettingsMenu.qml +++ b/GUI/QtQuick/qml/Settings/SettingsMenu.qml @@ -40,7 +40,7 @@ ColumnLayout { //aliases icon_source: "qrc:/images/general.png" icon_add_source: "qrc:/images/arrow.png" - tytle_text: "General" + title_text: "General" onClicked: sig_general() } @@ -57,7 +57,7 @@ ColumnLayout { //aliases icon_source: "qrc:/images/network.png" icon_add_source: "qrc:/images/arrow.png" - tytle_text: "Network" + title_text: "Network" onClicked: sig_network() } @@ -74,7 +74,7 @@ ColumnLayout { //aliases icon_source: "qrc:/images/about.png" icon_add_source: "qrc:/images/arrow.png" - tytle_text: "About" + title_text: "About" onClicked: sig_about() } diff --git a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml index 51443b4c4..e93d04761 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2022, BlockSettle AB +* Copyright (C) 2018 - 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * @@ -25,7 +25,7 @@ Rectangle { //usually we dont need only if custom margin and size property alias _icon: icon property alias icon_add_source: icon_add.source - property alias tytle_text: tytle.text + property alias title_text: title.text signal clicked_add() signal clicked() @@ -54,7 +54,7 @@ Rectangle { } Label { - id: tytle + id: title anchors.verticalCenter: parent.verticalCenter anchors.left: icon.right From f6413ced72a66988a5d5049e131b5e4795c96e91 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 2 Feb 2023 14:54:43 +0200 Subject: [PATCH 111/436] qml: settings: fix pr issues --- GUI/QtQuick/qml/Settings/SettingsGeneral.qml | 50 +++++--------------- GUI/QtQuick/qml/Settings/SettingsNetwork.qml | 45 ++++-------------- GUI/QtQuick/qml/Settings/SettingsPopup.qml | 10 ---- 3 files changed, 19 insertions(+), 86 deletions(-) diff --git a/GUI/QtQuick/qml/Settings/SettingsGeneral.qml b/GUI/QtQuick/qml/Settings/SettingsGeneral.qml index 3d9daefbe..2213c0d0e 100644 --- a/GUI/QtQuick/qml/Settings/SettingsGeneral.qml +++ b/GUI/QtQuick/qml/Settings/SettingsGeneral.qml @@ -10,8 +10,6 @@ ColumnLayout { id: layout - signal sig_save() - height: 548 width: 580 @@ -39,6 +37,10 @@ ColumnLayout { title_topMargin: 16 title_text: qsTr("Log file") + + onTextEdited : { + bsApp.settingLogFile = log_file.input_text + } } CustomTextInput { @@ -54,6 +56,10 @@ ColumnLayout { title_topMargin: 16 title_text: qsTr("Messages log file") + + onTextEdited : { + bsApp.settingMsgLogFile = messages_log_file.input_text + } } CustomCheckBox { @@ -70,7 +76,9 @@ ColumnLayout { font.family: "Roboto" font.weight: Font.Normal - checked: true + onClicked: { + bsApp.settingAdvancedTX = checkbox_advanced_tx.checked + } } Label { @@ -79,42 +87,6 @@ ColumnLayout { Layout.fillHeight: true } - CustomButton { - id: save_but - - Layout.bottomMargin: 40 - Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - - enabled: log_file.input_text.length && messages_log_file.input_text.length - - width: 532 - - text: qsTr("Save") - - Component.onCompleted: { - save_but.preferred = true - } - - function click_enter() { - if (!save_but.enabled) - return - - bsApp.settingLogFile = log_file.input_text - bsApp.settingMsgLogFile = messages_log_file.input_text - bsApp.settingAdvancedTX = checkbox_advanced_tx.checked - - layout.sig_save() - } - } - - Keys.onEnterPressed: { - save_but.click_enter() - } - - Keys.onReturnPressed: { - save_but.click_enter() - } - function init() { messages_log_file.input_text = bsApp.settingMsgLogFile diff --git a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml index 356d6a57a..6044e94bc 100644 --- a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml +++ b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml @@ -10,8 +10,6 @@ ColumnLayout { id: layout - signal sig_save() - height: 548 width: 580 @@ -41,6 +39,10 @@ ColumnLayout { title_topMargin: 16 title_text: qsTr("Armory host") + + onTextEdited : { + bsApp.settingArmoryHost = host.input_text + } } CustomTextInput { @@ -58,6 +60,10 @@ ColumnLayout { title_topMargin: 16 title_text: qsTr("Armory port") + + onTextEdited : { + bsApp.settingArmoryPort = port.input_text + } } Label { @@ -66,41 +72,6 @@ ColumnLayout { Layout.fillHeight: true } - CustomButton { - id: save_but - - Layout.bottomMargin: 40 - Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - - enabled: host.input_text.length && port.input_text.length - - width: 532 - - text: qsTr("Save") - - Component.onCompleted: { - save_but.preferred = true - } - - function click_enter() { - if (!save_but.enabled) - return - - bsApp.settingArmoryHost = host.input_text - bsApp.settingArmoryPort = port.input_text - - layout.sig_save() - } - } - - Keys.onEnterPressed: { - save_but.click_enter() - } - - Keys.onReturnPressed: { - save_but.click_enter() - } - function init() { port.input_text = bsApp.settingArmoryPort diff --git a/GUI/QtQuick/qml/Settings/SettingsPopup.qml b/GUI/QtQuick/qml/Settings/SettingsPopup.qml index 9e12fa571..607e03ad6 100644 --- a/GUI/QtQuick/qml/Settings/SettingsPopup.qml +++ b/GUI/QtQuick/qml/Settings/SettingsPopup.qml @@ -36,21 +36,11 @@ CustomPopup { SettingsGeneral { id: settings_general visible: false - - onSig_save: { - root.close() - _stack_view.pop(null) - } } SettingsNetwork { id: settings_network visible: false - - onSig_save: { - root.close() - _stack_view.pop(null) - } } function init() { From be39959ee69b88e3ecd6c3acd7c91ada8d4b6674 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 2 Feb 2023 15:02:27 +0200 Subject: [PATCH 112/436] merge --- GUI/QtQuick/qml/Settings/SettingsMenu.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GUI/QtQuick/qml/Settings/SettingsMenu.qml b/GUI/QtQuick/qml/Settings/SettingsMenu.qml index 12c9db611..28dabec2f 100644 --- a/GUI/QtQuick/qml/Settings/SettingsMenu.qml +++ b/GUI/QtQuick/qml/Settings/SettingsMenu.qml @@ -40,7 +40,7 @@ ColumnLayout { //aliases icon_source: "qrc:/images/general.png" icon_add_source: "qrc:/images/arrow.png" - title_text: "General" + title_text: qsTr("General") onClicked: sig_general() } @@ -57,7 +57,7 @@ ColumnLayout { //aliases icon_source: "qrc:/images/network.png" icon_add_source: "qrc:/images/arrow.png" - title_text: "Network" + title_text: qsTr("Network") onClicked: sig_network() } @@ -74,7 +74,7 @@ ColumnLayout { //aliases icon_source: "qrc:/images/about.png" icon_add_source: "qrc:/images/arrow.png" - title_text: "About" + title_text: qsTr("About") onClicked: sig_about() } From 329f08e78072a2ab01731beb5756c00ac942b66f Mon Sep 17 00:00:00 2001 From: YZ Date: Mon, 6 Feb 2023 00:55:03 +0100 Subject: [PATCH 113/436] Explorer UI pages --- GUI/QtQuick/AddressListModel.cpp | 11 +- GUI/QtQuick/AddressListModel.h | 3 +- GUI/QtQuick/ColorScheme.h | 7 + GUI/QtQuick/QtQuickAdapter.cpp | 24 +- GUI/QtQuick/QtQuickAdapter.h | 1 + GUI/QtQuick/TxListModel.cpp | 57 +-- GUI/QtQuick/images/down_arrow.svg | 3 + GUI/QtQuick/images/logo_no_text.svg | 4 + GUI/QtQuick/images/search_icon.svg | 4 +- GUI/QtQuick/images/up_arrow.svg | 3 + GUI/QtQuick/qml/BsStyles/BSStyle.qml | 1 - GUI/QtQuick/qml/ExplorerAddress.qml | 182 +++++---- GUI/QtQuick/qml/ExplorerEmpty.qml | 32 +- GUI/QtQuick/qml/ExplorerPage.qml | 233 +++++++---- GUI/QtQuick/qml/ExplorerTX.qml | 373 ++++++++++-------- .../qml/Overview/AddressesTableView.qml | 141 ------- GUI/QtQuick/qml/Overview/BalanceBar.qml | 2 +- GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml | 9 +- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 17 +- .../qml/Overview/OverviewWalletBar.qml | 2 +- GUI/QtQuick/qml/OverviewPage.qml | 3 +- .../qml/StyledControls/CopyIconButton.qml | 43 ++ .../StyledControls/CustomButtonLeftIcon.qml | 2 +- .../StyledControls/CustomButtonRightIcon.qml | 2 +- .../qml/StyledControls/CustomSmallButton.qml | 4 +- .../CustomTableView.qml} | 106 ++--- .../StyledControls/InputOutputTableView.qml | 134 +++++++ GUI/QtQuick/qml/TransactionsPage.qml | 8 +- GUI/QtQuick/qtquick.qrc | 8 +- 29 files changed, 808 insertions(+), 611 deletions(-) create mode 100644 GUI/QtQuick/ColorScheme.h create mode 100644 GUI/QtQuick/images/down_arrow.svg create mode 100644 GUI/QtQuick/images/logo_no_text.svg create mode 100644 GUI/QtQuick/images/up_arrow.svg delete mode 100644 GUI/QtQuick/qml/Overview/AddressesTableView.qml create mode 100644 GUI/QtQuick/qml/StyledControls/CopyIconButton.qml rename GUI/QtQuick/qml/{Transactions/TransactionsTableView.qml => StyledControls/CustomTableView.qml} (51%) create mode 100644 GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index a4e244197..904feb82f 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -11,12 +11,14 @@ #include "AddressListModel.h" #include #include "BTCNumericTypes.h" +#include "ColorScheme.h" namespace { static const QHash kRoles{ {QmlAddressListModel::TableDataRole, "tableData"}, {QmlAddressListModel::HeadingRole, "heading"}, - {QmlAddressListModel::FirstColRole, "firstcol"} + {QmlAddressListModel::FirstColRole, "firstcol"}, + {QmlAddressListModel::ColorRole, "dataColor"} }; } @@ -63,6 +65,13 @@ QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const return (index.row() == 0); case FirstColRole: return (index.column() == 0); + case ColorRole: + if (index.row() == 0) { + return ColorScheme::tableHeaderColor; + } + else { + return QColorConstants::White; + } default: break; } return QVariant(); diff --git a/GUI/QtQuick/AddressListModel.h b/GUI/QtQuick/AddressListModel.h index c79d2667d..36f6e51ba 100644 --- a/GUI/QtQuick/AddressListModel.h +++ b/GUI/QtQuick/AddressListModel.h @@ -14,6 +14,7 @@ #include #include #include +#include #include "Address.h" #include "BinaryData.h" @@ -25,7 +26,7 @@ class QmlAddressListModel : public QAbstractTableModel { Q_OBJECT public: - enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, FirstColRole }; + enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, FirstColRole, ColorRole }; QmlAddressListModel(const std::shared_ptr&, QObject* parent = nullptr); int rowCount(const QModelIndex & = QModelIndex()) const override; diff --git a/GUI/QtQuick/ColorScheme.h b/GUI/QtQuick/ColorScheme.h new file mode 100644 index 000000000..67cf91616 --- /dev/null +++ b/GUI/QtQuick/ColorScheme.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +namespace ColorScheme { + static const QColor tableHeaderColor = QColor("#7A88B0"); +} \ No newline at end of file diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index ed866c80b..dd910356e 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1674,17 +1674,13 @@ void QtQuickAdapter::signAndBroadcast(QTXSignRequest* txReq, const QString& pass } } -int QtQuickAdapter::startSearch(const QString& s) +int QtQuickAdapter::getAddressType(const QString& s) { const auto& trimmed = s.trimmed().toStdString(); bs::Address address; try { address = bs::Address::fromAddressString(trimmed); if (address.isValid()) { - expTxByAddrModel_->clear(); - ArmoryMessage msg; - msg.set_get_address_history(address.display()); - pushRequest(user_, userBlockchain_, msg.SerializeAsString()); return 1; } } @@ -1698,3 +1694,21 @@ int QtQuickAdapter::startSearch(const QString& s) } return 0; } + +int QtQuickAdapter::startSearch(const QString& s) +{ + const auto& trimmed = s.trimmed().toStdString(); + bs::Address address; + try { + address = bs::Address::fromAddressString(trimmed); + if (address.isValid()) { + expTxByAddrModel_->clear(); + ArmoryMessage msg; + msg.set_get_address_history(address.display()); + pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + return 1; + } + } + catch (const std::exception&) {} + return 0; +} \ No newline at end of file diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 05c39cfa7..71aac0f6b 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -174,6 +174,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop , double amount, double fee, const QString& comment = {}, QUTXOList* utxos = nullptr); Q_INVOKABLE void getUTXOsForWallet(int walletIndex); Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); + Q_INVOKABLE int getAddressType(const QString&); Q_INVOKABLE int startSearch(const QString&); Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index ce2cc6878..bf34e020d 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -13,6 +13,7 @@ #include #include #include "StringUtils.h" +#include "ColorScheme.h" namespace { static const QHash kTxListRoles{ @@ -35,6 +36,8 @@ namespace { {TxInOutModel::WidthRole, "colWidth"}, {TxInOutModel::AddressRole, "address"}, }; + + static const QString dateTimeFormat = QString::fromStdString("yyyy-MM-dd hh:mm:ss"); } TxListModel::TxListModel(const std::shared_ptr& logger, QObject* parent) @@ -63,7 +66,7 @@ QString TxListModel::getData(int row, int col) const } const auto& entry = data_.at(row - 1); switch (col) { - case 0: return QDateTime::fromSecsSinceEpoch(entry.txTime).toString(); + case 0: return QDateTime::fromSecsSinceEpoch(entry.txTime).toString(dateTimeFormat); case 1: return walletName(row - 1); case 2: return txType(row - 1); case 3: { @@ -91,7 +94,7 @@ QString TxListModel::getData(int row, int col) const QColor TxListModel::dataColor(int row, int col) const { if (row == 0) { - return QColorConstants::DarkGray; + return ColorScheme::tableHeaderColor; } const auto& entry = data_.at(row - 1); if (col == 5) { @@ -115,18 +118,14 @@ QColor TxListModel::dataColor(int row, int col) const default: break; } } - return QColorConstants::DarkGray; + return QColorConstants::White; } else if (col == 4) { if (entry.value < 0) { return qRgb(208, 192, 192); } - return qRgb(192, 208, 192); - } - else if (col == 6) { - return QColorConstants::DarkGray; } - return QColorConstants::LightGray; + return QColorConstants::White; } float TxListModel::colWidth(int col) const @@ -422,7 +421,7 @@ QString TxListForAddr::getData(int row, int col) const const auto& entry = data_.at(row - 1); const auto totFees = totalFees(row - 1); switch (col) { - case 0: return QDateTime::fromSecsSinceEpoch(entry.txTime).toString(); + case 0: return QDateTime::fromSecsSinceEpoch(entry.txTime).toString(dateTimeFormat); case 1: return txId(row - 1); case 2: return QString::number(entry.nbConf); case 3: return displayNb(nbInputs(row - 1)); @@ -490,7 +489,7 @@ int64_t TxListForAddr::totalFees(int row) const QColor TxListForAddr::dataColor(int row, int col) const { if (row == 0) { - return QColorConstants::DarkGray; + return ColorScheme::tableHeaderColor; } const auto& entry = data_.at(row - 1); if (col == 2) { @@ -504,7 +503,7 @@ QColor TxListForAddr::dataColor(int row, int col) const default: return QColorConstants::Green; } } - return QColorConstants::LightGray; + return QColorConstants::White; } float TxListForAddr::colWidth(int col) const @@ -742,12 +741,12 @@ QString QTxDetails::feePerByte() const TxInOutModel::TxInOutModel(const std::vector& data, QObject* parent) : QAbstractTableModel(parent), data_(data) - , header_{ {}, tr("Address"), tr("Amount"), tr("Wallet") } + , header_{ tr("Address"), tr("Amount"), tr("Wallet") } {} int TxInOutModel::rowCount(const QModelIndex&) const { - return data_.size() * 2 + 1; + return data_.size() + 1; } int TxInOutModel::columnCount(const QModelIndex&) const @@ -771,7 +770,7 @@ QVariant TxInOutModel::data(const QModelIndex& index, int role) const return colWidth(index.column()); case AddressRole: try { - return QString::fromStdString(data_.at((index.row() - 1) / 2).address.display()); + return QString::fromStdString(data_.at(index.row() - 1).address.display()); } catch (const std::exception&) { return {}; } default: break; @@ -786,7 +785,7 @@ QHash TxInOutModel::roleNames() const QString TxInOutModel::getData(int row, int col) const { - if (row > (data_.size() * 2)) { + if (row > data_.size()) { return {}; } if (row == 0) { @@ -795,29 +794,11 @@ QString TxInOutModel::getData(int row, int col) const try { switch (col) { case 0: - if ((row % 2) == 1) { - return tr("Ad.:"); - } - else { - return tr("Tx.:"); - } + return QString::fromStdString(data_.at(row - 1).outHash.toHexStr(true)); case 1: - if ((row % 2) == 1) { - return QString::fromStdString(data_.at((row - 1) / 2).address.display()); - } - else { - return QString::fromStdString(data_.at((row - 1) / 2).outHash.toHexStr(true)); - } + return QString::fromStdString(data_.at(row - 1).valueStr); case 2: - if ((row % 2) == 1) { - return QString::fromStdString(data_.at((row - 1) / 2).valueStr); - } - break; - case 3: - if ((row % 2) == 1) { - return QString::fromStdString(data_.at((row - 1) / 2).walletName); - } - break; + return QString::fromStdString(data_.at(row - 1).walletName); default: break; } } @@ -830,9 +811,9 @@ QString TxInOutModel::getData(int row, int col) const QColor TxInOutModel::dataColor(int row, int col) const { if ((row == 0) || (col == 0)) { - return QColorConstants::DarkGray; + return ColorScheme::tableHeaderColor; } - return QColorConstants::LightGray; + return QColorConstants::White; } float TxInOutModel::colWidth(int col) const diff --git a/GUI/QtQuick/images/down_arrow.svg b/GUI/QtQuick/images/down_arrow.svg new file mode 100644 index 000000000..491182880 --- /dev/null +++ b/GUI/QtQuick/images/down_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/images/logo_no_text.svg b/GUI/QtQuick/images/logo_no_text.svg new file mode 100644 index 000000000..4946473e5 --- /dev/null +++ b/GUI/QtQuick/images/logo_no_text.svg @@ -0,0 +1,4 @@ + + + + diff --git a/GUI/QtQuick/images/search_icon.svg b/GUI/QtQuick/images/search_icon.svg index 5ab55aa00..bebca294e 100644 --- a/GUI/QtQuick/images/search_icon.svg +++ b/GUI/QtQuick/images/search_icon.svg @@ -1,3 +1,3 @@ - - + + diff --git a/GUI/QtQuick/images/up_arrow.svg b/GUI/QtQuick/images/up_arrow.svg new file mode 100644 index 000000000..b6766bb96 --- /dev/null +++ b/GUI/QtQuick/images/up_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index 8c105793a..8c32114a3 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -115,5 +115,4 @@ QtObject { readonly property color addressesPanelBackgroundColor: "#333C435A" readonly property color listItemBorderColor: "#3C435A" - } diff --git a/GUI/QtQuick/qml/ExplorerAddress.qml b/GUI/QtQuick/qml/ExplorerAddress.qml index caec94e0e..ad4d4942f 100644 --- a/GUI/QtQuick/qml/ExplorerAddress.qml +++ b/GUI/QtQuick/qml/ExplorerAddress.qml @@ -15,6 +15,7 @@ import QtQml.Models 2 import "StyledControls" import "BsStyles" +import "Overview" //import "BsControls" //import "BsDialogs" //import "js/helper.js" as JsHelper @@ -22,113 +23,134 @@ import "BsStyles" Item { property var address + signal requestPageChange(var text) + Column { spacing: 23 + anchors.leftMargin: 18 + anchors.rightMargin: 18 + anchors.bottomMargin: 18 anchors.fill: parent - Label { - text: " " - font.pointSize: 50 - height: 50 + onVisibleChanged: { + if (visible) { + bsApp.startSearch(address) + } } + Row { spacing: 16 + Label { - text: qsTr("Address") - font.pointSize: 14 + text: qsTr("Address") + color: BSStyle.textColor + font.pixelSize: 20 + font.weight: Font.Bold + anchors.bottom: parent.bottom } Label { + id: address_label text: address - color: 'lightgrey' - font.pointSize: 12 + color: BSStyle.textColor + font.pixelSize: 14 + anchors.bottom: parent.bottom } - Button { - text: qsTr("Copy") - font.pointSize: 12 - onClicked: { - bsApp.copyAddressToClipboard(address) - } + + CopyIconButton { + anchors.left: address.right + onCopy: bsApp.copyAddressToClipboard(address) } } - Row { - spacing: 12 - Column { - Label { - text: qsTr("Transactions count") - font.pointSize: 8 - } - Label { - text: qsTr("%1").arg(txListByAddrModel.nbTx) - font.pointSize: 12 + + Rectangle { + width: parent.width + height: 60 + anchors.bottomMargin: 24 + anchors.topMargin: 24 + anchors.leftMargin: 18 + anchors.rightMargin: 18 + + radius: 14 + color: BSStyle.addressesPanelBackgroundColor + + border.width: 1 + border.color: BSStyle.comboBoxBorderColor + + Row { + anchors.fill: parent + anchors.verticalCenter: parent.verticalCenter + + BaseBalanceLabel { + width: 130 + label_text: qsTr("Transaction count") + label_value: txListByAddrModel.nbTx + anchors.verticalCenter: parent.verticalCenter } - } - Column { - Label { - text: qsTr("Balance (BTC)") - font.pointSize: 8 + + Rectangle { + width: 1 + height: 36 + color: BSStyle.tableSeparatorColor + anchors.verticalCenter: parent.verticalCenter } - Label { - text: qsTr("%1").arg(txListByAddrModel.balance) - font.pointSize: 12 + + BaseBalanceLabel { + width: 130 + label_text: qsTr("Balance (BTC)") + label_value: txListByAddrModel.balance + anchors.verticalCenter: parent.verticalCenter } - } - Column { - Label { - text: qsTr("Total Received (BTC)") - font.pointSize: 8 + + Rectangle { + width: 1 + height: 36 + color: BSStyle.tableSeparatorColor + anchors.verticalCenter: parent.verticalCenter } - Label { - text: qsTr("%1").arg(txListByAddrModel.totalReceived) - font.pointSize: 12 + + BaseBalanceLabel { + width: 150 + label_text: qsTr("Total Received (BTC)") + label_value: txListByAddrModel.totalReceived + anchors.verticalCenter: parent.verticalCenter } - } - Column { - Label { - text: qsTr("Total Sent (BTC)") - font.pointSize: 8 + + Rectangle { + width: 1 + height: 36 + color: BSStyle.tableSeparatorColor + anchors.verticalCenter: parent.verticalCenter } - Label { - text: qsTr("%1").arg(txListByAddrModel.totalSent) - font.pointSize: 12 + + BaseBalanceLabel { + width: 130 + label_text: qsTr("Total Sent (BTC)") + label_value: txListByAddrModel.totalSent + anchors.verticalCenter: parent.verticalCenter } } } + Label { - text: qsTr("Transactions") - font.pointSize: 14 + text: qsTr("Transactions") + color: BSStyle.textColor + font.pixelSize: 20 + font.weight: Font.Bold } - TableView { - width: 1008 - height: 450 - columnSpacing: 1 - rowSpacing: 1 - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } + CustomTableView { + width: parent.width + height: 500 model: txListByAddrModel - delegate: Rectangle { - implicitWidth: 112 * colWidth - implicitHeight: 20 - border.color: "black" - border.width: 1 - color: heading ? 'black' : 'darkslategrey' - clip: true - Text { - text: tableData - font.pointSize: heading ? 8 : 10 - color: dataColor - anchors.centerIn: parent - } - MouseArea { - anchors.fill: parent - onClicked: { - if (!heading && (model.column === 1)) { - explorerTX.tx = bsApp.getTXDetails(tableData) - explorerStack.push(explorerTX) - } - } - } + + copy_button_column_index: 1 + columnWidths: [0.12, 0.46, 0.05, 0.04, 0.04, 0.08, 0.08, 0.07, 0.06] + onCopyRequested: bsApp.copyAddressToClipboard(id) + + // TODO: change constant 257 with C++ defined enum + onCellClicked: (row, column, data) => { + var tx_id = column === 1 ? data : model.data(model.index(row, 1), 257) + requestPageChange(tx_id) } } } diff --git a/GUI/QtQuick/qml/ExplorerEmpty.qml b/GUI/QtQuick/qml/ExplorerEmpty.qml index a81eb775c..817853631 100644 --- a/GUI/QtQuick/qml/ExplorerEmpty.qml +++ b/GUI/QtQuick/qml/ExplorerEmpty.qml @@ -13,33 +13,27 @@ import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtQml.Models 2 -import "StyledControls" import "BsStyles" -//import "BsControls" -//import "BsDialogs" -//import "js/helper.js" as JsHelper Item { + anchors.fill: parent + anchors.topMargin: 226 + Column { - spacing: 32 - anchors.fill: parent + spacing: 24 + anchors.horizontalCenter: parent.horizontalCenter - Label { - text: " " - font.pointSize: 50 - height: 50 - } Image { - width: 150 - height: 150 - source: "qrc:/images/logo.png" - Layout.topMargin: 150 - //Layout.horizontalCenter: parent + width: 57 + height: 72 + source: "qrc:/images/logo_no_text.svg" + anchors.horizontalCenter: parent.horizontalCenter } Label { - text: qsTr("Provides you with a convenient, powerful, yet simple tool to read
transaction and address data from the bitcoin network
") - font.pointSize: 12 + text: qsTr("Provides you with a convenient, powerful, yet simple tool to read\n transaction and address data from the bitcoin network") + font.pixelSize: 16 + color: BSStyle.titleTextColor + horizontalAlignment: Text.AlignHCenter } - } } diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml index a3e5dd5d0..58e8b16f8 100644 --- a/GUI/QtQuick/qml/ExplorerPage.qml +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -20,8 +20,10 @@ import "BsStyles" //import "js/helper.js" as JsHelper Item { - property var searchStack: [] + + property int historyIndex: -1 property var searchHist: [] + id: explorer ExplorerEmpty { @@ -31,98 +33,187 @@ Item { ExplorerAddress { id: explorerAddress visible: false + onRequestPageChange: (text) => { expSearchBox.requestSearchText(text) } } ExplorerTX { id: explorerTX visible: false + onRequestPageChange: (text) => { expSearchBox.requestSearchText(text) } } // ExplorerLoader { // id: explorerTX // } Column { - spacing: 32 anchors.fill: parent + spacing: 0 - Row { - id: textInput - TextInput { - id: expSearchBox - width: 900 - height: 32 - color: 'lightgrey' - font.pointSize: 14 - - function textEntered() { - var rc = bsApp.startSearch(expSearchBox.text) - searchStack.push(expSearchBox.text) - if (rc === 0) { - ibFailure.displayMessage(qsTr("Unknown type of search key")) - } - else if (rc === 1) { // address entered - explorerAddress.address = expSearchBox.text - explorerStack.push(explorerAddress) + Rectangle { + id: explorer_menu_row + height: 100 + width: parent.width + + color: "transparent" + + Rectangle { + anchors.bottomMargin: 24 + anchors.topMargin: 24 + anchors.leftMargin: 18 + anchors.rightMargin: 18 + anchors.fill: parent + anchors.centerIn: parent + + radius: 14 + color: "#020817" + + border.width: 1 + border.color: BSStyle.comboBoxBorderColor + + Row { + spacing: 20 + anchors.fill: parent + anchors.leftMargin: 18 + + Image { + id: search_icon + width: 24 + height: 24 + source: "qrc:/images/search_icon.svg" + anchors.verticalCenter: parent.verticalCenter } - else if (rc === 2) { // TXid entered - explorerTX.tx = bsApp.getTXDetails(expSearchBox.text) - explorerStack.push(explorerTX) + + TextInput { + id: expSearchBox + anchors.verticalCenter: parent.verticalCenter + width: 900 + clip: true + color: 'lightgrey' + font.pixelSize: 16 + + function resetSearch() { + searchHist = [] + historyIndex = -1 + expSearchBox.clear() + explorerStack.replace(explorerEmpty) + } + + function prev() { + if (historyIndex >= 0) { + historyIndex--; + if (historyIndex >= 0) { + expSearchBox.text = searchHist[historyIndex] + openSearchResult() + } + else { + expSearchBox.clear() + explorerStack.replace(explorerEmpty) + } + } + } + + function next() { + if (historyIndex < (searchHist.length - 1)) { + historyIndex++; + expSearchBox.text = searchHist[historyIndex] + openSearchResult() + } + } + + function requestSearch() { + if (historyIndex >= 0) + searchHist = searchHist.slice(0, historyIndex + 1) + searchHist.push(expSearchBox.text) + historyIndex++; + openSearchResult() + } + + function requestSearchText(newText) { + expSearchBox.text = newText + requestSearch() + } + + function openSearchResult() { + var rc = bsApp.getAddressType(expSearchBox.text) + if (rc === 0) { + ibFailure.displayMessage(qsTr("Unknown type of search key")) + } + else if (rc === 1) { // address entered + explorerAddress.address = expSearchBox.text + explorerStack.replace(explorerAddress) + } + else if (rc === 2) { // TXid entered + explorerTX.tx = bsApp.getTXDetails(expSearchBox.text) + explorerStack.replace(explorerTX) + } + } + + onAccepted: requestSearch() + + Text { + text: qsTr("Search for transaction or address") + font.pixelSize: 16 + color: BSStyle.titleTextColor + anchors.fill: parent + visible: !expSearchBox.text && !expSearchBox.activeFocus + verticalAlignment: Text.AlignVCenter + } } } - onAccepted: textEntered() + Row { + id: right_buttons_menu + spacing: 8 + anchors.rightMargin: 11 + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + + Image { + width: 24 + height: 24 + source: "qrc:/images/paste_icon.png" + anchors.verticalCenter: parent.verticalCenter - Text { - text: qsTr("Search for transaction or address") - color: 'darkgrey' - visible: !expSearchBox.text && !expSearchBox.activeFocus - } - } - Button { - text: qsTr("<") - font.pointSize: 14 - width: 50 - enabled: (explorerStack.depth > 1) - onClicked: { - explorerStack.pop() - searchHist.push(searchStack[searchStack.length - 1]) - searchStack.pop - if (searchStack.length > 0) { - expSearchBox.text = searchStack[searchStack.length - 1] + MouseArea { + anchors.fill: parent + onClicked: { + expSearchBox.clear() + expSearchBox.paste() + expSearchBox.requestSearch() + } + } + } + + CustomSmallButton { + text: qsTr("<") + width: 29 + height: 29 + enabled: historyIndex >= 0 + onClicked: expSearchBox.prev() + } + + CustomSmallButton { + text: qsTr(">") + width: 29 + height: 29 + enabled: historyIndex < (searchHist.length - 1) + onClicked: expSearchBox.next() + } + + CustomSmallButton { + text: qsTr("Reset") + width: 68 + height: 29 + onClicked: expSearchBox.resetSearch() } - expSearchBox.text = "" - } - } - Button { - text: qsTr(">") - font.pointSize: 14 - width: 50 - enabled: true //(searchHist.length > 0) - onClicked: { - expSearchBox.text = searchHist[searchHist.length - 1] - expSearchBox.textEntered() - searchHist.pop } } } - Item { - Rectangle { - anchors.top: parent.top + 100 - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: parent.right - //clip: true - StackView { - id: explorerStack - anchors.fill: parent - initialItem: explorerEmpty - //anchors.top: parent.top + 100 - //anchors.bottom: parent.bottom - //anchors.left: parent.left - //anchors.right: parent.right - //clip: true - } - } + StackView { + id: explorerStack + width: parent.width + height: parent.height - explorer_menu_row.height + initialItem: explorerEmpty } } } diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index 3ca368495..a152eb229 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -15,208 +15,267 @@ import QtQml.Models 2 import "StyledControls" import "BsStyles" +import "Overview" //import "BsControls" //import "BsDialogs" //import "js/helper.js" as JsHelper Item { property var tx - property var expAddress - Component.onCompleted: { - expAddress = Qt.createComponent("ExplorerAddress.qml") - expAddress.visible = false - } + signal requestPageChange(var text) Column { spacing: 23 + anchors.leftMargin: 18 + anchors.rightMargin: 18 + anchors.bottomMargin: 18 anchors.fill: parent - Label { - text: " " - font.pointSize: 50 - height: 50 - } Row { spacing: 16 + Label { - text: qsTr("Transaction ID") - font.pointSize: 14 + text: qsTr("Transaction ID") + color: BSStyle.textColor + font.pixelSize: 20 + font.weight: Font.Bold + anchors.bottom: parent.bottom } Label { text: tx ? tx.txId : qsTr("Unknown") - color: 'lightgrey' - font.pointSize: 12 + color: BSStyle.textColor + font.pixelSize: 14 + anchors.bottom: parent.bottom } - Button { - text: qsTr("Copy") - font.pointSize: 12 - onClicked: { - bsApp.copyAddressToClipboard(tx.txId) - } + + CopyIconButton { + anchors.left: address.right + onCopy: bsApp.copyAddressToClipboard(tx.txId) } } - Row { - spacing: 12 - Column { - Label { - text: qsTr("Confirmations") - font.pointSize: 8 - } - Label { - text: qsTr("%1").arg(tx.nbConf) - font.pointSize: 12 + + Rectangle { + width: parent.width + height: 60 + anchors.bottomMargin: 24 + anchors.topMargin: 24 + anchors.leftMargin: 18 + anchors.rightMargin: 18 + + radius: 14 + color: BSStyle.addressesPanelBackgroundColor + + border.width: 1 + border.color: BSStyle.comboBoxBorderColor + + Row { + anchors.fill: parent + anchors.verticalCenter: parent.verticalCenter + + BaseBalanceLabel { + width: 110 + label_text: qsTr("Confirmations") + label_value: tx.nbConf + anchors.verticalCenter: parent.verticalCenter + label_value_color: "green" } - } - Column { - Label { - text: qsTr("Inputs") - font.pointSize: 8 + + Rectangle { + width: 1 + height: 36 + color: BSStyle.tableSeparatorColor + anchors.verticalCenter: parent.verticalCenter } - Label { - text: qsTr("%1").arg(tx.nbInputs) - font.pointSize: 12 + + BaseBalanceLabel { + width: 80 + label_text: qsTr("Inputs") + label_value: tx.nbInputs + anchors.verticalCenter: parent.verticalCenter } - } - Column { - Label { - text: qsTr("Outputs") - font.pointSize: 8 + + Rectangle { + width: 1 + height: 36 + color: BSStyle.tableSeparatorColor + anchors.verticalCenter: parent.verticalCenter } - Label { - text: qsTr("%1").arg(tx.nbOutputs) - font.pointSize: 12 + + BaseBalanceLabel { + width: 90 + label_text: qsTr("Outputs") + label_value: tx.nbOutputs + anchors.verticalCenter: parent.verticalCenter } - } - Column { - Label { - text: qsTr("Input Amount (BTC)") - font.pointSize: 8 + + Rectangle { + width: 1 + height: 36 + color: BSStyle.tableSeparatorColor + anchors.verticalCenter: parent.verticalCenter } - Label { - text: qsTr("%1").arg(tx.inputAmount) - font.pointSize: 12 + + BaseBalanceLabel { + width: 150 + label_text: qsTr("Input Amount (BTC)") + label_value: tx.inputAmount + anchors.verticalCenter: parent.verticalCenter } - } - Column { - Label { - text: qsTr("Output Amount (BTC)") - font.pointSize: 8 + + Rectangle { + width: 1 + height: 36 + color: BSStyle.tableSeparatorColor + anchors.verticalCenter: parent.verticalCenter } - Label { - text: qsTr("%1").arg(tx.outputAmount) - font.pointSize: 12 + + BaseBalanceLabel { + width: 150 + label_text: qsTr("Output Amount (BTC)") + label_value: tx.outputAmount + anchors.verticalCenter: parent.verticalCenter } - } - Column { - Label { - text: qsTr("Fees (BTC)") - font.pointSize: 8 + + Rectangle { + width: 1 + height: 36 + color: BSStyle.tableSeparatorColor + anchors.verticalCenter: parent.verticalCenter } - Label { - text: qsTr("%1").arg(tx.fee) - font.pointSize: 12 + + BaseBalanceLabel { + width: 130 + label_text: qsTr("Fees (BTC)") + label_value: tx.fee + anchors.verticalCenter: parent.verticalCenter } - } - Column { - Label { - text: qsTr("Fee per byte (s/b)") - font.pointSize: 8 + + Rectangle { + width: 1 + height: 36 + color: BSStyle.tableSeparatorColor + anchors.verticalCenter: parent.verticalCenter } - Label { - text: qsTr("%1").arg(tx.feePerByte) - font.pointSize: 12 + + BaseBalanceLabel { + width: 150 + label_text: qsTr("Fee per byte (s/b)") + label_value: tx.feePerByte + anchors.verticalCenter: parent.verticalCenter } - } - Column { - Label { - text: qsTr("Size (virtual bytes)") - font.pointSize: 8 + + Rectangle { + width: 1 + height: 36 + color: BSStyle.tableSeparatorColor + anchors.verticalCenter: parent.verticalCenter } - Label { - text: qsTr("%1").arg(tx.virtSize) - font.pointSize: 12 + + BaseBalanceLabel { + width: 150 + label_text: qsTr("Size (virtual bytes)") + label_value: tx.virtSize + anchors.verticalCenter: parent.verticalCenter } } } + Row { - spacing: 32 - Column { - Label { - text: qsTr("Input") - font.pointSize: 14 - } - - TableView { - width: 500 - height: 300 - columnSpacing: 1 - rowSpacing: 1 - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } - model: tx ? tx.inputs : addressListModel - delegate: Rectangle { - implicitWidth: 125 * colWidth - implicitHeight: 20 - border.color: "black" - border.width: 1 - color: heading ? 'black' : 'darkslategrey' - Text { - text: tableData - font.pointSize: heading ? 8 : 10 - color: dataColor - anchors.centerIn: parent + spacing: 24 + width: parent.width + height: 500 + + Rectangle { + height: parent.height + width: parent.width / 2 - 12 + + color: "transparent" + radius: 14 + + border.width: 1 + border.color: BSStyle.tableSeparatorColor + + Column { + anchors.fill: parent + anchors.margins: 20 + + Row { + spacing: 11 + Label { + text: qsTr("Input") + color: BSStyle.textColor + font.pixelSize: 20 + font.weight: Font.Bold } - MouseArea { - anchors.fill: parent - onClicked: { - if (!heading && (model.column === 1)) { - expAddress.address = address - bsApp.startSearch(address) - explorerStack.push(expAddress) - } - } + Image { + width: 9 + height: 12 + source: "qrc:/images/down_arrow.svg" + anchors.leftMargin: 20 + anchors.verticalCenter: parent.verticalCenter + } + } + + InputOutputTableView { + width: parent.width + height: parent.height - 20 + model: tx.inputs + copy_button_column_index: -1 + columnWidths: [0.7, 0.2, 0.1] + onCopyRequested: bsApp.copyAddressToClipboard(id) + + // TODO: change constant 261 with C++ defined enum + onCellClicked: (row, column, data) => { + var address = (column === 0) ? data : model.data(model.index(row, 0), 261) + requestPageChange(address) } } } } - Column { - Label { - text: qsTr("Output") - font.pointSize: 14 - } - TableView { - width: 500 - height: 300 - columnSpacing: 1 - rowSpacing: 1 - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } - model: tx ? tx.outputs : addressListModel - delegate: Rectangle { - implicitWidth: 125 * colWidth - implicitHeight: 20 - border.color: "black" - border.width: 1 - color: heading ? 'black' : 'darkslategrey' - Text { - text: tableData - font.pointSize: heading ? 8 : 10 - color: dataColor - anchors.centerIn: parent + + Rectangle { + height: parent.height + width: parent.width / 2 - 12 + + color: "transparent" + radius: 14 + + border.width: 1 + border.color: BSStyle.tableSeparatorColor + + Column { + anchors.fill: parent + anchors.margins: 20 + + Row { + spacing: 11 + Label { + text: qsTr("Output") + color: BSStyle.textColor + font.pixelSize: 20 + font.weight: Font.Bold + } + Image { + width: 9 + height: 12 + source: "qrc:/images/up_arrow.svg" + anchors.verticalCenter: parent.verticalCenter } - MouseArea { - anchors.fill: parent - onClicked: { - if (!heading && (model.column === 1)) { - visible = false - expAddress.address = address - bsApp.startSearch(address) - explorerStack.push(expAddress) - } - } + } + + InputOutputTableView { + width: parent.width + height: parent.height - 20 + model: tx.outputs + copy_button_column_index: -1 + columnWidths: [0.7, 0.2, 0.1] + onCopyRequested: bsApp.copyAddressToClipboard(id) + + // TODO: change constant 261 with C++ defined enum + onCellClicked: (row, column, data) => { + var address = (column === 0) ? data : model.data(model.index(row, 0), 261) + requestPageChange(address) } } } diff --git a/GUI/QtQuick/qml/Overview/AddressesTableView.qml b/GUI/QtQuick/qml/Overview/AddressesTableView.qml deleted file mode 100644 index 7ec6418bb..000000000 --- a/GUI/QtQuick/qml/Overview/AddressesTableView.qml +++ /dev/null @@ -1,141 +0,0 @@ - -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2.15 -import QtQuick.Controls 2.15 - -import "../BsStyles" - -TableView { - id: component - width: 1200 - height: 200 - - columnSpacing: 0 - rowSpacing: 0 - clip: true - boundsBehavior: Flickable.StopAtBounds - - ScrollBar.horizontal: ScrollBar { } - ScrollBar.vertical: ScrollBar { } - - signal copyRequested(var id) - - property int text_header_size: 10 - property int cell_text_size: 11 - - property var columnWidths: [350, 100, 120, 100] - columnWidthProvider: function (column) { - return (column === (columnWidths.length - - 1)) ? Math.max( - columnWidths[column], - component.width - columnWidths.reduce( - (sum, a) => sum + a, - 0) + columnWidths.slice( - -1)[0]) : columnWidths[column] - } - - property int selected_row_index: -1 - - delegate: Rectangle { - implicitHeight: 34 - color: row === 0 ? BSStyle.tableCellBackgroundColor : (row === selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor) - - Row { - anchors.fill: parent - - Text { - id: internal_text - text: tableData - height: parent.height - wrapMode: Text.Wrap - verticalAlignment: Text.AlignVCenter - - color: row === 0 ? BSStyle.titleTextColor : BSStyle.textColor - font.family: "Roboto" - font.weight: Font.Normal - font.pixelSize: row === 0 ? component.text_header_size : component.cell_text_size - - leftPadding: 10 - } - - Image { - id: copy_icon - width: 24 - height: 24 - visible: column === 0 && row == selected_row_index - anchors.verticalCenter: parent.verticalCenter - source: "qrc:/images/copy_icon.svg" - - MouseArea { - anchors.fill: parent - - ToolTip { - id: tool_tip - timeout: 1000 - text: qsTr("Copied") - - font.pixelSize: 10 - font.family: "Roboto" - font.weight: Font.Normal - - contentItem: Text { - text: tool_tip.text - font: tool_tip.font - color: BSStyle.textColor - } - - background: Rectangle { - color: BSStyle.buttonsStandardColor - border.color: BSStyle.buttonsStandardColor - border.width: 1 - radius: 14 - } - } - - onClicked: { - component.copyRequested(tableData) - tool_tip.visible = true - } - } - } - } - - Rectangle { - height: 1 - width: parent.width - color: BSStyle.tableSeparatorColor - - anchors.bottom: parent.bottom - } - - MouseArea { - anchors.fill: parent - preventStealing: true - propagateComposedEvents: true - hoverEnabled: true - - onClicked: mouse.accepted = false - - onEntered: { - if (row !== 0) { - component.selected_row_index = row - } - } - - onExited: { - if (row !== 0) { - component.selected_row_index = -1 - } - } - } - } -} diff --git a/GUI/QtQuick/qml/Overview/BalanceBar.qml b/GUI/QtQuick/qml/Overview/BalanceBar.qml index 766d6b5fa..63604ba49 100644 --- a/GUI/QtQuick/qml/Overview/BalanceBar.qml +++ b/GUI/QtQuick/qml/Overview/BalanceBar.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * diff --git a/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml b/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml index 56e1a63f6..da3f9d575 100644 --- a/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml +++ b/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * @@ -19,7 +19,8 @@ Rectangle { property int label_text_font_size: 12 property string label_value - property int label_value_font_size: 13 + property int label_value_font_size: 14 + property color label_value_color: BSStyle.balanceValueTextColor property string value_suffix property int left_text_padding: 10 @@ -44,8 +45,8 @@ Rectangle { text: control.label_value + " " + control.value_suffix leftPadding: control.left_text_padding - color: BSStyle.balanceValueTextColor - font.weight: Font.Medium + color: control.label_value_color + font.weight: Font.DemiBold font.pixelSize: control.label_value_font_size } } diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 7e0a8cfbd..65252157f 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * @@ -11,8 +11,8 @@ import QtQuick 2.15 import "../BsStyles" +import "../StyledControls" import "." as OverviewControls -import "../Transactions" Rectangle { id: control @@ -21,7 +21,6 @@ Rectangle { height: 788 color: "transparent" - signal copyWallet(var id) signal requestWalletProperties() signal createNewWallet() signal walletIndexChanged(index : int) @@ -65,13 +64,15 @@ Rectangle { } - OverviewControls.AddressesTableView { + CustomTableView { width: parent.width height: parent.height - 40 model: addressListModel + copy_button_column_index: 0 - onCopyRequested: control.copyWallet(id) + columnWidths: [0.52, 0.15, 0.18, 0.15] + onCopyRequested: bsApp.copyAddressToClipboard(id) } } } @@ -95,10 +96,14 @@ Rectangle { } - TransactionsTableView { + CustomTableView { width: parent.width height: parent.height - 40 model: pendingTxListModel + + copy_button_column_index: 3 + columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] + onCopyRequested: bsApp.copyAddressToClipboard(id) } } } diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index 5111d7c56..3f7a0f944 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 0f36d51d5..5d13392bc 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2018 - 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * @@ -43,7 +43,6 @@ Item { onRequestWalletProperties: console.log("Nothing to do") onCreateNewWallet: overview.newWalletClicked() onWalletIndexChanged: overview.curWalletIndexChanged(index) - onCopyWallet: bsApp.copyAddressToClipboard(id) } // Column { // spacing: 23 diff --git a/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml b/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml new file mode 100644 index 000000000..ccc12e5c3 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml @@ -0,0 +1,43 @@ + +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import "../BsStyles" + +Image { + id: control + + signal copy(); + + x: internal_text.contentWidth + copy_icon.width / 2 + width: 24 + height: 24 + anchors.verticalCenter: parent.verticalCenter + source: "qrc:/images/copy_icon.svg" + MouseArea { + anchors.fill: parent + ToolTip { + id: tool_tip + timeout: 1000 + text: qsTr("Copied") + font.pixelSize: 10 + font.family: "Roboto" + font.weight: Font.Normal + contentItem: Text { + text: tool_tip.text + font: tool_tip.font + color: BSStyle.textColor + } + background: Rectangle { + color: BSStyle.buttonsStandardColor + border.color: BSStyle.buttonsStandardColor + border.width: 1 + radius: 14 + } + } + onClicked: { + control.copy() + tool_tip.visible = true + } + } +} \ No newline at end of file diff --git a/GUI/QtQuick/qml/StyledControls/CustomButtonLeftIcon.qml b/GUI/QtQuick/qml/StyledControls/CustomButtonLeftIcon.qml index 06f3cfbc1..d46cf7d6c 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButtonLeftIcon.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButtonLeftIcon.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * diff --git a/GUI/QtQuick/qml/StyledControls/CustomButtonRightIcon.qml b/GUI/QtQuick/qml/StyledControls/CustomButtonRightIcon.qml index cbdfea574..08cb7e9e2 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButtonRightIcon.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButtonRightIcon.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * diff --git a/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml index 089b77d68..76f0f2314 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml @@ -37,9 +37,9 @@ Button { contentItem: Text { text: control.text font: control.font + anchors.fill: parent color: BSStyle.titleTextColor verticalAlignment: Text.AlignVCenter - - leftPadding: 4 + horizontalAlignment: Text.AlignHCenter } } diff --git a/GUI/QtQuick/qml/Transactions/TransactionsTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml similarity index 51% rename from GUI/QtQuick/qml/Transactions/TransactionsTableView.qml rename to GUI/QtQuick/qml/StyledControls/CustomTableView.qml index 80d6c8da7..b6f977f01 100644 --- a/GUI/QtQuick/qml/Transactions/TransactionsTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -2,7 +2,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * @@ -24,23 +24,19 @@ TableView { clip: true boundsBehavior: Flickable.StopAtBounds - ScrollBar.horizontal: ScrollBar { } ScrollBar.vertical: ScrollBar { } signal copyRequested(var id) + signal cellClicked(var row, var column, var data) + signal cellDoubleClicked(var row, var column, var data) property int text_header_size: 11 property int cell_text_size: 12 + property int copy_button_column_index: 0 - property var columnWidths: [150, 120, 100, 350, 120, 80, 80, 80] + property var columnWidths columnWidthProvider: function (column) { - return (column === (columnWidths.length - - 1)) ? Math.max( - columnWidths[column], - component.width - columnWidths.reduce( - (sum, a) => sum + a, - 0) + columnWidths.slice( - -1)[0]) : columnWidths[column] + return columnWidths[column] * component.width } property int selected_row_index: -1 @@ -49,14 +45,36 @@ TableView { implicitHeight: 34 color: row === 0 ? BSStyle.tableCellBackgroundColor : (row === selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor) - Row { + MouseArea { anchors.fill: parent + preventStealing: true + propagateComposedEvents: true + hoverEnabled: true + + onEntered: { + if (row !== 0) { + component.selected_row_index = row + } + } + + onExited: { + if (row !== 0) { + component.selected_row_index = -1 + } + } + + onClicked: component.cellClicked(row, column, tableData) + onDoubleClicked: component.cellDoubleClicked(row, column, tableData) + } + + Row { + width: parent.width + height: parent.height Text { id: internal_text text: tableData - anchors.fill: parent - wrapMode: Text.Wrap + height: parent.height verticalAlignment: Text.AlignVCenter clip: true @@ -68,46 +86,11 @@ TableView { leftPadding: 10 } - Image { + CopyIconButton { id: copy_icon x: internal_text.contentWidth + copy_icon.width / 2 - width: 24 - height: 24 - visible: column === 3 && row == selected_row_index - anchors.verticalCenter: parent.verticalCenter - source: "qrc:/images/copy_icon.svg" - - MouseArea { - anchors.fill: parent - - ToolTip { - id: tool_tip - timeout: 1000 - text: qsTr("Copied") - - font.pixelSize: 10 - font.family: "Roboto" - font.weight: Font.Normal - - contentItem: Text { - text: tool_tip.text - font: tool_tip.font - color: BSStyle.textColor - } - - background: Rectangle { - color: BSStyle.buttonsStandardColor - border.color: BSStyle.buttonsStandardColor - border.width: 1 - radius: 14 - } - } - - onClicked: { - component.copyRequested(tableData) - tool_tip.visible = true - } - } + visible: column === component.copy_button_column_index && row == selected_row_index + onCopy: component.copyRequested(tableData) } } @@ -118,26 +101,5 @@ TableView { anchors.bottom: parent.bottom } - - MouseArea { - anchors.fill: parent - preventStealing: true - propagateComposedEvents: true - hoverEnabled: true - - onClicked: mouse.accepted = false - - onEntered: { - if (row !== 0) { - component.selected_row_index = row - } - } - - onExited: { - if (row !== 0) { - component.selected_row_index = -1 - } - } - } } } diff --git a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml new file mode 100644 index 000000000..84ec910d4 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml @@ -0,0 +1,134 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.3 + +import "../BsStyles" + +CustomTableView { + id: component + + FontMetrics { + id: fontMetrics + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Normal + } + + delegate: Rectangle { + implicitHeight: row === 0 ? 34 : 58 + color: row === 0 ? BSStyle.tableCellBackgroundColor : (row === component.selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor) + + MouseArea { + anchors.fill: parent + preventStealing: true + propagateComposedEvents: true + hoverEnabled: true + + onEntered: { + if (row !== 0) { + component.selected_row_index = row + } + } + + onExited: { + if (row !== 0) { + component.selected_row_index = -1 + } + } + + onClicked: component.cellClicked(row, column, tableData) + onDoubleClicked: component.cellDoubleClicked(row, column, tableData) + } + + Row { + width: parent.width + height: parent.height + + Text { + id: internal_text + visible: column !== 0 || row === 0 + text: tableData + height: parent.height + verticalAlignment: row === 0 ? Text.AlignVCenter : Text.AlignTop + clip: true + + color: dataColor + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: row === 0 ? component.text_header_size : component.cell_text_size + + leftPadding: 10 + topPadding: row === 0 ? 0 : 9 + } + + Column { + spacing: 8 + visible: column === 0 && row !== 0 + width: parent.width + anchors.centerIn: parent + + Row { + width: parent.width + + Text { + id: address_label_item + text: "Ad.:" + color: BSStyle.titleTextColor + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: 13 + leftPadding: 10 + } + Text { + text: address + width: parent.width - fontMetrics.advanceWidth(address_label_item.text) - 10 + color: BSStyle.textColor + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: 13 + clip: true + } + } + Row { + width: parent.width + + Text { + id: transaction_label_item + text: "Tx.:" + color: BSStyle.titleTextColor + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: 13 + leftPadding: 10 + } + Text { + text: tableData + width: parent.width - fontMetrics.advanceWidth(transaction_label_item.text) - 10 + color: BSStyle.textColor + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: 13 + clip: true + } + } + } + } + + Rectangle { + height: 1 + width: parent.width + color: BSStyle.tableSeparatorColor + + anchors.bottom: parent.bottom + } + } +} diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index e174cb0a3..0685dc919 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -16,7 +16,6 @@ import QtQuick.Dialogs 1.3 import "StyledControls" import "BsStyles" -import "Transactions" as Transactions //import "BsControls" //import "BsDialogs" //import "js/helper.js" as JsHelper @@ -48,6 +47,7 @@ Item { anchors.margins: 18 Row { + id: transaction_header_menu width: parent.width height: 45 spacing: 15 @@ -136,11 +136,13 @@ Item { } } - Transactions.TransactionsTableView { + CustomTableView { width: parent.width - height: 600 + height: parent.height - transaction_header_menu.height model: txListModel + copy_button_column_index: 3 + columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 2d2bfcf7f..ad2aca879 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -115,7 +115,6 @@ qml/Pin/qmldir qml/StyledControls/CustomMessageDialog.qml qml/StyledControls/CustomMediumButton.qml - qml/Overview/AddressesTableView.qml qml/Overview/BalanceBar.qml qml/Overview/BaseBalanceLabel.qml qml/Overview/OverviewPanel.qml @@ -140,12 +139,17 @@ qml/StyledControls/CustomListRadioButton.qml qml/Settings/SettingsGeneral.qml images/combobox_open_button.svg - qml/Transactions/TransactionsTableView.qml + qml/StyledControls/CustomTableView.qml qml/StyledControls/CustomSmallButton.qml qml/StyledControls/CustomButtonRightIcon.qml qml/StyledControls/CustomButtonLeftIcon.qml images/calendar_icon.svg images/download_icon.svg images/search_icon.svg + images/logo_no_text.svg + qml/StyledControls/CopyIconButton.qml + qml/StyledControls/InputOutputTableView.qml + images/down_arrow.svg + images/up_arrow.svg From e47ee81373f970f8ad14fd623d2175aad7174b08 Mon Sep 17 00:00:00 2001 From: YZ Date: Mon, 6 Feb 2023 10:43:31 +0100 Subject: [PATCH 114/436] Fix review comments --- GUI/QtQuick/QtQuickAdapter.cpp | 20 +++++-------------- GUI/QtQuick/QtQuickAdapter.h | 2 +- GUI/QtQuick/qml/ExplorerPage.qml | 2 +- .../qml/StyledControls/CopyIconButton.qml | 2 +- .../StyledControls/InputOutputTableView.qml | 4 ++-- 5 files changed, 10 insertions(+), 20 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index dd910356e..d6ab7fa78 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1674,17 +1674,12 @@ void QtQuickAdapter::signAndBroadcast(QTXSignRequest* txReq, const QString& pass } } -int QtQuickAdapter::getAddressType(const QString& s) +int QtQuickAdapter::getSearchInputType(const QString& s) { const auto& trimmed = s.trimmed().toStdString(); - bs::Address address; - try { - address = bs::Address::fromAddressString(trimmed); - if (address.isValid()) { - return 1; - } + if (validateAddress(s)) { + return 1; } - catch (const std::exception&) {} if (trimmed.length() == 64) { // potential TX hash in hex const auto& txId = BinaryData::CreateFromHex(trimmed); @@ -1697,18 +1692,13 @@ int QtQuickAdapter::getAddressType(const QString& s) int QtQuickAdapter::startSearch(const QString& s) { - const auto& trimmed = s.trimmed().toStdString(); - bs::Address address; try { - address = bs::Address::fromAddressString(trimmed); - if (address.isValid()) { + if (validateAddress(s)) { expTxByAddrModel_->clear(); ArmoryMessage msg; - msg.set_get_address_history(address.display()); + msg.set_get_address_history(s.trimmed().toStdString()); pushRequest(user_, userBlockchain_, msg.SerializeAsString()); - return 1; } } catch (const std::exception&) {} - return 0; } \ No newline at end of file diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 71aac0f6b..ad42c1eaf 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -174,7 +174,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop , double amount, double fee, const QString& comment = {}, QUTXOList* utxos = nullptr); Q_INVOKABLE void getUTXOsForWallet(int walletIndex); Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); - Q_INVOKABLE int getAddressType(const QString&); + Q_INVOKABLE int getSearchInputType(const QString&); Q_INVOKABLE int startSearch(const QString&); Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml index 58e8b16f8..c4ce4c032 100644 --- a/GUI/QtQuick/qml/ExplorerPage.qml +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -133,7 +133,7 @@ Item { } function openSearchResult() { - var rc = bsApp.getAddressType(expSearchBox.text) + var rc = bsApp.getSearchInputType(expSearchBox.text) if (rc === 0) { ibFailure.displayMessage(qsTr("Unknown type of search key")) } diff --git a/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml b/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml index ccc12e5c3..5efaf27c7 100644 --- a/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml @@ -40,4 +40,4 @@ Image { tool_tip.visible = true } } -} \ No newline at end of file +} diff --git a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml index 84ec910d4..ad956a8b2 100644 --- a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml @@ -81,7 +81,7 @@ CustomTableView { Text { id: address_label_item - text: "Ad.:" + text: qsTr("Ad.:") color: BSStyle.titleTextColor font.family: "Roboto" font.weight: Font.Normal @@ -103,7 +103,7 @@ CustomTableView { Text { id: transaction_label_item - text: "Tx.:" + text: qsTr("Tx.:") color: BSStyle.titleTextColor font.family: "Roboto" font.weight: Font.Normal From 41762b4f2f9fed5ab9ab632180716140d54775e9 Mon Sep 17 00:00:00 2001 From: YZ Date: Mon, 6 Feb 2023 10:45:53 +0100 Subject: [PATCH 115/436] Removed unused types for methdods --- GUI/QtQuick/QtQuickAdapter.cpp | 2 +- GUI/QtQuick/QtQuickAdapter.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index d6ab7fa78..fc2e40257 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1690,7 +1690,7 @@ int QtQuickAdapter::getSearchInputType(const QString& s) return 0; } -int QtQuickAdapter::startSearch(const QString& s) +void QtQuickAdapter::startSearch(const QString& s) { try { if (validateAddress(s)) { diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index ad42c1eaf..3593280ef 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -175,7 +175,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void getUTXOsForWallet(int walletIndex); Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); Q_INVOKABLE int getSearchInputType(const QString&); - Q_INVOKABLE int startSearch(const QString&); + Q_INVOKABLE void startSearch(const QString&); Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); signals: From b9cb9f07704d2828d5cc2cfc736ab56f89b0b70e Mon Sep 17 00:00:00 2001 From: YZ Date: Mon, 6 Feb 2023 15:13:17 +0100 Subject: [PATCH 116/436] Inteface update --- GUI/QtQuick/QtQuickAdapter.cpp | 15 +++++---------- GUI/QtQuick/QtQuickAdapter.h | 2 +- GUI/QtQuick/qml/ExplorerAddress.qml | 6 ------ GUI/QtQuick/qml/ExplorerPage.qml | 1 + GUI/QtQuick/qml/ExplorerTX.qml | 4 ++-- 5 files changed, 9 insertions(+), 19 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index fc2e40257..e29ffd4b6 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1690,15 +1690,10 @@ int QtQuickAdapter::getSearchInputType(const QString& s) return 0; } -void QtQuickAdapter::startSearch(const QString& s) +void QtQuickAdapter::startAddressSearch(const QString& s) { - try { - if (validateAddress(s)) { - expTxByAddrModel_->clear(); - ArmoryMessage msg; - msg.set_get_address_history(s.trimmed().toStdString()); - pushRequest(user_, userBlockchain_, msg.SerializeAsString()); - } - } - catch (const std::exception&) {} + expTxByAddrModel_->clear(); + ArmoryMessage msg; + msg.set_get_address_history(s.trimmed().toStdString()); + pushRequest(user_, userBlockchain_, msg.SerializeAsString()); } \ No newline at end of file diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 3593280ef..02cb8482c 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -175,7 +175,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void getUTXOsForWallet(int walletIndex); Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); Q_INVOKABLE int getSearchInputType(const QString&); - Q_INVOKABLE void startSearch(const QString&); + Q_INVOKABLE void startAddressSearch(const QString&); Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); signals: diff --git a/GUI/QtQuick/qml/ExplorerAddress.qml b/GUI/QtQuick/qml/ExplorerAddress.qml index ad4d4942f..6b0b006c8 100644 --- a/GUI/QtQuick/qml/ExplorerAddress.qml +++ b/GUI/QtQuick/qml/ExplorerAddress.qml @@ -32,12 +32,6 @@ Item { anchors.bottomMargin: 18 anchors.fill: parent - onVisibleChanged: { - if (visible) { - bsApp.startSearch(address) - } - } - Row { spacing: 16 diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml index c4ce4c032..37fbf76ff 100644 --- a/GUI/QtQuick/qml/ExplorerPage.qml +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -139,6 +139,7 @@ Item { } else if (rc === 1) { // address entered explorerAddress.address = expSearchBox.text + bsApp.startAddressSearch(explorerAddress.address) explorerStack.replace(explorerAddress) } else if (rc === 2) { // TXid entered diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index a152eb229..e0590ba07 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -227,7 +227,7 @@ Item { // TODO: change constant 261 with C++ defined enum onCellClicked: (row, column, data) => { - var address = (column === 0) ? data : model.data(model.index(row, 0), 261) + var address = model.data(model.index(row, 0), 261) requestPageChange(address) } } @@ -274,7 +274,7 @@ Item { // TODO: change constant 261 with C++ defined enum onCellClicked: (row, column, data) => { - var address = (column === 0) ? data : model.data(model.index(row, 0), 261) + var address = model.data(model.index(row, 0), 261) requestPageChange(address) } } From ad7da99f5a68a0dc74a3d2c04d9245c622b90e5c Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 6 Feb 2023 23:31:20 +0300 Subject: [PATCH 117/436] trezor fixes --- BlockSettleHW/hwdeviceinterface.h | 1 - BlockSettleHW/hwdevicemanager.cpp | 115 +++++++++++------- BlockSettleHW/hwdevicemanager.h | 6 +- BlockSettleHW/ledger/ledgerDevice.cpp | 4 +- BlockSettleHW/trezor/trezorClient.cpp | 18 +-- BlockSettleHW/trezor/trezorDevice.cpp | 90 +++++++------- Core/SignerAdapter.cpp | 4 +- GUI/QtQuick/QTXSignRequest.h | 21 ++++ GUI/QtQuick/QtQuickAdapter.cpp | 103 ++++++++++------ GUI/QtQuick/QtQuickAdapter.h | 6 +- GUI/QtQuick/TxListModel.cpp | 11 +- GUI/QtQuick/hwdevicemodel.cpp | 17 ++- GUI/QtQuick/hwdevicemodel.h | 7 +- GUI/QtQuick/qml/CreateWallet/CreateWallet.qml | 1 + .../qml/CreateWallet/ImportHardware.qml | 4 +- GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml | 4 +- GUI/QtQuick/qml/Send/SignTransaction.qml | 3 +- common | 2 +- 18 files changed, 255 insertions(+), 162 deletions(-) diff --git a/BlockSettleHW/hwdeviceinterface.h b/BlockSettleHW/hwdeviceinterface.h index ca879ff02..4550f439a 100644 --- a/BlockSettleHW/hwdeviceinterface.h +++ b/BlockSettleHW/hwdeviceinterface.h @@ -38,7 +38,6 @@ namespace bs { std::string id; std::string vendor; std::string walletId; - std::string status; DeviceType type{ DeviceType::Unknown }; }; diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index 41000b151..5d6425cbc 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -69,6 +69,13 @@ bool DeviceManager::processBroadcast(const bs::message::Envelope& env) } } } + switch (env.sender->value()) { + case bs::message::TerminalUsers::Wallets: + return (processWallet(env) != bs::message::ProcessingResult::Ignored); + case bs::message::TerminalUsers::Signer: + return (processSigner(env) != bs::message::ProcessingResult::Ignored); + default: break; + } return false; } @@ -129,6 +136,7 @@ void DeviceManager::start() bs::message::ProcessingResult DeviceManager::processPrepareDeviceForSign(const bs::message::Envelope& env , const std::string& walletId) { + logger_->debug("[{}] {}", __func__, walletId); WalletsMessage msg; msg.set_hd_wallet_get(walletId); const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); @@ -222,12 +230,27 @@ bs::message::ProcessingResult DeviceManager::processSigner(const bs::message::En bs::message::ProcessingResult DeviceManager::processImport(const bs::message::Envelope& env , const HW::DeviceKey& key) { - const DeviceKey devKey{ fromMsg(key) }; + DeviceKey devKey{ fromMsg(key) }; + if (devKey.type == DeviceType::Unknown) { + devKey.type = DeviceType::HWTrezor; + } const auto& device = getDevice(devKey); if (!device) { - logger_->error("[hww::DeviceManager::processImport] no device found for id {}" + devKey.id = "C23C03585A8E444C242A70C4"; + devKey.label = "BlockSettleTest"; + devKey.vendor = "trezor.io"; + devKey.walletId = "2xSX1rAcN"; + bs::core::HwWalletInfo wltInfo{ bs::wallet::HardwareEncKey::WalletType::Trezor + , devKey.vendor, devKey.label, devKey.id }; + wltInfo.xpubRoot = "tpubD8JgFtY4RtgMN1ba5HLyJnkZizAggcspF6A4cqykeBEdf7z922uS9JdMK3CXwTNorLM3Rq19r4qYY3MCD38BRdSwipAjQ2G9uK2iUwXbn8Q"; + wltInfo.xpubNativeSegwit = "tpubDDSj2fiYBbr6pNzRfPddHhaQN96cfqhJxNLtixXLP1arWRGZspMSX9yoqSXzvCdG9F9giaXzkj4VMCam2FZsWYYX9Yy5RFVGUrzPGS5xKkA"; + wltInfo.xpubNestedSegwit = "tpubDDjriaSUoYgTyky2bypKVFkktRDUufKkJUgEsCgHyTo8NpfdMyAW2w3ByHNY4Dgrmq6z45rSuPikrmBLhaM5sXxS1cHnHNzuTQyZxE2AbFq"; + wltInfo.xpubLegacy = "tpubDCdDNLh6H5vqcSAAXKh5MSPLp8Jvt6eoxwFrNRBf8erJ46DPmcZB2FgDPbWcAq5WiLPE9qw5DWBWRWAikSpiZ25YNumeu2sew9FMzFNxLoD"; + walletInfoReady(devKey, wltInfo); + return bs::message::ProcessingResult::Success; + /*logger_->error("[hww::DeviceManager::processImport] no device found for id {}" , devKey.id); - return bs::message::ProcessingResult::Error; + return bs::message::ProcessingResult::Error;*/ //TODO: uncomment after debugging is done } device->getPublicKeys(); return bs::message::ProcessingResult::Success; @@ -236,6 +259,7 @@ bs::message::ProcessingResult DeviceManager::processImport(const bs::message::En bs::message::ProcessingResult bs::hww::DeviceManager::processSignTX(const bs::message::Envelope& env , const Blocksettle::Communication::headless::SignTxRequest& request) { + logger_->debug("[{}] {}", __func__, request.DebugString()); HW::DeviceMgrMessage msg; auto msgResp = msg.mutable_signed_tx(); if (envReqSign_.sender || txSignReq_.isValid()) { @@ -262,13 +286,11 @@ bs::message::ProcessingResult bs::hww::DeviceManager::processSignTX(const bs::me } } if (foundDevice.id.empty()) { - logger_->info("[{}] device for {} not found - obtaining the list", __func__ - , txSignReq.walletIds.at(0)); - scanDevices({}); - } - else { - signTxWithDevice(foundDevice); + logger_->info("[{}] device for {} is not ready", __func__, txSignReq.walletIds.at(0)); + operationFailed({}, "not ready for TX signing"); + return bs::message::ProcessingResult::Error; } + signTxWithDevice(foundDevice); return bs::message::ProcessingResult::Success; } @@ -340,10 +362,30 @@ bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::S if (!hdWallet.is_hardware() || !hdWallet.encryption_keys_size()) { logger_->error("[{}] wallet {} is not suitable", __func__, hdWallet.wallet_id()); return bs::message::ProcessingResult::Error; + } + bool isDeviceReady = false; + DeviceKey deviceKey{}; + for (const auto& device : devices_) { + if (device.walletId == hdWallet.wallet_id()) { + isDeviceReady = true; + deviceKey = device; + break; + } + } + const auto& walletReady = [this](const std::string& walletId) + { + HW::DeviceMgrMessage msg; + msg.set_device_ready(walletId); + pushBroadcast(user_, msg.SerializeAsString()); + }; + if (isDeviceReady) { + logger_->debug("[{}] device {}/{} was ready", __func__, deviceKey.id, deviceKey.walletId); + walletReady(deviceKey.walletId); + return bs::message::ProcessingResult::Success; } bs::wallet::HardwareEncKey hwEncType(BinaryData::fromString(hdWallet.encryption_keys(0))); - + logger_->debug("[{}] [re]scanning devices of type {}", __func__, (int)hwEncType.deviceType()); if (bs::wallet::HardwareEncKey::WalletType::Ledger == hwEncType.deviceType()) { ledgerClient_->scanDevices(); const auto& devices = ledgerClient_->deviceKeys(); @@ -354,7 +396,6 @@ bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::S } bool found = false; - DeviceKey deviceKey; for (const auto& key : devices) { if (key.walletId == hdWallet.wallet_id()) { deviceKey = key; @@ -370,31 +411,13 @@ bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::S } else { deviceReady(kDeviceLedgerId); + walletReady(deviceKey.walletId); } } else if (bs::wallet::HardwareEncKey::WalletType::Trezor == hwEncType.deviceType()) { - auto deviceId = hwEncType.deviceId(); - const bool cleanPrevSession = (lastUsedTrezorWallet_ != hdWallet.wallet_id()); - { - DeviceKey deviceKey; - bool found = false; - for (auto key : trezorClient_->deviceKeys()) { - if (key.id == deviceId) { - found = true; - deviceKey = key; - break; - } - } - - if (!found) { - deviceNotFound(deviceId); - } - else { - deviceReady(deviceId); - } - } - lastUsedTrezorWallet_ = hdWallet.wallet_id(); + trezorClient_->listDevices(); } + return bs::message::ProcessingResult::Success; } void DeviceManager::signTX(const DeviceKey& key, const bs::core::wallet::TXSignRequest& signReq) @@ -486,19 +509,30 @@ std::shared_ptr DeviceManager::getDevice(const DeviceKey& key) return nullptr; } -void DeviceManager::publicKeyReady(const std::string& devId, const std::string& walletId) +void DeviceManager::publicKeyReady(const DeviceKey& devKey) { - logger_->debug("[{}] walletId = {} for {}", __func__, walletId, devId); + logger_->debug("[{}] walletId = {} for {}", __func__, devKey.walletId, devKey.id); + { + HW::DeviceMgrMessage msg; + msg.set_device_ready(devKey.walletId); + pushBroadcast(user_, msg.SerializeAsString()); + } size_t nbCompleted = 0; - for (int i = 0; i < devices_.size(); ++i) { - if (devices_[i].id == devId) { - devices_[i].walletId = walletId; + bool foundDevice = false; + for (auto& device : devices_) { + if (device.id == devKey.id) { + device.walletId = devKey.walletId; nbCompleted++; + foundDevice = true; } - else if (!devices_.at(i).walletId.empty()) { + else if (!device.walletId.empty()) { nbCompleted++; } } + if (!foundDevice) { + devices_.push_back(devKey); + nbCompleted++; + } if (nbCompleted >= devices_.size()) { logger_->debug("[{}] all public keys retrieved", __func__); if (envReqScan_.sender) { @@ -593,7 +627,7 @@ void DeviceManager::scanningDone() logger_->error("[DeviceManager::scanningDone] more scanning done events than expected"); return; } - if (--nbScanning_ == 0) { + if (--nbScanning_ <= 0) { logger_->debug("[DeviceManager::scanningDone] all devices scanned"); scanningDone(true); } @@ -629,13 +663,12 @@ namespace bs { msgKey->set_id(key.id); msgKey->set_vendor(key.vendor); msgKey->set_wallet_id(key.walletId); - msgKey->set_status(key.status); msgKey->set_type((int)key.type); } bs::hww::DeviceKey fromMsg(const BlockSettle::HW::DeviceKey& msg) { return { msg.label(), msg.id(), msg.vendor(), msg.wallet_id() - , msg.status(), static_cast(msg.type()) }; + , static_cast(msg.type()) }; } Path getDerivationPath(bool testNet, Purpose element) diff --git a/BlockSettleHW/hwdevicemanager.h b/BlockSettleHW/hwdevicemanager.h index de5d6234c..64a500ca3 100644 --- a/BlockSettleHW/hwdevicemanager.h +++ b/BlockSettleHW/hwdevicemanager.h @@ -51,7 +51,7 @@ namespace bs { struct DeviceCallbacks { - virtual void publicKeyReady(const std::string& devId, const std::string& walletId) = 0; + virtual void publicKeyReady(const DeviceKey&) = 0; virtual void walletInfoReady(const DeviceKey&, const bs::core::HwWalletInfo&) = 0; virtual void requestPinMatrix(const DeviceKey&) = 0; virtual void requestHWPass(const DeviceKey&, bool allowedOnDevice) = 0; @@ -80,7 +80,7 @@ namespace bs { std::string name() const override { return "HWWallets"; } private: // signals - void publicKeyReady(const std::string& devId, const std::string& walletId) override; + void publicKeyReady(const DeviceKey&) override; void walletInfoReady(const DeviceKey&, const bs::core::HwWalletInfo&) override; void requestPinMatrix(const DeviceKey&) override; void requestHWPass(const DeviceKey&, bool allowedOnDevice) override; @@ -140,7 +140,7 @@ namespace bs { std::vector devices_; bool testNet_{false}; - unsigned nbScanning_{}; + int nbScanning_{0}; bool isSigning_{}; std::string lastOperationError_; std::string lastUsedTrezorWallet_; diff --git a/BlockSettleHW/ledger/ledgerDevice.cpp b/BlockSettleHW/ledger/ledgerDevice.cpp index 4eedc3fa9..f204edc8e 100644 --- a/BlockSettleHW/ledger/ledgerDevice.cpp +++ b/BlockSettleHW/ledger/ledgerDevice.cpp @@ -150,7 +150,7 @@ DeviceKey LedgerDevice::key() const } return { hidDeviceInfo_.product, hidDeviceInfo_.serialNumber - , hidDeviceInfo_.manufacturer, walletId, {}, DeviceType::HWLedger }; + , hidDeviceInfo_.manufacturer, walletId, DeviceType::HWLedger }; } DeviceType LedgerDevice::type() const @@ -508,7 +508,7 @@ void bs::hww::LedgerDevice::retrieveXPubRoot() if (xpubRoot_.empty()) { xpubRoot_ = pubKey.getPublicKey(); const auto& devKey = key(); - cb_->publicKeyReady(devKey.id, devKey.walletId); + cb_->publicKeyReady(devKey); return; } try { diff --git a/BlockSettleHW/trezor/trezorClient.cpp b/BlockSettleHW/trezor/trezorClient.cpp index 66287ede0..3bb331f51 100644 --- a/BlockSettleHW/trezor/trezorClient.cpp +++ b/BlockSettleHW/trezor/trezorClient.cpp @@ -159,21 +159,11 @@ void TrezorClient::acquireDevice(const trezor::DeviceData& devData, bool init) auto acquireCallback = [this, prevSessionId, devData, init] (const std::shared_ptr& data) { - if (nbDevices_ == 0) { - cb_->scanningDone(); - } --nbDevices_; - const auto& scanDone = [this] - { - if (nbDevices_ == 0) { - cb_->scanningDone(); - } - }; const auto& reply = std::static_pointer_cast(data); if (!reply || !reply->error.empty() || reply->response.empty()) { logger_->error("[TrezorClient::acquireDevice] network error: {}" , (reply && !reply->error.empty()) ? reply->error : ""); - scanDone(); return; } nlohmann::json response; @@ -182,7 +172,6 @@ void TrezorClient::acquireDevice(const trezor::DeviceData& devData, bool init) } catch (const nlohmann::json::exception& e) { logger_->error("[TrezorClient::acquireDevice] failed to parse '{}': {}", reply->response, e.what()); - scanDone(); return; } @@ -192,7 +181,6 @@ void TrezorClient::acquireDevice(const trezor::DeviceData& devData, bool init) if (devDataCopy.sessionId.empty() || devDataCopy.sessionId == prevSessionId) { logger_->error("[TrezorClient::acquireDevice] cannot acquire device"); - scanDone(); return; } @@ -202,12 +190,8 @@ void TrezorClient::acquireDevice(const trezor::DeviceData& devData, bool init) state_ = trezor::State::Acquired; const auto& newDevice = std::make_shared(logger_, devDataCopy , testNet_, cb_, trezorEndPoint_); - if (init) { - logger_->debug("[TrezorClient::acquireDevice] init {} from acquire", devData.path); - newDevice->init(); - } + newDevice->init(); devices_.push_back(newDevice); - scanDone(); }; logger_->info("[TrezorClient::acquireDevice] old session id: {}", prevSessionId); processQueued(inData, acquireCallback); diff --git a/BlockSettleHW/trezor/trezorDevice.cpp b/BlockSettleHW/trezor/trezorDevice.cpp index 193a4c173..6997817e9 100644 --- a/BlockSettleHW/trezor/trezorDevice.cpp +++ b/BlockSettleHW/trezor/trezorDevice.cpp @@ -137,15 +137,11 @@ void TrezorDevice::releaseConnection() DeviceKey TrezorDevice::key() const { std::string walletId; - std::string status; if (!xpubRoot_.empty()) { walletId = bs::core::wallet::computeID(xpubRoot_).toBinStr(); } - else { - status = "not inited"; - } return { features_->label(), features_->device_id(), features_->vendor() - , walletId, status, type() }; + , walletId, type() }; } DeviceType TrezorDevice::type() const @@ -171,7 +167,6 @@ void TrezorDevice::init() reset(); return; } - state_ = trezor::State::Init; const auto& msg = unpackMessage(QByteArray::fromStdString(reply->response)); handleMessage(msg); }; @@ -351,6 +346,7 @@ void TrezorDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX) } cb_->txSigned(key(), SecureBinaryData::fromString(reply->signedTX)); }; + logger_->debug("[{}] {}", __func__, message.DebugString()); makeCall(message, cb); } @@ -374,7 +370,7 @@ void TrezorDevice::retrieveXPubRoot() logger_->debug("[TrezorDevice::retrieveXPubRoot] {}: {}", features_->label(), reply->xpub); xpubRoot_ = BinaryData::fromString(reply->xpub); const auto& devKey = key(); - cb_->publicKeyReady(devKey.id, devKey.walletId); + cb_->publicKeyReady(devKey); }; makeCall(message, saveXpubRoot); } @@ -382,12 +378,12 @@ void TrezorDevice::retrieveXPubRoot() void TrezorDevice::makeCall(const google::protobuf::Message &msg , const bs::WorkerPool::callback& callback) { - if (state_ == trezor::State::None) { + if (state_ != trezor::State::Init) { logger_->debug("[{}] re-initing device", __func__); init(); } auto cb = callback; - if ((cb == nullptr) && (awaitingCallbacks_.empty())) { + if ((cb == nullptr) && !awaitingCallbacks_.empty()) { cb = awaitingCallbacks_.front(); awaitingCallbacks_.pop_front(); } @@ -396,7 +392,7 @@ void TrezorDevice::makeCall(const google::protobuf::Message &msg const auto& reply = std::static_pointer_cast(data); if (!reply || !reply->error.empty()) { logger_->error("[TrezorDevice::makeCall] network error: {}" - , (reply && !reply->error.empty()) ? reply->error : ""); + , (reply && !reply->error.empty()) ? reply->error : (data ? "" : "")); //emit operationFailed(QLatin1String("Network error")); reset(); return; @@ -446,10 +442,14 @@ void TrezorDevice::handleMessage(const trezor::MessageData& data, const bs::Work case MessageType_Features: { if (parseResponse(*features_, data)) { + state_ = trezor::State::Init; logger_->debug("[TrezorDevice::handleMessage] features: model '{}' v{}.{}.{}" , features_->model(), features_->major_version(), features_->minor_version(), features_->patch_version()); // + getJSONReadableMessage(features_)); retrieveXPubRoot(); + if (cb_) { + cb_->scanningDone(); + } } else { logger_->error("[TrezorDevice::handleMessage] failed to parse features response"); @@ -463,11 +463,11 @@ void TrezorDevice::handleMessage(const trezor::MessageData& data, const bs::Work logger_->debug("[TrezorDevice::handleMessage] ButtonRequest {}", getJSONReadableMessage(request)); } common::ButtonAck response; - makeCall(response); + makeCall(response, cb); sendTxMessage(/*HWInfoStatus::kPressButton*/"press the button"); txSignedByUser_ = true; } - break; + return; case MessageType_PinMatrixRequest: { common::PinMatrixRequest request; @@ -495,13 +495,19 @@ void TrezorDevice::handleMessage(const trezor::MessageData& data, const bs::Work { bitcoin::PublicKey publicKey; if (parseResponse(publicKey, data)) { - logger_->debug("[TrezorDevice::handleMessage] PublicKey: {}" + logger_->debug("[TrezorDevice::handleMessage] public key: {}" , getJSONReadableMessage(publicKey)); } - if (cb) { + auto callback = cb; + if (!callback && !awaitingCallbacks_.empty()) { + logger_->debug("[TrezorDevice::handleMessage::PublicKey] retrieving pooled callback"); + callback = awaitingCallbacks_.front(); + awaitingCallbacks_.pop_front(); + } + if (callback) { const auto& outData = std::make_shared(); outData->xpub = publicKey.xpub(); - cb(outData); + callback(outData); return; } } @@ -558,8 +564,7 @@ void TrezorDevice::handleTxRequest(const trezor::MessageData& data assert(currentTxSignReq_); bitcoin::TxRequest txRequest; if (parseResponse(txRequest, data)) { - logger_->debug("[TrezorDevice] handleMessage TxRequest " - + getJSONReadableMessage(txRequest)); + logger_->debug("[TrezorDevice::handleTxRequest] {}", getJSONReadableMessage(txRequest)); } if (txRequest.has_serialized() && txRequest.serialized().has_serialized_tx()) { @@ -583,10 +588,9 @@ void TrezorDevice::handleTxRequest(const trezor::MessageData& data input->set_script_sig(txIn.getScript().toBinStr()); } - logger_->debug("[TrezorDevice] handleTxRequest TXINPUT for prev hash" - + getJSONReadableMessage(txAck)); - - makeCall(txAck); + logger_->debug("[TrezorDevice::handleTxRequest] TXINPUT for prev hash: {}" + , getJSONReadableMessage(txAck)); + makeCall(txAck, cb); break; } @@ -594,15 +598,19 @@ void TrezorDevice::handleTxRequest(const trezor::MessageData& data bitcoin::TxAck_TransactionType_TxInputType *input = type->add_inputs(); const int index = txRequest.details().request_index(); + logger_->debug("[TrezorDevice::handleTxRequest] TXINPUT index={}, txInCount={}" + , index, currentTxSignReq_->armorySigner_.getTxInCount()); assert(index >= 0 && index < currentTxSignReq_->armorySigner_.getTxInCount()); auto spender = currentTxSignReq_->armorySigner_.getSpender(index); auto utxo = spender->getUtxo(); auto address = bs::Address::fromUTXO(utxo); const auto purp = bs::hd::purpose(address.getType()); + logger_->debug("[TrezorDevice::handleTxRequest] TXINPUT address {}", address.display()); auto bip32Paths = spender->getBip32Paths(); if (bip32Paths.size() != 1) { + logger_->error("[TrezorDevice::handleTxRequest] TXINPUT {} BIP32 paths", bip32Paths.size()); throw std::logic_error("unexpected pubkey count for spender"); } const auto& path = bip32Paths.begin()->second.getDerivationPathFromSeed(); @@ -633,13 +641,11 @@ void TrezorDevice::handleTxRequest(const trezor::MessageData& data if (currentTxSignReq_->RBF) { input->set_sequence(UINT32_MAX - 2); } - txAck.set_allocated_tx(type); - logger_->debug("[TrezorDevice] handleTxRequest TXINPUT" - + getJSONReadableMessage(txAck)); - - makeCall(txAck); + logger_->debug("[TrezorDevice::handleTxRequest] TXINPUT response {}" + , getJSONReadableMessage(txAck)); + makeCall(txAck, cb); } break; case bitcoin::TxRequest_RequestType_TXOUTPUT: @@ -654,10 +660,10 @@ void TrezorDevice::handleTxRequest(const trezor::MessageData& data binOutput->set_script_pubkey(txOut.getScript().toBinStr()); } - logger_->debug("[TrezorDevice] handleTxRequest TXOUTPUT for prev hash" - + getJSONReadableMessage(txAck)); + logger_->debug("[TrezorDevice::handleTxRequest] TXOUTPUT for prev hash: {}" + , getJSONReadableMessage(txAck)); - makeCall(txAck); + makeCall(txAck, cb); break; } @@ -671,7 +677,6 @@ void TrezorDevice::handleTxRequest(const trezor::MessageData& data if (currentTxSignReq_->change.address != address) { // general output output->set_address(address.display()); output->set_amount(bsOutput->getValue()); - //output->set_script_type(bitcoin::TxAck_TransactionType_TxOutputType_OutputScriptType_PAYTOADDRESS); output->set_script_type(bitcoin::PAYTOADDRESS); } else { const auto &change = currentTxSignReq_->change; @@ -680,7 +685,9 @@ void TrezorDevice::handleTxRequest(const trezor::MessageData& data const auto purp = bs::hd::purpose(change.address.getType()); if (change.index.empty()) { - throw std::logic_error(fmt::format("can't find change address index for '{}'", change.address.display())); + const auto& errorMsg = fmt::format("can't find change address index for '{}'", change.address.display()); + logger_->error("[TrezorDevice::handleTxRequest::TXOUTPUT] {}", errorMsg); + throw std::logic_error(errorMsg); } auto path = getDerivationPath(testNet_, purp); @@ -700,17 +707,17 @@ void TrezorDevice::handleTxRequest(const trezor::MessageData& data else if (changeType == AddressEntryType_P2PKH) { scriptType = bitcoin::PAYTOADDRESS; } else { - throw std::runtime_error(fmt::format("unexpected changeType: {}", static_cast(changeType))); + const auto& errorMsg = fmt::format("unexpected change type: {}", (int)changeType); + logger_->error("[TrezorDevice::handleTxRequest::TXOUTPUT] {}", errorMsg); + throw std::runtime_error(errorMsg); } - output->set_script_type(scriptType); } txAck.set_allocated_tx(type); - logger_->debug("[TrezorDevice] handleTxRequest TXOUTPUT" - + getJSONReadableMessage(txAck)); - - makeCall(txAck); + logger_->debug("[TrezorDevice::handleTxRequest] TXOUTPUT response: {}" + , getJSONReadableMessage(txAck)); + makeCall(txAck, cb); } break; case bitcoin::TxRequest_RequestType_TXMETA: @@ -725,11 +732,8 @@ void TrezorDevice::handleTxRequest(const trezor::MessageData& data data->set_inputs_cnt(tx.getNumTxIn()); data->set_outputs_cnt(tx.getNumTxOut()); } - - logger_->debug("[TrezorDevice] handleTxRequest TXMETA" - + getJSONReadableMessage(txAck)); - - makeCall(txAck); + logger_->debug("[TrezorDevice::handleTxRequest] TXMETA response: {}", getJSONReadableMessage(txAck)); + makeCall(txAck, cb); } break; case bitcoin::TxRequest_RequestType_TXFINISHED: @@ -744,6 +748,8 @@ void TrezorDevice::handleTxRequest(const trezor::MessageData& data } break; default: + logger_->error("[TrezorDevice::handleTxRequest] unhandled request type {}" + , txRequest.request_type()); break; } } diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 18c64b0a6..e8fb902c9 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -634,14 +634,16 @@ ProcessingResult SignerAdapter::processCreateWallet(const bs::message::Envelope& bs::message::ProcessingResult SignerAdapter::processImportHwWallet(const bs::message::Envelope& env , const BlockSettle::Common::SignerMessage_ImportHWWallet& request) { + logger_->debug("[{}] {}", __func__, request.DebugString()); const bs::core::HwWalletInfo hwwInfo{ static_cast(request.type()) , request.vendor(), request.label(), request.device_id(), request.xpub_root() , request.xpub_nested_segwit(), request.xpub_native_segwit(), request.xpub_legacy() }; SignerMessage msg; auto msgResp = msg.mutable_created_wallet(); try { + logger_->debug("[{}] label: {}, vendor: {}", __func__, hwwInfo.label, hwwInfo.vendor); const auto& hwWallet = std::make_shared(netType_ - , hwwInfo, walletsDir_ + "/bs_hw_.lmdb", logger_); + , hwwInfo, walletsDir_, logger_); walletsMgr_->addWallet(hwWallet); msgResp->set_wallet_id(hwWallet->walletId()); walletsChanged(true); diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h index 4e5edba8e..fc5a5b784 100644 --- a/GUI/QtQuick/QTXSignRequest.h +++ b/GUI/QtQuick/QTXSignRequest.h @@ -35,6 +35,19 @@ class QTXSignRequest : public QObject void setTxSignReq(const bs::core::wallet::TXSignRequest&); void setError(const QString&); + void setHWW(bool hww) + { + if (isHWW_ != hww) { + isHWW_ = hww; + emit hwwChanged(); + } + } + void setHWWready() + { + isHWWready_ = true; + emit hwwReady(); + } + Q_PROPERTY(QStringList outputAddresses READ outputAddresses NOTIFY txSignReqChanged) QStringList outputAddresses() const; Q_PROPERTY(QString outputAmount READ outputAmount NOTIFY txSignReqChanged) @@ -54,14 +67,22 @@ class QTXSignRequest : public QObject Q_PROPERTY(bool isValid READ isValid NOTIFY txSignReqChanged) bool isValid() const { return (error_.isEmpty() && txReq_.isValid()); } Q_PROPERTY(QString maxAmount READ outputAmount NOTIFY txSignReqChanged) + Q_PROPERTY(bool isHWW READ isHWW NOTIFY hwwChanged) + bool isHWW() const { return isHWW_; } + Q_PROPERTY(bool isHWWready READ isHWWready NOTIFY hwwReady) + bool isHWWready() const { return isHWWready_; } signals: void txSignReqChanged(); + void hwwChanged(); + void hwwReady(); void error(); private: bs::core::wallet::TXSignRequest txReq_{}; QString error_; + bool isHWW_{ false }; + bool isHWWready_{ false }; }; #endif // Q_TX_SIGN_REQUEST_H diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index e29ffd4b6..1c6f855d9 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -132,7 +132,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) expTxByAddrModel_ = new TxListForAddr(logger, this); txOutputsModel_ = new TxOutputsModel(logger, this); txInputsModel_ = new TxInputsModel(logger, txOutputsModel_, this); - hwDeviceModel_ = new HwDeviceModel(this); + hwDeviceModel_ = new HwDeviceModel(logger, this); walletBalances_ = new WalletBalancesModel(logger, this); feeSuggModel_ = new FeeSuggestionModel(logger, this); } @@ -645,6 +645,8 @@ bs::message::ProcessingResult QtQuickAdapter::processHWW(const bs::message::Enve QMetaObject::invokeMethod(this, [this, onDevice=msg.password_request().allowed_on_device()] { emit invokePasswordEntry(QString::fromStdString(curAuthDevice_.label), onDevice); }); return bs::message::ProcessingResult::Success; + case HW::DeviceMgrMessage::kDeviceReady: + return processHWWready(msg.device_ready()); default: break; } return bs::message::ProcessingResult::Ignored; @@ -1229,7 +1231,7 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri } const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); const auto txReq = new QTXSignRequest(this); - txReqs_[msgId] = txReq; + txReqs_[msgId] = { txReq, (amount == 0) }; return txReq; } @@ -1248,6 +1250,7 @@ QTxDetails* QtQuickAdapter::getTXDetails(const QString& txHash) auto txBinHash = BinaryData::CreateFromHex(txHash.trimmed().toStdString()); txBinHash.swapEndian(); if (txBinHash.getSize() != 32) { + logger_->warn("[{}] invalid TX hash size {}", __func__, txBinHash.getSize()); return new QTxDetails({}, this); } WalletsMessage msg; @@ -1308,8 +1311,8 @@ void QtQuickAdapter::setHWpassword(const QString& password) void QtQuickAdapter::importHWWallet(int deviceIndex) { - const auto& devKey = hwDeviceModel_->getDevice(deviceIndex); - if (devKey.id.empty()) { + auto devKey = hwDeviceModel_->getDevice(deviceIndex); + if (devKey.id.empty() && (deviceIndex >= 0)) { return; } HW::DeviceMgrMessage msg; @@ -1513,9 +1516,16 @@ void QtQuickAdapter::processWalletAddresses(const std::string& walletId if (addresses.empty()) { return; } + auto hdWalletId = walletId; + for (const auto& hdWallet : hdWallets_) { + if (hdWallet.second.hasLeaf(walletId)) { + hdWalletId = hdWallet.first; + break; + } + } const auto lastAddr = addresses.at(addresses.size() - 1); - logger_->debug("[{}] last address: {}", __func__, lastAddr.address.display()); - addrModel_->addRow(walletId, { QString::fromStdString(lastAddr.address.display()) + logger_->debug("[{}] {} last address: {}", __func__, hdWalletId, lastAddr.address.display()); + addrModel_->addRow(hdWalletId, { QString::fromStdString(lastAddr.address.display()) , QString::fromStdString(lastAddr.index) }); generatedAddress_ = lastAddr.address; emit addressGenerated(); @@ -1524,27 +1534,56 @@ void QtQuickAdapter::processWalletAddresses(const std::string& walletId bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::SeqId msgId , const WalletsMessage_TxResponse& response) { -// logger_->debug("[{}] {}", __func__, response.DebugString()); + logger_->debug("[{}] {}", __func__, response.DebugString()); const auto& itReq = txReqs_.find(msgId); if (itReq == txReqs_.end()) { logger_->error("[{}] unknown request #{}", __func__, msgId); return bs::message::ProcessingResult::Error; } - auto qReq = itReq->second; + auto qReq = itReq->second.first; + const bool noReqAmount = itReq->second.second; txReqs_.erase(itReq); if (!response.error_text().empty()) { logger_->error("[{}] {}", __func__, response.error_text()); qReq->setError(QString::fromStdString(response.error_text())); return bs::message::ProcessingResult::Success; } - const auto txReq = bs::signer::pbTxRequestToCore(response.tx_sign_request(), logger_); + auto txReq = bs::signer::pbTxRequestToCore(response.tx_sign_request(), logger_); + + std::unordered_set hdWalletIds; + for (const auto& walletId : txReq.walletIds) { + for (const auto& hdWallet : hdWallets_) { + if (hdWallet.second.hasLeaf(walletId)) { + hdWalletIds.insert(hdWallet.first); + } + } + } + logger_->debug("[{}] {} HD walletId[s]", __func__, hdWalletIds.size()); + txReq.walletIds.clear(); + for (const auto& walletId : hdWalletIds) { + txReq.walletIds.push_back(walletId); + try { + if (hdWallets_.at(walletId).isHardware) { + qReq->setHWW(true); + logger_->debug("[{}] noReqAmt: {} for {}", __func__, noReqAmount, walletId); + if (!noReqAmount) { + HW::DeviceMgrMessage msg; + msg.set_prepare_wallet_for_tx_sign(walletId); + pushRequest(user_, userHWW_, msg.SerializeAsString()); + hwwReady_[walletId] = qReq; + } + } + } + catch (const std::exception&) { + logger_->error("[{}] unknown walletId {}", __func__, walletId); + } + } qReq->setTxSignReq(txReq); return bs::message::ProcessingResult::Success; } bs::message::ProcessingResult QtQuickAdapter::processHWDevices(const HW::DeviceMgrMessage_Devices& response) { - logger_->debug("[{}] {}", __func__, response.DebugString()); std::vector devices; for (const auto& key : response.device_keys()) { devices.push_back(bs::hww::fromMsg(key)); @@ -1566,6 +1605,18 @@ bs::message::ProcessingResult QtQuickAdapter::processHWDevices(const HW::DeviceM return bs::message::ProcessingResult::Success; } +bs::message::ProcessingResult QtQuickAdapter::processHWWready(const std::string& walletId) +{ + logger_->debug("[{}] wallet {}", __func__, walletId); + const auto& it = hwwReady_.find(walletId); + if (it == hwwReady_.end()) { + return bs::message::ProcessingResult::Ignored; + } + it->second->setHWWready(); + hwwReady_.erase(it); + return bs::message::ProcessingResult::Success; +} + QVariant QtQuickAdapter::getSetting(ApplicationSettings::Setting s) const { try { @@ -1629,35 +1680,9 @@ void QtQuickAdapter::signAndBroadcast(QTXSignRequest* txReq, const QString& pass logger_->error("[{}] no TX request passed", __func__); return; } - const auto& txSignReq = txReq->txReq(); - bool needHWSign = false; - for (const auto& walletId : txSignReq.walletIds) { - try { - if (hdWallets_.at(walletId).isHardware) { - needHWSign = true; - HW::DeviceMgrMessage msg; - msg.set_prepare_wallet_for_tx_sign(walletId); - pushRequest(user_, userHWW_, msg.SerializeAsString()); - } - } - catch (const std::exception&) {} - } - if (needHWSign) { - unsigned nbNonHW = 0; - for (const auto& walletId : txSignReq.walletIds) { - try { - if (!hdWallets_.at(walletId).isHardware) { - logger_->warn("[{}] can't mix HW and non-HW wallets now " - "(non-HW wallet {})", __func__, walletId); - nbNonHW++; - } - } - catch (const std::exception&) {} - } - if (nbNonHW > 0) { - logger_->error("[{}] {} non-HW wallet[s] in sign request", __func__, nbNonHW); - return; - } + auto txSignReq = txReq->txReq(); + logger_->debug("[{}] HW sign: {}", __func__, txReq->isHWW()); + if (txReq->isHWW()) { HW::DeviceMgrMessage msg; *msg.mutable_sign_tx() = bs::signer::coreTxRequestToPb(txSignReq); pushRequest(user_, userHWW_, msg.SerializeAsString()); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 02cb8482c..4c5d48772 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -234,6 +234,7 @@ private slots: , const BlockSettle::Common::WalletsMessage_TxResponse&); bs::message::ProcessingResult processHWDevices(const BlockSettle::HW::DeviceMgrMessage_Devices&); + bs::message::ProcessingResult processHWWready(const std::string& walletId); bs::message::ProcessingResult processHWSignedTX(const BlockSettle::HW::DeviceMgrMessage_SignTxResponse&); QVariant getSetting(ApplicationSettings::Setting) const; @@ -278,8 +279,9 @@ private slots: bool hwDevicesPolling_{ false }; bs::hww::DeviceKey curAuthDevice_{}; - std::map txReqs_; - std::map txDetailReqs_; + std::map> txReqs_; + std::unordered_map hwwReady_; + std::map txDetailReqs_; std::map settingsCache_; std::set expTxAddrReqs_, expTxAddrInReqs_; }; diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index bf34e020d..c9526deeb 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -558,9 +558,11 @@ QHash TxListForAddr::roleNames() const void TxListForAddr::addRows(const std::vector& entries) { - beginInsertRows(QModelIndex(), rowCount(), rowCount() + entries.size() - 1); - data_.insert(data_.end(), entries.cbegin(), entries.cend()); - endInsertRows(); + if (!entries.empty()) { + beginInsertRows(QModelIndex(), rowCount(), rowCount() + entries.size() - 1); + data_.insert(data_.end(), entries.cbegin(), entries.cend()); + endInsertRows(); + } emit changed(); } @@ -655,6 +657,9 @@ QString TxListForAddr::balance() const void QTxDetails::setDetails(const bs::sync::TXWalletDetails& details) { details_ = details; + if (details.changeAddress.address.isValid()) { + details_.outputAddresses.push_back(details.changeAddress); + } QMetaObject::invokeMethod(this, [this] { inputsModel_ = new TxInOutModel(details_.inputAddresses, this); outputsModel_ = new TxInOutModel(details_.outputAddresses, this); diff --git a/GUI/QtQuick/hwdevicemodel.cpp b/GUI/QtQuick/hwdevicemodel.cpp index 51197d7d7..98d8e40f4 100644 --- a/GUI/QtQuick/hwdevicemodel.cpp +++ b/GUI/QtQuick/hwdevicemodel.cpp @@ -9,9 +9,11 @@ */ #include "hwdevicemodel.h" +#include -HwDeviceModel::HwDeviceModel(QObject *parent /*= nullptr*/) - : QAbstractItemModel(parent) +HwDeviceModel::HwDeviceModel(const std::shared_ptr& logger + , QObject *parent /*= nullptr*/) + : QAbstractItemModel(parent), logger_(logger) {} QVariant HwDeviceModel::data(const QModelIndex& index, int role /*= Qt::DisplayRole*/) const @@ -36,7 +38,7 @@ QVariant HwDeviceModel::data(const QModelIndex& index, int role /*= Qt::DisplayR case HwDeviceRoles::PairedWallet: return QString::fromStdString(devices_.at(row).walletId); case HwDeviceRoles::Status: - return QString::fromStdString(devices_.at(row).status); + //return QString::fromStdString(devices_.at(row).status); default: break; } @@ -101,9 +103,11 @@ int HwDeviceModel::getDeviceIndex(bs::hww::DeviceKey key) void HwDeviceModel::setLoaded(const std::string& walletId) { + logger_->debug("[{}] {}", __func__, walletId); for (int i = 0; i < devices_.size(); ++i) { const auto& device = devices_.at(i); if (device.walletId == walletId) { + logger_->debug("[{}] index={}", __func__, i); loaded_[i] = true; } } @@ -112,8 +116,13 @@ void HwDeviceModel::setLoaded(const std::string& walletId) int HwDeviceModel::selDevice() const { - for (int i = 0; i < loaded_.size(); ++i) { + logger_->debug("[{}] {} devices, {} loaded", __func__, devices_.size(), loaded_.size()); + if (loaded_.empty() && !devices_.empty()) { + return 0; + } + for (int i = 0; i < devices_.size(); ++i) { if (!loaded_.at(i)) { + logger_->debug("[{}] selected {}", __func__, i); return i; } } diff --git a/GUI/QtQuick/hwdevicemodel.h b/GUI/QtQuick/hwdevicemodel.h index ef26f3195..4938d35bb 100644 --- a/GUI/QtQuick/hwdevicemodel.h +++ b/GUI/QtQuick/hwdevicemodel.h @@ -15,6 +15,10 @@ #include "hwdeviceinterface.h" #include "hwcommonstructure.h" +namespace spdlog { + class logger; +} + enum HwDeviceRoles { DeviceId = Qt::UserRole + 1, Label, @@ -31,7 +35,7 @@ class HwDeviceModel : public QAbstractItemModel bool empty() const { return devices_.empty(); } public: - HwDeviceModel(QObject *parent = nullptr); + HwDeviceModel(const std::shared_ptr&, QObject *parent = nullptr); ~HwDeviceModel() override = default; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; @@ -56,6 +60,7 @@ class HwDeviceModel : public QAbstractItemModel int selDevice() const; private: + std::shared_ptr logger_; std::vector devices_; std::vector loaded_; }; diff --git a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml index 68376119b..314584655 100644 --- a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml @@ -38,6 +38,7 @@ CustomPopup { import_wallet.init() } onSig_hardware_wallet: { + //bsApp.importHWWallet(-1) //debugging wallet import bsApp.pollHWWallets() _stack_view.push(import_hardware) } diff --git a/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml index e59039cec..5013854cd 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml @@ -72,7 +72,7 @@ ColumnLayout { Text { text: label font.pointSize: 12 - color: heading ? 'darkgrey' : 'lightgrey' + color: 'lightgrey' anchors.centerIn: parent } MouseArea { @@ -98,7 +98,7 @@ ColumnLayout { Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter width: 530 - enabled: layout.isConnected && (hwDeviceModel.selDevice >= 0) + enabled: /*layout.isConnected &&*/ (hwDeviceModel.selDevice >= 0) Component.onCompleted: { confirm_but.preferred = true diff --git a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml index ce07e733a..0d47072a1 100644 --- a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml +++ b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml @@ -116,7 +116,7 @@ Window { anchors.topMargin: 48 anchors.horizontalCenter: parent.horizontalCenter - visible: !root.accept_on_device + //visible: !root.accept_on_device //always visible now - password can be empty in all cases height : 70 width: 390 @@ -160,7 +160,7 @@ Window { text: qsTr("Accept") width: 190 - enabled: accept_on_device || password.input_text.length + //enabled: accept_on_device || password.input_text.length //always accept now Component.onCompleted: { accept_but.preferred = true diff --git a/GUI/QtQuick/qml/Send/SignTransaction.qml b/GUI/QtQuick/qml/Send/SignTransaction.qml index c70bdffab..83b26e03a 100644 --- a/GUI/QtQuick/qml/Send/SignTransaction.qml +++ b/GUI/QtQuick/qml/Send/SignTransaction.qml @@ -326,6 +326,7 @@ ColumnLayout { title_leftMargin: 16 title_topMargin: 16 + visible: !txSignRequest.isHWW title_text: qsTr("Password") Component.onCompleted: { @@ -374,7 +375,7 @@ ColumnLayout { Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - enabled: password.input_text.length + enabled: (txSignRequest.isHWW && txSignRequest.isHWWready) || password.input_text.length Component.onCompleted: { broadcast_but.preferred = true diff --git a/common b/common index 9ccea5e97..e685d2f81 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 9ccea5e97a3e09203576aa64130013e660c55f99 +Subproject commit e685d2f81ad288408490fe9c4e6fcc77c724a6f6 From b8bcc8653095fad0af07c4877054a980b899792c Mon Sep 17 00:00:00 2001 From: YZ Date: Tue, 7 Feb 2023 01:23:21 +0100 Subject: [PATCH 118/436] UI fixes --- GUI/QtQuick/AddressListModel.cpp | 2 +- GUI/QtQuick/qml/ExplorerAddress.qml | 4 +- GUI/QtQuick/qml/Overview/BalanceBar.qml | 15 +- GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml | 3 +- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 9 +- GUI/QtQuick/qml/OverviewPage.qml | 184 ------------------ .../qml/StyledControls/CustomTableView.qml | 2 + GUI/QtQuick/qml/TransactionsPage.qml | 10 +- 8 files changed, 31 insertions(+), 198 deletions(-) diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index 904feb82f..29cbff185 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -25,7 +25,7 @@ namespace { QmlAddressListModel::QmlAddressListModel(const std::shared_ptr& logger , QObject* parent) : QAbstractTableModel(parent), logger_(logger) - , header_({ tr("Address"), tr("Balance (BTC)"), tr("#Tx"), tr("Comment") }) + , header_({ tr("Address"), tr("#Tx"), tr("Balance (BTC)"), tr("Comment") }) {} int QmlAddressListModel::rowCount(const QModelIndex &) const diff --git a/GUI/QtQuick/qml/ExplorerAddress.qml b/GUI/QtQuick/qml/ExplorerAddress.qml index 6b0b006c8..596e19c74 100644 --- a/GUI/QtQuick/qml/ExplorerAddress.qml +++ b/GUI/QtQuick/qml/ExplorerAddress.qml @@ -26,7 +26,7 @@ Item { signal requestPageChange(var text) Column { - spacing: 23 + spacing: 20 anchors.leftMargin: 18 anchors.rightMargin: 18 anchors.bottomMargin: 18 @@ -60,7 +60,7 @@ Item { width: parent.width height: 60 anchors.bottomMargin: 24 - anchors.topMargin: 24 + anchors.topMargin: 18 anchors.leftMargin: 18 anchors.rightMargin: 18 diff --git a/GUI/QtQuick/qml/Overview/BalanceBar.qml b/GUI/QtQuick/qml/Overview/BalanceBar.qml index 63604ba49..24f3ccbb2 100644 --- a/GUI/QtQuick/qml/Overview/BalanceBar.qml +++ b/GUI/QtQuick/qml/Overview/BalanceBar.qml @@ -35,6 +35,9 @@ Rectangle { id: confirmed_balance width: 130 label_text: qsTr("Confirmed balance") + value_suffix: qsTr('BTC') + label_text_font_size: 11 + label_value_font_size: 13 anchors.verticalCenter: parent.verticalCenter } @@ -47,8 +50,11 @@ Rectangle { OverviewControls.BaseBalanceLabel { id: unconfirmed_balance - width: 140 + width: 130 label_text: qsTr("Unconfirmed balance") + value_suffix: qsTr('BTC') + label_text_font_size: 11 + label_value_font_size: 13 anchors.verticalCenter: parent.verticalCenter } @@ -61,8 +67,11 @@ Rectangle { OverviewControls.BaseBalanceLabel { id: total_balance - width: 120 + width: 130 label_text: qsTr("Total balance") + value_suffix: qsTr('BTC') + label_text_font_size: 11 + label_value_font_size: 13 anchors.verticalCenter: parent.verticalCenter } @@ -77,6 +86,8 @@ Rectangle { id: used_addresses label_text: qsTr("#Used addresses") value_suffix: "" + label_text_font_size: 11 + label_value_font_size: 13 anchors.verticalCenter: parent.verticalCenter } } diff --git a/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml b/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml index da3f9d575..6636db681 100644 --- a/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml +++ b/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml @@ -21,6 +21,7 @@ Rectangle { property string label_value property int label_value_font_size: 14 property color label_value_color: BSStyle.balanceValueTextColor + property int label_value_font_weight: Font.DemiBold property string value_suffix property int left_text_padding: 10 @@ -46,7 +47,7 @@ Rectangle { leftPadding: control.left_text_padding color: control.label_value_color - font.weight: Font.DemiBold + font.weight: control.label_value_font_weight font.pixelSize: control.label_value_font_size } } diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 65252157f..bf88f166d 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -26,7 +26,8 @@ Rectangle { signal walletIndexChanged(index : int) Column { - anchors.margins: 20 + anchors.leftMargin: 18 + anchors.rightMargin: 18 anchors.fill: parent spacing: 0 @@ -41,7 +42,7 @@ Rectangle { } Rectangle { - height: (parent.height - overview_panel.height) * 0.6 + height: (parent.height - overview_panel.height) * 0.65 width: parent.width anchors.horizontalCenter: parent.horizontalCenter @@ -71,7 +72,7 @@ Rectangle { model: addressListModel copy_button_column_index: 0 - columnWidths: [0.52, 0.15, 0.18, 0.15] + columnWidths: [0.35, 0.15, 0.1, 0.4] onCopyRequested: bsApp.copyAddressToClipboard(id) } } @@ -80,7 +81,7 @@ Rectangle { Rectangle { color: "transparent" width: parent.width - height: (parent.height - overview_panel.height) * 0.4 + height: (parent.height - overview_panel.height) * 0.35 Column { anchors.fill: parent diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 5d13392bc..14a900fdc 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -44,188 +44,4 @@ Item { onCreateNewWallet: overview.newWalletClicked() onWalletIndexChanged: overview.curWalletIndexChanged(index) } - // Column { - // spacing: 23 - // anchors.fill: parent - - // Row { - // spacing: 15 - - // ComboBox { - // id: walletsComboBox - // objectName: "walletsComboBox" - // model: walletBalances - // textRole: "name" - // valueRole: "name" - // font.pointSize: 12 - - // Component.onCompleted: { - // curWalletIndexChanged(0) - // } - - // onActivated: (ind) => { - // curWalletIndexChanged(ind) - // } - // } - // Column { - // Label { - // text: qsTr("Confirmed balance") - // font.pointSize: 8 - // } - // Label { - // text: qsTr("%1 BTC") - // .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) - // , WalletBalance.ConfirmedRole)) - // font.pointSize: 12 - // } - // } - // Column { - // Label { - // text: qsTr("Unconfirmed balance") - // font.pointSize: 8 - // } - // Label { - // text: qsTr("%1 BTC") - // .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) - // , WalletBalance.UnconfirmedRole)) - // font.pointSize: 12 - // } - // } - // Column { - // Label { - // text: qsTr("Total balance") - // font.pointSize: 8 - // } - // Label { - // text: qsTr("%1 BTC") - // .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) - // , WalletBalance.TotalRole)) - // font.pointSize: 12 - // } - // } - // Column { - // Label { - // text: qsTr("#Used addresses") - // font.pointSize: 8 - // } - // Label { - // text: qsTr("%1") - // .arg(walletBalances.data(walletBalances.index(walletsComboBox.currentIndex, 0) - // , WalletBalance.NbAddrRole)) - // font.pointSize: 12 - // } - // } - // Item { // spacer item - // Layout.fillWidth: true - // Layout.fillHeight: true - // Rectangle { anchors.fill: parent; color: "#ffaaaa" } - // } - // Button { - // text: qsTr("Wallet Properties") - // font.pointSize: 10 - // } - // Button { - // text: qsTr("Create new wallet") - // font.pointSize: 10 - // onClicked: { - // //stack.push(createNewWalletPage) - // newWalletClicked() - // } - // } - // } - - // Row { - // spacing: 15 - - // Label { - // text: qsTr("Addresses") - // font.pointSize: 14 - // } - // Item { // spacer item - // Layout.fillWidth: true - // Layout.fillHeight: true - // Rectangle { anchors.fill: parent; color: "#ffaaaa" } - // } - // Button { - // text: qsTr("Hide used") - // font.pointSize: 8 - // } - // Button { - // text: qsTr("Hide internal") - // font.pointSize: 8 - // } - // Button { - // text: qsTr("Hide external") - // font.pointSize: 8 - // } - // Button { - // text: qsTr("Hide empty") - // font.pointSize: 8 - // } - // } - // TableView { - // width: 1000 - // height: 300 - // columnSpacing: 1 - // rowSpacing: 1 - // clip: true - // ScrollIndicator.horizontal: ScrollIndicator { } - // ScrollIndicator.vertical: ScrollIndicator { } - // model: addressListModel - // delegate: Rectangle { - // implicitWidth: firstcol ? 550 : 150 - // implicitHeight: 20 - // border.color: "black" - // border.width: 1 - // color: heading ? 'black' : 'darkslategrey' - // Text { - // text: tabledata - // font.pointSize: heading ? 8 : 10 - // color: heading ? 'darkgrey' : 'lightgrey' - // anchors.centerIn: parent - // } - // MouseArea { - // anchors.fill: parent - // onClicked: { - // if (!heading && (model.column === 0)) { - // bsApp.copyAddressToClipboard(tabledata) - // ibInfo.displayMessage(qsTr("address %1 copied to clipboard").arg(tabledata)) - // } - // } - // onDoubleClicked: { - // stack.push(addressDetails) - // } - // } - // } - // } - - // Label { - // text: qsTr("Non-Settled Transactions") - // font.pointSize: 14 - // } - - // TableView { - // width: 1000 - // height: 200 - // columnSpacing: 1 - // rowSpacing: 1 - // clip: true - // ScrollIndicator.horizontal: ScrollIndicator { } - // ScrollIndicator.vertical: ScrollIndicator { } - // model: pendingTxListModel - // delegate: Rectangle { - // implicitWidth: 125 * colWidth - // implicitHeight: 20 - // border.color: "black" - // border.width: 1 - // color: heading ? 'black' : 'darkslategrey' - // Text { - // text: tableData - // font.pointSize: heading ? 8 : 10 - // color: dataColor - // anchors.centerIn: parent - // } - // } - // } - // } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index b6f977f01..869d0baef 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -41,6 +41,8 @@ TableView { property int selected_row_index: -1 + onWidthChanged: component.forceLayout() + delegate: Rectangle { implicitHeight: 34 color: row === 0 ? BSStyle.tableCellBackgroundColor : (row === selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor) diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 0685dc919..6ac8b2a53 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -42,9 +42,11 @@ Item { } Column { - spacing: 23 + spacing: 18 anchors.fill: parent - anchors.margins: 18 + anchors.topMargin: 14 + anchors.leftMargin: 18 + anchors.rightMargin: 18 Row { id: transaction_header_menu @@ -54,8 +56,8 @@ Item { Label { text: qsTr("Transactions list") - font.pixelSize: 20 - font.weight: Font.Bold + font.pixelSize: 19 + font.weight: Font.DemiBold color: BSStyle.textColor anchors.verticalCenter: parent.verticalCenter From d153a89a60cd03412a37a655604e684e655d5391 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 7 Feb 2023 14:02:06 +0300 Subject: [PATCH 119/436] trezor TX signing done --- BlockSettleHW/hwdeviceinterface.h | 6 ++- BlockSettleHW/hwdevicemanager.cpp | 64 +++++++++++++++++++++++++++ BlockSettleHW/hwdevicemanager.h | 13 ++++-- BlockSettleHW/trezor/trezorClient.cpp | 4 +- BlockSettleHW/trezor/trezorDevice.cpp | 51 ++++++++++++++++++--- BlockSettleHW/trezor/trezorDevice.h | 2 + GUI/QtQuick/QtQuickAdapter.cpp | 4 +- GUI/QtQuick/WalletBalancesModel.cpp | 1 - 8 files changed, 130 insertions(+), 15 deletions(-) diff --git a/BlockSettleHW/hwdeviceinterface.h b/BlockSettleHW/hwdeviceinterface.h index 4550f439a..9f07989ec 100644 --- a/BlockSettleHW/hwdeviceinterface.h +++ b/BlockSettleHW/hwdeviceinterface.h @@ -58,8 +58,10 @@ namespace bs { virtual void retrieveXPubRoot() = 0; // Management - virtual void setMatrixPin(const SecureBinaryData& pin) {}; - virtual void setPassword(const SecureBinaryData& password, bool enterOnDevice) {}; + virtual void setMatrixPin(const SecureBinaryData& pin) {} + virtual void setPassword(const SecureBinaryData& password, bool enterOnDevice) {} + + virtual void setSupportingTX(const Tx&) {} // State virtual bool isBlocked() const = 0; diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index 5d6425cbc..a7e766c30 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -32,6 +32,7 @@ DeviceManager::DeviceManager(const std::shared_ptr& logger) , user_(std::make_shared(bs::message::TerminalUsers::HWWallets)) , userWallets_(std::make_shared(bs::message::TerminalUsers::Wallets)) , userSigner_(std::make_shared(bs::message::TerminalUsers::Signer)) + , userBlockchain_(std::make_shared(bs::message::TerminalUsers::Blockchain)) {} DeviceManager::~DeviceManager() @@ -52,6 +53,8 @@ bs::message::ProcessingResult DeviceManager::process(const bs::message::Envelope return processWallet(env); case bs::message::TerminalUsers::Signer: return processSigner(env); + case bs::message::TerminalUsers::Blockchain: + return processBlockchain(env); default: break; } } @@ -227,6 +230,48 @@ bs::message::ProcessingResult DeviceManager::processSigner(const bs::message::En return bs::message::ProcessingResult::Ignored; } +bs::message::ProcessingResult bs::hww::DeviceManager::processBlockchain(const bs::message::Envelope& env) +{ + ArmoryMessage msg; + if (!msg.ParseFromString(env.message)) { + logger_->error("[hww::DeviceManager::processBlockchain] failed to parse #{}" + , env.foreignId()); + return bs::message::ProcessingResult::Error; + } + switch (msg.data_case()) { + case ArmoryMessage::kTransactions: + return processTransactions(env.responseId(), msg.transactions()); + default: break; + } + return bs::message::ProcessingResult::Ignored; +} + +bs::message::ProcessingResult bs::hww::DeviceManager::processTransactions(const bs::message::SeqId msgId + , const ArmoryMessage_Transactions& transactions) +{ + const auto& itReq = supportingTxReq_.find(msgId); + if (itReq == supportingTxReq_.end()) { + logger_->warn("[{}] unknown response #{}", __func__, msgId); + return bs::message::ProcessingResult::Error; + } + const auto& device = getDevice(itReq->second); + supportingTxReq_.erase(itReq); + if (!device) { + logger_->warn("[{}] device not found", __func__); + return bs::message::ProcessingResult::Error; + } + for (const auto& txData : transactions.transactions()) { + Tx tx(BinaryData::fromString(txData.tx())); + if (!tx.isInitialized()) { + logger_->warn("[{}] invalid TX at {}", __func__, txData.height()); + continue; + } + tx.setTxHeight(txData.height()); + device->setSupportingTX(tx); + } + return bs::message::ProcessingResult::Success; +} + bs::message::ProcessingResult DeviceManager::processImport(const bs::message::Envelope& env , const HW::DeviceKey& key) { @@ -591,10 +636,12 @@ void DeviceManager::requestHWPass(const DeviceKey& key, bool allowedOnDevice) void DeviceManager::deviceNotFound(const std::string& deviceId) { + logger_->debug("[{}] {}", __func__, deviceId); } void DeviceManager::deviceReady(const std::string& deviceId) { + logger_->debug("[{}] {}", __func__, deviceId); } void DeviceManager::deviceTxStatusChanged(const std::string& status) @@ -602,6 +649,23 @@ void DeviceManager::deviceTxStatusChanged(const std::string& status) logger_->debug("[{}] {}", __func__, status); } +void bs::hww::DeviceManager::needSupportingTXs(const DeviceKey& key + , const std::set& txHashes) +{ + if (txHashes.empty()) { + logger_->warn("[{}] no TX hashes from {}", __func__, key.label); + return; + } + ArmoryMessage msg; + auto msgReq = msg.mutable_get_txs_by_hash(); + for (const auto& txHash : txHashes) { + msgReq->add_tx_hashes(txHash.toBinStr()); + } + msgReq->set_disable_cache(true); + const auto msgId = pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + supportingTxReq_[msgId] = key; +} + void DeviceManager::txSigned(const DeviceKey& device, const SecureBinaryData& signData) { if (device.type != DeviceType::HWLedger) { diff --git a/BlockSettleHW/hwdevicemanager.h b/BlockSettleHW/hwdevicemanager.h index 64a500ca3..6692fba01 100644 --- a/BlockSettleHW/hwdevicemanager.h +++ b/BlockSettleHW/hwdevicemanager.h @@ -25,6 +25,7 @@ namespace spdlog { } namespace BlockSettle { namespace Common { + class ArmoryMessage_Transactions; class HDWalletData; class SignerMessage_SignTxResponse; } @@ -60,6 +61,8 @@ namespace bs { virtual void deviceReady(const std::string& deviceId) = 0; virtual void deviceTxStatusChanged(const std::string& status) = 0; + virtual void needSupportingTXs(const DeviceKey&, const std::set& txHashes) = 0; + virtual void txSigned(const DeviceKey&, const SecureBinaryData& signData) = 0; virtual void scanningDone() = 0; virtual void operationFailed(const std::string& deviceId, const std::string& reason) = 0; @@ -88,7 +91,7 @@ namespace bs { void deviceNotFound(const std::string& deviceId) override; void deviceReady(const std::string& deviceId) override; void deviceTxStatusChanged(const std::string& status) override; - + void needSupportingTXs(const DeviceKey&, const std::set& txHashes) override; void txSigned(const DeviceKey&, const SecureBinaryData& signData) override; void scanningDone() override; void operationFailed(const std::string& deviceId, const std::string& reason) override; @@ -108,7 +111,6 @@ namespace bs { //void hwOperationDone(); bool awaitingUserAction(const DeviceKey&); - void setScanningFlag(unsigned nbLeft); void releaseConnection(); void scanningDone(bool initDevices = true); @@ -121,6 +123,10 @@ namespace bs { bs::message::ProcessingResult processWallet(const bs::message::Envelope&); bs::message::ProcessingResult processSettings(const bs::message::Envelope&); bs::message::ProcessingResult processSigner(const bs::message::Envelope&); + bs::message::ProcessingResult processBlockchain(const bs::message::Envelope&); + + bs::message::ProcessingResult processTransactions(const bs::message::SeqId + , const BlockSettle::Common::ArmoryMessage_Transactions&); void devicesResponse(); bs::message::ProcessingResult processImport(const bs::message::Envelope& @@ -136,7 +142,7 @@ namespace bs { std::shared_ptr logger_; std::unique_ptr trezorClient_; std::unique_ptr ledgerClient_; - std::shared_ptr user_, userWallets_, userSigner_; + std::shared_ptr user_, userWallets_, userSigner_, userBlockchain_; std::vector devices_; bool testNet_{false}; @@ -149,6 +155,7 @@ namespace bs { bs::core::wallet::TXSignRequest txSignReq_; std::map> prepareDeviceReq_; //value: walletId + std::map supportingTxReq_; }; void deviceKeyToMsg(const DeviceKey&, BlockSettle::HW::DeviceKey*); diff --git a/BlockSettleHW/trezor/trezorClient.cpp b/BlockSettleHW/trezor/trezorClient.cpp index 3bb331f51..29efe4095 100644 --- a/BlockSettleHW/trezor/trezorClient.cpp +++ b/BlockSettleHW/trezor/trezorClient.cpp @@ -242,10 +242,10 @@ std::shared_ptr bs::hww::TrezorPostHandler::processData(const std curl_easy_setopt(curl_, CURLOPT_POSTFIELDS, inData->input.data()); } if (inData->timeout) { - curl_easy_setopt(curl_, CURLOPT_TIMEOUT_MS, 3000L); + curl_easy_setopt(curl_, CURLOPT_TIMEOUT_MS, 10000L); } else { - curl_easy_setopt(curl_, CURLOPT_TIMEOUT, 0L); + curl_easy_setopt(curl_, CURLOPT_TIMEOUT, 120000L); } std::string response; diff --git a/BlockSettleHW/trezor/trezorDevice.cpp b/BlockSettleHW/trezor/trezorDevice.cpp index 6997817e9..67108a3aa 100644 --- a/BlockSettleHW/trezor/trezorDevice.cpp +++ b/BlockSettleHW/trezor/trezorDevice.cpp @@ -162,8 +162,9 @@ void TrezorDevice::init() { const auto& reply = std::static_pointer_cast(data); if (!reply || !reply->error.empty()) { - logger_->error("[TrezorDevice::makeCall] network error: {}", (reply && !reply->error.empty()) ? reply->error : ""); - //emit operationFailed(QLatin1String("Network error")); + logger_->error("[TrezorDevice::makeCall] comm error: {}", (reply && !reply->error.empty()) ? reply->error : ""); + operationFailed("comm error"); + cancel(); reset(); return; } @@ -301,10 +302,31 @@ void TrezorDevice::clearSession() makeCall(message); } +void TrezorDevice::setSupportingTX(const Tx& tx) +{ + if (!currentTxSignReq_) { + logger_->warn("[{}] no current sign TX operation in progress", __func__); + return; + } + currentTxSignReq_->armorySigner_.addSupportingTx(tx); + logger_->debug("[{}] added supporting TX {}", __func__, tx.getThisHash().toHexStr(true)); +} + void TrezorDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX) { - currentTxSignReq_.reset(new bs::core::wallet::TXSignRequest(reqTX)); - logger_->debug("[TrezorDevice::signTX] specify init data to {}", features_->label()); + currentTxSignReq_ = std::make_unique(reqTX); + logger_->debug("[TrezorDevice::signTX] {}", features_->label()); + + std::set txHashes; + for (uint32_t i = 0; i < currentTxSignReq_->armorySigner_.getTxInCount(); ++i) { + const auto& spender = currentTxSignReq_->armorySigner_.getSpender(i); + if (!spender) { + logger_->warn("[{}] no spender at {}", __func__, i); + continue; + } + txHashes.insert(spender->getUtxo().getTxHash()); + } + cb_->needSupportingTXs(key(), txHashes); bitcoin::SignTx message; message.set_inputs_count(currentTxSignReq_->armorySigner_.getTxInCount()); @@ -393,7 +415,8 @@ void TrezorDevice::makeCall(const google::protobuf::Message &msg if (!reply || !reply->error.empty()) { logger_->error("[TrezorDevice::makeCall] network error: {}" , (reply && !reply->error.empty()) ? reply->error : (data ? "" : "")); - //emit operationFailed(QLatin1String("Network error")); + operationFailed("comm error"); + cancel(); reset(); return; } @@ -556,6 +579,7 @@ void TrezorDevice::reset() currentTxSignReq_.reset(); awaitingSignedTX_.clear(); awaitingWalletInfo_ = {}; + awaitingCallbacks_.clear(); } void TrezorDevice::handleTxRequest(const trezor::MessageData& data @@ -725,15 +749,32 @@ void TrezorDevice::handleTxRequest(const trezor::MessageData& data // Return previous tx details for legacy inputs // See https://wiki.trezor.io/Developers_guide:Message_Workflows auto tx = prevTx(txRequest); +#ifdef TREZOR_NEW_STYLE_TXMETA + bitcoin::TxAckPrevMeta msg; + auto msgTX = msg.mutable_tx(); +#else auto data = txAck.mutable_tx(); +#endif if (tx.isInitialized()) { +#ifdef TREZOR_NEW_STYLE_TXMETA + msgTX->set_version(tx.getVersion()); + msgTX->set_lock_time(tx.getLockTime()); + msgTX->set_inputs_count(tx.getNumTxIn()); + msgTX->set_outputs_count(tx.getNumTxOut()); +#else data->set_version(tx.getVersion()); data->set_lock_time(tx.getLockTime()); data->set_inputs_cnt(tx.getNumTxIn()); data->set_outputs_cnt(tx.getNumTxOut()); +#endif } +#ifdef TREZOR_NEW_STYLE_TXMETA + logger_->debug("[TrezorDevice::handleTxRequest] TXMETA response: {}", getJSONReadableMessage(msg)); + makeCall(msg, cb); +#else logger_->debug("[TrezorDevice::handleTxRequest] TXMETA response: {}", getJSONReadableMessage(txAck)); makeCall(txAck, cb); +#endif } break; case bitcoin::TxRequest_RequestType_TXFINISHED: diff --git a/BlockSettleHW/trezor/trezorDevice.h b/BlockSettleHW/trezor/trezorDevice.h index bf102ff31..2ece48cce 100644 --- a/BlockSettleHW/trezor/trezorDevice.h +++ b/BlockSettleHW/trezor/trezorDevice.h @@ -66,6 +66,8 @@ namespace bs { void signTX(const bs::core::wallet::TXSignRequest& reqTX) override; void retrieveXPubRoot() override; + void setSupportingTX(const Tx&) override; + // Management void setMatrixPin(const SecureBinaryData& pin) override; void setPassword(const SecureBinaryData& password, bool enterOnDevice) override; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 1c6f855d9..1491cbf3c 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -898,7 +898,7 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId ProcessingResult QtQuickAdapter::processWalletBalances(bs::message::SeqId responseId , const WalletsMessage_WalletBalances &response) { - logger_->debug("[{}] {}", __func__, response.DebugString()); + //logger_->debug("[{}] {}", __func__, response.DebugString()); const WalletBalancesModel::Balance bal{ response.spendable_balance(), response.unconfirmed_balance() , response.total_balance(), response.nb_addresses() }; walletBalances_->setWalletBalance(response.wallet_id(), bal); @@ -1417,7 +1417,7 @@ ProcessingResult QtQuickAdapter::processSignTX(const BlockSettle::Common::Signer ProcessingResult QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived& zcs) { - logger_->debug("[{}] {}", __func__, zcs.DebugString()); + //logger_->debug("[{}] {}", __func__, zcs.DebugString()); WalletsMessage msg; auto msgReq = msg.mutable_tx_details_request(); for (const auto& zcEntry : zcs.tx_entries()) { diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index 96c2e3c4e..1b0785fcc 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -42,7 +42,6 @@ QVariant WalletBalancesModel::data(const QModelIndex& index, int role) const FieldFunc ff{ nullptr }; switch (role) { case WalletBalance::NameRole: - logger_->debug("[WalletBalancesModel::data] name: {}", wallets_.at(index.row()).walletName); return QString::fromStdString(wallets_.at(index.row()).walletName); case WalletBalance::IdRole: return QString::fromStdString(wallets_.at(index.row()).walletId); From df1eda80846cd67ab3a34259f2c6d4f737b97219 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 7 Feb 2023 19:27:56 +0300 Subject: [PATCH 120/436] multi-output createTXSignRequest --- GUI/QtQuick/QtQuickAdapter.cpp | 43 +++++++++++++++++++------- GUI/QtQuick/QtQuickAdapter.h | 4 +-- GUI/QtQuick/qml/Send/SimpleDetails.qml | 16 ++++++---- GUI/QtQuick/qml/SendAdvanced.qml | 2 +- GUI/QtQuick/qml/SendPage.qml | 4 +-- 5 files changed, 47 insertions(+), 22 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 1491cbf3c..86dcbac72 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1195,29 +1195,50 @@ void QtQuickAdapter::requestFeeSuggestions() pushRequest(user_, userBlockchain_, msg.SerializeAsString()); } -QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QString& recvAddr - , double amount, double fee, const QString& comment, QUTXOList* utxos) +QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStringList& recvAddrs + , const QList& recvAmounts, double fee, const QString& comment, QUTXOList* utxos) { WalletsMessage msg; auto msgReq = msg.mutable_tx_request(); msgReq->set_hd_wallet_id(hdWalletIdByIndex(walletIndex)); - if (!recvAddr.isEmpty()) { - auto msgOut = msgReq->add_outputs(); - msgOut->set_address(recvAddr.toStdString()); - msgOut->set_amount(amount); - } - else { + bool isMaxAmount = false; + if (recvAddrs.isEmpty()) { const auto& recipients = txOutputsModel_->recipients(); for (const auto& recip : recipients) { try { const auto& addr = bs::Address::fromRecipient(recip); auto msgOut = msgReq->add_outputs(); msgOut->set_address(addr.display()); - msgOut->set_amount(recip->getValue() / BTCNumericTypes::BalanceDivider); + if (recip->getValue()) { + msgOut->set_amount(recip->getValue() / BTCNumericTypes::BalanceDivider); + } + else { + isMaxAmount = true; + } + } + catch (const std::exception& e) { + logger_->error("[{}] recipient {}", __func__, e.what()); + } + } + } + else { + int idx = 0; + for (const auto& recvAddr : recvAddrs) { + try { + const auto& addr = bs::Address::fromAddressString(recvAddr.toStdString()); + auto msgOut = msgReq->add_outputs(); + msgOut->set_address(addr.display()); + if (recvAmounts.size() > idx) { + msgOut->set_amount(recvAmounts.at(idx)); + } + else { + isMaxAmount = true; + } } catch (const std::exception& e) { - logger_->error("[{}] {}", __func__, e.what()); + logger_->error("[{}] recvAddr {}", __func__, e.what()); } + idx++; } } msgReq->set_fee_per_byte(fee); @@ -1231,7 +1252,7 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri } const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); const auto txReq = new QTXSignRequest(this); - txReqs_[msgId] = { txReq, (amount == 0) }; + txReqs_[msgId] = { txReq, isMaxAmount }; return txReq; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 4c5d48772..7015c0e26 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -170,8 +170,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE bool validateAddress(const QString& addr); Q_INVOKABLE void requestFeeSuggestions(); - Q_INVOKABLE QTXSignRequest* createTXSignRequest(int walletIndex, const QString& recvAddr - , double amount, double fee, const QString& comment = {}, QUTXOList* utxos = nullptr); + Q_INVOKABLE QTXSignRequest* createTXSignRequest(int walletIndex, const QStringList& recvAddrs + , const QList& recvAmounts, double fee, const QString& comment = {}, QUTXOList* utxos = nullptr); Q_INVOKABLE void getUTXOsForWallet(int walletIndex); Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); Q_INVOKABLE int getSearchInputType(const QString&); diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 6e0d4c06f..5c03eda80 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -122,7 +122,7 @@ ColumnLayout { { var fpb = parseFloat(fee_suggest_combo.currentValue) tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , rec_addr_input.input_text, 0, (fpb > 0) ? fpb : 1.0) + , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) amount_input.setActiveFocus() } } @@ -271,6 +271,12 @@ ColumnLayout { { amount_input.input_text = amount_max } + + if (rec_addr_input.isValid) { + var fpb = parseFloat(fee_suggest_combo.currentValue) + tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) + } } } @@ -349,12 +355,10 @@ ColumnLayout { } function click_enter() { - layout.sig_continue( bsApp.createTXSignRequest( - from_wallet_combo.currentIndex, rec_addr_input.input_text, - parseFloat(amount_input.input_text), parseFloat(fee_suggest_combo.currentValue), - comment_input.input_text)) + layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , [rec_addr_input.input_text], [parseFloat(amount_input.input_text)] + , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text)) } - } diff --git a/GUI/QtQuick/qml/SendAdvanced.qml b/GUI/QtQuick/qml/SendAdvanced.qml index 1aa585d22..0399775f4 100644 --- a/GUI/QtQuick/qml/SendAdvanced.qml +++ b/GUI/QtQuick/qml/SendAdvanced.qml @@ -296,7 +296,7 @@ Item { onClicked: { verifySignTX.txSignRequest = bsApp.createTXSignRequest( - sendWalletsComboBox.currentIndex, "", 0, + sendWalletsComboBox.currentIndex, [], [], parseFloat(fees.text), txComment.text, txInputsModel.getSelection()) stack.push(verifySignTX) diff --git a/GUI/QtQuick/qml/SendPage.qml b/GUI/QtQuick/qml/SendPage.qml index 7392f95f0..e138b5e2f 100644 --- a/GUI/QtQuick/qml/SendPage.qml +++ b/GUI/QtQuick/qml/SendPage.qml @@ -193,8 +193,8 @@ Item { console.log("amount.text = " + parseFloat(amount.text)) console.log("recvAddress.text.length = " + recvAddress.text.length) verifySignTX.txSignRequest = bsApp.createTXSignRequest( - sendWalletsComboBox.currentIndex, recvAddress.text, - parseFloat(amount.text), /*parseFloat(fees.text)*/1.0, + sendWalletsComboBox.currentIndex, [recvAddress.text], + [parseFloat(amount.text)], parseFloat(fees.text), txComment.text) stack.push(verifySignTX) } From aa8782fc77212a3e17888e5af97d545a40433f81 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 9 Feb 2023 22:35:08 +0200 Subject: [PATCH 121/436] refactoring --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 +- GUI/QtQuick/qml/Send/AmountInput.qml | 99 ++++++++ GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 39 +++ GUI/QtQuick/qml/Send/RecvAddrTextInput.qml | 71 ++++++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 192 ++------------ GUI/QtQuick/qml/Send/WalletsComboBox.qml | 42 +++ GUI/QtQuick/qml/Send/qmldir | 4 + GUI/QtQuick/qml_test.pro.user.Kkyrxt | 267 ++++++++++++++++++++ GUI/QtQuick/qtquick.qrc | 4 + 9 files changed, 544 insertions(+), 176 deletions(-) create mode 100644 GUI/QtQuick/qml/Send/AmountInput.qml create mode 100644 GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml create mode 100644 GUI/QtQuick/qml/Send/RecvAddrTextInput.qml create mode 100644 GUI/QtQuick/qml/Send/WalletsComboBox.qml create mode 100644 GUI/QtQuick/qml_test.pro.user.Kkyrxt diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index c060bcb87..7f6f83b6b 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -6,7 +6,7 @@ import QtQuick.Layouts 1.15 import "../BsStyles" import "../StyledControls" -import wallet.balance 1.0 +//import wallet.balance 1.0 ColumnLayout { diff --git a/GUI/QtQuick/qml/Send/AmountInput.qml b/GUI/QtQuick/qml/Send/AmountInput.qml new file mode 100644 index 000000000..9e4743a2d --- /dev/null +++ b/GUI/QtQuick/qml/Send/AmountInput.qml @@ -0,0 +1,99 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.9 +import QtQuick.Controls 2.3 + +import "../BsStyles" +import "../StyledControls" + +CustomTextInput { + + id: amount_input + + property var _tempRequest: null + + //aliases + title_text: qsTr("Amount") + + //app (if was launched from visual studio) crashes when there is input_validator + //and we change text inside of onTextEdited + //it is why I have realized my validator inside of onTextEdited + property string prev_text : "" + onTextEdited : { + + amount_input.input_text = amount_input.input_text.replace(",", ".") + + if (amount_input.input_text.startsWith("0") + && !amount_input.input_text.startsWith("0.") + && amount_input.input_text.length > 1) + { + amount_input.input_text = "0." + + amount_input.input_text.substring(1, amount_input.input_text.length) + } + try { + var input_number = Number.fromLocaleString(Qt.locale("en_US"), amount_input.input_text) + } + catch (error) + { + amount_input.input_text = prev_text + return + } + + if (input_number < 0 || ((tempRequest != null) && (input_number > tempRequest.maxAmount))) + { + amount_input.input_text = prev_text + return + } + + prev_text = amount_input.input_text + } + + CustomButton { + + id: max_but + + z: 1 + + width: 55 + height: 28 + back_radius: 37 + + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 23 + + text: qsTr("MAX") + font.pixelSize: 12 + enabled: (tempRequest != null) + + function click_enter() { + if (tempRequest != null) { + amount_input.input_text = tempRequest.maxAmount + } + } + } + + Label { + + id: currency + + anchors.verticalCenter: parent.verticalCenter + anchors.right: max_but.left + anchors.rightMargin: 16 + + text: "BTC" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + color: "#7A88B0" + } + +} diff --git a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml new file mode 100644 index 000000000..5821c9120 --- /dev/null +++ b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml @@ -0,0 +1,39 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.9 +import QtQuick.Controls 2.3 + +import "../BsStyles" +import "../StyledControls" + +CustomComboBox { + + id: fee_suggest_combo + + model: feeSuggestions + + //aliases + title_text: qsTr("Fee Suggestions") + + height: 70 + + textRole: "text" + valueRole: "value" + + Connections + { + target:feeSuggestions + function onRowCountChanged () + { + fee_suggest_combo.currentIndex = 0 + } + } +} diff --git a/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml b/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml new file mode 100644 index 000000000..48fbbd0f9 --- /dev/null +++ b/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml @@ -0,0 +1,71 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.9 +import QtQuick.Controls 2.3 + +import "../BsStyles" +import "../StyledControls" + +CustomTextInput { + + id: rec_addr_input + + property var _tempRequest: null + property string fee_current_value + property int wallets_current_index + + signal focus_next() + + //aliases + title_text: qsTr("Receiver address") + + Image { + id: paste_but + + z: 1 + + anchors.top: rec_addr_input.top + anchors.topMargin: 23 + anchors.right: rec_addr_input.right + anchors.rightMargin: 23 + + source: "qrc:/images/paste_icon.png" + width: 24 + height: 24 + + MouseArea { + anchors.fill: parent + onClicked: { + rec_addr_input.input_text = bsApp.pasteTextFromClipboard() + rec_addr_input.validate() + } + } + } + + onTextEdited : { + rec_addr_input.validate() + } + + function validate() + { + if (rec_addr_input.input_text.length) + { + rec_addr_input.isValid = bsApp.validateAddress(rec_addr_input.input_text) + if (rec_addr_input.isValid) + { + _tempRequest = createTempRequest() + focus_next() + } + } + else + rec_addr_input.isValid = true + } +} diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 6c1ac09a1..0caf981bf 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -6,7 +6,7 @@ import QtQuick.Layouts 1.15 import "../BsStyles" import "../StyledControls" -import wallet.balance 1.0 +//import wallet.balance 1.0 ColumnLayout { @@ -19,7 +19,7 @@ ColumnLayout { width: 600 spacing: 0 - property var tempRequest: null + property var tempRequest: rec_addr_input._tempRequest RowLayout { @@ -80,7 +80,7 @@ ColumnLayout { } - CustomTextInput { + RecvAddrTextInput { id: rec_addr_input @@ -89,147 +89,29 @@ ColumnLayout { Layout.preferredWidth: 552 Layout.topMargin: 23 - //aliases - title_text: qsTr("Receiver address") - - Image { - id: paste_but - - z: 1 - - anchors.top: rec_addr_input.top - anchors.topMargin: 23 - anchors.right: rec_addr_input.right - anchors.rightMargin: 23 + wallets_current_index: from_wallet_combo.currentIndex - source: "qrc:/images/paste_icon.png" - width: 24 - height: 24 - - MouseArea { - anchors.fill: parent - onClicked: { - rec_addr_input.input_text = bsApp.pasteTextFromClipboard() - rec_addr_input.validate() - } - } + onFocus_next: { + amount_input.setActiveFocus() } - onTextEdited : { - rec_addr_input.validate() - } - - function validate() - { - if (rec_addr_input.input_text.length) - { - rec_addr_input.isValid = bsApp.validateAddress(rec_addr_input.input_text) - if (rec_addr_input.isValid) - { - var fpb = parseFloat(fee_suggest_combo.currentValue) - tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , rec_addr_input.input_text, 0, (fpb > 0) ? fpb : 1.0) - amount_input.setActiveFocus() - } - } - else - rec_addr_input.isValid = true + function createTempRequest() { + var fpb = parseFloat(fee_suggest_combo.currentValue) + return bsApp.createTXSignRequest(wallets_current_index + , rec_addr_input.input_text, 0, (fpb > 0) ? fpb : 1.0) } } - CustomTextInput { + AmountInput { id: amount_input + _tempRequest: tempRequest + Layout.alignment: Qt.AlignCenter Layout.preferredHeight : 70 Layout.preferredWidth: 552 Layout.topMargin: 10 - - //aliases - title_text: qsTr("Amount") - -// input_validator: DoubleValidator{ -// bottom: 0 -// top: (from_wallet_combo.currentIndex >= 0) ? -// parseFloat(getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole)) : 0 -// notation :DoubleValidator.StandardNotation -// } - - //app (if was launched from visual studio) crashes when there is input_validator - //and we change text inside of onTextEdited - //it is why I have realized my validator inside of onTextEdited - property string prev_text : "" - onTextEdited : { - - amount_input.input_text = amount_input.input_text.replace(",", ".") - - if (amount_input.input_text.startsWith("0") - && !amount_input.input_text.startsWith("0.") - && amount_input.input_text.length > 1) - { - amount_input.input_text = "0." - + amount_input.input_text.substring(1, amount_input.input_text.length) - } - try { - var input_number = Number.fromLocaleString(Qt.locale("en_US"), amount_input.input_text) - } - catch (error) - { - amount_input.input_text = prev_text - return - } - var fpb = parseFloat(fee_suggest_combo.currentValue) - - if (input_number < 0 || ((tempRequest != null) && (input_number > tempRequest.maxAmount))) - { - amount_input.input_text = prev_text - return - } - - prev_text = amount_input.input_text - } - - CustomButton { - - id: max_but - - z: 1 - - width: 55 - height: 28 - back_radius: 37 - - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: 23 - - text: qsTr("MAX") - font.pixelSize: 12 - enabled: (tempRequest != null) - - function click_enter() { - if (tempRequest != null) { - amount_input.input_text = tempRequest.maxAmount - } - } - } - - Label { - - id: currency - - anchors.verticalCenter: parent.verticalCenter - anchors.right: max_but.left - anchors.rightMargin: 16 - - text: "BTC" - font.pixelSize: 14 - font.family: "Roboto" - font.weight: Font.Normal - color: "#7A88B0" - } - } RowLayout { @@ -238,8 +120,7 @@ ColumnLayout { Layout.preferredHeight : 70 Layout.topMargin: 10 - - CustomComboBox { + WalletsComboBox { id: from_wallet_combo @@ -247,32 +128,13 @@ ColumnLayout { Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter width: 271 - height: 70 - - model: walletBalances - - //aliases - title_text: qsTr("From Wallet") - details_text: getWalletData(currentIndex, WalletBalance.TotalRole) - - textRole: "name" - valueRole: "name" - - Connections - { - target:walletBalances - function onRowCountChanged () - { - from_wallet_combo.currentIndex = overviewWalletIndex - } - } onActivated: { //I dont understand why but acceptableInput dont work... var amount_max = getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole) var cur_value = parseFloat(amount_input.input_text) - var bottom = amount_input.input_validator.bottom - var top = amount_input.input_validator.top + var bottom = 0 + var top = tempRequest.maxAmount if(cur_value < bottom || cur_value > top) { amount_input.input_text = amount_max @@ -285,35 +147,15 @@ ColumnLayout { Layout.preferredHeight: 70 } - - CustomComboBox { + FeeSuggestComboBox { id: fee_suggest_combo Layout.rightMargin: 24 Layout.alignment: Qt.AlignRight | Qt.AlingVCenter - model: feeSuggestions - - //aliases - title_text: qsTr("Fee Suggestions") - width: 271 - height: 70 - - textRole: "text" - valueRole: "value" - - Connections - { - target:feeSuggestions - function onRowCountChanged () - { - fee_suggest_combo.currentIndex = 0 - } - } } - } CustomTextEdit { diff --git a/GUI/QtQuick/qml/Send/WalletsComboBox.qml b/GUI/QtQuick/qml/Send/WalletsComboBox.qml new file mode 100644 index 000000000..7ae6ef13e --- /dev/null +++ b/GUI/QtQuick/qml/Send/WalletsComboBox.qml @@ -0,0 +1,42 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.9 +import QtQuick.Controls 2.3 + +import "../BsStyles" +import "../StyledControls" + +//import wallet.balance 1.0 + +CustomComboBox { + + id: from_wallet_combo + + height: 70 + + model: walletBalances + + //aliases + title_text: qsTr("From Wallet") + details_text: getWalletData(currentIndex, WalletBalance.TotalRole) + + textRole: "name" + valueRole: "name" + + Connections + { + target:walletBalances + function onRowCountChanged () + { + from_wallet_combo.currentIndex = overviewWalletIndex + } + } +} diff --git a/GUI/QtQuick/qml/Send/qmldir b/GUI/QtQuick/qml/Send/qmldir index 7d3a31c01..e6bec8304 100644 --- a/GUI/QtQuick/qml/Send/qmldir +++ b/GUI/QtQuick/qml/Send/qmldir @@ -4,3 +4,7 @@ SendPopup 1.0 SendPopup.qml SimpleDetails 1.0 SimpleDetails.qml SignTransaction 1.0 SignTransaction.qml AdvancedDetails 1.0 AdvancedDetails.qml +AmountInput 1.0 AmountInput.qml +FeeSuggestComboBox 1.0 FeeSuggestComboBox.qml +RecvAddrTextInput 1.0 RecvAddrTextInput.qml +WalletsComboBox 1.0 WalletsComboBox.qml diff --git a/GUI/QtQuick/qml_test.pro.user.Kkyrxt b/GUI/QtQuick/qml_test.pro.user.Kkyrxt new file mode 100644 index 000000000..0bc773fd7 --- /dev/null +++ b/GUI/QtQuick/qml_test.pro.user.Kkyrxt @@ -0,0 +1,267 @@ + + + + + + EnvironmentId + {408588cd-4567-4fe8-bd75-adffe1b0ffa1} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + false + true + false + 0 + true + true + 0 + 8 + true + false + 1 + true + true + true + *.md, *.MD, Makefile + false + true + + + + ProjectExplorer.Project.PluginSettings + + + true + false + true + true + true + true + + + 0 + true + + -fno-delayed-template-parsing + + true + Builtin.BuildSystem + + true + true + Builtin.DefaultTidyAndClazy + 4 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop Qt 5.15.2 MSVC2019 64bit + Desktop Qt 5.15.2 MSVC2019 64bit + qt.qt5.5152.win64_msvc2019_64_kit + 1 + 0 + 0 + + 0 + C:\Projects\terminal\GUI\build-qml_test-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug + C:/Projects/terminal/GUI/build-qml_test-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + C:\Projects\terminal_test_release + C:/Projects/terminal_test_release + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + + + 0 + C:\Projects\terminal\GUI\build-qml_test-Desktop_Qt_5_15_2_MSVC2019_64bit-Profile + C:/Projects/terminal/GUI/build-qml_test-Desktop_Qt_5_15_2_MSVC2019_64bit-Profile + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + true + + 2 + + Qt4ProjectManager.Qt4RunConfiguration:C:/Projects/terminal/GUI/QtQuick/qml_test.pro + C:/Projects/terminal/GUI/QtQuick/qml_test.pro + false + true + true + false + true + C:/Projects/terminal_test_release + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 52499af8e..bd2b12032 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -152,5 +152,9 @@ qml/StyledControls/InputOutputTableView.qml images/down_arrow.svg images/up_arrow.svg + qml/Send/WalletsComboBox.qml + qml/Send/AmountInput.qml + qml/Send/FeeSuggestComboBox.qml + qml/Send/RecvAddrTextInput.qml From fde7839c20a7f01c3aa70f8cf998e95f4ed47114 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 9 Feb 2023 22:36:18 +0200 Subject: [PATCH 122/436] refactoring --- GUI/QtQuick/qml_test.pro.user.Kkyrxt | 267 --------------------------- 1 file changed, 267 deletions(-) delete mode 100644 GUI/QtQuick/qml_test.pro.user.Kkyrxt diff --git a/GUI/QtQuick/qml_test.pro.user.Kkyrxt b/GUI/QtQuick/qml_test.pro.user.Kkyrxt deleted file mode 100644 index 0bc773fd7..000000000 --- a/GUI/QtQuick/qml_test.pro.user.Kkyrxt +++ /dev/null @@ -1,267 +0,0 @@ - - - - - - EnvironmentId - {408588cd-4567-4fe8-bd75-adffe1b0ffa1} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - false - true - false - 0 - true - true - 0 - 8 - true - false - 1 - true - true - true - *.md, *.MD, Makefile - false - true - - - - ProjectExplorer.Project.PluginSettings - - - true - false - true - true - true - true - - - 0 - true - - -fno-delayed-template-parsing - - true - Builtin.BuildSystem - - true - true - Builtin.DefaultTidyAndClazy - 4 - - - - true - - - - - ProjectExplorer.Project.Target.0 - - Desktop - Desktop Qt 5.15.2 MSVC2019 64bit - Desktop Qt 5.15.2 MSVC2019 64bit - qt.qt5.5152.win64_msvc2019_64_kit - 1 - 0 - 0 - - 0 - C:\Projects\terminal\GUI\build-qml_test-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug - C:/Projects/terminal/GUI/build-qml_test-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - Qt4ProjectManager.Qt4BuildConfiguration - 2 - - - C:\Projects\terminal_test_release - C:/Projects/terminal_test_release - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Release - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - - - 0 - C:\Projects\terminal\GUI\build-qml_test-Desktop_Qt_5_15_2_MSVC2019_64bit-Profile - C:/Projects/terminal/GUI/build-qml_test-Desktop_Qt_5_15_2_MSVC2019_64bit-Profile - - - true - QtProjectManager.QMakeBuildStep - false - - - - true - Qt4ProjectManager.MakeStep - - 2 - Build - Build - ProjectExplorer.BuildSteps.Build - - - - true - Qt4ProjectManager.MakeStep - clean - - 1 - Clean - Clean - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Profile - Qt4ProjectManager.Qt4BuildConfiguration - 0 - 0 - 0 - - 3 - - - 0 - Deploy - Deploy - ProjectExplorer.BuildSteps.Deploy - - 1 - - false - ProjectExplorer.DefaultDeployConfiguration - - 1 - - true - true - true - - 2 - - Qt4ProjectManager.Qt4RunConfiguration:C:/Projects/terminal/GUI/QtQuick/qml_test.pro - C:/Projects/terminal/GUI/QtQuick/qml_test.pro - false - true - true - false - true - C:/Projects/terminal_test_release - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 22 - - - Version - 22 - - From 97f3a51aa2ca974531fb10c72ae8fec02e417e5d Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 10 Feb 2023 00:02:11 +0100 Subject: [PATCH 123/436] Address & transactions popup --- GUI/QtQuick/AddressListModel.cpp | 224 +++++++----- GUI/QtQuick/AddressListModel.h | 2 +- GUI/QtQuick/QtQuickAdapter.cpp | 14 +- GUI/QtQuick/TransactionFilterModel.cpp | 67 ++++ GUI/QtQuick/TransactionFilterModel.h | 42 +++ .../TransactionForAddressFilterModel.cpp | 53 +++ .../TransactionForAddressFilterModel.h | 40 ++ GUI/QtQuick/TxListModel.cpp | 8 +- GUI/QtQuick/TxListModel.h | 2 + GUI/QtQuick/images/close_button.png | Bin 281 -> 0 bytes GUI/QtQuick/images/close_button.svg | 3 + GUI/QtQuick/qml/AddressDetails.qml | 338 ++++++++++++----- GUI/QtQuick/qml/BsStyles/BSStyle.qml | 7 + GUI/QtQuick/qml/Overview/OverviewPanel.qml | 10 + .../qml/Overview/OverviewWalletBar.qml | 2 + GUI/QtQuick/qml/OverviewPage.qml | 10 + GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml | 2 +- GUI/QtQuick/qml/Pin/PinEntriesPopup.qml | 2 +- .../qml/StyledControls/CloseIconButton.qml | 22 ++ .../qml/StyledControls/CopyIconButton.qml | 1 - .../qml/StyledControls/CustomPopup.qml | 2 +- .../qml/StyledControls/CustomTableView.qml | 12 +- GUI/QtQuick/qml/TransactionDetails.qml | 341 ++++++++++++++++++ GUI/QtQuick/qml/TransactionsPage.qml | 18 +- GUI/QtQuick/qtquick.qrc | 4 +- 25 files changed, 1020 insertions(+), 206 deletions(-) create mode 100644 GUI/QtQuick/TransactionFilterModel.cpp create mode 100644 GUI/QtQuick/TransactionFilterModel.h create mode 100644 GUI/QtQuick/TransactionForAddressFilterModel.cpp create mode 100644 GUI/QtQuick/TransactionForAddressFilterModel.h delete mode 100755 GUI/QtQuick/images/close_button.png create mode 100644 GUI/QtQuick/images/close_button.svg create mode 100644 GUI/QtQuick/qml/StyledControls/CloseIconButton.qml create mode 100644 GUI/QtQuick/qml/TransactionDetails.qml diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index 29cbff185..e12513e44 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -13,132 +13,158 @@ #include "BTCNumericTypes.h" #include "ColorScheme.h" -namespace { - static const QHash kRoles{ - {QmlAddressListModel::TableDataRole, "tableData"}, - {QmlAddressListModel::HeadingRole, "heading"}, - {QmlAddressListModel::FirstColRole, "firstcol"}, - {QmlAddressListModel::ColorRole, "dataColor"} - }; +namespace +{ + static const QHash kRoles{ + {QmlAddressListModel::TableDataRole, "tableData"}, + {QmlAddressListModel::HeadingRole, "heading"}, + {QmlAddressListModel::FirstColRole, "firstcol"}, + {QmlAddressListModel::ColorRole, "dataColor"}, + {QmlAddressListModel::AddressTypeRole, "addressType"}}; } -QmlAddressListModel::QmlAddressListModel(const std::shared_ptr& logger - , QObject* parent) - : QAbstractTableModel(parent), logger_(logger) - , header_({ tr("Address"), tr("#Tx"), tr("Balance (BTC)"), tr("Comment") }) -{} +QmlAddressListModel::QmlAddressListModel(const std::shared_ptr &logger, QObject *parent) + : QAbstractTableModel(parent), logger_(logger), header_({tr("Address"), tr("#Tx"), tr("Balance (BTC)"), tr("Comment")}) +{ +} int QmlAddressListModel::rowCount(const QModelIndex &) const { - return table_.size() + 1; + return table_.size() + 1; } int QmlAddressListModel::columnCount(const QModelIndex &) const { - return header_.size(); + return header_.size(); } -QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const +QVariant QmlAddressListModel::data(const QModelIndex &index, int role) const { - switch (role) { - case TableDataRole: - if (index.row() == 0) { - return header_.at(index.column()); - } - else { - const int row = index.row() - 1; - try { - switch (index.column()) { - case 0: return table_.at(row).at(0); - case 1: return QString::number(pendingBalances_.at(addresses_.at(row).id()).balance / BTCNumericTypes::BalanceDivider, 'f', 8); - case 2: return QString::number(pendingBalances_.at(addresses_.at(row).id()).nbTx); - case 3: return table_.at(row).at(1); - default: return QString{}; + try + { + switch (role) + { + case TableDataRole: + if (index.row() == 0) + { + return header_.at(index.column()); + } + else + { + const int row = index.row() - 1; + switch (index.column()) + { + case 0: + return table_.at(row).at(0); + case 1: + return QString::number(pendingBalances_.at(addresses_.at(row).id()).nbTx); + case 2: + return QString::number(pendingBalances_.at(addresses_.at(row).id()).balance / BTCNumericTypes::BalanceDivider, 'f', 8); + case 3: + return table_.at(row).at(1); + default: + return QString{}; + } + } + break; + case HeadingRole: + return (index.row() == 0); + case FirstColRole: + return (index.column() == 0); + case ColorRole: + if (index.row() == 0) + { + return ColorScheme::tableHeaderColor; + } + else + { + return QColorConstants::White; } - } - catch (const std::exception&) { - return QString{}; - } - } - break; - case HeadingRole: - return (index.row() == 0); - case FirstColRole: - return (index.column() == 0); - case ColorRole: - if (index.row() == 0) { - return ColorScheme::tableHeaderColor; - } - else { - return QColorConstants::White; - } - default: break; - } - return QVariant(); + case AddressTypeRole: + return table_.at(index.row() - 1).at(2); + default: + break; + } + } + catch (const std::exception &) + { + return QString{}; + } + return QVariant(); } QHash QmlAddressListModel::roleNames() const { - return kRoles; + return kRoles; } -void QmlAddressListModel::addRow(const std::string& walletId, const QVector& row) +void QmlAddressListModel::addRow(const std::string &walletId, const QVector &row) { - if (walletId != expectedWalletId_) { - logger_->warn("[QmlAddressListModel::addRow] wallet {} not expected ({})", walletId, expectedWalletId_); - return; - } - try { - addresses_.push_back(bs::Address::fromAddressString(row.at(0).toStdString())); - } - catch (const std::exception&) { - addresses_.push_back(bs::Address{}); - } - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - table_.append(row); - endInsertRows(); + if (walletId != expectedWalletId_) + { + logger_->warn("[QmlAddressListModel::addRow] wallet {} not expected ({})", walletId, expectedWalletId_); + return; + } + try + { + addresses_.push_back(bs::Address::fromAddressString(row.at(0).toStdString())); + } + catch (const std::exception &) + { + addresses_.push_back(bs::Address{}); + } + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + table_.append(row); + endInsertRows(); } -void QmlAddressListModel::addRows(const std::string& walletId, const QVector>& rows) +void QmlAddressListModel::addRows(const std::string &walletId, const QVector> &rows) { - if (walletId != expectedWalletId_) { - logger_->warn("[QmlAddressListModel::addRows] wallet {} not expected ({})", walletId, expectedWalletId_); - return; - } - if (rows.empty()) { - return; - } - for (const auto& row : rows) { - try { - addresses_.push_back(bs::Address::fromAddressString(row.at(0).toStdString())); - } - catch (const std::exception&) { - addresses_.push_back(bs::Address{}); - } - } - beginInsertRows(QModelIndex(), rowCount(), rowCount() + rows.size() - 1); - table_.append(rows); - endInsertRows(); + if (walletId != expectedWalletId_) + { + logger_->warn("[QmlAddressListModel::addRows] wallet {} not expected ({})", walletId, expectedWalletId_); + return; + } + if (rows.empty()) + { + return; + } + for (const auto &row : rows) + { + try + { + addresses_.push_back(bs::Address::fromAddressString(row.at(0).toStdString())); + } + catch (const std::exception &) + { + addresses_.push_back(bs::Address{}); + } + } + beginInsertRows(QModelIndex(), rowCount(), rowCount() + rows.size() - 1); + table_.append(rows); + endInsertRows(); } -void QmlAddressListModel::updateRow(const BinaryData& addrPubKey, uint64_t bal, uint32_t nbTx) +void QmlAddressListModel::updateRow(const BinaryData &addrPubKey, uint64_t bal, uint32_t nbTx) { - pendingBalances_[addrPubKey] = { bal, nbTx }; - for (int i = 0; i < table_.size(); ++i) { - const auto& addr = addresses_.at(i); - //logger_->debug("[QmlAddressListModel::updateRow] {} {} {}", addr.display(), bal, nbTx); - if (addr.id() == addrPubKey) { - emit dataChanged(createIndex(i + 1, 1), createIndex(i + 1, 2)); - break; - } - } + pendingBalances_[addrPubKey] = {bal, nbTx}; + for (int i = 0; i < table_.size(); ++i) + { + const auto &addr = addresses_.at(i); + // logger_->debug("[QmlAddressListModel::updateRow] {} {} {}", addr.display(), bal, nbTx); + if (addr.id() == addrPubKey) + { + emit dataChanged(createIndex(i + 1, 1), createIndex(i + 1, 2)); + break; + } + } } -void QmlAddressListModel::reset(const std::string& expectedWalletId) +void QmlAddressListModel::reset(const std::string &expectedWalletId) { - expectedWalletId_ = expectedWalletId; - beginResetModel(); - addresses_.clear(); - table_.clear(); - endResetModel(); + expectedWalletId_ = expectedWalletId; + beginResetModel(); + addresses_.clear(); + table_.clear(); + endResetModel(); } diff --git a/GUI/QtQuick/AddressListModel.h b/GUI/QtQuick/AddressListModel.h index 36f6e51ba..093dc305e 100644 --- a/GUI/QtQuick/AddressListModel.h +++ b/GUI/QtQuick/AddressListModel.h @@ -26,7 +26,7 @@ class QmlAddressListModel : public QAbstractTableModel { Q_OBJECT public: - enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, FirstColRole, ColorRole }; + enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, FirstColRole, ColorRole, AddressTypeRole }; QmlAddressListModel(const std::shared_ptr&, QObject* parent = nullptr); int rowCount(const QModelIndex & = QModelIndex()) const override; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 86dcbac72..291a31d32 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -39,6 +39,8 @@ #include "SettingsAdapter.h" #include "Wallets/ProtobufHeadlessUtils.h" #include "WalletBalancesModel.h" +#include "TransactionFilterModel.h" +#include "TransactionForAddressFilterModel.h" #include "common.pb.h" #include "hardware_wallet.pb.h" @@ -213,6 +215,8 @@ void QtQuickAdapter::run(int &argc, char **argv) qmlRegisterInterface("QTxDetails"); qmlRegisterUncreatableMetaObject(WalletBalance::staticMetaObject, "wallet.balance" , 1, 0, "WalletBalance", tr("Error: only enums")); + qmlRegisterType("terminal.models", 1, 0, "TransactionFilterModel"); + qmlRegisterType("terminal.models", 1, 0, "TransactionForAddressFilterModel"); //need to read files in qml qputenv("QML_XHR_ALLOW_FILE_READ", QByteArray("1")); @@ -888,8 +892,9 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId } QVector> addresses; for (const auto& addr : response.used_addresses()) { - addresses.append({ QString::fromStdString(addr.address()) - , QString::fromStdString(addr.comment().empty() ? addr.index() : addr.comment()) }); + addresses.append({ QString::fromStdString(addr.address()), + QString::fromStdString(addr.comment()), + QString::fromStdString(addr.index()) }); } addrModel_->addRows(response.wallet_id(), addresses); return ProcessingResult::Success; @@ -1546,8 +1551,9 @@ void QtQuickAdapter::processWalletAddresses(const std::string& walletId } const auto lastAddr = addresses.at(addresses.size() - 1); logger_->debug("[{}] {} last address: {}", __func__, hdWalletId, lastAddr.address.display()); - addrModel_->addRow(hdWalletId, { QString::fromStdString(lastAddr.address.display()) - , QString::fromStdString(lastAddr.index) }); + addrModel_->addRow(hdWalletId, { QString::fromStdString(lastAddr.address.display()), + QString::fromStdString(lastAddr.index), + QString::fromStdString(lastAddr.index) }); generatedAddress_ = lastAddr.address; emit addressGenerated(); } diff --git a/GUI/QtQuick/TransactionFilterModel.cpp b/GUI/QtQuick/TransactionFilterModel.cpp new file mode 100644 index 000000000..296cfee14 --- /dev/null +++ b/GUI/QtQuick/TransactionFilterModel.cpp @@ -0,0 +1,67 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "TransactionFilterModel.h" +#include "TxListModel.h" +#include + +TransactionFilterModel::TransactionFilterModel(QObject *parent) + : QSortFilterProxyModel(parent) +{ + connect(this, &TransactionFilterModel::changed, this, &TransactionFilterModel::invalidate); +} + +bool TransactionFilterModel::filterAcceptsRow(int source_row, + const QModelIndex &source_parent) const +{ + if (source_row == 0) { + return true; + } + + const auto walletNameIndex = sourceModel()->index(source_row, 1); + const auto transactionTypeIndex = sourceModel()->index(source_row, 2); + + + if (!walletName_.isEmpty()) { + if (sourceModel()->data(walletNameIndex, TxListModel::TableRoles::TableDataRole) != walletName_) { + return false; + } + } + + if (!transactionType_.isEmpty()) { + if (sourceModel()->data(transactionTypeIndex, TxListModel::TableRoles::TableDataRole) != transactionType_) { + return false; + } + } + + return true; +} + +const QString &TransactionFilterModel::walletName() const +{ + return walletName_; +} + +void TransactionFilterModel::setWalletName(const QString &name) +{ + walletName_ = name; + emit changed(); +} + +const QString &TransactionFilterModel::transactionType() const +{ + return transactionType_; +} + +void TransactionFilterModel::setTransactionType(const QString &type) +{ + transactionType_ = type; + emit changed(); +} diff --git a/GUI/QtQuick/TransactionFilterModel.h b/GUI/QtQuick/TransactionFilterModel.h new file mode 100644 index 000000000..f05e2f384 --- /dev/null +++ b/GUI/QtQuick/TransactionFilterModel.h @@ -0,0 +1,42 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef TRANSACTION_FILTER_MODEL_H +#define TRANSACTION_FILTER_MODEL_H + +#include + +class TransactionFilterModel : public QSortFilterProxyModel +{ + Q_OBJECT + Q_PROPERTY(QString walletName READ walletName WRITE setWalletName NOTIFY changed) + Q_PROPERTY(QString transactionType READ transactionType WRITE setTransactionType NOTIFY changed) + +public: + TransactionFilterModel(QObject *parent = nullptr); + + const QString &walletName() const; + void setWalletName(const QString &); + const QString &transactionType() const; + void setTransactionType(const QString &); + +signals: + void changed(); + +protected: + bool filterAcceptsRow(int source_row, + const QModelIndex &source_parent) const override; + +private: + QString walletName_; + QString transactionType_; +}; + +#endif // TRANSACTION_FILTER_MODEL_H diff --git a/GUI/QtQuick/TransactionForAddressFilterModel.cpp b/GUI/QtQuick/TransactionForAddressFilterModel.cpp new file mode 100644 index 000000000..300987f44 --- /dev/null +++ b/GUI/QtQuick/TransactionForAddressFilterModel.cpp @@ -0,0 +1,53 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "TransactionForAddressFilterModel.h" +#include "TxListModel.h" +#include + +TransactionForAddressFilterModel::TransactionForAddressFilterModel(QObject *parent) + : QSortFilterProxyModel(parent) +{ + connect(this, &TransactionForAddressFilterModel::changed, this, &TransactionForAddressFilterModel::invalidate); +} + +bool TransactionForAddressFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const +{ + if (source_row == 0) { + return true; + } + + const auto index = sourceModel()->index(source_row, 5); + const auto transaction_value = sourceModel()->data(index, TxListForAddr::TableRoles::TableDataRole); + if ((positive_ && transaction_value < 0) || (!positive_ && transaction_value > 0)) { + return false; + } + + return true; +} + +bool TransactionForAddressFilterModel::filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const +{ + if (source_column == 0 || source_column == 1 || source_column == 2 || source_column == 5) { + return true; + } + return false; +} + +bool TransactionForAddressFilterModel::positive() const +{ + return positive_; +} + +void TransactionForAddressFilterModel::set_positive(bool value) +{ + positive_ = value; + emit changed(); +} diff --git a/GUI/QtQuick/TransactionForAddressFilterModel.h b/GUI/QtQuick/TransactionForAddressFilterModel.h new file mode 100644 index 000000000..a66d95446 --- /dev/null +++ b/GUI/QtQuick/TransactionForAddressFilterModel.h @@ -0,0 +1,40 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef TRANSACTION_FOR_ADDRESS_FILTER_MODEL_H +#define TRANSACTION_FOR_ADDRESS_FILTER_MODEL_H + +#include + +class TransactionForAddressFilterModel : public QSortFilterProxyModel +{ + Q_OBJECT + Q_PROPERTY(bool positive READ positive WRITE set_positive NOTIFY changed) + +public: + TransactionForAddressFilterModel(QObject *parent = nullptr); + + bool positive() const; + void set_positive(bool value); + +signals: + void changed(); + +protected: + bool filterAcceptsRow(int source_row, + const QModelIndex &source_parent) const override; + bool filterAcceptsColumn(int source_column, + const QModelIndex &source_parent) const override; + +private: + bool positive_ {false}; +}; + +#endif // TRANSACTION_FOR_ADDRESS_FILTER_MODEL_H diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index c9526deeb..e2b74bb68 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -744,6 +744,12 @@ QString QTxDetails::feePerByte() const return displayBTC(amount / txWeight, 1); } + +int QTxDetails::height() const +{ + return details_.tx.getTxHeight(); +} + TxInOutModel::TxInOutModel(const std::vector& data, QObject* parent) : QAbstractTableModel(parent), data_(data) , header_{ tr("Address"), tr("Amount"), tr("Wallet") } @@ -815,7 +821,7 @@ QString TxInOutModel::getData(int row, int col) const QColor TxInOutModel::dataColor(int row, int col) const { - if ((row == 0) || (col == 0)) { + if (row == 0) { return ColorScheme::tableHeaderColor; } return QColorConstants::White; diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index fe83c1a91..06db7c8a3 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -176,6 +176,8 @@ class QTxDetails : public QObject QString fee() const; Q_PROPERTY(QString feePerByte READ feePerByte NOTIFY updated) QString feePerByte() const; + Q_PROPERTY(int height READ height NOTIFY updated) + int height() const; Q_PROPERTY(TxInOutModel* inputs READ inputs NOTIFY updated) TxInOutModel* inputs() const { return inputsModel_; } diff --git a/GUI/QtQuick/images/close_button.png b/GUI/QtQuick/images/close_button.png deleted file mode 100755 index 5ffc3ce64f539804beafa3816553946a9570e589..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{yI+=$B+ufsgoayIw^9v{hf0pRBB=FD%Pso zSJ-+dO?Gj(_EAFM<7xFfr-S<}a<5lEtPps+?eV_pE;8q)hc(V#qrLZAiL+4sf!>e< zb1N?zPhx#{=+RsT^&id;@??)UEoCciRR5T8GV$#uuP=*aet0K%9^1w_o5?xICgT4( z3&wQWtF^n%r^~snwYcoaa(Ty*j3XTnDtqR!?0>McQPq*HPsNnm+as^m`j?dP235gt ZoEmX=i^C&?76V<*;OXk;vd$@?2>=ZgYB>M^ diff --git a/GUI/QtQuick/images/close_button.svg b/GUI/QtQuick/images/close_button.svg new file mode 100644 index 000000000..d72431cdc --- /dev/null +++ b/GUI/QtQuick/images/close_button.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/qml/AddressDetails.qml b/GUI/QtQuick/qml/AddressDetails.qml index 893337e1c..498a588c1 100644 --- a/GUI/QtQuick/qml/AddressDetails.qml +++ b/GUI/QtQuick/qml/AddressDetails.qml @@ -1,120 +1,272 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * ********************************************************************************** */ -import QtQuick 2 -import QtQuick.Controls 2.9 +import QtQuick 2.15 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.12 import QtQuick.Layouts 1.3 -import QtQml.Models 2 +import terminal.models 1.0 import "StyledControls" import "BsStyles" -//import "BsControls" -//import "BsDialogs" -//import "js/helper.js" as JsHelper - -Item { - property var addressInfo - - Column { - spacing: 23 - anchors.fill: parent - - GridLayout { - columns: 3 - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() - } - } - Label { - text: qsTr("Transactions") - font.pointSize: 12 - } - Label { - text: qsTr("1") - font.pointSize: 12 - } - Image { - source: "qrc:/images/bs_logo.png" - Layout.rowSpan: 5 - } - Label { - text: qsTr("Wallet") - font.pointSize: 12 - } - Label { - text: qsTr("wallet") - font.pointSize: 12 - } + +Popup { + id: address_details + property string address: "" + property string transactions: "" + property string balance: "" + property string comment: "" + property string type: "" + property string wallet: "" + + width: 916 + height: 718 + anchors.centerIn: Overlay.overlay + + modal: true + focus: true + closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside + + background: Rectangle { + color: BSStyle.popupBackgroundColor + border.width: 1 + border.color: BSStyle.popupBorderColor + radius: 14 + } + + contentItem: Rectangle { + color: "transparent" + + Column { + anchors.fill: parent + anchors.topMargin: 12 + anchors.leftMargin: 12 + anchors.rightMargin: 12 + anchors.bottomMargin: 12 + spacing: 20 + Label { - text: qsTr("Address") - font.pointSize: 12 + text: qsTr("Address details") + color: BSStyle.textColor + font.pixelSize: 19 + font.weight: Font.Medium } + Row { - Label { - id: address - text: qsTr("address") - color: 'lightgrey' - font.pointSize: 12 + spacing: 20 + + Rectangle { + width: 128 + height: 128 + color: "white" + radius: 10 + anchors.verticalCenter: parent.verticalCenter + + Image { + source: "image://QR/" + address_details.address + sourceSize.width: parent.width - parent.radius + sourceSize.height: parent.width - parent.radius + anchors.centerIn: parent + } } - Button { - text: qsTr("Copy") - font.pointSize: 12 - onClicked: { - bsApp.copyAddressToClipboard(address.text) + + Grid { + columns: 2 + rowSpacing: 8 + + Text { + text: qsTr("Transactions") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 140 + } + Text { + text: address_details.transactions !== '' ? address_details.transactions : '-' + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("Wallet") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 140 + } + Text { + text: address_details.wallet + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("Address") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 140 + } + Row { + Text { + text: address_details.address + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + anchors.verticalCenter: parent.verticalCenter + } + CopyIconButton { + anchors.verticalCenter: parent.verticalCenter + onCopy: bsApp.copyAddressToClipboard(address_details.address) + } + } + + Text { + text: qsTr("Address Type/ID") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 140 + } + Text { + text: address_details.type + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("Comment") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 140 + } + Text { + text: address_details.comment !== '' ? address_details.comment : '-' + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("Balance") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 140 + } + Label { + text: address_details.balance !== '' ? address_details.balance : '-' + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 } } } - Label { - text: qsTr("Address Type/ID") - font.pointSize: 12 - } - Label { - text: qsTr("External/0") - font.pointSize: 12 - } - Label { - text: qsTr("Comment") - font.pointSize: 12 - } - Label { - text: qsTr("-") - font.pointSize: 12 - } - Label { - text: qsTr("Balance") - font.pointSize: 12 - } - Label { - text: qsTr("0") - font.pointSize: 12 - } - } - Row { - Label { - text: qsTr("Incoming transactions") - font.pointSize: 14 + + Row { + spacing: 8 + + Label { + text: qsTr("Incoming transactions") + color: BSStyle.textColor + font.pixelSize: 19 + font.weight: Font.Medium + } + + Image { + width: 9 + height: 12 + source: "qrc:/images/down_arrow.svg" + anchors.leftMargin: 20 + anchors.verticalCenter: parent.verticalCenter + } } - Image { - source: "qrc:/images/receive_icon.png" + + Rectangle { + width: parent.width + height: 170 + color: "transparent" + radius: 14 + border.color: BSStyle.popupBorderColor + border.width: 1 + + CustomTableView { + width: parent.width - 20 + height: parent.height + anchors.centerIn: parent + + model: TransactionForAddressFilterModel { + id: incoming_transaction_model + positive: true + sourceModel: txListByAddrModel + } + copy_button_column_index: 1 + columnWidths: [0.17, 0.6, 0.08, 0.15] + onCopyRequested: bsApp.copyAddressToClipboard(id) + } } - } - Row { - Label { - text: qsTr("Outgoing transactions") - font.pointSize: 14 + + Row { + spacing: 8 + + Label { + text: qsTr("Outgoing transactions") + color: BSStyle.textColor + font.pixelSize: 19 + font.weight: Font.Medium + } + + Image { + width: 9 + height: 12 + source: "qrc:/images/up_arrow.svg" + anchors.leftMargin: 20 + anchors.verticalCenter: parent.verticalCenter + } } - Image { - source: "qrc:/images/send_icon.png" + + Rectangle { + width: parent.width + height: 170 + color: "transparent" + radius: 14 + border.color: BSStyle.popupBorderColor + border.width: 1 + + CustomTableView { + width: parent.width - 20 + height: parent.height + anchors.centerIn: parent + + + model: TransactionForAddressFilterModel { + id: outgoing_transaction_model + positive: false + sourceModel: txListByAddrModel + } + copy_button_column_index: 1 + columnWidths: [0.17, 0.6, 0.08, 0.15] + onCopyRequested: bsApp.copyAddressToClipboard(id) + } } } } + + CloseIconButton { + anchors.right: parent.right + anchors.top: parent.top + + onClose: address_details.close() + } } diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index 8c32114a3..c9b6d7fdf 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -115,4 +115,11 @@ QtObject { readonly property color addressesPanelBackgroundColor: "#333C435A" readonly property color listItemBorderColor: "#3C435A" + + readonly property color popupBackgroundColor: "#191E2A" + readonly property color popupBorderColor: "#3C435A" + + readonly property color transactionConfirmationZero: "red" + readonly property color transactionConfirmationLow: "yellow" + readonly property color transactionConfirmationHigh: "#67D2A3" } diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index bf88f166d..0834be67b 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -24,6 +24,7 @@ Rectangle { signal requestWalletProperties() signal createNewWallet() signal walletIndexChanged(index : int) + signal openAddressDetails(var address, var transactions, var balance, var comment, var type, var wallet) Column { anchors.leftMargin: 18 @@ -74,6 +75,15 @@ Rectangle { columnWidths: [0.35, 0.15, 0.1, 0.4] onCopyRequested: bsApp.copyAddressToClipboard(id) + onCellClicked: (row, column, data) => { + const address = (column === 0) ? data : model.data(model.index(row, 0), 257) + const transactions = model.data(model.index(row, 1), 257) + const balance = model.data(model.index(row, 2), 257) + const comment = model.data(model.index(row, 3), 257) + const type = model.data(model.index(row, 0), 261) + + openAddressDetails(address, transactions, balance, comment, type, overview_panel.currentWallet) + } } } } diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index 3f7a0f944..6e878c273 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -21,6 +21,8 @@ Rectangle { height: 100 color: "transparent" + property alias currentWallet: wallet_selection_combobox.currentValue + signal requestWalletProperties() signal createNewWallet() signal walletIndexChanged(index : int) diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 14a900fdc..15b747cb2 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -43,5 +43,15 @@ Item { onRequestWalletProperties: console.log("Nothing to do") onCreateNewWallet: overview.newWalletClicked() onWalletIndexChanged: overview.curWalletIndexChanged(index) + onOpenAddressDetails: (address, transactions, balance, comment, type, wallet) => { + addressDetails.address = address + addressDetails.transactions = transactions + addressDetails.balance = balance + addressDetails.comment = comment + addressDetails.type = type + addressDetails.wallet = wallet + bsApp.startAddressSearch(address) + addressDetails.open() + } } } diff --git a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml index 0d47072a1..764685e73 100644 --- a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml +++ b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml @@ -49,7 +49,7 @@ Window { anchors.right: parent.right anchors.rightMargin: 24 - source: "qrc:/images/close_button.png" + source: "qrc:/images/close_button.svg" width: 16 height: 16 MouseArea { diff --git a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml index 31dd422c9..50b88b6d8 100644 --- a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml +++ b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml @@ -166,7 +166,7 @@ Window { anchors.right: parent.right anchors.rightMargin: 24 - source: "qrc:/images/close_button.png" + source: "qrc:/images/close_button.svg" width: 16 height: 16 MouseArea { diff --git a/GUI/QtQuick/qml/StyledControls/CloseIconButton.qml b/GUI/QtQuick/qml/StyledControls/CloseIconButton.qml new file mode 100644 index 000000000..cd8a20435 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CloseIconButton.qml @@ -0,0 +1,22 @@ + +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import "../BsStyles" + +Image { + id: control + + signal close(); + + width: 16 + height: 16 + source: "qrc:/images/close_button.svg" + + MouseArea { + anchors.fill: parent + onClicked: { + control.close() + } + } +} diff --git a/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml b/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml index 5efaf27c7..0c098a66a 100644 --- a/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml @@ -9,7 +9,6 @@ Image { signal copy(); - x: internal_text.contentWidth + copy_icon.width / 2 width: 24 height: 24 anchors.verticalCenter: parent.verticalCenter diff --git a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml index 031688ba1..c0c20a7f7 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml @@ -49,7 +49,7 @@ Window { anchors.right: parent.right anchors.rightMargin: 24 - source: "qrc:/images/close_button.png" + source: "qrc:/images/close_button.svg" width: 16 height: 16 MouseArea { diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index 869d0baef..ad94a29f1 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -65,8 +65,16 @@ TableView { } } - onClicked: component.cellClicked(row, column, tableData) - onDoubleClicked: component.cellDoubleClicked(row, column, tableData) + onClicked: { + if (row !== 0) { + component.cellClicked(row, column, tableData) + } + } + onDoubleClicked: { + if (row !== 0) { + omponent.cellDoubleClicked(row, column, tableData) + } + } } Row { diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml new file mode 100644 index 000000000..87fbc1679 --- /dev/null +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -0,0 +1,341 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.3 +import terminal.models 1.0 + +import "StyledControls" +import "BsStyles" + +Popup { + id: transaction_details + + property var tx + property string walletName: '' + property string address: '' + property string txAmount: '' + property string txDateTime: '' + property string txType: '' + property string txComment: '' + + width: 916 + height: 718 + anchors.centerIn: Overlay.overlay + + modal: true + focus: true + closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside + + background: Rectangle { + color: BSStyle.popupBackgroundColor + border.width: 1 + border.color: BSStyle.popupBorderColor + radius: 14 + } + + contentItem: Rectangle { + color: "transparent" + + Column { + anchors.fill: parent + anchors.topMargin: 12 + anchors.leftMargin: 12 + anchors.rightMargin: 12 + anchors.bottomMargin: 12 + spacing: 20 + + Label { + text: qsTr("Transactions details") + color: BSStyle.textColor + font.pixelSize: 19 + font.weight: Font.Medium + } + + + Grid { + columns: 2 + rowSpacing: 8 + + Text { + text: qsTr("Hash (RPC byte order)") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 170 + } + Row { + Text { + text: tx.txId + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + anchors.verticalCenter: parent.verticalCenter + } + CopyIconButton { + anchors.verticalCenter: parent.verticalCenter + onCopy: bsApp.copyAddressToClipboard(tx.txId) + } + } + + Text { + text: qsTr("Time") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 170 + } + Text { + text: transaction_details.txDateTime + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("Height") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 170 + } + Text { + text: tx.height + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("Amount") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 170 + } + Text { + text: transaction_details.txAmount + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("Type") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 170 + } + Text { + text: transaction_details.txType + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("Virtual size (Bytes)") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 170 + } + Label { + text: tx.virtSize + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("sat / virtual byte") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 170 + } + Label { + text: tx.feePerByte + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("Fee") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 170 + } + Label { + text: tx.fee + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("Confirmations") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 170 + } + Label { + function define_color(value) { + if (value == 0) { + return BSStyle.transactionConfirmationZero + } + else if (value < 6) { + return BSStyle.transactionConfirmationLow + } + return BSStyle.transactionConfirmationHigh + } + + text: tx.nbConf + color: define_color(tx.nbConf) + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("Wallet") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 170 + } + Label { + text: transaction_details.walletName + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("Address") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 170 + } + Label { + text: transaction_details.address + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + + Text { + text: qsTr("Comment") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: 170 + } + Label { + text: transaction_details.txComment === '' ? '-' : transaction_details.txComment + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + } + + Row { + spacing: 8 + + Label { + text: qsTr("Sender addresses") + color: BSStyle.textColor + font.pixelSize: 19 + font.weight: Font.Medium + } + + Image { + width: 9 + height: 12 + source: "qrc:/images/up_arrow.svg" + anchors.leftMargin: 20 + anchors.verticalCenter: parent.verticalCenter + } + } + + Rectangle { + width: parent.width + height: 100 + color: "transparent" + radius: 14 + border.color: BSStyle.popupBorderColor + border.width: 1 + + CustomTableView { + width: parent.width - 20 + height: parent.height + anchors.centerIn: parent + model: tx.inputs + + copy_button_column_index: 0 + columnWidths: [0.7, 0.2, 0.1] + onCopyRequested: bsApp.copyAddressToClipboard(id) + } + } + + Row { + spacing: 8 + + Label { + text: qsTr("Receiver addresses") + color: BSStyle.textColor + font.pixelSize: 19 + font.weight: Font.Medium + } + + Image { + width: 9 + height: 12 + source: "qrc:/images/down_arrow.svg" + anchors.leftMargin: 20 + anchors.verticalCenter: parent.verticalCenter + } + } + + Rectangle { + width: parent.width + height: 100 + color: "transparent" + radius: 14 + border.color: BSStyle.popupBorderColor + border.width: 1 + + CustomTableView { + width: parent.width - 20 + height: parent.height + anchors.centerIn: parent + model: tx.outputs + + copy_button_column_index: 0 + columnWidths: [0.7, 0.2, 0.1] + onCopyRequested: bsApp.copyAddressToClipboard(id) + } + } + } + } + + CloseIconButton { + anchors.right: parent.right + anchors.top: parent.top + + onClose: transaction_details.close() + } +} diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 6ac8b2a53..92330084c 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -23,6 +23,11 @@ import "BsStyles" Item { id: transactions + TransactionDetails { + id: transactionDetails + visible: false + } + FileDialog { id: fileDialogCSV visible: false @@ -144,8 +149,19 @@ Item { model: txListModel copy_button_column_index: 3 - columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] + columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) + onCellClicked: (row, column, data) => { + const txHash = model.data(model.index(row, 0), 261) + transactionDetails.walletName = model.data(model.index(row, 1), 257) + transactionDetails.address = model.data(model.index(row, 3), 257) + transactionDetails.txDateTime = model.data(model.index(row, 0), 257) + transactionDetails.txType = model.data(model.index(row, 2), 257) + transactionDetails.txComment = model.data(model.index(row, 7), 257) + transactionDetails.txAmount = model.data(model.index(row, 4), 257) + transactionDetails.tx = bsApp.getTXDetails(txHash) + transactionDetails.open() + } } } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index ad2aca879..d119e8c9f 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -63,7 +63,7 @@ images/transactions_icon_unchoosed.png images/explorer_icon_unchoosed.png TermsAndConditions.txt - images/close_button.png + images/close_button.svg qml/StyledControls/CustomTitleLabel.qml images/wallet icon.png images/back_arrow.png @@ -151,5 +151,7 @@ qml/StyledControls/InputOutputTableView.qml images/down_arrow.svg images/up_arrow.svg + qml/TransactionDetails.qml + qml/StyledControls/CloseIconButton.qml From 3625f853e6c75eb58e1f3ab38100e799284ecbde Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 10 Feb 2023 01:01:14 +0100 Subject: [PATCH 124/436] Color scheme update for transaction type & confirmation count --- GUI/QtQuick/ColorScheme.h | 3 +++ GUI/QtQuick/TxListModel.cpp | 12 ++++++------ GUI/QtQuick/qml/BsStyles/BSStyle.qml | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/GUI/QtQuick/ColorScheme.h b/GUI/QtQuick/ColorScheme.h index 67cf91616..4778d318f 100644 --- a/GUI/QtQuick/ColorScheme.h +++ b/GUI/QtQuick/ColorScheme.h @@ -4,4 +4,7 @@ namespace ColorScheme { static const QColor tableHeaderColor = QColor("#7A88B0"); + + static const QColor transactionConfirmationZero = QColor("#EB6060"); + static const QColor transactionConfirmationHigh = QColor("#67D2A3"); } \ No newline at end of file diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index e2b74bb68..f38f48eb3 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -99,21 +99,21 @@ QColor TxListModel::dataColor(int row, int col) const const auto& entry = data_.at(row - 1); if (col == 5) { switch (entry.nbConf) { - case 0: return QColorConstants::Red; + case 0: return ColorScheme::transactionConfirmationZero; case 1: case 2: case 3: case 4: case 5: return QColorConstants::Yellow; - default: return QColorConstants::Green; + default: return ColorScheme::transactionConfirmationHigh; } } else if (col == 2) { const auto& itTxDet = txDetails_.find(row - 1); if (itTxDet != txDetails_.end()) { switch (itTxDet->second.direction) { - case bs::sync::Transaction::Direction::Received: return QColorConstants::Green; - case bs::sync::Transaction::Direction::Sent: return QColorConstants::Red; + case bs::sync::Transaction::Direction::Received: return ColorScheme::transactionConfirmationHigh; + case bs::sync::Transaction::Direction::Sent: return ColorScheme::transactionConfirmationZero; case bs::sync::Transaction::Direction::Internal: return QColorConstants::Cyan; default: break; } @@ -494,13 +494,13 @@ QColor TxListForAddr::dataColor(int row, int col) const const auto& entry = data_.at(row - 1); if (col == 2) { switch (entry.nbConf) { - case 0: return QColorConstants::Red; + case 0: return ColorScheme::transactionConfirmationZero; case 1: case 2: case 3: case 4: case 5: return QColorConstants::Yellow; - default: return QColorConstants::Green; + default: return ColorScheme::transactionConfirmationHigh; } } return QColorConstants::White; diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index c9b6d7fdf..ec12aa47e 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -119,7 +119,7 @@ QtObject { readonly property color popupBackgroundColor: "#191E2A" readonly property color popupBorderColor: "#3C435A" - readonly property color transactionConfirmationZero: "red" + readonly property color transactionConfirmationZero: "#EB6060" readonly property color transactionConfirmationLow: "yellow" readonly property color transactionConfirmationHigh: "#67D2A3" } From 09a2814dff90d2896d75d8cddf7a240d6e0ee3c3 Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 10 Feb 2023 12:34:14 +0100 Subject: [PATCH 125/436] Hot fixes --- GUI/QtQuick/AddressListModel.cpp | 215 ++++++++---------- GUI/QtQuick/ColorScheme.h | 2 +- GUI/QtQuick/QtQuickAdapter.cpp | 12 +- GUI/QtQuick/TransactionFilterModel.cpp | 56 ++--- .../TransactionForAddressFilterModel.cpp | 36 +-- .../TransactionForAddressFilterModel.h | 22 +- GUI/QtQuick/TxListModel.cpp | 17 +- GUI/QtQuick/TxListModel.h | 6 +- GUI/QtQuick/qml/ExplorerTX.qml | 2 +- .../StyledControls/InputOutputTableView.qml | 4 +- GUI/QtQuick/qml/TransactionDetails.qml | 21 +- 11 files changed, 194 insertions(+), 199 deletions(-) diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index e12513e44..52f2aa931 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -15,12 +15,12 @@ namespace { - static const QHash kRoles{ - {QmlAddressListModel::TableDataRole, "tableData"}, - {QmlAddressListModel::HeadingRole, "heading"}, - {QmlAddressListModel::FirstColRole, "firstcol"}, - {QmlAddressListModel::ColorRole, "dataColor"}, - {QmlAddressListModel::AddressTypeRole, "addressType"}}; + static const QHash kRoles{ + {QmlAddressListModel::TableDataRole, "tableData"}, + {QmlAddressListModel::HeadingRole, "heading"}, + {QmlAddressListModel::FirstColRole, "firstcol"}, + {QmlAddressListModel::ColorRole, "dataColor"}, + {QmlAddressListModel::AddressTypeRole, "addressType"}}; } QmlAddressListModel::QmlAddressListModel(const std::shared_ptr &logger, QObject *parent) @@ -30,141 +30,128 @@ QmlAddressListModel::QmlAddressListModel(const std::shared_ptr & int QmlAddressListModel::rowCount(const QModelIndex &) const { - return table_.size() + 1; + return table_.size() + 1; } int QmlAddressListModel::columnCount(const QModelIndex &) const { - return header_.size(); + return header_.size(); } QVariant QmlAddressListModel::data(const QModelIndex &index, int role) const { - try - { - switch (role) - { - case TableDataRole: - if (index.row() == 0) - { - return header_.at(index.column()); + try + { + switch (role) + { + case TableDataRole: + if (index.row() == 0) { + return header_.at(index.column()); + } + else + { + const int row = index.row() - 1; + switch (index.column()) { + case 0: return table_.at(row).at(0); + case 1: return QString::number(pendingBalances_.at(addresses_.at(row).id()).nbTx); + case 2: return QString::number(pendingBalances_.at(addresses_.at(row).id()).balance / BTCNumericTypes::BalanceDivider, 'f', 8); + case 3: return table_.at(row).at(1); + default: return QString{}; } - else - { - const int row = index.row() - 1; - switch (index.column()) - { - case 0: - return table_.at(row).at(0); - case 1: - return QString::number(pendingBalances_.at(addresses_.at(row).id()).nbTx); - case 2: - return QString::number(pendingBalances_.at(addresses_.at(row).id()).balance / BTCNumericTypes::BalanceDivider, 'f', 8); - case 3: - return table_.at(row).at(1); - default: - return QString{}; - } - } - break; - case HeadingRole: - return (index.row() == 0); - case FirstColRole: - return (index.column() == 0); - case ColorRole: - if (index.row() == 0) - { - return ColorScheme::tableHeaderColor; - } - else - { - return QColorConstants::White; - } - case AddressTypeRole: - return table_.at(index.row() - 1).at(2); - default: - break; - } - } - catch (const std::exception &) - { - return QString{}; - } - return QVariant(); + } + break; + case HeadingRole: return (index.row() == 0); + case FirstColRole: return (index.column() == 0); + case ColorRole: + if (index.row() == 0) { + return ColorScheme::tableHeaderColor; + } + else { + return QColorConstants::White; + } + case AddressTypeRole: return table_.at(index.row() - 1).at(2); + default: break; + } + } + catch (const std::exception &) + { + return QString{}; + } + return QVariant(); } QHash QmlAddressListModel::roleNames() const { - return kRoles; + return kRoles; } void QmlAddressListModel::addRow(const std::string &walletId, const QVector &row) { - if (walletId != expectedWalletId_) - { - logger_->warn("[QmlAddressListModel::addRow] wallet {} not expected ({})", walletId, expectedWalletId_); - return; - } - try - { - addresses_.push_back(bs::Address::fromAddressString(row.at(0).toStdString())); - } - catch (const std::exception &) - { - addresses_.push_back(bs::Address{}); - } - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - table_.append(row); - endInsertRows(); + if (walletId != expectedWalletId_) + { + logger_->warn("[QmlAddressListModel::addRow] wallet {} not expected ({})", walletId, expectedWalletId_); + return; + } + try + { + addresses_.push_back(bs::Address::fromAddressString(row.at(0).toStdString())); + } + catch (const std::exception &) + { + addresses_.push_back(bs::Address{}); + } + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + table_.append(row); + endInsertRows(); } void QmlAddressListModel::addRows(const std::string &walletId, const QVector> &rows) { - if (walletId != expectedWalletId_) - { - logger_->warn("[QmlAddressListModel::addRows] wallet {} not expected ({})", walletId, expectedWalletId_); - return; - } - if (rows.empty()) - { - return; - } - for (const auto &row : rows) - { - try - { - addresses_.push_back(bs::Address::fromAddressString(row.at(0).toStdString())); - } - catch (const std::exception &) - { - addresses_.push_back(bs::Address{}); - } - } - beginInsertRows(QModelIndex(), rowCount(), rowCount() + rows.size() - 1); - table_.append(rows); - endInsertRows(); + if (walletId != expectedWalletId_) + { + logger_->warn("[QmlAddressListModel::addRows] wallet {} not expected ({})", walletId, expectedWalletId_); + return; + } + if (rows.empty()) + { + return; + } + for (const auto &row : rows) + { + try + { + addresses_.push_back(bs::Address::fromAddressString(row.at(0).toStdString())); + } + catch (const std::exception &) + { + addresses_.push_back(bs::Address{}); + } + } + beginInsertRows(QModelIndex(), rowCount(), rowCount() + rows.size() - 1); + table_.append(rows); + endInsertRows(); } void QmlAddressListModel::updateRow(const BinaryData &addrPubKey, uint64_t bal, uint32_t nbTx) { - pendingBalances_[addrPubKey] = {bal, nbTx}; - for (int i = 0; i < table_.size(); ++i) - { - const auto &addr = addresses_.at(i); - // logger_->debug("[QmlAddressListModel::updateRow] {} {} {}", addr.display(), bal, nbTx); - if (addr.id() == addrPubKey) - { - emit dataChanged(createIndex(i + 1, 1), createIndex(i + 1, 2)); - break; - } - } + pendingBalances_[addrPubKey] = {bal, nbTx}; + for (int i = 0; i < table_.size(); ++i) + { + const auto &addr = addresses_.at(i); + // logger_->debug("[QmlAddressListModel::updateRow] {} {} {}", addr.display(), bal, nbTx); + if (addr.id() == addrPubKey) + { + emit dataChanged(createIndex(i + 1, 1), createIndex(i + 1, 2)); + break; + } + } } void QmlAddressListModel::reset(const std::string &expectedWalletId) { - expectedWalletId_ = expectedWalletId; - beginResetModel(); - addresses_.clear(); - table_.clear(); - endResetModel(); + expectedWalletId_ = expectedWalletId; + beginResetModel(); + addresses_.clear(); + table_.clear(); + endResetModel(); } diff --git a/GUI/QtQuick/ColorScheme.h b/GUI/QtQuick/ColorScheme.h index 4778d318f..748a64ea2 100644 --- a/GUI/QtQuick/ColorScheme.h +++ b/GUI/QtQuick/ColorScheme.h @@ -7,4 +7,4 @@ namespace ColorScheme { static const QColor transactionConfirmationZero = QColor("#EB6060"); static const QColor transactionConfirmationHigh = QColor("#67D2A3"); -} \ No newline at end of file +} diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 291a31d32..8bcf1215d 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -892,9 +892,9 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId } QVector> addresses; for (const auto& addr : response.used_addresses()) { - addresses.append({ QString::fromStdString(addr.address()), - QString::fromStdString(addr.comment()), - QString::fromStdString(addr.index()) }); + addresses.append({ QString::fromStdString(addr.address()) + , QString::fromStdString(addr.comment()) + , QString::fromStdString(addr.index()) }); } addrModel_->addRows(response.wallet_id(), addresses); return ProcessingResult::Success; @@ -1551,9 +1551,9 @@ void QtQuickAdapter::processWalletAddresses(const std::string& walletId } const auto lastAddr = addresses.at(addresses.size() - 1); logger_->debug("[{}] {} last address: {}", __func__, hdWalletId, lastAddr.address.display()); - addrModel_->addRow(hdWalletId, { QString::fromStdString(lastAddr.address.display()), - QString::fromStdString(lastAddr.index), - QString::fromStdString(lastAddr.index) }); + addrModel_->addRow(hdWalletId, { QString::fromStdString(lastAddr.address.display()) + , QString::fromStdString(lastAddr.index) + , QString::fromStdString(lastAddr.index) }); generatedAddress_ = lastAddr.address; emit addressGenerated(); } diff --git a/GUI/QtQuick/TransactionFilterModel.cpp b/GUI/QtQuick/TransactionFilterModel.cpp index 296cfee14..c39e23102 100644 --- a/GUI/QtQuick/TransactionFilterModel.cpp +++ b/GUI/QtQuick/TransactionFilterModel.cpp @@ -13,55 +13,59 @@ #include TransactionFilterModel::TransactionFilterModel(QObject *parent) - : QSortFilterProxyModel(parent) + : QSortFilterProxyModel(parent) { - connect(this, &TransactionFilterModel::changed, this, &TransactionFilterModel::invalidate); + connect(this, &TransactionFilterModel::changed, this, &TransactionFilterModel::invalidate); } bool TransactionFilterModel::filterAcceptsRow(int source_row, - const QModelIndex &source_parent) const + const QModelIndex &source_parent) const { - if (source_row == 0) { - return true; - } + if (source_row == 0) + { + return true; + } - const auto walletNameIndex = sourceModel()->index(source_row, 1); - const auto transactionTypeIndex = sourceModel()->index(source_row, 2); + const auto walletNameIndex = sourceModel()->index(source_row, 1); + const auto transactionTypeIndex = sourceModel()->index(source_row, 2); + if (!walletName_.isEmpty()) + { + if (sourceModel()->data(walletNameIndex, TxListModel::TableRoles::TableDataRole) != walletName_) + { + return false; + } + } - if (!walletName_.isEmpty()) { - if (sourceModel()->data(walletNameIndex, TxListModel::TableRoles::TableDataRole) != walletName_) { - return false; - } - } - - if (!transactionType_.isEmpty()) { - if (sourceModel()->data(transactionTypeIndex, TxListModel::TableRoles::TableDataRole) != transactionType_) { - return false; - } - } + if (!transactionType_.isEmpty()) + { + if (sourceModel()->data(transactionTypeIndex, TxListModel::TableRoles::TableDataRole) != transactionType_) + { + return false; + } + } - return true; + return true; } const QString &TransactionFilterModel::walletName() const { - return walletName_; + return walletName_; } void TransactionFilterModel::setWalletName(const QString &name) { - walletName_ = name; - emit changed(); + walletName_ = name; + emit changed(); } const QString &TransactionFilterModel::transactionType() const { - return transactionType_; + return transactionType_; } void TransactionFilterModel::setTransactionType(const QString &type) { - transactionType_ = type; - emit changed(); + transactionType_ = type; + emit changed(); } diff --git a/GUI/QtQuick/TransactionForAddressFilterModel.cpp b/GUI/QtQuick/TransactionForAddressFilterModel.cpp index 300987f44..5146a5fdf 100644 --- a/GUI/QtQuick/TransactionForAddressFilterModel.cpp +++ b/GUI/QtQuick/TransactionForAddressFilterModel.cpp @@ -13,41 +13,41 @@ #include TransactionForAddressFilterModel::TransactionForAddressFilterModel(QObject *parent) - : QSortFilterProxyModel(parent) + : QSortFilterProxyModel(parent) { - connect(this, &TransactionForAddressFilterModel::changed, this, &TransactionForAddressFilterModel::invalidate); + connect(this, &TransactionForAddressFilterModel::changed, this, &TransactionForAddressFilterModel::invalidate); } bool TransactionForAddressFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { - if (source_row == 0) { - return true; - } + if (source_row == 0) { + return true; + } - const auto index = sourceModel()->index(source_row, 5); - const auto transaction_value = sourceModel()->data(index, TxListForAddr::TableRoles::TableDataRole); - if ((positive_ && transaction_value < 0) || (!positive_ && transaction_value > 0)) { - return false; - } + const auto index = sourceModel()->index(source_row, 5); + const auto transaction_value = sourceModel()->data(index, TxListForAddr::TableRoles::TableDataRole); + if ((positive_ && transaction_value < 0) || (!positive_ && transaction_value > 0)) { + return false; + } - return true; + return true; } bool TransactionForAddressFilterModel::filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const { - if (source_column == 0 || source_column == 1 || source_column == 2 || source_column == 5) { - return true; - } - return false; + if (source_column == 0 || source_column == 1 || source_column == 2 || source_column == 5) { + return true; + } + return false; } bool TransactionForAddressFilterModel::positive() const { - return positive_; + return positive_; } void TransactionForAddressFilterModel::set_positive(bool value) { - positive_ = value; - emit changed(); + positive_ = value; + emit changed(); } diff --git a/GUI/QtQuick/TransactionForAddressFilterModel.h b/GUI/QtQuick/TransactionForAddressFilterModel.h index a66d95446..74e239a44 100644 --- a/GUI/QtQuick/TransactionForAddressFilterModel.h +++ b/GUI/QtQuick/TransactionForAddressFilterModel.h @@ -15,26 +15,26 @@ class TransactionForAddressFilterModel : public QSortFilterProxyModel { - Q_OBJECT - Q_PROPERTY(bool positive READ positive WRITE set_positive NOTIFY changed) + Q_OBJECT + Q_PROPERTY(bool positive READ positive WRITE set_positive NOTIFY changed) public: - TransactionForAddressFilterModel(QObject *parent = nullptr); + TransactionForAddressFilterModel(QObject *parent = nullptr); - bool positive() const; - void set_positive(bool value); + bool positive() const; + void set_positive(bool value); signals: - void changed(); + void changed(); protected: - bool filterAcceptsRow(int source_row, - const QModelIndex &source_parent) const override; - bool filterAcceptsColumn(int source_column, - const QModelIndex &source_parent) const override; + bool filterAcceptsRow(int source_row, + const QModelIndex &source_parent) const override; + bool filterAcceptsColumn(int source_column, + const QModelIndex &source_parent) const override; private: - bool positive_ {false}; + bool positive_{false}; }; #endif // TRANSACTION_FOR_ADDRESS_FILTER_MODEL_H diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index f38f48eb3..fb9de21b7 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -34,7 +34,7 @@ namespace { {TxInOutModel::HeadingRole, "heading"}, {TxInOutModel::ColorRole, "dataColor"}, {TxInOutModel::WidthRole, "colWidth"}, - {TxInOutModel::AddressRole, "address"}, + {TxInOutModel::TxHashRole, "txHash"}, }; static const QString dateTimeFormat = QString::fromStdString("yyyy-MM-dd hh:mm:ss"); @@ -745,7 +745,7 @@ QString QTxDetails::feePerByte() const } -int QTxDetails::height() const +qint32 QTxDetails::height() const { return details_.tx.getTxHeight(); } @@ -779,9 +779,9 @@ QVariant TxInOutModel::data(const QModelIndex& index, int role) const return dataColor(index.row(), index.column()); case WidthRole: return colWidth(index.column()); - case AddressRole: + case TxHashRole: try { - return QString::fromStdString(data_.at(index.row() - 1).address.display()); + return QString::fromStdString(data_.at(index.row() - 1).outHash.toHexStr(true)); } catch (const std::exception&) { return {}; } default: break; @@ -804,12 +804,9 @@ QString TxInOutModel::getData(int row, int col) const } try { switch (col) { - case 0: - return QString::fromStdString(data_.at(row - 1).outHash.toHexStr(true)); - case 1: - return QString::fromStdString(data_.at(row - 1).valueStr); - case 2: - return QString::fromStdString(data_.at(row - 1).walletName); + case 0: return QString::fromStdString(data_.at(row - 1).address.display()); + case 1: return QString::fromStdString(data_.at(row - 1).valueStr); + case 2: return QString::fromStdString(data_.at(row - 1).walletName); default: break; } } diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 06db7c8a3..ae08e5da2 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -128,7 +128,7 @@ class TxInOutModel : public QAbstractTableModel Q_OBJECT public: enum TableRoles { - TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole, WidthRole, AddressRole + TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole, WidthRole, TxHashRole }; TxInOutModel(const std::vector& data, QObject* parent = nullptr); @@ -176,8 +176,8 @@ class QTxDetails : public QObject QString fee() const; Q_PROPERTY(QString feePerByte READ feePerByte NOTIFY updated) QString feePerByte() const; - Q_PROPERTY(int height READ height NOTIFY updated) - int height() const; + Q_PROPERTY(qint32 height READ height NOTIFY updated) + qint32 height() const; Q_PROPERTY(TxInOutModel* inputs READ inputs NOTIFY updated) TxInOutModel* inputs() const { return inputsModel_; } diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index e0590ba07..4206b1419 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -274,7 +274,7 @@ Item { // TODO: change constant 261 with C++ defined enum onCellClicked: (row, column, data) => { - var address = model.data(model.index(row, 0), 261) + var address = model.data(model.index(row, 0), 257) requestPageChange(address) } } diff --git a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml index ad956a8b2..e263d8fd6 100644 --- a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml @@ -89,7 +89,7 @@ CustomTableView { leftPadding: 10 } Text { - text: address + text: tableData width: parent.width - fontMetrics.advanceWidth(address_label_item.text) - 10 color: BSStyle.textColor font.family: "Roboto" @@ -111,7 +111,7 @@ CustomTableView { leftPadding: 10 } Text { - text: tableData + text: txHash width: parent.width - fontMetrics.advanceWidth(transaction_label_item.text) - 10 color: BSStyle.textColor font.family: "Roboto" diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index 87fbc1679..e047a1217 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -230,11 +230,18 @@ Popup { font.pixelSize: 14 width: 170 } - Label { - text: transaction_details.address - color: BSStyle.textColor - font.family: "Roboto" - font.pixelSize: 14 + Row { + Text { + text: transaction_details.address + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + anchors.verticalCenter: parent.verticalCenter + } + CopyIconButton { + anchors.verticalCenter: parent.verticalCenter + onCopy: bsApp.copyAddressToClipboard(tx.txId) + } } Text { @@ -256,7 +263,7 @@ Popup { spacing: 8 Label { - text: qsTr("Sender addresses") + text: qsTr("Input addresses") color: BSStyle.textColor font.pixelSize: 19 font.weight: Font.Medium @@ -295,7 +302,7 @@ Popup { spacing: 8 Label { - text: qsTr("Receiver addresses") + text: qsTr("Output addresses") color: BSStyle.textColor font.pixelSize: 19 font.weight: Font.Medium From c3d59b7e4217087b6f9b8c1c25f89ebd37ad11ca Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 10 Feb 2023 15:28:48 +0100 Subject: [PATCH 126/436] Additional fixes --- GUI/QtQuick/AddressListModel.cpp | 24 ++++++++++++++---------- GUI/QtQuick/TransactionFilterModel.h | 26 +++++++++++++------------- GUI/QtQuick/TxListModel.cpp | 2 +- GUI/QtQuick/qml/ExplorerTX.qml | 2 +- 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index 52f2aa931..cb66dbc60 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -16,15 +16,15 @@ namespace { static const QHash kRoles{ - {QmlAddressListModel::TableDataRole, "tableData"}, - {QmlAddressListModel::HeadingRole, "heading"}, - {QmlAddressListModel::FirstColRole, "firstcol"}, - {QmlAddressListModel::ColorRole, "dataColor"}, - {QmlAddressListModel::AddressTypeRole, "addressType"}}; + {QmlAddressListModel::TableDataRole, "tableData"}, + {QmlAddressListModel::HeadingRole, "heading"}, + {QmlAddressListModel::FirstColRole, "firstcol"}, + {QmlAddressListModel::ColorRole, "dataColor"}, + {QmlAddressListModel::AddressTypeRole, "addressType"}}; } QmlAddressListModel::QmlAddressListModel(const std::shared_ptr &logger, QObject *parent) - : QAbstractTableModel(parent), logger_(logger), header_({tr("Address"), tr("#Tx"), tr("Balance (BTC)"), tr("Comment")}) + : QAbstractTableModel(parent), logger_(logger), header_({tr("Address"), tr("#Tx"), tr("Balance (BTC)"), tr("Comment")}) { } @@ -45,13 +45,15 @@ QVariant QmlAddressListModel::data(const QModelIndex &index, int role) const switch (role) { case TableDataRole: - if (index.row() == 0) { + if (index.row() == 0) + { return header_.at(index.column()); } else { const int row = index.row() - 1; - switch (index.column()) { + switch (index.column()) + { case 0: return table_.at(row).at(0); case 1: return QString::number(pendingBalances_.at(addresses_.at(row).id()).nbTx); case 2: return QString::number(pendingBalances_.at(addresses_.at(row).id()).balance / BTCNumericTypes::BalanceDivider, 'f', 8); @@ -63,10 +65,12 @@ QVariant QmlAddressListModel::data(const QModelIndex &index, int role) const case HeadingRole: return (index.row() == 0); case FirstColRole: return (index.column() == 0); case ColorRole: - if (index.row() == 0) { + if (index.row() == 0) + { return ColorScheme::tableHeaderColor; } - else { + else + { return QColorConstants::White; } case AddressTypeRole: return table_.at(index.row() - 1).at(2); diff --git a/GUI/QtQuick/TransactionFilterModel.h b/GUI/QtQuick/TransactionFilterModel.h index f05e2f384..3c847fd42 100644 --- a/GUI/QtQuick/TransactionFilterModel.h +++ b/GUI/QtQuick/TransactionFilterModel.h @@ -15,28 +15,28 @@ class TransactionFilterModel : public QSortFilterProxyModel { - Q_OBJECT - Q_PROPERTY(QString walletName READ walletName WRITE setWalletName NOTIFY changed) - Q_PROPERTY(QString transactionType READ transactionType WRITE setTransactionType NOTIFY changed) + Q_OBJECT + Q_PROPERTY(QString walletName READ walletName WRITE setWalletName NOTIFY changed) + Q_PROPERTY(QString transactionType READ transactionType WRITE setTransactionType NOTIFY changed) public: - TransactionFilterModel(QObject *parent = nullptr); + TransactionFilterModel(QObject *parent = nullptr); - const QString &walletName() const; - void setWalletName(const QString &); - const QString &transactionType() const; - void setTransactionType(const QString &); + const QString &walletName() const; + void setWalletName(const QString &); + const QString &transactionType() const; + void setTransactionType(const QString &); signals: - void changed(); + void changed(); protected: - bool filterAcceptsRow(int source_row, - const QModelIndex &source_parent) const override; + bool filterAcceptsRow(int source_row, + const QModelIndex &source_parent) const override; private: - QString walletName_; - QString transactionType_; + QString walletName_; + QString transactionType_; }; #endif // TRANSACTION_FILTER_MODEL_H diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index fb9de21b7..a3bd4c734 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -747,7 +747,7 @@ QString QTxDetails::feePerByte() const qint32 QTxDetails::height() const { - return details_.tx.getTxHeight(); + return details_.tx.getTxHeight(); } TxInOutModel::TxInOutModel(const std::vector& data, QObject* parent) diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index 4206b1419..f3ed2e0ad 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -272,7 +272,7 @@ Item { columnWidths: [0.7, 0.2, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) - // TODO: change constant 261 with C++ defined enum + // TODO: change constant 257 with C++ defined enum onCellClicked: (row, column, data) => { var address = model.data(model.index(row, 0), 257) requestPageChange(address) From 957ef000095838ba5f9789b9434866e28335d5fa Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 10 Feb 2023 15:36:27 +0100 Subject: [PATCH 127/436] Empty string for comment when it's unable to get it --- GUI/QtQuick/QtQuickAdapter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 8bcf1215d..b578e5d8c 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1552,7 +1552,7 @@ void QtQuickAdapter::processWalletAddresses(const std::string& walletId const auto lastAddr = addresses.at(addresses.size() - 1); logger_->debug("[{}] {} last address: {}", __func__, hdWalletId, lastAddr.address.display()); addrModel_->addRow(hdWalletId, { QString::fromStdString(lastAddr.address.display()) - , QString::fromStdString(lastAddr.index) + , QString() , QString::fromStdString(lastAddr.index) }); generatedAddress_ = lastAddr.address; emit addressGenerated(); From 05a7923b481f5c8ca1cc9098db9a36f79803f4c2 Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 10 Feb 2023 16:46:42 +0100 Subject: [PATCH 128/436] Fixes formatting --- GUI/QtQuick/AddressListModel.cpp | 40 +++++++++---------- GUI/QtQuick/AddressListModel.h | 33 +++++++++------ GUI/QtQuick/TransactionFilterModel.cpp | 12 +++--- GUI/QtQuick/TransactionFilterModel.h | 14 +++---- .../TransactionForAddressFilterModel.cpp | 6 +-- .../TransactionForAddressFilterModel.h | 10 ++--- 6 files changed, 62 insertions(+), 53 deletions(-) diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index cb66dbc60..6d343b50d 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -16,29 +16,29 @@ namespace { static const QHash kRoles{ - {QmlAddressListModel::TableDataRole, "tableData"}, - {QmlAddressListModel::HeadingRole, "heading"}, - {QmlAddressListModel::FirstColRole, "firstcol"}, - {QmlAddressListModel::ColorRole, "dataColor"}, - {QmlAddressListModel::AddressTypeRole, "addressType"}}; + {QmlAddressListModel::TableDataRole, "tableData"}, + {QmlAddressListModel::HeadingRole, "heading"}, + {QmlAddressListModel::FirstColRole, "firstcol"}, + {QmlAddressListModel::ColorRole, "dataColor"}, + {QmlAddressListModel::AddressTypeRole, "addressType"} }; } -QmlAddressListModel::QmlAddressListModel(const std::shared_ptr &logger, QObject *parent) - : QAbstractTableModel(parent), logger_(logger), header_({tr("Address"), tr("#Tx"), tr("Balance (BTC)"), tr("Comment")}) +QmlAddressListModel::QmlAddressListModel(const std::shared_ptr& logger, QObject* parent) + : QAbstractTableModel(parent), logger_(logger), header_({ tr("Address"), tr("#Tx"), tr("Balance (BTC)"), tr("Comment") }) { } -int QmlAddressListModel::rowCount(const QModelIndex &) const +int QmlAddressListModel::rowCount(const QModelIndex&) const { return table_.size() + 1; } -int QmlAddressListModel::columnCount(const QModelIndex &) const +int QmlAddressListModel::columnCount(const QModelIndex&) const { return header_.size(); } -QVariant QmlAddressListModel::data(const QModelIndex &index, int role) const +QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const { try { @@ -77,7 +77,7 @@ QVariant QmlAddressListModel::data(const QModelIndex &index, int role) const default: break; } } - catch (const std::exception &) + catch (const std::exception&) { return QString{}; } @@ -89,7 +89,7 @@ QHash QmlAddressListModel::roleNames() const return kRoles; } -void QmlAddressListModel::addRow(const std::string &walletId, const QVector &row) +void QmlAddressListModel::addRow(const std::string& walletId, const QVector& row) { if (walletId != expectedWalletId_) { @@ -100,7 +100,7 @@ void QmlAddressListModel::addRow(const std::string &walletId, const QVector> &rows) +void QmlAddressListModel::addRows(const std::string& walletId, const QVector>& rows) { if (walletId != expectedWalletId_) { @@ -120,13 +120,13 @@ void QmlAddressListModel::addRows(const std::string &walletId, const QVectordebug("[QmlAddressListModel::updateRow] {} {} {}", addr.display(), bal, nbTx); if (addr.id() == addrPubKey) { @@ -151,7 +151,7 @@ void QmlAddressListModel::updateRow(const BinaryData &addrPubKey, uint64_t bal, } } -void QmlAddressListModel::reset(const std::string &expectedWalletId) +void QmlAddressListModel::reset(const std::string& expectedWalletId) { expectedWalletId_ = expectedWalletId; beginResetModel(); diff --git a/GUI/QtQuick/AddressListModel.h b/GUI/QtQuick/AddressListModel.h index 093dc305e..5b9c56918 100644 --- a/GUI/QtQuick/AddressListModel.h +++ b/GUI/QtQuick/AddressListModel.h @@ -18,15 +18,23 @@ #include "Address.h" #include "BinaryData.h" -namespace spdlog { +namespace spdlog +{ class logger; } -class QmlAddressListModel : public QAbstractTableModel +class QmlAddressListModel: public QAbstractTableModel { Q_OBJECT public: - enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, FirstColRole, ColorRole, AddressTypeRole }; + enum TableRoles + { + TableDataRole = Qt::UserRole + 1, + HeadingRole, + FirstColRole, + ColorRole, + AddressTypeRole + }; QmlAddressListModel(const std::shared_ptr&, QObject* parent = nullptr); int rowCount(const QModelIndex & = QModelIndex()) const override; @@ -40,17 +48,18 @@ class QmlAddressListModel : public QAbstractTableModel void reset(const std::string& expectedWalletId); private: - std::shared_ptr logger_; - const QStringList header_; - QVector> table_; - std::vector addresses_; - - struct PendingBalance { - uint64_t balance{ 0 }; - uint32_t nbTx{ 0 }; + std::shared_ptr logger_; + const QStringList header_; + QVector> table_; + std::vector addresses_; + + struct PendingBalance + { + uint64_t balance{ 0 }; + uint32_t nbTx{ 0 }; }; std::map pendingBalances_; std::string expectedWalletId_; }; -#endif // ADDRESS_LIST_MODEL_H +#endif // ADDRESS_LIST_MODEL_H diff --git a/GUI/QtQuick/TransactionFilterModel.cpp b/GUI/QtQuick/TransactionFilterModel.cpp index c39e23102..916e108db 100644 --- a/GUI/QtQuick/TransactionFilterModel.cpp +++ b/GUI/QtQuick/TransactionFilterModel.cpp @@ -12,14 +12,14 @@ #include "TxListModel.h" #include -TransactionFilterModel::TransactionFilterModel(QObject *parent) +TransactionFilterModel::TransactionFilterModel(QObject* parent) : QSortFilterProxyModel(parent) { connect(this, &TransactionFilterModel::changed, this, &TransactionFilterModel::invalidate); } bool TransactionFilterModel::filterAcceptsRow(int source_row, - const QModelIndex &source_parent) const + const QModelIndex& source_parent) const { if (source_row == 0) { @@ -48,23 +48,23 @@ bool TransactionFilterModel::filterAcceptsRow(int source_row, return true; } -const QString &TransactionFilterModel::walletName() const +const QString& TransactionFilterModel::walletName() const { return walletName_; } -void TransactionFilterModel::setWalletName(const QString &name) +void TransactionFilterModel::setWalletName(const QString& name) { walletName_ = name; emit changed(); } -const QString &TransactionFilterModel::transactionType() const +const QString& TransactionFilterModel::transactionType() const { return transactionType_; } -void TransactionFilterModel::setTransactionType(const QString &type) +void TransactionFilterModel::setTransactionType(const QString& type) { transactionType_ = type; emit changed(); diff --git a/GUI/QtQuick/TransactionFilterModel.h b/GUI/QtQuick/TransactionFilterModel.h index 3c847fd42..b6484d2e7 100644 --- a/GUI/QtQuick/TransactionFilterModel.h +++ b/GUI/QtQuick/TransactionFilterModel.h @@ -13,26 +13,26 @@ #include -class TransactionFilterModel : public QSortFilterProxyModel +class TransactionFilterModel: public QSortFilterProxyModel { Q_OBJECT Q_PROPERTY(QString walletName READ walletName WRITE setWalletName NOTIFY changed) Q_PROPERTY(QString transactionType READ transactionType WRITE setTransactionType NOTIFY changed) public: - TransactionFilterModel(QObject *parent = nullptr); + TransactionFilterModel(QObject* parent = nullptr); - const QString &walletName() const; - void setWalletName(const QString &); - const QString &transactionType() const; - void setTransactionType(const QString &); + const QString& walletName() const; + void setWalletName(const QString&); + const QString& transactionType() const; + void setTransactionType(const QString&); signals: void changed(); protected: bool filterAcceptsRow(int source_row, - const QModelIndex &source_parent) const override; + const QModelIndex& source_parent) const override; private: QString walletName_; diff --git a/GUI/QtQuick/TransactionForAddressFilterModel.cpp b/GUI/QtQuick/TransactionForAddressFilterModel.cpp index 5146a5fdf..bf5fff53c 100644 --- a/GUI/QtQuick/TransactionForAddressFilterModel.cpp +++ b/GUI/QtQuick/TransactionForAddressFilterModel.cpp @@ -12,13 +12,13 @@ #include "TxListModel.h" #include -TransactionForAddressFilterModel::TransactionForAddressFilterModel(QObject *parent) +TransactionForAddressFilterModel::TransactionForAddressFilterModel(QObject* parent) : QSortFilterProxyModel(parent) { connect(this, &TransactionForAddressFilterModel::changed, this, &TransactionForAddressFilterModel::invalidate); } -bool TransactionForAddressFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const +bool TransactionForAddressFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { if (source_row == 0) { return true; @@ -33,7 +33,7 @@ bool TransactionForAddressFilterModel::filterAcceptsRow(int source_row, const QM return true; } -bool TransactionForAddressFilterModel::filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const +bool TransactionForAddressFilterModel::filterAcceptsColumn(int source_column, const QModelIndex& source_parent) const { if (source_column == 0 || source_column == 1 || source_column == 2 || source_column == 5) { return true; diff --git a/GUI/QtQuick/TransactionForAddressFilterModel.h b/GUI/QtQuick/TransactionForAddressFilterModel.h index 74e239a44..169593233 100644 --- a/GUI/QtQuick/TransactionForAddressFilterModel.h +++ b/GUI/QtQuick/TransactionForAddressFilterModel.h @@ -13,13 +13,13 @@ #include -class TransactionForAddressFilterModel : public QSortFilterProxyModel +class TransactionForAddressFilterModel: public QSortFilterProxyModel { Q_OBJECT Q_PROPERTY(bool positive READ positive WRITE set_positive NOTIFY changed) public: - TransactionForAddressFilterModel(QObject *parent = nullptr); + TransactionForAddressFilterModel(QObject* parent = nullptr); bool positive() const; void set_positive(bool value); @@ -29,12 +29,12 @@ class TransactionForAddressFilterModel : public QSortFilterProxyModel protected: bool filterAcceptsRow(int source_row, - const QModelIndex &source_parent) const override; + const QModelIndex& source_parent) const override; bool filterAcceptsColumn(int source_column, - const QModelIndex &source_parent) const override; + const QModelIndex& source_parent) const override; private: - bool positive_{false}; + bool positive_{ false }; }; #endif // TRANSACTION_FOR_ADDRESS_FILTER_MODEL_H From cb56e6e094920061bf83f48808c6b70fd932a303 Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 10 Feb 2023 17:30:30 +0100 Subject: [PATCH 129/436] Spaces again --- GUI/QtQuick/AddressListModel.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index 6d343b50d..07e55776c 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -16,11 +16,11 @@ namespace { static const QHash kRoles{ - {QmlAddressListModel::TableDataRole, "tableData"}, - {QmlAddressListModel::HeadingRole, "heading"}, - {QmlAddressListModel::FirstColRole, "firstcol"}, - {QmlAddressListModel::ColorRole, "dataColor"}, - {QmlAddressListModel::AddressTypeRole, "addressType"} }; + {QmlAddressListModel::TableDataRole, "tableData"}, + {QmlAddressListModel::HeadingRole, "heading"}, + {QmlAddressListModel::FirstColRole, "firstcol"}, + {QmlAddressListModel::ColorRole, "dataColor"}, + {QmlAddressListModel::AddressTypeRole, "addressType"} }; } QmlAddressListModel::QmlAddressListModel(const std::shared_ptr& logger, QObject* parent) From 4260e5999fd2e2dbd68e1ab72e5bf2c8da78eef8 Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 10 Feb 2023 17:35:09 +0100 Subject: [PATCH 130/436] qint32 -> quint32 --- GUI/QtQuick/TxListModel.cpp | 2 +- GUI/QtQuick/TxListModel.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index a3bd4c734..7358070a9 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -745,7 +745,7 @@ QString QTxDetails::feePerByte() const } -qint32 QTxDetails::height() const +quint32 QTxDetails::height() const { return details_.tx.getTxHeight(); } diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index ae08e5da2..a4bd43cc2 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -176,8 +176,8 @@ class QTxDetails : public QObject QString fee() const; Q_PROPERTY(QString feePerByte READ feePerByte NOTIFY updated) QString feePerByte() const; - Q_PROPERTY(qint32 height READ height NOTIFY updated) - qint32 height() const; + Q_PROPERTY(quint32 height READ height NOTIFY updated) + quint32 height() const; Q_PROPERTY(TxInOutModel* inputs READ inputs NOTIFY updated) TxInOutModel* inputs() const { return inputsModel_; } From 5c11b29eef48dee03ac03d848afb48910344717e Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 10 Feb 2023 21:57:43 +0300 Subject: [PATCH 131/436] additional libs for Linux --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a2d3acf07..545863f56 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ For access to trade our FX and XBT products please upgrade your account to Tradi Execute the following commands: sudo apt install python-pip cmake libmysqlclient-dev autoconf libtool yasm nasm libgmp3-dev libdouble-conversion-dev - sudo apt install qttools5-dev-tools libfreetype-dev libfontconfig-dev libcups2-dev xcb + sudo apt install qttools5-dev-tools libfreetype-dev libfontconfig-dev libcups2-dev xcb libudev-dev libxi-dev libsm-dev libxrender-dev libdbus-1-dev sudo apt install libx11-xcb-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-sync-dev libxcb-render-util0-dev libxcb-xfixes0-dev libxcb-xinerama0-dev libxcb-randr0-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-icccm4-dev libxcb-glx0-dev libxkbcommon-x11-dev ### MacOS From 40de8753a35dbaec0e9bd703319c19d9fff4bf7a Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Sat, 11 Feb 2023 16:35:50 +0300 Subject: [PATCH 132/436] update common --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index e685d2f81..b8404d3fb 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit e685d2f81ad288408490fe9c4e6fcc77c724a6f6 +Subproject commit b8404d3fb2652b49283854046e403a5f9651c247 From 2ced4d279ab7c57c499bcb33a3e785e7bf1dd7e6 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sun, 12 Feb 2023 11:57:51 +0200 Subject: [PATCH 133/436] qml: advanced send: add outputs table --- GUI/QtQuick/images/delete.png | Bin 0 -> 299 bytes GUI/QtQuick/images/delete.svg | 20 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 232 +++++++----------- GUI/QtQuick/qml/Send/AmountInput.qml | 6 +- GUI/QtQuick/qml/Send/RecvAddrTextInput.qml | 3 +- GUI/QtQuick/qml/Send/SimpleDetails.qml | 10 +- GUI/QtQuick/qml/Send/WalletsComboBox.qml | 2 +- .../qml/StyledControls/CopyIconButton.qml | 1 - .../qml/StyledControls/CustomTableView.qml | 26 +- .../qml/StyledControls/DeleteIconButton.qml | 26 ++ GUI/QtQuick/qtquick.qrc | 4 +- 11 files changed, 153 insertions(+), 177 deletions(-) create mode 100644 GUI/QtQuick/images/delete.png create mode 100644 GUI/QtQuick/qml/StyledControls/DeleteIconButton.qml diff --git a/GUI/QtQuick/images/delete.png b/GUI/QtQuick/images/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed324a4f7a046c5821f9ed7f19dd00069495dac GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#1D-C9Ar*{or<~I`ZLEN%+Q8yHOcScK|*ofc;C|J2)<6n(xhg;|jQ33tTW@4*e`XI|{z z!6TenWv3PM)3zev*_sr&XWgBZd;GtKskSVh!CIF%^Zky#_k5u$^PU9!UV>3hN8Ak+43dvDeYANV|9gXPj(G1ta#tZ$aoZOXp@o - - + + - - - - + + + + - - - + + + - + diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 7f6f83b6b..84038b359 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -1,12 +1,13 @@ import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 +import QtQuick.Controls 1.4 import QtQuick.Layouts 1.15 import "../BsStyles" import "../StyledControls" -//import wallet.balance 1.0 +import wallet.balance 1.0 ColumnLayout { @@ -19,6 +20,8 @@ ColumnLayout { width: 1132 spacing: 0 + property var tempRequest: null + RowLayout { Layout.fillWidth: true @@ -125,7 +128,7 @@ ColumnLayout { font.weight: Font.Medium } - CustomComboBox { + WalletsComboBox { id: from_wallet_combo @@ -136,38 +139,26 @@ ColumnLayout { width: 504 height: 70 - model: walletBalances - - //aliases - title_text: qsTr("From Wallet") - details_text: getWalletData(currentIndex, WalletBalance.TotalRole) - - textRole: "name" - valueRole: "name" - - Connections - { - target:walletBalances - function onRowCountChanged () - { - from_wallet_combo.currentIndex = overviewWalletIndex - } - } - onActivated: { //I dont understand why but acceptableInput dont work... var amount_max = getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole) var cur_value = parseFloat(amount_input.input_text) - var bottom = amount_input.input_validator.bottom - var top = amount_input.input_validator.top + var bottom = 0 + var top = tempRequest.maxAmount if(cur_value < bottom || cur_value > top) { amount_input.input_text = amount_max } + + if (rec_addr_input.isValid) { + var fpb = parseFloat(fee_suggest_combo.currentValue) + tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) + } } } - CustomComboBox { + FeeSuggestComboBox { id: fee_suggest_combo @@ -178,24 +169,13 @@ ColumnLayout { width: 504 height: 70 - model: feeSuggestions - - //aliases - title_text: qsTr("Fee Suggestions") - - textRole: "text" - valueRole: "value" - - Connections - { - target:feeSuggestions - function onRowCountChanged () - { - fee_suggest_combo.currentIndex = 0 - } + onCurrentIndexChanged: { + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) + txOutputsModel.clearOutputs() } } + Rectangle { height: 1 @@ -252,7 +232,7 @@ ColumnLayout { font.weight: Font.Medium } - CustomTextInput { + RecvAddrTextInput { id: rec_addr_input @@ -263,41 +243,21 @@ ColumnLayout { width: 504 height: 70 - //aliases - title_text: qsTr("Receiver address") - - Image { - id: paste_but - - z: 1 - - anchors.top: rec_addr_input.top - anchors.topMargin: 23 - anchors.right: rec_addr_input.right - anchors.rightMargin: 23 - - source: "qrc:/images/paste_icon.png" - width: 24 - height: 24 + wallets_current_index: from_wallet_combo.currentIndex - MouseArea { - anchors.fill: parent - onClicked: { - rec_addr_input.input_text = bsApp.pasteTextFromClipboard() - amount_input.setActiveFocus() - } - } + onFocus_next: { + amount_input.setActiveFocus() } - onTextChanged : { - if (rec_addr_input.input_text.length) - { - rec_addr_input.isValid = bsApp.validateAddress(rec_addr_input.input_text) - } + + function createTempRequest() { + var fpb = parseFloat(fee_suggest_combo.currentValue) + tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) } } - CustomTextInput { + AmountInput { id: amount_input @@ -307,83 +267,6 @@ ColumnLayout { width: 504 height: 70 - - //aliases - title_text: qsTr("Amount") - - //app (if was launched from visual studio) crashes when there is input_validator - //and we change text inside of onTextEdited - //it is why I have realized my validator inside of onTextEdited - property string prev_text : "" - onTextEdited : { - - amount_input.input_text = amount_input.input_text.replace(",", ".") - - if (amount_input.input_text.startsWith("0") - && !amount_input.input_text.startsWith("0.") - && amount_input.input_text.length > 1) - { - amount_input.input_text = "0." - + amount_input.input_text.substring(1, amount_input.input_text.length) - } - try { - var input_number = Number.fromLocaleString(Qt.locale("en_US"), amount_input.input_text) - } - catch (error) - { - amount_input.input_text = prev_text - return - } - - var max_value = (from_wallet_combo.currentIndex >= 0) ? - parseFloat(getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole)) : 0 - - if (input_number < 0 || input_number>max_value) - { - amount_input.input_text = prev_text - return - } - - prev_text = amount_input.input_text - } - - CustomButton { - - id: max_but - - z: 1 - - width: 55 - height: 28 - back_radius: 37 - - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: 23 - - text: qsTr("MAX") - font.pixelSize: 12 - - function click_enter() { - amount_input.input_text = getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole) - } - } - - Label { - - id: currency - - anchors.verticalCenter: parent.verticalCenter - anchors.right: max_but.left - anchors.rightMargin: 16 - - text: "BTC" - font.pixelSize: 14 - font.family: "Roboto" - font.weight: Font.Normal - color: "#7A88B0" - } - } CustomTextEdit { @@ -412,18 +295,22 @@ ColumnLayout { Layout.topMargin: 16 Layout.alignment: Qt.AlignLeft | Qt.AlingTop + enabled: rec_addr_input.isValid && rec_addr_input.input_text.length + && parseFloat(amount_input.input_text) !== 0 && amount_input.input_text.length + icon.source: "qrc:/images/plus.svg" - icon.color: include_output_but.enabled ? "#45A6FF" : "#020817" + icon.color: include_output_but.enabled ? "#45A6FF" : BSStyle.buttonsDisabledTextColor width: 504 Component.onCompleted: { - confirm_but.preferred = false + include_output_but.preferred = false } function click_enter() { - if (!confirm_but.enabled) return + if (!include_output_but.enabled) return + txOutputsModel.addOutput(rec_addr_input.input_text, amount_input.input_text) } } @@ -438,10 +325,42 @@ ColumnLayout { color: "#3C435A" } - Label { + CustomTableView { + Layout.fillWidth: true Layout.fillHeight : true + Layout.leftMargin: 16 + Layout.rightMargin: 16 + + model: txOutputsModel + columnWidths: [0.744, 0.20, 0.056] + + text_header_size: 12 + cell_text_size: 13 + copy_button_column_index: -1 + delete_button_column_index: 2 + left_first_header_padding: 0 + + onDeleteRequested: (row) => + { + txOutputsModel.delOutput(row) + } + } + + TreeView { + TableViewColumn { + title: "Name" + role: "fileName" + width: 300 + } + TableViewColumn { + title: "Permissions" + role: "filePermissions" + width: 100 + } + model: fileSystemModel } + } } } @@ -478,5 +397,20 @@ ColumnLayout { function init() { + rec_addr_input.setActiveFocus() + + //we need set first time currentIndex to 0 + //only after we will have signal rowchanged + if (fee_suggest_combo.currentIndex >= 0) + fee_suggest_combo.currentIndex = 0 + if (from_wallet_combo.currentIndex >= 0) + from_wallet_combo.currentIndex = overviewWalletIndex + + amount_input.input_text = "" + comment_input.input_text = "" + rec_addr_input.input_text = "" + + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) + txOutputsModel.clearOutputs() } } diff --git a/GUI/QtQuick/qml/Send/AmountInput.qml b/GUI/QtQuick/qml/Send/AmountInput.qml index 9e4743a2d..336697fd7 100644 --- a/GUI/QtQuick/qml/Send/AmountInput.qml +++ b/GUI/QtQuick/qml/Send/AmountInput.qml @@ -18,8 +18,6 @@ CustomTextInput { id: amount_input - property var _tempRequest: null - //aliases title_text: qsTr("Amount") @@ -29,6 +27,10 @@ CustomTextInput { property string prev_text : "" onTextEdited : { + if (tempRequest == null) { + amount_input.input_text = "0" + } + amount_input.input_text = amount_input.input_text.replace(",", ".") if (amount_input.input_text.startsWith("0") diff --git a/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml b/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml index 48fbbd0f9..6d1ea166f 100644 --- a/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml +++ b/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml @@ -18,7 +18,6 @@ CustomTextInput { id: rec_addr_input - property var _tempRequest: null property string fee_current_value property int wallets_current_index @@ -61,7 +60,7 @@ CustomTextInput { rec_addr_input.isValid = bsApp.validateAddress(rec_addr_input.input_text) if (rec_addr_input.isValid) { - _tempRequest = createTempRequest() + createTempRequest() focus_next() } } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index cdbcdbeaa..a7565cc8f 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -6,7 +6,7 @@ import QtQuick.Layouts 1.15 import "../BsStyles" import "../StyledControls" -//import wallet.balance 1.0 +import wallet.balance 1.0 ColumnLayout { @@ -19,7 +19,7 @@ ColumnLayout { width: 600 spacing: 0 - property var tempRequest: rec_addr_input._tempRequest + property var tempRequest: null RowLayout { @@ -98,8 +98,8 @@ ColumnLayout { function createTempRequest() { var fpb = parseFloat(fee_suggest_combo.currentValue) - return bsApp.createTXSignRequest(wallets_current_index - , rec_addr_input.input_text, 0, (fpb > 0) ? fpb : 1.0) + tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) } } @@ -107,8 +107,6 @@ ColumnLayout { id: amount_input - _tempRequest: tempRequest - Layout.alignment: Qt.AlignCenter Layout.preferredHeight : 70 Layout.preferredWidth: 552 diff --git a/GUI/QtQuick/qml/Send/WalletsComboBox.qml b/GUI/QtQuick/qml/Send/WalletsComboBox.qml index 7ae6ef13e..61f442d68 100644 --- a/GUI/QtQuick/qml/Send/WalletsComboBox.qml +++ b/GUI/QtQuick/qml/Send/WalletsComboBox.qml @@ -14,7 +14,7 @@ import QtQuick.Controls 2.3 import "../BsStyles" import "../StyledControls" -//import wallet.balance 1.0 +import wallet.balance 1.0 CustomComboBox { diff --git a/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml b/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml index 5efaf27c7..0c098a66a 100644 --- a/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml @@ -9,7 +9,6 @@ Image { signal copy(); - x: internal_text.contentWidth + copy_icon.width / 2 width: 24 height: 24 anchors.verticalCenter: parent.verticalCenter diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index 869d0baef..2b8fc036c 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -27,14 +27,19 @@ TableView { ScrollBar.vertical: ScrollBar { } signal copyRequested(var id) - signal cellClicked(var row, var column, var data) - signal cellDoubleClicked(var row, var column, var data) + signal deleteRequested(int id) + signal cellClicked(int row, int column, var data) + signal cellDoubleClicked(int row, int column, var data) - property int text_header_size: 11 + property int text_header_size: 11 property int cell_text_size: 12 property int copy_button_column_index: 0 + property int delete_button_column_index: -1 - property var columnWidths + property int left_first_header_padding: 10 + property int left_text_padding: 10 + + property var columnWidths: ({}) columnWidthProvider: function (column) { return columnWidths[column] * component.width } @@ -75,6 +80,9 @@ TableView { Text { id: internal_text + + visible: column !== component.delete_button_column_index + text: tableData height: parent.height verticalAlignment: Text.AlignVCenter @@ -85,7 +93,15 @@ TableView { font.weight: Font.Normal font.pixelSize: row === 0 ? component.text_header_size : component.cell_text_size - leftPadding: 10 + leftPadding: (row === 0 && column === 0) + ? left_first_header_padding : left_text_padding + } + + DeleteIconButton { + id: delete_icon + x: 0 + visible: column === component.delete_button_column_index && row > 0 + onDeleteRequested: component.deleteRequested(row) } CopyIconButton { diff --git a/GUI/QtQuick/qml/StyledControls/DeleteIconButton.qml b/GUI/QtQuick/qml/StyledControls/DeleteIconButton.qml new file mode 100644 index 000000000..990b4d701 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/DeleteIconButton.qml @@ -0,0 +1,26 @@ + +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import "../BsStyles" + +Image { + id: control + + signal deleteRequested() + + width: 24 + height: 24 + sourceSize.width: 24 + sourceSize.height: 24 + + anchors.verticalCenter: parent.verticalCenter + source: "qrc:/images/delete.png" + MouseArea { + anchors.fill: parent + + onClicked: { + control.deleteRequested() + } + } +} diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index bd2b12032..d16fa56bb 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -130,7 +130,6 @@ images/notification_question.png images/notification_success.png images/notification_warning.png - images/delete.svg images/plus.svg qml/Settings/qmldir qml/Settings/SettingsMenu.qml @@ -156,5 +155,8 @@ qml/Send/AmountInput.qml qml/Send/FeeSuggestComboBox.qml qml/Send/RecvAddrTextInput.qml + qml/StyledControls/DeleteIconButton.qml + images/delete.png + images/delete.svg From 57b8d90c5629b40080b77c0f33b91337c9e93f07 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 13 Feb 2023 20:07:54 +0200 Subject: [PATCH 134/436] qml: add Loader to CustomTableView --- GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml | 2 +- GUI/QtQuick/qml/Pin/PinEntriesPopup.qml | 2 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 33 ++----- GUI/QtQuick/qml/Send/SelectInputs.qml | 72 ++++++++++++++++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 17 ++-- .../StyledControls/CustomTableDelegateRow.qml | 55 ++++++++++++ .../qml/StyledControls/CustomTableView.qml | 85 ++++++++++++------- GUI/QtQuick/qtquick.qrc | 2 + 8 files changed, 201 insertions(+), 67 deletions(-) create mode 100644 GUI/QtQuick/qml/Send/SelectInputs.qml create mode 100644 GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml diff --git a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml index 764685e73..12439d745 100644 --- a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml +++ b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml @@ -147,7 +147,7 @@ Window { width: 190 Component.onCompleted: { - copy_seed_but.preferred = false + cancel_but.preferred = false } function click_enter() { root.clean() diff --git a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml index 50b88b6d8..cb382eb68 100644 --- a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml +++ b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml @@ -51,7 +51,7 @@ Window { anchors.right: parent.right anchors.rightMargin: 24 - source: "qrc:/images/close_button.png" + source: "qrc:/images/close_button.svg" width: 16 height: 16 MouseArea { diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 84038b359..0652d138a 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -1,7 +1,6 @@ import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 -import QtQuick.Controls 1.4 import QtQuick.Layouts 1.15 import "../BsStyles" @@ -139,21 +138,20 @@ ColumnLayout { width: 504 height: 70 - onActivated: { + onActivated: (index_act) => { + if (rec_addr_input.isValid) { + var fpb = parseFloat(fee_suggest_combo.currentValue) + tempRequest = bsApp.createTXSignRequest(index_act + , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) + } + //I dont understand why but acceptableInput dont work... - var amount_max = getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole) var cur_value = parseFloat(amount_input.input_text) var bottom = 0 var top = tempRequest.maxAmount if(cur_value < bottom || cur_value > top) { - amount_input.input_text = amount_max - } - - if (rec_addr_input.isValid) { - var fpb = parseFloat(fee_suggest_combo.currentValue) - tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) + amount_input.input_text = tempRequest.maxAmount } } } @@ -346,21 +344,6 @@ ColumnLayout { txOutputsModel.delOutput(row) } } - - TreeView { - TableViewColumn { - title: "Name" - role: "fileName" - width: 300 - } - TableViewColumn { - title: "Permissions" - role: "filePermissions" - width: 100 - } - model: fileSystemModel - } - } } } diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml new file mode 100644 index 000000000..007573901 --- /dev/null +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -0,0 +1,72 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + + +ColumnLayout { + + id: layout + + height: 662 + width: 1132 + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: "Select inputs" + } + + Rectangle { + id: addresses_rect + + Layout.topMargin: 24 + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + + width: 1084 + height: 434 + color: "transparent" + + radius: 16 + + border.color: "#3C435A" + border.width: 1 + + CustomTableView { + + anchors.fill: parent + anchors.leftMargin: 16 + anchors.left : parent.left + anchors.rightMargin: 16 + anchors.right: parent.right + + model: txInputsModel + columnWidths: [0.2, 0.2, 0.2, 0.2, 0.2] + + text_header_size: 12 + cell_text_size: 13 + copy_button_column_index: -1 + left_text_padding: 9 + } + } + + Label { + Layout.fillWidth: true + Layout.fillHeight: true + } +} diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index a7565cc8f..bc25b32cb 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -128,21 +128,20 @@ ColumnLayout { width: 271 - onActivated: { + onActivated: (index_act) => { + if (rec_addr_input.isValid) { + var fpb = parseFloat(fee_suggest_combo.currentValue) + tempRequest = bsApp.createTXSignRequest(index_act + , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) + } + //I dont understand why but acceptableInput dont work... - var amount_max = getWalletData(from_wallet_combo.currentIndex, WalletBalance.TotalRole) var cur_value = parseFloat(amount_input.input_text) var bottom = 0 var top = tempRequest.maxAmount if(cur_value < bottom || cur_value > top) { - amount_input.input_text = amount_max - } - - if (rec_addr_input.isValid) { - var fpb = parseFloat(fee_suggest_combo.currentValue) - tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) + amount_input.input_text = tempRequest.maxAmount } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml b/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml new file mode 100644 index 000000000..f6a7bc479 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml @@ -0,0 +1,55 @@ + +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import "../BsStyles" + +Row { + id: root + + signal deleteRequested (int row) + signal copyRequested (string tableData) + + Text { + id: internal_text + + visible: model_column !== delete_button_column_index + + text: model_tableData + height: parent.height + verticalAlignment: Text.AlignVCenter + clip: true + + color: model_dataColor + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: model_row === 0 ? text_header_size : cell_text_size + + leftPadding: (model_row === 0 && model_column === 0 && left_first_header_padding >= 0) + ? left_first_header_padding : left_text_padding + } + + DeleteIconButton { + id: delete_icon + x: 0 + visible: model_column === delete_button_column_index && model_row > 0 + onDeleteRequested: root.deleteRequested(model_row) + } + + CopyIconButton { + id: copy_icon + x: internal_text.contentWidth + copy_icon.width / 2 + visible: model_column === copy_button_column_index && model_row === selected_row_index + onCopy: root.copyRequested(model_tableData) + } +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index 6d76557c0..f0f569acf 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -36,7 +36,7 @@ TableView { property int copy_button_column_index: 0 property int delete_button_column_index: -1 - property int left_first_header_padding: 10 + property int left_first_header_padding: -1 property int left_text_padding: 10 property var columnWidths: ({}) @@ -49,6 +49,8 @@ TableView { onWidthChanged: component.forceLayout() delegate: Rectangle { + id: delega + implicitHeight: 34 color: row === 0 ? BSStyle.tableCellBackgroundColor : (row === selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor) @@ -82,41 +84,57 @@ TableView { } } - Row { - width: parent.width - height: parent.height - - Text { - id: internal_text - - visible: column !== component.delete_button_column_index + Loader { + id: row_loader - text: tableData - height: parent.height - verticalAlignment: Text.AlignVCenter - clip: true - - color: dataColor - font.family: "Roboto" - font.weight: Font.Normal - font.pixelSize: row === 0 ? component.text_header_size : component.cell_text_size - - leftPadding: (row === 0 && column === 0) - ? left_first_header_padding : left_text_padding + width: parent.width + height: childrenRect.height + + property int delete_button_column_index: component.delete_button_column_index + property int text_header_size: component.text_header_size + property int cell_text_size: component.cell_text_size + property int copy_button_column_index: component.copy_button_column_index + property int selected_row_index: component.selected_row_index + property int left_first_header_padding: component.left_first_header_padding + property int left_text_padding: component.left_text_padding + property int model_row: row + property int model_column: column + + property string model_tableData: tableData + property var model_dataColor: dataColor + + Component.onCompleted: { + delega.update_row_loader_size() } + } - DeleteIconButton { - id: delete_icon - x: 0 - visible: column === component.delete_button_column_index && row > 0 - onDeleteRequested: component.deleteRequested(row) + Connections { + target: row_loader.item + function onDeleteRequested (row) + { + component.deleteRequested(row) } + function onCopyRequested (tableData) + { + component.copyRequested(tableData) + } + } + + onWidthChanged: { + delega.update_row_loader_size() + } - CopyIconButton { - id: copy_icon - x: internal_text.contentWidth + copy_icon.width / 2 - visible: column === component.copy_button_column_index && row == selected_row_index - onCopy: component.copyRequested(tableData) + onHeightChanged: { + delega.update_row_loader_size() + } + + function update_row_loader_size() + { + row_loader.width = delega.width + row_loader.height = childrenRect.height + if (row_loader.width && row_loader.height && (row_loader.source !== "")) + { + row_loader.setSource(choose_row_source(row, column)) } } @@ -128,4 +146,9 @@ TableView { anchors.bottom: parent.bottom } } + + function choose_row_source(row, column) + { + return "CustomTableDelegateRow.qml" + } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 3146d1eec..d9575b535 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -160,5 +160,7 @@ images/delete.svg qml/TransactionDetails.qml qml/StyledControls/CloseIconButton.qml + qml/StyledControls/CustomTableDelegateRow.qml + qml/Send/SelectInputs.qml From 3e95554876421f56a636c6ae53c3a00981cd6b85 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 15 Feb 2023 00:32:54 +0300 Subject: [PATCH 135/436] sync asset type --- BlockSettleHW/hwdevicemanager.cpp | 24 +- BlockSettleHW/ledger/ledgerClient.cpp | 4 +- BlockSettleHW/ledger/ledgerDevice.cpp | 356 ++++++++++++--------- BlockSettleHW/ledger/ledgerDevice.h | 8 +- BlockSettleHW/ledger/ledgerStructure.h | 8 +- Core/SignerAdapter.cpp | 2 + GUI/QtQuick/AddressListModel.cpp | 26 +- GUI/QtQuick/AddressListModel.h | 3 +- GUI/QtQuick/QtQuickAdapter.cpp | 38 ++- GUI/QtQuick/qml/AddressDetails.qml | 20 +- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 5 +- GUI/QtQuick/qml/OverviewPage.qml | 3 +- common | 2 +- 13 files changed, 298 insertions(+), 201 deletions(-) diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index a7e766c30..4ba108646 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -432,16 +432,9 @@ bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::S bs::wallet::HardwareEncKey hwEncType(BinaryData::fromString(hdWallet.encryption_keys(0))); logger_->debug("[{}] [re]scanning devices of type {}", __func__, (int)hwEncType.deviceType()); if (bs::wallet::HardwareEncKey::WalletType::Ledger == hwEncType.deviceType()) { - ledgerClient_->scanDevices(); - const auto& devices = ledgerClient_->deviceKeys(); - if (devices.empty()) { - lastOperationError_ = ledgerClient_->lastScanError(); - deviceNotFound(kDeviceLedgerId); - return bs::message::ProcessingResult::Error; - } - bool found = false; - for (const auto& key : devices) { + for (const auto& key : ledgerClient_->deviceKeys()) { + logger_->debug("[{}] ledger device {} for wallet {}", __func__, key.id, key.walletId); if (key.walletId == hdWallet.wallet_id()) { deviceKey = key; found = true; @@ -449,13 +442,14 @@ bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::S } } if (!found) { - if (!devices.empty()) { - lastOperationError_ = getDevice(devices.front())->lastError(); - } - deviceNotFound(kDeviceLedgerId); - } + logger_->debug("[{}] ledger device for wallet {} not found", __func__, hdWallet.wallet_id()); + nbScanning_ = 1; + ledgerClient_->scanDevices(); + } else { - deviceReady(kDeviceLedgerId); + logger_->debug("[{}] found ledger device {} for wallet {}", __func__ + , deviceKey.id, deviceKey.walletId); + deviceReady(deviceKey.id); walletReady(deviceKey.walletId); } } diff --git a/BlockSettleHW/ledger/ledgerClient.cpp b/BlockSettleHW/ledger/ledgerClient.cpp index 4d9aa3850..499b4c3f4 100644 --- a/BlockSettleHW/ledger/ledgerClient.cpp +++ b/BlockSettleHW/ledger/ledgerClient.cpp @@ -80,11 +80,11 @@ void LedgerClient::scanDevices() hid_device_info* info = hid_enumerate(0, 0); for (; info; info = info->next) { - logger_->debug("[{}] found: vendor {}, product {} ({}), serial {}, iface {}" + /*logger_->debug("[{}] found: vendor {}, product {} ({}), serial {}, iface {}" , __func__, info->vendor_id, info->product_id , QString::fromWCharArray(info->product_string).toStdString() , QString::fromWCharArray(info->serial_number).toStdString() - , info->interface_number); + , info->interface_number);*/ if (checkLedgerDevice(info)) { const auto& device = std::make_shared(fromHidOriginal(info) , testNet_, logger_, cb_, hidLock_); diff --git a/BlockSettleHW/ledger/ledgerDevice.cpp b/BlockSettleHW/ledger/ledgerDevice.cpp index f204edc8e..ea40373f1 100644 --- a/BlockSettleHW/ledger/ledgerDevice.cpp +++ b/BlockSettleHW/ledger/ledgerDevice.cpp @@ -22,8 +22,27 @@ #include "QByteArray" namespace { + class LedgerException : public std::runtime_error + { + public: + LedgerException(const std::string& desc) : std::runtime_error(desc) {} + }; + + class LedgerBrokenSequence : public LedgerException + { + public: + LedgerBrokenSequence() : LedgerException("Unexpected sequence number 191") + {} + }; + + class LedgerReconnectDevice : public LedgerException + { + public: + LedgerReconnectDevice() : LedgerException("Device needs to be reconnected") + {} + }; + const uint16_t kHidapiBrokenSequence = 191; - const std::string kHidapiSequence191 = "Unexpected sequence number 191"; int sendApdu(hid_device* dongle, const QByteArray& command) { int result = 0; QVector chunks; @@ -64,7 +83,6 @@ namespace { break; } } - return result; } @@ -83,10 +101,10 @@ namespace { auto chunkIndex = static_cast(((uint8_t)chunk[3] << 8) | (uint8_t)chunk[4]); if (chunkIndex != expectedChunkIndex++) { if (chunkIndex == static_cast(kHidapiBrokenSequence)) { - throw std::logic_error(kHidapiSequence191); + throw LedgerBrokenSequence(); } else { - throw std::logic_error("Unexpected sequence number"); + throw LedgerException("Unexpected sequence number"); } } }; @@ -164,29 +182,32 @@ void LedgerDevice::init() } -bool DeviceIOHandler::writeData(const QByteArray& input, const std::string& logHeader) +bool DeviceIOHandler::writeData(const QByteArray& input, const std::string& logHeader) noexcept { - logger_->debug("{} - >>> {}", logHeader, input.toHex().toStdString()); + logger_->debug("{} >>> {}", logHeader, input.toHex().toStdString()); if (sendApdu(dongle_, input) < 0) { - logger_->error("{} - Cannot write to device.", logHeader); - throw std::runtime_error("Cannot write to device"); + logger_->error("{} Cannot write to device", logHeader); + return false; } return true; } -bool DeviceIOHandler::readData(QByteArray& output, const std::string& logHeader) +void DeviceIOHandler::readData(QByteArray& output, const std::string& logHeader) { const auto res = receiveApduResult(dongle_, output); if (res != Ledger::SW_OK) { - logger_->error("{} - Cannot read from device. APDU error code : {}", + if (res == Ledger::SW_RECONNECT_DEVICE) { + logger_->debug("[{}] {} bytes read before reconnect", __func__, output.size()); + throw LedgerReconnectDevice(); + } + logger_->error("{} Cannot read from device. APDU error code : {}", logHeader, QByteArray::number(res, 16).toStdString()); - throw std::runtime_error("Can't read from device: " + std::to_string(res)); + throw LedgerException("Can't read from device: " + std::to_string(res)); } - logger_->debug("{} - <<< {}", logHeader, BinaryData::fromString(output.toStdString()).toHexStr() + "9000"); - return true; + logger_->debug("{} <<< {}", logHeader, BinaryData::fromString(output.toStdString()).toHexStr() + "9000"); } -bool DeviceIOHandler::initDevice() +bool DeviceIOHandler::initDevice() noexcept { if (hid_init() < 0 || hidDeviceInfo_.serialNumber.empty()) { logger_->info("[DeviceIOHandler::initDevice] cannot init hid"); @@ -206,7 +227,6 @@ bool DeviceIOHandler::initDevice() break; } } - if (!bFound) { return false; } @@ -215,13 +235,12 @@ bool DeviceIOHandler::initDevice() std::unique_ptr serNumb(new wchar_t[hidDeviceInfo_.serialNumber.length() + 1]); QString::fromStdString(hidDeviceInfo_.serialNumber).toWCharArray(serNumb.get()); serNumb.get()[hidDeviceInfo_.serialNumber.length()] = 0x00; - dongle_ = nullptr; dongle_ = hid_open(hidDeviceInfo_.vendorId, static_cast(hidDeviceInfo_.productId), serNumb.get()); return dongle_ != nullptr; } -void DeviceIOHandler::releaseDevice() +void DeviceIOHandler::releaseDevice() noexcept { if (dongle_) { hid_close(dongle_); @@ -238,9 +257,10 @@ bool DeviceIOHandler::exchangeData(const QByteArray& input, QByteArray& output } try { - return readData(output, logHeader); + readData(output, logHeader); + return true; } - catch (std::exception& e) { + catch (const LedgerBrokenSequence&) { // Special case : sometimes hidapi return incorrect sequence_index as response // and there is really now good solution for it, except restart dongle session // till the moment error gone. @@ -249,22 +269,30 @@ bool DeviceIOHandler::exchangeData(const QByteArray& input, QByteArray& output // Also it's a general issue for OSX really, but let's left it for all system, just in case // And let's have 10 times threshold to avoid trying infinitively static int maxAttempts = 10; - if (e.what() == kHidapiSequence191 && maxAttempts > 0) { + if (maxAttempts > 0) { --maxAttempts; ScopedGuard guard([] { ++maxAttempts; }); - releaseDevice(); + std::this_thread::sleep_for(std::chrono::milliseconds{ 100 }); initDevice(); output.clear(); return exchangeData(input, output, std::move(logHeader)); } - else { - throw e; - } } + catch (const LedgerReconnectDevice&) { + logger_->error("{} device requires reconnection", logHeader); + /*releaseDevice(); + std::this_thread::sleep_for(std::chrono::milliseconds{100}); + initDevice(); + output.clear(); + return exchangeData(input, output, std::move(logHeader));*/ + return false; + } + catch (const LedgerException&) {} + return false; } BIP32_Node GetPubKeyHandler::getPublicKeyApdu(const bs::hd::Path& derivationPath @@ -281,7 +309,7 @@ BIP32_Node GetPubKeyHandler::getPublicKeyApdu(const bs::hd::Path& derivationPath command.append(payload); QByteArray response; - if (!exchangeData(command, response, "[GetPubKeyHandler::getPublicKeyApdu] ")) { + if (!exchangeData(command, response, "[GetPubKeyHandler::getPublicKeyApdu]")) { return {}; } @@ -424,62 +452,67 @@ void LedgerDevice::getPublicKeys() void LedgerDevice::signTX(const bs::core::wallet::TXSignRequest& coreReq) { - // retrieve inputs paths - std::vector inputPaths; - for (int i = 0; i < coreReq.armorySigner_.getTxInCount(); ++i) { - auto spender = coreReq.armorySigner_.getSpender(i); - const auto& bip32Paths = spender->getBip32Paths(); - if (bip32Paths.size() != 1) { - throw std::logic_error("spender should only have one bip32 path"); - } - auto pathFromRoot = bip32Paths.begin()->second.getDerivationPathFromSeed(); + try { + // retrieve inputs paths + std::vector inputPaths; + for (int i = 0; i < coreReq.armorySigner_.getTxInCount(); ++i) { + auto spender = coreReq.armorySigner_.getSpender(i); + const auto& bip32Paths = spender->getBip32Paths(); + if (bip32Paths.size() != 1) { + throw LedgerException("spender should only have one bip32 path"); + } + auto pathFromRoot = bip32Paths.begin()->second.getDerivationPathFromSeed(); + + bs::hd::Path path; + for (unsigned i = 0; i < pathFromRoot.size(); i++) { + path.append(pathFromRoot[i]); + } - bs::hd::Path path; - for (unsigned i=0; i 0) { + const auto purp = bs::hd::purpose(coreReq.change.address.getType()); + if (coreReq.change.index.empty()) { + throw LedgerException(fmt::format("can't find change address index for '{}'", coreReq.change.address.display())); + } - // retrieve change path if any - bs::hd::Path changePath; - if (coreReq.change.value > 0) { - const auto purp = bs::hd::purpose(coreReq.change.address.getType()); - if (coreReq.change.index.empty()) { - throw std::logic_error(fmt::format("can't find change address index for '{}'", coreReq.change.address.display())); + changePath = getDerivationPath(testNet_, purp); + changePath.append(bs::hd::Path::fromString(coreReq.change.index)); } - changePath = getDerivationPath(testNet_, purp); - changePath.append(bs::hd::Path::fromString(coreReq.change.index)); - } + auto inPubData = std::make_shared(); + inPubData->paths = inputPaths; - auto inPubData = std::make_shared(); - inPubData->paths = inputPaths; - - const auto& cb = [this](const std::shared_ptr& data) - { - const auto& reply = std::static_pointer_cast(data); - if (!reply) { - logger_->error("[LedgerDevice::signTX] invalid callback data"); - operationFailed("invalid data"); - return; - } - cb_->txSigned(key(), reply->serInputSigs); - }; - auto inData = std::make_shared(); - inData->key = key(); - inData->txReq = coreReq; - inData->inputPaths = std::move(inputPaths); - inData->changePath = std::move(changePath); + const auto& cb = [this](const std::shared_ptr& data) + { + const auto& reply = std::static_pointer_cast(data); + if (!reply) { + logger_->error("[LedgerDevice::signTX] invalid callback data"); + operationFailed("invalid data"); + return; + } + cb_->txSigned(key(), reply->serInputSigs); + }; + auto inData = std::make_shared(); + inData->key = key(); + inData->txReq = coreReq; + inData->inputPaths = std::move(inputPaths); + inData->changePath = std::move(changePath); - const auto& cbPub = [this, inData, cb](const std::shared_ptr& data) - { - const auto& pubResult = std::static_pointer_cast(data); - inData->inputNodes = std::move(pubResult->pubKeys); - processQueued(inData, cb); - }; - processQueued(inPubData, cbPub); + const auto& cbPub = [this, inData, cb](const std::shared_ptr& data) + { + const auto& pubResult = std::static_pointer_cast(data); + inData->inputNodes = std::move(pubResult->pubKeys); + processQueued(inData, cb); + }; + processQueued(inPubData, cbPub); + } + catch (const LedgerException& e) { + operationFailed(e.what()); + } } void bs::hww::LedgerDevice::retrieveXPubRoot() @@ -583,7 +616,7 @@ void SignTXHandler::startUntrustedTransaction(const std::vector& tru const std::vector& redeemScripts, unsigned txOutIndex, bool isNew, bool isSW, bool isRbf) { - { + try { //setup untrusted transaction logger_->debug("[SignTXHandler::startUntrustedTransaction] start Init section"); QByteArray initPayload; @@ -600,10 +633,14 @@ void SignTXHandler::startUntrustedTransaction(const std::vector& tru QByteArray responseInit; if (!exchangeData(initCommand, responseInit, "[SignTXHandler::startUntrustedTransaction] InitPayload")) { releaseDevice(); - throw std::runtime_error("failed to init untrusted tx"); + throw LedgerException("failed to init untrusted tx"); } logger_->debug("[SignTXHandler::startUntrustedTransaction] done Init section"); } + catch (const LedgerException& e) { + logger_->error("[{}] {}", __func__, e.what()); + return; + } //pass each input logger_->debug("[SignTXHandler::startUntrustedTransaction] start Input section"); @@ -638,14 +675,20 @@ void SignTXHandler::startUntrustedTransaction(const std::vector& tru inputCommands.push_back(std::move(secondPart)); } - for (const auto &inputCommand : inputCommands) { - QByteArray responseInput; - if (!exchangeData(inputCommand, responseInput, "[SignTXHandler::startUntrustedTransaction] inputPayload")) { - releaseDevice(); - throw std::runtime_error("failed to create untrusted tx"); + try { + for (const auto& inputCommand : inputCommands) { + QByteArray responseInput; + if (!exchangeData(inputCommand, responseInput, "[SignTXHandler::startUntrustedTransaction] inputPayload")) { + releaseDevice(); + throw LedgerException("failed to create untrusted tx"); + } } + logger_->debug("[SignTXHandler::startUntrustedTransaction] done Input section"); + } + catch (const LedgerException& e) { + logger_->error("[{}] {}", __func__, e.what()); + return; } - logger_->debug("[SignTXHandler::startUntrustedTransaction] done Input section"); } void SignTXHandler::finalizeInputFull(const std::shared_ptr& inData) @@ -694,15 +737,20 @@ void SignTXHandler::finalizeInputFull(const std::shared_ptr& inData) } //emit info(HWInfoStatus::kPressButton); - - for (auto &outputCommand : outputCommands) { - QByteArray responseOutput; - if (!exchangeData(outputCommand, responseOutput, "[SignTXHandler::finalizeInputFull] outputPayload")) { - releaseDevice(); - throw std::runtime_error("failed to upload recipients"); + try { + for (auto& outputCommand : outputCommands) { + QByteArray responseOutput; + if (!exchangeData(outputCommand, responseOutput, "[SignTXHandler::finalizeInputFull] outputPayload")) { + releaseDevice(); + throw LedgerException("failed to upload recipients"); + } } + logger_->debug("[SignTXHandler::finalizeInputFull] done output section"); + } + catch (const LedgerException& e) { + logger_->error("[{}] {}", __func__, e.what()); + return; } - logger_->debug("[SignTXHandler::finalizeInputFull] done output section"); } void SignTXHandler::processTXLegacy(const std::shared_ptr& inData @@ -712,10 +760,12 @@ void SignTXHandler::processTXLegacy(const std::shared_ptr& inData //emit info(HWInfoStatus::kTransaction); std::vector trustedInputs; for (unsigned i=0; i < inData->txReq.armorySigner_.getTxInCount(); i++) { - auto spender = inData->txReq.armorySigner_.getSpender(i); - auto trustedInput = getTrustedInput(inData, spender->getOutputHash() + const auto& spender = inData->txReq.armorySigner_.getSpender(i); + const auto& trustedInput = getTrustedInput(inData, spender->getOutputHash() , spender->getOutputIndex()); - trustedInputs.push_back(trustedInput); + if (!trustedInput.isEmpty()) { + trustedInputs.push_back(trustedInput); + } } // -- collect all redeem scripts @@ -795,16 +845,22 @@ void SignTXHandler::processTXSegwit(const std::shared_ptr& inData , const std::shared_ptr& outData) { //emit info(HWInfoStatus::kTransaction); - // ---- Prepare all pib32 nodes for input from device ----- - auto segwitData = getSegwitData(inData); + // ---- Prepare all bip32 nodes for input from device ----- + const auto& segwitData = getSegwitData(inData); + if (segwitData.empty()) { + logger_->error("[{}] empty segwit data", __func__); + return; + } //upload supporting tx to ledger, get trusted input back for our outpoints std::vector trustedInputs; for (unsigned i=0; i < inData->txReq.armorySigner_.getTxInCount(); i++) { - auto spender = inData->txReq.armorySigner_.getSpender(i); - auto trustedInput = getTrustedInput(inData, spender->getOutputHash() + const auto& spender = inData->txReq.armorySigner_.getSpender(i); + const auto& trustedInput = getTrustedInput(inData, spender->getOutputHash() , spender->getOutputIndex()); - trustedInputs.push_back(trustedInput); + if (!trustedInput.isEmpty()) { + trustedInputs.push_back(trustedInput); + } } // -- Collect all redeem scripts @@ -882,46 +938,52 @@ void SignTXHandler::processTXSegwit(const std::shared_ptr& inData SegwitInputData SignTXHandler::getSegwitData(const std::shared_ptr& inData) { logger_->info("[SignTXHandler::getSegwitData] start retrieving segwit data"); - SegwitInputData data; - for (unsigned i = 0; i < inData->txReq.armorySigner_.getTxInCount(); i++) { - const auto& path = inData->inputPaths.at(i); - auto spender = inData->txReq.armorySigner_.getSpender(i); + try { + SegwitInputData data; + for (unsigned i = 0; i < inData->txReq.armorySigner_.getTxInCount(); i++) { + const auto& path = inData->inputPaths.at(i); + auto spender = inData->txReq.armorySigner_.getSpender(i); - if (!isNestedSegwit(path)) { - continue; - } - const auto& pubKeyNode = inData->inputNodes.at(i); + if (!isNestedSegwit(path)) { + continue; + } + const auto& pubKeyNode = inData->inputNodes.at(i); - //recreate the p2wpkh & witness scripts - auto compressedKey = CryptoECDSA().CompressPoint(pubKeyNode.getPublicKey()); - auto pubKeyHash = BtcUtils::getHash160(compressedKey); + //recreate the p2wpkh & witness scripts + auto compressedKey = CryptoECDSA().CompressPoint(pubKeyNode.getPublicKey()); + auto pubKeyHash = BtcUtils::getHash160(compressedKey); - auto witnessScript = BtcUtils::getP2WPKHWitnessScript(pubKeyHash); + auto witnessScript = BtcUtils::getP2WPKHWitnessScript(pubKeyHash); - BinaryWriter bwSwScript; - bwSwScript.put_uint8_t(16); - bwSwScript.put_BinaryData(BtcUtils::getP2WPKHOutputScript(pubKeyHash)); - const auto& swScript = bwSwScript.getData(); + BinaryWriter bwSwScript; + bwSwScript.put_uint8_t(16); + bwSwScript.put_BinaryData(BtcUtils::getP2WPKHOutputScript(pubKeyHash)); + const auto& swScript = bwSwScript.getData(); - /* sanity check: make sure the swScript is the preimage to the utxo's p2sh script */ + /* sanity check: make sure the swScript is the preimage to the utxo's p2sh script */ - //recreate p2sh hash - //auto p2shHash = BtcUtils::hash160(swScript); - auto p2shHash = BtcUtils::hash160(swScript.getSliceRef(1, 22)); + //recreate p2sh hash + //auto p2shHash = BtcUtils::hash160(swScript); + auto p2shHash = BtcUtils::hash160(swScript.getSliceRef(1, 22)); - //recreate p2sh script - auto p2shScript = BtcUtils::getP2SHScript(p2shHash); + //recreate p2sh script + auto p2shScript = BtcUtils::getP2SHScript(p2shHash); - //check vs utxo's script - if (spender->getOutputScript() != p2shScript) { - throw std::runtime_error("p2sh script mismatch"); - } + //check vs utxo's script + if (spender->getOutputScript() != p2shScript) { + throw LedgerException("p2sh script mismatch"); + } - data.preimages[i] = swScript; - data.redeemScripts[i] = std::move(witnessScript); + data.preimages[i] = swScript; + data.redeemScripts[i] = std::move(witnessScript); + } + logger_->info("[SignTXHandler::getSegwitData] done retrieving segwit data"); + return data; + } + catch (const LedgerException& e) { + logger_->error("[{}] {}", __func__, e.what()); + return {}; } - logger_->info("[SignTXHandler::getSegwitData] done retrieving segwit data"); - return data; } void SignTXHandler::sendTxSigningResult(const std::shared_ptr& outData @@ -1085,26 +1147,32 @@ QByteArray SignTXHandler::getTrustedInput(const std::shared_ptr& inDat inputCommands.push_back(std::move(commandScript)); } - for (auto& inputCommand : inputCommands) { - QByteArray responseInput; - if (!exchangeData(inputCommand, responseInput, "[LedgerCommandThread] signTX - getting trusted input")) { - releaseDevice(); - throw std::runtime_error("failed to get trusted input"); + try { + for (auto& inputCommand : inputCommands) { + QByteArray responseInput; + if (!exchangeData(inputCommand, responseInput, "[LedgerCommandThread] signTX - getting trusted input")) { + releaseDevice(); + throw LedgerException("failed to get trusted input"); + } } - } - //locktime - QByteArray locktime; - writeUintLE(locktime, tx.getLockTime()); - auto command = getApduCommand( - Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x80, 0x00, std::move(locktime)); + //locktime + QByteArray locktime; + writeUintLE(locktime, tx.getLockTime()); + auto command = getApduCommand( + Ledger::CLA, Ledger::INS_GET_TRUSTED_INPUT, 0x80, 0x00, std::move(locktime)); - QByteArray trustedInput; - if (!exchangeData(command, trustedInput, "[SignTXHandler::getTrustedInput] ")) { - releaseDevice(); - throw std::runtime_error("failed to get trusted input"); - } + QByteArray trustedInput; + if (!exchangeData(command, trustedInput, "[SignTXHandler::getTrustedInput] ")) { + releaseDevice(); + throw LedgerException("failed to get trusted input"); + } - logger_->debug("[SignTXHandler::getTrustedInput] done retrieve trusted input for legacy address"); - return trustedInput; + logger_->debug("[SignTXHandler::getTrustedInput] done retrieve trusted input for legacy address"); + return trustedInput; + } + catch (const LedgerException& e) { + logger_->error("[{}] {}", __func__, e.what()); + return {}; + } } diff --git a/BlockSettleHW/ledger/ledgerDevice.h b/BlockSettleHW/ledger/ledgerDevice.h index e050653bc..279a6c631 100644 --- a/BlockSettleHW/ledger/ledgerDevice.h +++ b/BlockSettleHW/ledger/ledgerDevice.h @@ -97,10 +97,10 @@ namespace bs { releaseDevice(); } - bool initDevice(); - void releaseDevice(); - bool writeData(const QByteArray& input, const std::string& logHeader); - bool readData(QByteArray& output, const std::string& logHeader); + bool initDevice() noexcept; + void releaseDevice() noexcept; + bool writeData(const QByteArray& input, const std::string& logHeader) noexcept; + void readData(QByteArray& output, const std::string& logHeader); bool exchangeData(const QByteArray& input, QByteArray& output, std::string&& logHeader); protected: diff --git a/BlockSettleHW/ledger/ledgerStructure.h b/BlockSettleHW/ledger/ledgerStructure.h index b50859ed7..7cc270eef 100644 --- a/BlockSettleHW/ledger/ledgerStructure.h +++ b/BlockSettleHW/ledger/ledgerStructure.h @@ -158,9 +158,15 @@ struct HidDeviceInfo { int interfaceNumber; }; -struct SegwitInputData { +struct SegwitInputData +{ std::map preimages; std::map redeemScripts; + + bool empty() const + { + return (preimages.empty() && redeemScripts.empty()); + } }; struct LedgerPublicKey diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index e8fb902c9..cb0e58f55 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -407,11 +407,13 @@ ProcessingResult SignerAdapter::processSyncWallet(const bs::message::Envelope &e if (!sender) { return; } + logger_->debug("[SignerAdapter::processSyncWallet] wallet {} asset type: {}", walletId, data.assetType); SignerMessage msg; auto msgResp = msg.mutable_wallet_synced(); msgResp->set_wallet_id(walletId); msgResp->set_high_ext_index(data.highestExtIndex); msgResp->set_high_int_index(data.highestIntIndex); + msgResp->set_asset_type((int)data.assetType); for (const auto &addr : data.addresses) { auto msgAddr = msgResp->add_addresses(); diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index 07e55776c..197d34a05 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -20,7 +20,8 @@ namespace {QmlAddressListModel::HeadingRole, "heading"}, {QmlAddressListModel::FirstColRole, "firstcol"}, {QmlAddressListModel::ColorRole, "dataColor"}, - {QmlAddressListModel::AddressTypeRole, "addressType"} }; + {QmlAddressListModel::AddressTypeRole, "addressType"}, + {QmlAddressListModel::AssetTypeRole, "assetType"} }; } QmlAddressListModel::QmlAddressListModel(const std::shared_ptr& logger, QObject* parent) @@ -40,18 +41,15 @@ int QmlAddressListModel::columnCount(const QModelIndex&) const QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const { - try - { + const int row = index.row() - 1; + try { switch (role) { case TableDataRole: - if (index.row() == 0) - { + if (index.row() == 0) { return header_.at(index.column()); } - else - { - const int row = index.row() - 1; + else { switch (index.column()) { case 0: return table_.at(row).at(0); @@ -65,20 +63,18 @@ QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const case HeadingRole: return (index.row() == 0); case FirstColRole: return (index.column() == 0); case ColorRole: - if (index.row() == 0) - { + if (index.row() == 0) { return ColorScheme::tableHeaderColor; } - else - { + else { return QColorConstants::White; } - case AddressTypeRole: return table_.at(index.row() - 1).at(2); + case AddressTypeRole: return table_.at(row).at(2); + case AssetTypeRole: return table_.at(row).at(3); default: break; } } - catch (const std::exception&) - { + catch (const std::exception&) { return QString{}; } return QVariant(); diff --git a/GUI/QtQuick/AddressListModel.h b/GUI/QtQuick/AddressListModel.h index 5b9c56918..01b18735b 100644 --- a/GUI/QtQuick/AddressListModel.h +++ b/GUI/QtQuick/AddressListModel.h @@ -33,7 +33,8 @@ class QmlAddressListModel: public QAbstractTableModel HeadingRole, FirstColRole, ColorRole, - AddressTypeRole + AddressTypeRole, + AssetTypeRole }; QmlAddressListModel(const std::shared_ptr&, QObject* parent = nullptr); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index b578e5d8c..0c227765b 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -578,10 +578,12 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) case WalletsMessage::kWalletAddresses: { std::vector addresses; + const auto& hdWallet = hdWallets_.at(msg.wallet_addresses().wallet_id()); for (const auto &addr : msg.wallet_addresses().addresses()) { try { + const auto& assetType = hdWallet.leaves.at(addr.wallet_id()); addresses.push_back({ std::move(bs::Address::fromAddressString(addr.address())) - , addr.index(), addr.wallet_id() }); + , addr.index(), addr.wallet_id(), assetType}); } catch (const std::exception &) {} } @@ -832,6 +834,7 @@ std::string QtQuickAdapter::generateWalletName() const void QtQuickAdapter::walletSelected(int index) { + logger_->debug("[{}] {}", __func__, index); QMetaObject::invokeMethod(this, [this, index] { const auto& walletName = walletBalances_->wallets().at(index).toStdString(); const auto& walletId = hdWalletIdByIndex(index); @@ -869,6 +872,17 @@ void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) , std::chrono::milliseconds{ 500 }); } +static QString assetTypeToString(const bs::AssetType assetType) +{ + switch (assetType) { + case bs::AssetType::Legacy: return QObject::tr("Legacy"); + case bs::AssetType::NestedSW: return QObject::tr("Nested SegWit"); + case bs::AssetType::NativeSW: return QObject::tr("Native SegWit"); + case bs::AssetType::Unknown: + default: return QObject::tr("Unknown"); + } +} + ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId , const WalletsMessage_WalletData& response) { @@ -894,7 +908,8 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId for (const auto& addr : response.used_addresses()) { addresses.append({ QString::fromStdString(addr.address()) , QString::fromStdString(addr.comment()) - , QString::fromStdString(addr.index()) }); + , QString::fromStdString(addr.index()) + , assetTypeToString(static_cast(addr.asset_type()))}); } addrModel_->addRows(response.wallet_id(), addresses); return ProcessingResult::Success; @@ -903,7 +918,7 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId ProcessingResult QtQuickAdapter::processWalletBalances(bs::message::SeqId responseId , const WalletsMessage_WalletBalances &response) { - //logger_->debug("[{}] {}", __func__, response.DebugString()); + logger_->debug("[{}] {}", __func__, response.DebugString()); const WalletBalancesModel::Balance bal{ response.spendable_balance(), response.unconfirmed_balance() , response.total_balance(), response.nb_addresses() }; walletBalances_->setWalletBalance(response.wallet_id(), bal); @@ -1197,7 +1212,8 @@ void QtQuickAdapter::requestFeeSuggestions() for (const auto& feeLevel : FeeSuggestionModel::feeLevels()) { msgReq->add_levels(feeLevel.first); } - pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + pushRequest(user_, userBlockchain_, msg.SerializeAsString(), {}, 10 + , std::chrono::milliseconds{500}); } QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStringList& recvAddrs @@ -1382,7 +1398,8 @@ ProcessingResult QtQuickAdapter::processAddressHist(const ArmoryMessage_AddressH entries.push_back(std::move(txEntry)); } expTxByAddrModel_->addRows(entries); - const auto msgId = pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + const auto msgId = pushRequest(user_, userBlockchain_, msg.SerializeAsString() + , {}, 10, std::chrono::milliseconds{230} ); expTxAddrReqs_.insert(msgId); return ProcessingResult::Success; } @@ -1513,7 +1530,8 @@ bs::message::ProcessingResult QtQuickAdapter::processTransactions(bs::message::S } expTxAddrReqs_.erase(itExpTxAddr); expTxByAddrModel_->setDetails(result); - const auto msgIdReq = pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + const auto msgIdReq = pushRequest(user_, userBlockchain_, msg.SerializeAsString() + , {}, 10, std::chrono::milliseconds{ 230 }); expTxAddrInReqs_.insert(msgIdReq); } const auto& itExpTxAddrIn = expTxAddrInReqs_.find(msgId); @@ -1552,8 +1570,7 @@ void QtQuickAdapter::processWalletAddresses(const std::string& walletId const auto lastAddr = addresses.at(addresses.size() - 1); logger_->debug("[{}] {} last address: {}", __func__, hdWalletId, lastAddr.address.display()); addrModel_->addRow(hdWalletId, { QString::fromStdString(lastAddr.address.display()) - , QString() - , QString::fromStdString(lastAddr.index) }); + , QString(), QString::fromStdString(lastAddr.index), assetTypeToString(lastAddr.assetType)}); generatedAddress_ = lastAddr.address; emit addressGenerated(); } @@ -1747,5 +1764,6 @@ void QtQuickAdapter::startAddressSearch(const QString& s) expTxByAddrModel_->clear(); ArmoryMessage msg; msg.set_get_address_history(s.trimmed().toStdString()); - pushRequest(user_, userBlockchain_, msg.SerializeAsString()); -} \ No newline at end of file + pushRequest(user_, userBlockchain_, msg.SerializeAsString() + , {}, 10, std::chrono::milliseconds{ 230 }); +} diff --git a/GUI/QtQuick/qml/AddressDetails.qml b/GUI/QtQuick/qml/AddressDetails.qml index 498a588c1..e67af9d9b 100644 --- a/GUI/QtQuick/qml/AddressDetails.qml +++ b/GUI/QtQuick/qml/AddressDetails.qml @@ -23,6 +23,7 @@ Popup { property string transactions: "" property string balance: "" property string comment: "" + property string asset_type: "" property string type: "" property string wallet: "" @@ -137,11 +138,20 @@ Popup { font.pixelSize: 14 width: 140 } - Text { - text: address_details.type - color: BSStyle.textColor - font.family: "Roboto" - font.pixelSize: 14 + Row { + spacing: 14 + Text { + text: address_details.asset_type + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } + Text { + text: address_details.type + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + } } Text { diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 0834be67b..0e120c79c 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -24,7 +24,7 @@ Rectangle { signal requestWalletProperties() signal createNewWallet() signal walletIndexChanged(index : int) - signal openAddressDetails(var address, var transactions, var balance, var comment, var type, var wallet) + signal openAddressDetails(var address, var transactions, var balance, var comment, var asset_type, var type, var wallet) Column { anchors.leftMargin: 18 @@ -81,8 +81,9 @@ Rectangle { const balance = model.data(model.index(row, 2), 257) const comment = model.data(model.index(row, 3), 257) const type = model.data(model.index(row, 0), 261) + const asset_type = model.data(model.index(row, 0), 262) - openAddressDetails(address, transactions, balance, comment, type, overview_panel.currentWallet) + openAddressDetails(address, transactions, balance, comment, asset_type, type, overview_panel.currentWallet) } } } diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 15b747cb2..ddcba2d38 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -43,11 +43,12 @@ Item { onRequestWalletProperties: console.log("Nothing to do") onCreateNewWallet: overview.newWalletClicked() onWalletIndexChanged: overview.curWalletIndexChanged(index) - onOpenAddressDetails: (address, transactions, balance, comment, type, wallet) => { + onOpenAddressDetails: (address, transactions, balance, comment, asset_type, type, wallet) => { addressDetails.address = address addressDetails.transactions = transactions addressDetails.balance = balance addressDetails.comment = comment + addressDetails.asset_type = asset_type addressDetails.type = type addressDetails.wallet = wallet bsApp.startAddressSearch(address) diff --git a/common b/common index b8404d3fb..c01eb7c16 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit b8404d3fb2652b49283854046e403a5f9651c247 +Subproject commit c01eb7c166823ff4cdb220e6818ee3ddf2a76ba7 From 7d05a2f4d621799042d907150120432cde02ef7c Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 15 Feb 2023 06:31:10 +0200 Subject: [PATCH 136/436] qml: send advanced view --- GUI/QtQuick/QtQuick.zip | Bin 3912 -> 0 bytes GUI/QtQuick/QtQuickAdapter.cpp | 8 +- GUI/QtQuick/QtQuickAdapter.h | 2 + GUI/QtQuick/TxInputsModel.cpp | 87 ++-- GUI/QtQuick/TxInputsModel.h | 15 +- GUI/QtQuick/TxInputsSelectedModel.cpp | 24 + GUI/QtQuick/TxInputsSelectedModel.h | 34 ++ GUI/QtQuick/TxOutputsModel.cpp | 40 +- GUI/QtQuick/TxOutputsModel.h | 3 +- GUI/QtQuick/images/check.svg | 3 + GUI/QtQuick/images/collapsed.svg | 3 + GUI/QtQuick/images/expanded.svg | 3 + GUI/QtQuick/qml/Send/AdvancedDetails.qml | 120 ++++- GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 4 + GUI/QtQuick/qml/Send/PasswordWithTimer.qml | 82 ++++ GUI/QtQuick/qml/Send/SelectInputs.qml | 218 ++++++++- GUI/QtQuick/qml/Send/SendPopup.qml | 28 ++ GUI/QtQuick/qml/Send/SignTransaction.qml | 55 +-- .../qml/Send/SignTransactionAdvanced.qml | 432 ++++++++++++++++++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 2 +- .../qml/StyledControls/CustomCheckBox.qml | 27 +- .../StyledControls/CustomTableDelegateRow.qml | 63 +-- .../qml/StyledControls/CustomTableView.qml | 52 ++- GUI/QtQuick/qtquick.qrc | 5 + 24 files changed, 1122 insertions(+), 188 deletions(-) delete mode 100644 GUI/QtQuick/QtQuick.zip create mode 100644 GUI/QtQuick/TxInputsSelectedModel.cpp create mode 100644 GUI/QtQuick/TxInputsSelectedModel.h create mode 100644 GUI/QtQuick/images/check.svg create mode 100644 GUI/QtQuick/images/collapsed.svg create mode 100644 GUI/QtQuick/images/expanded.svg create mode 100644 GUI/QtQuick/qml/Send/PasswordWithTimer.qml create mode 100644 GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml diff --git a/GUI/QtQuick/QtQuick.zip b/GUI/QtQuick/QtQuick.zip deleted file mode 100644 index 68976b59c7aa82332899fe6a5b5f575497a9ceec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3912 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 diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index b578e5d8c..e66737f14 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -36,6 +36,7 @@ #include "hwdevicemanager.h" #include "QTXSignRequest.h" #include "TxOutputsModel.h" +#include "TxInputsSelectedModel.h" #include "SettingsAdapter.h" #include "Wallets/ProtobufHeadlessUtils.h" #include "WalletBalancesModel.h" @@ -134,6 +135,8 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) expTxByAddrModel_ = new TxListForAddr(logger, this); txOutputsModel_ = new TxOutputsModel(logger, this); txInputsModel_ = new TxInputsModel(logger, txOutputsModel_, this); + txInputsSelectedModel_ = new TxInputsSelectedModel(this); + txInputsSelectedModel_->setSourceModel(txInputsModel_); hwDeviceModel_ = new HwDeviceModel(logger, this); walletBalances_ = new WalletBalancesModel(logger, this); feeSuggModel_ = new FeeSuggestionModel(logger, this); @@ -215,6 +218,8 @@ void QtQuickAdapter::run(int &argc, char **argv) qmlRegisterInterface("QTxDetails"); qmlRegisterUncreatableMetaObject(WalletBalance::staticMetaObject, "wallet.balance" , 1, 0, "WalletBalance", tr("Error: only enums")); + qmlRegisterUncreatableMetaObject(TxInputsModel::staticMetaObject, "tx.inputs.model" + , 1, 0, "TxInputsModel", tr("Error: only enums")); qmlRegisterType("terminal.models", 1, 0, "TransactionFilterModel"); qmlRegisterType("terminal.models", 1, 0, "TransactionForAddressFilterModel"); @@ -232,6 +237,7 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("txListModel"), txModel_); rootCtxt_->setContextProperty(QLatin1Literal("txListByAddrModel"), expTxByAddrModel_); rootCtxt_->setContextProperty(QLatin1Literal("txInputsModel"), txInputsModel_); + rootCtxt_->setContextProperty(QLatin1Literal("txInputsSelectedModel"), txInputsSelectedModel_); rootCtxt_->setContextProperty(QLatin1Literal("txOutputsModel"), txOutputsModel_); rootCtxt_->setContextProperty(QLatin1Literal("hwDeviceModel"), hwDeviceModel_); rootCtxt_->setContextProperty(QLatin1Literal("walletBalances"), walletBalances_); @@ -1748,4 +1754,4 @@ void QtQuickAdapter::startAddressSearch(const QString& s) ArmoryMessage msg; msg.set_get_address_history(s.trimmed().toStdString()); pushRequest(user_, userBlockchain_, msg.SerializeAsString()); -} \ No newline at end of file +} diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 7015c0e26..fc6395cbd 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -20,6 +20,7 @@ #include "hwdevicemodel.h" #include "ThreadSafeClasses.h" #include "TxInputsModel.h" +#include "TxInputsSelectedModel.h" #include "TxListModel.h" #include "UiUtils.h" #include "Wallets/SignContainer.h" @@ -271,6 +272,7 @@ private slots: TxListModel* txModel_{ nullptr }; TxListForAddr* expTxByAddrModel_{ nullptr }; TxInputsModel* txInputsModel_{ nullptr }; + TxInputsSelectedModel * txInputsSelectedModel_{ nullptr }; TxOutputsModel* txOutputsModel_{ nullptr }; HwDeviceModel* hwDeviceModel_{ nullptr }; WalletBalancesModel* walletBalances_{ nullptr }; diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index bba0901be..6d22fcb7c 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -19,17 +19,20 @@ namespace { static const QHash kRoles{ {TxInputsModel::TableDataRole, "tableData"}, {TxInputsModel::HeadingRole, "heading"}, - {TxInputsModel::WidthRole, "colWidth"}, {TxInputsModel::ColorRole, "dataColor"}, - {TxInputsModel::BgColorRole, "bgColor"}, + {TxInputsModel::SelectedRole, "selected"}, + {TxInputsModel::ExpandedRole, "expanded"}, + {TxInputsModel::CanBeExpandedRole, "is_expandable"} }; } TxInputsModel::TxInputsModel(const std::shared_ptr& logger , TxOutputsModel* outs, QObject* parent) : QAbstractTableModel(parent), logger_(logger), outsModel_(outs) - , header_{ {}, tr("Address/Hash"), tr("#Tx"), tr("Balance (BTC)"), tr("Comment") } -{ } + , header_{{ColumnAddress, tr("Address/Hash")}, {ColumnTx, tr("#Tx")}, + {ColumnComment, tr("Comment")}, {ColumnBalance, tr("Balance (BTC)")}} +{ +} int TxInputsModel::rowCount(const QModelIndex &) const { @@ -48,17 +51,27 @@ QVariant TxInputsModel::data(const QModelIndex& index, int role) const return getData(index.row(), index.column()); case HeadingRole: return (index.row() == 0); - case WidthRole: - return colWidth(index.column()); + case SelectedRole: + return (index.row() > 0 && index.column() == 0) ? (selection_.find(index.row() -1) != selection_.end()) : false; + case ExpandedRole: + return (index.row() > 0 && index.column() == 0) ? data_[index.row() - 1].expanded : false; + case CanBeExpandedRole: + return (index.row() > 0 && index.column() == 0) ? data_[index.row() - 1].txId.empty() : false; case ColorRole: return dataColor(index.row(), index.column()); - case BgColorRole: - return bgColor(index.row()); default: break; } return QVariant(); } +QColor TxInputsModel::dataColor(int row, int col) const +{ + if (row == 0) { + return QColor("#7A88B0"); + } + return QColor("#FFFFFF"); +} + QHash TxInputsModel::roleNames() const { return kRoles; @@ -72,6 +85,7 @@ void TxInputsModel::clear() selection_.clear(); preSelected_.clear(); endResetModel(); + emit rowCountChanged(); } void TxInputsModel::addUTXOs(const std::vector& utxos) @@ -91,12 +105,14 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) beginInsertRows(QModelIndex(), rowCount(), rowCount()); data_.push_back({ addr }); endInsertRows(); + emit rowCountChanged(); } else { if (data_.at(addrIndex).expanded) { beginInsertRows(QModelIndex(), addrIndex + 2, addrIndex + 2); data_.insert(data_.cbegin() + addrIndex + 1, { {}, utxo.getTxHash(), utxo.getTxOutIndex() }); endInsertRows(); + emit rowCountChanged(); } } } @@ -112,6 +128,7 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) void TxInputsModel::toggle(int row) { + logger_->debug("[{}] samii begin row: {}", __func__, row); --row; auto& entry = data_[row]; if (!entry.txId.empty()) { @@ -145,8 +162,10 @@ void TxInputsModel::toggle(int row) } beginRemoveRows(QModelIndex(), row + 2, row + it->second.size() + 1); changeSelection(selChanges); - data_.erase(data_.cbegin() + row + 1, data_.cbegin() + row + it->second.size()); + data_.erase(data_.cbegin() + row + 1, data_.cbegin() + row + it->second.size() + 1); endRemoveRows(); + + emit rowCountChanged(); } else { entry.expanded = true; @@ -166,7 +185,8 @@ void TxInputsModel::toggle(int row) changeSelection(selChanges); data_.insert(data_.cbegin() + row + 1, entries.cbegin(), entries.cend()); endInsertRows(); - emit dataChanged(createIndex(row + 1, 0), createIndex(row + 1, columnCount() - 1), { BgColorRole }); + emit rowCountChanged(); + emit dataChanged(createIndex(row + 1, 0), createIndex(row + 1, columnCount() - 1), { SelectedRole }); } } @@ -313,28 +333,29 @@ QList TxInputsModel::collectUTXOsFor(double amount) QVariant TxInputsModel::getData(int row, int col) const { if (row == 0) { - return header_.at(col); + return header_[col]; } const auto& entry = data_.at(row - 1); const auto& itUTXOs = entry.address.empty() ? utxos_.end() : utxos_.find(entry.address); switch (col) { - case 0: - return (selection_.find(row -1) != selection_.end()); - case 1: + case ColumnAddress: if (!entry.txId.empty()) { const auto& txId = entry.txId.toHexStr(true); - std::string str = " " + txId.substr(0, 8) + "..." + txId.substr(txId.size() - 9, 8); + std::string str = txId; + if (txId.size() > 40) + str = txId.substr(0, 20) + "..." + txId.substr(txId.size() - 21, 20); + return QString::fromStdString(str); } else { return QString::fromStdString(entry.address.display()); } - case 2: + case ColumnTx: if (itUTXOs != utxos_.end()) { return QString::number(itUTXOs->second.size()); } break; - case 3: + case ColumnBalance: if (itUTXOs != utxos_.end()) { uint64_t balance = 0; for (const auto& utxo : itUTXOs->second) { @@ -356,35 +377,3 @@ QVariant TxInputsModel::getData(int row, int col) const } return {}; } - -QColor TxInputsModel::dataColor(int row, int col) const -{ - if (row == 0) { - return QColorConstants::DarkGray; - } - return QColorConstants::LightGray; -} - -QColor TxInputsModel::bgColor(int row) const -{ - if (row == 0) { - return QColorConstants::Black; - } - if (selection_.find(row - 1) != selection_.end()) { - return QColorConstants::DarkCyan; - } - return QColorConstants::DarkBlue; -} - -float TxInputsModel::colWidth(int col) const -{ // width ratio, sum should give columnCount() as a result - switch (col) { - case 0: return 0.2; - case 1: return 2.6; - case 2: return 0.4; - case 3: return 0.8; - case 4: return 1; - default: break; - } - return 1.0; -} diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index fbf99fde6..151176c55 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -53,10 +53,12 @@ class QUTXOList : public QObject class TxInputsModel : public QAbstractTableModel { - Q_OBJECT + Q_OBJECT + Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) + public: - enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, WidthRole - , ColorRole, BgColorRole }; + enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole, + SelectedRole, ExpandedRole, CanBeExpandedRole }; TxInputsModel(const std::shared_ptr&, TxOutputsModel*, QObject* parent = nullptr); int rowCount(const QModelIndex & = QModelIndex()) const override; @@ -84,18 +86,19 @@ class TxInputsModel : public QAbstractTableModel signals: void selectionChanged() const; void feeChanged() const; + void rowCountChanged (); private: QVariant getData(int row, int col) const; QColor dataColor(int row, int col) const; - QColor bgColor(int row) const; - float colWidth(int col) const; QList collectUTXOsFor(double amount); private: + enum Columns {ColumnAddress, ColumnTx, ColumnComment, ColumnBalance}; + std::shared_ptr logger_; TxOutputsModel* outsModel_{ nullptr }; - const QStringList header_; + const QMap header_; std::map> utxos_; struct Entry { diff --git a/GUI/QtQuick/TxInputsSelectedModel.cpp b/GUI/QtQuick/TxInputsSelectedModel.cpp new file mode 100644 index 000000000..c0405d59c --- /dev/null +++ b/GUI/QtQuick/TxInputsSelectedModel.cpp @@ -0,0 +1,24 @@ +#include "TxInputsSelectedModel.h" + +TxInputsSelectedModel::TxInputsSelectedModel (QObject *parent) + : QSortFilterProxyModel (parent) +{ + connect (this, &TxInputsSelectedModel::rowsInserted, this, &TxInputsSelectedModel::rowCountChanged); + connect (this, &TxInputsSelectedModel::rowsRemoved, this, &TxInputsSelectedModel::rowCountChanged); +} + +bool TxInputsSelectedModel::filterAcceptsRow (int sourceRow, const QModelIndex &sourceParent) const +{ + Q_UNUSED(sourceParent) + const auto inputsModel = qobject_cast (sourceModel ()); + if (!inputsModel) { + return false; + } + + const auto isHeader = (sourceRow == 0); + + const auto selected = inputsModel->data (inputsModel->index (sourceRow, 0), + static_cast (TxInputsModel::SelectedRole)).toBool (); + + return isHeader || selected; +} diff --git a/GUI/QtQuick/TxInputsSelectedModel.h b/GUI/QtQuick/TxInputsSelectedModel.h new file mode 100644 index 000000000..6d2eb6da6 --- /dev/null +++ b/GUI/QtQuick/TxInputsSelectedModel.h @@ -0,0 +1,34 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef TX_INPUTS_SELECTED_MODEL_H +#define TX_INPUTS_SELECTED_MODEL_H + +#include + +#include "TxInputsModel.h" + +class TxInputsSelectedModel : public QSortFilterProxyModel +{ + Q_OBJECT + Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) + +public: + explicit TxInputsSelectedModel (QObject *parent = nullptr); + + bool filterAcceptsRow (int sourceRow, const QModelIndex &sourceParent) const; + +signals: + void rowCountChanged (); +}; + + + +#endif // TX_INPUTS_SELECTED_MODEL_H diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index 65fb24bb1..bae56c5e1 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -17,7 +17,6 @@ namespace { static const QHash kRoles{ {TxOutputsModel::TableDataRole, "tableData"}, {TxOutputsModel::HeadingRole, "heading"}, - {TxOutputsModel::WidthRole, "colWidth"}, {TxOutputsModel::ColorRole, "dataColor"} }; } @@ -44,8 +43,6 @@ QVariant TxOutputsModel::data(const QModelIndex& index, int role) const return getData(index.row(), index.column()); case HeadingRole: return (index.row() == 0); - case WidthRole: - return colWidth(index.column()); case ColorRole: return dataColor(index.row(), index.column()); default: break; @@ -83,6 +80,24 @@ void TxOutputsModel::clearOutputs() endResetModel(); } +QStringList TxOutputsModel::getOutputAddresses() const +{ + QStringList res; + for(int row=1; row TxOutputsModel::getOutputAmounts() const +{ + QList res; + for(int row=1; row getOutputAmounts() const; signals: void selectionChanged() const; @@ -51,7 +53,6 @@ class TxOutputsModel : public QAbstractTableModel private: QVariant getData(int row, int col) const; QColor dataColor(int row, int col) const; - float colWidth(int col) const; private: std::shared_ptr logger_; diff --git a/GUI/QtQuick/images/check.svg b/GUI/QtQuick/images/check.svg new file mode 100644 index 000000000..95abec65e --- /dev/null +++ b/GUI/QtQuick/images/check.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/images/collapsed.svg b/GUI/QtQuick/images/collapsed.svg new file mode 100644 index 000000000..64f2a472f --- /dev/null +++ b/GUI/QtQuick/images/collapsed.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/images/expanded.svg b/GUI/QtQuick/images/expanded.svg new file mode 100644 index 000000000..cc6d8406d --- /dev/null +++ b/GUI/QtQuick/images/expanded.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 0652d138a..ee8b92b3f 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -14,6 +14,7 @@ ColumnLayout { signal sig_continue(signature: var) signal sig_simple() + signal sig_select_inputs() height: 748 width: 1132 @@ -153,6 +154,8 @@ ColumnLayout { { amount_input.input_text = tempRequest.maxAmount } + + bsApp.getUTXOsForWallet(index_act) } } @@ -185,9 +188,100 @@ ColumnLayout { color: "#3C435A" } - Label { + + CustomTableView { + id: table_sel_inputs + Layout.fillWidth: true Layout.fillHeight : true + Layout.leftMargin: 16 + Layout.rightMargin: 16 + + model: txInputsSelectedModel + columnWidths: [0.7, 0.1, 0, 0.2] + + text_header_size: 12 + cell_text_size: 13 + copy_button_column_index: -1 + + Component + { + id: cmpnt_sel_inputs + + Row { + id: cmpnt_sel_inputs_row + + spacing: 12 + + Text { + id: internal_text + + visible: model_column !== delete_button_column_index + + text: model_tableData + height: parent.height + verticalAlignment: Text.AlignVCenter + clip: true + + color: get_data_color(model_row, model_column) + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: model_row === 0 ? text_header_size : cell_text_size + + leftPadding: table_sel_inputs.get_text_left_padding(model_row, model_column) + } + + Button { + id: sel_inputs_button + + text: qsTr("Select Inputs") + + font.family: "Roboto" + font.weight: Font.DemiBold + font.pixelSize: 12 + + anchors.verticalCenter: parent.verticalCenter + + contentItem: Text { + text: sel_inputs_button.text + font: sel_inputs_button.font + color: "#45A6FF" + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight + } + + background: Rectangle { + implicitWidth: 84 + implicitHeight: 25 + color: "transparent" + border.color: "#45A6FF" + border.width: 1 + radius: 8 + } + + onClicked: layout.sig_select_inputs() + } + } + } + + + CustomTableDelegateRow { + id: cmpnt_table_delegate + } + + function choose_row_source_component(row, column) + { + if(row === 0 && column === 0) + return cmpnt_sel_inputs + else + return cmpnt_table_delegate + } + + function get_text_left_padding(row, column) + { + return (row === 0 && column === 0) ? 0 : left_text_padding + } } } } @@ -324,25 +418,30 @@ ColumnLayout { } CustomTableView { + id: table_outputs Layout.fillWidth: true Layout.fillHeight : true Layout.leftMargin: 16 Layout.rightMargin: 16 - model: txOutputsModel + model:txOutputsModel columnWidths: [0.744, 0.20, 0.056] text_header_size: 12 cell_text_size: 13 copy_button_column_index: -1 delete_button_column_index: 2 - left_first_header_padding: 0 onDeleteRequested: (row) => { txOutputsModel.delOutput(row) } + + function get_text_left_padding(row, column) + { + return (row === 0 && column === 0) ? 0 : left_text_padding + } } } } @@ -356,28 +455,31 @@ ColumnLayout { CustomButton { - id: broadcast_but + id: continue_but - enabled: false + enabled: txOutputsModel.rowCount && table_sel_inputs.rowCount width: 1084 Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - text: qsTr("Broadcast") + text: qsTr("Continue") Component.onCompleted: { - broadcast_but.preferred = true + continue_but.preferred = true } - function click_enter() { + function click_enter() { + layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() + , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text + , txInputsModel.getSelection())) } } - function init() { rec_addr_input.setActiveFocus() diff --git a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml index 5821c9120..17807706b 100644 --- a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml +++ b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml @@ -28,6 +28,10 @@ CustomComboBox { textRole: "text" valueRole: "value" + onActivated: (index_act) => { + txInputsModel.fee = parseFloat(fee_suggest_combo.currentValue) + } + Connections { target:feeSuggestions diff --git a/GUI/QtQuick/qml/Send/PasswordWithTimer.qml b/GUI/QtQuick/qml/Send/PasswordWithTimer.qml new file mode 100644 index 000000000..8fd0f0b40 --- /dev/null +++ b/GUI/QtQuick/qml/Send/PasswordWithTimer.qml @@ -0,0 +1,82 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.9 +import QtQuick.Controls 2.3 + +import "../BsStyles" +import "../StyledControls" + +Item { + id: root + + property int time_progress + + property alias value: password.input_text + + CustomTextInput { + id: password + + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + anchors.topMargin: 0 + + width: root.width + height: 70 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + + visible: !txSignRequest.isHWW + title_text: qsTr("Password") + + Component.onCompleted: { + password.isPassword = true + password.isHiddenText = true + } + } + + CustomProgressBar { + id: progress_bar + + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: password.bottom + anchors.topMargin: 16 + + width: root.width + + from: 0 + to: 120 + + value: root.time_progress + } + + Label { + id: progress_label + + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: progress_bar.bottom + anchors.topMargin: 8 + + text: Number(root.time_progress).toLocaleString() +" seconds left" + + color: "#45A6FF" + + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Normal + } + + function setActiveFocus() { + password.setActiveFocus() + } + +} diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml index 007573901..52edc91a9 100644 --- a/GUI/QtQuick/qml/Send/SelectInputs.qml +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -16,6 +16,7 @@ import QtQuick.Layouts 1.15 import "../BsStyles" import "../StyledControls" +import tx.inputs.model 1.0 ColumnLayout { @@ -48,20 +49,218 @@ ColumnLayout { border.width: 1 CustomTableView { + id: inputs_table - anchors.fill: parent - anchors.leftMargin: 16 - anchors.left : parent.left - anchors.rightMargin: 16 - anchors.right: parent.right + width: parent.width - 32 + height: parent.height - 12 + anchors.centerIn: parent model: txInputsModel - columnWidths: [0.2, 0.2, 0.2, 0.2, 0.2] + columnWidths: [0.7, 0.1, 0.1, 0.1] text_header_size: 12 cell_text_size: 13 copy_button_column_index: -1 - left_text_padding: 9 + + Component + { + id: cmpnt_address_item + + Item { + id: address_item + + CustomCheckBox { + id: checkbox_address + + anchors.left: parent.left + anchors.leftMargin: inputs_table.get_text_left_padding(model_row, model_column, model_is_expandable) + anchors.verticalCenter: parent.verticalCenter + + checked: model_selected + checkable: (model_row !== 0) + + onClicked: { + if (model_row !== 0) + txInputsModel.toggleSelection(model_row) + } + } + + Text { + id: internal_text + + anchors.left: checkbox_address.right + anchors.leftMargin: 8 + anchors.verticalCenter: parent.verticalCenter + + visible: model_column !== delete_button_column_index + + text: model_tableData + height: parent.height + verticalAlignment: Text.AlignVCenter + clip: true + + color: get_data_color(model_row, model_column) + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: model_row === 0 ? text_header_size : cell_text_size + + MouseArea { + anchors.fill: parent + + onClicked: { + if (model_row !== 0) + txInputsModel.toggle(model_row) + } + } + } + + Image { + id: arrow_icon + + visible: model_is_expandable + + anchors.left: internal_text.left + anchors.leftMargin: 10 + internal_text.contentWidth + anchors.verticalCenter: parent.verticalCenter + + width: 9 + height: 6 + sourceSize.width: 9 + sourceSize.height: 6 + + source: model_expanded? "qrc:/images/expanded.svg" : "qrc:/images/collapsed.svg" + + MouseArea { + anchors.fill: parent + + onClicked: { + if (model_row !== 0) + txInputsModel.toggle(model_row) + } + } + } + } + } + + CustomTableDelegateRow { + id: cmpnt_table_delegate + } + + function choose_row_source_component(row, column) + { + return (column === 0) ? cmpnt_address_item : cmpnt_table_delegate + } + + function get_text_left_padding(row, column, isExpandable) + { + return (!isExpandable && column === 0 && row !== 0) ? 61 : left_text_padding + } + + function get_line_left_padding(row, column, isExpandable) + { + return (!isExpandable && column === 0 && row !== 0) ? 51 : 0 + } + } + } + + Label { + id: inputs_details_title + + Layout.leftMargin: 26 + Layout.topMargin: 24 + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + text: qsTr("Inputs details") + + height : 19 + color: "#E2E7FF" + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Medium + } + + Rectangle { + id: total_rect + + Layout.topMargin: 16 + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + + width: 1084 + height: 82 + color: "#32394F" + + radius: 14 + + Label { + + id: trans_inputs_title + + anchors.top: parent.top + anchors.topMargin: 18 + anchors.left: parent.left + anchors.leftMargin: 20 + + text: qsTr("Transaction Inputs:") + + color: "#45A6FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: total_amount_title + + anchors.top: trans_inputs_title.bottom + anchors.topMargin: 14 + anchors.left: parent.left + anchors.leftMargin: 20 + + text: qsTr("Total Amount:") + + color: "#45A6FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: trans_inputs + + anchors.top: parent.top + anchors.topMargin: 18 + anchors.right: parent.right + anchors.rightMargin: 20 + + text: txInputsModel.nbTx + + color: "#FFFFFF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: amount_title + + anchors.top: trans_inputs.bottom + anchors.topMargin: 18 + anchors.right: parent.right + anchors.rightMargin: 20 + + text: txInputsModel.balance + + color: "#FFFFFF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal } } @@ -69,4 +268,9 @@ ColumnLayout { Layout.fillWidth: true Layout.fillHeight: true } + + function init() + { + + } } diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 7c15114db..341620e9f 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -52,12 +52,40 @@ CustomPopup { visible: false onSig_continue: (signature) => { + sign_trans_advanced.txSignRequest = signature + _stack_view.push(sign_trans_advanced) + sign_trans_advanced.init() } onSig_simple: { _stack_view.replace(simple_details) simple_details.init() } + + onSig_select_inputs: { + _stack_view.push(select_inputs) + select_inputs.init() + } + } + + SelectInputs { + id: select_inputs + visible: false + } + + SignTransactionAdvanced { + id: sign_trans_advanced + visible: false + + onSig_broadcast: { + root.close() + _stack_view.pop(null) + } + + onSig_time_finished: { + root.close() + _stack_view.pop(null) + } } function init() { diff --git a/GUI/QtQuick/qml/Send/SignTransaction.qml b/GUI/QtQuick/qml/Send/SignTransaction.qml index 83b26e03a..bce845382 100644 --- a/GUI/QtQuick/qml/Send/SignTransaction.qml +++ b/GUI/QtQuick/qml/Send/SignTransaction.qml @@ -314,52 +314,15 @@ ColumnLayout { } - CustomTextInput { + PasswordWithTimer { id: password - Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 - - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 - - visible: !txSignRequest.isHWW - title_text: qsTr("Password") - - Component.onCompleted: { - password.isPassword = true - password.isHiddenText = true - } - } - - CustomProgressBar { - id: progress_bar - Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.topMargin: 16 - - from: 0 - to: 120 - - value: layout.time_progress - } - - Label { - id: progress_label - - Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.topMargin: 8 - - text: Number(layout.time_progress).toLocaleString() +" seconds left" + Layout.topMargin: 10 - color: "#45A6FF" + width: 532 - font.pixelSize: 13 - font.family: "Roboto" - font.weight: Font.Normal + time_progress: layout.time_progress } Label { @@ -375,14 +338,14 @@ ColumnLayout { Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - enabled: (txSignRequest.isHWW && txSignRequest.isHWWready) || password.input_text.length + enabled: (txSignRequest.isHWW && txSignRequest.isHWWready) || password.value.length Component.onCompleted: { broadcast_but.preferred = true } function click_enter() { - bsApp.signAndBroadcast(txSignRequest, password.input_text) - password.input_text = "" + bsApp.signAndBroadcast(txSignRequest, password.value) + password.value = "" sig_broadcast() } } @@ -407,7 +370,7 @@ ColumnLayout { if (time_progress === 0) { running = false - password.input_text = "" + password.value = "" sig_time_finished() } } @@ -415,7 +378,7 @@ ColumnLayout { function init() { - password.input_text = "" + password.value = "" time_progress = 120 password.setActiveFocus() timer.running = true diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml new file mode 100644 index 000000000..e4d55f55a --- /dev/null +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -0,0 +1,432 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + + id: layout + + property var txSignRequest + + property int time_progress + + signal sig_broadcast() + signal sig_time_finished() + + height: 748 + width: 1132 + spacing: 0 + + CustomTitleLabel { + id: title + Layout.topMargin: 6 + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : title.height + text: "Sign Transaction" + } + + + RowLayout { + + id: rects_row + + Layout.fillWidth: true + Layout.preferredHeight : 312 + Layout.topMargin: 24 + + spacing: 20 + + Rectangle { + id: inputs_rect + + Layout.leftMargin: 22 + Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter + + width: 532 + height: 312 + color: "transparent" + + radius: 14 + + border.color: "#3C435A" + border.width: 1 + + CustomTableView { + id: table_sel_inputs + + width: parent.width - 28 + height: parent.height - 24 + anchors.centerIn: parent + + model: txInputsSelectedModel + columnWidths: [0.7, 0.1, 0, 0.2] + + text_header_size: 12 + cell_text_size: 13 + copy_button_column_index: -1 + + function get_text_left_padding(row, column) + { + return (row === 0 && column === 0) ? 0 : left_text_padding + } + + function get_data_color(row, column) + { + return row === 0 ? "#45A6FF" : null + } + } + } + + Rectangle { + id: outputs_rect + + Layout.rightMargin: 22 + Layout.alignment: Qt.AlignRight | Qt.AlingVCenter + + width: 532 + height: 312 + color: "#32394F" + + radius: 14 + + CustomTableView { + id: table_outputs + + width: parent.width - 28 + height: parent.height - 24 + anchors.centerIn: parent + + model:txOutputsModel + columnWidths: [0.744, 0.20, 0.056] + + text_header_size: 12 + cell_text_size: 13 + copy_button_column_index: -1 + delete_button_column_index: 2 + + onDeleteRequested: (row) => + { + txOutputsModel.delOutput(row) + } + + function get_text_left_padding(row, column) + { + return (row === 0 && column === 0) ? 0 : left_text_padding + } + + function get_data_color(row, column) + { + return row === 0 ? "#45A6FF" : null + } + } + } + } + + Rectangle { + id: details_rect + + Layout.fillWidth: true + Layout.preferredHeight : 100 + Layout.topMargin: 20 + + width: 1084 + height: 100 + color: "transparent" + + radius: 14 + + border.color: "#3C435A" + border.width: 1 + + Label { + + id: in_amount_title + + anchors.top: parent.top + anchors.topMargin: 16 + anchors.left: parent.left + anchors.leftMargin: 16 + + text: qsTr("Input amount:") + + color: "#7A88B0" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: in_amount + + anchors.top: parent.top + anchors.topMargin: 16 + anchors.right: parent.horizontalCenter + anchors.rightMargin: 24 + + text: txSignRequest.inputAmount + + color: "#E2E7FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: return_amount_title + + anchors.top: in_amount_title.bottom + anchors.topMargin: 10 + anchors.left: parent.left + anchors.leftMargin: 16 + + text: qsTr("Return amount:") + + color: "#7A88B0" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: return_amount + + anchors.top: in_amount.bottom + anchors.topMargin: 16 + anchors.right: parent.horizontalCenter + anchors.rightMargin: 24 + + text: txSignRequest.returnAmount + + color: "#E2E7FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: transaction_fee_title + + anchors.top: return_amount_title.bottom + anchors.topMargin: 10 + anchors.left: parent.left + anchors.leftMargin: 16 + + text: qsTr("Transaction fee:") + + color: "#7A88B0" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: transaction_fee + + anchors.top: return_amount.bottom + anchors.topMargin: 16 + anchors.right: parent.horizontalCenter + anchors.rightMargin: 24 + + text: txSignRequest.fee + + color: "#E2E7FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: transaction_size_title + + anchors.top: parent.top + anchors.topMargin: 16 + anchors.left: parent.horizontalCenter + anchors.leftMargin: 24 + + text: qsTr("Transaction size:") + + color: "#7A88B0" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: transaction_size + + anchors.top: parent.top + anchors.topMargin: 16 + anchors.right: parent.right + anchors.rightMargin: 16 + + text: txSignRequest.txSize + + color: "#E2E7FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: fee_per_byte_title + + anchors.top: transaction_size_title.bottom + anchors.topMargin: 10 + anchors.left: parent.horizontalCenter + anchors.leftMargin: 24 + + text: qsTr("Fee-per-byte:") + + color: "#7A88B0" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: fee_per_byte + + anchors.top: transaction_size.bottom + anchors.topMargin: 10 + anchors.right: parent.right + anchors.rightMargin: 16 + + text: txSignRequest.feePerByte + + color: "#E2E7FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: total_spent_title + + anchors.top: fee_per_byte_title.bottom + anchors.topMargin: 10 + anchors.left: parent.horizontalCenter + anchors.leftMargin: 24 + + text: qsTr("Total spent:") + + color: "#7A88B0" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + + id: total_spent + + anchors.top: fee_per_byte.bottom + anchors.topMargin: 10 + anchors.right: parent.right + anchors.rightMargin: 16 + + text: txSignRequest.outputAmount + + color: "#E2E7FF" + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + } + + PasswordWithTimer { + id: password + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.topMargin: 10 + + width: 530 + + time_progress: layout.time_progress + } + + Label { + Layout.fillWidth: true + Layout.fillHeight: true + } + + CustomButton { + id: broadcast_but + text: qsTr("Broadcast") + width: 1084 + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + enabled: (txSignRequest.isHWW && txSignRequest.isHWWready) || password.value.length + + Component.onCompleted: { + broadcast_but.preferred = true + } + function click_enter() { + bsApp.signAndBroadcast(txSignRequest, password.value) + password.value = "" + sig_broadcast() + } + } + + Keys.onEnterPressed: { + broadcast_but.click_enter() + } + + Keys.onReturnPressed: { + broadcast_but.click_enter() + } + + Timer { + id: timer + + interval: 1000 + running: true + repeat: true + onTriggered: { + layout.time_progress = layout.time_progress - 1 + + if (time_progress === 0) + { + running = false + password.value = "" + sig_time_finished() + } + } + } + + function init() + { + password.value = "" + time_progress = 120 + password.setActiveFocus() + timer.running = true + } + +} diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index bc25b32cb..81156331c 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -142,7 +142,7 @@ ColumnLayout { if(cur_value < bottom || cur_value > top) { amount_input.input_text = tempRequest.maxAmount - } + } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomCheckBox.qml b/GUI/QtQuick/qml/StyledControls/CustomCheckBox.qml index 06fa83a19..4e65ba731 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomCheckBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomCheckBox.qml @@ -17,24 +17,29 @@ CheckBox { id: control checked: true + spacing: 0 indicator: Rectangle { - implicitWidth: 16 - implicitHeight: 16 + implicitWidth: 18 + implicitHeight: 18 x: control.leftPadding y: parent.height / 2 - height / 2 - radius: 8 - border.color: "#45A6FF" + radius: 6 + border.color: "#416485" color: "transparent" - Rectangle { - width: 8 - height: 8 - x: 4 - y: 4 - radius: 4 - color: "#45A6FF" + Image { + id: check_icon + + anchors.centerIn: parent + + width: 10 + height: 7 + sourceSize.width: 10 + sourceSize.height: 7 + visible: control.checked + source: "qrc:/images/check.svg" } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml b/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml index f6a7bc479..9d577841b 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml @@ -1,4 +1,3 @@ - /* *********************************************************************************** @@ -14,42 +13,46 @@ import QtQuick.Controls 2.15 import "../BsStyles" -Row { - id: root +Component +{ + id: cmpnt - signal deleteRequested (int row) - signal copyRequested (string tableData) + Row { + id: root - Text { - id: internal_text + signal deleteRequested (int row) + signal copyRequested (string tableData) - visible: model_column !== delete_button_column_index + Text { + id: internal_text - text: model_tableData - height: parent.height - verticalAlignment: Text.AlignVCenter - clip: true + visible: model_column !== delete_button_column_index - color: model_dataColor - font.family: "Roboto" - font.weight: Font.Normal - font.pixelSize: model_row === 0 ? text_header_size : cell_text_size + text: model_tableData + height: parent.height + verticalAlignment: Text.AlignVCenter + clip: true - leftPadding: (model_row === 0 && model_column === 0 && left_first_header_padding >= 0) - ? left_first_header_padding : left_text_padding - } + color: get_data_color(model_row, model_column) + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: model_row === 0 ? text_header_size : cell_text_size - DeleteIconButton { - id: delete_icon - x: 0 - visible: model_column === delete_button_column_index && model_row > 0 - onDeleteRequested: root.deleteRequested(model_row) - } + leftPadding: get_text_left_padding(model_row, model_column, model_is_expandable) + } + + DeleteIconButton { + id: delete_icon + x: 0 + visible: model_column === delete_button_column_index && model_row > 0 + onDeleteRequested: root.deleteRequested(model_row) + } - CopyIconButton { - id: copy_icon - x: internal_text.contentWidth + copy_icon.width / 2 - visible: model_column === copy_button_column_index && model_row === selected_row_index - onCopy: root.copyRequested(model_tableData) + CopyIconButton { + id: copy_icon + x: internal_text.contentWidth + copy_icon.width / 2 + visible: model_column === copy_button_column_index && model_row === selected_row_index + onCopy: root.copyRequested(model_tableData) + } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index f0f569acf..dce7e1dc3 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -19,6 +19,8 @@ TableView { width: 1200 height: 200 + reuseItems: false + columnSpacing: 0 rowSpacing: 0 clip: true @@ -36,7 +38,6 @@ TableView { property int copy_button_column_index: 0 property int delete_button_column_index: -1 - property int left_first_header_padding: -1 property int left_text_padding: 10 property var columnWidths: ({}) @@ -95,13 +96,33 @@ TableView { property int cell_text_size: component.cell_text_size property int copy_button_column_index: component.copy_button_column_index property int selected_row_index: component.selected_row_index - property int left_first_header_padding: component.left_first_header_padding - property int left_text_padding: component.left_text_padding property int model_row: row property int model_column: column - property string model_tableData: tableData - property var model_dataColor: dataColor + property string model_tableData: (typeof tableData !== "undefined") ? tableData : ({}) + property bool model_selected: (typeof selected !== "undefined") ? selected : ({}) + property bool model_expanded: (typeof expanded !== "undefined") ? expanded : ({}) + property bool model_is_expandable: (typeof is_expandable !== "undefined") ? is_expandable : ({}) + + function get_text_left_padding(row, column, isExpandable) + { + if (typeof component.get_text_left_padding === "function") + return component.get_text_left_padding(row, column, isExpandable) + else + return left_text_padding + } + + function get_data_color(row, column) + { + if (typeof component.get_data_color === "function") + { + var res = component.get_data_color(row, column) + if (res!== null) + return res + } + + return (typeof dataColor !== "undefined") ? dataColor : ({}) + } Component.onCompleted: { delega.update_row_loader_size() @@ -132,13 +153,17 @@ TableView { { row_loader.width = delega.width row_loader.height = childrenRect.height - if (row_loader.width && row_loader.height && (row_loader.source !== "")) + if (row_loader.width && row_loader.height && !row_loader.sourceComponent) { - row_loader.setSource(choose_row_source(row, column)) + row_loader.sourceComponent = choose_row_source_component(row, column) } } Rectangle { + + anchors.left: parent.left + anchors.leftMargin: get_line_left_padding(row, column, is_expandable) + height: 1 width: parent.width color: BSStyle.tableSeparatorColor @@ -147,8 +172,17 @@ TableView { } } - function choose_row_source(row, column) + CustomTableDelegateRow { + id: cmpnt_table_delegate + } + + function choose_row_source_component(row, column) + { + return cmpnt_table_delegate + } + + function get_line_left_padding(row, column, isExpandable) { - return "CustomTableDelegateRow.qml" + return 0 } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index d9575b535..701627cd4 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -162,5 +162,10 @@ qml/StyledControls/CloseIconButton.qml qml/StyledControls/CustomTableDelegateRow.qml qml/Send/SelectInputs.qml + images/check.svg + images/collapsed.svg + images/expanded.svg + qml/Send/SignTransactionAdvanced.qml + qml/Send/PasswordWithTimer.qml From 8b030e2aefd1979a5f9b9996cc15ddff2ca5504c Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 15 Feb 2023 16:08:49 +0200 Subject: [PATCH 137/436] fix pr issues --- GUI/QtQuick/ColorScheme.h | 1 + GUI/QtQuick/TxInputsModel.cpp | 6 +++--- GUI/QtQuick/TxInputsSelectedModel.cpp | 3 +-- GUI/QtQuick/TxOutputsModel.cpp | 5 +++-- GUI/QtQuick/qml/BsStyles/BSStyle.qml | 15 ++++++++++----- GUI/QtQuick/qml/CreateWallet/ImportWallet.qml | 4 ++-- .../qml/CreateWallet/StartCreateWallet.qml | 2 +- .../qml/CreateWallet/SuccessNewWallet.qml | 4 ++-- .../qml/CreateWallet/TermsAndConditions.qml | 4 ++-- GUI/QtQuick/qml/CreateWallet/WalletSeed.qml | 2 +- .../qml/CreateWallet/WalletSeedSkipAccept.qml | 2 +- .../qml/CreateWallet/WalletSeedVerify.qml | 4 ++-- GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml | 2 +- GUI/QtQuick/qml/Pin/PinEntriesPopup.qml | 2 +- GUI/QtQuick/qml/Receive/ReceiveQrCode.qml | 2 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 16 +++++++++------- GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 15 +++++++++++---- GUI/QtQuick/qml/Send/PasswordWithTimer.qml | 2 +- GUI/QtQuick/qml/Send/RecvAddrTextInput.qml | 2 ++ GUI/QtQuick/qml/Send/SelectInputs.qml | 4 ++-- GUI/QtQuick/qml/Send/SignTransaction.qml | 2 +- GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml | 6 +++--- GUI/QtQuick/qml/Send/SimpleDetails.qml | 2 +- .../qml/StyledControls/CustomMessageDialog.qml | 2 +- GUI/QtQuick/qml/StyledControls/CustomPopup.qml | 2 +- .../qml/StyledControls/CustomTextEdit.qml | 2 +- .../qml/StyledControls/CustomTextInput.qml | 2 +- .../qml/StyledControls/CustomTextSwitch.qml | 2 +- .../qml/StyledControls/CustomTitleToolButton.qml | 2 +- GUI/QtQuick/qml/main.qml | 2 +- 30 files changed, 69 insertions(+), 52 deletions(-) diff --git a/GUI/QtQuick/ColorScheme.h b/GUI/QtQuick/ColorScheme.h index 748a64ea2..233745544 100644 --- a/GUI/QtQuick/ColorScheme.h +++ b/GUI/QtQuick/ColorScheme.h @@ -4,6 +4,7 @@ namespace ColorScheme { static const QColor tableHeaderColor = QColor("#7A88B0"); + static const QColor tableTextColor = QColor("#FFFFFF"); static const QColor transactionConfirmationZero = QColor("#EB6060"); static const QColor transactionConfirmationHigh = QColor("#67D2A3"); diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 6d22fcb7c..24c2fc12a 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -14,6 +14,7 @@ #include "BTCNumericTypes.h" #include "CoinSelection.h" #include "TxOutputsModel.h" +#include "ColorScheme.h" namespace { static const QHash kRoles{ @@ -67,9 +68,9 @@ QVariant TxInputsModel::data(const QModelIndex& index, int role) const QColor TxInputsModel::dataColor(int row, int col) const { if (row == 0) { - return QColor("#7A88B0"); + return ColorScheme::tableHeaderColor; } - return QColor("#FFFFFF"); + return ColorScheme::tableTextColor; } QHash TxInputsModel::roleNames() const @@ -128,7 +129,6 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) void TxInputsModel::toggle(int row) { - logger_->debug("[{}] samii begin row: {}", __func__, row); --row; auto& entry = data_[row]; if (!entry.txId.empty()) { diff --git a/GUI/QtQuick/TxInputsSelectedModel.cpp b/GUI/QtQuick/TxInputsSelectedModel.cpp index c0405d59c..3b4dc9bae 100644 --- a/GUI/QtQuick/TxInputsSelectedModel.cpp +++ b/GUI/QtQuick/TxInputsSelectedModel.cpp @@ -7,9 +7,8 @@ TxInputsSelectedModel::TxInputsSelectedModel (QObject *parent) connect (this, &TxInputsSelectedModel::rowsRemoved, this, &TxInputsSelectedModel::rowCountChanged); } -bool TxInputsSelectedModel::filterAcceptsRow (int sourceRow, const QModelIndex &sourceParent) const +bool TxInputsSelectedModel::filterAcceptsRow (int sourceRow, const QModelIndex & /*sourceParent*/) const { - Q_UNUSED(sourceParent) const auto inputsModel = qobject_cast (sourceModel ()); if (!inputsModel) { return false; diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index bae56c5e1..40e4476c7 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -12,6 +12,7 @@ #include #include "Address.h" #include "BTCNumericTypes.h" +#include "ColorScheme.h" namespace { static const QHash kRoles{ @@ -139,7 +140,7 @@ QVariant TxOutputsModel::getData(int row, int col) const QColor TxOutputsModel::dataColor(int row, int col) const { if (row == 0) { - return QColor("#7A88B0"); + return ColorScheme::tableHeaderColor; } - return QColor("#FFFFFF"); + return ColorScheme::tableTextColor; } diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index ec12aa47e..a62e12c0c 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -79,7 +79,9 @@ QtObject { //new properties - readonly property color buttonsStandardColor: "#3C435A" + readonly property color defaultGreyColor: "#3C435A" + + readonly property color buttonsStandardColor: defaultGreyColor readonly property color buttonsStandardPressedColor: "#232734" readonly property color buttonsStandardHoveredColor: "#2E3343" readonly property color buttonsStandardBorderColor: "#FFFFFF" @@ -89,7 +91,8 @@ QtObject { readonly property color buttonsPreferredHoveredColor: "#0085FF" readonly property color buttonsPreferredBorderColor: "#FFFFFF" - readonly property color buttonsTextColor: "#FFFFFF" + readonly property color buttonsTextColor: "#7A88B0" + readonly property color buttonsHeaderTextColor: "#FFFFFF" readonly property color buttonsDisabledTextColor: "#1C2130" readonly property color buttonsDisabledColor: "#32394F" @@ -99,7 +102,7 @@ QtObject { readonly property color comboBoxItemTextCurrentColor: "#7A88B0" readonly property color comboBoxItemHighlightedColor: "#45A6FF" - readonly property color comboBoxBorderColor: "#3C435A" + readonly property color comboBoxBorderColor: defaultGreyColor readonly property color comboBoxHoveredBorderColor: "#7A88B0" readonly property color comboBoxFocusedBorderColor: "#FFFFFF" readonly property color comboBoxPopupedBorderColor: "#45A6FF" @@ -107,7 +110,7 @@ QtObject { readonly property color comboBoxIndicatorColor: "#DCE2FF" readonly property color comboBoxPopupedIndicatorColor: "#45A6FF" - readonly property color tableSeparatorColor: "#3C435A" + readonly property color tableSeparatorColor: defaultGreyColor readonly property color tableCellBackgroundColor: "transparent" readonly property color tableCellSelectedBackgroundColor: "#22293B" @@ -117,9 +120,11 @@ QtObject { readonly property color listItemBorderColor: "#3C435A" readonly property color popupBackgroundColor: "#191E2A" - readonly property color popupBorderColor: "#3C435A" + readonly property color popupBorderColor: defaultGreyColor readonly property color transactionConfirmationZero: "#EB6060" readonly property color transactionConfirmationLow: "yellow" readonly property color transactionConfirmationHigh: "#67D2A3" + + readonly property color defaultBorderColor: defaultGreyColor } diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml index 86605e0e5..38919bbf3 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml @@ -73,7 +73,7 @@ ColumnLayout { Label { id: radbut_text - text: "Seed phrase type:" + text: qsTr("Seed phrase type:") Layout.leftMargin: 25 @@ -125,7 +125,7 @@ ColumnLayout { height: 1 - color: "#3C435A" + color: BsStyle.defaultGreyColor } GridView { diff --git a/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml b/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml index 937b84875..dc8523970 100644 --- a/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml @@ -23,7 +23,7 @@ ColumnLayout { id: title Layout.alignment: Qt.AlignCenter Layout.preferredHeight : title.height - text: "Create new wallet" + text: qsTr("Create new wallet") } Label { diff --git a/GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml b/GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml index f0b45a0c6..d3e8c0a31 100644 --- a/GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml @@ -20,7 +20,7 @@ ColumnLayout { id: title Layout.alignment: Qt.AlignCenter Layout.preferredHeight : title.height - text: "Success" + text: qsTr("Success") } @@ -41,7 +41,7 @@ ColumnLayout { Label { Layout.topMargin: 26 Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - text: "Your wallet has successfully been created" + text: qsTr("Your wallet has successfully been created") font.pixelSize: 14 font.family: "Roboto" font.weight: Font.Normal diff --git a/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml b/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml index 6ecb97446..9a960a69a 100644 --- a/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml +++ b/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml @@ -33,7 +33,7 @@ ColumnLayout { Layout.alignment: Qt.AlignLeft Layout.leftMargin: 24 Layout.preferredHeight : title.height - text: "Terms and conditions" + text: qsTr("Terms and conditions") } Label { @@ -79,7 +79,7 @@ ColumnLayout { Rectangle { Layout.fillWidth: true height: 1 - color: "#3C435A" + color: BsStyle.defaultGreyColor } Label { diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml index 0d68d026a..ee3515d9d 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml @@ -22,7 +22,7 @@ ColumnLayout { id: title Layout.alignment: Qt.AlignCenter Layout.preferredHeight : title.height - text: "Create new wallet" + text: qsTr("Create new wallet") } Label { diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml index c07fcb24c..1195e1360 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml @@ -22,7 +22,7 @@ ColumnLayout { id: title Layout.alignment: Qt.AlignCenter Layout.preferredHeight : title.height - text: "Verify your seed" + text: qsTr("Verify your seed") } Image { diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml index 7746c6495..15657bcc7 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml @@ -24,7 +24,7 @@ ColumnLayout { id: title Layout.alignment: Qt.AlignCenter Layout.preferredHeight : title.height - text: "Verify your seed" + text: qsTr("Verify your seed") } ListView { @@ -65,7 +65,7 @@ ColumnLayout { visible: !list.isValid - text: "Your words are wrong" + text: qsTr("Your words are wrong") Layout.leftMargin: 222 Layout.bottomMargin: 114 diff --git a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml index 12439d745..61aae5080 100644 --- a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml +++ b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml @@ -38,7 +38,7 @@ Window { radius: 16 height: 510 width: 430 - border.color : "#3C435A" + border.color : BsStyle.defaultBorderColor border.width : 1 Image { diff --git a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml index cb382eb68..3b99a9f19 100644 --- a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml +++ b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml @@ -40,7 +40,7 @@ Window { radius: 16 height: 610 width: 430 - border.color : "#3C435A" + border.color : BsStyle.defaultBorderColor border.width : 1 Image { diff --git a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml index b8a8bd27e..535380856 100644 --- a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml +++ b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml @@ -21,7 +21,7 @@ ColumnLayout { id: title Layout.alignment: Qt.AlignCenter Layout.preferredHeight : title.height - text: "Generate address" + text: qsTr("Generate address") } diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index ee8b92b3f..98275b0ba 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -38,7 +38,7 @@ ColumnLayout { font.pixelSize: 13 font.family: "Roboto" font.weight: Font.Normal - palette.buttonText: "#7A88B0" + palette.buttonText: BSStyle.buttonsHeaderTextColor text: qsTr("Simple") @@ -54,7 +54,7 @@ ColumnLayout { radius: 14 - border.color: "#3C435A" + border.color: BsStyle.defaultBorderColor border.width: 1 } @@ -102,7 +102,7 @@ ColumnLayout { radius: 16 - border.color: "#3C435A" + border.color: BSStyle.defaultBorderColor border.width: 1 ColumnLayout { @@ -170,7 +170,9 @@ ColumnLayout { width: 504 height: 70 - onCurrentIndexChanged: { + function change_index_handler() + { + txInputsModel.fee = parseFloat(fee_suggest_combo.currentValue) bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) txOutputsModel.clearOutputs() } @@ -185,7 +187,7 @@ ColumnLayout { Layout.topMargin: 196 Layout.alignment: Qt.AlignLeft | Qt.AlingTop - color: "#3C435A" + color: BsStyle.defaultGreyColor } @@ -298,7 +300,7 @@ ColumnLayout { radius: 16 - border.color: "#3C435A" + border.color: BsStyle.defaultBorderColor border.width: 1 ColumnLayout { @@ -414,7 +416,7 @@ ColumnLayout { Layout.topMargin: 30 Layout.alignment: Qt.AlignLeft | Qt.AlingTop - color: "#3C435A" + color: BsStyle.defaultGreyColor } CustomTableView { diff --git a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml index 17807706b..1e718d5aa 100644 --- a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml +++ b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml @@ -28,16 +28,23 @@ CustomComboBox { textRole: "text" valueRole: "value" - onActivated: (index_act) => { - txInputsModel.fee = parseFloat(fee_suggest_combo.currentValue) - } - Connections { target:feeSuggestions function onRowCountChanged () { + if (typeof change_index_handler === "function") + { + change_index_handler() + } fee_suggest_combo.currentIndex = 0 } } + + onCurrentIndexChanged: { + if (typeof change_index_handler === "function") + { + change_index_handler() + } + } } diff --git a/GUI/QtQuick/qml/Send/PasswordWithTimer.qml b/GUI/QtQuick/qml/Send/PasswordWithTimer.qml index 8fd0f0b40..fa79465d5 100644 --- a/GUI/QtQuick/qml/Send/PasswordWithTimer.qml +++ b/GUI/QtQuick/qml/Send/PasswordWithTimer.qml @@ -66,7 +66,7 @@ Item { anchors.top: progress_bar.bottom anchors.topMargin: 8 - text: Number(root.time_progress).toLocaleString() +" seconds left" + text: qsTr("%1 seconds left").arg (Number(root.time_progress).toLocaleString()) color: "#45A6FF" diff --git a/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml b/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml index 6d1ea166f..d4b7fe9f1 100644 --- a/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml +++ b/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml @@ -65,6 +65,8 @@ CustomTextInput { } } else + { rec_addr_input.isValid = true + } } } diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml index 52edc91a9..3a64b4390 100644 --- a/GUI/QtQuick/qml/Send/SelectInputs.qml +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -30,7 +30,7 @@ ColumnLayout { id: title Layout.alignment: Qt.AlignCenter Layout.preferredHeight : title.height - text: "Select inputs" + text: qsTr("Select inputs") } Rectangle { @@ -45,7 +45,7 @@ ColumnLayout { radius: 16 - border.color: "#3C435A" + border.color: BsStyle.defaultBorderColor border.width: 1 CustomTableView { diff --git a/GUI/QtQuick/qml/Send/SignTransaction.qml b/GUI/QtQuick/qml/Send/SignTransaction.qml index bce845382..e7cd5a9f4 100644 --- a/GUI/QtQuick/qml/Send/SignTransaction.qml +++ b/GUI/QtQuick/qml/Send/SignTransaction.qml @@ -26,7 +26,7 @@ ColumnLayout { Layout.topMargin: 6 Layout.alignment: Qt.AlignTop | Qt.AlignHCenter Layout.preferredHeight : title.height - text: "Sign Transaction" + text: qsTr("Sign Transaction") } Label { diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml index e4d55f55a..b29c204e1 100644 --- a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -26,7 +26,7 @@ ColumnLayout { Layout.topMargin: 6 Layout.alignment: Qt.AlignTop | Qt.AlignHCenter Layout.preferredHeight : title.height - text: "Sign Transaction" + text: qsTr("Sign Transaction") } @@ -52,7 +52,7 @@ ColumnLayout { radius: 14 - border.color: "#3C435A" + border.color: BsStyle.defaultBorderColor border.width: 1 CustomTableView { @@ -139,7 +139,7 @@ ColumnLayout { radius: 14 - border.color: "#3C435A" + border.color: BsStyle.defaultBorderColor border.width: 1 Label { diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 81156331c..cac4affe2 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -54,7 +54,7 @@ ColumnLayout { radius: 14 - border.color: "#3C435A" + border.color: BsStyle.defaultBorderColor border.width: 1 } diff --git a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml index 54219f294..6c3b9829d 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml @@ -36,7 +36,7 @@ Window { anchors.fill: parent - border.color : "#3C435A" + border.color : BsStyle.defaultBorderColor border.width : 1 Label { diff --git a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml index c0c20a7f7..cd6d89668 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml @@ -38,7 +38,7 @@ Window { radius: 16 height: stack_create_wallet.height + navig_bar_width width: stack_create_wallet.width - border.color : "#3C435A" + border.color : BsStyle.defaultBorderColor border.width : 1 Image { diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml b/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml index c2add28f0..f4db06c5d 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml @@ -35,7 +35,7 @@ Rectangle { opacity: 1 radius: 14 - border.color: input.activeFocus ? "#45A6FF" : "#3C435A" + border.color: input.activeFocus ? "#45A6FF" : BsStyle.defaultBorderColor border.width: 1 Label { diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index c4f3c264c..368d48008 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -43,7 +43,7 @@ Rectangle { opacity: 1 radius: 14 - border.color: isValid ? (input.activeFocus ? "#45A6FF" : "#3C435A") : "#EB6060" + border.color: isValid ? (input.activeFocus ? "#45A6FF" : BsStyle.defaultBorderColor) : "#EB6060" border.width: 1 Label { diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml b/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml index 08d8af100..508b522b0 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml @@ -23,7 +23,7 @@ Rectangle { color: "transparent" radius: 37 - border.color : "#3C435A" + border.color : BsStyle.defaultBorderColor border.width : 1 Rectangle { diff --git a/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml b/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml index d5f88057f..a0e6e9dcc 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml @@ -49,7 +49,7 @@ ToolButton { anchors.topMargin: -border.width anchors.bottomMargin: -border.width border.width: 1 - border.color:"#3C435A" + border.color: BsStyle.defaultBorderColor } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 0e00be539..ef4cd06c4 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -242,7 +242,7 @@ ApplicationWindow { Rectangle { width: parent.width height: 1 - color: "#3C435A" + color: BsStyle.defaultGreyColor } } From 0f3dbf3a3b4bc719115d424f8b430bddbe0fef65 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 15 Feb 2023 22:34:25 +0200 Subject: [PATCH 138/436] qml: advansed send - fix bugs --- GUI/QtQuick/QtQuickAdapter.cpp | 2 -- GUI/QtQuick/qml/BsStyles/BSStyle.qml | 7 +++++-- GUI/QtQuick/qml/CreateWallet/ImportWallet.qml | 2 +- .../qml/CreateWallet/TermsAndConditions.qml | 2 +- GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml | 2 +- GUI/QtQuick/qml/Pin/PinEntriesPopup.qml | 2 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 8 ++++---- GUI/QtQuick/qml/Send/AmountInput.qml | 14 ++++++++++---- GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 2 +- GUI/QtQuick/qml/Send/RecvAddrTextInput.qml | 3 +++ GUI/QtQuick/qml/Send/SelectInputs.qml | 4 +--- GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml | 4 ++-- GUI/QtQuick/qml/Send/SimpleDetails.qml | 2 +- .../qml/StyledControls/CustomMessageDialog.qml | 2 +- GUI/QtQuick/qml/StyledControls/CustomPopup.qml | 2 +- GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml | 4 +++- GUI/QtQuick/qml/StyledControls/CustomTextInput.qml | 10 +++++++--- .../qml/StyledControls/CustomTextSwitch.qml | 2 +- .../qml/StyledControls/CustomTitleToolButton.qml | 2 +- GUI/QtQuick/qml/main.qml | 2 +- 20 files changed, 46 insertions(+), 32 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 439838b1d..468600f72 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -218,8 +218,6 @@ void QtQuickAdapter::run(int &argc, char **argv) qmlRegisterInterface("QTxDetails"); qmlRegisterUncreatableMetaObject(WalletBalance::staticMetaObject, "wallet.balance" , 1, 0, "WalletBalance", tr("Error: only enums")); - qmlRegisterUncreatableMetaObject(TxInputsModel::staticMetaObject, "tx.inputs.model" - , 1, 0, "TxInputsModel", tr("Error: only enums")); qmlRegisterType("terminal.models", 1, 0, "TransactionFilterModel"); qmlRegisterType("terminal.models", 1, 0, "TransactionForAddressFilterModel"); diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index a62e12c0c..1d7cf4b94 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -91,8 +91,8 @@ QtObject { readonly property color buttonsPreferredHoveredColor: "#0085FF" readonly property color buttonsPreferredBorderColor: "#FFFFFF" - readonly property color buttonsTextColor: "#7A88B0" - readonly property color buttonsHeaderTextColor: "#FFFFFF" + readonly property color buttonsTextColor: "#FFFFFF" + readonly property color buttonsHeaderTextColor: "#7A88B0" readonly property color buttonsDisabledTextColor: "#1C2130" readonly property color buttonsDisabledColor: "#32394F" @@ -127,4 +127,7 @@ QtObject { readonly property color transactionConfirmationHigh: "#67D2A3" readonly property color defaultBorderColor: defaultGreyColor + + //not colors + readonly property int defaultPrecision: 8 } diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml index 38919bbf3..249081ced 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml @@ -125,7 +125,7 @@ ColumnLayout { height: 1 - color: BsStyle.defaultGreyColor + color: BSStyle.defaultGreyColor } GridView { diff --git a/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml b/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml index 9a960a69a..2695ca3fc 100644 --- a/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml +++ b/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml @@ -79,7 +79,7 @@ ColumnLayout { Rectangle { Layout.fillWidth: true height: 1 - color: BsStyle.defaultGreyColor + color: BSStyle.defaultGreyColor } Label { diff --git a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml index 61aae5080..26dab0955 100644 --- a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml +++ b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml @@ -38,7 +38,7 @@ Window { radius: 16 height: 510 width: 430 - border.color : BsStyle.defaultBorderColor + border.color : BSStyle.defaultBorderColor border.width : 1 Image { diff --git a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml index 3b99a9f19..2c060e950 100644 --- a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml +++ b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml @@ -40,7 +40,7 @@ Window { radius: 16 height: 610 width: 430 - border.color : BsStyle.defaultBorderColor + border.color : BSStyle.defaultBorderColor border.width : 1 Image { diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 98275b0ba..6a175232f 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -54,7 +54,7 @@ ColumnLayout { radius: 14 - border.color: BsStyle.defaultBorderColor + border.color: BSStyle.defaultBorderColor border.width: 1 } @@ -187,7 +187,7 @@ ColumnLayout { Layout.topMargin: 196 Layout.alignment: Qt.AlignLeft | Qt.AlingTop - color: BsStyle.defaultGreyColor + color: BSStyle.defaultGreyColor } @@ -300,7 +300,7 @@ ColumnLayout { radius: 16 - border.color: BsStyle.defaultBorderColor + border.color: BSStyle.defaultBorderColor border.width: 1 ColumnLayout { @@ -416,7 +416,7 @@ ColumnLayout { Layout.topMargin: 30 Layout.alignment: Qt.AlignLeft | Qt.AlingTop - color: BsStyle.defaultGreyColor + color: BSStyle.defaultGreyColor } CustomTableView { diff --git a/GUI/QtQuick/qml/Send/AmountInput.qml b/GUI/QtQuick/qml/Send/AmountInput.qml index 336697fd7..61cddfbe5 100644 --- a/GUI/QtQuick/qml/Send/AmountInput.qml +++ b/GUI/QtQuick/qml/Send/AmountInput.qml @@ -27,12 +27,18 @@ CustomTextInput { property string prev_text : "" onTextEdited : { - if (tempRequest == null) { - amount_input.input_text = "0" - } +// if (tempRequest === null) { +// amount_input.input_text = "0" +// } amount_input.input_text = amount_input.input_text.replace(",", ".") + var indexOfDot = amount_input.input_text.indexOf(".") + if (indexOfDot >= 0) + { + amount_input.input_text = amount_input.input_text.substring(0, + Math.min(indexOfDot+9, amount_input.input_text.length)) + } if (amount_input.input_text.startsWith("0") && !amount_input.input_text.startsWith("0.") && amount_input.input_text.length > 1) @@ -41,7 +47,7 @@ CustomTextInput { + amount_input.input_text.substring(1, amount_input.input_text.length) } try { - var input_number = Number.fromLocaleString(Qt.locale("en_US"), amount_input.input_text) + var input_number = Number.fromLocaleString(Qt.locale("en_US"), amount_input.input_text) } catch (error) { diff --git a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml index 1e718d5aa..2bfb74a98 100644 --- a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml +++ b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml @@ -33,11 +33,11 @@ CustomComboBox { target:feeSuggestions function onRowCountChanged () { + fee_suggest_combo.currentIndex = 0 if (typeof change_index_handler === "function") { change_index_handler() } - fee_suggest_combo.currentIndex = 0 } } diff --git a/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml b/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml index d4b7fe9f1..97182e185 100644 --- a/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml +++ b/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml @@ -23,6 +23,9 @@ CustomTextInput { signal focus_next() + input_right_margin: paste_but.anchors.rightMargin + + paste_but.width + 16 + //aliases title_text: qsTr("Receiver address") diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml index 3a64b4390..819994461 100644 --- a/GUI/QtQuick/qml/Send/SelectInputs.qml +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -16,8 +16,6 @@ import QtQuick.Layouts 1.15 import "../BsStyles" import "../StyledControls" -import tx.inputs.model 1.0 - ColumnLayout { id: layout @@ -45,7 +43,7 @@ ColumnLayout { radius: 16 - border.color: BsStyle.defaultBorderColor + border.color: BSStyle.defaultBorderColor border.width: 1 CustomTableView { diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml index b29c204e1..296d9740f 100644 --- a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -52,7 +52,7 @@ ColumnLayout { radius: 14 - border.color: BsStyle.defaultBorderColor + border.color: BSStyle.defaultBorderColor border.width: 1 CustomTableView { @@ -139,7 +139,7 @@ ColumnLayout { radius: 14 - border.color: BsStyle.defaultBorderColor + border.color: BSStyle.defaultBorderColor border.width: 1 Label { diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index cac4affe2..7507b04eb 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -54,7 +54,7 @@ ColumnLayout { radius: 14 - border.color: BsStyle.defaultBorderColor + border.color: BSStyle.defaultBorderColor border.width: 1 } diff --git a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml index 6c3b9829d..bb443aea0 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml @@ -36,7 +36,7 @@ Window { anchors.fill: parent - border.color : BsStyle.defaultBorderColor + border.color : BSStyle.defaultBorderColor border.width : 1 Label { diff --git a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml index cd6d89668..132a2498e 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml @@ -38,7 +38,7 @@ Window { radius: 16 height: stack_create_wallet.height + navig_bar_width width: stack_create_wallet.width - border.color : BsStyle.defaultBorderColor + border.color : BSStyle.defaultBorderColor border.width : 1 Image { diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml b/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml index f4db06c5d..50aa7d22c 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml @@ -35,7 +35,7 @@ Rectangle { opacity: 1 radius: 14 - border.color: input.activeFocus ? "#45A6FF" : BsStyle.defaultBorderColor + border.color: input.activeFocus ? "#45A6FF" : BSStyle.defaultBorderColor border.width: 1 Label { @@ -59,6 +59,8 @@ Rectangle { focus: true activeFocusOnTab: true + clip: true + anchors.top: rect.top anchors.topMargin: 35 anchors.left: rect.left diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index 368d48008..75acdd2ad 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -31,6 +31,8 @@ Rectangle { property bool isPassword: false property bool isHiddenText: false + property int input_right_margin: 16 + property var completer: null signal textEdited() @@ -43,7 +45,7 @@ Rectangle { opacity: 1 radius: 14 - border.color: isValid ? (input.activeFocus ? "#45A6FF" : BsStyle.defaultBorderColor) : "#EB6060" + border.color: isValid ? (input.activeFocus ? "#45A6FF" : BSStyle.defaultBorderColor) : "#EB6060" border.width: 1 Label { @@ -67,11 +69,13 @@ Rectangle { focus: true activeFocusOnTab: true + clip: true + anchors.top: rect.top anchors.topMargin: 35 anchors.left: rect.left - anchors.leftMargin: title.anchors.leftMargin - width: rect.width - 2*title.anchors.leftMargin + anchors.leftMargin: 16 + width: rect.width - 16 - input_right_margin height: 19 echoMode: isHiddenText? TextInput.Password : TextInput.Normal diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml b/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml index 508b522b0..2abca6aa9 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml @@ -23,7 +23,7 @@ Rectangle { color: "transparent" radius: 37 - border.color : BsStyle.defaultBorderColor + border.color : BSStyle.defaultBorderColor border.width : 1 Rectangle { diff --git a/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml b/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml index a0e6e9dcc..feb328f28 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml @@ -49,7 +49,7 @@ ToolButton { anchors.topMargin: -border.width anchors.bottomMargin: -border.width border.width: 1 - border.color: BsStyle.defaultBorderColor + border.color: BSStyle.defaultBorderColor } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index ef4cd06c4..42c9c9a3e 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -242,7 +242,7 @@ ApplicationWindow { Rectangle { width: parent.width height: 1 - color: BsStyle.defaultGreyColor + color: BSStyle.defaultGreyColor } } From b34778b054c41dc0828f2680f2ead2e1a0594d67 Mon Sep 17 00:00:00 2001 From: YZ Date: Mon, 13 Feb 2023 22:10:09 +0100 Subject: [PATCH 139/436] Wallet properties --- GUI/QtQuick/AddressListModel.cpp | 21 +- GUI/QtQuick/AddressListModel.h | 4 + GUI/QtQuick/CMakeLists.txt | 4 +- GUI/QtQuick/QtQuickAdapter.cpp | 39 ++ GUI/QtQuick/QtQuickAdapter.h | 6 + GUI/QtQuick/TxListModel.cpp | 19 +- GUI/QtQuick/TxListModel.h | 3 +- GUI/QtQuick/images/delete_icon.svg | 16 + GUI/QtQuick/images/eye_icon.svg | 4 + GUI/QtQuick/images/lock_icon.svg | 4 + GUI/QtQuick/images/scan_icon.svg | 5 + GUI/QtQuick/images/shield_icon.svg | 3 + GUI/QtQuick/images/wallet_icon_warn.svg | 8 + GUI/QtQuick/qml/BsStyles/BSStyle.qml | 7 + GUI/QtQuick/qml/ExplorerTX.qml | 4 +- GUI/QtQuick/qml/OverviewPage.qml | 14 +- .../StyledControls/InputOutputTableView.qml | 4 +- GUI/QtQuick/qml/TransactionDetails.qml | 23 +- GUI/QtQuick/qml/TransactionsPage.qml | 3 + .../qml/WalletProperties/ChangePassword.qml | 141 +++++++ .../qml/WalletProperties/DeleteWallet.qml | 99 +++++ .../qml/WalletProperties/DeleteWalletWarn.qml | 78 ++++ .../qml/WalletProperties/ExportWOWallet.qml | 143 ++++++++ .../WalletProperties/ExportWOWalletAuth.qml | 94 +++++ .../WalletPropertiesPopup.qml | 346 ++++++++++++++++++ .../qml/WalletProperties/WalletSeed.qml | 64 ++++ .../qml/WalletProperties/WalletSeedAuth.qml | 95 +++++ GUI/QtQuick/qtquick.qrc | 17 + GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 121 ++++++ GUI/QtQuick/viewmodels/WalletPropertiesVM.h | 82 +++++ 30 files changed, 1448 insertions(+), 23 deletions(-) create mode 100644 GUI/QtQuick/images/delete_icon.svg create mode 100644 GUI/QtQuick/images/eye_icon.svg create mode 100644 GUI/QtQuick/images/lock_icon.svg create mode 100644 GUI/QtQuick/images/scan_icon.svg create mode 100644 GUI/QtQuick/images/shield_icon.svg create mode 100644 GUI/QtQuick/images/wallet_icon_warn.svg create mode 100644 GUI/QtQuick/qml/WalletProperties/ChangePassword.qml create mode 100644 GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml create mode 100644 GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml create mode 100644 GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml create mode 100644 GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml create mode 100644 GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml create mode 100644 GUI/QtQuick/qml/WalletProperties/WalletSeed.qml create mode 100644 GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml create mode 100644 GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp create mode 100644 GUI/QtQuick/viewmodels/WalletPropertiesVM.h diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index 197d34a05..ec2250919 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -53,8 +53,8 @@ QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const switch (index.column()) { case 0: return table_.at(row).at(0); - case 1: return QString::number(pendingBalances_.at(addresses_.at(row).id()).nbTx); - case 2: return QString::number(pendingBalances_.at(addresses_.at(row).id()).balance / BTCNumericTypes::BalanceDivider, 'f', 8); + case 1: return QString::number(getTransactionCount(addresses_.at(row).id())); + case 2: return QString::number(getAddressBalance(addresses_.at(row).id()), 'f', 8); case 3: return table_.at(row).at(1); default: return QString{}; } @@ -155,3 +155,20 @@ void QmlAddressListModel::reset(const std::string& expectedWalletId) table_.clear(); endResetModel(); } + + +quint32 QmlAddressListModel::getTransactionCount(const BinaryData& address) const +{ + if (pendingBalances_.count(address) > 0) { + return pendingBalances_.at(address).nbTx; + } + return 0; +} + +float QmlAddressListModel::getAddressBalance(const BinaryData& address) const +{ + if (pendingBalances_.count(address) > 0) { + return pendingBalances_.at(address).balance / BTCNumericTypes::BalanceDivider; + } + return 0; +} diff --git a/GUI/QtQuick/AddressListModel.h b/GUI/QtQuick/AddressListModel.h index 01b18735b..9e8a41886 100644 --- a/GUI/QtQuick/AddressListModel.h +++ b/GUI/QtQuick/AddressListModel.h @@ -48,6 +48,10 @@ class QmlAddressListModel: public QAbstractTableModel void updateRow(const BinaryData& addr, uint64_t bal, uint32_t nbTx); void reset(const std::string& expectedWalletId); +private: + quint32 getTransactionCount(const BinaryData& address) const; + float getAddressBalance(const BinaryData& address) const; + private: std::shared_ptr logger_; const QStringList header_; diff --git a/GUI/QtQuick/CMakeLists.txt b/GUI/QtQuick/CMakeLists.txt index 2aa835366..f1777b366 100644 --- a/GUI/QtQuick/CMakeLists.txt +++ b/GUI/QtQuick/CMakeLists.txt @@ -13,10 +13,10 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.3) PROJECT(${TERMINAL_GUI_QTQUICK_NAME}) -FILE(GLOB SOURCES +FILE(GLOB_RECURSE SOURCES *.cpp ) -FILE(GLOB HEADERS +FILE(GLOB_RECURSE HEADERS *.h ) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 468600f72..3ea85f22c 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -42,6 +42,7 @@ #include "WalletBalancesModel.h" #include "TransactionFilterModel.h" #include "TransactionForAddressFilterModel.h" +#include "viewmodels/WalletPropertiesVM.h" #include "common.pb.h" #include "hardware_wallet.pb.h" @@ -55,6 +56,24 @@ using namespace bs::message; namespace { std::shared_ptr staticLogger; + + static inline QString encTypeToString(bs::wallet::EncryptionType enc) + { + switch (enc) { + case bs::wallet::EncryptionType::Unencrypted : + return QObject::tr("Unencrypted"); + + case bs::wallet::EncryptionType::Password : + return QObject::tr("Password"); + + case bs::wallet::EncryptionType::Auth : + return QObject::tr("Auth eID"); + + case bs::wallet::EncryptionType::Hardware : + return QObject::tr("Hardware Security Module"); + }; + return QObject::tr("Unknown"); + } } // redirect qDebug() to the log // stdout redirected to parent process @@ -127,6 +146,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) , userSigner_(std::make_shared(TerminalUsers::Signer)) , userHWW_(bs::message::UserTerminal::create(bs::message::TerminalUsers::HWWallets)) , txTypes_({ tr("All transactions") }) + , walletPropertiesVM_(std::make_unique()) { staticLogger = logger; addrModel_ = new QmlAddressListModel(logger, this); @@ -220,6 +240,7 @@ void QtQuickAdapter::run(int &argc, char **argv) , 1, 0, "WalletBalance", tr("Error: only enums")); qmlRegisterType("terminal.models", 1, 0, "TransactionFilterModel"); qmlRegisterType("terminal.models", 1, 0, "TransactionForAddressFilterModel"); + qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); //need to read files in qml qputenv("QML_XHR_ALLOW_FILE_READ", QByteArray("1")); @@ -848,6 +869,19 @@ void QtQuickAdapter::walletSelected(int index) msg.set_wallet_get(walletId); const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); walletInfoReq_[msgId] = walletName; + + if (hdWallets_.count(walletId) > 0) { + walletPropertiesVM_->setWalletInfo({ + QString::fromStdString(hdWallets_.at(walletId).name), + QString::fromStdString(hdWallets_.at(walletId).description), + QString::fromStdString(hdWallets_.at(walletId).ids.size() > 0 ? hdWallets_.at(walletId).ids[0] : std::string()), + QString::fromLatin1("0/") + QString::number(hdWallets_.at(walletId).leaves.size()), + hdWallets_.at(walletId).encryptionTypes.size() > 0 ? encTypeToString(hdWallets_.at(walletId).encryptionTypes[0]) : QString(), + 0, + 0, + 0 + }); + } }); } @@ -1771,3 +1805,8 @@ void QtQuickAdapter::startAddressSearch(const QString& s) pushRequest(user_, userBlockchain_, msg.SerializeAsString() , {}, 10, std::chrono::milliseconds{ 230 }); } + +qtquick_gui::WalletPropertiesVM* QtQuickAdapter::walletProperitesVM() const +{ + return walletPropertiesVM_.get(); +} diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index fc6395cbd..1f95c1b8c 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -24,6 +24,7 @@ #include "TxListModel.h" #include "UiUtils.h" #include "Wallets/SignContainer.h" +#include "viewmodels/WalletPropertiesVM.h" namespace bs { namespace gui { @@ -152,6 +153,9 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_PROPERTY(bool scanningDevices READ scanningDevices NOTIFY scanningChanged) bool scanningDevices() const; + Q_PROPERTY(qtquick_gui::WalletPropertiesVM* walletProperitesVM READ walletProperitesVM CONSTANT) + qtquick_gui::WalletPropertiesVM* walletProperitesVM() const; + // QML-invokable methods Q_INVOKABLE QStringList newSeedPhrase(); Q_INVOKABLE QStringList completeBIP39dic(const QString& prefix); @@ -286,6 +290,8 @@ private slots: std::map txDetailReqs_; std::map settingsCache_; std::set expTxAddrReqs_, expTxAddrInReqs_; + + std::unique_ptr walletPropertiesVM_; }; #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 7358070a9..846f33eca 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -661,8 +661,8 @@ void QTxDetails::setDetails(const bs::sync::TXWalletDetails& details) details_.outputAddresses.push_back(details.changeAddress); } QMetaObject::invokeMethod(this, [this] { - inputsModel_ = new TxInOutModel(details_.inputAddresses, this); - outputsModel_ = new TxInOutModel(details_.outputAddresses, this); + inputsModel_ = new TxInOutModel(details_.inputAddresses, tr("Input"), this); + outputsModel_ = new TxInOutModel(details_.outputAddresses, tr("Output"), this); emit updated(); }); } @@ -750,9 +750,11 @@ quint32 QTxDetails::height() const return details_.tx.getTxHeight(); } -TxInOutModel::TxInOutModel(const std::vector& data, QObject* parent) - : QAbstractTableModel(parent), data_(data) - , header_{ tr("Address"), tr("Amount"), tr("Wallet") } +TxInOutModel::TxInOutModel(const std::vector& data, const QString& type, QObject* parent) + : QAbstractTableModel(parent) + , data_(data) + , type_(type) + , header_{ tr("Type"), tr("Address"), tr("Amount"), tr("Wallet") } {} int TxInOutModel::rowCount(const QModelIndex&) const @@ -804,9 +806,10 @@ QString TxInOutModel::getData(int row, int col) const } try { switch (col) { - case 0: return QString::fromStdString(data_.at(row - 1).address.display()); - case 1: return QString::fromStdString(data_.at(row - 1).valueStr); - case 2: return QString::fromStdString(data_.at(row - 1).walletName); + case 0: return type_; + case 1: return QString::fromStdString(data_.at(row - 1).address.display()); + case 2: return QString::fromStdString(data_.at(row - 1).valueStr); + case 3: return QString::fromStdString(data_.at(row - 1).walletName); default: break; } } diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index a4bd43cc2..31e32fb3f 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -130,7 +130,7 @@ class TxInOutModel : public QAbstractTableModel enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole, WidthRole, TxHashRole }; - TxInOutModel(const std::vector& data, QObject* parent = nullptr); + TxInOutModel(const std::vector& data, const QString& type, QObject* parent = nullptr); int rowCount(const QModelIndex & = QModelIndex()) const override; int columnCount(const QModelIndex & = QModelIndex()) const override; @@ -143,6 +143,7 @@ class TxInOutModel : public QAbstractTableModel float colWidth(int col) const; private: + const QString type_; const QStringList header_; const std::vector data_; }; diff --git a/GUI/QtQuick/images/delete_icon.svg b/GUI/QtQuick/images/delete_icon.svg new file mode 100644 index 000000000..97e80d653 --- /dev/null +++ b/GUI/QtQuick/images/delete_icon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/GUI/QtQuick/images/eye_icon.svg b/GUI/QtQuick/images/eye_icon.svg new file mode 100644 index 000000000..95d0d6da7 --- /dev/null +++ b/GUI/QtQuick/images/eye_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/GUI/QtQuick/images/lock_icon.svg b/GUI/QtQuick/images/lock_icon.svg new file mode 100644 index 000000000..b4026057d --- /dev/null +++ b/GUI/QtQuick/images/lock_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/GUI/QtQuick/images/scan_icon.svg b/GUI/QtQuick/images/scan_icon.svg new file mode 100644 index 000000000..6fbea33cd --- /dev/null +++ b/GUI/QtQuick/images/scan_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/GUI/QtQuick/images/shield_icon.svg b/GUI/QtQuick/images/shield_icon.svg new file mode 100644 index 000000000..97a745843 --- /dev/null +++ b/GUI/QtQuick/images/shield_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/images/wallet_icon_warn.svg b/GUI/QtQuick/images/wallet_icon_warn.svg new file mode 100644 index 000000000..07e382b16 --- /dev/null +++ b/GUI/QtQuick/images/wallet_icon_warn.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index 1d7cf4b94..9664c8d69 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -130,4 +130,11 @@ QtObject { //not colors readonly property int defaultPrecision: 8 + + readonly property color transactionTypeSent: "#EB6060" + readonly property color transactionTypeInternal: "cyan" + readonly property color transactionTypeReceived: "#67D2A3" + + readonly property color exportWalletLabelBackground: "#32394F" + readonly property color exportWalletLabelNameColor: "#45A6FF" } diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index f3ed2e0ad..85b2a17a1 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -222,7 +222,7 @@ Item { height: parent.height - 20 model: tx.inputs copy_button_column_index: -1 - columnWidths: [0.7, 0.2, 0.1] + columnWidths: [0.0, 0.7, 0.2, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) // TODO: change constant 261 with C++ defined enum @@ -269,7 +269,7 @@ Item { height: parent.height - 20 model: tx.outputs copy_button_column_index: -1 - columnWidths: [0.7, 0.2, 0.1] + columnWidths: [0.0, 0.7, 0.2, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) // TODO: change constant 257 with C++ defined enum diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index ddcba2d38..a036aad7b 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -16,6 +16,7 @@ import QtQml.Models 2 import "Overview" as Overview import "StyledControls" import "BsStyles" +import "WalletProperties" //import "BsControls" //import "BsDialogs" //import "js/helper.js" as JsHelper @@ -37,10 +38,21 @@ Item { visible: false } + WalletPropertiesPopup { + id: walletProperties + visible: false + + wallet_properties_vm: bsApp.walletProperitesVM + } + Overview.OverviewPanel { anchors.fill: parent - onRequestWalletProperties: console.log("Nothing to do") + onRequestWalletProperties: { + walletProperties.show() + walletProperties.raise() + walletProperties.requestActivate() + } onCreateNewWallet: overview.newWalletClicked() onWalletIndexChanged: overview.curWalletIndexChanged(index) onOpenAddressDetails: (address, transactions, balance, comment, asset_type, type, wallet) => { diff --git a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml index e263d8fd6..bb0f5a8be 100644 --- a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml @@ -55,7 +55,7 @@ CustomTableView { Text { id: internal_text - visible: column !== 0 || row === 0 + visible: column !== 1 || row === 0 text: tableData height: parent.height verticalAlignment: row === 0 ? Text.AlignVCenter : Text.AlignTop @@ -72,7 +72,7 @@ CustomTableView { Column { spacing: 8 - visible: column === 0 && row !== 0 + visible: column === 1 && row !== 0 width: parent.width anchors.centerIn: parent diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index e047a1217..a069bb6c0 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -137,8 +137,21 @@ Popup { width: 170 } Text { + function define_color(value) { + if (value === 'Sent') { + return BSStyle.transactionTypeSent + } + else if (value === 'Received') { + return BSStyle.transactionTypeRecevied + } + else if (value === 'Internal') { + return BSStyle.transactionTypeInternal + } + return 'white' + } + text: transaction_details.txType - color: BSStyle.textColor + color: define_color(transaction_details.txType) font.family: "Roboto" font.pixelSize: 14 } @@ -292,8 +305,8 @@ Popup { anchors.centerIn: parent model: tx.inputs - copy_button_column_index: 0 - columnWidths: [0.7, 0.2, 0.1] + copy_button_column_index: 1 + columnWidths: [0.1, 0.5, 0.2, 0.2] onCopyRequested: bsApp.copyAddressToClipboard(id) } } @@ -331,8 +344,8 @@ Popup { anchors.centerIn: parent model: tx.outputs - copy_button_column_index: 0 - columnWidths: [0.7, 0.2, 0.1] + copy_button_column_index: 1 + columnWidths: [0.1, 0.5, 0.2, 0.2] onCopyRequested: bsApp.copyAddressToClipboard(id) } } diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 92330084c..03884e784 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -23,6 +23,9 @@ import "BsStyles" Item { id: transactions + width: 1200 + height: 788 + TransactionDetails { id: transactionDetails visible: false diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml new file mode 100644 index 000000000..7d5c27c19 --- /dev/null +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -0,0 +1,141 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + id: layout + + height: 548 + width: 580 + + spacing: 0 + + property var wallet_properties_vm + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Change password") + } + + CustomTextInput { + id: password + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + + title_text: qsTr("Password") + + Component.onCompleted: { + password.isPassword = true + password.isHiddenText = true + } + } + + CustomTextInput { + id: new_password + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + + title_text: qsTr("New Password") + + Component.onCompleted: { + new_password.isPassword = true + new_password.isHiddenText = true + } + } + + + CustomTextInput { + id: confirm_password + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + + title_text: qsTr("Confirm Password") + + Component.onCompleted: { + confirm_password.isPassword = true + confirm_password.isHiddenText = true + } + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + CustomButton { + id: confirm_but + text: qsTr("Save") + preferred: true + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + width: 530 + enabled: (password.input_text !== "") + && (new_password.input_text != "") + && (confirm_password.input_text !== "") + + function click_enter() { + const result = wallet_properties_vm.changePassword( + password.input_text, + new_password.input_text, + confirm_password.input_text + ) + if (result === 0) { + clear() + } + } + } + + Keys.onEnterPressed: { + confirm_but.click_enter() + } + + Keys.onReturnPressed: { + confirm_but.click_enter() + } + + function init() + { + clear() + password.setActiveFocus() + } + + function clear() + { + password.isValid = true + new_password.isValid = true + confirm_password.isValid = true + password.input_text = "" + new_password.input_text = "" + confirm_password.input_text = "" + } +} diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml new file mode 100644 index 000000000..3e93f5680 --- /dev/null +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml @@ -0,0 +1,99 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + id: layout + + height: 548 + width: 580 + + spacing: 0 + + signal back() + signal walletDeleted() + + property var wallet_properties_vm + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Delete wallet") + } + + CustomTextInput { + id: password + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + + title_text: qsTr("Password") + + Component.onCompleted: { + password.isPassword = true + password.isHiddenText = true + } + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + RowLayout { + Layout.alignment: Qt.AlignHCenter + + CustomButton { + text: qsTr("Back") + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + width: 260 + + onClicked: back() + } + + CustomButton { + text: qsTr("Delete") + preferred: true + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + enabled: (password.input_text !== "") + + width: 260 + + + function click_enter() { + const result = wallet_properties_vm.deleteWallet( + password.input_text + ) + + if (result === 0) { + walletDeleted() + clear() + } + } + } + } + + function clear() + { + password.isValid = true + password.input_text = "" + } +} diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml new file mode 100644 index 000000000..4f0586f1c --- /dev/null +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml @@ -0,0 +1,78 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + id: layout + + height: 548 + width: 580 + + spacing: 0 + + signal viewWalletSeed() + signal deleteWallet() + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Delete wallet") + } + + Image { + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 120 + Layout.preferredWidth : 120 + + source: "qrc:/images/wallet_icon_warn.svg" + width: 120 + height: 120 + } + + CustomTitleLabel { + font.pixelSize: 14 + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Save the seed before deleting the wallet") + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + RowLayout { + Layout.alignment: Qt.AlignHCenter + + CustomButton { + text: qsTr("View wallet seed") + + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom + + width: 260 + + onClicked: viewWalletSeed() + } + + CustomButton { + text: qsTr("Continue") + preferred: true + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom + + width: 260 + + onClicked: deleteWallet() + } + } +} diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml new file mode 100644 index 000000000..90da936ce --- /dev/null +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -0,0 +1,143 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 +import QtQuick.Dialogs 1.0 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + id: layout + + property var wallet_properties_vm + + height: 548 + width: 580 + + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Export watching-only wallet") + } + + Item { + width: parent.width + height: 24 + } + + Rectangle { + width: 530 + height: 82 + radius: 14 + color: BSStyle.exportWalletLabelBackground + Layout.alignment: Qt.AlignCenter + + Grid { + columns: 2 + rowSpacing: 14 + width: parent.width + anchors.centerIn: parent + + Text { + text: qsTr("Wallet name") + color: BSStyle.exportWalletLabelNameColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + leftPadding: 20 + } + Text { + text: wallet_properties_vm.walletName + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + horizontalAlignment: Text.AlignRight + rightPadding: 20 + } + + Text { + text: qsTr("Wallet ID") + color: BSStyle.exportWalletLabelNameColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + leftPadding: 20 + } + Text { + text: wallet_properties_vm.walletId + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + horizontalAlignment: Text.AlignRight + rightPadding: 20 + } + } + } + + Item { + width: parent.width + height: 32 + } + + CustomTitleLabel { + width: 530 + font.pixelSize: 14 + text: qsTr("Backup file:") + leftPadding: 24 + } + + CustomTitleLabel { + font.pixelSize: 14 + color: BSStyle.textColor + text: wallet_properties_vm.exportPath + leftPadding: 24 + } + + CustomButtonLeftIcon { + Layout.leftMargin: 24 + width: 160 + text: qsTr("Select target dir") + font.pixelSize: 12 + + custom_icon.source: "qrc:/images/folder_icon.png" + onClicked: fileDialog.open() + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + CustomButton { + id: confirm_but + preferred: true + text: qsTr("Export") + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + width: 530 + + function click_enter() { + wallet_properties_vm.exportWallet() + } + } + + FileDialog { + id: fileDialog + title: "Please choose a directory" + folder: shortcuts.home + selectFolder: true + + onAccepted: { + wallet_properties_vm.exportPath = fileDialog.fileUrl + } + } +} diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml new file mode 100644 index 000000000..4d843a655 --- /dev/null +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml @@ -0,0 +1,94 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + id: layout + + height: 548 + width: 580 + + spacing: 0 + + property var wallet_properties_vm + signal authorized() + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Export watching-only wallet") + } + + CustomTextInput { + id: password + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + + title_text: qsTr("Password") + + Component.onCompleted: { + password.isPassword = true + password.isHiddenText = true + } + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + CustomButton { + id: confirm_but + text: qsTr("Continue") + preferred: true + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + width: 530 + enabled: (password.input_text !== "") + + function click_enter() { + const result = wallet_properties_vm.exportWalletAuth( + password.input_text + ) + if (result === 0) { + authorized() + clear() + } + } + } + + Keys.onEnterPressed: { + confirm_but.click_enter() + } + + Keys.onReturnPressed: { + confirm_but.click_enter() + } + + function init() + { + clear() + password.setActiveFocus() + } + + function clear() + { + password.isValid = true + password.input_text = "" + } +} diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml new file mode 100644 index 000000000..da4749b3f --- /dev/null +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -0,0 +1,346 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 +import terminal.models 1.0 + +import "." +import "../BsStyles" +import "../StyledControls" + +CustomPopup { + id: root + + _stack_view.initialItem: properties + _arrow_but_visibility: !properties.visible + + property var wallet_properties_vm + + ChangePassword { + id: change_password + visible: false + + wallet_properties_vm: root.wallet_properties_vm + } + + ExportWOWalletAuth { + id: export_wo_wallet_auth + visible: false + onAuthorized: _stack_view.replace(export_wo_wallet) + + wallet_properties_vm: root.wallet_properties_vm + } + + ExportWOWallet { + id: export_wo_wallet + visible: false + + wallet_properties_vm: root.wallet_properties_vm + } + + WalletSeedAuth { + id: wallet_seed_auth + visible: false + onAuthorized: _stack_view.replace(wallet_seed) + + wallet_properties_vm: root.wallet_properties_vm + } + + WalletSeed { + id: wallet_seed + visible: false + + wallet_properties_vm: root.wallet_properties_vm + } + + DeleteWalletWarn { + id: delete_wallet_warn + visible: false + onViewWalletSeed: _stack_view.push(wallet_seed_auth) + onDeleteWallet: _stack_view.push(delete_wallet) + } + + DeleteWallet { + id: delete_wallet + visible: false + onBack: _stack_view.pop() + + wallet_properties_vm: root.wallet_properties_vm + + onWalletDeleted: { + _stack_view.pop() + _stack_view.pop() + root.close() + } + } + + Rectangle { + id: properties + height: 548 + width: 580 + color: "transparent" + + Column { + spacing: 40 + width: parent.width - 48 + height: parent.height - 48 + anchors.centerIn: parent + + + Text { + text: qsTr("Wallet properties") + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 20 + anchors.horizontalCenter: parent.horizontalCenter + } + + Row { + width: parent.width - 75 + spacing: 37 + + Column { + spacing: 8 + width: parent.width / 2 + height: parent.height + + Row { + width: parent.width + + Text { + text: qsTr("Wallet name") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + } + Text { + text: wallet_properties_vm.walletName + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + horizontalAlignment: Text.AlignRight + } + } + + Row { + width: parent.width + + Text { + text: qsTr("Description") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + } + Text { + text: wallet_properties_vm.walletDescription + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + horizontalAlignment: Text.AlignRight + } + } + + Row { + width: parent.width + + Text { + text: qsTr("Wallet ID") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + } + Text { + text: wallet_properties_vm.walletId + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + horizontalAlignment: Text.AlignRight + } + } + + Row { + width: parent.width + + Text { + text: qsTr("Group / Leaves") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + } + Text { + text: wallet_properties_vm.walletGroups + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + horizontalAlignment: Text.AlignRight + } + } + } + + Rectangle { + width: 1 + height: 80 + color: BSStyle.tableSeparatorColor + anchors.verticalCenter: parent.verticalCenter + } + + Column { + spacing: 8 + width: parent.width / 2 + height: parent.height + + Row { + width: parent.width + + Text { + text: qsTr("Encryption") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + } + Text { + text: wallet_properties_vm.walletEncryption + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + horizontalAlignment: Text.AlignRight + } + } + + Row { + width: parent.width + + Text { + text: qsTr("Generated addresses") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + } + Text { + text: wallet_properties_vm.walletGeneratedAddresses + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + horizontalAlignment: Text.AlignRight + } + } + + Row { + width: parent.width + + Text { + text: qsTr("Active addresses") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + } + Text { + text: wallet_properties_vm.walletActiveAddresses + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + horizontalAlignment: Text.AlignRight + } + } + + Row { + width: parent.width + + Text { + text: qsTr("Available UTXOs") + color: BSStyle.titleTextColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + } + Text { + text: wallet_properties_vm.walletAvailableUtxo + color: BSStyle.textColor + font.family: "Roboto" + font.pixelSize: 14 + width: parent.width / 2 + horizontalAlignment: Text.AlignRight + } + } + } + } + + Column { + spacing: 10 + width: parent.width + height: parent.height * 0.6 + anchors.margins: 24 + + CustomListItem { + width: parent.width + + isButton: true + + icon_source: "qrc:/images/lock_icon.svg" + icon_add_source: "qrc:/images/arrow.png" + title_text: qsTr("Change password") + + onClicked: _stack_view.push(change_password) + } + + CustomListItem { + width: parent.width + isButton: true + + icon_source: "qrc:/images/eye_icon.svg" + icon_add_source: "qrc:/images/arrow.png" + title_text: qsTr("Export watching-only wallet") + + onClicked: _stack_view.push(export_wo_wallet_auth) + } + + CustomListItem { + width: parent.width + isButton: true + + icon_source: "qrc:/images/shield_icon.svg" + icon_add_source: "qrc:/images/arrow.png" + title_text: qsTr("View wallet seed") + + onClicked: _stack_view.push(wallet_seed_auth) + } + + CustomListItem { + width: parent.width + isButton: true + + icon_source: "qrc:/images/scan_icon.svg" + icon_add_source: "qrc:/images/arrow.png" + title_text: qsTr("Rescan wallet") + + onClicked: console.log('Unsuported') + } + + CustomListItem { + width: parent.width + isButton: true + + icon_source: "qrc:/images/delete_icon.svg" + icon_add_source: "qrc:/images/arrow.png" + title_text: qsTr("Delete wallet") + + onClicked: _stack_view.push(delete_wallet_warn) + } + } + } + } +} diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml new file mode 100644 index 000000000..072231db3 --- /dev/null +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml @@ -0,0 +1,64 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + id: layout + + height: 548 + width: 580 + + spacing: 0 + + property var wallet_properties_vm + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Wallet seed") + } + + GridView { + id: grid + + Layout.fillHeight: true + Layout.fillWidth: true + Layout.leftMargin: 25 + Layout.topMargin: 32 + + cellHeight : 56 + cellWidth : 180 + + model: wallet_properties_vm.seed + delegate: CustomSeedLabel { + seed_text: modelData + serial_num: index + 1 + } + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + CustomButton { + id: confirm_but + text: qsTr("Copy seed") + preferred: true + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + width: 530 + + onClicked: bsApp.copySeedToClipboard( + wallet_properties_vm.seed + ) + } +} diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml new file mode 100644 index 000000000..40bfc109e --- /dev/null +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml @@ -0,0 +1,95 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + id: layout + + height: 548 + width: 580 + + spacing: 0 + + property var wallet_properties_vm + + signal authorized() + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("View wallet seed") + } + + CustomTextInput { + id: password + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + + title_text: qsTr("Password") + + Component.onCompleted: { + password.isPassword = true + password.isHiddenText = true + } + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + CustomButton { + id: confirm_but + text: qsTr("Continue") + preferred: true + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + width: 530 + enabled: (password.input_text !== "") + + function click_enter() { + const result = wallet_properties_vm.viewWalletSeedAuth( + password.input_text + ) + if (result === 0) { + authorized() + clear() + } + } + } + + Keys.onEnterPressed: { + confirm_but.click_enter() + } + + Keys.onReturnPressed: { + confirm_but.click_enter() + } + + function init() + { + clear() + password.setActiveFocus() + } + + function clear() + { + password.isValid = true + password.input_text = "" + } +} diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 701627cd4..fcdec1fee 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -160,6 +160,7 @@ images/delete.svg qml/TransactionDetails.qml qml/StyledControls/CloseIconButton.qml +<<<<<<< HEAD qml/StyledControls/CustomTableDelegateRow.qml qml/Send/SelectInputs.qml images/check.svg @@ -167,5 +168,21 @@ images/expanded.svg qml/Send/SignTransactionAdvanced.qml qml/Send/PasswordWithTimer.qml +======= + images/delete_icon.svg + images/eye_icon.svg + images/shield_icon.svg + images/lock_icon.svg + images/scan_icon.svg + qml/WalletProperties/WalletPropertiesPopup.qml + qml/WalletProperties/ChangePassword.qml + qml/WalletProperties/DeleteWallet.qml + qml/WalletProperties/DeleteWalletWarn.qml + qml/WalletProperties/ExportWOWallet.qml + qml/WalletProperties/ExportWOWalletAuth.qml + qml/WalletProperties/WalletSeed.qml + qml/WalletProperties/WalletSeedAuth.qml + images/wallet_icon_warn.svg +>>>>>>> eea857493... Wallet properties diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp new file mode 100644 index 000000000..c83195a14 --- /dev/null +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -0,0 +1,121 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "WalletPropertiesVM.h" +#include + +namespace qtquick_gui +{ + +WalletPropertiesVM::WalletPropertiesVM(QObject* parent) + : QObject(parent) +{ +} + +void WalletPropertiesVM::setWalletInfo(const WalletInfo& info) +{ + info_ = info; + emit changed(); +} + +const QString& WalletPropertiesVM::walletName() const +{ + return info_.name; +} + +const QString& WalletPropertiesVM::walletDescription() const +{ + return info_.description; +} + +const QString& WalletPropertiesVM::walletId() const +{ + return info_.walletId; +} + +const QString& WalletPropertiesVM::walletGroups() const +{ + return info_.groups; +} + +const QString& WalletPropertiesVM::walletEncryption() const +{ + return info_.ecryption; +} + +quint32 WalletPropertiesVM::walletGeneratedAddresses() const +{ + return info_.generatedAddresses; +} + +quint32 WalletPropertiesVM::walletActiveAddresses() const +{ + return info_.activeAddresses; +} + +quint32 WalletPropertiesVM::walletAvailableUtxo() const +{ + return info_.availableUtxo; +} + +int WalletPropertiesVM::changePassword(const QString& oldPassword, const QString& newPassword) +{ + qDebug() << "Changed pwd request:" << oldPassword << " " << newPassword; + return 0; +} + +int WalletPropertiesVM::exportWalletAuth(const QString& password) +{ + qDebug() << "export WO wallet auth:" << password; + return 0; +} + +int WalletPropertiesVM::viewWalletSeedAuth(const QString& password) +{ + qDebug() << "view wallet seed:" << password; + return 0; +} + +int WalletPropertiesVM::deleteWallet(const QString& password) +{ + qDebug() << "delete wallet:" << password; + return 0; +} + +const QStringList& WalletPropertiesVM::seed() const +{ + return seed_; +} + +void WalletPropertiesVM::setSeed(const QStringList& seed) +{ + seed_ = seed; + emit seedChanged(); +} + + +const QString& WalletPropertiesVM::exportPath() const +{ + return exportPath_; +} + +void WalletPropertiesVM::setExportPath(const QString& path) +{ + exportPath_ = path; + emit pathChanged(); +} + +int WalletPropertiesVM::exportWallet() +{ + qDebug() << "Exporting wallet to " << exportPath_; + return 0; +} + +} diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h new file mode 100644 index 000000000..6b9d640c2 --- /dev/null +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h @@ -0,0 +1,82 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#pragma once + +#include +#include "Wallets/SignContainer.h" + +namespace qtquick_gui +{ + +struct WalletInfo +{ + QString name; + QString description; + QString walletId; + QString groups; + QString ecryption; + quint32 generatedAddresses; + quint32 activeAddresses; + quint32 availableUtxo; +}; + +class WalletPropertiesVM: public QObject +{ + Q_OBJECT + Q_PROPERTY(QString walletName READ walletName NOTIFY changed) + Q_PROPERTY(QString walletDescription READ walletDescription NOTIFY changed) + Q_PROPERTY(QString walletId READ walletId NOTIFY changed) + Q_PROPERTY(QString walletGroups READ walletGroups NOTIFY changed) + Q_PROPERTY(QString walletEncryption READ walletEncryption NOTIFY changed) + Q_PROPERTY(quint32 walletGeneratedAddresses READ walletGeneratedAddresses NOTIFY changed) + Q_PROPERTY(quint32 walletActiveAddresses READ walletActiveAddresses NOTIFY changed) + Q_PROPERTY(quint32 walletAvailableUtxo READ walletAvailableUtxo NOTIFY changed) + Q_PROPERTY(QStringList seed READ seed NOTIFY seedChanged) + Q_PROPERTY(QString exportPath READ exportPath WRITE setExportPath NOTIFY pathChanged) + +public: + WalletPropertiesVM(QObject* parent = nullptr); + + void setWalletInfo(const WalletInfo& info); + + const QString& walletName() const; + const QString& walletDescription() const; + const QString& walletId() const; + const QString& walletGroups() const; + const QString& walletEncryption() const; + quint32 walletGeneratedAddresses() const; + quint32 walletActiveAddresses() const; + quint32 walletAvailableUtxo() const; + + const QStringList& seed() const; + void setSeed(const QStringList& seed); + + const QString& exportPath() const; + void setExportPath(const QString& path); + + Q_INVOKABLE int changePassword(const QString& oldPassword, const QString& newPassword); + Q_INVOKABLE int exportWalletAuth(const QString& password); + Q_INVOKABLE int viewWalletSeedAuth(const QString& password); + Q_INVOKABLE int deleteWallet(const QString& password); + Q_INVOKABLE int exportWallet(); + +signals: + void changed(); + void seedChanged(); + void pathChanged(); + +private: + WalletInfo info_; + QStringList seed_; + QString exportPath_; +}; + +} From 320f24cadb9073502807830703ed95f4ad841839 Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 15 Feb 2023 21:42:30 +0100 Subject: [PATCH 140/436] Draft enums --- GUI/QtQuick/QtQuickAdapter.cpp | 29 ++++++++++++++- GUI/QtQuick/QtQuickAdapter.h | 5 +++ GUI/QtQuick/TxListModel.cpp | 15 ++++++++ GUI/QtQuick/TxListModel.h | 13 +++++++ GUI/QtQuick/qml/TransactionDetails.qml | 17 +++++---- .../qml/WalletProperties/ChangePassword.qml | 2 +- .../qml/WalletProperties/DeleteWallet.qml | 2 +- .../qml/WalletProperties/ExportWOWallet.qml | 4 +-- .../WalletProperties/ExportWOWalletAuth.qml | 2 +- .../qml/WalletProperties/WalletSeedAuth.qml | 2 +- GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 35 +------------------ GUI/QtQuick/viewmodels/WalletPropertiesVM.h | 6 ---- 12 files changed, 76 insertions(+), 56 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 3ea85f22c..80fdd82e4 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -241,6 +241,8 @@ void QtQuickAdapter::run(int &argc, char **argv) qmlRegisterType("terminal.models", 1, 0, "TransactionFilterModel"); qmlRegisterType("terminal.models", 1, 0, "TransactionForAddressFilterModel"); qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); + qmlRegisterUncreatableMetaObject(Transactions::staticMetaObject, "terminal.models" + , 1, 0, "Transactions", tr("Error: only enums")); //need to read files in qml qputenv("QML_XHR_ALLOW_FILE_READ", QByteArray("1")); @@ -874,7 +876,7 @@ void QtQuickAdapter::walletSelected(int index) walletPropertiesVM_->setWalletInfo({ QString::fromStdString(hdWallets_.at(walletId).name), QString::fromStdString(hdWallets_.at(walletId).description), - QString::fromStdString(hdWallets_.at(walletId).ids.size() > 0 ? hdWallets_.at(walletId).ids[0] : std::string()), + QString::fromStdString(walletId), QString::fromLatin1("0/") + QString::number(hdWallets_.at(walletId).leaves.size()), hdWallets_.at(walletId).encryptionTypes.size() > 0 ? encTypeToString(hdWallets_.at(walletId).encryptionTypes[0]) : QString(), 0, @@ -1810,3 +1812,28 @@ qtquick_gui::WalletPropertiesVM* QtQuickAdapter::walletProperitesVM() const { return walletPropertiesVM_.get(); } + +int QtQuickAdapter::exportWallet() +{ + return 0; +} + +int QtQuickAdapter::changePassword(const QString& oldPassword, const QString& newPassword) +{ + return 0; +} + +int QtQuickAdapter::exportWalletAuth(const QString& password) +{ + return 0; +} + +int QtQuickAdapter::viewWalletSeedAuth(const QString& password) +{ + return 0; +} + +int QtQuickAdapter::deleteWallet(const QString& password) +{ + return 0; +} \ No newline at end of file diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 1f95c1b8c..d2474ddd6 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -182,6 +182,11 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE int getSearchInputType(const QString&); Q_INVOKABLE void startAddressSearch(const QString&); Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); + Q_INVOKABLE int changePassword(const QString& oldPassword, const QString& newPassword); + Q_INVOKABLE int exportWalletAuth(const QString& password); + Q_INVOKABLE int viewWalletSeedAuth(const QString& password); + Q_INVOKABLE int deleteWallet(const QString& password); + Q_INVOKABLE int exportWallet(); signals: void walletsListChanged(); diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 846f33eca..5801cb9b9 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -38,6 +38,16 @@ namespace { }; static const QString dateTimeFormat = QString::fromStdString("yyyy-MM-dd hh:mm:ss"); + + Transactions::Direction transform_direction(bs::sync::Transaction::Direction direction) + { + switch (direction) { + case bs::sync::Transaction::Direction::Received: return Transactions::Direction::Received; + case bs::sync::Transaction::Direction::Sent: return Transactions::Direction::Sent; + case bs::sync::Transaction::Direction::Internal: return Transactions::Direction::Internal; + default: return Transactions::Direction::Unknown; + } + } } TxListModel::TxListModel(const std::shared_ptr& logger, QObject* parent) @@ -750,6 +760,11 @@ quint32 QTxDetails::height() const return details_.tx.getTxHeight(); } +qint32 QTxDetails::direction() const +{ + return static_cast(transform_direction(details_.direction)); +} + TxInOutModel::TxInOutModel(const std::vector& data, const QString& type, QObject* parent) : QAbstractTableModel(parent) , data_(data) diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 31e32fb3f..832953ab8 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -148,6 +148,17 @@ class TxInOutModel : public QAbstractTableModel const std::vector data_; }; +namespace Transactions { + Q_NAMESPACE + enum Direction { + Received = 0, + Sent, + Internal, + Unknown + }; + Q_ENUM_NS(Direction) +} + class QTxDetails : public QObject { Q_OBJECT @@ -179,6 +190,8 @@ class QTxDetails : public QObject QString feePerByte() const; Q_PROPERTY(quint32 height READ height NOTIFY updated) quint32 height() const; + Q_PROPERTY(qint32 direction READ direction NOTIFY updated) + qint32 direction() const; Q_PROPERTY(TxInOutModel* inputs READ inputs NOTIFY updated) TxInOutModel* inputs() const { return inputsModel_; } diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index a069bb6c0..c0710abbb 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -61,7 +61,6 @@ Popup { font.weight: Font.Medium } - Grid { columns: 2 rowSpacing: 8 @@ -137,21 +136,21 @@ Popup { width: 170 } Text { - function define_color(value) { - if (value === 'Sent') { + function define_transaction_type_color(value) { + if (value == Transactions.Sent) { return BSStyle.transactionTypeSent } - else if (value === 'Received') { - return BSStyle.transactionTypeRecevied + else if (value == Transactions.Received) { + return BSStyle.transactionTypeReceived } - else if (value === 'Internal') { + else if (value == Transactions.Internal) { return BSStyle.transactionTypeInternal } return 'white' } text: transaction_details.txType - color: define_color(transaction_details.txType) + color: define_transaction_type_color(tx.direction) font.family: "Roboto" font.pixelSize: 14 } @@ -206,7 +205,7 @@ Popup { width: 170 } Label { - function define_color(value) { + function define_confirmation_color(value) { if (value == 0) { return BSStyle.transactionConfirmationZero } @@ -217,7 +216,7 @@ Popup { } text: tx.nbConf - color: define_color(tx.nbConf) + color: define_confirmation_color(tx.nbConf) font.family: "Roboto" font.pixelSize: 14 } diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml index 7d5c27c19..40ab072ab 100644 --- a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -104,7 +104,7 @@ ColumnLayout { && (confirm_password.input_text !== "") function click_enter() { - const result = wallet_properties_vm.changePassword( + const result = bsApp.changePassword( password.input_text, new_password.input_text, confirm_password.input_text diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml index 3e93f5680..7370856ae 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml @@ -79,7 +79,7 @@ ColumnLayout { function click_enter() { - const result = wallet_properties_vm.deleteWallet( + const result = bsApp.deleteWallet( password.input_text ) diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml index 90da936ce..7f652c33a 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -126,13 +126,13 @@ ColumnLayout { width: 530 function click_enter() { - wallet_properties_vm.exportWallet() + bsApp.exportWallet() } } FileDialog { id: fileDialog - title: "Please choose a directory" + title: qsTr("Please choose a directory") folder: shortcuts.home selectFolder: true diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml index 4d843a655..75c02db24 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml @@ -62,7 +62,7 @@ ColumnLayout { enabled: (password.input_text !== "") function click_enter() { - const result = wallet_properties_vm.exportWalletAuth( + const result = bsApp.exportWalletAuth( password.input_text ) if (result === 0) { diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml index 40bfc109e..90b628c63 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml @@ -63,7 +63,7 @@ ColumnLayout { enabled: (password.input_text !== "") function click_enter() { - const result = wallet_properties_vm.viewWalletSeedAuth( + const result = bsApp.viewWalletSeedAuth( password.input_text ) if (result === 0) { diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index c83195a14..da03a5803 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -11,8 +11,7 @@ #include "WalletPropertiesVM.h" #include -namespace qtquick_gui -{ +using namespace qtquick_gui; WalletPropertiesVM::WalletPropertiesVM(QObject* parent) : QObject(parent) @@ -65,30 +64,6 @@ quint32 WalletPropertiesVM::walletAvailableUtxo() const return info_.availableUtxo; } -int WalletPropertiesVM::changePassword(const QString& oldPassword, const QString& newPassword) -{ - qDebug() << "Changed pwd request:" << oldPassword << " " << newPassword; - return 0; -} - -int WalletPropertiesVM::exportWalletAuth(const QString& password) -{ - qDebug() << "export WO wallet auth:" << password; - return 0; -} - -int WalletPropertiesVM::viewWalletSeedAuth(const QString& password) -{ - qDebug() << "view wallet seed:" << password; - return 0; -} - -int WalletPropertiesVM::deleteWallet(const QString& password) -{ - qDebug() << "delete wallet:" << password; - return 0; -} - const QStringList& WalletPropertiesVM::seed() const { return seed_; @@ -111,11 +86,3 @@ void WalletPropertiesVM::setExportPath(const QString& path) exportPath_ = path; emit pathChanged(); } - -int WalletPropertiesVM::exportWallet() -{ - qDebug() << "Exporting wallet to " << exportPath_; - return 0; -} - -} diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h index 6b9d640c2..39a639541 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h @@ -62,12 +62,6 @@ class WalletPropertiesVM: public QObject const QString& exportPath() const; void setExportPath(const QString& path); - Q_INVOKABLE int changePassword(const QString& oldPassword, const QString& newPassword); - Q_INVOKABLE int exportWalletAuth(const QString& password); - Q_INVOKABLE int viewWalletSeedAuth(const QString& password); - Q_INVOKABLE int deleteWallet(const QString& password); - Q_INVOKABLE int exportWallet(); - signals: void changed(); void seedChanged(); From ccc101b942eb5d32c5bb8c212e65e884ac1b572d Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 16 Feb 2023 11:33:59 +0100 Subject: [PATCH 141/436] Fixed issues with color; removed broken enum --- GUI/QtQuick/QtQuickAdapter.cpp | 7 ++++++- GUI/QtQuick/TxListModel.cpp | 6 ------ GUI/QtQuick/TxListModel.h | 2 -- GUI/QtQuick/qml/TransactionDetails.qml | 18 +++--------------- GUI/QtQuick/qml/TransactionsPage.qml | 1 + GUI/QtQuick/qtquick.qrc | 3 --- GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 1 - GUI/QtQuick/viewmodels/WalletPropertiesVM.h | 1 - 8 files changed, 10 insertions(+), 29 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 80fdd82e4..354d8f059 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -877,7 +877,7 @@ void QtQuickAdapter::walletSelected(int index) QString::fromStdString(hdWallets_.at(walletId).name), QString::fromStdString(hdWallets_.at(walletId).description), QString::fromStdString(walletId), - QString::fromLatin1("0/") + QString::number(hdWallets_.at(walletId).leaves.size()), + QString::fromLatin1("1/") + QString::number(hdWallets_.at(walletId).leaves.size()), hdWallets_.at(walletId).encryptionTypes.size() > 0 ? encTypeToString(hdWallets_.at(walletId).encryptionTypes[0]) : QString(), 0, 0, @@ -1815,25 +1815,30 @@ qtquick_gui::WalletPropertiesVM* QtQuickAdapter::walletProperitesVM() const int QtQuickAdapter::exportWallet() { + //auto walletId = walletPropertiesVM_->walletId(); return 0; } int QtQuickAdapter::changePassword(const QString& oldPassword, const QString& newPassword) { + //auto walletId = walletPropertiesVM_->walletId(); return 0; } int QtQuickAdapter::exportWalletAuth(const QString& password) { + //auto walletId = walletPropertiesVM_->walletId(); return 0; } int QtQuickAdapter::viewWalletSeedAuth(const QString& password) { + //auto walletId = walletPropertiesVM_->walletId(); return 0; } int QtQuickAdapter::deleteWallet(const QString& password) { + //auto walletId = walletPropertiesVM_->walletId(); return 0; } \ No newline at end of file diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 5801cb9b9..4755d0100 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -754,17 +754,11 @@ QString QTxDetails::feePerByte() const return displayBTC(amount / txWeight, 1); } - quint32 QTxDetails::height() const { return details_.tx.getTxHeight(); } -qint32 QTxDetails::direction() const -{ - return static_cast(transform_direction(details_.direction)); -} - TxInOutModel::TxInOutModel(const std::vector& data, const QString& type, QObject* parent) : QAbstractTableModel(parent) , data_(data) diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 832953ab8..8bfa4610c 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -190,8 +190,6 @@ class QTxDetails : public QObject QString feePerByte() const; Q_PROPERTY(quint32 height READ height NOTIFY updated) quint32 height() const; - Q_PROPERTY(qint32 direction READ direction NOTIFY updated) - qint32 direction() const; Q_PROPERTY(TxInOutModel* inputs READ inputs NOTIFY updated) TxInOutModel* inputs() const { return inputsModel_; } diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index c0710abbb..10d9dcdf9 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -26,6 +26,7 @@ Popup { property string txAmount: '' property string txDateTime: '' property string txType: '' + property color txTypeColor property string txComment: '' width: 916 @@ -136,21 +137,8 @@ Popup { width: 170 } Text { - function define_transaction_type_color(value) { - if (value == Transactions.Sent) { - return BSStyle.transactionTypeSent - } - else if (value == Transactions.Received) { - return BSStyle.transactionTypeReceived - } - else if (value == Transactions.Internal) { - return BSStyle.transactionTypeInternal - } - return 'white' - } - text: transaction_details.txType - color: define_transaction_type_color(tx.direction) + color: transaction_details.txTypeColor font.family: "Roboto" font.pixelSize: 14 } @@ -252,7 +240,7 @@ Popup { } CopyIconButton { anchors.verticalCenter: parent.verticalCenter - onCopy: bsApp.copyAddressToClipboard(tx.txId) + onCopy: bsApp.copyAddressToClipboard(transaction_details.address) } } diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 03884e784..575d35d0c 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -160,6 +160,7 @@ Item { transactionDetails.address = model.data(model.index(row, 3), 257) transactionDetails.txDateTime = model.data(model.index(row, 0), 257) transactionDetails.txType = model.data(model.index(row, 2), 257) + transactionDetails.txTypeColor = model.data(model.index(row, 2), 259) transactionDetails.txComment = model.data(model.index(row, 7), 257) transactionDetails.txAmount = model.data(model.index(row, 4), 257) transactionDetails.tx = bsApp.getTXDetails(txHash) diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index fcdec1fee..cca53c27e 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -160,7 +160,6 @@ images/delete.svg qml/TransactionDetails.qml qml/StyledControls/CloseIconButton.qml -<<<<<<< HEAD qml/StyledControls/CustomTableDelegateRow.qml qml/Send/SelectInputs.qml images/check.svg @@ -168,7 +167,6 @@ images/expanded.svg qml/Send/SignTransactionAdvanced.qml qml/Send/PasswordWithTimer.qml -======= images/delete_icon.svg images/eye_icon.svg images/shield_icon.svg @@ -183,6 +181,5 @@ qml/WalletProperties/WalletSeed.qml qml/WalletProperties/WalletSeedAuth.qml images/wallet_icon_warn.svg ->>>>>>> eea857493... Wallet properties diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index da03a5803..35c2ff081 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -9,7 +9,6 @@ */ #include "WalletPropertiesVM.h" -#include using namespace qtquick_gui; diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h index 39a639541..e9d913dd1 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h @@ -11,7 +11,6 @@ #pragma once #include -#include "Wallets/SignContainer.h" namespace qtquick_gui { From dfdafb33925e17a365cc2b0c211cd166268ba807 Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 16 Feb 2023 12:28:24 +0100 Subject: [PATCH 142/436] Cleanup --- GUI/QtQuick/TxListModel.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 4755d0100..4fec9a191 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -38,16 +38,6 @@ namespace { }; static const QString dateTimeFormat = QString::fromStdString("yyyy-MM-dd hh:mm:ss"); - - Transactions::Direction transform_direction(bs::sync::Transaction::Direction direction) - { - switch (direction) { - case bs::sync::Transaction::Direction::Received: return Transactions::Direction::Received; - case bs::sync::Transaction::Direction::Sent: return Transactions::Direction::Sent; - case bs::sync::Transaction::Direction::Internal: return Transactions::Direction::Internal; - default: return Transactions::Direction::Unknown; - } - } } TxListModel::TxListModel(const std::shared_ptr& logger, QObject* parent) From 79f40994d71a515637fc70c40549317858056302 Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 16 Feb 2023 13:18:28 +0100 Subject: [PATCH 143/436] Wallet properties action arguments --- GUI/QtQuick/QtQuickAdapter.cpp | 17 ++++++----------- GUI/QtQuick/QtQuickAdapter.h | 10 +++++----- .../qml/WalletProperties/ChangePassword.qml | 1 + .../qml/WalletProperties/DeleteWallet.qml | 1 + .../qml/WalletProperties/ExportWOWallet.qml | 2 +- .../qml/WalletProperties/ExportWOWalletAuth.qml | 1 + .../qml/WalletProperties/WalletSeedAuth.qml | 1 + 7 files changed, 16 insertions(+), 17 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 354d8f059..3a08693ca 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1813,32 +1813,27 @@ qtquick_gui::WalletPropertiesVM* QtQuickAdapter::walletProperitesVM() const return walletPropertiesVM_.get(); } -int QtQuickAdapter::exportWallet() +int QtQuickAdapter::exportWallet(const QString& walletId) { - //auto walletId = walletPropertiesVM_->walletId(); return 0; } -int QtQuickAdapter::changePassword(const QString& oldPassword, const QString& newPassword) +int QtQuickAdapter::changePassword(const QString& walletId, const QString& oldPassword, const QString& newPassword) { - //auto walletId = walletPropertiesVM_->walletId(); return 0; } -int QtQuickAdapter::exportWalletAuth(const QString& password) +int QtQuickAdapter::exportWalletAuth(const QString& walletId, const QString& password) { - //auto walletId = walletPropertiesVM_->walletId(); return 0; } -int QtQuickAdapter::viewWalletSeedAuth(const QString& password) +int QtQuickAdapter::viewWalletSeedAuth(const QString& walletId, const QString& password) { - //auto walletId = walletPropertiesVM_->walletId(); return 0; } -int QtQuickAdapter::deleteWallet(const QString& password) +int QtQuickAdapter::deleteWallet(const QString& walletId, const QString& password) { - //auto walletId = walletPropertiesVM_->walletId(); return 0; -} \ No newline at end of file +} diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index d2474ddd6..40e868289 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -182,11 +182,11 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE int getSearchInputType(const QString&); Q_INVOKABLE void startAddressSearch(const QString&); Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); - Q_INVOKABLE int changePassword(const QString& oldPassword, const QString& newPassword); - Q_INVOKABLE int exportWalletAuth(const QString& password); - Q_INVOKABLE int viewWalletSeedAuth(const QString& password); - Q_INVOKABLE int deleteWallet(const QString& password); - Q_INVOKABLE int exportWallet(); + Q_INVOKABLE int changePassword(const QString& walletId, const QString& oldPassword, const QString& newPassword); + Q_INVOKABLE int exportWalletAuth(const QString& walletId, const QString& password); + Q_INVOKABLE int viewWalletSeedAuth(const QString& walletId, const QString& password); + Q_INVOKABLE int deleteWallet(const QString& walletId, const QString& password); + Q_INVOKABLE int exportWallet(const QString& walletId); signals: void walletsListChanged(); diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml index 40ab072ab..4a43d9df7 100644 --- a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -105,6 +105,7 @@ ColumnLayout { function click_enter() { const result = bsApp.changePassword( + wallet_properties_vm.walletId, password.input_text, new_password.input_text, confirm_password.input_text diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml index 7370856ae..7f0088202 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml @@ -80,6 +80,7 @@ ColumnLayout { function click_enter() { const result = bsApp.deleteWallet( + wallet_properties_vm.walletId, password.input_text ) diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml index 7f652c33a..12057dd3e 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -126,7 +126,7 @@ ColumnLayout { width: 530 function click_enter() { - bsApp.exportWallet() + bsApp.exportWallet(wallet_properties_vm.walletId) } } diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml index 75c02db24..347faf3d0 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml @@ -63,6 +63,7 @@ ColumnLayout { function click_enter() { const result = bsApp.exportWalletAuth( + wallet_properties_vm.walletId, password.input_text ) if (result === 0) { diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml index 90b628c63..6d5828f7c 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml @@ -64,6 +64,7 @@ ColumnLayout { function click_enter() { const result = bsApp.viewWalletSeedAuth( + wallet_properties_vm.walletId, password.input_text ) if (result === 0) { From 1f66dcddea76db1412002b1ab04666282e5ec69c Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 16 Feb 2023 18:10:15 +0300 Subject: [PATCH 144/436] wallet properties improvements --- BlockSettleHW/ledger/ledgerDevice.cpp | 36 ++++++++------ .../CreateTransactionDialogAdvanced.cpp | 2 + BlockSettleUILib/UtxoReservationManager.cpp | 5 +- GUI/QtQuick/QtQuickAdapter.cpp | 37 +++++++++------ GUI/QtQuick/QtQuickAdapter.h | 3 +- GUI/QtQuick/qml/OverviewPage.qml | 7 ++- .../WalletPropertiesPopup.qml | 4 +- GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 23 +++++++-- GUI/QtQuick/viewmodels/WalletPropertiesVM.h | 8 ++-- UnitTests/TestOtc.cpp | 2 + UnitTests/TestWallet.cpp | 2 + UnitTests/TestWalletArmory.cpp | 47 +++++++++++++++++-- common | 2 +- 13 files changed, 132 insertions(+), 46 deletions(-) diff --git a/BlockSettleHW/ledger/ledgerDevice.cpp b/BlockSettleHW/ledger/ledgerDevice.cpp index ea40373f1..ff02bf4b9 100644 --- a/BlockSettleHW/ledger/ledgerDevice.cpp +++ b/BlockSettleHW/ledger/ledgerDevice.cpp @@ -43,7 +43,9 @@ namespace { }; const uint16_t kHidapiBrokenSequence = 191; - int sendApdu(hid_device* dongle, const QByteArray& command) { + + int sendApdu(hid_device* dongle, const QByteArray& command) + { int result = 0; QVector chunks; uint16_t chunkNumber = 0; @@ -86,30 +88,32 @@ namespace { return result; } - uint16_t receiveApduResult(hid_device* dongle, QByteArray& response) { + uint16_t receiveApduResult(hid_device* dongle, QByteArray& response) + { response.clear(); uint16_t expectedChunkIndex = 0; - unsigned char buf[Ledger::CHUNK_MAX_BLOCK]; + int result = hid_read(dongle, buf, Ledger::CHUNK_MAX_BLOCK); if (result < 0) { return result; } QByteArray chunk(reinterpret_cast(buf), Ledger::CHUNK_MAX_BLOCK); - auto checkChunkIndex = [&chunk, &expectedChunkIndex]() { + const auto& checkChunkIndex = [&expectedChunkIndex](const QByteArray& chunk) + { auto chunkIndex = static_cast(((uint8_t)chunk[3] << 8) | (uint8_t)chunk[4]); if (chunkIndex != expectedChunkIndex++) { if (chunkIndex == static_cast(kHidapiBrokenSequence)) { throw LedgerBrokenSequence(); } else { - throw LedgerException("Unexpected sequence number"); + throw LedgerException("unexpected sequence number"); } } }; - checkChunkIndex(); + checkChunkIndex(chunk); int left = static_cast(((uint8_t)chunk[5] << 8) | (uint8_t)chunk[6]); response.append(chunk.mid(Ledger::FIRST_BLOCK_OFFSET, left)); @@ -123,7 +127,7 @@ namespace { } chunk = QByteArray(reinterpret_cast(buf), Ledger::CHUNK_MAX_BLOCK); - checkChunkIndex(); + checkChunkIndex(chunk); response.append(chunk.mid(Ledger::NEXT_BLOCK_OFFSET, left)); } @@ -131,7 +135,6 @@ namespace { auto resultCode = response.right(2); response.chop(2); return static_cast(((uint8_t)resultCode[0] << 8) | (uint8_t)resultCode[1]); - } QByteArray getApduHeader(uint8_t cla, uint8_t ins, uint8_t p1, uint8_t p2) { @@ -210,13 +213,15 @@ void DeviceIOHandler::readData(QByteArray& output, const std::string& logHeader) bool DeviceIOHandler::initDevice() noexcept { if (hid_init() < 0 || hidDeviceInfo_.serialNumber.empty()) { - logger_->info("[DeviceIOHandler::initDevice] cannot init hid"); + logger_->error("[DeviceIOHandler::initDevice] cannot init hid"); return false; } { // make sure that user does not switch off device in the middle of operation auto* info = hid_enumerate(hidDeviceInfo_.vendorId, hidDeviceInfo_.productId); if (!info) { + logger_->error("[DeviceIOHandler::initDevice] device {} {} not found" + , hidDeviceInfo_.vendorId, hidDeviceInfo_.productId); return false; } @@ -228,6 +233,7 @@ bool DeviceIOHandler::initDevice() noexcept } } if (!bFound) { + logger_->error("[DeviceIOHandler::initDevice] device not found"); return false; } } @@ -236,8 +242,9 @@ bool DeviceIOHandler::initDevice() noexcept QString::fromStdString(hidDeviceInfo_.serialNumber).toWCharArray(serNumb.get()); serNumb.get()[hidDeviceInfo_.serialNumber.length()] = 0x00; dongle_ = hid_open(hidDeviceInfo_.vendorId, static_cast(hidDeviceInfo_.productId), serNumb.get()); - - return dongle_ != nullptr; + logger_->debug("[DeviceIOHandler::initDevice] {} {}: {}", hidDeviceInfo_.vendorId + , hidDeviceInfo_.productId, (dongle_ != NULL)); + return dongle_ != NULL; } void DeviceIOHandler::releaseDevice() noexcept @@ -246,6 +253,8 @@ void DeviceIOHandler::releaseDevice() noexcept hid_close(dongle_); hid_exit(); dongle_ = nullptr; + logger_->debug("[DeviceIOHandler::releaseDevice] {} {}", hidDeviceInfo_.vendorId + , hidDeviceInfo_.productId); } } @@ -277,8 +286,6 @@ bool DeviceIOHandler::exchangeData(const QByteArray& input, QByteArray& output releaseDevice(); std::this_thread::sleep_for(std::chrono::milliseconds{ 100 }); initDevice(); - output.clear(); - return exchangeData(input, output, std::move(logHeader)); } } @@ -287,7 +294,6 @@ bool DeviceIOHandler::exchangeData(const QByteArray& input, QByteArray& output /*releaseDevice(); std::this_thread::sleep_for(std::chrono::milliseconds{100}); initDevice(); - output.clear(); return exchangeData(input, output, std::move(logHeader));*/ return false; } @@ -552,7 +558,7 @@ void bs::hww::LedgerDevice::retrieveXPubRoot() handleError(Ledger::INTERNAL_ERROR); return; } - //TODO: invoke callback with walletInfo + cb_->walletInfoReady(key(), *walletInfo); }; processQueued(inData, cb); } diff --git a/BlockSettleUILib/CreateTransactionDialogAdvanced.cpp b/BlockSettleUILib/CreateTransactionDialogAdvanced.cpp index 02c884aea..87df52926 100644 --- a/BlockSettleUILib/CreateTransactionDialogAdvanced.cpp +++ b/BlockSettleUILib/CreateTransactionDialogAdvanced.cpp @@ -445,7 +445,9 @@ void CreateTransactionDialogAdvanced::setRBFinputs(const Tx &tx) QMetaObject::invokeMethod(this, lbdSetInputs); } }; +#ifdef OLD_WALLETS_CODE wallet->getRBFTxOutList(cbRBFUtxos); +#endif } }; //armory_->getTXsByHash(txHashSet, cbTXs, true); diff --git a/BlockSettleUILib/UtxoReservationManager.cpp b/BlockSettleUILib/UtxoReservationManager.cpp index d52b873b6..62a0784b4 100644 --- a/BlockSettleUILib/UtxoReservationManager.cpp +++ b/BlockSettleUILib/UtxoReservationManager.cpp @@ -70,10 +70,11 @@ namespace { result->utxosMap.emplace(walletId, std::move(utxos)); cbDone(); }; +#ifdef OLD_WALLETS_CODE if (!wallet->getSpendableTxOutList(cbWrapNormal, UINT64_MAX, false)) { return false; } - +#endif auto cbWrapZc = [result, size = wallets.size(), walletId = wallet->walletId(), cbDone] (std::vector utxos) { @@ -81,9 +82,11 @@ namespace { result->utxosMapZc.emplace(walletId, std::move(utxos)); cbDone(); }; +#ifdef OLD_WALLETS_CODE if (!wallet->getSpendableZCList(cbWrapZc)) { return false; } +#endif } return true; } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 3a08693ca..719a5fc55 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -146,7 +146,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) , userSigner_(std::make_shared(TerminalUsers::Signer)) , userHWW_(bs::message::UserTerminal::create(bs::message::TerminalUsers::HWWallets)) , txTypes_({ tr("All transactions") }) - , walletPropertiesVM_(std::make_unique()) + , walletPropertiesModel_(std::make_unique()) { staticLogger = logger; addrModel_ = new QmlAddressListModel(logger, this); @@ -238,9 +238,9 @@ void QtQuickAdapter::run(int &argc, char **argv) qmlRegisterInterface("QTxDetails"); qmlRegisterUncreatableMetaObject(WalletBalance::staticMetaObject, "wallet.balance" , 1, 0, "WalletBalance", tr("Error: only enums")); - qmlRegisterType("terminal.models", 1, 0, "TransactionFilterModel"); - qmlRegisterType("terminal.models", 1, 0, "TransactionForAddressFilterModel"); - qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); + qmlRegisterType("terminal.models", 1, 0, "TransactionFilterModel"); + qmlRegisterType("terminal.models", 1, 0, "TransactionForAddressFilterModel"); + qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); qmlRegisterUncreatableMetaObject(Transactions::staticMetaObject, "terminal.models" , 1, 0, "Transactions", tr("Error: only enums")); @@ -873,16 +873,18 @@ void QtQuickAdapter::walletSelected(int index) walletInfoReq_[msgId] = walletName; if (hdWallets_.count(walletId) > 0) { - walletPropertiesVM_->setWalletInfo({ - QString::fromStdString(hdWallets_.at(walletId).name), - QString::fromStdString(hdWallets_.at(walletId).description), - QString::fromStdString(walletId), - QString::fromLatin1("1/") + QString::number(hdWallets_.at(walletId).leaves.size()), - hdWallets_.at(walletId).encryptionTypes.size() > 0 ? encTypeToString(hdWallets_.at(walletId).encryptionTypes[0]) : QString(), - 0, - 0, - 0 - }); + try { + walletPropertiesModel_->setWalletInfo({ + QString::fromStdString(hdWallets_.at(walletId).name), + QString::fromStdString(hdWallets_.at(walletId).description), + QString::fromStdString(walletId), + QString::fromLatin1("1/") + QString::number(hdWallets_.at(walletId).leaves.size()), + hdWallets_.at(walletId).encryptionTypes.size() > 0 + ? encTypeToString(hdWallets_.at(walletId).encryptionTypes[0]) : tr("Unknown"), + hdWallets_.at(walletId).nbAddresses + }); + } + catch (const std::exception&) {} } }); } @@ -926,6 +928,8 @@ static QString assetTypeToString(const bs::AssetType assetType) ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId , const WalletsMessage_WalletData& response) { + walletPropertiesModel_->setNbActiveAddrs(response.wallet_id(), response.used_addresses_size()); + const auto& itReq = walletInfoReq_.find(msgId); if (itReq != walletInfoReq_.end()) { std::unordered_set walletIds; @@ -1468,6 +1472,9 @@ ProcessingResult QtQuickAdapter::processWalletsList(const WalletsMessage_Wallets ProcessingResult QtQuickAdapter::processUTXOs(const WalletsMessage_UtxoListResponse& response) { + logger_->debug("[{}] {} UTXOs for {}", __func__, response.utxos_size(), response.wallet_id()); + walletPropertiesModel_->setNbUTXOs(response.wallet_id(), response.utxos_size()); + std::vector utxos; for (const auto& serUtxo : response.utxos()) { UTXO utxo; @@ -1810,7 +1817,7 @@ void QtQuickAdapter::startAddressSearch(const QString& s) qtquick_gui::WalletPropertiesVM* QtQuickAdapter::walletProperitesVM() const { - return walletPropertiesVM_.get(); + return walletPropertiesModel_.get(); } int QtQuickAdapter::exportWallet(const QString& walletId) diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 40e868289..1e0c21e50 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -286,6 +286,7 @@ private slots: HwDeviceModel* hwDeviceModel_{ nullptr }; WalletBalancesModel* walletBalances_{ nullptr }; FeeSuggestionModel* feeSuggModel_{ nullptr }; + std::unique_ptr walletPropertiesModel_; bs::Address generatedAddress_; bool hwDevicesPolling_{ false }; bs::hww::DeviceKey curAuthDevice_{}; @@ -295,8 +296,6 @@ private slots: std::map txDetailReqs_; std::map settingsCache_; std::set expTxAddrReqs_, expTxAddrInReqs_; - - std::unique_ptr walletPropertiesVM_; }; #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index a036aad7b..098b615a8 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -24,6 +24,7 @@ import wallet.balance 1.0 Item { id: overview + property int walletIndex: 0 signal newWalletClicked(); signal curWalletIndexChanged(index : int) @@ -49,12 +50,16 @@ Item { anchors.fill: parent onRequestWalletProperties: { + bsApp.getUTXOsForWallet(walletIndex) walletProperties.show() walletProperties.raise() walletProperties.requestActivate() } onCreateNewWallet: overview.newWalletClicked() - onWalletIndexChanged: overview.curWalletIndexChanged(index) + onWalletIndexChanged: { + walletIndex = index + overview.curWalletIndexChanged(index) + } onOpenAddressDetails: (address, transactions, balance, comment, asset_type, type, wallet) => { addressDetails.address = address addressDetails.transactions = transactions diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index da4749b3f..4009f0b04 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -164,7 +164,7 @@ CustomPopup { } } - Row { +/* Row { width: parent.width Text { @@ -182,7 +182,7 @@ CustomPopup { width: parent.width / 2 horizontalAlignment: Text.AlignRight } - } + }*/ } Rectangle { diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index 35c2ff081..b81e01295 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -23,6 +23,24 @@ void WalletPropertiesVM::setWalletInfo(const WalletInfo& info) emit changed(); } +void qtquick_gui::WalletPropertiesVM::setNbActiveAddrs(const std::string& walletId, uint32_t nb) +{ + if (info_.walletId.isEmpty() || (info_.walletId.toStdString() != walletId)) { + return; + } + nbActiveAddrs_ = nb; + emit changed(); +} + +void qtquick_gui::WalletPropertiesVM::setNbUTXOs(const std::string& walletId, uint32_t nb) +{ + if (info_.walletId.isEmpty() || (info_.walletId.toStdString() != walletId)) { + return; + } + nbUTXOs_ = nb; + emit changed(); +} + const QString& WalletPropertiesVM::walletName() const { return info_.name; @@ -55,12 +73,12 @@ quint32 WalletPropertiesVM::walletGeneratedAddresses() const quint32 WalletPropertiesVM::walletActiveAddresses() const { - return info_.activeAddresses; + return nbActiveAddrs_; } quint32 WalletPropertiesVM::walletAvailableUtxo() const { - return info_.availableUtxo; + return nbUTXOs_; } const QStringList& WalletPropertiesVM::seed() const @@ -74,7 +92,6 @@ void WalletPropertiesVM::setSeed(const QStringList& seed) emit seedChanged(); } - const QString& WalletPropertiesVM::exportPath() const { return exportPath_; diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h index e9d913dd1..b69800aec 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h @@ -23,8 +23,6 @@ struct WalletInfo QString groups; QString ecryption; quint32 generatedAddresses; - quint32 activeAddresses; - quint32 availableUtxo; }; class WalletPropertiesVM: public QObject @@ -45,6 +43,8 @@ class WalletPropertiesVM: public QObject WalletPropertiesVM(QObject* parent = nullptr); void setWalletInfo(const WalletInfo& info); + void setNbActiveAddrs(const std::string& walletId, uint32_t nb); + void setNbUTXOs(const std::string& walletId, uint32_t nb); const QString& walletName() const; const QString& walletDescription() const; @@ -67,7 +67,9 @@ class WalletPropertiesVM: public QObject void pathChanged(); private: - WalletInfo info_; + WalletInfo info_; + uint32_t nbActiveAddrs_{ 0 }; + uint32_t nbUTXOs_{ 0 }; QStringList seed_; QString exportPath_; }; diff --git a/UnitTests/TestOtc.cpp b/UnitTests/TestOtc.cpp index 86770a8c8..d1869b6e9 100644 --- a/UnitTests/TestOtc.cpp +++ b/UnitTests/TestOtc.cpp @@ -312,10 +312,12 @@ class TestOtc : public ::testing::Test mineRandomBlocks(6); auto utxosPromise = std::promise>(); +#ifdef OLD_WALLETS_CODE bool result = wallet->getSpendableTxOutList([&utxosPromise](const std::vector &utxos) { utxosPromise.set_value(utxos); }, UINT64_MAX, true); ASSERT_TRUE(result); +#endif auto utxos = utxosPromise.get_future().get(); ASSERT_FALSE(utxos.empty()); diff --git a/UnitTests/TestWallet.cpp b/UnitTests/TestWallet.cpp index cb3a4e3bc..68d4ce32b 100644 --- a/UnitTests/TestWallet.cpp +++ b/UnitTests/TestWallet.cpp @@ -1854,7 +1854,9 @@ TEST_F(TestWallet, TxIdNestedSegwit) promUtxo->set_value(inputs.front()); } }; +#ifdef OLD_WALLETS_CODE ASSERT_TRUE(syncLeaf->getSpendableTxOutList(cbTxOutList, UINT64_MAX, true)); +#endif const auto input = futUtxo.get(); ASSERT_TRUE(input.isInitialized()); diff --git a/UnitTests/TestWalletArmory.cpp b/UnitTests/TestWalletArmory.cpp index 8b1d21efd..f117b6328 100644 --- a/UnitTests/TestWalletArmory.cpp +++ b/UnitTests/TestWalletArmory.cpp @@ -166,7 +166,9 @@ TEST_F(TestWalletWithArmory, AddressChainExtension) }; //async, has to wait +#ifdef OLD_WALLETS_CODE syncLeaf->updateBalances(cbBalance); +#endif fut2.wait(); //check balance @@ -216,7 +218,9 @@ TEST_F(TestWalletWithArmory, AddressChainExtension) }; //async, has to wait +#ifdef OLD_WALLETS_CODE syncLeaf->getSpendableTxOutList(cbTxOutList, UINT64_MAX, true); +#endif ASSERT_TRUE(fut1.get()); //mine 6 more blocks @@ -234,7 +238,9 @@ TEST_F(TestWalletWithArmory, AddressChainExtension) }; //async, has to wait +#ifdef OLD_WALLETS_CODE syncLeaf->updateBalances(cbBalance2); +#endif fut4.wait(); //check balance @@ -338,7 +344,9 @@ TEST_F(TestWalletWithArmory, RestoreWallet_CheckChainLength) }; //async, has to wait +#ifdef OLD_WALLETS_CODE syncLeaf->updateBalances(cbBalance); +#endif fut2.wait(); //check balance @@ -396,7 +404,9 @@ TEST_F(TestWalletWithArmory, RestoreWallet_CheckChainLength) }; //async, has to wait +#ifdef OLD_WALLETS_CODE syncLeaf->getSpendableTxOutList(cbTxOutList, UINT64_MAX, true); +#endif fut1.wait(); //mine 6 more blocks @@ -414,7 +424,9 @@ TEST_F(TestWalletWithArmory, RestoreWallet_CheckChainLength) }; //async, has to wait +#ifdef OLD_WALLETS_CODE syncLeaf->updateBalances(cbBalance2); +#endif fut4.wait(); //check balance @@ -509,7 +521,9 @@ TEST_F(TestWalletWithArmory, RestoreWallet_CheckChainLength) }; //async, has to wait +#ifdef OLD_WALLETS_CODE ASSERT_TRUE(syncLeaf->updateBalances(cbBalance)); +#endif fut2.wait(); //check balance @@ -640,7 +654,9 @@ TEST_F(TestWalletWithArmory, RestoreWallet_CheckChainLength) promPtr2->set_value(true); }; //async, has to wait +#ifdef OLD_WALLETS_CODE ASSERT_TRUE(syncLeaf->updateBalances(cbBalance)); +#endif fut2.wait(); //check balance @@ -717,7 +733,9 @@ TEST_F(TestWalletWithArmory, Comments) { promPtr->set_value(inputs); }; +#ifdef OLD_WALLETS_CODE EXPECT_TRUE(syncWallet->getSpendableTxOutList(cbTxOutList, UINT64_MAX, true)); +#endif const auto inputs = fut.get(); ASSERT_FALSE(inputs.empty()); const auto recip = addr.getRecipient(bs::XBTAmount{ (int64_t)12000 }); @@ -771,7 +789,9 @@ TEST_F(TestWalletWithArmory, ZCBalance) { balProm->set_value(true); }; +#ifdef OLD_WALLETS_CODE syncLeaf->updateBalances(waitOnBalance); +#endif balFut.wait(); EXPECT_DOUBLE_EQ(syncLeaf->getTotalBalance(), 0); EXPECT_DOUBLE_EQ(syncLeaf->getSpendableBalance(), 0); @@ -794,7 +814,9 @@ TEST_F(TestWalletWithArmory, ZCBalance) { balProm1->set_value(true); }; +#ifdef OLD_WALLETS_CODE syncLeaf->updateBalances(waitOnBalance1); +#endif balFut1.wait(); EXPECT_DOUBLE_EQ(syncLeaf->getTotalBalance(), 300); EXPECT_DOUBLE_EQ(syncLeaf->getSpendableBalance(), 300); @@ -811,7 +833,9 @@ TEST_F(TestWalletWithArmory, ZCBalance) promPtr1->set_value(inputs); }; //async, has to wait +#ifdef OLD_WALLETS_CODE syncLeaf->getSpendableTxOutList(cbTxOutList, UINT64_MAX, true); +#endif const auto inputs = fut1.get(); ASSERT_GE(inputs.size(), 1); @@ -849,7 +873,9 @@ TEST_F(TestWalletWithArmory, ZCBalance) }; //async, has to wait +#ifdef OLD_WALLETS_CODE syncLeaf->updateBalances(cbBalance); +#endif fut2.wait(); EXPECT_DOUBLE_EQ(syncLeaf->getTotalBalance(), @@ -882,7 +908,9 @@ TEST_F(TestWalletWithArmory, ZCBalance) prom3->set_value(true); }; +#ifdef OLD_WALLETS_CODE syncLeaf->getSpendableZCList(zcTxOutLbd); +#endif fut3.wait(); blockCount = 1; @@ -898,7 +926,9 @@ TEST_F(TestWalletWithArmory, ZCBalance) promUpdBal->set_value(true); }; //async, has to wait +#ifdef OLD_WALLETS_CODE syncLeaf->updateBalances(cbBalance4); +#endif futUpdBal.wait(); EXPECT_EQ(syncLeaf->getTotalBalance(), @@ -920,7 +950,9 @@ TEST_F(TestWalletWithArmory, ZCBalance) promUpdBal->set_value(true); }; //async, has to wait +#ifdef OLD_WALLETS_CODE syncLeaf->updateBalances(cbBalance5); +#endif futUpdBal.wait(); EXPECT_EQ(syncLeaf->getTotalBalance(), @@ -976,8 +1008,9 @@ TEST_F(TestWalletWithArmory, SimpleTX_bech32) { promPtr1->set_value(inputs); }; - +#ifdef OLD_WALLETS_CODE syncLeaf->getSpendableTxOutList(cbTxOutList1, UINT64_MAX, true); +#endif const auto inputs1 = fut1.get(); ASSERT_FALSE(inputs1.empty()); @@ -1010,8 +1043,9 @@ TEST_F(TestWalletWithArmory, SimpleTX_bech32) { promPtr2->set_value(true); }; - +#ifdef OLD_WALLETS_CODE syncLeaf->updateBalances(cbBalance); +#endif fut2.wait(); EXPECT_EQ(syncLeaf->getAddrBalance(addr2)[0], amount1); @@ -1021,8 +1055,9 @@ TEST_F(TestWalletWithArmory, SimpleTX_bech32) { promPtr3->set_value(inputs); }; - +#ifdef OLD_WALLETS_CODE syncLeaf->getSpendableTxOutList(cbTxOutList2, UINT64_MAX, true); +#endif const auto inputs2 = fut3.get(); ASSERT_FALSE(inputs2.empty()); @@ -1264,7 +1299,9 @@ TEST_F(TestWalletWithArmory, GlobalDelegateConf) promPtrBal->set_value(true); }; //async, has to wait +#ifdef OLD_WALLETS_CODE syncLeaf->updateBalances(cbBalance); +#endif futBal.wait(); //check balance @@ -1336,7 +1373,9 @@ TEST_F(TestWalletWithArmory, GlobalDelegateConf) promTxOut->set_value(inputs); }; //async, has to wait +#ifdef OLD_WALLETS_CODE EXPECT_TRUE(syncLeaf->getSpendableTxOutList(cbTxOutList, UINT64_MAX, true)); +#endif const auto &inputs = futTxOut.get(); ASSERT_FALSE(inputs.empty()); @@ -1469,7 +1508,9 @@ TEST_F(TestWalletWithArmory, PushZC_retry) promPtr1->set_value(inputs); }; //async, has to wait +#ifdef OLD_WALLETS_CODE syncLeaf->getSpendableTxOutList(cbTxOutList, UINT64_MAX, true); +#endif const auto inputs = fut1.get(); ASSERT_GE(inputs.size(), 1); diff --git a/common b/common index c01eb7c16..8d666e85e 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit c01eb7c166823ff4cdb220e6818ee3ddf2a76ba7 +Subproject commit 8d666e85ef86a0b051ad785b693eabb200f1797b From 536476cb78cbae681bf2436fe6a40639b6720eee Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 16 Feb 2023 20:20:20 +0300 Subject: [PATCH 145/436] update common --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index 8d666e85e..9ad776dc8 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 8d666e85ef86a0b051ad785b693eabb200f1797b +Subproject commit 9ad776dc86e0d2e7180b4474adfa098860a42d20 From ed8fe78069661318e2fae137f58f82fd1cc2b351 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 16 Feb 2023 20:49:29 +0200 Subject: [PATCH 146/436] fix bugs --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 19 ++++++++++++++----- GUI/QtQuick/qml/Send/AmountInput.qml | 8 ++++---- GUI/QtQuick/qml/Send/SendPopup.qml | 12 ++++++++++++ .../qml/StyledControls/CustomPopup.qml | 17 ++++++++++++++--- 4 files changed, 44 insertions(+), 12 deletions(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 6a175232f..304784de4 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -459,7 +459,7 @@ ColumnLayout { CustomButton { id: continue_but - enabled: txOutputsModel.rowCount && table_sel_inputs.rowCount + enabled: txOutputsModel.rowCount width: 1084 @@ -474,10 +474,19 @@ ColumnLayout { function click_enter() { - layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() - , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text - , txInputsModel.getSelection())) + if (table_sel_inputs.rowCount) + { + layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() + , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text + , txInputsModel.getSelection()) ) + } + else + { + layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() + , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text) ) + } } } diff --git a/GUI/QtQuick/qml/Send/AmountInput.qml b/GUI/QtQuick/qml/Send/AmountInput.qml index 61cddfbe5..324acd28c 100644 --- a/GUI/QtQuick/qml/Send/AmountInput.qml +++ b/GUI/QtQuick/qml/Send/AmountInput.qml @@ -26,10 +26,10 @@ CustomTextInput { //it is why I have realized my validator inside of onTextEdited property string prev_text : "" onTextEdited : { + if (tempRequest === null || tempRequest.QTXSignRequest.isValid) { + amount_input.input_text = "0" + } -// if (tempRequest === null) { -// amount_input.input_text = "0" -// } amount_input.input_text = amount_input.input_text.replace(",", ".") @@ -55,7 +55,7 @@ CustomTextInput { return } - if (input_number < 0 || ((tempRequest != null) && (input_number > tempRequest.maxAmount))) + if (input_number < 0 || (input_number > tempRequest.maxAmount)) { amount_input.input_text = prev_text return diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 341620e9f..67f81f4d6 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -91,4 +91,16 @@ CustomPopup { function init() { simple_details.init() } + + onSig_close_click: { + if (simple_details.visible) + { + stack_create_wallet.pop() + } + else + { + root.close() + stack_create_wallet.pop(null) + } + } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml index 132a2498e..1341ff143 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml @@ -29,6 +29,9 @@ Window { x: mainWindow.x + (mainWindow.width - width)/2 y: mainWindow.y + 28 + signal sig_close_click() + signal sig_back_arrow_click() + Rectangle { id: rect @@ -55,8 +58,7 @@ Window { MouseArea { anchors.fill: parent onClicked: { - root.close() - stack_create_wallet.pop(null) + sig_close_click() } } } @@ -75,7 +77,7 @@ Window { MouseArea { anchors.fill: parent onClicked: { - stack_create_wallet.pop() + sig_back_arrow_click() } } } @@ -147,4 +149,13 @@ Window { } + onSig_close_click: { + root.close() + stack_create_wallet.pop(null) + } + + onSig_back_arrow_click: { + stack_create_wallet.pop() + } + } From 15e6ff00bfa6672fe1ab15be201b8f52e0cc7499 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 17 Feb 2023 07:19:07 +0200 Subject: [PATCH 147/436] qml: advanced send: fix bugs --- GUI/QtQuick/TxInputsModel.cpp | 98 ++++++++++++++++--- GUI/QtQuick/qml/Send/AmountInput.qml | 2 +- GUI/QtQuick/qml/Send/SelectInputs.qml | 5 +- GUI/QtQuick/qml/Send/SendPopup.qml | 9 +- GUI/QtQuick/qml/Send/SimpleDetails.qml | 45 +++++---- .../qml/StyledControls/CustomPopup.qml | 19 ++-- 6 files changed, 130 insertions(+), 48 deletions(-) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 24c2fc12a..5bc0e33a8 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -53,7 +53,7 @@ QVariant TxInputsModel::data(const QModelIndex& index, int role) const case HeadingRole: return (index.row() == 0); case SelectedRole: - return (index.row() > 0 && index.column() == 0) ? (selection_.find(index.row() -1) != selection_.end()) : false; + return (index.column() == 0) ? data_[index.row() - 1].selected : false; case ExpandedRole: return (index.row() > 0 && index.column() == 0) ? data_[index.row() - 1].expanded : false; case CanBeExpandedRole: @@ -142,17 +142,20 @@ void TxInputsModel::toggle(int row) { for (const auto& idx : selChanges) { selection_.erase(idx.first); + } + for (const auto& idx : selChanges) { if (idx.second >= 0) { selection_.insert(idx.second); } } }; + std::map selChanges; if (entry.expanded) { entry.expanded = false; for (const auto& sel : selection_) { - if (sel > row) { - if (sel <= (row + it->second.size())) { + if (sel > row + 1) { + if (sel <= (row + 1 + it->second.size())) { selChanges[sel] = -1; } else { @@ -169,33 +172,71 @@ void TxInputsModel::toggle(int row) } else { entry.expanded = true; - for (const auto& sel : selection_) { - if (sel == row) { - selChanges[sel] = -1; + + bool isSelectedParent = (selection_.find(row + 1) != selection_.end()); + for (int i=0; isecond.size(); i++) { + bool isSelectedChild = (selection_.find(row + 2 + i) != selection_.end()); + if (isSelectedParent || isSelectedChild) { + selChanges[-1] = row + 2 + i; } - else if (sel > row) { + } + + for (const auto& sel : selection_) { + if (sel > row + 1) { selChanges[sel] = sel + it->second.size(); } } + std::vector entries; for (const auto& utxo : it->second) { entries.push_back({ {}, utxo.getTxHash(), utxo.getTxOutIndex()}); } beginInsertRows(QModelIndex(), row + 2, row + it->second.size() + 1); - changeSelection(selChanges); data_.insert(data_.cbegin() + row + 1, entries.cbegin(), entries.cend()); + changeSelection(selChanges); endInsertRows(); emit rowCountChanged(); - emit dataChanged(createIndex(row + 1, 0), createIndex(row + 1, columnCount() - 1), { SelectedRole }); + emit dataChanged(createIndex(row + 1, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); } } void TxInputsModel::toggleSelection(int row) { - --row; - if (data_.at(row).expanded) { + if (row == 0) { + auto temp_selection = selection_; + for (const auto & sel_row : temp_selection) { + if (sel_row != 0) { + const auto& entry = data_.at(sel_row - 1); + if (entry.txId.empty()) { + toggleSelection(sel_row); + } + } + } + temp_selection = selection_; + for (const auto & sel_row : temp_selection) { + if (sel_row != 0) { + toggleSelection(sel_row); + } + } + if (selection_.find(0) == selection_.end()) { + selection_.insert(0); + for (int i_row = 1; i_row < rowCount(); i_row ++) { + const auto& entry = data_.at(i_row-1); + if (entry.txId.empty()) { + toggleSelection(i_row); + } + } + } + else { + selection_.erase(0); + } return; } + + --row; +// if (data_.at(row).expanded) { +// return; +// } const auto& entry = data_.at(row); const auto& itAddr = utxos_.find(entry.address); UTXO utxo{}; @@ -214,8 +255,10 @@ void TxInputsModel::toggleSelection(int row) } } } - if (selection_.find(row) == selection_.end()) { - selection_.insert(row); + int selStart = row + 1; + int selEnd = row + 1; + if (selection_.find(row + 1) == selection_.end()) { + selection_.insert(row + 1); if (!entry.txId.empty()) { nbTx_++; selectedBalance_ += utxo.getValue(); @@ -226,14 +269,30 @@ void TxInputsModel::toggleSelection(int row) for (const auto& utxo : itAddr->second) { selectedBalance_ += utxo.getValue(); } + if (data_.at(row).expanded) { + for (int i=0; isecond.size(); i++) { + selection_.insert(row + 2 + i); + } + selEnd = row + 1 + itAddr->second.size(); + } } } } else { - selection_.erase(row); + selection_.erase(row+1); if (!entry.txId.empty()) { nbTx_--; selectedBalance_ -= utxo.getValue(); + int rowParent = row - 1; + while (rowParent >= 0) { + if (data_.at(rowParent).expanded) { + selection_.erase(rowParent + 1); + break; + } + rowParent--; + } + if (rowParent >= 0) + selStart = rowParent + 1; } else { if (itAddr != utxos_.end()) { @@ -242,10 +301,16 @@ void TxInputsModel::toggleSelection(int row) selectedBalance_ -= utxo.getValue(); } } + if (data_.at(row).expanded) { + for (int i=0; isecond.size(); i++) { + selection_.erase(row + 2 + i); + } + selEnd = row + 1 + itAddr->second.size(); + } } } emit selectionChanged(); - emit dataChanged(createIndex(row + 1, 0), createIndex(row + 1, columnCount() - 1)); + emit dataChanged(createIndex(selStart, 0), createIndex(selEnd, 0), {SelectedRole}); } QUTXOList* TxInputsModel::getSelection() @@ -266,7 +331,8 @@ QUTXOList* TxInputsModel::getSelection() preSelected_[(int)std::floor(amount * BTCNumericTypes::BalanceDivider)] = result; } else { - for (const int idx : selection_) { + for (int idx : selection_) { + --idx; const auto& entry = data_.at(idx); if (!entry.txId.empty()) { bool added = false; diff --git a/GUI/QtQuick/qml/Send/AmountInput.qml b/GUI/QtQuick/qml/Send/AmountInput.qml index 324acd28c..96a727557 100644 --- a/GUI/QtQuick/qml/Send/AmountInput.qml +++ b/GUI/QtQuick/qml/Send/AmountInput.qml @@ -26,7 +26,7 @@ CustomTextInput { //it is why I have realized my validator inside of onTextEdited property string prev_text : "" onTextEdited : { - if (tempRequest === null || tempRequest.QTXSignRequest.isValid) { + if (tempRequest === null || !tempRequest.isValid) { amount_input.input_text = "0" } diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml index 819994461..caa71f1fd 100644 --- a/GUI/QtQuick/qml/Send/SelectInputs.qml +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -75,11 +75,10 @@ ColumnLayout { anchors.verticalCenter: parent.verticalCenter checked: model_selected - checkable: (model_row !== 0) + checkable: true onClicked: { - if (model_row !== 0) - txInputsModel.toggleSelection(model_row) + txInputsModel.toggleSelection(model_row) } } diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 67f81f4d6..0b5f874ff 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -92,15 +92,16 @@ CustomPopup { simple_details.init() } - onSig_close_click: { - if (simple_details.visible) + function close_click() + { + if (select_inputs.visible) { - stack_create_wallet.pop() + _stack_view.pop() } else { root.close() - stack_create_wallet.pop(null) + _stack_view.pop(null) } } } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 7507b04eb..8fc567841 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -97,9 +97,7 @@ ColumnLayout { function createTempRequest() { - var fpb = parseFloat(fee_suggest_combo.currentValue) - tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) + create_temp_request() } } @@ -129,20 +127,7 @@ ColumnLayout { width: 271 onActivated: (index_act) => { - if (rec_addr_input.isValid) { - var fpb = parseFloat(fee_suggest_combo.currentValue) - tempRequest = bsApp.createTXSignRequest(index_act - , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) - } - - //I dont understand why but acceptableInput dont work... - var cur_value = parseFloat(amount_input.input_text) - var bottom = 0 - var top = tempRequest.maxAmount - if(cur_value < bottom || cur_value > top) - { - amount_input.input_text = tempRequest.maxAmount - } + create_temp_request() } } @@ -216,6 +201,32 @@ ColumnLayout { continue_but.click_enter() } + Connections + { + target:tempRequest + function onTxSignReqChanged () + { + //I dont understand why but acceptableInput dont work... + var cur_value = parseFloat(amount_input.input_text) + var bottom = 0 + var top = tempRequest.maxAmount + console.log("tempRequest.maxAmount = " + tempRequest.maxAmount) + if(cur_value < bottom || cur_value > top) + { + amount_input.input_text = tempRequest.maxAmount + } + } + } + + function create_temp_request() + { + if (rec_addr_input.isValid) { + var fpb = parseFloat(fee_suggest_combo.currentValue) + tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) + } + } + function init() { rec_addr_input.setActiveFocus() diff --git a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml index 1341ff143..f6d3b6ffa 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml @@ -8,7 +8,7 @@ Window { id: root property int navig_bar_width: 36 - property alias _stack_view: stack_create_wallet + property alias _stack_view: stack_popup property alias _arrow_but_visibility: back_arrow_button.visible visible: true @@ -39,8 +39,8 @@ Window { color: "#191E2A" opacity: 1 radius: 16 - height: stack_create_wallet.height + navig_bar_width - width: stack_create_wallet.width + height: stack_popup.height + navig_bar_width + width: stack_popup.width border.color : BSStyle.defaultBorderColor border.width : 1 @@ -83,7 +83,7 @@ Window { } StackView { - id: stack_create_wallet + id: stack_popup anchors.top: close_button.bottom anchors.topMargin: 0 @@ -150,12 +150,17 @@ Window { } onSig_close_click: { - root.close() - stack_create_wallet.pop(null) + close_click() } onSig_back_arrow_click: { - stack_create_wallet.pop() + stack_popup.pop() + } + + function close_click() + { + root.close() + stack_popup.pop(null) } } From 0cc23d650417e7317bba725c3dca90f72874e78a Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 16 Feb 2023 23:28:55 +0100 Subject: [PATCH 148/436] UI imrovements --- GUI/QtQuick/QtQuickAdapter.cpp | 6 ++- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 44 ++++++++++++++++--- .../qml/StyledControls/CustomMediumButton.qml | 7 ++- .../qml/StyledControls/CustomTableView.qml | 7 ++- .../qml/WalletProperties/DeleteWallet.qml | 10 ++++- .../WalletPropertiesPopup.qml | 23 ++++++++-- GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 10 +++++ GUI/QtQuick/viewmodels/WalletPropertiesVM.h | 6 +++ 8 files changed, 97 insertions(+), 16 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 719a5fc55..ab3948e47 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -881,8 +881,10 @@ void QtQuickAdapter::walletSelected(int index) QString::fromLatin1("1/") + QString::number(hdWallets_.at(walletId).leaves.size()), hdWallets_.at(walletId).encryptionTypes.size() > 0 ? encTypeToString(hdWallets_.at(walletId).encryptionTypes[0]) : tr("Unknown"), - hdWallets_.at(walletId).nbAddresses - }); + hdWallets_.at(walletId).nbAddresses, + hdWallets_.at(walletId).isHardware, + hdWallets_.at(walletId).watchOnly + }); } catch (const std::exception&) {} } diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 0e120c79c..fd984dc4b 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -56,14 +56,44 @@ Rectangle { anchors.fill: parent anchors.margins: 20 spacing: 10 + + Rectangle { + color: "transparent" + width: parent.width + height: 30 + + Text { + text: qsTr("Addresses") + color: BSStyle.textColor + font.pixelSize: 19 + font.family: "Roboto" + font.weight: Font.DemiBold + } - Text { - text: qsTr("Addresses") - color: BSStyle.textColor - font.pixelSize: 19 - font.family: "Roboto" - font.weight: Font.DemiBold - + Row { + anchors.right: parent.right + spacing: 6 + + CustomSmallButton { + width: 85 + text: qsTr("Hide used") + } + + CustomSmallButton { + width: 90 + text: qsTr("Hide internal") + } + + CustomSmallButton { + width: 90 + text: qsTr("Hide external") + } + + CustomSmallButton { + width: 85 + text: qsTr("Hide empty") + } + } } CustomTableView { diff --git a/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml b/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml index 8e83ab4cd..95752b620 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml @@ -21,6 +21,7 @@ Button { width: 136 height: 36 + hoverEnabled: true font.pixelSize: 12 font.family: "Roboto" @@ -30,7 +31,11 @@ Button { color: control.background_color radius: control.background_radius - border.width: 0 + + border.color: + (control.hovered ? BSStyle.comboBoxHoveredBorderColor : + (control.activeFocus ? BSStyle.comboBoxFocusedBorderColor : BSStyle.comboBoxBorderColor)) + border.width: 1 } contentItem: Text { diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index dce7e1dc3..e9f489e91 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -26,7 +26,12 @@ TableView { clip: true boundsBehavior: Flickable.StopAtBounds - ScrollBar.vertical: ScrollBar { } + flickDeceleration: 750 + maximumFlickVelocity: 1000 + + ScrollBar.vertical: ScrollBar { + policy: contentHeight > height ? ScrollBar.AlwaysOn : ScrollBar.AsNeeded + } signal copyRequested(var id) signal deleteRequested(int id) diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml index 7f0088202..7ca80d064 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml @@ -18,6 +18,7 @@ ColumnLayout { signal walletDeleted() property var wallet_properties_vm + property bool is_password_requried: !(wallet_properties_vm.isHardware || wallet_properties_vm.isWatchingOnly) CustomTitleLabel { id: title @@ -28,6 +29,7 @@ ColumnLayout { CustomTextInput { id: password + visible: is_password_requried Layout.alignment: Qt.AlignCenter Layout.preferredHeight : 70 @@ -73,7 +75,7 @@ ColumnLayout { Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - enabled: (password.input_text !== "") + enabled: (password.input_text !== "" || !is_password_requried) width: 260 @@ -92,6 +94,12 @@ ColumnLayout { } } + function init() + { + clear() + password.setActiveFocus() + } + function clear() { password.isValid = true diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 4009f0b04..d30be96b4 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -56,8 +56,14 @@ CustomPopup { DeleteWalletWarn { id: delete_wallet_warn visible: false - onViewWalletSeed: _stack_view.push(wallet_seed_auth) - onDeleteWallet: _stack_view.push(delete_wallet) + onViewWalletSeed: { + _stack_view.push(wallet_seed_auth) + wallet_seed_auth.init() + } + onDeleteWallet: { + _stack_view.push(delete_wallet) + delete_wallet.init() + } } DeleteWallet { @@ -287,6 +293,7 @@ CustomPopup { CustomListItem { width: parent.width + enabled: !wallet_properties_vm.isHardware isButton: true @@ -305,18 +312,25 @@ CustomPopup { icon_add_source: "qrc:/images/arrow.png" title_text: qsTr("Export watching-only wallet") - onClicked: _stack_view.push(export_wo_wallet_auth) + onClicked: { + _stack_view.push(export_wo_wallet_auth) + export_wo_wallet_auth.init() + } } CustomListItem { width: parent.width isButton: true + enabled: !wallet_properties_vm.isHardware icon_source: "qrc:/images/shield_icon.svg" icon_add_source: "qrc:/images/arrow.png" title_text: qsTr("View wallet seed") - onClicked: _stack_view.push(wallet_seed_auth) + onClicked: { + _stack_view.push(wallet_seed_auth) + wallet_seed_auth.init() + } } CustomListItem { @@ -333,6 +347,7 @@ CustomPopup { CustomListItem { width: parent.width isButton: true + enabled: wallet_properties_vm.isWatchingOnly || wallet_properties_vm.isHardware icon_source: "qrc:/images/delete_icon.svg" icon_add_source: "qrc:/images/arrow.png" diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index b81e01295..6d13aca57 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -81,6 +81,16 @@ quint32 WalletPropertiesVM::walletAvailableUtxo() const return nbUTXOs_; } +bool WalletPropertiesVM::isHardware() const +{ + return info_.isHardware; +} + +bool WalletPropertiesVM::isWatchingOnly() const +{ + return info_.isWatchingOnly; +} + const QStringList& WalletPropertiesVM::seed() const { return seed_; diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h index b69800aec..804abac2f 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h @@ -23,6 +23,8 @@ struct WalletInfo QString groups; QString ecryption; quint32 generatedAddresses; + bool isHardware; + bool isWatchingOnly; }; class WalletPropertiesVM: public QObject @@ -36,6 +38,8 @@ class WalletPropertiesVM: public QObject Q_PROPERTY(quint32 walletGeneratedAddresses READ walletGeneratedAddresses NOTIFY changed) Q_PROPERTY(quint32 walletActiveAddresses READ walletActiveAddresses NOTIFY changed) Q_PROPERTY(quint32 walletAvailableUtxo READ walletAvailableUtxo NOTIFY changed) + Q_PROPERTY(bool isHardware READ isHardware NOTIFY changed) + Q_PROPERTY(bool isWatchingOnly READ isWatchingOnly NOTIFY changed) Q_PROPERTY(QStringList seed READ seed NOTIFY seedChanged) Q_PROPERTY(QString exportPath READ exportPath WRITE setExportPath NOTIFY pathChanged) @@ -54,6 +58,8 @@ class WalletPropertiesVM: public QObject quint32 walletGeneratedAddresses() const; quint32 walletActiveAddresses() const; quint32 walletAvailableUtxo() const; + bool isHardware() const; + bool isWatchingOnly() const; const QStringList& seed() const; void setSeed(const QStringList& seed); From 679b97f22e2099a5730551d9ca936826526ca484 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 17 Feb 2023 18:54:20 +0300 Subject: [PATCH 149/436] fix watchOnly for root wallet --- GUI/QtQuick/TxInputsModel.cpp | 2 +- common | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 5bc0e33a8..7fe033543 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -53,7 +53,7 @@ QVariant TxInputsModel::data(const QModelIndex& index, int role) const case HeadingRole: return (index.row() == 0); case SelectedRole: - return (index.column() == 0) ? data_[index.row() - 1].selected : false; + return (index.column() == 0) ? (selection_.find(index.row() - 1) != selection_.end()) : false; case ExpandedRole: return (index.row() > 0 && index.column() == 0) ? data_[index.row() - 1].expanded : false; case CanBeExpandedRole: diff --git a/common b/common index 9ad776dc8..0c72ba383 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 9ad776dc86e0d2e7180b4474adfa098860a42d20 +Subproject commit 0c72ba38378be45dd9b6c9f930aab53c54300146 From 84a7398f55b102e9e77b8db52768dc29b06813cf Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 17 Feb 2023 20:04:02 +0200 Subject: [PATCH 150/436] qml: send advansed fix selection of inputs --- GUI/QtQuick/TxInputsModel.cpp | 216 ++++++++---------- GUI/QtQuick/TxInputsModel.h | 6 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 +- .../qml/StyledControls/CustomTableView.qml | 2 +- 4 files changed, 101 insertions(+), 125 deletions(-) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 5bc0e33a8..3abfae352 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -53,7 +53,20 @@ QVariant TxInputsModel::data(const QModelIndex& index, int role) const case HeadingRole: return (index.row() == 0); case SelectedRole: - return (index.column() == 0) ? data_[index.row() - 1].selected : false; + if (index.column() != 0) { + return false; + } + else if (index.row() == 0) { + return selection_root_; + } + else if (data_[index.row() - 1].txId.empty()) { + return (selection_addresses_.find(data_[index.row() - 1].address) + != selection_addresses_.end()); + } + else { + return (selection_utxos_.find({data_[index.row() - 1].txId, data_[index.row() - 1].txOutIndex}) + != selection_utxos_.end()); + } case ExpandedRole: return (index.row() > 0 && index.column() == 0) ? data_[index.row() - 1].expanded : false; case CanBeExpandedRole: @@ -83,7 +96,9 @@ void TxInputsModel::clear() beginResetModel(); utxos_.clear(); data_.clear(); - selection_.clear(); + selection_utxos_.clear(); + selection_addresses_.clear(); + selection_root_ = false; preSelected_.clear(); endResetModel(); emit rowCountChanged(); @@ -138,33 +153,11 @@ void TxInputsModel::toggle(int row) if (it == utxos_.end()) { return; } - const auto& changeSelection = [this](const std::map& selChanges) - { - for (const auto& idx : selChanges) { - selection_.erase(idx.first); - } - for (const auto& idx : selChanges) { - if (idx.second >= 0) { - selection_.insert(idx.second); - } - } - }; std::map selChanges; if (entry.expanded) { entry.expanded = false; - for (const auto& sel : selection_) { - if (sel > row + 1) { - if (sel <= (row + 1 + it->second.size())) { - selChanges[sel] = -1; - } - else { - selChanges[sel] = sel - it->second.size(); - } - } - } beginRemoveRows(QModelIndex(), row + 2, row + it->second.size() + 1); - changeSelection(selChanges); data_.erase(data_.cbegin() + row + 1, data_.cbegin() + row + it->second.size() + 1); endRemoveRows(); @@ -172,28 +165,12 @@ void TxInputsModel::toggle(int row) } else { entry.expanded = true; - - bool isSelectedParent = (selection_.find(row + 1) != selection_.end()); - for (int i=0; isecond.size(); i++) { - bool isSelectedChild = (selection_.find(row + 2 + i) != selection_.end()); - if (isSelectedParent || isSelectedChild) { - selChanges[-1] = row + 2 + i; - } - } - - for (const auto& sel : selection_) { - if (sel > row + 1) { - selChanges[sel] = sel + it->second.size(); - } - } - std::vector entries; for (const auto& utxo : it->second) { entries.push_back({ {}, utxo.getTxHash(), utxo.getTxOutIndex()}); } beginInsertRows(QModelIndex(), row + 2, row + it->second.size() + 1); data_.insert(data_.cbegin() + row + 1, entries.cbegin(), entries.cend()); - changeSelection(selChanges); endInsertRows(); emit rowCountChanged(); emit dataChanged(createIndex(row + 1, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); @@ -203,40 +180,34 @@ void TxInputsModel::toggle(int row) void TxInputsModel::toggleSelection(int row) { if (row == 0) { - auto temp_selection = selection_; - for (const auto & sel_row : temp_selection) { - if (sel_row != 0) { - const auto& entry = data_.at(sel_row - 1); - if (entry.txId.empty()) { - toggleSelection(sel_row); - } - } - } - temp_selection = selection_; - for (const auto & sel_row : temp_selection) { - if (sel_row != 0) { - toggleSelection(sel_row); - } + selection_root_ = !selection_root_; + + if (!selection_root_) { + selection_utxos_.clear(); + selection_addresses_.clear(); } - if (selection_.find(0) == selection_.end()) { - selection_.insert(0); + else { for (int i_row = 1; i_row < rowCount(); i_row ++) { const auto& entry = data_.at(i_row-1); if (entry.txId.empty()) { - toggleSelection(i_row); + selection_addresses_.insert(entry.address); + } + const auto& itAddr = utxos_.find(entry.address); + if (itAddr != utxos_.end()) { + for (const auto& u : itAddr->second) { + selection_utxos_.insert({u.getTxHash(), u.getTxOutIndex()}); + selectedBalance_ += u.getValue(); + nbTx_++; + } } } } - else { - selection_.erase(0); - } + emit selectionChanged(); + emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), {SelectedRole}); return; } --row; -// if (data_.at(row).expanded) { -// return; -// } const auto& entry = data_.at(row); const auto& itAddr = utxos_.find(entry.address); UTXO utxo{}; @@ -257,58 +228,63 @@ void TxInputsModel::toggleSelection(int row) } int selStart = row + 1; int selEnd = row + 1; - if (selection_.find(row + 1) == selection_.end()) { - selection_.insert(row + 1); + + const bool wasSelectedAddr = (selection_addresses_.find(data_[row].address)) + != selection_addresses_.end(); + const bool wasSelectedUtxo = (selection_utxos_.find({data_[row].txId, data_[row].txOutIndex})) + != selection_utxos_.end(); + + if (!wasSelectedAddr && !wasSelectedUtxo) { if (!entry.txId.empty()) { nbTx_++; selectedBalance_ += utxo.getValue(); + selection_utxos_.insert({utxo.getTxHash(), utxo.getTxOutIndex()}); } else { + selection_addresses_.insert(entry.address); if (itAddr != utxos_.end()) { - nbTx_ += itAddr->second.size(); - for (const auto& utxo : itAddr->second) { - selectedBalance_ += utxo.getValue(); - } - if (data_.at(row).expanded) { - for (int i=0; isecond.size(); i++) { - selection_.insert(row + 2 + i); + for (const auto& utxo_addr : itAddr->second) { + if ((selection_utxos_.find({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()})) + == selection_utxos_.end()) { + selectedBalance_ += utxo_addr.getValue(); + selection_utxos_.insert({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()}); + nbTx_++; } - selEnd = row + 1 + itAddr->second.size(); } + selEnd = row + 1 + itAddr->second.size(); } } } - else { - selection_.erase(row+1); - if (!entry.txId.empty()) { - nbTx_--; - selectedBalance_ -= utxo.getValue(); - int rowParent = row - 1; - while (rowParent >= 0) { - if (data_.at(rowParent).expanded) { - selection_.erase(rowParent + 1); - break; - } - rowParent--; + else if (wasSelectedUtxo) { + nbTx_--; + selectedBalance_ -= utxo.getValue(); + int rowParent = row - 1; + selection_utxos_.erase({utxo.getTxHash(), utxo.getTxOutIndex()}); + while (rowParent >= 0) { + if (data_.at(rowParent).expanded) { + selection_addresses_.erase(data_.at(rowParent).address); + break; } - if (rowParent >= 0) - selStart = rowParent + 1; + rowParent--; } - else { - if (itAddr != utxos_.end()) { - nbTx_ -= itAddr->second.size(); - for (const auto& utxo : itAddr->second) { - selectedBalance_ -= utxo.getValue(); + if (rowParent >= 0) + selStart = rowParent + 1; + } + else if (wasSelectedAddr){ + selection_addresses_.erase(entry.address); + if (itAddr != utxos_.end()) { + for (const auto& utxo_addr : itAddr->second) { + if ((selection_utxos_.find({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()})) + != selection_utxos_.end()) { + selectedBalance_ -= utxo_addr.getValue(); + selection_utxos_.erase({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()}); + nbTx_--; } } - if (data_.at(row).expanded) { - for (int i=0; isecond.size(); i++) { - selection_.erase(row + 2 + i); - } - selEnd = row + 1 + itAddr->second.size(); - } + selEnd = row + 1 + itAddr->second.size(); } } + emit selectionChanged(); emit dataChanged(createIndex(selStart, 0), createIndex(selEnd, 0), {SelectedRole}); } @@ -331,36 +307,32 @@ QUTXOList* TxInputsModel::getSelection() preSelected_[(int)std::floor(amount * BTCNumericTypes::BalanceDivider)] = result; } else { - for (int idx : selection_) { - --idx; - const auto& entry = data_.at(idx); - if (!entry.txId.empty()) { - bool added = false; - for (const auto& byAddr : utxos_) { - for (const auto& utxo : byAddr.second) { - if ((entry.txId == utxo.getTxHash()) && (entry.txOutIndex == utxo.getTxOutIndex())) { - result.push_back(new QUTXO(utxo, (QObject*)this)); - added = true; - break; - } - } - if (added) { + for (auto sel_utxo : selection_utxos_) { + bool added = false; + for (const auto& byAddr : utxos_) { + for (const auto& utxo : byAddr.second) { + if ((sel_utxo.first == utxo.getTxHash()) && (sel_utxo.second == utxo.getTxOutIndex())) { + result.push_back(new QUTXO(utxo, (QObject*)this)); + added = true; break; } } + if (added) { + break; + } } - else { - selectedBalance_ = 0; - const auto& itUTXO = utxos_.find(entry.address); - if (itUTXO != utxos_.end()) { - for (const auto& utxo : itUTXO->second) { - selectedBalance_ += utxo.getValue(); - result.push_back(new QUTXO(utxo, (QObject*)this)); - } + emit selectionChanged(); + } + selectedBalance_ = 0; + for (auto sel_addr : selection_addresses_) { + const auto& itUTXO = utxos_.find(sel_addr); + if (itUTXO != utxos_.end()) { + for (const auto& utxo : itUTXO->second) { + selectedBalance_ += utxo.getValue(); + result.push_back(new QUTXO(utxo, (QObject*)this)); } - nbTx_ = result.size(); - preSelected_[0] = result; } + nbTx_ = result.size(); emit selectionChanged(); } } diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index 151176c55..fc1f12629 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -16,6 +16,7 @@ #include #include #include + #include "Address.h" #include "BinaryData.h" #include "TxClasses.h" @@ -108,7 +109,10 @@ class TxInputsModel : public QAbstractTableModel bool expanded{ false }; }; std::vector data_; - std::set selection_; + std::set> selection_utxos_; + std::set selection_addresses_; + bool selection_root_ {false}; + std::map> preSelected_; int nbTx_{ 0 }; uint64_t selectedBalance_{ 0 }; diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 304784de4..4f5bd00f0 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -459,7 +459,7 @@ ColumnLayout { CustomButton { id: continue_but - enabled: txOutputsModel.rowCount + enabled: txOutputsModel.rowCount > 1 width: 1084 diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index dce7e1dc3..77704aedf 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -80,7 +80,7 @@ TableView { } onDoubleClicked: { if (row !== 0) { - omponent.cellDoubleClicked(row, column, tableData) + component.cellDoubleClicked(row, column, tableData) } } } From b0bcffb70fe52cf1c60158f505e510f4e266b0ef Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 17 Feb 2023 20:33:57 +0200 Subject: [PATCH 151/436] fix pr issues --- GUI/QtQuick/TxInputsModel.cpp | 62 ++++++++++++------------ GUI/QtQuick/TxInputsModel.h | 6 +-- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 +- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 3abfae352..c4a3256e1 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -57,15 +57,15 @@ QVariant TxInputsModel::data(const QModelIndex& index, int role) const return false; } else if (index.row() == 0) { - return selection_root_; + return selectionRoot_; } else if (data_[index.row() - 1].txId.empty()) { - return (selection_addresses_.find(data_[index.row() - 1].address) - != selection_addresses_.end()); + return (selectionAddresses_.find(data_[index.row() - 1].address) + != selectionAddresses_.end()); } else { - return (selection_utxos_.find({data_[index.row() - 1].txId, data_[index.row() - 1].txOutIndex}) - != selection_utxos_.end()); + return (selectionUtxos_.find({data_[index.row() - 1].txId, data_[index.row() - 1].txOutIndex}) + != selectionUtxos_.end()); } case ExpandedRole: return (index.row() > 0 && index.column() == 0) ? data_[index.row() - 1].expanded : false; @@ -96,9 +96,9 @@ void TxInputsModel::clear() beginResetModel(); utxos_.clear(); data_.clear(); - selection_utxos_.clear(); - selection_addresses_.clear(); - selection_root_ = false; + selectionUtxos_.clear(); + selectionAddresses_.clear(); + selectionRoot_ = false; preSelected_.clear(); endResetModel(); emit rowCountChanged(); @@ -180,22 +180,22 @@ void TxInputsModel::toggle(int row) void TxInputsModel::toggleSelection(int row) { if (row == 0) { - selection_root_ = !selection_root_; + selectionRoot_ = !selectionRoot_; - if (!selection_root_) { - selection_utxos_.clear(); - selection_addresses_.clear(); + if (!selectionRoot_) { + selectionUtxos_.clear(); + selectionAddresses_.clear(); } else { for (int i_row = 1; i_row < rowCount(); i_row ++) { const auto& entry = data_.at(i_row-1); if (entry.txId.empty()) { - selection_addresses_.insert(entry.address); + selectionAddresses_.insert(entry.address); } const auto& itAddr = utxos_.find(entry.address); if (itAddr != utxos_.end()) { for (const auto& u : itAddr->second) { - selection_utxos_.insert({u.getTxHash(), u.getTxOutIndex()}); + selectionUtxos_.insert({u.getTxHash(), u.getTxOutIndex()}); selectedBalance_ += u.getValue(); nbTx_++; } @@ -229,25 +229,25 @@ void TxInputsModel::toggleSelection(int row) int selStart = row + 1; int selEnd = row + 1; - const bool wasSelectedAddr = (selection_addresses_.find(data_[row].address)) - != selection_addresses_.end(); - const bool wasSelectedUtxo = (selection_utxos_.find({data_[row].txId, data_[row].txOutIndex})) - != selection_utxos_.end(); + const bool wasSelectedAddr = (selectionAddresses_.find(data_[row].address)) + != selectionAddresses_.end(); + const bool wasSelectedUtxo = (selectionUtxos_.find({data_[row].txId, data_[row].txOutIndex})) + != selectionUtxos_.end(); if (!wasSelectedAddr && !wasSelectedUtxo) { if (!entry.txId.empty()) { nbTx_++; selectedBalance_ += utxo.getValue(); - selection_utxos_.insert({utxo.getTxHash(), utxo.getTxOutIndex()}); + selectionUtxos_.insert({utxo.getTxHash(), utxo.getTxOutIndex()}); } else { - selection_addresses_.insert(entry.address); + selectionAddresses_.insert(entry.address); if (itAddr != utxos_.end()) { for (const auto& utxo_addr : itAddr->second) { - if ((selection_utxos_.find({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()})) - == selection_utxos_.end()) { + if ((selectionUtxos_.find({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()})) + == selectionUtxos_.end()) { selectedBalance_ += utxo_addr.getValue(); - selection_utxos_.insert({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()}); + selectionUtxos_.insert({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()}); nbTx_++; } } @@ -259,10 +259,10 @@ void TxInputsModel::toggleSelection(int row) nbTx_--; selectedBalance_ -= utxo.getValue(); int rowParent = row - 1; - selection_utxos_.erase({utxo.getTxHash(), utxo.getTxOutIndex()}); + selectionUtxos_.erase({utxo.getTxHash(), utxo.getTxOutIndex()}); while (rowParent >= 0) { if (data_.at(rowParent).expanded) { - selection_addresses_.erase(data_.at(rowParent).address); + selectionAddresses_.erase(data_.at(rowParent).address); break; } rowParent--; @@ -271,13 +271,13 @@ void TxInputsModel::toggleSelection(int row) selStart = rowParent + 1; } else if (wasSelectedAddr){ - selection_addresses_.erase(entry.address); + selectionAddresses_.erase(entry.address); if (itAddr != utxos_.end()) { for (const auto& utxo_addr : itAddr->second) { - if ((selection_utxos_.find({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()})) - != selection_utxos_.end()) { + if ((selectionUtxos_.find({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()})) + != selectionUtxos_.end()) { selectedBalance_ -= utxo_addr.getValue(); - selection_utxos_.erase({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()}); + selectionUtxos_.erase({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()}); nbTx_--; } } @@ -307,7 +307,7 @@ QUTXOList* TxInputsModel::getSelection() preSelected_[(int)std::floor(amount * BTCNumericTypes::BalanceDivider)] = result; } else { - for (auto sel_utxo : selection_utxos_) { + for (auto sel_utxo : selectionUtxos_) { bool added = false; for (const auto& byAddr : utxos_) { for (const auto& utxo : byAddr.second) { @@ -324,7 +324,7 @@ QUTXOList* TxInputsModel::getSelection() emit selectionChanged(); } selectedBalance_ = 0; - for (auto sel_addr : selection_addresses_) { + for (auto sel_addr : selectionAddresses_) { const auto& itUTXO = utxos_.find(sel_addr); if (itUTXO != utxos_.end()) { for (const auto& utxo : itUTXO->second) { diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index fc1f12629..9eddfcb5c 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -109,9 +109,9 @@ class TxInputsModel : public QAbstractTableModel bool expanded{ false }; }; std::vector data_; - std::set> selection_utxos_; - std::set selection_addresses_; - bool selection_root_ {false}; + std::set> selectionUtxos_; + std::set selectionAddresses_; + bool selectionRoot_ {false}; std::map> preSelected_; int nbTx_{ 0 }; diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 4f5bd00f0..f237c7ddb 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -459,7 +459,7 @@ ColumnLayout { CustomButton { id: continue_but - enabled: txOutputsModel.rowCount > 1 + enabled: txOutputsModel.rowCount > 0 width: 1084 From b974e1a22fa5dc12179ea41715e8ecfadf7ced5d Mon Sep 17 00:00:00 2001 From: YZ Date: Sun, 19 Feb 2023 00:38:39 +0100 Subject: [PATCH 152/436] Model simplification --- GUI/QtQuick/AddressListModel.cpp | 30 +-- GUI/QtQuick/AddressListModel.h | 3 +- GUI/QtQuick/PendingTransactionFilterModel.cpp | 31 +++ GUI/QtQuick/PendingTransactionFilterModel.h | 28 +++ GUI/QtQuick/QtQuickAdapter.cpp | 13 +- GUI/QtQuick/QtQuickAdapter.h | 1 - GUI/QtQuick/TransactionFilterModel.cpp | 5 - .../TransactionForAddressFilterModel.cpp | 4 - GUI/QtQuick/TxListModel.cpp | 201 ++++++--------- GUI/QtQuick/TxListModel.h | 13 +- GUI/QtQuick/qml/ExplorerTX.qml | 6 +- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 15 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 5 - GUI/QtQuick/qml/Send/SelectInputs.qml | 2 - .../qml/Send/SignTransactionAdvanced.qml | 4 - .../CustomHorizontalHeaderView.qml | 32 +++ .../StyledControls/CustomSimpleTableView.qml | 112 +++++++++ .../StyledControls/CustomTableDelegateRow.qml | 4 +- .../qml/StyledControls/CustomTableView.qml | 231 +++++++++--------- .../StyledControls/InputOutputTableView.qml | 28 +-- GUI/QtQuick/qml/TransactionsPage.qml | 4 +- GUI/QtQuick/qtquick.qrc | 2 + 22 files changed, 438 insertions(+), 336 deletions(-) create mode 100644 GUI/QtQuick/PendingTransactionFilterModel.cpp create mode 100644 GUI/QtQuick/PendingTransactionFilterModel.h create mode 100644 GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml create mode 100644 GUI/QtQuick/qml/StyledControls/CustomSimpleTableView.qml diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index ec2250919..b2c6e55a7 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -17,8 +17,6 @@ namespace { static const QHash kRoles{ {QmlAddressListModel::TableDataRole, "tableData"}, - {QmlAddressListModel::HeadingRole, "heading"}, - {QmlAddressListModel::FirstColRole, "firstcol"}, {QmlAddressListModel::ColorRole, "dataColor"}, {QmlAddressListModel::AddressTypeRole, "addressType"}, {QmlAddressListModel::AssetTypeRole, "assetType"} }; @@ -31,7 +29,7 @@ QmlAddressListModel::QmlAddressListModel(const std::shared_ptr& int QmlAddressListModel::rowCount(const QModelIndex&) const { - return table_.size() + 1; + return table_.size(); } int QmlAddressListModel::columnCount(const QModelIndex&) const @@ -41,15 +39,12 @@ int QmlAddressListModel::columnCount(const QModelIndex&) const QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const { - const int row = index.row() - 1; + const int row = index.row(); try { switch (role) { case TableDataRole: - if (index.row() == 0) { - return header_.at(index.column()); - } - else { + { switch (index.column()) { case 0: return table_.at(row).at(0); @@ -60,15 +55,7 @@ QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const } } break; - case HeadingRole: return (index.row() == 0); - case FirstColRole: return (index.column() == 0); - case ColorRole: - if (index.row() == 0) { - return ColorScheme::tableHeaderColor; - } - else { - return QColorConstants::White; - } + case ColorRole: return QColorConstants::White; case AddressTypeRole: return table_.at(row).at(2); case AssetTypeRole: return table_.at(row).at(3); default: break; @@ -141,7 +128,7 @@ void QmlAddressListModel::updateRow(const BinaryData& addrPubKey, uint64_t bal, // logger_->debug("[QmlAddressListModel::updateRow] {} {} {}", addr.display(), bal, nbTx); if (addr.id() == addrPubKey) { - emit dataChanged(createIndex(i + 1, 1), createIndex(i + 1, 2)); + emit dataChanged(createIndex(i, 1), createIndex(i, 2)); break; } } @@ -156,6 +143,13 @@ void QmlAddressListModel::reset(const std::string& expectedWalletId) endResetModel(); } +QVariant QmlAddressListModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Orientation::Horizontal) { + return header_.at(section); + } + return QVariant(); +} quint32 QmlAddressListModel::getTransactionCount(const BinaryData& address) const { diff --git a/GUI/QtQuick/AddressListModel.h b/GUI/QtQuick/AddressListModel.h index 9e8a41886..0a3f2670e 100644 --- a/GUI/QtQuick/AddressListModel.h +++ b/GUI/QtQuick/AddressListModel.h @@ -30,8 +30,6 @@ class QmlAddressListModel: public QAbstractTableModel enum TableRoles { TableDataRole = Qt::UserRole + 1, - HeadingRole, - FirstColRole, ColorRole, AddressTypeRole, AssetTypeRole @@ -42,6 +40,7 @@ class QmlAddressListModel: public QAbstractTableModel int columnCount(const QModelIndex & = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role) const override; QHash roleNames() const override; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; void addRow(const std::string& walletId, const QVector&); void addRows(const std::string& walletId, const QVector>&); diff --git a/GUI/QtQuick/PendingTransactionFilterModel.cpp b/GUI/QtQuick/PendingTransactionFilterModel.cpp new file mode 100644 index 000000000..73a846be4 --- /dev/null +++ b/GUI/QtQuick/PendingTransactionFilterModel.cpp @@ -0,0 +1,31 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "PendingTransactionFilterModel.h" +#include "TxListModel.h" +#include + +PendingTransactionFilterModel::PendingTransactionFilterModel(QObject* parent) + : QSortFilterProxyModel(parent) +{ +} + +bool PendingTransactionFilterModel::filterAcceptsRow(int source_row, + const QModelIndex& source_parent) const +{ + const auto confirmationCountIndex = sourceModel()->index(source_row, 5); + if (sourceModel()->data(confirmationCountIndex, TxListModel::TableRoles::TableDataRole) > 6) + { + return true; + } + + return false; +} + diff --git a/GUI/QtQuick/PendingTransactionFilterModel.h b/GUI/QtQuick/PendingTransactionFilterModel.h new file mode 100644 index 000000000..f2c11ec06 --- /dev/null +++ b/GUI/QtQuick/PendingTransactionFilterModel.h @@ -0,0 +1,28 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef PENDING_TRANSACTION_FILTER_MODEL_H +#define PENDING_TRANSACTION_FILTER_MODEL_H + +#include + +class PendingTransactionFilterModel: public QSortFilterProxyModel +{ + Q_OBJECT + +public: + PendingTransactionFilterModel(QObject* parent = nullptr); + +protected: + bool filterAcceptsRow(int source_row, + const QModelIndex& source_parent) const override; +}; + +#endif // PENDING_TRANSACTION_FILTER_MODEL_H diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index ab3948e47..93a9b13f1 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -43,6 +43,7 @@ #include "TransactionFilterModel.h" #include "TransactionForAddressFilterModel.h" #include "viewmodels/WalletPropertiesVM.h" +#include "PendingTransactionFilterModel.h" #include "common.pb.h" #include "hardware_wallet.pb.h" @@ -150,7 +151,6 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) { staticLogger = logger; addrModel_ = new QmlAddressListModel(logger, this); - pendingTxModel_ = new TxListModel(logger, this); txModel_ = new TxListModel(logger, this); expTxByAddrModel_ = new TxListForAddr(logger, this); txOutputsModel_ = new TxOutputsModel(logger, this); @@ -240,6 +240,7 @@ void QtQuickAdapter::run(int &argc, char **argv) , 1, 0, "WalletBalance", tr("Error: only enums")); qmlRegisterType("terminal.models", 1, 0, "TransactionFilterModel"); qmlRegisterType("terminal.models", 1, 0, "TransactionForAddressFilterModel"); + qmlRegisterType("terminal.models", 1, 0, "PendingTransactionFilterModel"); qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); qmlRegisterUncreatableMetaObject(Transactions::staticMetaObject, "terminal.models" , 1, 0, "Transactions", tr("Error: only enums")); @@ -254,7 +255,6 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QStringLiteral("fixedFont"), fixedFont); rootCtxt_->setContextProperty(QLatin1Literal("bsApp"), this); rootCtxt_->setContextProperty(QLatin1Literal("addressListModel"), addrModel_); - rootCtxt_->setContextProperty(QLatin1Literal("pendingTxListModel"), pendingTxModel_); rootCtxt_->setContextProperty(QLatin1Literal("txListModel"), txModel_); rootCtxt_->setContextProperty(QLatin1Literal("txListByAddrModel"), expTxByAddrModel_); rootCtxt_->setContextProperty(QLatin1Literal("txInputsModel"), txInputsModel_); @@ -693,7 +693,6 @@ void QtQuickAdapter::updateStates() void QtQuickAdapter::setTopBlock(uint32_t topBlock) { blockNum_ = topBlock; - pendingTxModel_->setCurrentBlock(blockNum_); txModel_->setCurrentBlock(blockNum_); expTxByAddrModel_->setCurrentBlock(blockNum_); txInputsModel_->setTopBlock(topBlock); @@ -989,7 +988,6 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId txDet.comment = response.error_msg(); } if (!resp.comment().empty()) { - pendingTxModel_->setTxComment(resp.tx_hash(), txDet.comment); txModel_->setTxComment(resp.tx_hash(), txDet.comment); } @@ -1056,7 +1054,6 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId const auto& itTxDet = txDetailReqs_.find(msgId); if (itTxDet == txDetailReqs_.end()) { - pendingTxModel_->setDetails(txDet); txModel_->setDetails(txDet); } else { @@ -1100,11 +1097,6 @@ ProcessingResult QtQuickAdapter::processLedgerEntries(const LedgerEntries &respo } entries.push_back(std::move(txEntry)); } - for (const auto& entry : entries) { - if (entry.nbConf <= 6) { - pendingTxModel_->addRow(entry); - } - } txModel_->addRows(entries); pushRequest(user_, userWallets_, msg.SerializeAsString()); return ProcessingResult::Success; @@ -1538,7 +1530,6 @@ ProcessingResult QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMess } catch (const std::exception&) {} } - pendingTxModel_->prependRow(txEntry); txModel_->prependRow(txEntry); } pushRequest(user_, userWallets_, msg.SerializeAsString()); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 1e0c21e50..b6c52a531 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -277,7 +277,6 @@ private slots: const QStringList txTypes_; QmlAddressListModel* addrModel_{ nullptr }; - TxListModel* pendingTxModel_{ nullptr }; TxListModel* txModel_{ nullptr }; TxListForAddr* expTxByAddrModel_{ nullptr }; TxInputsModel* txInputsModel_{ nullptr }; diff --git a/GUI/QtQuick/TransactionFilterModel.cpp b/GUI/QtQuick/TransactionFilterModel.cpp index 916e108db..6a6e8d6eb 100644 --- a/GUI/QtQuick/TransactionFilterModel.cpp +++ b/GUI/QtQuick/TransactionFilterModel.cpp @@ -21,11 +21,6 @@ TransactionFilterModel::TransactionFilterModel(QObject* parent) bool TransactionFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { - if (source_row == 0) - { - return true; - } - const auto walletNameIndex = sourceModel()->index(source_row, 1); const auto transactionTypeIndex = sourceModel()->index(source_row, 2); diff --git a/GUI/QtQuick/TransactionForAddressFilterModel.cpp b/GUI/QtQuick/TransactionForAddressFilterModel.cpp index bf5fff53c..74b740a12 100644 --- a/GUI/QtQuick/TransactionForAddressFilterModel.cpp +++ b/GUI/QtQuick/TransactionForAddressFilterModel.cpp @@ -20,10 +20,6 @@ TransactionForAddressFilterModel::TransactionForAddressFilterModel(QObject* pare bool TransactionForAddressFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { - if (source_row == 0) { - return true; - } - const auto index = sourceModel()->index(source_row, 5); const auto transaction_value = sourceModel()->data(index, TxListForAddr::TableRoles::TableDataRole); if ((positive_ && transaction_value < 0) || (!positive_ && transaction_value > 0)) { diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 4fec9a191..dd6cbb4f4 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -18,22 +18,16 @@ namespace { static const QHash kTxListRoles{ {TxListModel::TableDataRole, "tableData"}, - {TxListModel::HeadingRole, "heading"}, {TxListModel::ColorRole, "dataColor"}, - {TxListModel::WidthRole, "colWidth"}, {TxListModel::TxIdRole, "txId"}, }; static const QHash kTxListForAddrRoles{ {TxListForAddr::TableDataRole, "tableData"}, - {TxListForAddr::HeadingRole, "heading"}, {TxListForAddr::ColorRole, "dataColor"}, - {TxListForAddr::WidthRole, "colWidth"}, }; static const QHash kTxInOutRoles{ {TxInOutModel::TableDataRole, "tableData"}, - {TxInOutModel::HeadingRole, "heading"}, {TxInOutModel::ColorRole, "dataColor"}, - {TxInOutModel::WidthRole, "colWidth"}, {TxInOutModel::TxHashRole, "txHash"}, }; @@ -48,7 +42,7 @@ TxListModel::TxListModel(const std::shared_ptr& logger, QObject* int TxListModel::rowCount(const QModelIndex &) const { - return data_.size() + 1; + return data_.size(); } int TxListModel::columnCount(const QModelIndex &) const @@ -61,14 +55,11 @@ QString TxListModel::getData(int row, int col) const if (row > data_.size()) { return {}; } - if (row == 0) { - return header_.at(col); - } - const auto& entry = data_.at(row - 1); + const auto& entry = data_.at(row); switch (col) { case 0: return QDateTime::fromSecsSinceEpoch(entry.txTime).toString(dateTimeFormat); - case 1: return walletName(row - 1); - case 2: return txType(row - 1); + case 1: return walletName(row); + case 2: return txType(row); case 3: { bs::Address address; if (!entry.addresses.empty()) { @@ -78,7 +69,7 @@ QString TxListModel::getData(int row, int col) const } case 4: return QString::number(std::abs(entry.value) / BTCNumericTypes::BalanceDivider, 'f', 8); case 5: return QString::number(entry.nbConf); - case 6: return txFlag(row - 1); + case 6: return txFlag(row); case 7: { const auto& itComm = txComments_.find(entry.txHash.toBinStr()); if (itComm != txComments_.end()) { @@ -93,10 +84,7 @@ QString TxListModel::getData(int row, int col) const QColor TxListModel::dataColor(int row, int col) const { - if (row == 0) { - return ColorScheme::tableHeaderColor; - } - const auto& entry = data_.at(row - 1); + const auto& entry = data_.at(row); if (col == 5) { switch (entry.nbConf) { case 0: return ColorScheme::transactionConfirmationZero; @@ -109,7 +97,7 @@ QColor TxListModel::dataColor(int row, int col) const } } else if (col == 2) { - const auto& itTxDet = txDetails_.find(row - 1); + const auto& itTxDet = txDetails_.find(row); if (itTxDet != txDetails_.end()) { switch (itTxDet->second.direction) { case bs::sync::Transaction::Direction::Received: return ColorScheme::transactionConfirmationHigh; @@ -128,21 +116,6 @@ QColor TxListModel::dataColor(int row, int col) const return QColorConstants::White; } -float TxListModel::colWidth(int col) const -{ // width ratio, sum should give columnCount() as a result - switch (col) { - case 0: return 1.5; - case 1: return 0.6; - case 2: return 0.8; - case 3: return 2.0; - case 4: return 0.8; - case 5: return 0.5; - case 6: return 0.5; - case 7: return 1.0; - } - return 1.0; -} - QString TxListModel::walletName(int row) const { const auto& itTxDet = txDetails_.find(row); @@ -195,19 +168,23 @@ QVariant TxListModel::data(const QModelIndex& index, int role) const switch (role) { case TableDataRole: return getData(index.row(), index.column()); - case HeadingRole: - return (index.row() == 0); case ColorRole: return dataColor(index.row(), index.column()); - case WidthRole: - return colWidth(index.column()); case TxIdRole: - return txId(index.row() - 1); + return txId(index.row()); default: break; } return QVariant(); } +QVariant TxListModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Orientation::Horizontal) { + return header_.at(section); + } + return QVariant(); +} + QHash TxListModel::roleNames() const { return kTxListRoles; @@ -217,17 +194,17 @@ void TxListModel::addRows(const std::vector& entries) { std::vector newEntries; for (const auto& entry : entries) { - int row = 0; + int row = -1; for (int i = 0; i < data_.size(); ++i) { const auto& de = data_.at(i); if ((entry.txHash == de.txHash) && (de.walletIds == entry.walletIds)) { data_[i].txTime = entry.txTime; data_[i].recvTime = entry.recvTime; - row = i + 1; + row = i; break; } } - if (row) { + if (row != -1) { //logger_->debug("[{}::{}] updating entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); emit dataChanged(createIndex(row, 0), createIndex(row, 0)); } @@ -248,11 +225,11 @@ void TxListModel::prependRow(const bs::TXEntry& entry) { //logger_->debug("[{}::{}] prepending entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); decltype(txDetails_) prevDet; - beginInsertRows(QModelIndex(), 1, 1); + beginInsertRows(QModelIndex(), 0, 0); data_.insert(data_.cbegin(), entry); txDetails_.swap(prevDet); for (auto txDet : prevDet) { - txDetails_[txDet.first + 1] = std::move(txDet.second); + txDetails_[txDet.first] = std::move(txDet.second); } endInsertRows(); emit nbTxChanged(); @@ -260,18 +237,18 @@ void TxListModel::prependRow(const bs::TXEntry& entry) void TxListModel::addRow(const bs::TXEntry& entry) { - int row = 0; + int row = -1; for (int i = 0; i < data_.size(); ++i) { const auto& de = data_.at(i); if ((entry.txHash == de.txHash) && (de.walletIds == entry.walletIds)) { data_[i].txTime = entry.txTime; data_[i].recvTime = entry.recvTime; - row = i + 1; + row = i; break; } } - if (row) { + if (row != -1) { //logger_->debug("[{}::{}] updating entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); emit dataChanged(createIndex(row, 0), createIndex(row, 0)); } @@ -296,36 +273,37 @@ void TxListModel::clear() void TxListModel::setTxComment(const std::string& txHash, const std::string& comment) { txComments_[txHash] = comment; - int rowFirst = 0, rowLast = 0; + int rowFirst = -1, rowLast = -1; for (int i = 0; i < data_.size(); ++i) { const auto& txEntryHash = data_.at(i).txHash.toBinStr(); if (txHash == txEntryHash) { if (!rowFirst) { - rowFirst = i + 1; + rowFirst = i; } - rowLast = i + 1; + rowLast = i; } } - if (rowFirst && rowLast) { + if (rowFirst != -1 && rowLast != -1) { emit dataChanged(createIndex(rowFirst, 7), createIndex(rowLast, 7)); } } void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet) { - int row = 0; + int row = -1; for (int i = 0; i < data_.size(); ++i) { const auto& entry = data_.at(i); if ((entry.txHash == txDet.txHash) && (txDet.walletIds == entry.walletIds)) { txDetails_[i] = txDet; data_[i].addresses = txDet.ownAddresses; - row = i + 1; + row = i; break; } } - if (row) { - //logger_->debug("[{}] {} {} found at row {}", __func__, txDet.txHash.toHexStr(), txDet.hdWalletId, row); + if (row != -1) { emit dataChanged(createIndex(row, 1), createIndex(row, 6)); + //logger_->debug("[{}] {} {} found at row {}", __func__, txDet.txHash.toHexStr(), txDet.hdWalletId, row); + } else { //logger_->debug("[{}] {} {} not found", __func__, txDet.txHash.toHexStr(), txDet.hdWalletId); @@ -346,7 +324,7 @@ void TxListModel::setCurrentBlock(uint32_t nbBlock) for (auto& entry : data_) { entry.nbConf += diff; } - emit dataChanged(createIndex(1, 5), createIndex(data_.size(), 5)); + emit dataChanged(createIndex(0, 5), createIndex(data_.size() - 1, 5)); } bool TxListModel::exportCSVto(const QString& filename) @@ -363,14 +341,14 @@ bool TxListModel::exportCSVto(const QString& filename) return false; } fstrm << "sep=;\nTimestamp;Wallet;Type;Address;TxId;Amount;Comment\n"; - for (int i = 1; i < rowCount(); ++i) { - const auto& entry = data_.at(i - 1); + for (int i = 0; i < rowCount(); ++i) { + const auto& entry = data_.at(i); std::time_t txTime = entry.txTime; fstrm << "\"" << std::put_time(std::localtime(&txTime), "%Y-%m-%d %X") << "\";" << "\"" << getData(i, 1).toUtf8().toStdString() << "\";" << getData(i, 2).toStdString() << ";" << getData(i, 3).toStdString() << ";" - << txId(i - 1).toStdString() << ";" + << txId(i).toStdString() << ";" << fmt::format("{:.8f}", entry.value / BTCNumericTypes::BalanceDivider) << ";" << "\"" << getData(i, 7).toStdString() << "\"\n"; } @@ -386,7 +364,7 @@ TxListForAddr::TxListForAddr(const std::shared_ptr& logger, QObj int TxListForAddr::rowCount(const QModelIndex&) const { - return data_.size() + 1; + return data_.size(); } int TxListForAddr::columnCount(const QModelIndex&) const @@ -415,21 +393,18 @@ QString TxListForAddr::getData(int row, int col) const if (row > data_.size()) { return {}; } - if (row == 0) { - return header_.at(col); - } - const auto& entry = data_.at(row - 1); - const auto totFees = totalFees(row - 1); + const auto& entry = data_.at(row); + const auto totFees = totalFees(row); switch (col) { case 0: return QDateTime::fromSecsSinceEpoch(entry.txTime).toString(dateTimeFormat); - case 1: return txId(row - 1); + case 1: return txId(row); case 2: return QString::number(entry.nbConf); - case 3: return displayNb(nbInputs(row - 1)); - case 4: return displayNb(nbOutputs(row - 1)); + case 3: return displayNb(nbInputs(row)); + case 4: return displayNb(nbOutputs(row)); case 5: return QString::number(entry.value / BTCNumericTypes::BalanceDivider, 'f', 8); case 6: return displayBTC(totFees / BTCNumericTypes::BalanceDivider); - case 7: return (totFees < 0) ? tr("...") : displayBTC(totFees / (double)txSize(row - 1), 1); - case 8: return displayNb(txSize(row - 1)); + case 7: return (totFees < 0) ? tr("...") : displayBTC(totFees / (double)txSize(row), 1); + case 8: return displayNb(txSize(row)); default: break; } return {}; @@ -488,10 +463,7 @@ int64_t TxListForAddr::totalFees(int row) const QColor TxListForAddr::dataColor(int row, int col) const { - if (row == 0) { - return ColorScheme::tableHeaderColor; - } - const auto& entry = data_.at(row - 1); + const auto& entry = data_.at(row); if (col == 2) { switch (entry.nbConf) { case 0: return ColorScheme::transactionConfirmationZero; @@ -506,23 +478,6 @@ QColor TxListForAddr::dataColor(int row, int col) const return QColorConstants::White; } -float TxListForAddr::colWidth(int col) const -{ // width ratio, sum should give columnCount() as a result - switch (col) { - case 0: return 1.6; - case 1: return 3.7; - case 2: return 0.5; - case 3: return 0.4; - case 4: return 0.4; - case 5: return 0.8; - case 6: return 0.8; - case 7: return 0.4; - case 8: return 0.4; - default: break; - } - return 1.0; -} - QString TxListForAddr::txId(int row) const { try { @@ -540,17 +495,21 @@ QVariant TxListForAddr::data(const QModelIndex& index, int role) const switch (role) { case TableDataRole: return getData(index.row(), index.column()); - case HeadingRole: - return (index.row() == 0); case ColorRole: return dataColor(index.row(), index.column()); - case WidthRole: - return colWidth(index.column()); default: break; } return QVariant(); } +QVariant TxListForAddr::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Orientation::Horizontal) { + return header_.at(section); + } + return QVariant(); +} + QHash TxListForAddr::roleNames() const { return kTxListForAddrRoles; @@ -577,22 +536,22 @@ void TxListForAddr::clear() void TxListForAddr::setDetails(const std::vector& txs) { - int rowStart = 0, rowEnd = 0; + int rowStart = -1, rowEnd = -1; for (const auto& tx : txs) { for (int i = 0; i < data_.size(); ++i) { const auto& entry = data_.at(i); if (entry.txHash == tx.getThisHash()) { txs_[i] = tx; if (!rowStart) { - rowStart = i + 1; + rowStart = i; } if (rowEnd <= i) { - rowEnd = i + 1; + rowEnd = i; } } } } - if (rowStart && rowEnd) { + if (rowStart != -1 && rowEnd != -1) { emit dataChanged(createIndex(rowStart, 3), createIndex(rowEnd, 8)); } } @@ -602,7 +561,7 @@ void TxListForAddr::setInputs(const std::vector& txs) for (const auto& tx : txs) { inputs_[tx.getThisHash()] = tx; } - emit dataChanged(createIndex(1, 6), createIndex(data_.size(), 7)); + emit dataChanged(createIndex(0, 6), createIndex(data_.size() - 1, 7)); } void TxListForAddr::setCurrentBlock(uint32_t nbBlock) @@ -619,7 +578,7 @@ void TxListForAddr::setCurrentBlock(uint32_t nbBlock) for (auto& entry : data_) { entry.nbConf += diff; } - emit dataChanged(createIndex(1, 2), createIndex(data_.size(), 2)); + emit dataChanged(createIndex(0, 2), createIndex(data_.size() - 1, 2)); } QString TxListForAddr::totalReceived() const @@ -758,7 +717,7 @@ TxInOutModel::TxInOutModel(const std::vector& data, co int TxInOutModel::rowCount(const QModelIndex&) const { - return data_.size() + 1; + return data_.size(); } int TxInOutModel::columnCount(const QModelIndex&) const @@ -774,15 +733,11 @@ QVariant TxInOutModel::data(const QModelIndex& index, int role) const switch (role) { case TableDataRole: return getData(index.row(), index.column()); - case HeadingRole: - return (index.row() == 0); case ColorRole: return dataColor(index.row(), index.column()); - case WidthRole: - return colWidth(index.column()); case TxHashRole: try { - return QString::fromStdString(data_.at(index.row() - 1).outHash.toHexStr(true)); + return QString::fromStdString(data_.at(index.row()).outHash.toHexStr(true)); } catch (const std::exception&) { return {}; } default: break; @@ -790,6 +745,14 @@ QVariant TxInOutModel::data(const QModelIndex& index, int role) const return {}; } +QVariant TxInOutModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Orientation::Horizontal) { + return header_.at(section); + } + return QVariant(); +} + QHash TxInOutModel::roleNames() const { return kTxInOutRoles; @@ -800,15 +763,12 @@ QString TxInOutModel::getData(int row, int col) const if (row > data_.size()) { return {}; } - if (row == 0) { - return header_.at(col); - } try { switch (col) { case 0: return type_; - case 1: return QString::fromStdString(data_.at(row - 1).address.display()); - case 2: return QString::fromStdString(data_.at(row - 1).valueStr); - case 3: return QString::fromStdString(data_.at(row - 1).walletName); + case 1: return QString::fromStdString(data_.at(row).address.display()); + case 2: return QString::fromStdString(data_.at(row).valueStr); + case 3: return QString::fromStdString(data_.at(row).walletName); default: break; } } @@ -820,20 +780,5 @@ QString TxInOutModel::getData(int row, int col) const QColor TxInOutModel::dataColor(int row, int col) const { - if (row == 0) { - return ColorScheme::tableHeaderColor; - } return QColorConstants::White; } - -float TxInOutModel::colWidth(int col) const -{ - switch (col) { - case 0: return 0.3; - case 1: return 2.5; - case 2: return 0.6; - case 3: return 0.6; - default: break; - } - return 1.0; -} diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 8bfa4610c..0ca7cef23 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -27,14 +27,14 @@ class TxListModel : public QAbstractTableModel { Q_OBJECT public: - enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole - , WidthRole, TxIdRole }; + enum TableRoles { TableDataRole = Qt::UserRole + 1, ColorRole, TxIdRole }; TxListModel(const std::shared_ptr&, QObject* parent = nullptr); int rowCount(const QModelIndex & = QModelIndex()) const override; int columnCount(const QModelIndex & = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role) const override; QHash roleNames() const override; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; Q_PROPERTY(int nbTx READ nbTx NOTIFY nbTxChanged); int nbTx() const { return data_.size(); } @@ -55,7 +55,6 @@ class TxListModel : public QAbstractTableModel private: QString getData(int row, int col) const; QColor dataColor(int row, int col) const; - float colWidth(int col) const; QString walletName(int row) const; QString txType(int row) const; QString txFlag(int row) const; @@ -76,7 +75,7 @@ class TxListForAddr : public QAbstractTableModel Q_OBJECT public: enum TableRoles { - TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole, WidthRole + TableDataRole = Qt::UserRole + 1, ColorRole }; TxListForAddr(const std::shared_ptr&, QObject* parent = nullptr); @@ -84,6 +83,7 @@ class TxListForAddr : public QAbstractTableModel int columnCount(const QModelIndex & = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role) const override; QHash roleNames() const override; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; void addRows(const std::vector&); void clear(); @@ -106,7 +106,6 @@ class TxListForAddr : public QAbstractTableModel private: QString getData(int row, int col) const; QColor dataColor(int row, int col) const; - float colWidth(int col) const; QString txId(int row) const; int nbInputs(int row) const; int nbOutputs(int row) const; @@ -128,7 +127,7 @@ class TxInOutModel : public QAbstractTableModel Q_OBJECT public: enum TableRoles { - TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole, WidthRole, TxHashRole + TableDataRole = Qt::UserRole + 1, ColorRole, TxHashRole }; TxInOutModel(const std::vector& data, const QString& type, QObject* parent = nullptr); @@ -136,11 +135,11 @@ class TxInOutModel : public QAbstractTableModel int columnCount(const QModelIndex & = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role) const override; QHash roleNames() const override; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; private: QString getData(int row, int col) const; QColor dataColor(int row, int col) const; - float colWidth(int col) const; private: const QString type_; diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index 85b2a17a1..90336910b 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -225,9 +225,9 @@ Item { columnWidths: [0.0, 0.7, 0.2, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) - // TODO: change constant 261 with C++ defined enum + // TODO: change constant 259 with C++ defined enum onCellClicked: (row, column, data) => { - var address = model.data(model.index(row, 0), 261) + var address = model.data(model.index(row, 0), 259) requestPageChange(address) } } @@ -274,7 +274,7 @@ Item { // TODO: change constant 257 with C++ defined enum onCellClicked: (row, column, data) => { - var address = model.data(model.index(row, 0), 257) + var address = model.data(model.index(row, 1), 257) requestPageChange(address) } } diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index fd984dc4b..49096ddb2 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -9,10 +9,12 @@ */ import QtQuick 2.15 +import QtQuick.Controls 2.15 import "../BsStyles" import "../StyledControls" import "." as OverviewControls +import terminal.models 1.0 Rectangle { id: control @@ -58,6 +60,7 @@ Rectangle { spacing: 10 Rectangle { + id: tableMenu color: "transparent" width: parent.width height: 30 @@ -97,8 +100,9 @@ Rectangle { } CustomTableView { + id: tablewView width: parent.width - height: parent.height - 40 + height: parent.height - tableMenu.height model: addressListModel copy_button_column_index: 0 @@ -110,8 +114,8 @@ Rectangle { const transactions = model.data(model.index(row, 1), 257) const balance = model.data(model.index(row, 2), 257) const comment = model.data(model.index(row, 3), 257) - const type = model.data(model.index(row, 0), 261) - const asset_type = model.data(model.index(row, 0), 262) + const type = model.data(model.index(row, 0), 259) + const asset_type = model.data(model.index(row, 0), 260) openAddressDetails(address, transactions, balance, comment, asset_type, type, overview_panel.currentWallet) } @@ -141,7 +145,10 @@ Rectangle { CustomTableView { width: parent.width height: parent.height - 40 - model: pendingTxListModel + + model: PendingTransactionFilterModel { + sourceModel: txListModel + } copy_button_column_index: 3 columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index f237c7ddb..4b1a686f8 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -201,9 +201,6 @@ ColumnLayout { model: txInputsSelectedModel columnWidths: [0.7, 0.1, 0, 0.2] - - text_header_size: 12 - cell_text_size: 13 copy_button_column_index: -1 Component @@ -430,8 +427,6 @@ ColumnLayout { model:txOutputsModel columnWidths: [0.744, 0.20, 0.056] - text_header_size: 12 - cell_text_size: 13 copy_button_column_index: -1 delete_button_column_index: 2 diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml index caa71f1fd..784cfdc63 100644 --- a/GUI/QtQuick/qml/Send/SelectInputs.qml +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -56,8 +56,6 @@ ColumnLayout { model: txInputsModel columnWidths: [0.7, 0.1, 0.1, 0.1] - text_header_size: 12 - cell_text_size: 13 copy_button_column_index: -1 Component diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml index 296d9740f..be4d44b9d 100644 --- a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -65,8 +65,6 @@ ColumnLayout { model: txInputsSelectedModel columnWidths: [0.7, 0.1, 0, 0.2] - text_header_size: 12 - cell_text_size: 13 copy_button_column_index: -1 function get_text_left_padding(row, column) @@ -103,8 +101,6 @@ ColumnLayout { model:txOutputsModel columnWidths: [0.744, 0.20, 0.056] - text_header_size: 12 - cell_text_size: 13 copy_button_column_index: -1 delete_button_column_index: 2 diff --git a/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml b/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml new file mode 100644 index 000000000..aae24469c --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml @@ -0,0 +1,32 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import "../BsStyles" + +HorizontalHeaderView { + delegate: Rectangle { + + implicitHeight: 34 + color: BSStyle.tableCellBackgroundColor + + Text { + text: display + height: parent.height + verticalAlignment: Text.AlignVCenter + clip: true + color: BSStyle.titleTextColor + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: 11 + leftPadding: 10 + } + + Rectangle { + height: 1 + width: parent.width + color: BSStyle.tableSeparatorColor + + anchors.bottom: parent.bottom + } + } +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomSimpleTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomSimpleTableView.qml new file mode 100644 index 000000000..24c0fcef2 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomSimpleTableView.qml @@ -0,0 +1,112 @@ + +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import "../BsStyles" +import "." + +Column { + id: root + width: 1200 + height: 200 + spacing: 2 + + property alias model: component.model + property alias delegate: component.delegate + property var columnWidths + property int copy_button_column_index: 0 + + signal copyRequested(var id) + signal cellClicked(var row, var column, var data) + signal cellDoubleClicked(var row, var column, var data) + + CustomHorizontalHeaderView { + id: tableHeader + width: parent.width + syncView: component + height: 32 + } + + TableView { + id: component + width: parent.width + height: parent.height - tableHeader.height + columnSpacing: 0 + rowSpacing: 0 + clip: true + boundsBehavior: Flickable.StopAtBounds + + ScrollBar.vertical: ScrollBar { } + + + columnWidthProvider: function (column) { + return root.columnWidths[column] * component.width + } + + property int selected_row_index: -1 + + onWidthChanged: component.forceLayout() + + delegate: Rectangle { + implicitHeight: 34 + color: row == component.selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor + + MouseArea { + anchors.fill: parent + preventStealing: true + propagateComposedEvents: true + hoverEnabled: true + + onEntered: component.selected_row_index = row + onExited: component.selected_row_index = -1 + onClicked: root.cellClicked(row, column, tableData) + onDoubleClicked: root.cellDoubleClicked(row, column, tableData) + } + + Row { + width: parent.width + height: parent.height + + Text { + id: internal_text + text: tableData + height: parent.height + verticalAlignment: Text.AlignVCenter + clip: true + + color: dataColor + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: 12 + + leftPadding: 10 + } + + CopyIconButton { + id: copy_icon + x: internal_text.contentWidth + copy_icon.width / 2 + visible: column === root.copy_button_column_index && row == component.selected_row_index + onCopy: root.copyRequested(tableData) + } + } + + Rectangle { + height: 1 + width: parent.width + color: BSStyle.tableSeparatorColor + + anchors.bottom: parent.bottom + } + } + } +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml b/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml index 9d577841b..6989a0ae7 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml @@ -36,7 +36,7 @@ Component color: get_data_color(model_row, model_column) font.family: "Roboto" font.weight: Font.Normal - font.pixelSize: model_row === 0 ? text_header_size : cell_text_size + font.pixelSize: 12 leftPadding: get_text_left_padding(model_row, model_column, model_is_expandable) } @@ -44,7 +44,7 @@ Component DeleteIconButton { id: delete_icon x: 0 - visible: model_column === delete_button_column_index && model_row > 0 + visible: model_column === delete_button_column_index onDeleteRequested: root.deleteRequested(model_row) } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index 6d20668fa..a5acb2627 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -14,166 +14,159 @@ import QtQuick.Controls 2.15 import "../BsStyles" -TableView { - id: component +Column { + id: root width: 1200 height: 200 + spacing: 2 - reuseItems: false + property alias model: component.model + property alias delegate: component.delegate + property var columnWidths + property int copy_button_column_index: 0 + property int delete_button_column_index: -1 + property int left_text_padding: 10 - columnSpacing: 0 - rowSpacing: 0 - clip: true - boundsBehavior: Flickable.StopAtBounds + signal copyRequested(var id) + signal deleteRequested(int id) + signal cellClicked(var row, var column, var data) + signal cellDoubleClicked(var row, var column, var data) + + CustomHorizontalHeaderView { + id: tableHeader + width: parent.width + syncView: component + height: 32 + } - flickDeceleration: 750 - maximumFlickVelocity: 1000 + TableView { + id: component + width: parent.width + height: parent.height - tableHeader.height - ScrollBar.vertical: ScrollBar { - policy: contentHeight > height ? ScrollBar.AlwaysOn : ScrollBar.AsNeeded - } + reuseItems: false - signal copyRequested(var id) - signal deleteRequested(int id) - signal cellClicked(int row, int column, var data) - signal cellDoubleClicked(int row, int column, var data) + columnSpacing: 0 + rowSpacing: 0 + clip: true + boundsBehavior: Flickable.StopAtBounds - property int text_header_size: 11 - property int cell_text_size: 12 - property int copy_button_column_index: 0 - property int delete_button_column_index: -1 + flickDeceleration: 750 + maximumFlickVelocity: 1000 - property int left_text_padding: 10 + ScrollBar.vertical: ScrollBar { + policy: contentHeight > height ? ScrollBar.AlwaysOn : ScrollBar.AsNeeded + } - property var columnWidths: ({}) - columnWidthProvider: function (column) { - return columnWidths[column] * component.width - } + columnWidthProvider: function (column) { + return columnWidths[column] * component.width + } - property int selected_row_index: -1 + property int selected_row_index: -1 - onWidthChanged: component.forceLayout() + onWidthChanged: component.forceLayout() - delegate: Rectangle { - id: delega + delegate: Rectangle { + id: delega - implicitHeight: 34 - color: row === 0 ? BSStyle.tableCellBackgroundColor : (row === selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor) + implicitHeight: 34 + color: row === component.selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor - MouseArea { - anchors.fill: parent - preventStealing: true - propagateComposedEvents: true - hoverEnabled: true + MouseArea { + anchors.fill: parent + preventStealing: true + propagateComposedEvents: true + hoverEnabled: true - onEntered: { - if (row !== 0) { - component.selected_row_index = row - } + onEntered: component.selected_row_index = row + onExited: component.selected_row_index = -1 + onClicked: root.cellClicked(row, column, tableData) + onDoubleClicked: root.cellDoubleClicked(row, column, tableData) } - onExited: { - if (row !== 0) { - component.selected_row_index = -1 - } - } + Loader { + id: row_loader - onClicked: { - if (row !== 0) { - component.cellClicked(row, column, tableData) - } - } - onDoubleClicked: { - if (row !== 0) { - component.cellDoubleClicked(row, column, tableData) - } - } - } + width: parent.width + height: childrenRect.height - Loader { - id: row_loader + property int delete_button_column_index: root.delete_button_column_index + property int copy_button_column_index: root.copy_button_column_index + property int selected_row_index: component.selected_row_index + property int model_row: row + property int model_column: column - width: parent.width - height: childrenRect.height + property string model_tableData: (typeof tableData !== "undefined") ? tableData : ({}) + property bool model_selected: (typeof selected !== "undefined") ? selected : ({}) + property bool model_expanded: (typeof expanded !== "undefined") ? expanded : ({}) + property bool model_is_expandable: (typeof is_expandable !== "undefined") ? is_expandable : ({}) - property int delete_button_column_index: component.delete_button_column_index - property int text_header_size: component.text_header_size - property int cell_text_size: component.cell_text_size - property int copy_button_column_index: component.copy_button_column_index - property int selected_row_index: component.selected_row_index - property int model_row: row - property int model_column: column + function get_text_left_padding(row, column, isExpandable) + { + if (typeof component.get_text_left_padding === "function") + return component.get_text_left_padding(row, column, isExpandable) + else + return left_text_padding + } - property string model_tableData: (typeof tableData !== "undefined") ? tableData : ({}) - property bool model_selected: (typeof selected !== "undefined") ? selected : ({}) - property bool model_expanded: (typeof expanded !== "undefined") ? expanded : ({}) - property bool model_is_expandable: (typeof is_expandable !== "undefined") ? is_expandable : ({}) + function get_data_color(row, column) + { + if (typeof component.get_data_color === "function") + { + var res = component.get_data_color(row, column) + if (res!== null) + return res + } + + return (typeof dataColor !== "undefined") ? dataColor : ({}) + } - function get_text_left_padding(row, column, isExpandable) - { - if (typeof component.get_text_left_padding === "function") - return component.get_text_left_padding(row, column, isExpandable) - else - return left_text_padding + Component.onCompleted: { + delega.update_row_loader_size() + } } - function get_data_color(row, column) - { - if (typeof component.get_data_color === "function") + Connections { + target: row_loader.item + function onDeleteRequested (row) { - var res = component.get_data_color(row, column) - if (res!== null) - return res + root.deleteRequested(row) + } + function onCopyRequested (tableData) + { + root.copyRequested(tableData) } - - return (typeof dataColor !== "undefined") ? dataColor : ({}) } - Component.onCompleted: { + onWidthChanged: { delega.update_row_loader_size() } - } - Connections { - target: row_loader.item - function onDeleteRequested (row) - { - component.deleteRequested(row) - } - function onCopyRequested (tableData) - { - component.copyRequested(tableData) + onHeightChanged: { + delega.update_row_loader_size() } - } - onWidthChanged: { - delega.update_row_loader_size() - } - - onHeightChanged: { - delega.update_row_loader_size() - } - - function update_row_loader_size() - { - row_loader.width = delega.width - row_loader.height = childrenRect.height - if (row_loader.width && row_loader.height && !row_loader.sourceComponent) + function update_row_loader_size() { - row_loader.sourceComponent = choose_row_source_component(row, column) + row_loader.width = delega.width + row_loader.height = childrenRect.height + if (row_loader.width && row_loader.height && !row_loader.sourceComponent) + { + row_loader.sourceComponent = choose_row_source_component(row, column) + } } - } - Rectangle { + Rectangle { - anchors.left: parent.left - anchors.leftMargin: get_line_left_padding(row, column, is_expandable) + anchors.left: parent.left + anchors.leftMargin: get_line_left_padding(row, column, is_expandable) - height: 1 - width: parent.width - color: BSStyle.tableSeparatorColor + height: 1 + width: parent.width + color: BSStyle.tableSeparatorColor - anchors.bottom: parent.bottom + anchors.bottom: parent.bottom + } } } diff --git a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml index bb0f5a8be..a9f0b6eb1 100644 --- a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml @@ -24,8 +24,8 @@ CustomTableView { } delegate: Rectangle { - implicitHeight: row === 0 ? 34 : 58 - color: row === 0 ? BSStyle.tableCellBackgroundColor : (row === component.selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor) + implicitHeight: 58 + color: (row === component.selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor) MouseArea { anchors.fill: parent @@ -33,18 +33,8 @@ CustomTableView { propagateComposedEvents: true hoverEnabled: true - onEntered: { - if (row !== 0) { - component.selected_row_index = row - } - } - - onExited: { - if (row !== 0) { - component.selected_row_index = -1 - } - } - + onEntered: component.selected_row_index = row + onExited: component.selected_row_index = -1 onClicked: component.cellClicked(row, column, tableData) onDoubleClicked: component.cellDoubleClicked(row, column, tableData) } @@ -55,24 +45,24 @@ CustomTableView { Text { id: internal_text - visible: column !== 1 || row === 0 + visible: column !== 1 text: tableData height: parent.height - verticalAlignment: row === 0 ? Text.AlignVCenter : Text.AlignTop + verticalAlignment: Text.AlignTop clip: true color: dataColor font.family: "Roboto" font.weight: Font.Normal - font.pixelSize: row === 0 ? component.text_header_size : component.cell_text_size + font.pixelSize: 13 leftPadding: 10 - topPadding: row === 0 ? 0 : 9 + topPadding: 9 } Column { spacing: 8 - visible: column === 1 && row !== 0 + visible: column === 1 width: parent.width anchors.centerIn: parent diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 575d35d0c..f0c47d301 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -155,12 +155,12 @@ Item { columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) onCellClicked: (row, column, data) => { - const txHash = model.data(model.index(row, 0), 261) + const txHash = model.data(model.index(row, 0), 259) transactionDetails.walletName = model.data(model.index(row, 1), 257) transactionDetails.address = model.data(model.index(row, 3), 257) transactionDetails.txDateTime = model.data(model.index(row, 0), 257) transactionDetails.txType = model.data(model.index(row, 2), 257) - transactionDetails.txTypeColor = model.data(model.index(row, 2), 259) + transactionDetails.txTypeColor = model.data(model.index(row, 2), 258) transactionDetails.txComment = model.data(model.index(row, 7), 257) transactionDetails.txAmount = model.data(model.index(row, 4), 257) transactionDetails.tx = bsApp.getTXDetails(txHash) diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index cca53c27e..ea3f8e010 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -181,5 +181,7 @@ qml/WalletProperties/WalletSeed.qml qml/WalletProperties/WalletSeedAuth.qml images/wallet_icon_warn.svg + qml/StyledControls/CustomSimpleTableView.qml + qml/StyledControls/CustomHorizontalHeaderView.qml From dded4732b20fd98cae363775faebaddcc9d38557 Mon Sep 17 00:00:00 2001 From: YZ Date: Mon, 20 Feb 2023 15:55:51 +0100 Subject: [PATCH 153/436] Removing temp files --- GUI/QtQuick/qml/Send/SelectInputs.qml | 1 + .../StyledControls/CustomSimpleTableView.qml | 112 ------------------ .../qml/StyledControls/CustomTableView.qml | 2 + GUI/QtQuick/qtquick.qrc | 1 - 4 files changed, 3 insertions(+), 113 deletions(-) delete mode 100644 GUI/QtQuick/qml/StyledControls/CustomSimpleTableView.qml diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml index 784cfdc63..12f06f51d 100644 --- a/GUI/QtQuick/qml/Send/SelectInputs.qml +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -57,6 +57,7 @@ ColumnLayout { columnWidths: [0.7, 0.1, 0.1, 0.1] copy_button_column_index: -1 + has_header: false Component { diff --git a/GUI/QtQuick/qml/StyledControls/CustomSimpleTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomSimpleTableView.qml deleted file mode 100644 index 24c0fcef2..000000000 --- a/GUI/QtQuick/qml/StyledControls/CustomSimpleTableView.qml +++ /dev/null @@ -1,112 +0,0 @@ - -/* - -*********************************************************************************** -* Copyright (C) 2023, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2.15 -import QtQuick.Controls 2.15 - -import "../BsStyles" -import "." - -Column { - id: root - width: 1200 - height: 200 - spacing: 2 - - property alias model: component.model - property alias delegate: component.delegate - property var columnWidths - property int copy_button_column_index: 0 - - signal copyRequested(var id) - signal cellClicked(var row, var column, var data) - signal cellDoubleClicked(var row, var column, var data) - - CustomHorizontalHeaderView { - id: tableHeader - width: parent.width - syncView: component - height: 32 - } - - TableView { - id: component - width: parent.width - height: parent.height - tableHeader.height - columnSpacing: 0 - rowSpacing: 0 - clip: true - boundsBehavior: Flickable.StopAtBounds - - ScrollBar.vertical: ScrollBar { } - - - columnWidthProvider: function (column) { - return root.columnWidths[column] * component.width - } - - property int selected_row_index: -1 - - onWidthChanged: component.forceLayout() - - delegate: Rectangle { - implicitHeight: 34 - color: row == component.selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor - - MouseArea { - anchors.fill: parent - preventStealing: true - propagateComposedEvents: true - hoverEnabled: true - - onEntered: component.selected_row_index = row - onExited: component.selected_row_index = -1 - onClicked: root.cellClicked(row, column, tableData) - onDoubleClicked: root.cellDoubleClicked(row, column, tableData) - } - - Row { - width: parent.width - height: parent.height - - Text { - id: internal_text - text: tableData - height: parent.height - verticalAlignment: Text.AlignVCenter - clip: true - - color: dataColor - font.family: "Roboto" - font.weight: Font.Normal - font.pixelSize: 12 - - leftPadding: 10 - } - - CopyIconButton { - id: copy_icon - x: internal_text.contentWidth + copy_icon.width / 2 - visible: column === root.copy_button_column_index && row == component.selected_row_index - onCopy: root.copyRequested(tableData) - } - } - - Rectangle { - height: 1 - width: parent.width - color: BSStyle.tableSeparatorColor - - anchors.bottom: parent.bottom - } - } - } -} diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index a5acb2627..373a3b25b 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -26,6 +26,7 @@ Column { property int copy_button_column_index: 0 property int delete_button_column_index: -1 property int left_text_padding: 10 + property bool has_header: true signal copyRequested(var id) signal deleteRequested(int id) @@ -37,6 +38,7 @@ Column { width: parent.width syncView: component height: 32 + visible: root.has_header } TableView { diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index ea3f8e010..141f6f5e4 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -181,7 +181,6 @@ qml/WalletProperties/WalletSeed.qml qml/WalletProperties/WalletSeedAuth.qml images/wallet_icon_warn.svg - qml/StyledControls/CustomSimpleTableView.qml qml/StyledControls/CustomHorizontalHeaderView.qml From 363742ec75329e4e1922ce8cadbb0491952b5deb Mon Sep 17 00:00:00 2001 From: YZ Date: Mon, 20 Feb 2023 16:28:28 +0100 Subject: [PATCH 154/436] Returning text size properties; optional heading visibility --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 7 +++++++ GUI/QtQuick/qml/Send/SelectInputs.qml | 2 ++ GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml | 6 ++++++ .../qml/StyledControls/CustomHorizontalHeaderView.qml | 5 ++++- GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml | 3 ++- GUI/QtQuick/qml/StyledControls/CustomTableView.qml | 4 ++++ 6 files changed, 25 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 4b1a686f8..9338f1c38 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -201,7 +201,11 @@ ColumnLayout { model: txInputsSelectedModel columnWidths: [0.7, 0.1, 0, 0.2] + + text_header_size: 12 + cell_text_size: 13 copy_button_column_index: -1 + has_header: false Component { @@ -427,8 +431,11 @@ ColumnLayout { model:txOutputsModel columnWidths: [0.744, 0.20, 0.056] + text_header_size: 12 + cell_text_size: 13 copy_button_column_index: -1 delete_button_column_index: 2 + has_header: false onDeleteRequested: (row) => { diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml index 12f06f51d..49012411d 100644 --- a/GUI/QtQuick/qml/Send/SelectInputs.qml +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -56,6 +56,8 @@ ColumnLayout { model: txInputsModel columnWidths: [0.7, 0.1, 0.1, 0.1] + text_header_size: 12 + cell_text_size: 13 copy_button_column_index: -1 has_header: false diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml index be4d44b9d..10b358d49 100644 --- a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -65,7 +65,10 @@ ColumnLayout { model: txInputsSelectedModel columnWidths: [0.7, 0.1, 0, 0.2] + text_header_size: 12 + cell_text_size: 13 copy_button_column_index: -1 + has_header: false function get_text_left_padding(row, column) { @@ -101,8 +104,11 @@ ColumnLayout { model:txOutputsModel columnWidths: [0.744, 0.20, 0.056] + text_header_size: 12 + cell_text_size: 13 copy_button_column_index: -1 delete_button_column_index: 2 + has_header: false onDeleteRequested: (row) => { diff --git a/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml b/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml index aae24469c..4d7a32a48 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml @@ -4,6 +4,9 @@ import QtQuick.Controls 2.15 import "../BsStyles" HorizontalHeaderView { + id: root + property int text_size + delegate: Rectangle { implicitHeight: 34 @@ -17,7 +20,7 @@ HorizontalHeaderView { color: BSStyle.titleTextColor font.family: "Roboto" font.weight: Font.Normal - font.pixelSize: 11 + font.pixelSize: root.text_size leftPadding: 10 } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml b/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml index 6989a0ae7..75d00bb1d 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml @@ -19,6 +19,7 @@ Component Row { id: root + property int text_size signal deleteRequested (int row) signal copyRequested (string tableData) @@ -36,7 +37,7 @@ Component color: get_data_color(model_row, model_column) font.family: "Roboto" font.weight: Font.Normal - font.pixelSize: 12 + font.pixelSize: root.text_size leftPadding: get_text_left_padding(model_row, model_column, model_is_expandable) } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index 373a3b25b..15fa65011 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -27,6 +27,8 @@ Column { property int delete_button_column_index: -1 property int left_text_padding: 10 property bool has_header: true + property int text_header_size: 11 + property int cell_text_size: 12 signal copyRequested(var id) signal deleteRequested(int id) @@ -39,6 +41,7 @@ Column { syncView: component height: 32 visible: root.has_header + text_size: root.text_header_size } TableView { @@ -174,6 +177,7 @@ Column { CustomTableDelegateRow { id: cmpnt_table_delegate + text_size: root.cell_text_size } function choose_row_source_component(row, column) From 14f36d1190dbd0be029f988883a2abfa2a108151 Mon Sep 17 00:00:00 2001 From: YZ Date: Mon, 20 Feb 2023 17:06:05 +0100 Subject: [PATCH 155/436] Incorrect property for component --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 +- GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml | 3 +-- GUI/QtQuick/qml/StyledControls/CustomTableView.qml | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 9338f1c38..3fbb3f6ff 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -229,7 +229,7 @@ ColumnLayout { color: get_data_color(model_row, model_column) font.family: "Roboto" font.weight: Font.Normal - font.pixelSize: model_row === 0 ? text_header_size : cell_text_size + font.pixelSize: model_row === 0 ? table_sel_inputs.text_header_size : table_sel_inputs.cell_text_size leftPadding: table_sel_inputs.get_text_left_padding(model_row, model_column) } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml b/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml index 75d00bb1d..3a8a800c3 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml @@ -19,7 +19,6 @@ Component Row { id: root - property int text_size signal deleteRequested (int row) signal copyRequested (string tableData) @@ -37,7 +36,7 @@ Component color: get_data_color(model_row, model_column) font.family: "Roboto" font.weight: Font.Normal - font.pixelSize: root.text_size + font.pixelSize: text_size leftPadding: get_text_left_padding(model_row, model_column, model_is_expandable) } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index 15fa65011..dbc342faa 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -100,6 +100,7 @@ Column { property int selected_row_index: component.selected_row_index property int model_row: row property int model_column: column + property int text_size: root.cell_text_size property string model_tableData: (typeof tableData !== "undefined") ? tableData : ({}) property bool model_selected: (typeof selected !== "undefined") ? selected : ({}) @@ -177,7 +178,6 @@ Column { CustomTableDelegateRow { id: cmpnt_table_delegate - text_size: root.cell_text_size } function choose_row_source_component(row, column) From 9b6cdd410a95862d10f9f642aedf7966a5d5294b Mon Sep 17 00:00:00 2001 From: YZ Date: Tue, 21 Feb 2023 15:56:02 +0100 Subject: [PATCH 156/436] Utils; transaction filter --- GUI/QtQuick/AddressListModel.cpp | 10 +++++----- GUI/QtQuick/AddressListModel.h | 2 +- GUI/QtQuick/QtQuickAdapter.cpp | 15 +------------- GUI/QtQuick/QtQuickAdapter.h | 4 +--- GUI/QtQuick/TransactionFilterModel.cpp | 1 - GUI/QtQuick/TxInputsModel.cpp | 5 +++-- GUI/QtQuick/TxListModel.cpp | 5 +++-- GUI/QtQuick/TxOutputsModel.cpp | 3 ++- GUI/QtQuick/Utils.cpp | 20 +++++++++++++++++++ GUI/QtQuick/Utils.h | 10 ++++++++++ GUI/QtQuick/WalletBalancesModel.cpp | 7 ++++--- .../qml/Overview/OverviewWalletBar.qml | 2 +- GUI/QtQuick/qml/ReceivePage.qml | 5 ++++- .../qml/StyledControls/CustomTabButton.qml | 2 -- .../qml/StyledControls/CustomTableView.qml | 2 +- GUI/QtQuick/qml/TransactionsPage.qml | 18 ++++++++++++++--- 16 files changed, 71 insertions(+), 40 deletions(-) create mode 100644 GUI/QtQuick/Utils.cpp create mode 100644 GUI/QtQuick/Utils.h diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index b2c6e55a7..afdf30f64 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -10,8 +10,8 @@ */ #include "AddressListModel.h" #include -#include "BTCNumericTypes.h" #include "ColorScheme.h" +#include "Utils.h" namespace { @@ -49,7 +49,7 @@ QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const { case 0: return table_.at(row).at(0); case 1: return QString::number(getTransactionCount(addresses_.at(row).id())); - case 2: return QString::number(getAddressBalance(addresses_.at(row).id()), 'f', 8); + case 2: return getAddressBalance(addresses_.at(row).id()); case 3: return table_.at(row).at(1); default: return QString{}; } @@ -159,10 +159,10 @@ quint32 QmlAddressListModel::getTransactionCount(const BinaryData& address) cons return 0; } -float QmlAddressListModel::getAddressBalance(const BinaryData& address) const +QString QmlAddressListModel::getAddressBalance(const BinaryData& address) const { if (pendingBalances_.count(address) > 0) { - return pendingBalances_.at(address).balance / BTCNumericTypes::BalanceDivider; + return gui_utils::balance_to_qstring(pendingBalances_.at(address).balance); } - return 0; + return QString(); } diff --git a/GUI/QtQuick/AddressListModel.h b/GUI/QtQuick/AddressListModel.h index 0a3f2670e..35e96a699 100644 --- a/GUI/QtQuick/AddressListModel.h +++ b/GUI/QtQuick/AddressListModel.h @@ -49,7 +49,7 @@ class QmlAddressListModel: public QAbstractTableModel private: quint32 getTransactionCount(const BinaryData& address) const; - float getAddressBalance(const BinaryData& address) const; + QString getAddressBalance(const BinaryData& address) const; private: std::shared_ptr logger_; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 93a9b13f1..cbee3868a 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -146,7 +146,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) , userBlockchain_(std::make_shared(TerminalUsers::Blockchain)) , userSigner_(std::make_shared(TerminalUsers::Signer)) , userHWW_(bs::message::UserTerminal::create(bs::message::TerminalUsers::HWWallets)) - , txTypes_({ tr("All transactions") }) + , txTypes_({ tr("All transactions"), tr("Received"), tr("Sent"), tr("Internal") }) , walletPropertiesModel_(std::make_unique()) { staticLogger = logger; @@ -281,19 +281,6 @@ void QtQuickAdapter::run(int &argc, char **argv) } } - auto comboWalletsList = rootObj_->findChild(QLatin1Literal("walletsComboBox")); - if (comboWalletsList) { - QObject::connect((QObject*)comboWalletsList, SIGNAL(activated(int)), this, SLOT(walletSelected(int))); - } - comboWalletsList = rootObj_->findChild(QLatin1Literal("receiveWalletsComboBox")); - if (comboWalletsList) { - QObject::connect((QObject*)comboWalletsList, SIGNAL(activated(int)), this, SLOT(walletSelected(int))); - } - comboWalletsList = rootObj_->findChild(QLatin1Literal("sendWalletsComboBox")); - if (comboWalletsList) { - QObject::connect((QObject*)comboWalletsList, SIGNAL(activated(int)), this, SLOT(walletSelected(int))); - } - updateStates(); requestInitialSettings(); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index b6c52a531..4d993c862 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -187,6 +187,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE int viewWalletSeedAuth(const QString& walletId, const QString& password); Q_INVOKABLE int deleteWallet(const QString& walletId, const QString& password); Q_INVOKABLE int exportWallet(const QString& walletId); + Q_INVOKABLE void walletSelected(int); signals: void walletsListChanged(); @@ -200,9 +201,6 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void invokePasswordEntry(const QString& devName, bool acceptOnDevice); void showError(const QString&); -private slots: - void walletSelected(int); - private: bs::message::ProcessingResult processSettings(const bs::message::Envelope &); bs::message::ProcessingResult processSettingsGetResponse(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); diff --git a/GUI/QtQuick/TransactionFilterModel.cpp b/GUI/QtQuick/TransactionFilterModel.cpp index 6a6e8d6eb..dfbb1adb4 100644 --- a/GUI/QtQuick/TransactionFilterModel.cpp +++ b/GUI/QtQuick/TransactionFilterModel.cpp @@ -10,7 +10,6 @@ */ #include "TransactionFilterModel.h" #include "TxListModel.h" -#include TransactionFilterModel::TransactionFilterModel(QObject* parent) : QSortFilterProxyModel(parent) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index c4a3256e1..669f33c1d 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -15,6 +15,7 @@ #include "CoinSelection.h" #include "TxOutputsModel.h" #include "ColorScheme.h" +#include "Utils.h" namespace { static const QHash kRoles{ @@ -399,13 +400,13 @@ QVariant TxInputsModel::getData(int row, int col) const for (const auto& utxo : itUTXOs->second) { balance += utxo.getValue(); } - return QString::number(balance / BTCNumericTypes::BalanceDivider, 'f', 8); + return gui_utils::balance_to_qstring(balance); } else { for (const auto& byAddr : utxos_) { for (const auto& utxo : byAddr.second) { if ((entry.txId == utxo.getTxHash()) && (entry.txOutIndex == utxo.getTxOutIndex())) { - return QString::number(utxo.getValue() / BTCNumericTypes::BalanceDivider, 'f', 8); + return gui_utils::balance_to_qstring(utxo.getValue()); } } } diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index dd6cbb4f4..722fd37b8 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -14,6 +14,7 @@ #include #include "StringUtils.h" #include "ColorScheme.h" +#include "Utils.h" namespace { static const QHash kTxListRoles{ @@ -67,7 +68,7 @@ QString TxListModel::getData(int row, int col) const } return QString::fromStdString(address.display()); } - case 4: return QString::number(std::abs(entry.value) / BTCNumericTypes::BalanceDivider, 'f', 8); + case 4: return gui_utils::balance_to_qstring(std::abs(entry.value)); case 5: return QString::number(entry.nbConf); case 6: return txFlag(row); case 7: { @@ -401,7 +402,7 @@ QString TxListForAddr::getData(int row, int col) const case 2: return QString::number(entry.nbConf); case 3: return displayNb(nbInputs(row)); case 4: return displayNb(nbOutputs(row)); - case 5: return QString::number(entry.value / BTCNumericTypes::BalanceDivider, 'f', 8); + case 5: return gui_utils::balance_to_qstring(entry.value); case 6: return displayBTC(totFees / BTCNumericTypes::BalanceDivider); case 7: return (totFees < 0) ? tr("...") : displayBTC(totFees / (double)txSize(row), 1); case 8: return displayNb(txSize(row)); diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index 40e4476c7..aa455ed30 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -13,6 +13,7 @@ #include "Address.h" #include "BTCNumericTypes.h" #include "ColorScheme.h" +#include "Utils.h" namespace { static const QHash kRoles{ @@ -131,7 +132,7 @@ QVariant TxOutputsModel::getData(int row, int col) const case 0: return QString::fromStdString(entry.address.display()); case 1: - return QString::number(entry.amount, 'f', 8); + return gui_utils::normalized_balance_to_qstring(entry.amount); default: break; } return {}; diff --git a/GUI/QtQuick/Utils.cpp b/GUI/QtQuick/Utils.cpp new file mode 100644 index 000000000..7de8b89ef --- /dev/null +++ b/GUI/QtQuick/Utils.cpp @@ -0,0 +1,20 @@ +#include "Utils.h" +#include "BTCNumericTypes.h" + +using namespace gui_utils; + +QString gui_utils::balance_to_qstring(float balance) +{ + if (balance < 0) { + balance = 0; + } + return normalized_balance_to_qstring(balance / BTCNumericTypes::BalanceDivider); +} + +QString gui_utils::normalized_balance_to_qstring(float balance) +{ + if (balance < 0) { + balance = 0; + } + return QString::number(balance, 'f', 8); +} diff --git a/GUI/QtQuick/Utils.h b/GUI/QtQuick/Utils.h new file mode 100644 index 000000000..0ced907d6 --- /dev/null +++ b/GUI/QtQuick/Utils.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +namespace gui_utils { + +QString balance_to_qstring(float balance); +QString normalized_balance_to_qstring(float balance); + +} diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index 1b0785fcc..731c8b438 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -13,6 +13,7 @@ #include #include #include "StringUtils.h" +#include "Utils.h" namespace { static const QHash kWalletBalanceRoles{ @@ -46,13 +47,13 @@ QVariant WalletBalancesModel::data(const QModelIndex& index, int role) const case WalletBalance::IdRole: return QString::fromStdString(wallets_.at(index.row()).walletId); case WalletBalance::TotalRole: - ff = [](const Balance& bal) { return QString::number(bal.total, 'f', 8); }; + ff = [](const Balance& bal) { return gui_utils::normalized_balance_to_qstring(bal.total); }; break; case WalletBalance::ConfirmedRole: - ff = [](const Balance& bal) { return QString::number(bal.confirmed, 'f', 8); }; + ff = [](const Balance& bal) { return gui_utils::normalized_balance_to_qstring(bal.confirmed); }; break; case WalletBalance::UnconfirmedRole: - ff = [](const Balance& bal) { return QString::number(bal.unconfirmed, 'f', 8); }; + ff = [](const Balance& bal) { return gui_utils::normalized_balance_to_qstring(bal.unconfirmed); }; break; case WalletBalance::NbAddrRole: ff = [](const Balance& bal) { return QString::number(bal.nbAddresses); }; diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index 6e878c273..2acd82d54 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -38,7 +38,6 @@ Rectangle { width: 263 height: 53 - objectName: "walletsComboBox" model: walletBalances textRole: "name" valueRole: "name" @@ -48,6 +47,7 @@ Rectangle { } onActivated: (ind) => { + bsApp.walletSelected(ind) control.walletIndexChanged(ind) } } diff --git a/GUI/QtQuick/qml/ReceivePage.qml b/GUI/QtQuick/qml/ReceivePage.qml index 1c1321920..013635f36 100644 --- a/GUI/QtQuick/qml/ReceivePage.qml +++ b/GUI/QtQuick/qml/ReceivePage.qml @@ -41,12 +41,15 @@ Item { spacing: 23 ComboBox { id: receiveWalletsComboBox - objectName: "receiveWalletsComboBox" model: bsApp.walletsList currentIndex: walletsComboBox.currentIndex font.pointSize: 14 width: 500 visible: (bsApp.walletsList.length > 1) + + onActivated: (index) => { + bsApp.walletSelected(index) + } } Label { text: qsTr("%1 BTC").arg(bsApp.totalBalance) diff --git a/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml b/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml index 5ae742e06..669a72cfc 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml @@ -39,7 +39,6 @@ TabButton { width: 24 height: 24 Layout.alignment : Qt.AlignTop | Qt.AlignHCenter - Layout.topMargin : 10 source: control.checked? selectedIcon_ :nonSelectedIcon_ sourceSize: Qt.size(parent.width, parent.height) @@ -51,7 +50,6 @@ TabButton { id: text_ Layout.alignment : Qt.AlignBottom | Qt.AlignHCenter - Layout.bottomMargin : 5 text: control.text font: control.font diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index dbc342faa..baf189bdf 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -47,7 +47,7 @@ Column { TableView { id: component width: parent.width - height: parent.height - tableHeader.height + height: parent.height - tableHeader.height - root.spacing reuseItems: false diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index f0c47d301..6000c3a33 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -13,6 +13,7 @@ import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtQml.Models 2 import QtQuick.Dialogs 1.3 +import terminal.models 1.0 import "StyledControls" import "BsStyles" @@ -26,6 +27,11 @@ Item { width: 1200 height: 788 + TransactionFilterModel { + id: transactionModel + sourceModel: txListModel + } + TransactionDetails { id: transactionDetails visible: false @@ -80,7 +86,6 @@ Item { CustomSmallComboBox { id: txWalletsComboBox - objectName: "txWalletsComboBox" model: bsApp.txWalletsList font.pointSize: 8 @@ -88,11 +93,14 @@ Item { height: 29 anchors.verticalCenter: parent.verticalCenter + + onActivated: (index) => { + transactionModel.walletName = index == 0 ? "" : txWalletsComboBox.currentValue + } } CustomSmallComboBox { id: txTypesComboBox - objectName: "txTypesComboBox" model: bsApp.txTypesList font.pointSize: 8 @@ -100,6 +108,10 @@ Item { height: 29 anchors.verticalCenter: parent.verticalCenter + + onActivated: (index) => { + transactionModel.transactionType = index == 0 ? "" : txTypesComboBox.currentValue + } } @@ -149,7 +161,7 @@ Item { CustomTableView { width: parent.width height: parent.height - transaction_header_menu.height - model: txListModel + model: transactionModel copy_button_column_index: 3 columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] From 6f2ca3fe55f48aa6c589e933f9bc63d1ed66a9dc Mon Sep 17 00:00:00 2001 From: YZ Date: Tue, 21 Feb 2023 20:11:21 +0100 Subject: [PATCH 157/436] fix review issues --- GUI/QtQuick/AddressListModel.cpp | 2 +- GUI/QtQuick/TxInputsModel.cpp | 4 ++-- GUI/QtQuick/TxListModel.cpp | 4 ++-- GUI/QtQuick/TxOutputsModel.cpp | 2 +- GUI/QtQuick/Utils.cpp | 6 +++--- GUI/QtQuick/Utils.h | 4 ++-- GUI/QtQuick/WalletBalancesModel.cpp | 6 +++--- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index afdf30f64..3ecf5603c 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -162,7 +162,7 @@ quint32 QmlAddressListModel::getTransactionCount(const BinaryData& address) cons QString QmlAddressListModel::getAddressBalance(const BinaryData& address) const { if (pendingBalances_.count(address) > 0) { - return gui_utils::balance_to_qstring(pendingBalances_.at(address).balance); + return gui_utils::satoshiToQString(pendingBalances_.at(address).balance); } return QString(); } diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 669f33c1d..f5bd32728 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -400,13 +400,13 @@ QVariant TxInputsModel::getData(int row, int col) const for (const auto& utxo : itUTXOs->second) { balance += utxo.getValue(); } - return gui_utils::balance_to_qstring(balance); + return gui_utils::satoshiToQString(balance); } else { for (const auto& byAddr : utxos_) { for (const auto& utxo : byAddr.second) { if ((entry.txId == utxo.getTxHash()) && (entry.txOutIndex == utxo.getTxOutIndex())) { - return gui_utils::balance_to_qstring(utxo.getValue()); + return gui_utils::satoshiToQString(utxo.getValue()); } } } diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 722fd37b8..a60526aad 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -68,7 +68,7 @@ QString TxListModel::getData(int row, int col) const } return QString::fromStdString(address.display()); } - case 4: return gui_utils::balance_to_qstring(std::abs(entry.value)); + case 4: return gui_utils::satoshiToQString(std::abs(entry.value)); case 5: return QString::number(entry.nbConf); case 6: return txFlag(row); case 7: { @@ -402,7 +402,7 @@ QString TxListForAddr::getData(int row, int col) const case 2: return QString::number(entry.nbConf); case 3: return displayNb(nbInputs(row)); case 4: return displayNb(nbOutputs(row)); - case 5: return gui_utils::balance_to_qstring(entry.value); + case 5: return gui_utils::satoshiToQString(entry.value); case 6: return displayBTC(totFees / BTCNumericTypes::BalanceDivider); case 7: return (totFees < 0) ? tr("...") : displayBTC(totFees / (double)txSize(row), 1); case 8: return displayNb(txSize(row)); diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index aa455ed30..5136208da 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -132,7 +132,7 @@ QVariant TxOutputsModel::getData(int row, int col) const case 0: return QString::fromStdString(entry.address.display()); case 1: - return gui_utils::normalized_balance_to_qstring(entry.amount); + return gui_utils::normalizedSatoshiToQString(entry.amount); default: break; } return {}; diff --git a/GUI/QtQuick/Utils.cpp b/GUI/QtQuick/Utils.cpp index 7de8b89ef..25e6f8b2d 100644 --- a/GUI/QtQuick/Utils.cpp +++ b/GUI/QtQuick/Utils.cpp @@ -3,15 +3,15 @@ using namespace gui_utils; -QString gui_utils::balance_to_qstring(float balance) +QString gui_utils::satoshiToQString(double balance) { if (balance < 0) { balance = 0; } - return normalized_balance_to_qstring(balance / BTCNumericTypes::BalanceDivider); + return normalizedSatoshiToQString(balance / BTCNumericTypes::BalanceDivider); } -QString gui_utils::normalized_balance_to_qstring(float balance) +QString gui_utils::normalizedSatoshiToQString(double balance) { if (balance < 0) { balance = 0; diff --git a/GUI/QtQuick/Utils.h b/GUI/QtQuick/Utils.h index 0ced907d6..adb2549b8 100644 --- a/GUI/QtQuick/Utils.h +++ b/GUI/QtQuick/Utils.h @@ -4,7 +4,7 @@ namespace gui_utils { -QString balance_to_qstring(float balance); -QString normalized_balance_to_qstring(float balance); +QString satoshiToQString(double balance); +QString normalizedSatoshiToQString(double balance); } diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index 731c8b438..e8177b366 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -47,13 +47,13 @@ QVariant WalletBalancesModel::data(const QModelIndex& index, int role) const case WalletBalance::IdRole: return QString::fromStdString(wallets_.at(index.row()).walletId); case WalletBalance::TotalRole: - ff = [](const Balance& bal) { return gui_utils::normalized_balance_to_qstring(bal.total); }; + ff = [](const Balance& bal) { return gui_utils::normalizedSatoshiToQString(bal.total); }; break; case WalletBalance::ConfirmedRole: - ff = [](const Balance& bal) { return gui_utils::normalized_balance_to_qstring(bal.confirmed); }; + ff = [](const Balance& bal) { return gui_utils::normalizedSatoshiToQString(bal.confirmed); }; break; case WalletBalance::UnconfirmedRole: - ff = [](const Balance& bal) { return gui_utils::normalized_balance_to_qstring(bal.unconfirmed); }; + ff = [](const Balance& bal) { return gui_utils::normalizedSatoshiToQString(bal.unconfirmed); }; break; case WalletBalance::NbAddrRole: ff = [](const Balance& bal) { return QString::number(bal.nbAddresses); }; From 5d8233bc05a3dbb4e9997bb53fd035fe52169191 Mon Sep 17 00:00:00 2001 From: YZ Date: Tue, 21 Feb 2023 21:34:02 +0100 Subject: [PATCH 158/436] double -> int64_t --- GUI/QtQuick/Utils.cpp | 2 +- GUI/QtQuick/Utils.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/Utils.cpp b/GUI/QtQuick/Utils.cpp index 25e6f8b2d..ab7ca00b4 100644 --- a/GUI/QtQuick/Utils.cpp +++ b/GUI/QtQuick/Utils.cpp @@ -3,7 +3,7 @@ using namespace gui_utils; -QString gui_utils::satoshiToQString(double balance) +QString gui_utils::satoshiToQString(int64_t balance) { if (balance < 0) { balance = 0; diff --git a/GUI/QtQuick/Utils.h b/GUI/QtQuick/Utils.h index adb2549b8..d569851e1 100644 --- a/GUI/QtQuick/Utils.h +++ b/GUI/QtQuick/Utils.h @@ -4,7 +4,7 @@ namespace gui_utils { -QString satoshiToQString(double balance); +QString satoshiToQString(int64_t balance); QString normalizedSatoshiToQString(double balance); } From b7369405130e35f10dc42b95daaf5d8cbe54911d Mon Sep 17 00:00:00 2001 From: YZ Date: Tue, 21 Feb 2023 22:07:03 +0100 Subject: [PATCH 159/436] Combobox initialization --- GUI/QtQuick/qml/Overview/OverviewWalletBar.qml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index 2acd82d54..b34b26091 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -34,6 +34,7 @@ Rectangle { Controls.CustomComboBox { id: wallet_selection_combobox anchors.verticalCenter: parent.verticalCenter + objectName: "walletsComboBox" width: 263 height: 53 @@ -42,10 +43,6 @@ Rectangle { textRole: "name" valueRole: "name" - Component.onCompleted: { - control.walletIndexChanged(0) - } - onActivated: (ind) => { bsApp.walletSelected(ind) control.walletIndexChanged(ind) From 7e4ca2594880ced83d6e224f446b4f5e530617af Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 22 Feb 2023 01:12:12 +0100 Subject: [PATCH 160/436] NST transaction fix --- GUI/QtQuick/PendingTransactionFilterModel.cpp | 5 ++--- GUI/QtQuick/QtQuickAdapter.cpp | 20 +++++++++---------- GUI/QtQuick/TxListModel.cpp | 12 +++++------ GUI/QtQuick/TxListModel.h | 2 +- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 1 + 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/GUI/QtQuick/PendingTransactionFilterModel.cpp b/GUI/QtQuick/PendingTransactionFilterModel.cpp index 73a846be4..7b856318c 100644 --- a/GUI/QtQuick/PendingTransactionFilterModel.cpp +++ b/GUI/QtQuick/PendingTransactionFilterModel.cpp @@ -10,7 +10,6 @@ */ #include "PendingTransactionFilterModel.h" #include "TxListModel.h" -#include PendingTransactionFilterModel::PendingTransactionFilterModel(QObject* parent) : QSortFilterProxyModel(parent) @@ -23,9 +22,9 @@ bool PendingTransactionFilterModel::filterAcceptsRow(int source_row, const auto confirmationCountIndex = sourceModel()->index(source_row, 5); if (sourceModel()->data(confirmationCountIndex, TxListModel::TableRoles::TableDataRole) > 6) { - return true; + return false; } - return false; + return true; } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index cbee3868a..c3d9ddbca 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -849,17 +849,17 @@ void QtQuickAdapter::walletSelected(int index) { logger_->debug("[{}] {}", __func__, index); QMetaObject::invokeMethod(this, [this, index] { - const auto& walletName = walletBalances_->wallets().at(index).toStdString(); - const auto& walletId = hdWalletIdByIndex(index); + try { + const auto& walletName = walletBalances_->wallets().at(index).toStdString(); + const auto& walletId = hdWalletIdByIndex(index); - addrModel_->reset(walletId); - WalletsMessage msg; - msg.set_wallet_get(walletId); - const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); - walletInfoReq_[msgId] = walletName; + addrModel_->reset(walletId); + WalletsMessage msg; + msg.set_wallet_get(walletId); + const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); + walletInfoReq_[msgId] = walletName; - if (hdWallets_.count(walletId) > 0) { - try { + if (hdWallets_.count(walletId) > 0) { walletPropertiesModel_->setWalletInfo({ QString::fromStdString(hdWallets_.at(walletId).name), QString::fromStdString(hdWallets_.at(walletId).description), @@ -872,8 +872,8 @@ void QtQuickAdapter::walletSelected(int index) hdWallets_.at(walletId).watchOnly }); } - catch (const std::exception&) {} } + catch (const std::exception&) {} }); } diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index a60526aad..df06da1eb 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -51,7 +51,7 @@ int TxListModel::columnCount(const QModelIndex &) const return header_.size(); } -QString TxListModel::getData(int row, int col) const +QVariant TxListModel::getData(int row, int col) const { if (row > data_.size()) { return {}; @@ -69,7 +69,7 @@ QString TxListModel::getData(int row, int col) const return QString::fromStdString(address.display()); } case 4: return gui_utils::satoshiToQString(std::abs(entry.value)); - case 5: return QString::number(entry.nbConf); + case 5: return entry.nbConf; case 6: return txFlag(row); case 7: { const auto& itComm = txComments_.find(entry.txHash.toBinStr()); @@ -346,12 +346,12 @@ bool TxListModel::exportCSVto(const QString& filename) const auto& entry = data_.at(i); std::time_t txTime = entry.txTime; fstrm << "\"" << std::put_time(std::localtime(&txTime), "%Y-%m-%d %X") << "\";" - << "\"" << getData(i, 1).toUtf8().toStdString() << "\";" - << getData(i, 2).toStdString() << ";" - << getData(i, 3).toStdString() << ";" + << "\"" << getData(i, 1).toString().toUtf8().toStdString() << "\";" + << getData(i, 2).toString().toStdString() << ";" + << getData(i, 3).toString().toStdString() << ";" << txId(i).toStdString() << ";" << fmt::format("{:.8f}", entry.value / BTCNumericTypes::BalanceDivider) << ";" - << "\"" << getData(i, 7).toStdString() << "\"\n"; + << "\"" << getData(i, 7).toString().toStdString() << "\"\n"; } return true; } diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 0ca7cef23..1580f8c82 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -53,7 +53,7 @@ class TxListModel : public QAbstractTableModel void nbTxChanged(); private: - QString getData(int row, int col) const; + QVariant getData(int row, int col) const; QColor dataColor(int row, int col) const; QString walletName(int row) const; QString txType(int row) const; diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 49096ddb2..c4de70292 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -148,6 +148,7 @@ Rectangle { model: PendingTransactionFilterModel { sourceModel: txListModel + dynamicSortFilter: true } copy_button_column_index: 3 From 8f1865d6cff9cfe5f4b2259bca4361c340192ce1 Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 22 Feb 2023 12:49:23 +0100 Subject: [PATCH 161/436] Crash on deletion --- GUI/QtQuick/TxInputsModel.cpp | 8 ++++++++ GUI/QtQuick/TxInputsModel.h | 1 + GUI/QtQuick/TxListModel.cpp | 3 +++ GUI/QtQuick/TxOutputsModel.cpp | 11 +++++++++++ GUI/QtQuick/TxOutputsModel.h | 1 + GUI/QtQuick/qml/StyledControls/CustomTableView.qml | 2 +- 6 files changed, 25 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index f5bd32728..15677a829 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -79,6 +79,14 @@ QVariant TxInputsModel::data(const QModelIndex& index, int role) const return QVariant(); } +QVariant TxInputsModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Orientation::Horizontal) { + return header_[section]; + } + return QVariant(); +} + QColor TxInputsModel::dataColor(int row, int col) const { if (row == 0) { diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index 9eddfcb5c..68982eeec 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -66,6 +66,7 @@ class TxInputsModel : public QAbstractTableModel int columnCount(const QModelIndex & = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role) const override; QHash roleNames() const override; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; void clear(); void addUTXOs(const std::vector&); diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index df06da1eb..1eb3496af 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -76,6 +76,9 @@ QVariant TxListModel::getData(int row, int col) const if (itComm != txComments_.end()) { return QString::fromStdString(itComm->second); } + else { + return QString(); + } break; } default: break; diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index 5136208da..48bc0e6a4 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -57,6 +57,14 @@ QHash TxOutputsModel::roleNames() const return kRoles; } +QVariant TxOutputsModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Orientation::Horizontal) { + return header_.at(section); + } + return QVariant(); +} + double TxOutputsModel::totalAmount() const { double result = 0.0; @@ -117,6 +125,9 @@ void TxOutputsModel::addOutput(const QString& address, double amount) void TxOutputsModel::delOutput(int row) { + if (row == 0) { + return; + } beginRemoveRows(QModelIndex(), row, row); data_.erase(data_.cbegin() + row - 1); endRemoveRows(); diff --git a/GUI/QtQuick/TxOutputsModel.h b/GUI/QtQuick/TxOutputsModel.h index ae8007d45..c3349aff4 100644 --- a/GUI/QtQuick/TxOutputsModel.h +++ b/GUI/QtQuick/TxOutputsModel.h @@ -37,6 +37,7 @@ class TxOutputsModel : public QAbstractTableModel int columnCount(const QModelIndex & = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role) const override; QHash roleNames() const override; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; double totalAmount() const; std::vector> recipients() const; diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index baf189bdf..648f61d67 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -60,7 +60,7 @@ Column { maximumFlickVelocity: 1000 ScrollBar.vertical: ScrollBar { - policy: contentHeight > height ? ScrollBar.AlwaysOn : ScrollBar.AsNeeded + policy: component.contentHeight > component.height ? ScrollBar.AlwaysOn : ScrollBar.AsNeeded } columnWidthProvider: function (column) { From 66151a7e91970221b97bde0c4cbc287682967bb2 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 22 Feb 2023 15:49:46 +0300 Subject: [PATCH 162/436] fix crash --- GUI/QtQuick/AddressListModel.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index 3ecf5603c..1776274f7 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -87,9 +87,11 @@ void QmlAddressListModel::addRow(const std::string& walletId, const QVector>& rows) @@ -114,9 +116,11 @@ void QmlAddressListModel::addRows(const std::string& walletId, const QVector Date: Wed, 22 Feb 2023 19:50:20 +0300 Subject: [PATCH 163/436] additional crash fixes --- GUI/QtQuick/TxListModel.cpp | 62 +++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 1eb3496af..c91fad5e4 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -218,25 +218,29 @@ void TxListModel::addRows(const std::vector& entries) } } if (!newEntries.empty()) { - beginInsertRows(QModelIndex(), rowCount(), rowCount() + newEntries.size() - 1); - data_.insert(data_.end(), newEntries.cbegin(), newEntries.cend()); - endInsertRows(); - emit nbTxChanged(); + QMetaObject::invokeMethod(this, [this, newEntries] { + beginInsertRows(QModelIndex(), rowCount(), rowCount() + newEntries.size() - 1); + data_.insert(data_.end(), newEntries.cbegin(), newEntries.cend()); + endInsertRows(); + emit nbTxChanged(); + }); } } void TxListModel::prependRow(const bs::TXEntry& entry) { //logger_->debug("[{}::{}] prepending entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); - decltype(txDetails_) prevDet; - beginInsertRows(QModelIndex(), 0, 0); - data_.insert(data_.cbegin(), entry); - txDetails_.swap(prevDet); - for (auto txDet : prevDet) { - txDetails_[txDet.first] = std::move(txDet.second); - } - endInsertRows(); - emit nbTxChanged(); + QMetaObject::invokeMethod(this, [this, entry] { + decltype(txDetails_) prevDet; + beginInsertRows(QModelIndex(), 0, 0); + data_.insert(data_.cbegin(), entry); + txDetails_.swap(prevDet); + for (auto txDet : prevDet) { + txDetails_[txDet.first] = std::move(txDet.second); + } + endInsertRows(); + emit nbTxChanged(); + }); } void TxListModel::addRow(const bs::TXEntry& entry) @@ -258,10 +262,12 @@ void TxListModel::addRow(const bs::TXEntry& entry) } else { //logger_->debug("[{}::{}] adding entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - data_.push_back(entry); - endInsertRows(); - emit nbTxChanged(); + QMetaObject::invokeMethod(this, [this, entry] { + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + data_.push_back(entry); + endInsertRows(); + emit nbTxChanged(); + }); } } @@ -522,20 +528,24 @@ QHash TxListForAddr::roleNames() const void TxListForAddr::addRows(const std::vector& entries) { if (!entries.empty()) { - beginInsertRows(QModelIndex(), rowCount(), rowCount() + entries.size() - 1); - data_.insert(data_.end(), entries.cbegin(), entries.cend()); - endInsertRows(); + QMetaObject::invokeMethod(this, [this, entries] { + beginInsertRows(QModelIndex(), rowCount(), rowCount() + entries.size() - 1); + data_.insert(data_.end(), entries.cbegin(), entries.cend()); + endInsertRows(); + emit changed(); + }); } - emit changed(); } void TxListForAddr::clear() { - beginResetModel(); - data_.clear(); - txs_.clear(); - endResetModel(); - emit changed(); + QMetaObject::invokeMethod(this, [this] { + beginResetModel(); + data_.clear(); + txs_.clear(); + endResetModel(); + emit changed(); + }); } void TxListForAddr::setDetails(const std::vector& txs) From d0f229bb5feced92733088c95f7517ffe4b92516 Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 22 Feb 2023 19:23:55 +0100 Subject: [PATCH 164/436] Fixing incorrect balance --- GUI/QtQuick/Utils.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/GUI/QtQuick/Utils.cpp b/GUI/QtQuick/Utils.cpp index ab7ca00b4..416f159e5 100644 --- a/GUI/QtQuick/Utils.cpp +++ b/GUI/QtQuick/Utils.cpp @@ -5,16 +5,10 @@ using namespace gui_utils; QString gui_utils::satoshiToQString(int64_t balance) { - if (balance < 0) { - balance = 0; - } return normalizedSatoshiToQString(balance / BTCNumericTypes::BalanceDivider); } QString gui_utils::normalizedSatoshiToQString(double balance) { - if (balance < 0) { - balance = 0; - } return QString::number(balance, 'f', 8); } From 9cf8d1d8f3c59e2c4f3a994a28512e311c0f3acf Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 22 Feb 2023 22:03:07 +0300 Subject: [PATCH 165/436] method rename --- GUI/QtQuick/TxOutputsModel.cpp | 2 +- GUI/QtQuick/Utils.cpp | 4 ++-- GUI/QtQuick/Utils.h | 2 +- GUI/QtQuick/WalletBalancesModel.cpp | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index 48bc0e6a4..ba2b60acd 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -143,7 +143,7 @@ QVariant TxOutputsModel::getData(int row, int col) const case 0: return QString::fromStdString(entry.address.display()); case 1: - return gui_utils::normalizedSatoshiToQString(entry.amount); + return gui_utils::xbtToQString(entry.amount); default: break; } return {}; diff --git a/GUI/QtQuick/Utils.cpp b/GUI/QtQuick/Utils.cpp index 416f159e5..946fbe019 100644 --- a/GUI/QtQuick/Utils.cpp +++ b/GUI/QtQuick/Utils.cpp @@ -5,10 +5,10 @@ using namespace gui_utils; QString gui_utils::satoshiToQString(int64_t balance) { - return normalizedSatoshiToQString(balance / BTCNumericTypes::BalanceDivider); + return xbtToQString(balance / BTCNumericTypes::BalanceDivider); } -QString gui_utils::normalizedSatoshiToQString(double balance) +QString gui_utils::xbtToQString(double balance) { return QString::number(balance, 'f', 8); } diff --git a/GUI/QtQuick/Utils.h b/GUI/QtQuick/Utils.h index d569851e1..762619665 100644 --- a/GUI/QtQuick/Utils.h +++ b/GUI/QtQuick/Utils.h @@ -5,6 +5,6 @@ namespace gui_utils { QString satoshiToQString(int64_t balance); -QString normalizedSatoshiToQString(double balance); +QString xbtToQString(double balance); } diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index e8177b366..fd5363fb2 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -47,13 +47,13 @@ QVariant WalletBalancesModel::data(const QModelIndex& index, int role) const case WalletBalance::IdRole: return QString::fromStdString(wallets_.at(index.row()).walletId); case WalletBalance::TotalRole: - ff = [](const Balance& bal) { return gui_utils::normalizedSatoshiToQString(bal.total); }; + ff = [](const Balance& bal) { return gui_utils::xbtToQString(bal.total); }; break; case WalletBalance::ConfirmedRole: - ff = [](const Balance& bal) { return gui_utils::normalizedSatoshiToQString(bal.confirmed); }; + ff = [](const Balance& bal) { return gui_utils::xbtToQString(bal.confirmed); }; break; case WalletBalance::UnconfirmedRole: - ff = [](const Balance& bal) { return gui_utils::normalizedSatoshiToQString(bal.unconfirmed); }; + ff = [](const Balance& bal) { return gui_utils::xbtToQString(bal.unconfirmed); }; break; case WalletBalance::NbAddrRole: ff = [](const Balance& bal) { return QString::number(bal.nbAddresses); }; From 25ca1d541e84100769e2be2115def2c7a3b3e5fd Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 23 Feb 2023 16:01:29 +0200 Subject: [PATCH 166/436] little fixes --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 37 ++++++++----------- GUI/QtQuick/qml/Send/SelectInputs.qml | 2 - .../qml/Send/SignTransactionAdvanced.qml | 4 -- GUI/QtQuick/qml/Send/SimpleDetails.qml | 33 ++++++++--------- 4 files changed, 32 insertions(+), 44 deletions(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index f237c7ddb..50deee7d1 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -27,11 +27,25 @@ ColumnLayout { Layout.fillWidth: true Layout.preferredHeight : 34 + Label { + Layout.fillWidth: true + Layout.preferredHeight : 34 + } + + CustomTitleLabel { + id: title + + Layout.rightMargin: 378 + Layout.alignment: Qt.AlignRight | Qt.AlingVCenter + + text: qsTr("Send Bitcoin") + } + Button { id: simple_but - Layout.leftMargin: 24 - Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter + Layout.rightMargin: 60 + Layout.alignment: Qt.AlignRight | Qt.AlingVCenter activeFocusOnTab: true @@ -63,21 +77,6 @@ ColumnLayout { layout.sig_simple() } } - - CustomTitleLabel { - id: title - - Layout.leftMargin: 378 - Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter - - text: qsTr("Send Bitcoin") - } - - Label { - Layout.fillWidth: true - Layout.preferredHeight : 34 - } - } RowLayout { @@ -202,8 +201,6 @@ ColumnLayout { model: txInputsSelectedModel columnWidths: [0.7, 0.1, 0, 0.2] - text_header_size: 12 - cell_text_size: 13 copy_button_column_index: -1 Component @@ -430,8 +427,6 @@ ColumnLayout { model:txOutputsModel columnWidths: [0.744, 0.20, 0.056] - text_header_size: 12 - cell_text_size: 13 copy_button_column_index: -1 delete_button_column_index: 2 diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml index caa71f1fd..784cfdc63 100644 --- a/GUI/QtQuick/qml/Send/SelectInputs.qml +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -56,8 +56,6 @@ ColumnLayout { model: txInputsModel columnWidths: [0.7, 0.1, 0.1, 0.1] - text_header_size: 12 - cell_text_size: 13 copy_button_column_index: -1 Component diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml index 296d9740f..be4d44b9d 100644 --- a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -65,8 +65,6 @@ ColumnLayout { model: txInputsSelectedModel columnWidths: [0.7, 0.1, 0, 0.2] - text_header_size: 12 - cell_text_size: 13 copy_button_column_index: -1 function get_text_left_padding(row, column) @@ -103,8 +101,6 @@ ColumnLayout { model:txOutputsModel columnWidths: [0.744, 0.20, 0.056] - text_header_size: 12 - cell_text_size: 13 copy_button_column_index: -1 delete_button_column_index: 2 diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 8fc567841..0c1a8facd 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -26,11 +26,25 @@ ColumnLayout { Layout.fillWidth: true Layout.preferredHeight : 34 + Label { + Layout.fillWidth: true + Layout.preferredHeight : 34 + } + + CustomTitleLabel { + id: title + + Layout.rightMargin: 104 + Layout.alignment: Qt.AlignRight | Qt.AlingVCenter + + text: qsTr("Send Bitcoin") + } + Button { id: advanced_but - Layout.leftMargin: 24 - Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter + Layout.rightMargin: 60 + Layout.alignment: Qt.AlignRight | Qt.AlingVCenter activeFocusOnTab: true @@ -63,21 +77,6 @@ ColumnLayout { layout.sig_advanced() } } - - CustomTitleLabel { - id: title - - Layout.leftMargin: 104 - Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter - - text: qsTr("Send Bitcoin") - } - - Label { - Layout.fillWidth: true - Layout.preferredHeight : 34 - } - } RecvAddrTextInput { From c65a30948fac6ec69609a9fe0a3cfa6ef4f95f02 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 23 Feb 2023 21:44:59 +0300 Subject: [PATCH 167/436] initial jade support for Windows --- BlockSettleHW/hwdevicemanager.cpp | 8 +- BlockSettleHW/hwdevicemanager.h | 2 + BlockSettleHW/jade/jadeClient.cpp | 150 +++++++++++++++++++++++++++++- BlockSettleHW/jade/jadeClient.h | 34 ++++++- GUI/QtQuick/TxInputsModel.cpp | 20 ++-- common | 2 +- 6 files changed, 201 insertions(+), 15 deletions(-) diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index 4ba108646..9a9ad9e3c 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -85,13 +85,18 @@ bool DeviceManager::processBroadcast(const bs::message::Envelope& env) void DeviceManager::scanDevices(const bs::message::Envelope& env) { if (nbScanning_ > 0) { + logger_->warn("[{}] device scan is already in progress"); + HW::DeviceMgrMessage msg; + msg.mutable_available_devices(); + pushResponse(user_, env, msg.SerializeAsString()); return; } envReqScan_ = env; devices_.clear(); - nbScanning_ = 2; // # of callbacks to receive + nbScanning_ = 3; // # of callbacks to receive ledgerClient_->scanDevices(); trezorClient_->listDevices(); + jadeClient_->scanDevices(); } void DeviceManager::setMatrixPin(const DeviceKey& key, const std::string& pin) @@ -207,6 +212,7 @@ bs::message::ProcessingResult DeviceManager::processSettings(const bs::message:: logger_->debug("[hww::DeviceManager::processSettings] testnet={}", testNet_); trezorClient_ = std::make_unique(logger_, testNet_, this); ledgerClient_ = std::make_unique(logger_, testNet_, this); + jadeClient_ = std::make_unique(logger_, testNet_, this); return bs::message::ProcessingResult::Success; } } diff --git a/BlockSettleHW/hwdevicemanager.h b/BlockSettleHW/hwdevicemanager.h index 6692fba01..b531dbc93 100644 --- a/BlockSettleHW/hwdevicemanager.h +++ b/BlockSettleHW/hwdevicemanager.h @@ -17,6 +17,7 @@ #include "Message/Adapter.h" #include "ledger/ledgerClient.h" #include "trezor/trezorClient.h" +#include "jade/jadeClient.h" #include "SecureBinaryData.h" @@ -142,6 +143,7 @@ namespace bs { std::shared_ptr logger_; std::unique_ptr trezorClient_; std::unique_ptr ledgerClient_; + std::unique_ptr jadeClient_; std::shared_ptr user_, userWallets_, userSigner_, userBlockchain_; std::vector devices_; diff --git a/BlockSettleHW/jade/jadeClient.cpp b/BlockSettleHW/jade/jadeClient.cpp index 6daaf6d9e..29a0ba538 100644 --- a/BlockSettleHW/jade/jadeClient.cpp +++ b/BlockSettleHW/jade/jadeClient.cpp @@ -12,10 +12,25 @@ #include #include "hwdevicemanager.h" #include "jadeDevice.h" +#include "SystemFileUtils.h" #include "Wallets/SyncWalletsManager.h" #include "Wallets/SyncHDWallet.h" +namespace { +#ifdef Q_OS_WINDOWS + const std::vector kSerialPorts {"COM1", "COM2", "COM3", "COM4" + , "COM5", "COM6", "COM7", "COM8", "COM9", "COM10", "COM11", "COM12"}; +#elif Q_OS_MACOS + const std::vector kSerialPorts{ "/dev/tty.usbserial*" + , "/dev/cu.usbserial", "/dev/cu.Bluetooth-Modem"}; +#else + const std::vector kSerialPorts{ "/dev/ttyS*", "/dev/ttyACM*" + , "/dev/ttyUSB*"}; +#endif +} + using namespace bs::hww; +using json = nlohmann::json; JadeClient::JadeClient(const std::shared_ptr& logger , bool testNet, DeviceCallbacks* cb) @@ -38,16 +53,143 @@ std::shared_ptr JadeClient::getDevice(const std::string& deviceId) return nullptr; } -#if 0 std::shared_ptr JadeClient::worker(const std::shared_ptr&) { - const std::vector> handlers{ std::make_shared - (logger_, trezorEndPoint_) }; + const std::vector> handlers{std::make_shared(logger_) }; return std::make_shared(handlers); } -#endif void JadeClient::scanDevices() { logger_->info("[JadeClient::scanDevices]"); + std::vector serialPorts; + for (const auto& fn : kSerialPorts) { + if (fn.find('*') == std::string::npos) { +#ifdef Q_OS_WINDOWS + serialPorts.push_back(fn); +#else + if (SystemFileUtils::deviceExist(fn)) { + serialPorts.push_back(fn); + } +#endif + } + else { + const auto& files = SystemFileUtils::readDir("/", fn); + for (const auto& f : files) { + if (SystemFileUtils::deviceExist(f)) { + serialPorts.push_back(f); + } + } + } + } + if (serialPorts.empty()) { + cb_->scanningDone(); + return; + } + auto nbCalls = std::make_shared((int)serialPorts.size()); + for (const auto& serial : serialPorts) { + const auto& cb = [this, nbCalls](const std::shared_ptr& out) + { + const auto& cbScanned = [this, nbCalls] + { + (*nbCalls)--; + if (*nbCalls <= 0) { + logger_->debug("[JadeClient::scanDevices] all devices scanned"); + cb_->scanningDone(); + } + }; + + const auto& data = std::dynamic_pointer_cast(out); + if (!data) { + logger_->error("[JadeClient::scanDevices] invalid callback data"); + cbScanned(); + return; + } + if (!data->response.empty()) { + logger_->debug("[JadeClient::scanDevices] response: {}", data->response.dump()); + } + cbScanned(); + }; + const auto request = std::make_shared(serial, json{ {"method", "get_version_info"}}); + processQueued(request, cb); + } +} + +bs::hww::JadeHandler::JadeHandler(const std::shared_ptr& logger) + : logger_(logger) +{} + +#ifdef Q_OS_WINDOWS +static std::string lastErrorAsString() +{ + DWORD errorMessageID = ::GetLastError(); + if (errorMessageID == 0) { + return {}; + } + LPSTR messageBuffer = nullptr; + + //Ask Win32 to give us the string version of that message ID. + //The parameters we pass in, tell Win32 to create the buffer that holds the message for us (because we don't yet know how long the message string will be). + size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL); + + const std::string message(messageBuffer, size); + //Free the Win32's string's buffer. + LocalFree(messageBuffer); + return message; +} +#endif + +std::shared_ptr bs::hww::JadeHandler::processData(const std::shared_ptr& in) +{ + auto out = std::make_shared(in->serial); +#ifdef Q_OS_WINDOWS + HANDLE hComm; + + hComm = CreateFileA(("\\\\.\\" + in->serial).c_str(), + GENERIC_READ | GENERIC_WRITE, 0, // No Sharing + NULL, // No Security + OPEN_EXISTING,// Open existing port only + 0, // Non Overlapped I/O + NULL); // Null for Comm Devices + + logger_->debug("[{}] {} handle = {:x}", __func__, in->serial, hComm); + if (hComm == INVALID_HANDLE_VALUE) { + out->error = "failed to open serial port " + in->serial + ": " + lastErrorAsString(); + logger_->debug("[{}] {}", __func__, out->error); + return out; + } + json reqCopy = in->request; + reqCopy["id"] = ++seqNo_; + logger_->debug("[{}] writing {} to {}", __func__, reqCopy.dump(), in->serial); + const auto& reqBytes = json::to_cbor(reqCopy); + const std::string reqBuf(reqBytes.cbegin(), reqBytes.cend()); + + DWORD nbWritten = 0; + const bool rc = WriteFile(hComm, reqBuf.data(), reqBuf.size(), &nbWritten, NULL); + if (!rc || (nbWritten != reqBuf.size())) { + out->error = "failed to write " + std::to_string(reqBuf.size() - nbWritten) + + " out of " + std::to_string(reqBuf.size()) + " bytes: " + lastErrorAsString(); + logger_->error("[{}] {}", __func__, out->error); + CloseHandle(hComm); + return out; + } + std::string readBuf; + char buf[64]; + DWORD nbRead = 0; + while (ReadFile(hComm, &buf, sizeof(buf), &nbRead, NULL)) { + if (nbRead <= 0) { + break; + } + logger_->debug("[{}] read {} bytes from {}", __func__, nbRead, in->serial); + readBuf.append(std::string(buf, nbRead)); + } + logger_->debug("[{}] {} bytes read from {}", __func__, readBuf.size(), in->serial); + if (!readBuf.empty()) { + out->response = json::from_cbor(readBuf.cbegin(), readBuf.cend()); + } + CloseHandle(hComm); +#else +#endif + return out; } diff --git a/BlockSettleHW/jade/jadeClient.h b/BlockSettleHW/jade/jadeClient.h index d56b3c29b..c248a6f60 100644 --- a/BlockSettleHW/jade/jadeClient.h +++ b/BlockSettleHW/jade/jadeClient.h @@ -41,7 +41,7 @@ namespace bs { std::shared_ptr getDevice(const std::string& deviceId); protected: - //std::shared_ptr worker(const std::shared_ptr&) override final; + std::shared_ptr worker(const std::shared_ptr&) override final; private: std::shared_ptr logger_; @@ -49,6 +49,38 @@ namespace bs { const bool testNet_; }; + + struct JadeIn : public bs::InData + { + JadeIn(const std::string& s, const nlohmann::json& req) + : serial(s), request(req) {} + ~JadeIn() override = default; + const std::string serial; + const nlohmann::json request; + }; + struct JadeOut : public bs::OutData + { + JadeOut(const std::string& s) : serial(s) {} + ~JadeOut() override = default; + const std::string serial; + nlohmann::json response; + std::string error; + }; + + class JadeHandler : public bs::HandlerImpl + { + public: + JadeHandler(const std::shared_ptr&); + ~JadeHandler() override = default; + + protected: + std::shared_ptr processData(const std::shared_ptr&) override; + + private: + std::shared_ptr logger_; + uint32_t seqNo_{ 0 }; + }; + } //hw } //bs diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 15677a829..561871ff9 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -127,17 +127,21 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) } } if (addrIndex < 0) { - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - data_.push_back({ addr }); - endInsertRows(); - emit rowCountChanged(); + QMetaObject::invokeMethod(this, [this, addr] { + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + data_.push_back({ addr }); + endInsertRows(); + emit rowCountChanged(); + }); } else { if (data_.at(addrIndex).expanded) { - beginInsertRows(QModelIndex(), addrIndex + 2, addrIndex + 2); - data_.insert(data_.cbegin() + addrIndex + 1, { {}, utxo.getTxHash(), utxo.getTxOutIndex() }); - endInsertRows(); - emit rowCountChanged(); + QMetaObject::invokeMethod(this, [this, addrIndex, utxo] { + beginInsertRows(QModelIndex(), addrIndex + 2, addrIndex + 2); + data_.insert(data_.cbegin() + addrIndex + 1, { {}, utxo.getTxHash(), utxo.getTxOutIndex() }); + endInsertRows(); + emit rowCountChanged(); + }); } } } diff --git a/common b/common index 0c72ba383..f04b41156 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 0c72ba38378be45dd9b6c9f930aab53c54300146 +Subproject commit f04b41156d4dcdeeb508e873b5cdd4f790c98cf3 From 31d0ae8bd58886fb0929800768f23131287c20a2 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 25 Feb 2023 02:48:12 +0200 Subject: [PATCH 168/436] qml: advansed send: fix bugs + rbf --- GUI/QtQuick/QtQuickAdapter.cpp | 3 +- GUI/QtQuick/QtQuickAdapter.h | 2 +- GUI/QtQuick/TxInputsModel.cpp | 27 +++++++++++- GUI/QtQuick/TxInputsModel.h | 4 ++ GUI/QtQuick/qml/Send/AdvancedDetails.qml | 52 ++++++++++++++++++------ GUI/QtQuick/qml/Send/SelectInputs.qml | 3 +- 6 files changed, 72 insertions(+), 19 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index c3d9ddbca..44d1d8a33 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1242,7 +1242,7 @@ void QtQuickAdapter::requestFeeSuggestions() } QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStringList& recvAddrs - , const QList& recvAmounts, double fee, const QString& comment, QUTXOList* utxos) + , const QList& recvAmounts, double fee, const QString& comment, bool isRbf, QUTXOList* utxos) { WalletsMessage msg; auto msgReq = msg.mutable_tx_request(); @@ -1287,6 +1287,7 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri idx++; } } + msgReq->set_rbf(isRbf); msgReq->set_fee_per_byte(fee); if (!comment.isEmpty()) { msgReq->set_comment(comment.toStdString()); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 4d993c862..eab5fe4ba 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -176,7 +176,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void requestFeeSuggestions(); Q_INVOKABLE QTXSignRequest* createTXSignRequest(int walletIndex, const QStringList& recvAddrs - , const QList& recvAmounts, double fee, const QString& comment = {}, QUTXOList* utxos = nullptr); + , const QList& recvAmounts, double fee, const QString& comment = {}, bool isRbf = true, QUTXOList* utxos = nullptr); Q_INVOKABLE void getUTXOsForWallet(int walletIndex); Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); Q_INVOKABLE int getSearchInputType(const QString&); diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 561871ff9..e5708382e 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -109,10 +109,14 @@ void TxInputsModel::clear() selectionAddresses_.clear(); selectionRoot_ = false; preSelected_.clear(); + selectedBalance_ = 0; + nbTx_ = 0; endResetModel(); + emit selectionChanged(); emit rowCountChanged(); } +#include void TxInputsModel::addUTXOs(const std::vector& utxos) { for (const auto& utxo : utxos) { @@ -132,7 +136,11 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) data_.push_back({ addr }); endInsertRows(); emit rowCountChanged(); - }); + waitCond.wakeAll(); + }); + mutex.lock(); + waitCond.wait(&mutex); + mutex.unlock(); } else { if (data_.at(addrIndex).expanded) { @@ -141,7 +149,11 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) data_.insert(data_.cbegin() + addrIndex + 1, { {}, utxo.getTxHash(), utxo.getTxOutIndex() }); endInsertRows(); emit rowCountChanged(); - }); + waitCond.wakeAll(); + }); + mutex.lock(); + waitCond.wait(&mutex); + mutex.unlock(); } } } @@ -198,6 +210,17 @@ void TxInputsModel::toggleSelection(int row) if (!selectionRoot_) { selectionUtxos_.clear(); selectionAddresses_.clear(); + for (int i_row = 1; i_row < rowCount(); i_row ++) { + const auto& entry = data_.at(i_row-1); + const auto& itAddr = utxos_.find(entry.address); + if (itAddr != utxos_.end()) { + for (const auto& u : itAddr->second) { + selectionUtxos_.erase({u.getTxHash(), u.getTxOutIndex()}); + selectedBalance_ -= u.getValue(); + nbTx_--; + } + } + } } else { for (int i_row = 1; i_row < rowCount(); i_row ++) { diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index 68982eeec..20f233142 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -16,6 +16,8 @@ #include #include #include +#include +#include #include "Address.h" #include "BinaryData.h" @@ -94,6 +96,8 @@ class TxInputsModel : public QAbstractTableModel QVariant getData(int row, int col) const; QColor dataColor(int row, int col) const; QList collectUTXOsFor(double amount); + QMutex mutex; + QWaitCondition waitCond; private: enum Columns {ColumnAddress, ColumnTx, ColumnComment, ColumnBalance}; diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index d6f28c765..e8c252774 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -111,20 +111,47 @@ ColumnLayout { spacing: 0 - Label { - id: inputs_title + RowLayout { - Layout.leftMargin: 16 + Layout.fillWidth: true + Layout.preferredHeight : 19 Layout.topMargin: 16 - Layout.alignment: Qt.AlignLeft | Qt.AlingTop + Layout.alignment: Qt.AlingTop - text: qsTr("Inputs") + Label { + id: inputs_title + + Layout.leftMargin: 16 + Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter + + text: qsTr("Inputs") + + height : 19 + color: "#E2E7FF" + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Medium + } + + Label { + Layout.fillWidth: true + Layout.fillHeight : true + } + + CustomCheckBox { + id: checkbox_rbf + + Layout.alignment: Qt.AlignRight | Qt.AlignVCenter + Layout.rightMargin: 16 + + text: qsTr("RBF") + + spacing: 6 + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Normal + } - height : 19 - color: "#E2E7FF" - font.pixelSize: 16 - font.family: "Roboto" - font.weight: Font.Medium } WalletsComboBox { @@ -177,13 +204,12 @@ ColumnLayout { } } - Rectangle { height: 1 Layout.fillWidth: true - Layout.topMargin: 196 + Layout.topMargin: 168 Layout.alignment: Qt.AlignLeft | Qt.AlingTop color: BSStyle.defaultGreyColor @@ -476,7 +502,7 @@ ColumnLayout { layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text - , txInputsModel.getSelection()) ) + , checkbox_rbf.checked, txInputsModel.getSelection()) ) } else { diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml index 12f06f51d..6b4163fe2 100644 --- a/GUI/QtQuick/qml/Send/SelectInputs.qml +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -243,7 +243,7 @@ ColumnLayout { Label { - id: amount_title + id: total_amount anchors.top: trans_inputs.bottom anchors.topMargin: 18 @@ -267,6 +267,5 @@ ColumnLayout { function init() { - } } From aa2350bbe70fdac773b1097f473c22ff43a9b5e6 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 25 Feb 2023 13:09:57 +0200 Subject: [PATCH 169/436] pr fixes --- GUI/QtQuick/TxInputsModel.cpp | 25 ++++++++++++------------- GUI/QtQuick/TxInputsModel.h | 6 ++++-- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index e5708382e..0c4346516 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -116,7 +116,6 @@ void TxInputsModel::clear() emit rowCountChanged(); } -#include void TxInputsModel::addUTXOs(const std::vector& utxos) { for (const auto& utxo : utxos) { @@ -136,11 +135,11 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) data_.push_back({ addr }); endInsertRows(); emit rowCountChanged(); - waitCond.wakeAll(); + waitCond_.wakeAll(); }); - mutex.lock(); - waitCond.wait(&mutex); - mutex.unlock(); + mutex_.lock(); + waitCond_.wait(&mutex_); + mutex_.unlock(); } else { if (data_.at(addrIndex).expanded) { @@ -149,11 +148,11 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) data_.insert(data_.cbegin() + addrIndex + 1, { {}, utxo.getTxHash(), utxo.getTxOutIndex() }); endInsertRows(); emit rowCountChanged(); - waitCond.wakeAll(); + waitCond_.wakeAll(); }); - mutex.lock(); - waitCond.wait(&mutex); - mutex.unlock(); + mutex_.lock(); + waitCond_.wait(&mutex_); + mutex_.unlock(); } } } @@ -210,8 +209,8 @@ void TxInputsModel::toggleSelection(int row) if (!selectionRoot_) { selectionUtxos_.clear(); selectionAddresses_.clear(); - for (int i_row = 1; i_row < rowCount(); i_row ++) { - const auto& entry = data_.at(i_row-1); + for (int iRow = 1; iRow < rowCount(); iRow ++) { + const auto& entry = data_.at(iRow-1); const auto& itAddr = utxos_.find(entry.address); if (itAddr != utxos_.end()) { for (const auto& u : itAddr->second) { @@ -223,8 +222,8 @@ void TxInputsModel::toggleSelection(int row) } } else { - for (int i_row = 1; i_row < rowCount(); i_row ++) { - const auto& entry = data_.at(i_row-1); + for (int iRow = 1; iRow < rowCount(); iRow ++) { + const auto& entry = data_.at(iRow-1); if (entry.txId.empty()) { selectionAddresses_.insert(entry.address); } diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index 20f233142..03d68341a 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -96,8 +96,6 @@ class TxInputsModel : public QAbstractTableModel QVariant getData(int row, int col) const; QColor dataColor(int row, int col) const; QList collectUTXOsFor(double amount); - QMutex mutex; - QWaitCondition waitCond; private: enum Columns {ColumnAddress, ColumnTx, ColumnComment, ColumnBalance}; @@ -124,6 +122,10 @@ class TxInputsModel : public QAbstractTableModel QString fee_; uint32_t topBlock_{ 0 }; double collectUTXOsForAmount_{ 0 }; + + QMutex mutex_; + QWaitCondition waitCond_; + }; #endif // TX_INPUTS_MODEL_H From bfd2b717a66cc87a3b2b9b733b6782dec7986801 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Sat, 25 Feb 2023 15:35:10 +0300 Subject: [PATCH 170/436] update common --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index f04b41156..626b01160 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit f04b41156d4dcdeeb508e873b5cdd4f790c98cf3 +Subproject commit 626b01160a88efa6f71c4f4d8770813f9fdc98f9 From 0b2ff6dc71bd70bb3b3c8af9f8dcf1486d35a2c1 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sun, 26 Feb 2023 20:04:39 +0200 Subject: [PATCH 171/436] qml: Transactions page: add RBF/CPFP context menu --- GUI/QtQuick/QtQuickAdapter.cpp | 3 + GUI/QtQuick/TxListModel.h | 3 +- GUI/QtQuick/qml/BsStyles/BSStyle.qml | 9 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 9 +- GUI/QtQuick/qml/Send/SendPopup.qml | 8 ++ .../qml/StyledControls/CustomComboBox.qml | 2 + .../qml/StyledControls/CustomContextMenu.qml | 87 ++++++++++--------- .../qml/StyledControls/CustomPopup.qml | 4 +- .../qml/StyledControls/CustomTableView.qml | 25 +++++- GUI/QtQuick/qml/TransactionsPage.qml | 40 ++++++++- GUI/QtQuick/qml/main.qml | 7 ++ 11 files changed, 143 insertions(+), 54 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 44d1d8a33..605cb9163 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -244,6 +244,9 @@ void QtQuickAdapter::run(int &argc, char **argv) qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); qmlRegisterUncreatableMetaObject(Transactions::staticMetaObject, "terminal.models" , 1, 0, "Transactions", tr("Error: only enums")); + //qmlRegisterType("terminal.models", 1, 0, "TxListModel"); + qmlRegisterUncreatableMetaObject(TxListModel::staticMetaObject, "terminal.models" + , 1, 0, "TxListModel", tr("Error: only enums")); //need to read files in qml qputenv("QML_XHR_ALLOW_FILE_READ", QByteArray("1")); diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 1580f8c82..f98f60a39 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -28,6 +28,8 @@ class TxListModel : public QAbstractTableModel Q_OBJECT public: enum TableRoles { TableDataRole = Qt::UserRole + 1, ColorRole, TxIdRole }; + Q_ENUM(TableRoles) + TxListModel(const std::shared_ptr&, QObject* parent = nullptr); int rowCount(const QModelIndex & = QModelIndex()) const override; @@ -69,7 +71,6 @@ class TxListModel : public QAbstractTableModel uint32_t curBlock_; }; - class TxListForAddr : public QAbstractTableModel { Q_OBJECT diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index 9664c8d69..963c38685 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -80,6 +80,7 @@ QtObject { //new properties readonly property color defaultGreyColor: "#3C435A" + readonly property color wildBlueColor: "#7A88B0" readonly property color buttonsStandardColor: defaultGreyColor readonly property color buttonsStandardPressedColor: "#232734" @@ -99,11 +100,11 @@ QtObject { readonly property color comboBoxItemTextColor: "#020817" readonly property color comboBoxItemTextHighlightedColor: "#45A6FF" - readonly property color comboBoxItemTextCurrentColor: "#7A88B0" + readonly property color comboBoxItemTextCurrentColor: wildBlueColor readonly property color comboBoxItemHighlightedColor: "#45A6FF" readonly property color comboBoxBorderColor: defaultGreyColor - readonly property color comboBoxHoveredBorderColor: "#7A88B0" + readonly property color comboBoxHoveredBorderColor: wildBlueColor readonly property color comboBoxFocusedBorderColor: "#FFFFFF" readonly property color comboBoxPopupedBorderColor: "#45A6FF" @@ -128,6 +129,10 @@ QtObject { readonly property color defaultBorderColor: defaultGreyColor + readonly property color menuItemTextColor: wildBlueColor + readonly property color menuItemHoveredColor: "#2E3343" + readonly property color menuItemColor: "transparent" + //not colors readonly property int defaultPrecision: 8 diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index e8c252774..317bc2eb8 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -21,6 +21,9 @@ ColumnLayout { spacing: 0 property var tempRequest: null + property string txId: "" + property bool isRBF: false + property bool isCPFP: false RowLayout { @@ -38,7 +41,8 @@ ColumnLayout { Layout.rightMargin: 378 Layout.alignment: Qt.AlignRight | Qt.AlingVCenter - text: qsTr("Send Bitcoin") + text: (!isRBF && !isCPFP) ? qsTr("Send Bitcoin") + : (isRBF ? qsTr("Send Bitcoin (RBF)") : qsTr("Send Bitcoin (CPFP)")) } Button { @@ -145,6 +149,7 @@ ColumnLayout { Layout.rightMargin: 16 text: qsTr("RBF") + checked: isRBF spacing: 6 font.pixelSize: 13 @@ -260,6 +265,8 @@ ColumnLayout { Button { id: sel_inputs_button + enabled: !isRBF && !isCPFP + text: qsTr("Select Inputs") font.family: "Roboto" diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 0b5f874ff..1d9320c0e 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -92,6 +92,14 @@ CustomPopup { simple_details.init() } + function open(txId: string, isRBF: bool, isCPFP: bool) { + _stack_view.replace(advanced_details) + advanced_details.init() + advanced_details.txId = txId + advanced_details.isRBF = isRBF + advanced_details.isCPFP = isCPFP + } + function close_click() { if (select_inputs.visible) diff --git a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml index a2e9a032e..9bedf2868 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml @@ -8,8 +8,10 @@ ********************************************************************************** */ + import QtQuick 2.9 import QtQuick.Controls 2.3 + import "../BsStyles" ComboBox { diff --git a/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml b/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml index 0af639061..38c122738 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml @@ -10,52 +10,55 @@ */ import QtQuick 2.9 import QtQuick.Controls 2.3 + import "../BsStyles" -MouseArea { - hoverEnabled: true - acceptedButtons: Qt.RightButton - cursorShape: Qt.IBeamCursor - onClicked: { - if (mouse.button === Qt.RightButton) { - let selectStart = root.selectionStart - let selectEnd = root.selectionEnd - let curPos = root.cursorPosition - contextMenu.popup() - root.cursorPosition = curPos - root.select(selectStart,selectEnd) +Menu { + id: menu + + leftPadding: 6 + topPadding: 4 + bottomPadding: 4 + + delegate: MenuItem { + id: menuItem + implicitWidth: 200 + implicitHeight: 40 + + contentItem: Text { + leftPadding: menuItem.indicator.width + rightPadding: menuItem.arrow.width + + text: menuItem.text + + font.pixelSize: 12 + font.family: "Roboto" + font.weight: Font.Normal + + color: BSStyle.wildBlueColor + + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight } - } - onPressAndHold: { - if (mouse.source === Qt.MouseEventNotSynthesized) { - let selectStart = root.selectionStart - let selectEnd = root.selectionEnd - let curPos = root.cursorPosition - contextMenu.popup() - root.cursorPosition = curPos - root.select(selectStart,selectEnd) + + background: Rectangle { + implicitWidth: 200 + implicitHeight: 40 + + radius: 14 + color: menuItem.highlighted ? BSStyle.menuItemHoveredColor : BSStyle.menuItemColor } } - - Menu { - id: contextMenu - MenuItem { - text: qsTr("Cut") - onTriggered: { - root.cut() - } - } - MenuItem { - text: qsTr("Copy") - onTriggered: { - root.copy() - } - } - MenuItem { - text: qsTr("Paste") - onTriggered: { - root.paste() - } - } + + + background: Rectangle { + implicitWidth: 200 + implicitHeight: 40 + color: BSStyle.popupBackgroundColor + opacity: 1 + radius: 14 + border.color : BSStyle.defaultBorderColor + border.width : 1 } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml index f6d3b6ffa..4a7d05c3f 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml @@ -3,6 +3,7 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 +import "../BsStyles" Window { id: root @@ -35,8 +36,7 @@ Window { Rectangle { id: rect - property var phrase - color: "#191E2A" + color: BSStyle.popupBackgroundColor opacity: 1 radius: 16 height: stack_popup.height + navig_bar_width diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index 648f61d67..19ce12eea 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -33,7 +33,9 @@ Column { signal copyRequested(var id) signal deleteRequested(int id) signal cellClicked(var row, var column, var data) + signal cellRightClicked(var row, var column, var data) signal cellDoubleClicked(var row, var column, var data) + signal cellRightDoubleClicked(var row, var column, var data) CustomHorizontalHeaderView { id: tableHeader @@ -82,11 +84,30 @@ Column { preventStealing: true propagateComposedEvents: true hoverEnabled: true + acceptedButtons: Qt.LeftButton | Qt.RightButton onEntered: component.selected_row_index = row onExited: component.selected_row_index = -1 - onClicked: root.cellClicked(row, column, tableData) - onDoubleClicked: root.cellDoubleClicked(row, column, tableData) + onClicked: (mouse) => { + if (mouse.button === Qt.LeftButton) + { + root.cellClicked(row, column, tableData) + } + else if (mouse.button === Qt.RightButton) + { + root.cellRightClicked(row, column, tableData) + } + } + onDoubleClicked: (mouse) => { + if (mouse.button === Qt.LeftButton) + { + root.cellDoubleClicked(row, column, tableData) + } + else if (mouse.button === Qt.RightButton) + { + root.cellRightDoubleClicked(row, column, tableData) + } + } } Loader { diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 6000c3a33..7ea4cd64b 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -13,13 +13,11 @@ import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtQml.Models 2 import QtQuick.Dialogs 1.3 -import terminal.models 1.0 import "StyledControls" import "BsStyles" -//import "BsControls" -//import "BsDialogs" -//import "js/helper.js" as JsHelper + +import terminal.models 1.0 Item { id: transactions @@ -27,6 +25,8 @@ Item { width: 1200 height: 788 + signal openSend (string txId, bool isRBF, bool isCPFP) + TransactionFilterModel { id: transactionModel sourceModel: txListModel @@ -165,7 +165,9 @@ Item { copy_button_column_index: 3 columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] + onCopyRequested: bsApp.copyAddressToClipboard(id) + onCellClicked: (row, column, data) => { const txHash = model.data(model.index(row, 0), 259) transactionDetails.walletName = model.data(model.index(row, 1), 257) @@ -178,6 +180,36 @@ Item { transactionDetails.tx = bsApp.getTXDetails(txHash) transactionDetails.open() } + + onCellRightClicked: (row, column, data) => { + context_menu.row = row + context_menu.column = column + context_menu.popup() + } + + CustomContextMenu { + id: context_menu + + property int row + property int column + + Action { + text: qsTr("RBF") + onTriggered: { + var txId = transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) + openSend(txId, true, false) + } + } + + Action { + text: qsTr("CPFP") + onTriggered: { + var txId = transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) + openSend(txId, false, true) + } + } + + } } } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 42c9c9a3e..37826be16 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -267,6 +267,13 @@ ApplicationWindow { TransactionsPage { id: transactionsPage + + onOpenSend: (txId, isRBF, isCPFP) => { + send_popup.open(txId, isRBF, isCPFP) + send_popup.show() + send_popup.raise() + send_popup.requestActivate() + } } ExplorerPage { From 86337738d7a888bc2f4531c4ab87ca552ec1a065 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 27 Feb 2023 12:39:18 +0200 Subject: [PATCH 172/436] fix pr --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 317bc2eb8..73a95b5d2 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -149,7 +149,6 @@ ColumnLayout { Layout.rightMargin: 16 text: qsTr("RBF") - checked: isRBF spacing: 6 font.pixelSize: 13 From 63c6f03945c7371622eefc1098acee32fb36766c Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 27 Feb 2023 12:44:00 +0200 Subject: [PATCH 173/436] fix pr --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 73a95b5d2..d60a6ac8e 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -534,6 +534,7 @@ ColumnLayout { amount_input.input_text = "" comment_input.input_text = "" rec_addr_input.input_text = "" + checkbox_rbf.checked = true bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) txOutputsModel.clearOutputs() From d08d34aeee50f1f6129bc369c41b86275a8b143f Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 27 Feb 2023 15:52:49 +0300 Subject: [PATCH 174/436] fix address generation --- GUI/QtQuick/QtQuickAdapter.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 605cb9163..9c828bb6d 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -595,14 +595,16 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) case WalletsMessage::kWalletAddresses: { std::vector addresses; - const auto& hdWallet = hdWallets_.at(msg.wallet_addresses().wallet_id()); for (const auto &addr : msg.wallet_addresses().addresses()) { - try { - const auto& assetType = hdWallet.leaves.at(addr.wallet_id()); - addresses.push_back({ std::move(bs::Address::fromAddressString(addr.address())) - , addr.index(), addr.wallet_id(), assetType}); + for (const auto& hdWallet : hdWallets_) { + try { + const auto& assetType = hdWallet.second.leaves.at(addr.wallet_id()); + addresses.push_back({ std::move(bs::Address::fromAddressString(addr.address())) + , addr.index(), addr.wallet_id(), assetType }); + break; + } + catch (const std::exception&) {} } - catch (const std::exception &) {} } processWalletAddresses(msg.wallet_addresses().wallet_id(), addresses); } From 383372d8a7281505247cced0ac26ac7e672d9b4c Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 27 Feb 2023 16:29:51 +0200 Subject: [PATCH 175/436] qml: fixed receive wallet display + disable send/receive without wallets --- GUI/QtQuick/qml/Receive/ReceiveQrCode.qml | 12 +++++++- GUI/QtQuick/qml/main.qml | 34 +++++++++++++---------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml index 535380856..4ecb7f570 100644 --- a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml +++ b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml @@ -6,6 +6,7 @@ import QtQuick.Layouts 1.15 import "../BsStyles" import "../StyledControls" +import wallet.balance 1.0 ColumnLayout { @@ -43,11 +44,20 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: 6 Layout.preferredHeight : 16 - text: bsApp.walletsList[overviewWalletIndex] + " / Native SegWit" + text: getWalletData(overviewWalletIndex, WalletBalance.NameRole) + " / Native SegWit" color: "#E2E7FF" font.pixelSize: 14 font.family: "Roboto" font.weight: Font.Normal + + Connections + { + target:walletBalances + function onRowCountChanged () + { + wallet_name.text = getWalletData(overviewWalletIndex, WalletBalance.NameRole) + " / Native SegWit" + } + } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 37826be16..ccf9ca2f1 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -30,7 +30,7 @@ ApplicationWindow { title: qsTr("BlockSettle Terminal") property var currentDialog: ({}) - property int overviewWalletIndex + property int overviewWalletIndex: 0 readonly property int resizeAnimationDuration: 25 Component.onCompleted: { @@ -198,13 +198,16 @@ ApplicationWindow { font.pointSize: 16 Layout.fillHeight: true onClicked: { - bsApp.requestFeeSuggestions() - topMenuBtnClicked(btnSend) - //stack.push(sendPage) - send_popup.init() - send_popup.show() - send_popup.raise() - send_popup.requestActivate() + if (walletBalances.rowCount > 0) + { + bsApp.requestFeeSuggestions() + topMenuBtnClicked(btnSend) + //stack.push(sendPage) + send_popup.init() + send_popup.show() + send_popup.raise() + send_popup.requestActivate() + } } } CustomTitleToolButton { @@ -217,12 +220,15 @@ ApplicationWindow { enabled: !bsApp.walletsList.empty onClicked: { - topMenuBtnClicked(btnReceive) - //stack.push(receivePage) - bsApp.generateNewAddress(overviewWalletIndex, true) - receive_popup.show() - receive_popup.raise() - receive_popup.requestActivate() + if (walletBalances.rowCount > 0) + { + topMenuBtnClicked(btnReceive) + //stack.push(receivePage) + bsApp.generateNewAddress(overviewWalletIndex, true) + receive_popup.show() + receive_popup.raise() + receive_popup.requestActivate() + } } } CustomTitleToolButton { From aeeeb58705e74bfa6369690c369d309333cd7bdd Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 27 Feb 2023 16:57:11 +0200 Subject: [PATCH 176/436] fix pr --- GUI/QtQuick/qml/Receive/ReceiveQrCode.qml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml index 4ecb7f570..766ead601 100644 --- a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml +++ b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml @@ -44,7 +44,7 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: 6 Layout.preferredHeight : 16 - text: getWalletData(overviewWalletIndex, WalletBalance.NameRole) + " / Native SegWit" + text: fill_in_text() color: "#E2E7FF" font.pixelSize: 14 font.family: "Roboto" @@ -55,9 +55,14 @@ ColumnLayout { target:walletBalances function onRowCountChanged () { - wallet_name.text = getWalletData(overviewWalletIndex, WalletBalance.NameRole) + " / Native SegWit" + fill_in_text() } } + + function fill_in_text() + { + wallet_name.text = getWalletData(overviewWalletIndex, WalletBalance.NameRole) + qsTr(" / Native SegWit") + } } From 8e5b6a12f9b9be1accb152cdd5a02e16fa2fe981 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 27 Feb 2023 18:08:51 +0200 Subject: [PATCH 177/436] pr fixes --- GUI/QtQuick/qml/Receive/ReceiveQrCode.qml | 16 +----- GUI/QtQuick/qml/main.qml | 68 +++++++++++++---------- 2 files changed, 40 insertions(+), 44 deletions(-) diff --git a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml index 766ead601..2f892048d 100644 --- a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml +++ b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml @@ -44,25 +44,11 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: 6 Layout.preferredHeight : 16 - text: fill_in_text() + text: qsTr("%1 / Native SegWit").arg(getWalletData(overviewWalletIndex, WalletBalance.NameRole)) color: "#E2E7FF" font.pixelSize: 14 font.family: "Roboto" font.weight: Font.Normal - - Connections - { - target:walletBalances - function onRowCountChanged () - { - fill_in_text() - } - } - - function fill_in_text() - { - wallet_name.text = getWalletData(overviewWalletIndex, WalletBalance.NameRole) + qsTr(" / Native SegWit") - } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index ccf9ca2f1..1f18a7789 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -30,7 +30,7 @@ ApplicationWindow { title: qsTr("BlockSettle Terminal") property var currentDialog: ({}) - property int overviewWalletIndex: 0 + property int overviewWalletIndex: -1 readonly property int resizeAnimationDuration: 25 Component.onCompleted: { @@ -88,20 +88,14 @@ ApplicationWindow { target:bsApp function onInvokePINentry () { - pin_popup.init() - pin_popup.show() - pin_popup.raise() - pin_popup.requestActivate() + show_popup(pin_popup) } function onInvokePasswordEntry(devName, acceptOnDevice) { password_popup.device_name = devName password_popup.accept_on_device = acceptOnDevice - password_popup.init() - password_popup.show() - password_popup.raise() - password_popup.requestActivate() + show_popup(password_popup) } function onShowError(text) @@ -112,6 +106,18 @@ ApplicationWindow { } } + Connections + { + target:walletBalances + function onRowCountChanged () + { + if (overviewWalletIndex === -1) + { + overviewWalletIndex = 0 + } + } + } + color: BSStyle.backgroundColor overlay.modal: Rectangle { @@ -202,11 +208,11 @@ ApplicationWindow { { bsApp.requestFeeSuggestions() topMenuBtnClicked(btnSend) - //stack.push(sendPage) - send_popup.init() - send_popup.show() - send_popup.raise() - send_popup.requestActivate() + show_popup(send_popup) + } + else + { + show_popup(create_wallet) } } } @@ -223,11 +229,12 @@ ApplicationWindow { if (walletBalances.rowCount > 0) { topMenuBtnClicked(btnReceive) - //stack.push(receivePage) bsApp.generateNewAddress(overviewWalletIndex, true) - receive_popup.show() - receive_popup.raise() - receive_popup.requestActivate() + show_popup(receive_popup) + } + else + { + show_popup(create_wallet) } } } @@ -237,10 +244,7 @@ ApplicationWindow { icon.source: "qrc:/images/settings_icon.png" onClicked: { topMenuBtnClicked(btnSettings) - //stack.push(settingsPage) - settings_popup.show() - settings_popup.raise() - settings_popup.requestActivate() + show_popup(settings_popup) } } } @@ -260,10 +264,7 @@ ApplicationWindow { OverviewPage { id: overviewPage onNewWalletClicked: { - create_wallet.init() - create_wallet.show() - create_wallet.raise() - create_wallet.requestActivate() + show_popup(create_wallet) } onCurWalletIndexChanged: (ind) => { @@ -276,9 +277,7 @@ ApplicationWindow { onOpenSend: (txId, isRBF, isCPFP) => { send_popup.open(txId, isRBF, isCPFP) - send_popup.show() - send_popup.raise() - send_popup.requestActivate() + show_popup(send_popup) } } @@ -437,4 +436,15 @@ ApplicationWindow { { return feeSuggestions.data(feeSuggestions.index(index, 0), role) } + + function show_popup (id) + { + if (typeof id.init === "function") + { + id.init() + } + id.show() + id.raise() + id.requestActivate() + } } From d790bb02c323c84885df5e2f02a71e49567fa675 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 28 Feb 2023 20:00:04 +0300 Subject: [PATCH 178/436] initial RBF/CPFP support --- GUI/QtQuick/QTXSignRequest.h | 3 + GUI/QtQuick/QtQuickAdapter.cpp | 104 ++++++++++++++++++++--- GUI/QtQuick/QtQuickAdapter.h | 30 +++---- GUI/QtQuick/TxInputsModel.cpp | 26 +++++- GUI/QtQuick/TxInputsModel.h | 16 ++-- GUI/QtQuick/TxListModel.cpp | 76 +++++++++++++++-- GUI/QtQuick/TxListModel.h | 20 ++++- GUI/QtQuick/TxOutputsModel.cpp | 22 ++++- GUI/QtQuick/TxOutputsModel.h | 2 + GUI/QtQuick/qml/Send/AdvancedDetails.qml | 67 +++++++++++---- GUI/QtQuick/qml/Send/SendPopup.qml | 5 +- GUI/QtQuick/qml/TransactionsPage.qml | 3 + GUI/QtWidgets/QtGuiAdapter.cpp | 12 +-- common | 2 +- 14 files changed, 305 insertions(+), 83 deletions(-) diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h index fc5a5b784..148d42396 100644 --- a/GUI/QtQuick/QTXSignRequest.h +++ b/GUI/QtQuick/QTXSignRequest.h @@ -34,6 +34,8 @@ class QTXSignRequest : public QObject bs::core::wallet::TXSignRequest txReq() const { return txReq_; } void setTxSignReq(const bs::core::wallet::TXSignRequest&); void setError(const QString&); + void addDummyUTXO(const UTXO& utxo) { dummyUTXOs_.push_back(utxo); } + std::vector dummyUTXOs() const { return dummyUTXOs_; } void setHWW(bool hww) { @@ -81,6 +83,7 @@ class QTXSignRequest : public QObject private: bs::core::wallet::TXSignRequest txReq_{}; QString error_; + std::vector dummyUTXOs_; bool isHWW_{ false }; bool isHWWready_{ false }; }; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 9c828bb6d..7c41d2c05 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -45,7 +45,6 @@ #include "viewmodels/WalletPropertiesVM.h" #include "PendingTransactionFilterModel.h" -#include "common.pb.h" #include "hardware_wallet.pb.h" #include "terminal.pb.h" @@ -513,6 +512,8 @@ ProcessingResult QtQuickAdapter::processBlockchain(const Envelope &env) .arg(QString::fromStdString(msg.tx_push_result().error_message()))); } break; + case ArmoryMessage::kUtxos: + return processUTXOs(env.responseId(), msg.utxos()); default: return ProcessingResult::Ignored; } return ProcessingResult::Success; @@ -1007,7 +1008,7 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId txDet.inputAddresses.push_back({ bs::Address::fromAddressString(inAddr.address()) , inAddr.value(), inAddr.value_string(), inAddr.wallet_name() , static_cast(inAddr.script_type()) - , BinaryData::fromString(inAddr.out_hash()), inAddr.out_index() }); + , BinaryData::fromString(inAddr.out_hash()), (uint32_t)inAddr.out_index() }); } catch (const std::exception &e) { logger_->warn("[QtGuiAdapter::processTXDetails] input deser error: {}", e.what()); } @@ -1017,12 +1018,12 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId txDet.outputAddresses.push_back({ bs::Address::fromAddressString(outAddr.address()) , outAddr.value(), outAddr.value_string(), outAddr.wallet_name() , static_cast(outAddr.script_type()) - , BinaryData::fromString(outAddr.out_hash()), outAddr.out_index() }); + , BinaryData::fromString(outAddr.out_hash()), (uint32_t)outAddr.out_index() }); } catch (const std::exception &) { // OP_RETURN data for valueStr txDet.outputAddresses.push_back({ bs::Address{} , outAddr.value(), outAddr.address(), outAddr.wallet_name() , static_cast(outAddr.script_type()), ownTxHash - , outAddr.out_index() }); + , (uint32_t)outAddr.out_index() }); } } try { @@ -1031,7 +1032,7 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId , resp.change_address().wallet_name() , static_cast(resp.change_address().script_type()) , BinaryData::fromString(resp.change_address().out_hash()) - , resp.change_address().out_index() }; + , (uint32_t)resp.change_address().out_index() }; } catch (const std::exception &) {} for (const auto& addr : resp.own_addresses()) { @@ -1251,7 +1252,9 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri { WalletsMessage msg; auto msgReq = msg.mutable_tx_request(); - msgReq->set_hd_wallet_id(hdWalletIdByIndex(walletIndex)); + if (walletIndex >= 0) { + msgReq->set_hd_wallet_id(hdWalletIdByIndex(walletIndex)); + } bool isMaxAmount = false; if (recvAddrs.isEmpty()) { const auto& recipients = txOutputsModel_->recipients(); @@ -1297,13 +1300,46 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri if (!comment.isEmpty()) { msgReq->set_comment(comment.toStdString()); } + QTXSignRequest* txReq = nullptr; if (utxos) { - for (const auto& qUtxo : utxos->data()) { - msgReq->add_utxos(qUtxo->utxo().serialize().toBinStr()); + if (walletIndex < 0) { + txReq = new QTXSignRequest(this); + for (const auto& qUtxo : utxos->data()) { + txReq->addDummyUTXO(qUtxo->utxo()); + } + ArmoryMessage msgSpendable; + ArmoryMessage_WalletIDs* msgWltIds = nullptr; + if (walletIndex == -1) { // RBF mode + msgWltIds = msgSpendable.mutable_get_rbf_utxos(); + } + else if (walletIndex == -2) { // CPFP mode + msgWltIds = msgSpendable.mutable_get_zc_utxos(); + } + if (msgWltIds) { + for (const auto& wallet : hdWallets_) { + for (const auto& leaf : wallet.second.leaves) { + msgWltIds->add_wallet_ids(leaf.first); + } + } + const auto msgId = pushRequest(user_, userBlockchain_, msgSpendable.SerializeAsString()); + txReqs_[msgId] = { txReq, isMaxAmount, msg }; + return txReq; + } + else { + emit showError(tr("Unknown TX mode")); + return txReq; + } + } + else { + for (const auto& qUtxo : utxos->data()) { + msgReq->add_utxos(qUtxo->utxo().serialize().toBinStr()); + } } } const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); - const auto txReq = new QTXSignRequest(this); + if (!txReq) { + txReq = new QTXSignRequest(this); + } txReqs_[msgId] = { txReq, isMaxAmount }; return txReq; } @@ -1324,14 +1360,14 @@ QTxDetails* QtQuickAdapter::getTXDetails(const QString& txHash) txBinHash.swapEndian(); if (txBinHash.getSize() != 32) { logger_->warn("[{}] invalid TX hash size {}", __func__, txBinHash.getSize()); - return new QTxDetails({}, this); + return new QTxDetails(logger_, {}, this); } WalletsMessage msg; auto msgReq = msg.mutable_tx_details_request(); auto txReq = msgReq->add_requests(); txReq->set_tx_hash(txBinHash.toBinStr()); const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); - const auto txDet = new QTxDetails(txBinHash, this); + const auto txDet = new QTxDetails(logger_, txBinHash, this); txDetailReqs_[msgId] = txDet; return txDet; } @@ -1617,8 +1653,8 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq logger_->error("[{}] unknown request #{}", __func__, msgId); return bs::message::ProcessingResult::Error; } - auto qReq = itReq->second.first; - const bool noReqAmount = itReq->second.second; + auto qReq = itReq->second.txReq; + const bool noReqAmount = itReq->second.isMaxAmount; txReqs_.erase(itReq); if (!response.error_text().empty()) { logger_->error("[{}] {}", __func__, response.error_text()); @@ -1659,6 +1695,48 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq return bs::message::ProcessingResult::Success; } +bs::message::ProcessingResult QtQuickAdapter::processUTXOs(bs::message::SeqId msgId + , const ArmoryMessage_UTXOs& response) +{ + const auto& itReq = txReqs_.find(msgId); + if (itReq == txReqs_.end()) { + logger_->error("[{}] unknown request #{}", __func__, msgId); + return bs::message::ProcessingResult::Error; + } + std::vector utxos; + utxos.reserve(response.utxos_size()); + try { + for (const auto& serUtxo : response.utxos()) { + UTXO utxo; + utxo.unserialize(BinaryData::fromString(serUtxo)); + utxos.emplace_back(std::move(utxo)); + } + } + catch (const std::exception& e) { + logger_->error("[{}] failed to deser UTXO: {}", __func__, e.what()); + } + const auto& dummyUTXOs = itReq->second.txReq->dummyUTXOs(); + auto msgReq = itReq->second.msg.mutable_tx_request(); + for (const auto& u : dummyUTXOs) { + for (const auto& utxo : utxos) { + if ((u.getTxHash() == utxo.getTxHash())) { + msgReq->add_utxos(utxo.serialize().toBinStr()); + break; + } + } + } + if (msgReq->utxos_size() != dummyUTXOs.size()) { + emit showError(tr("failed to obtain UTXO[s]")); + txReqs_.erase(itReq); + return bs::message::ProcessingResult::Error; + } + msgReq->set_hd_wallet_id(response.wallet_id()); + msgId = pushRequest(user_, userWallets_, itReq->second.msg.SerializeAsString()); + txReqs_[msgId] = { itReq->second.txReq, itReq->second.isMaxAmount }; + txReqs_.erase(itReq); + return bs::message::ProcessingResult::Success; +} + bs::message::ProcessingResult QtQuickAdapter::processHWDevices(const HW::DeviceMgrMessage_Devices& response) { std::vector devices; diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index eab5fe4ba..d9de60576 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -26,6 +26,8 @@ #include "Wallets/SignContainer.h" #include "viewmodels/WalletPropertiesVM.h" +#include "common.pb.h" + namespace bs { namespace gui { namespace qt { @@ -34,25 +36,6 @@ namespace bs { } } namespace BlockSettle { - namespace Common { - class ArmoryMessage_AddressHistory; - class ArmoryMessage_FeeLevelsResponse; - class ArmoryMessage_Transactions; - class ArmoryMessage_ZCInvalidated; - class ArmoryMessage_ZCReceived; - class LedgerEntries; - class OnChainTrackMessage_AuthAddresses; - class OnChainTrackMessage_AuthState; - class SignerMessage_SignTxResponse; - class WalletsMessage_AuthKey; - class WalletsMessage_ReservedUTXOs; - class WalletsMessage_TXDetailsResponse; - class WalletsMessage_TxResponse; - class WalletsMessage_UtxoListResponse; - class WalletsMessage_WalletBalances; - class WalletsMessage_WalletData; - class WalletsMessage_WalletsListResponse; - } namespace HW { class DeviceMgrMessage_Devices; class DeviceMgrMessage_SignTxResponse; @@ -240,6 +223,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void processWalletAddresses(const std::string& walletId, const std::vector&); bs::message::ProcessingResult processTxResponse(bs::message::SeqId , const BlockSettle::Common::WalletsMessage_TxResponse&); + bs::message::ProcessingResult processUTXOs(bs::message::SeqId + , const BlockSettle::Common::ArmoryMessage_UTXOs&); bs::message::ProcessingResult processHWDevices(const BlockSettle::HW::DeviceMgrMessage_Devices&); bs::message::ProcessingResult processHWWready(const std::string& walletId); @@ -288,7 +273,12 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop bool hwDevicesPolling_{ false }; bs::hww::DeviceKey curAuthDevice_{}; - std::map> txReqs_; + struct TXReq { + QTXSignRequest* txReq; + bool isMaxAmount{ false }; + BlockSettle::Common::WalletsMessage msg{}; + }; + std::map txReqs_; std::unordered_map hwwReady_; std::map txDetailReqs_; std::map settingsCache_; diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 0c4346516..42f3e309d 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -166,6 +166,14 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) } } +void TxInputsModel::addEntries(const std::vector& entries) +{ + beginInsertRows(QModelIndex(), rowCount(), rowCount() + entries.size() - 1); + data_.insert(data_.cend(), entries.cbegin(), entries.cend()); + endInsertRows(); + emit rowCountChanged(); +} + void TxInputsModel::toggle(int row) { --row; @@ -374,6 +382,16 @@ QUTXOList* TxInputsModel::getSelection() return new QUTXOList(result, (QObject*)this); } +QUTXOList* TxInputsModel::zcInputs() const +{ + QList result; + for (const auto& entry : data_) { + result.push_back(new QUTXO(UTXO(entry.amount, UINT32_MAX, UINT32_MAX + , entry.txOutIndex, entry.txId, BinaryData::fromString("dummy")), (QObject*)this)); + } + return new QUTXOList(result, (QObject*)this); +} + QList TxInputsModel::collectUTXOsFor(double amount) { QList result; @@ -424,7 +442,10 @@ QVariant TxInputsModel::getData(int row, int col) const return QString::fromStdString(entry.address.display()); } case ColumnTx: - if (itUTXOs != utxos_.end()) { + if (itUTXOs == utxos_.end()) { + return QString::number(1); + } + else { return QString::number(itUTXOs->second.size()); } break; @@ -437,6 +458,9 @@ QVariant TxInputsModel::getData(int row, int col) const return gui_utils::satoshiToQString(balance); } else { + if (utxos_.empty()) { + return gui_utils::satoshiToQString(entry.amount); + } for (const auto& byAddr : utxos_) { for (const auto& utxo : byAddr.second) { if ((entry.txId == utxo.getTxHash()) && (entry.txOutIndex == utxo.getTxOutIndex())) { diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index 03d68341a..8b706812c 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -74,6 +74,15 @@ class TxInputsModel : public QAbstractTableModel void addUTXOs(const std::vector&); void setTopBlock(uint32_t topBlock) { topBlock_ = topBlock; } + struct Entry { + bs::Address address; + BinaryData txId{}; + uint32_t txOutIndex{ UINT32_MAX }; + uint64_t amount{ 0 }; + bool expanded{ false }; + }; + void addEntries(const std::vector&); + Q_PROPERTY(int nbTx READ nbTx NOTIFY selectionChanged) int nbTx() const { return nbTx_; } Q_PROPERTY(QString balance READ balance NOTIFY selectionChanged) @@ -86,6 +95,7 @@ class TxInputsModel : public QAbstractTableModel Q_INVOKABLE void toggle(int row); Q_INVOKABLE void toggleSelection(int row); Q_INVOKABLE QUTXOList* getSelection(); + Q_INVOKABLE QUTXOList* zcInputs() const; signals: void selectionChanged() const; @@ -105,12 +115,6 @@ class TxInputsModel : public QAbstractTableModel const QMap header_; std::map> utxos_; - struct Entry { - bs::Address address; - BinaryData txId{}; - uint32_t txOutIndex{ UINT32_MAX }; - bool expanded{ false }; - }; std::vector data_; std::set> selectionUtxos_; std::set selectionAddresses_; diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index c91fad5e4..540dbafa0 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -12,8 +12,9 @@ #include #include #include -#include "StringUtils.h" #include "ColorScheme.h" +#include "StringUtils.h" +#include "TxOutputsModel.h" #include "Utils.h" namespace { @@ -146,11 +147,8 @@ QString TxListModel::txType(int row) const QString TxListModel::txFlag(int row) const { - const auto& itTxDet = txDetails_.find(row); - if (itTxDet != txDetails_.end()) { - if (itTxDet->second.tx.isRBF()) { - return tr("RBF"); - } + if (isRBF(row)) { + return tr("RBF"); } return {}; } @@ -164,6 +162,27 @@ QString TxListModel::txId(int row) const return {}; } +bool TxListModel::isRBF(int row) const +{ + const auto& itTxDet = txDetails_.find(row); + if (itTxDet != txDetails_.end()) { + return itTxDet->second.tx.isRBF(); + } + return false; +} + +quint32 TxListModel::nbConf(int row) const +{ + const auto& itTxDet = txDetails_.find(row); + if (itTxDet != txDetails_.end()) { + if (itTxDet->second.tx.getTxHeight() == UINT32_MAX) { + return 0; + } + return curBlock_ - itTxDet->second.tx.getTxHeight() + 1; + } + return UINT32_MAX; +} + QVariant TxListModel::data(const QModelIndex& index, int role) const { if (index.column() >= header_.size()) { @@ -176,6 +195,10 @@ QVariant TxListModel::data(const QModelIndex& index, int role) const return dataColor(index.row(), index.column()); case TxIdRole: return txId(index.row()); + case RBFRole: + return isRBF(index.row()); + case NbConfRole: + return nbConf(index.row()); default: break; } return QVariant(); @@ -633,17 +656,51 @@ void QTxDetails::setDetails(const bs::sync::TXWalletDetails& details) if (details.changeAddress.address.isValid()) { details_.outputAddresses.push_back(details.changeAddress); } - QMetaObject::invokeMethod(this, [this] { - inputsModel_ = new TxInOutModel(details_.inputAddresses, tr("Input"), this); - outputsModel_ = new TxInOutModel(details_.outputAddresses, tr("Output"), this); + inputsModel_ = new TxInOutModel(details_.inputAddresses, tr("Input"), this); + outputsModel_ = new TxInOutModel(details_.outputAddresses, tr("Output"), this); + auto outputsModel = new TxOutputsModel(logger_, this); + for (const auto& out : details.outputAddresses) { + outputsModel->addOutput(QString::fromStdString(out.address.display()) + , out.value / BTCNumericTypes::BalanceDivider); + } + ownInputs_ = new TxInputsModel(logger_, outputsModel, this); + std::vector inputs; + inputs.reserve(details.inputAddresses.size()); + for (const auto& in : details.inputAddresses) { + inputs.push_back({ in.address, in.outHash, in.outIndex, in.value }); + } + ownOutputs_ = new TxInputsModel(logger_, outputsModel, this); + outputs_.clear(); + outputs_.reserve(details.inputAddresses.size()); + for (const auto& out : details.outputAddresses) { + outputs_.push_back({ out.address, out.outHash, out.outIndex, out.value }); + } + QMetaObject::invokeMethod(this, [this, inputs] { + ownInputs_->addEntries(inputs); + ownOutputs_->addEntries(outputs_); emit updated(); }); } +std::vector> QTxDetails::outputData() const +{ + std::vector> result; + for (const auto& out : outputs_) { + result.push_back({out.address, out.amount / BTCNumericTypes::BalanceDivider}); + } + return result; +} + void QTxDetails::setCurBlock(uint32_t curBlock) { if (curBlock_ != curBlock) { curBlock_ = curBlock; + if (ownInputs_) { + ownInputs_->setTopBlock(curBlock); + } + if (ownOutputs_) { + ownOutputs_->setTopBlock(curBlock); + } QMetaObject::invokeMethod(this, [this] { emit newBlock(); }); @@ -722,6 +779,7 @@ quint32 QTxDetails::height() const return details_.tx.getTxHeight(); } + TxInOutModel::TxInOutModel(const std::vector& data, const QString& type, QObject* parent) : QAbstractTableModel(parent) , data_(data) diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index f98f60a39..ec475c056 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -17,6 +17,7 @@ #include #include #include "ArmoryConnection.h" +#include "TxInputsModel.h" #include "Wallets/SignerDefs.h" namespace spdlog { @@ -27,7 +28,8 @@ class TxListModel : public QAbstractTableModel { Q_OBJECT public: - enum TableRoles { TableDataRole = Qt::UserRole + 1, ColorRole, TxIdRole }; + enum TableRoles { TableDataRole = Qt::UserRole + 1, ColorRole, TxIdRole + , RBFRole, NbConfRole }; Q_ENUM(TableRoles) TxListModel(const std::shared_ptr&, QObject* parent = nullptr); @@ -61,6 +63,8 @@ class TxListModel : public QAbstractTableModel QString txType(int row) const; QString txFlag(int row) const; QString txId(int row) const; + bool isRBF(int row) const; + quint32 nbConf(int row) const; private: std::shared_ptr logger_; @@ -163,8 +167,9 @@ class QTxDetails : public QObject { Q_OBJECT public: - QTxDetails(const BinaryData& txHash, QObject* parent = nullptr) - : QObject(parent), txHash_(txHash) + QTxDetails(const std::shared_ptr& logger, const BinaryData& txHash + , QObject* parent = nullptr) + : QObject(parent), logger_(logger), txHash_(txHash) {} void setDetails(const bs::sync::TXWalletDetails&); @@ -195,16 +200,25 @@ class QTxDetails : public QObject TxInOutModel* inputs() const { return inputsModel_; } Q_PROPERTY(TxInOutModel* outputs READ outputs NOTIFY updated) TxInOutModel* outputs() const { return outputsModel_; } + Q_PROPERTY(TxInputsModel* ownInputs READ ownInputs NOTIFY updated) + TxInputsModel* ownInputs() const { return ownInputs_; } + Q_PROPERTY(TxInputsModel* ownOutputs READ ownOutputs NOTIFY updated) + TxInputsModel* ownOutputs() const { return ownOutputs_; } + std::vector> outputData() const; signals: void updated(); void newBlock(); private: + std::shared_ptr logger_; const BinaryData txHash_; bs::sync::TXWalletDetails details_; TxInOutModel* inputsModel_{ nullptr }; TxInOutModel* outputsModel_{ nullptr }; + TxInputsModel* ownInputs_{ nullptr }; + TxInputsModel* ownOutputs_{ nullptr }; + std::vector outputs_; uint32_t curBlock_{ 0 }; }; diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index ba2b60acd..d10545e07 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -13,6 +13,7 @@ #include "Address.h" #include "BTCNumericTypes.h" #include "ColorScheme.h" +#include "TxListModel.h" #include "Utils.h" namespace { @@ -108,6 +109,17 @@ QList TxOutputsModel::getOutputAmounts() const return res; } +void TxOutputsModel::setOutputsFrom(QTxDetails* tx) +{ + beginResetModel(); + data_.clear(); + for (const auto& out : tx->outputData()) { + data_.push_back({out.first, out.second}); + } + endResetModel(); + logger_->debug("[{}] {} entries", __func__, data_.size()); +} + void TxOutputsModel::addOutput(const QString& address, double amount) { bs::Address addr; @@ -117,10 +129,12 @@ void TxOutputsModel::addOutput(const QString& address, double amount) catch (const std::exception&) { return; } - Entry entry{ addr, amount }; - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - data_.emplace_back(std::move(entry)); - endInsertRows(); + QMetaObject::invokeMethod(this, [this, addr, amount] { + Entry entry{ addr, amount }; + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + data_.emplace_back(std::move(entry)); + endInsertRows(); + }); } void TxOutputsModel::delOutput(int row) diff --git a/GUI/QtQuick/TxOutputsModel.h b/GUI/QtQuick/TxOutputsModel.h index c3349aff4..4364c8edf 100644 --- a/GUI/QtQuick/TxOutputsModel.h +++ b/GUI/QtQuick/TxOutputsModel.h @@ -24,6 +24,7 @@ namespace spdlog { class logger; } +class QTxDetails; class TxOutputsModel : public QAbstractTableModel { @@ -47,6 +48,7 @@ class TxOutputsModel : public QAbstractTableModel Q_INVOKABLE void clearOutputs(); Q_INVOKABLE QStringList getOutputAddresses() const; Q_INVOKABLE QList getOutputAmounts() const; + Q_INVOKABLE void setOutputsFrom(QTxDetails*); signals: void selectionChanged() const; diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index d60a6ac8e..11d2bdf0d 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -21,7 +21,7 @@ ColumnLayout { spacing: 0 property var tempRequest: null - property string txId: "" + property var tx: null property bool isRBF: false property bool isCPFP: false @@ -149,6 +149,7 @@ ColumnLayout { Layout.rightMargin: 16 text: qsTr("RBF") + enabled: !isRBF spacing: 6 font.pixelSize: 13 @@ -165,6 +166,7 @@ ColumnLayout { Layout.leftMargin: 16 Layout.topMargin: 16 Layout.alignment: Qt.AlignLeft | Qt.AlingTop + visible: !isRBF && !isCPFP width: 504 height: 70 @@ -202,9 +204,16 @@ ColumnLayout { function change_index_handler() { - txInputsModel.fee = parseFloat(fee_suggest_combo.currentValue) - bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) - txOutputsModel.clearOutputs() + console.log("fee index changed") + if (isRBF) { + } + else if (isCPFP) { + } + else { + txInputsModel.fee = parseFloat(fee_suggest_combo.currentValue) + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) + txOutputsModel.clearOutputs() + } } } @@ -228,7 +237,7 @@ ColumnLayout { Layout.leftMargin: 16 Layout.rightMargin: 16 - model: txInputsSelectedModel + model: isRBF ? tx.ownInputs : isCPFP ? tx.ownOutputs : txInputsSelectedModel columnWidths: [0.7, 0.1, 0, 0.2] copy_button_column_index: -1 @@ -419,8 +428,8 @@ ColumnLayout { Layout.topMargin: 16 Layout.alignment: Qt.AlignLeft | Qt.AlingTop - enabled: rec_addr_input.isValid && rec_addr_input.input_text.length - && parseFloat(amount_input.input_text) !== 0 && amount_input.input_text.length + enabled: isRBF || (rec_addr_input.isValid && rec_addr_input.input_text.length + && parseFloat(amount_input.input_text) !== 0 && amount_input.input_text.length) icon.source: "qrc:/images/plus.svg" icon.color: include_output_but.enabled ? "#45A6FF" : BSStyle.buttonsDisabledTextColor @@ -432,6 +441,11 @@ ColumnLayout { } function click_enter() { + if (isRBF) { + txOutputsModel.setOutputsFrom(tx) + return + } + if (!include_output_but.enabled) return txOutputsModel.addOutput(rec_addr_input.input_text, amount_input.input_text) @@ -503,18 +517,27 @@ ColumnLayout { function click_enter() { - if (table_sel_inputs.rowCount) - { - layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex + if (isRBF) { + layout.sig_continue( bsApp.createTXSignRequest(-1 , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text - , checkbox_rbf.checked, txInputsModel.getSelection()) ) + , checkbox_rbf.checked, tx.ownInputs.zcInputs()) ) } - else - { - layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() - , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text) ) + else if (isCPFP) { + + } + else { // normal operation + if (table_sel_inputs.rowCount) { + layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() + , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text + , checkbox_rbf.checked, txInputsModel.getSelection()) ) + } + else { + layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() + , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text) ) + } } } @@ -535,8 +558,16 @@ ColumnLayout { comment_input.input_text = "" rec_addr_input.input_text = "" checkbox_rbf.checked = true - - bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) txOutputsModel.clearOutputs() + + if (!isRBF && !isCPFP) { + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) + } + else { + bsApp.requestFeeSuggestions() + if (isRBF) { + txOutputsModel.setOutputsFrom(tx) + } + } } } diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 1d9320c0e..9d3532f8d 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -92,10 +92,11 @@ CustomPopup { simple_details.init() } - function open(txId: string, isRBF: bool, isCPFP: bool) { + function open(txId: string, isRBF: bool, isCPFP: bool) + { _stack_view.replace(advanced_details) advanced_details.init() - advanced_details.txId = txId + advanced_details.tx = bsApp.getTXDetails(txId) advanced_details.isRBF = isRBF advanced_details.isCPFP = isCPFP } diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 7ea4cd64b..184a3686c 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -195,6 +195,8 @@ Item { Action { text: qsTr("RBF") + enabled: transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.RBFRole) + //&& (transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) onTriggered: { var txId = transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) openSend(txId, true, false) @@ -203,6 +205,7 @@ Item { Action { text: qsTr("CPFP") + enabled: true//(transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) onTriggered: { var txId = transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) openSend(txId, false, true) diff --git a/GUI/QtWidgets/QtGuiAdapter.cpp b/GUI/QtWidgets/QtGuiAdapter.cpp index 179e3c1c7..6502b4ce9 100644 --- a/GUI/QtWidgets/QtGuiAdapter.cpp +++ b/GUI/QtWidgets/QtGuiAdapter.cpp @@ -681,7 +681,7 @@ void QtGuiAdapter::updateSplashProgress() c += std::to_string(cc) + " "; } logger_->debug("[{}] {}/{}", __func__, l, c);*/ - int percent = 100 * loadingComponents_.size() / createdComponents_.size(); + int percent = (int)(100 * loadingComponents_.size() / createdComponents_.size()); QMetaObject::invokeMethod(splashScreen_, [this, percent] { splashScreen_->SetProgress(percent); }); @@ -1350,7 +1350,7 @@ ProcessingResult QtGuiAdapter::processTXDetails(uint64_t msgId, const WalletsMes txDet.inputAddresses.push_back({ bs::Address::fromAddressString(inAddr.address()) , inAddr.value(), inAddr.value_string(), inAddr.wallet_name() , static_cast(inAddr.script_type()) - , BinaryData::fromString(inAddr.out_hash()), inAddr.out_index() }); + , BinaryData::fromString(inAddr.out_hash()), (uint32_t)inAddr.out_index() }); } catch (const std::exception &e) { logger_->warn("[QtGuiAdapter::processTXDetails] input deser error: {}", e.what()); } @@ -1360,12 +1360,12 @@ ProcessingResult QtGuiAdapter::processTXDetails(uint64_t msgId, const WalletsMes txDet.outputAddresses.push_back({ bs::Address::fromAddressString(outAddr.address()) , outAddr.value(), outAddr.value_string(), outAddr.wallet_name() , static_cast(outAddr.script_type()) - , BinaryData::fromString(outAddr.out_hash()), outAddr.out_index() }); - } catch (const std::exception &e) { // OP_RETURN data for valueStr + , BinaryData::fromString(outAddr.out_hash()), (uint32_t)outAddr.out_index() }); + } catch (const std::exception &) { // OP_RETURN data for valueStr txDet.outputAddresses.push_back({ bs::Address{} , outAddr.value(), outAddr.address(), outAddr.wallet_name() , static_cast(outAddr.script_type()), ownTxHash - , outAddr.out_index() }); + , (uint32_t)outAddr.out_index() }); } } try { @@ -1374,7 +1374,7 @@ ProcessingResult QtGuiAdapter::processTXDetails(uint64_t msgId, const WalletsMes , resp.change_address().wallet_name() , static_cast(resp.change_address().script_type()) , BinaryData::fromString(resp.change_address().out_hash()) - , resp.change_address().out_index() }; + , (uint32_t)resp.change_address().out_index() }; } catch (const std::exception &) {} txDetails.emplace_back(std::move(txDet)); diff --git a/common b/common index 626b01160..61887ef8b 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 626b01160a88efa6f71c4f4d8770813f9fdc98f9 +Subproject commit 61887ef8bd2876f448ac93707ddee1bbc0e5dab6 From 15ae3a3476d7e51829711d8f882263003add8a58 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 28 Feb 2023 20:07:22 +0300 Subject: [PATCH 179/436] CPFP creation in QML --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 11d2bdf0d..9b6b3a57b 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -518,13 +518,16 @@ ColumnLayout { function click_enter() { if (isRBF) { - layout.sig_continue( bsApp.createTXSignRequest(-1 + layout.sig_continue( bsApp.createTXSignRequest(-1 //special index for RBF mode , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text , checkbox_rbf.checked, tx.ownInputs.zcInputs()) ) } else if (isCPFP) { - + layout.sig_continue( bsApp.createTXSignRequest(-2 //special index for CPFP mode + , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() + , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text + , checkbox_rbf.checked, tx.ownOutputs.zcInputs()) ) } else { // normal operation if (table_sel_inputs.rowCount) { From c199ee1a561b81c78dfbda27e7c8062efff54c35 Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 1 Mar 2023 00:24:34 +0100 Subject: [PATCH 180/436] Notification; transaction details for NST --- BlockSettleApp/main.cpp | 2 +- GUI/QtQuick/AddressFilterModel.cpp | 107 ++++++++++++++++++ GUI/QtQuick/AddressFilterModel.h | 47 ++++++++ GUI/QtQuick/AddressListModel.cpp | 2 +- GUI/QtQuick/AddressListModel.h | 2 + GUI/QtQuick/QtQuickAdapter.cpp | 28 ++++- GUI/QtQuick/QtQuickAdapter.h | 4 + GUI/QtQuick/TxListModel.cpp | 18 ++- GUI/QtQuick/TxListModel.h | 2 + GUI/QtQuick/Utils.cpp | 12 ++ GUI/QtQuick/Utils.h | 3 + GUI/QtQuick/qml/BsStyles/BSStyle.qml | 2 + GUI/QtQuick/qml/Overview/OverviewPanel.qml | 48 ++++++-- .../qml/StyledControls/CustomSmallButton.qml | 3 + GUI/QtQuick/qml/TransactionDetails.qml | 16 +-- GUI/QtQuick/qml/TransactionsPage.qml | 18 +-- GUI/QtQuick/qml/main.qml | 24 ++++ 17 files changed, 297 insertions(+), 41 deletions(-) create mode 100644 GUI/QtQuick/AddressFilterModel.cpp create mode 100644 GUI/QtQuick/AddressFilterModel.h diff --git a/BlockSettleApp/main.cpp b/BlockSettleApp/main.cpp index 2f0f6abfc..83b202d1b 100644 --- a/BlockSettleApp/main.cpp +++ b/BlockSettleApp/main.cpp @@ -74,7 +74,7 @@ Q_IMPORT_PLUGIN(QtQuickLayoutsPlugin) Q_IMPORT_PLUGIN(QtQmlModelsPlugin) Q_IMPORT_PLUGIN(QmlFolderListModelPlugin) Q_IMPORT_PLUGIN(QmlSettingsPlugin) -//Q_IMPORT_PLUGIN(QtLabsPlatformPlugin) +Q_IMPORT_PLUGIN(QtLabsPlatformPlugin) #endif // STATIC_BUILD Q_DECLARE_METATYPE(ArmorySettings) diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp new file mode 100644 index 000000000..bb827485f --- /dev/null +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -0,0 +1,107 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "AddressFilterModel.h" +#include "AddressListModel.h" +#include + +AddressFilterModel::AddressFilterModel(QObject* parent) + : QSortFilterProxyModel(parent) +{ + connect(this, &AddressFilterModel::changed, this, &AddressFilterModel::invalidate); +} + +bool AddressFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const +{ + if (hideUsed_) { + const auto txCountIndex = sourceModel()->index(source_row, 1); + if (sourceModel()->data(txCountIndex, QmlAddressListModel::TableRoles::TableDataRole) != 0) + { + return false; + } + } + + if (hideEmpty_) { + const auto txCountIndex = sourceModel()->index(source_row, 1); + if (sourceModel()->data(txCountIndex, QmlAddressListModel::TableRoles::TableDataRole) == 0) + { + return false; + } + } + + const auto assetTypeIndex = sourceModel()->index(source_row, 0); + const auto assetType = sourceModel()->data(assetTypeIndex, QmlAddressListModel::TableRoles::AddressTypeRole).toString(); + if (hideInternal_) { + if (assetType.length() > 0 && assetType.at(0).toLatin1() == '1') + { + return false; + } + } + if (hideExternal_) { + if (assetType.length() > 0 && assetType.at(0).toLatin1() == '0') + { + return false; + } + } + + return true; +} + +bool AddressFilterModel::hideUsed() const +{ + return hideUsed_; +} + +bool AddressFilterModel::hideInternal() const +{ + return hideInternal_; +} + +bool AddressFilterModel::hideExternal() const +{ + return hideExternal_; +} + +bool AddressFilterModel::hideEmpty() const +{ + return hideEmpty_; +} + +void AddressFilterModel::setHideUsed(bool hideUsed) noexcept +{ + if (hideUsed != hideUsed_) { + hideUsed_ = hideUsed; + emit changed(); + } +} + +void AddressFilterModel::setHideInternal(bool hideInternal) noexcept +{ + if (hideInternal_ != hideInternal) { + hideInternal_ = hideInternal; + emit changed(); + } +} + +void AddressFilterModel::setHideExternal(bool hideExternal) noexcept +{ + if (hideExternal_ != hideExternal) { + hideExternal_ = hideExternal; + emit changed(); + } +} + +void AddressFilterModel::setHideEmpty(bool hideEmpty) noexcept +{ + if (hideEmpty_ != hideEmpty) { + hideEmpty_ = hideEmpty; + emit changed(); + } +} diff --git a/GUI/QtQuick/AddressFilterModel.h b/GUI/QtQuick/AddressFilterModel.h new file mode 100644 index 000000000..3803c27e9 --- /dev/null +++ b/GUI/QtQuick/AddressFilterModel.h @@ -0,0 +1,47 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#pragma once + +#include + +class AddressFilterModel: public QSortFilterProxyModel +{ + Q_OBJECT + Q_PROPERTY(bool hideUsed READ hideUsed WRITE setHideUsed NOTIFY changed) + Q_PROPERTY(bool hideInternal READ hideInternal WRITE setHideInternal NOTIFY changed) + Q_PROPERTY(bool hideExternal READ hideExternal WRITE setHideExternal NOTIFY changed) + Q_PROPERTY(bool hideEmpty READ hideEmpty WRITE setHideEmpty NOTIFY changed) + +public: + AddressFilterModel(QObject* parent = nullptr); + + bool hideUsed() const; + bool hideInternal() const; + bool hideExternal() const; + bool hideEmpty() const; + void setHideUsed(bool hideUsed) noexcept; + void setHideInternal(bool hideInternal) noexcept; + void setHideExternal(bool hideExternal) noexcept; + void setHideEmpty(bool hideEmpty) noexcept; + +signals: + void changed(); + +protected: + bool filterAcceptsRow(int source_row, + const QModelIndex& source_parent) const override; + +private: + bool hideUsed_ { false }; + bool hideInternal_ { false }; + bool hideExternal_ { false }; + bool hideEmpty_ { false }; +}; diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index 1776274f7..c829f8632 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -168,5 +168,5 @@ QString QmlAddressListModel::getAddressBalance(const BinaryData& address) const if (pendingBalances_.count(address) > 0) { return gui_utils::satoshiToQString(pendingBalances_.at(address).balance); } - return QString(); + return gui_utils::satoshiToQString(0);; } diff --git a/GUI/QtQuick/AddressListModel.h b/GUI/QtQuick/AddressListModel.h index 35e96a699..c65b65340 100644 --- a/GUI/QtQuick/AddressListModel.h +++ b/GUI/QtQuick/AddressListModel.h @@ -34,6 +34,8 @@ class QmlAddressListModel: public QAbstractTableModel AddressTypeRole, AssetTypeRole }; + Q_ENUM(TableRoles) + QmlAddressListModel(const std::shared_ptr&, QObject* parent = nullptr); int rowCount(const QModelIndex & = QModelIndex()) const override; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 7c41d2c05..2333d4868 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -44,6 +44,8 @@ #include "TransactionForAddressFilterModel.h" #include "viewmodels/WalletPropertiesVM.h" #include "PendingTransactionFilterModel.h" +#include "Utils.h" +#include "AddressFilterModel.h" #include "hardware_wallet.pb.h" #include "terminal.pb.h" @@ -243,9 +245,11 @@ void QtQuickAdapter::run(int &argc, char **argv) qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); qmlRegisterUncreatableMetaObject(Transactions::staticMetaObject, "terminal.models" , 1, 0, "Transactions", tr("Error: only enums")); - //qmlRegisterType("terminal.models", 1, 0, "TxListModel"); qmlRegisterUncreatableMetaObject(TxListModel::staticMetaObject, "terminal.models" , 1, 0, "TxListModel", tr("Error: only enums")); + qmlRegisterUncreatableMetaObject(QmlAddressListModel::staticMetaObject, "terminal.models" + , 1, 0, "QmlAddressListModel", tr("Error: only enums")); + qmlRegisterType("terminal.models", 1, 0, "AddressFilterModel"); //need to read files in qml qputenv("QML_XHR_ALLOW_FILE_READ", QByteArray("1")); @@ -428,6 +432,7 @@ ProcessingResult QtQuickAdapter::processArmoryServers(const SettingsMessage_Armo , SecureBinaryData::fromString(server.password()) , server.run_locally(), server.one_way_auth() }; } + logger_->debug("[{}] {} servers, cur: {}, conn: {}", __func__, servers.size() , response.idx_current(), response.idx_connected()); //TODO @@ -1560,6 +1565,8 @@ ProcessingResult QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMess catch (const std::exception&) {} } txModel_->prependRow(txEntry); + + notifyNewTransaction(txEntry); } pushRequest(user_, userWallets_, msg.SerializeAsString()); return ProcessingResult::Success; @@ -1908,3 +1915,22 @@ int QtQuickAdapter::deleteWallet(const QString& walletId, const QString& passwor { return 0; } + +void QtQuickAdapter::notifyNewTransaction(bs::TXEntry tx) +{ + const auto txId = QString::fromStdString(tx.txHash.toHexStr(true)); + auto txDetails = getTXDetails(txId); + connect(txDetails, &QTxDetails::updated, this, [txDetails, tx, this](){ + showNotification( + tr("BlockSettle Terminal"), + tr("%1: %2\n%3: %4\n%5: %6\n%7: %8\n").arg( + tr("Date"), QDateTime::fromSecsSinceEpoch(tx.txTime).toString(gui_utils::dateTimeFormat) + , tr("Amount"), gui_utils::satoshiToQString(std::abs(tx.value)) + , tr("Type"), gui_utils::directionToQString(txDetails->direction()) + , tr("Address"), !tx.addresses.empty() ? QString::fromStdString((*tx.addresses.cbegin()).display()) : tr("") + ) + ); + txDetails->disconnect(this); + }, Qt::QueuedConnection); + +} diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index d9de60576..6184d4e55 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -183,6 +183,10 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void invokePINentry(); void invokePasswordEntry(const QString& devName, bool acceptOnDevice); void showError(const QString&); + void showNotification(QString, QString); + +private slots: + void notifyNewTransaction(bs::TXEntry tx); private: bs::message::ProcessingResult processSettings(const bs::message::Envelope &); diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 540dbafa0..1fd0169f1 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -32,8 +32,6 @@ namespace { {TxInOutModel::ColorRole, "dataColor"}, {TxInOutModel::TxHashRole, "txHash"}, }; - - static const QString dateTimeFormat = QString::fromStdString("yyyy-MM-dd hh:mm:ss"); } TxListModel::TxListModel(const std::shared_ptr& logger, QObject* parent) @@ -59,7 +57,7 @@ QVariant TxListModel::getData(int row, int col) const } const auto& entry = data_.at(row); switch (col) { - case 0: return QDateTime::fromSecsSinceEpoch(entry.txTime).toString(dateTimeFormat); + case 0: return QDateTime::fromSecsSinceEpoch(entry.txTime).toString(gui_utils::dateTimeFormat); case 1: return walletName(row); case 2: return txType(row); case 3: { @@ -134,13 +132,7 @@ QString TxListModel::txType(int row) const { const auto& itTxDet = txDetails_.find(row); if (itTxDet != txDetails_.end()) { - switch (itTxDet->second.direction) { - case bs::sync::Transaction::Direction::Received: return tr("Received"); - case bs::sync::Transaction::Direction::Sent: return tr("Sent"); - case bs::sync::Transaction::Direction::Internal: return tr("Internal"); - case bs::sync::Transaction::Direction::Unknown: return tr("Unknown"); - default: return QString::number((int)itTxDet->second.direction); - } + return gui_utils::directionToQString(itTxDet->second.direction); } return {}; } @@ -429,7 +421,7 @@ QString TxListForAddr::getData(int row, int col) const const auto& entry = data_.at(row); const auto totFees = totalFees(row); switch (col) { - case 0: return QDateTime::fromSecsSinceEpoch(entry.txTime).toString(dateTimeFormat); + case 0: return QDateTime::fromSecsSinceEpoch(entry.txTime).toString(gui_utils::dateTimeFormat); case 1: return txId(row); case 2: return QString::number(entry.nbConf); case 3: return displayNb(nbInputs(row)); @@ -779,6 +771,10 @@ quint32 QTxDetails::height() const return details_.tx.getTxHeight(); } +bs::sync::Transaction::Direction QTxDetails::direction() const +{ + return details_.direction; +} TxInOutModel::TxInOutModel(const std::vector& data, const QString& type, QObject* parent) : QAbstractTableModel(parent) diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index ec475c056..bdce6a4d2 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -206,6 +206,8 @@ class QTxDetails : public QObject TxInputsModel* ownOutputs() const { return ownOutputs_; } std::vector> outputData() const; + bs::sync::Transaction::Direction direction() const; + signals: void updated(); void newBlock(); diff --git a/GUI/QtQuick/Utils.cpp b/GUI/QtQuick/Utils.cpp index 946fbe019..bf2b7bda0 100644 --- a/GUI/QtQuick/Utils.cpp +++ b/GUI/QtQuick/Utils.cpp @@ -1,5 +1,6 @@ #include "Utils.h" #include "BTCNumericTypes.h" +#include using namespace gui_utils; @@ -12,3 +13,14 @@ QString gui_utils::xbtToQString(double balance) { return QString::number(balance, 'f', 8); } + +QString gui_utils::directionToQString(bs::sync::Transaction::Direction direction) +{ + switch (direction) { + case bs::sync::Transaction::Direction::Received: return QObject::tr("Received"); + case bs::sync::Transaction::Direction::Sent: return QObject::tr("Sent"); + case bs::sync::Transaction::Direction::Internal: return QObject::tr("Internal"); + case bs::sync::Transaction::Direction::Unknown: return QObject::tr("Unknown"); + default: return QString::number(static_cast(direction)); + } +} diff --git a/GUI/QtQuick/Utils.h b/GUI/QtQuick/Utils.h index 762619665..ce947c544 100644 --- a/GUI/QtQuick/Utils.h +++ b/GUI/QtQuick/Utils.h @@ -1,10 +1,13 @@ #pragma once #include +#include "Wallets/SignerDefs.h" namespace gui_utils { QString satoshiToQString(int64_t balance); QString xbtToQString(double balance); +QString directionToQString(bs::sync::Transaction::Direction direction); +static const QString dateTimeFormat = QString::fromStdString("yyyy-MM-dd hh:mm:ss"); } diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index 963c38685..c6c04443d 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -142,4 +142,6 @@ QtObject { readonly property color exportWalletLabelBackground: "#32394F" readonly property color exportWalletLabelNameColor: "#45A6FF" + + readonly property color smallButtonBackgroundColor: "#020817" } diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index c4de70292..a1d74be49 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -14,6 +14,7 @@ import QtQuick.Controls 2.15 import "../BsStyles" import "../StyledControls" import "." as OverviewControls +import ".." import terminal.models 1.0 Rectangle { @@ -28,6 +29,11 @@ Rectangle { signal walletIndexChanged(index : int) signal openAddressDetails(var address, var transactions, var balance, var comment, var asset_type, var type, var wallet) + AddressFilterModel { + id: addressFilterModel + sourceModel: addressListModel + } + Column { anchors.leftMargin: 18 anchors.rightMargin: 18 @@ -80,21 +86,29 @@ Rectangle { CustomSmallButton { width: 85 text: qsTr("Hide used") + onClicked: addressFilterModel.hideUsed = !addressFilterModel.hideUsed + backgroundColor: addressFilterModel.hideUsed ? BSStyle.smallButtonBackgroundColor : 'transparent' } CustomSmallButton { width: 90 text: qsTr("Hide internal") + onClicked: addressFilterModel.hideInternal = !addressFilterModel.hideInternal + backgroundColor: addressFilterModel.hideInternal ? BSStyle.smallButtonBackgroundColor : 'transparent' } CustomSmallButton { width: 90 text: qsTr("Hide external") + onClicked: addressFilterModel.hideExternal = !addressFilterModel.hideExternal + backgroundColor: addressFilterModel.hideExternal ? BSStyle.smallButtonBackgroundColor : 'transparent' } CustomSmallButton { width: 85 text: qsTr("Hide empty") + onClicked: addressFilterModel.hideEmpty = !addressFilterModel.hideEmpty + backgroundColor: addressFilterModel.hideEmpty ? BSStyle.smallButtonBackgroundColor : 'transparent' } } } @@ -104,18 +118,18 @@ Rectangle { width: parent.width height: parent.height - tableMenu.height - model: addressListModel + model: addressFilterModel copy_button_column_index: 0 columnWidths: [0.35, 0.15, 0.1, 0.4] onCopyRequested: bsApp.copyAddressToClipboard(id) onCellClicked: (row, column, data) => { - const address = (column === 0) ? data : model.data(model.index(row, 0), 257) - const transactions = model.data(model.index(row, 1), 257) - const balance = model.data(model.index(row, 2), 257) - const comment = model.data(model.index(row, 3), 257) - const type = model.data(model.index(row, 0), 259) - const asset_type = model.data(model.index(row, 0), 260) + const address = (column === 0) ? data : model.data(model.index(row, 0), QmlAddressListModel.TableDataRole) + const transactions = model.data(model.index(row, 1), QmlAddressListModel.TableDataRole) + const balance = model.data(model.index(row, 2), QmlAddressListModel.TableDataRole) + const comment = model.data(model.index(row, 3), QmlAddressListModel.TableDataRole) + const type = model.data(model.index(row, 0), QmlAddressListModel.AddressTypeRole) + const asset_type = model.data(model.index(row, 0), QmlAddressListModel.AssetTypeRole) openAddressDetails(address, transactions, balance, comment, asset_type, type, overview_panel.currentWallet) } @@ -154,6 +168,26 @@ Rectangle { copy_button_column_index: 3 columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) + onCellClicked: (row, column, data) => { + const txHash = model.data(model.index(row, 0), TxListModel.TxIdRole) + transactionDetails.walletName = model.data(model.index(row, 1), TxListModel.TableDataRole) + transactionDetails.address = model.data(model.index(row, 3), TxListModel.TableDataRole) + transactionDetails.txDateTime = model.data(model.index(row, 0), TxListModel.TableDataRole) + transactionDetails.txType = model.data(model.index(row, 2), TxListModel.TableDataRole) + transactionDetails.txTypeColor = model.data(model.index(row, 2), TxListModel.ColorRole) + transactionDetails.txComment = model.data(model.index(row, 7), TxListModel.TableDataRole) + transactionDetails.txAmount = model.data(model.index(row, 4), TxListModel.TableDataRole) + transactionDetails.txConfirmations = model.data(model.index(row, 5), TxListModel.TableDataRole) + transactionDetails.txConfirmationsColor = model.data(model.index(row, 5), TxListModel.ColorRole) + transactionDetails.tx = bsApp.getTXDetails(txHash) + transactionDetails.open() + } + + + TransactionDetails { + id: transactionDetails + visible: false + } } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml index 76f0f2314..c08cb873d 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml @@ -24,7 +24,10 @@ Button { font.family: "Roboto" font.weight: Font.Normal + property alias backgroundColor: backgroundItem.color + background: Rectangle { + id: backgroundItem color: "#020817" radius: 14 diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index 10d9dcdf9..b1a8f0854 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -28,6 +28,8 @@ Popup { property string txType: '' property color txTypeColor property string txComment: '' + property string txConfirmations: '' + property color txConfirmationsColor width: 916 height: 718 @@ -193,18 +195,8 @@ Popup { width: 170 } Label { - function define_confirmation_color(value) { - if (value == 0) { - return BSStyle.transactionConfirmationZero - } - else if (value < 6) { - return BSStyle.transactionConfirmationLow - } - return BSStyle.transactionConfirmationHigh - } - - text: tx.nbConf - color: define_confirmation_color(tx.nbConf) + text: txConfirmations + color: txConfirmationsColor font.family: "Roboto" font.pixelSize: 14 } diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 184a3686c..c7a6a96e2 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -169,14 +169,16 @@ Item { onCopyRequested: bsApp.copyAddressToClipboard(id) onCellClicked: (row, column, data) => { - const txHash = model.data(model.index(row, 0), 259) - transactionDetails.walletName = model.data(model.index(row, 1), 257) - transactionDetails.address = model.data(model.index(row, 3), 257) - transactionDetails.txDateTime = model.data(model.index(row, 0), 257) - transactionDetails.txType = model.data(model.index(row, 2), 257) - transactionDetails.txTypeColor = model.data(model.index(row, 2), 258) - transactionDetails.txComment = model.data(model.index(row, 7), 257) - transactionDetails.txAmount = model.data(model.index(row, 4), 257) + const txHash = model.data(model.index(row, 0), TxListModel.TxIdRole) + transactionDetails.walletName = model.data(model.index(row, 1), TxListModel.TableDataRole) + transactionDetails.address = model.data(model.index(row, 3), TxListModel.TableDataRole) + transactionDetails.txDateTime = model.data(model.index(row, 0), TxListModel.TableDataRole) + transactionDetails.txType = model.data(model.index(row, 2), TxListModel.TableDataRole) + transactionDetails.txTypeColor = model.data(model.index(row, 2), TxListModel.ColorRole) + transactionDetails.txComment = model.data(model.index(row, 7), TxListModel.TableDataRole) + transactionDetails.txAmount = model.data(model.index(row, 4), TxListModel.TableDataRole) + transactionDetails.txConfirmations = model.data(model.index(row, 5), TxListModel.TableDataRole) + transactionDetails.txConfirmationsColor = model.data(model.index(row, 5), TxListModel.ColorRole) transactionDetails.tx = bsApp.getTXDetails(txHash) transactionDetails.open() } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 1f18a7789..a0a519bd9 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -12,6 +12,7 @@ import QtQuick 2 import QtQuick.Controls 2.9 import QtQuick.Layouts 1.3 import QtQuick.Window 2 +import Qt.labs.platform 1.1 import "StyledControls" 1 import "BsStyles" 1 @@ -447,4 +448,27 @@ ApplicationWindow { id.raise() id.requestActivate() } + + SystemTrayIcon { + id: trayIcon + visible: true + icon.source: "qrc:/images/bs_logo.png" + + onActivated: { + mainWindow.show() + mainWindow.raise() + mainWindow.requestActivate() + } + + Component.onCompleted: { + trayIcon.show() + } + } + + Connections { + target: bsApp + function onShowNotification(title, text) { + trayIcon.showMessage(title, text, SystemTrayIcon.Information, 5000) + } + } } From 78e0404d7cef314f6952b949178b26131c92fe06 Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 1 Mar 2023 21:52:14 +0100 Subject: [PATCH 181/436] const ref for param --- GUI/QtQuick/QtQuickAdapter.cpp | 2 +- GUI/QtQuick/QtQuickAdapter.h | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 2333d4868..4b341ca3e 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1916,7 +1916,7 @@ int QtQuickAdapter::deleteWallet(const QString& walletId, const QString& passwor return 0; } -void QtQuickAdapter::notifyNewTransaction(bs::TXEntry tx) +void QtQuickAdapter::notifyNewTransaction(const bs::TXEntry& tx) { const auto txId = QString::fromStdString(tx.txHash.toHexStr(true)); auto txDetails = getTXDetails(txId); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 6184d4e55..0d0b05627 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -171,6 +171,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE int deleteWallet(const QString& walletId, const QString& password); Q_INVOKABLE int exportWallet(const QString& walletId); Q_INVOKABLE void walletSelected(int); + void notifyNewTransaction(const bs::TXEntry& tx); signals: void walletsListChanged(); @@ -185,9 +186,6 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void showError(const QString&); void showNotification(QString, QString); -private slots: - void notifyNewTransaction(bs::TXEntry tx); - private: bs::message::ProcessingResult processSettings(const bs::message::Envelope &); bs::message::ProcessingResult processSettingsGetResponse(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); From f17560643b4de6c715ab2b58b2103d7ee55e4bf7 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 2 Mar 2023 02:49:08 +0200 Subject: [PATCH 182/436] rbf: try fix --- GUI/QtQuick/TxOutputsModel.cpp | 4 ++ GUI/QtQuick/TxOutputsModel.h | 3 ++ GUI/QtQuick/qml/Overview/OverviewPanel.qml | 14 ++++++ GUI/QtQuick/qml/OverviewPage.qml | 3 ++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 1 + .../qml/StyledControls/CustomRbfCpfpMenu.qml | 48 +++++++++++++++++++ GUI/QtQuick/qml/TransactionsPage.qml | 25 +--------- GUI/QtQuick/qml/main.qml | 6 ++- GUI/QtQuick/qtquick.qrc | 1 + 9 files changed, 81 insertions(+), 24 deletions(-) create mode 100644 GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index d10545e07..30d79063e 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -89,6 +89,7 @@ void TxOutputsModel::clearOutputs() beginResetModel(); data_.clear(); endResetModel(); + emit rowCountChanged(); } QStringList TxOutputsModel::getOutputAddresses() const @@ -117,6 +118,7 @@ void TxOutputsModel::setOutputsFrom(QTxDetails* tx) data_.push_back({out.first, out.second}); } endResetModel(); + emit rowCountChanged(); logger_->debug("[{}] {} entries", __func__, data_.size()); } @@ -134,6 +136,7 @@ void TxOutputsModel::addOutput(const QString& address, double amount) beginInsertRows(QModelIndex(), rowCount(), rowCount()); data_.emplace_back(std::move(entry)); endInsertRows(); + emit rowCountChanged(); }); } @@ -145,6 +148,7 @@ void TxOutputsModel::delOutput(int row) beginRemoveRows(QModelIndex(), row, row); data_.erase(data_.cbegin() + row - 1); endRemoveRows(); + emit rowCountChanged(); } QVariant TxOutputsModel::getData(int row, int col) const diff --git a/GUI/QtQuick/TxOutputsModel.h b/GUI/QtQuick/TxOutputsModel.h index 4364c8edf..96dc16cab 100644 --- a/GUI/QtQuick/TxOutputsModel.h +++ b/GUI/QtQuick/TxOutputsModel.h @@ -29,6 +29,8 @@ class QTxDetails; class TxOutputsModel : public QAbstractTableModel { Q_OBJECT + + Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) public: enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, WidthRole , ColorRole }; @@ -52,6 +54,7 @@ class TxOutputsModel : public QAbstractTableModel signals: void selectionChanged() const; + void rowCountChanged(); private: QVariant getData(int row, int col) const; diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index c4de70292..cead82cf0 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -19,6 +19,8 @@ import terminal.models 1.0 Rectangle { id: control + signal openSend (string txId, bool isRBF, bool isCPFP) + width: 1200 height: 788 color: "transparent" @@ -154,6 +156,18 @@ Rectangle { copy_button_column_index: 3 columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) + + onCellRightClicked: (row, column, data) => { + context_menu.row = row + context_menu.column = column + context_menu.popup() + } + + CustomRbfCpfpMenu { + id: context_menu + + onOpenSend: (txId, isRBF, isCPFP) => openSend(txId, isRBF, isCPFP) + } } } } diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 098b615a8..00ba96b95 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -28,6 +28,7 @@ Item { signal newWalletClicked(); signal curWalletIndexChanged(index : int) + signal openSend (string txId, bool isRBF, bool isCPFP) CreateNewWallet { id: createNewWalletPage @@ -71,5 +72,7 @@ Item { bsApp.startAddressSearch(address) addressDetails.open() } + + onOpenSend: (txId, isRBF, isCPFP) => openSend(txId, isRBF, isCPFP) } } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 0c1a8facd..17a469355 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -228,6 +228,7 @@ ColumnLayout { function init() { + bsApp.requestFeeSuggestions() rec_addr_input.setActiveFocus() //we need set first time currentIndex to 0 diff --git a/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml b/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml new file mode 100644 index 000000000..b7e1bfbe2 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml @@ -0,0 +1,48 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ + +import QtQuick 2.9 +import QtQuick.Controls 2.3 + +import "../BsStyles" + +import terminal.models 1.0 + +CustomContextMenu { + id: context_menu + + signal openSend (string txId, bool isRBF, bool isCPFP) + + property int row + property int column + + Action { + text: qsTr("RBF") + enabled: transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.RBFRole) + //&& (transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) + onTriggered: { + console.log ("before txId") + var txId = transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) + console.log ("after - txId = " + txId) + openSend(txId, true, false) + } + } + + Action { + text: qsTr("CPFP") + enabled: true//(transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) + onTriggered: { + var txId = transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) + openSend(txId, false, true) + } + } + +} diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 184a3686c..8c1d15193 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -187,31 +187,10 @@ Item { context_menu.popup() } - CustomContextMenu { + CustomRbfCpfpMenu { id: context_menu - property int row - property int column - - Action { - text: qsTr("RBF") - enabled: transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.RBFRole) - //&& (transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) - onTriggered: { - var txId = transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) - openSend(txId, true, false) - } - } - - Action { - text: qsTr("CPFP") - enabled: true//(transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) - onTriggered: { - var txId = transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) - openSend(txId, false, true) - } - } - + onOpenSend: (txId, isRBF, isCPFP) => openSend(txId, isRBF, isCPFP) } } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 1f18a7789..fe52dddcb 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -206,7 +206,6 @@ ApplicationWindow { onClicked: { if (walletBalances.rowCount > 0) { - bsApp.requestFeeSuggestions() topMenuBtnClicked(btnSend) show_popup(send_popup) } @@ -270,6 +269,11 @@ ApplicationWindow { onCurWalletIndexChanged: (ind) => { overviewWalletIndex = ind } + + onOpenSend: (txId, isRBF, isCPFP) => { + send_popup.open(txId, isRBF, isCPFP) + show_popup(send_popup) + } } TransactionsPage { diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 141f6f5e4..18495700a 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -182,5 +182,6 @@ qml/WalletProperties/WalletSeedAuth.qml images/wallet_icon_warn.svg qml/StyledControls/CustomHorizontalHeaderView.qml + qml/StyledControls/CustomRbfCpfpMenu.qml From 701aefe13691dd561fe19882dc0254a4dcdf8e8a Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 2 Mar 2023 08:23:22 +0200 Subject: [PATCH 183/436] qmL: rbf: bug fix --- GUI/QtQuick/TxOutputsModel.cpp | 5 +-- GUI/QtQuick/TxOutputsModel.h | 4 +-- .../qml/CreateWallet/ImportHardware.qml | 1 + GUI/QtQuick/qml/Overview/OverviewPanel.qml | 2 +- GUI/QtQuick/qml/OverviewPage.qml | 2 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 35 ++++++++++++++----- GUI/QtQuick/qml/Send/SendPopup.qml | 14 ++++++-- GUI/QtQuick/qml/Send/SimpleDetails.qml | 4 ++- .../qml/StyledControls/CustomRbfCpfpMenu.qml | 6 ++-- GUI/QtQuick/qml/TransactionsPage.qml | 2 +- GUI/QtQuick/qml/main.qml | 8 ++--- 11 files changed, 54 insertions(+), 29 deletions(-) diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index 30d79063e..5e61c46fa 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -31,6 +31,7 @@ TxOutputsModel::TxOutputsModel(const std::shared_ptr& logger, QO int TxOutputsModel::rowCount(const QModelIndex &) const { + logger_->debug("[{}] data_.size() = {}", __func__, data_.size()); return data_.size() + 1; } @@ -89,7 +90,6 @@ void TxOutputsModel::clearOutputs() beginResetModel(); data_.clear(); endResetModel(); - emit rowCountChanged(); } QStringList TxOutputsModel::getOutputAddresses() const @@ -118,7 +118,6 @@ void TxOutputsModel::setOutputsFrom(QTxDetails* tx) data_.push_back({out.first, out.second}); } endResetModel(); - emit rowCountChanged(); logger_->debug("[{}] {} entries", __func__, data_.size()); } @@ -136,7 +135,6 @@ void TxOutputsModel::addOutput(const QString& address, double amount) beginInsertRows(QModelIndex(), rowCount(), rowCount()); data_.emplace_back(std::move(entry)); endInsertRows(); - emit rowCountChanged(); }); } @@ -148,7 +146,6 @@ void TxOutputsModel::delOutput(int row) beginRemoveRows(QModelIndex(), row, row); data_.erase(data_.cbegin() + row - 1); endRemoveRows(); - emit rowCountChanged(); } QVariant TxOutputsModel::getData(int row, int col) const diff --git a/GUI/QtQuick/TxOutputsModel.h b/GUI/QtQuick/TxOutputsModel.h index 96dc16cab..16546cdaf 100644 --- a/GUI/QtQuick/TxOutputsModel.h +++ b/GUI/QtQuick/TxOutputsModel.h @@ -29,8 +29,8 @@ class QTxDetails; class TxOutputsModel : public QAbstractTableModel { Q_OBJECT + //Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) - Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) public: enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, WidthRole , ColorRole }; @@ -54,7 +54,7 @@ class TxOutputsModel : public QAbstractTableModel signals: void selectionChanged() const; - void rowCountChanged(); + //void rowCountChanged(); private: QVariant getData(int row, int col) const; diff --git a/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml index 5013854cd..9b1d1481f 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml @@ -53,6 +53,7 @@ ColumnLayout { font.family: "Roboto" font.weight: Font.Normal } + TableView { visible: !hwDeviceModel.empty width: 800 diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index cead82cf0..76e4ec476 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -166,7 +166,7 @@ Rectangle { CustomRbfCpfpMenu { id: context_menu - onOpenSend: (txId, isRBF, isCPFP) => openSend(txId, isRBF, isCPFP) + onOpenSend: (txId, isRBF, isCPFP) => control.openSend(txId, isRBF, isCPFP) } } } diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 00ba96b95..8e3b314af 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -73,6 +73,6 @@ Item { addressDetails.open() } - onOpenSend: (txId, isRBF, isCPFP) => openSend(txId, isRBF, isCPFP) + onOpenSend: (txId, isRBF, isCPFP) => overview.openSend(txId, isRBF, isCPFP) } } diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 9b6b3a57b..9a6636fee 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -25,6 +25,17 @@ ColumnLayout { property bool isRBF: false property bool isCPFP: false + Connections + { + target:tx + function onUpdated () + { + if (isRBF) { + txOutputsModel.setOutputsFrom(tx) + } + } + } + RowLayout { Layout.fillWidth: true @@ -51,7 +62,7 @@ ColumnLayout { Layout.rightMargin: 60 Layout.alignment: Qt.AlignRight | Qt.AlingVCenter - activeFocusOnTab: true + activeFocusOnTab: false font.pixelSize: 13 font.family: "Roboto" @@ -118,14 +129,15 @@ ColumnLayout { RowLayout { Layout.fillWidth: true - Layout.preferredHeight : 19 Layout.topMargin: 16 + Layout.preferredHeight: 19 Layout.alignment: Qt.AlingTop Label { id: inputs_title Layout.leftMargin: 16 + Layout.fillHeight: true Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter text: qsTr("Inputs") @@ -139,14 +151,16 @@ ColumnLayout { Label { Layout.fillWidth: true - Layout.fillHeight : true } CustomCheckBox { id: checkbox_rbf - Layout.alignment: Qt.AlignRight | Qt.AlignVCenter + implicitHeight: 18 + + Layout.alignment: Qt.AlignRight | Qt.AlignTop Layout.rightMargin: 16 + Layout.topMargin: 0 text: qsTr("RBF") enabled: !isRBF @@ -164,7 +178,7 @@ ColumnLayout { id: from_wallet_combo Layout.leftMargin: 16 - Layout.topMargin: 16 + Layout.topMargin: 8 Layout.alignment: Qt.AlignLeft | Qt.AlingTop visible: !isRBF && !isCPFP @@ -204,7 +218,6 @@ ColumnLayout { function change_index_handler() { - console.log("fee index changed") if (isRBF) { } else if (isCPFP) { @@ -222,7 +235,7 @@ ColumnLayout { height: 1 Layout.fillWidth: true - Layout.topMargin: 168 + Layout.topMargin: (!isRBF && !isCPFP) ? 196 : 274 Layout.alignment: Qt.AlignLeft | Qt.AlingTop color: BSStyle.defaultGreyColor @@ -428,6 +441,8 @@ ColumnLayout { Layout.topMargin: 16 Layout.alignment: Qt.AlignLeft | Qt.AlingTop + activeFocusOnTab: false + enabled: isRBF || (rec_addr_input.isValid && rec_addr_input.input_text.length && parseFloat(amount_input.input_text) !== 0 && amount_input.input_text.length) @@ -502,7 +517,9 @@ ColumnLayout { CustomButton { id: continue_but - enabled: txOutputsModel.rowCount > 0 + activeFocusOnTab: continue_but.enabled + + enabled: (table_outputs.rowCount > 1) width: 1084 @@ -561,8 +578,8 @@ ColumnLayout { comment_input.input_text = "" rec_addr_input.input_text = "" checkbox_rbf.checked = true - txOutputsModel.clearOutputs() + txOutputsModel.clearOutputs() if (!isRBF && !isCPFP) { bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) } diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 9d3532f8d..27bf403c9 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -89,16 +89,26 @@ CustomPopup { } function init() { - simple_details.init() + if (_stack_view.currentItem === simple_details) + { + simple_details.init() + } + else if (_stack_view.currentItem === advanced_details) + { + advanced_details.init() + } + advanced_details.tx = null + advanced_details.isRBF = false + advanced_details.isCPFP = false } function open(txId: string, isRBF: bool, isCPFP: bool) { _stack_view.replace(advanced_details) - advanced_details.init() advanced_details.tx = bsApp.getTXDetails(txId) advanced_details.isRBF = isRBF advanced_details.isCPFP = isCPFP + advanced_details.init() } function close_click() diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 17a469355..21d6e01b0 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -46,7 +46,7 @@ ColumnLayout { Layout.rightMargin: 60 Layout.alignment: Qt.AlignRight | Qt.AlingVCenter - activeFocusOnTab: true + activeFocusOnTab: false font.pixelSize: 13 font.family: "Roboto" @@ -173,6 +173,8 @@ ColumnLayout { enabled: rec_addr_input.isValid && rec_addr_input.input_text.length && parseFloat(amount_input.input_text) !== 0 && amount_input.input_text.length + activeFocusOnTab: continue_but.enabled + width: 552 Layout.bottomMargin: 40 diff --git a/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml b/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml index b7e1bfbe2..4f0c4c362 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml @@ -29,10 +29,8 @@ CustomContextMenu { enabled: transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.RBFRole) //&& (transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) onTriggered: { - console.log ("before txId") var txId = transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) - console.log ("after - txId = " + txId) - openSend(txId, true, false) + context_menu.openSend(txId, true, false) } } @@ -41,7 +39,7 @@ CustomContextMenu { enabled: true//(transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) onTriggered: { var txId = transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) - openSend(txId, false, true) + context_menu.openSend(txId, false, true) } } diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 8c1d15193..54ff97167 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -190,7 +190,7 @@ Item { CustomRbfCpfpMenu { id: context_menu - onOpenSend: (txId, isRBF, isCPFP) => openSend(txId, isRBF, isCPFP) + onOpenSend: (txId, isRBF, isCPFP) => transactions.openSend(txId, isRBF, isCPFP) } } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index fe52dddcb..40fb4edb4 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -272,7 +272,7 @@ ApplicationWindow { onOpenSend: (txId, isRBF, isCPFP) => { send_popup.open(txId, isRBF, isCPFP) - show_popup(send_popup) + show_popup(send_popup, true) } } @@ -281,7 +281,7 @@ ApplicationWindow { onOpenSend: (txId, isRBF, isCPFP) => { send_popup.open(txId, isRBF, isCPFP) - show_popup(send_popup) + show_popup(send_popup, true) } } @@ -441,9 +441,9 @@ ApplicationWindow { return feeSuggestions.data(feeSuggestions.index(index, 0), role) } - function show_popup (id) + function show_popup (id, noInit = false) { - if (typeof id.init === "function") + if (typeof id.init === "function" && !noInit) { id.init() } From 0f6abefc729d1f730932d5431ea2fe95712dbefb Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 2 Mar 2023 17:57:05 +0300 Subject: [PATCH 184/436] wallet actions --- Core/SignerAdapter.cpp | 98 ++++++++++++++++++- Core/SignerAdapter.h | 11 ++- GUI/QtQuick/FeeSuggModel.cpp | 20 ++-- GUI/QtQuick/QtQuickAdapter.cpp | 89 ++++++++++++----- GUI/QtQuick/QtQuickAdapter.h | 5 +- GUI/QtQuick/WalletBalancesModel.cpp | 31 +++++- GUI/QtQuick/WalletBalancesModel.h | 6 +- .../WalletPropertiesPopup.qml | 2 +- GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 15 +-- GUI/QtQuick/viewmodels/WalletPropertiesVM.h | 2 +- GUI/QtWidgets/QtGuiAdapter.cpp | 3 +- common | 2 +- 12 files changed, 231 insertions(+), 53 deletions(-) diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index cb0e58f55..3d92f6215 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -10,6 +10,7 @@ */ #include "SignerAdapter.h" #include +#include "bip39/bip39.h" #include "Adapters/SignerClient.h" #include "CoreWalletsManager.h" #include "Wallets/InprocSigner.h" @@ -140,6 +141,12 @@ ProcessingResult SignerAdapter::processOwnRequest(const bs::message::Envelope &e return processDeleteWallet(env, request.delete_wallet()); case SignerMessage::kImportHwWallet: return processImportHwWallet(env, request.import_hw_wallet()); + case SignerMessage::kExportWoWallet: + return processExportWoWallet(env, request.export_wo_wallet()); + case SignerMessage::kChangeWalletPass: + return processChangeWalletPass(env, request.change_wallet_pass()); + case SignerMessage::kGetWalletSeed: + return processGetWalletSeed(env, request.get_wallet_seed()); default: logger_->warn("[{}] unknown signer request: {}", __func__, request.data_case()); break; @@ -660,12 +667,12 @@ bs::message::ProcessingResult SignerAdapter::processImportHwWallet(const bs::mes } ProcessingResult SignerAdapter::processDeleteWallet(const bs::message::Envelope& env - , const std::string& rootId) + , const SignerMessage_WalletRequest& request) { SignerMessage msg; - const auto& hdWallet = walletsMgr_->getHDWalletById(rootId); + const auto& hdWallet = walletsMgr_->getHDWalletById(request.wallet_id()); if (hdWallet && walletsMgr_->deleteWalletFile(hdWallet)) { - msg.set_wallet_deleted(rootId); + msg.set_wallet_deleted(request.wallet_id()); } else { msg.set_wallet_deleted(""); @@ -673,3 +680,88 @@ ProcessingResult SignerAdapter::processDeleteWallet(const bs::message::Envelope& pushBroadcast(user_, msg.SerializeAsString()); return ProcessingResult::Success; } + +ProcessingResult SignerAdapter::processExportWoWallet(const bs::message::Envelope& env + , const SignerMessage_WalletRequest& request) +{ + const auto& hdWallet = walletsMgr_->getHDWalletById(request.wallet_id()); + if (!hdWallet) { + logger_->error("[{}] wallet {} not found", __func__, request.wallet_id()); + return ProcessingResult::Error; + } + if (hdWallet->isWatchingOnly()) { + logger_->error("[{}] can't export {} (already watching only)", __func__, request.wallet_id()); + return ProcessingResult::Error; + } + auto woWallet = hdWallet->createWatchingOnly(); + if (!woWallet) { + logger_->error("[{}] WO export {} failed", __func__, request.wallet_id()); + return ProcessingResult::Error; + } + logger_->debug("[{}] exported {} to {}", __func__, request.wallet_id(), woWallet->getFileName()); + return ProcessingResult::Success; +} + +bs::message::ProcessingResult SignerAdapter::processChangeWalletPass(const bs::message::Envelope& env + , const SignerMessage_ChangeWalletPassword& request) +{ + const auto& hdWallet = walletsMgr_->getHDWalletById(request.wallet().wallet_id()); + if (!hdWallet) { + logger_->error("[{}] wallet {} not found", __func__, request.wallet().wallet_id()); + return ProcessingResult::Error; + } + bool result = true; + { + const auto oldPass = SecureBinaryData::fromString(request.wallet().password()); + const bs::wallet::PasswordData newPass{ SecureBinaryData::fromString(request.new_password()) + , {bs::wallet::EncryptionType::Password} }; + const bs::core::WalletPasswordScoped lock(hdWallet, oldPass); + result = hdWallet->changePassword({bs::wallet::EncryptionType::Password}, newPass); + } + SignerMessage msg; + msg.set_wallet_pass_changed(result); + pushResponse(user_, env, msg.SerializeAsString()); + return bs::message::ProcessingResult::Success; +} + +bs::message::ProcessingResult SignerAdapter::processGetWalletSeed(const bs::message::Envelope& env + , const SignerMessage_WalletRequest& request) +{ + SignerMessage msg; + auto msgResp = msg.mutable_wallet_seed(); + msgResp->set_wallet_id(request.wallet_id()); + const auto& hdWallet = walletsMgr_->getHDWalletById(request.wallet_id()); + if (!hdWallet) { + logger_->error("[{}] wallet {} not found", __func__, request.wallet_id()); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Error; + } + try { + const bs::core::WalletPasswordScoped lock(hdWallet, SecureBinaryData::fromString(request.password())); + const auto& seed = hdWallet->getDecryptedSeed(); + msgResp->set_xpriv(seed.toXpriv().toBinStr()); + msgResp->set_seed(seed.seed().toBinStr()); + + if (seed.hasPrivateKey()) { + const auto& privKey = seed.privateKey(); + std::vector privData; + for (int i = 0; i < (int)privKey.getSize(); ++i) { + privData.push_back(privKey.getPtr()[i]); + } + const auto& words = BIP39::create_mnemonic(privData); + std::string bip39Seed; + for (const auto& w : words) { + bip39Seed += w + " "; + } + bip39Seed.pop_back(); + msgResp->set_bip39_seed(bip39Seed); + } + } + catch (const Armory::Wallets::WalletException& e) { + logger_->error("[{}] failed to decrypt wallet {}: {}", __func__, request.wallet_id(), e.what()); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Error; + } + pushResponse(user_, env, msg.SerializeAsString()); + return bs::message::ProcessingResult::Success; +} diff --git a/Core/SignerAdapter.h b/Core/SignerAdapter.h index 69fbc8714..393b373f7 100644 --- a/Core/SignerAdapter.h +++ b/Core/SignerAdapter.h @@ -29,6 +29,7 @@ namespace BlockSettle { namespace Common { class SignerMessage; class SignerMessage_AutoSign; + class SignerMessage_ChangeWalletPassword; class SignerMessage_CreateWalletRequest; class SignerMessage_DialogRequest; class SignerMessage_ExtendAddrChain; @@ -41,6 +42,7 @@ namespace BlockSettle { class SignerMessage_SyncAddressComment; class SignerMessage_SyncNewAddresses; class SignerMessage_SyncTxComment; + class SignerMessage_WalletRequest; } namespace Terminal { class SettingsMessage_SignerServer; @@ -107,7 +109,14 @@ class SignerAdapter : public bs::message::Adapter, public SignerCallbackTarget , const BlockSettle::Common::SignerMessage_CreateWalletRequest&); bs::message::ProcessingResult processImportHwWallet(const bs::message::Envelope& , const BlockSettle::Common::SignerMessage_ImportHWWallet&); - bs::message::ProcessingResult processDeleteWallet(const bs::message::Envelope&, const std::string& rootId); + bs::message::ProcessingResult processDeleteWallet(const bs::message::Envelope& + , const BlockSettle::Common::SignerMessage_WalletRequest&); + bs::message::ProcessingResult processExportWoWallet(const bs::message::Envelope& + , const BlockSettle::Common::SignerMessage_WalletRequest&); + bs::message::ProcessingResult processChangeWalletPass(const bs::message::Envelope& + , const BlockSettle::Common::SignerMessage_ChangeWalletPassword&); + bs::message::ProcessingResult processGetWalletSeed(const bs::message::Envelope& + , const BlockSettle::Common::SignerMessage_WalletRequest&); private: std::shared_ptr logger_; diff --git a/GUI/QtQuick/FeeSuggModel.cpp b/GUI/QtQuick/FeeSuggModel.cpp index 0349b9586..cb3f10b5d 100644 --- a/GUI/QtQuick/FeeSuggModel.cpp +++ b/GUI/QtQuick/FeeSuggModel.cpp @@ -93,16 +93,20 @@ void FeeSuggestionModel::addRows(const std::map& feeLevels) FeeSuggestion row{ feeLevel.first, std::move(estTime), feeLevel.second }; newRows.emplace_back(std::move(row)); } - beginInsertRows(QModelIndex(), rowCount(), rowCount() + newRows.size() - 1); - data_.insert(data_.cend(), newRows.begin(), newRows.end()); - endInsertRows(); - emit rowCountChanged(); + QMetaObject::invokeMethod(this, [this, newRows] { + beginInsertRows(QModelIndex(), rowCount(), rowCount() + newRows.size() - 1); + data_.insert(data_.cend(), newRows.begin(), newRows.end()); + endInsertRows(); + emit rowCountChanged(); + }); } void FeeSuggestionModel::clear() { - beginResetModel(); - data_.clear(); - endResetModel(); - emit rowCountChanged(); + QMetaObject::invokeMethod(this, [this] { + beginResetModel(); + data_.clear(); + endResetModel(); + emit rowCountChanged(); + }); } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 4b341ca3e..153f92fc6 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -547,22 +547,19 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) case SignerMessage::kSignTxResponse: return processSignTX(msg.sign_tx_response()); case SignerMessage::kWalletDeleted: - { - const auto& itWallet = hdWallets_.find(msg.wallet_deleted()); - bs::sync::WalletInfo wi; - if (itWallet == hdWallets_.end()) { - wi.ids.push_back(msg.wallet_deleted()); - } else { - wi = itWallet->second; - } - //TODO - } - break; + return processWalletDeleted(msg.wallet_deleted()); case SignerMessage::kCreatedWallet: walletBalances_->clear(); logger_->debug("[{}] wallet {} created: {}", __func__ //TODO: show something in the GUI if needed , msg.created_wallet().wallet_id(), msg.created_wallet().error_msg()); break; + case SignerMessage::kWalletPassChanged: + if (!msg.wallet_pass_changed()) { + emit showError(tr("Failed to change wallet password - see log for details")); + } + break; + case SignerMessage::kWalletSeed: + return processWalletSeed(msg.wallet_seed()); default: return ProcessingResult::Ignored; } return ProcessingResult::Success; @@ -1250,6 +1247,7 @@ void QtQuickAdapter::requestFeeSuggestions() } pushRequest(user_, userBlockchain_, msg.SerializeAsString(), {}, 10 , std::chrono::milliseconds{500}); + feeSuggModel_->clear(); } QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStringList& recvAddrs @@ -1498,6 +1496,26 @@ ProcessingResult QtQuickAdapter::processWalletsList(const WalletsMessage_Wallets return ProcessingResult::Success; } +bs::message::ProcessingResult QtQuickAdapter::processWalletDeleted(const std::string& walletId) +{ + if (walletId.empty()) { + return bs::message::ProcessingResult::Ignored; + } + logger_->debug("[{}] {}", __func__, walletId); + walletBalances_->deleteWallet(walletId); + return bs::message::ProcessingResult::Success; +} + +bs::message::ProcessingResult QtQuickAdapter::processWalletSeed(const BlockSettle::Common::SignerMessage_WalletSeed& response) +{ + if (response.bip39_seed().empty()) { + emit showError(tr("Failed to obtain wallet seed")); + return bs::message::ProcessingResult::Error; + } + walletPropertiesModel_->setWalletSeed(response.wallet_id(), response.bip39_seed()); + return bs::message::ProcessingResult::Success; +} + ProcessingResult QtQuickAdapter::processUTXOs(const WalletsMessage_UtxoListResponse& response) { logger_->debug("[{}] {} UTXOs for {}", __func__, response.utxos_size(), response.wallet_id()); @@ -1879,11 +1897,11 @@ int QtQuickAdapter::getSearchInputType(const QString& s) void QtQuickAdapter::startAddressSearch(const QString& s) { - expTxByAddrModel_->clear(); - ArmoryMessage msg; - msg.set_get_address_history(s.trimmed().toStdString()); - pushRequest(user_, userBlockchain_, msg.SerializeAsString() - , {}, 10, std::chrono::milliseconds{ 230 }); + expTxByAddrModel_->clear(); + ArmoryMessage msg; + msg.set_get_address_history(s.trimmed().toStdString()); + pushRequest(user_, userBlockchain_, msg.SerializeAsString() + , {}, 10, std::chrono::milliseconds{ 230 }); } qtquick_gui::WalletPropertiesVM* QtQuickAdapter::walletProperitesVM() const @@ -1891,29 +1909,55 @@ qtquick_gui::WalletPropertiesVM* QtQuickAdapter::walletProperitesVM() const return walletPropertiesModel_.get(); } -int QtQuickAdapter::exportWallet(const QString& walletId) +int QtQuickAdapter::rescanWallet(const QString& walletId) { - return 0; + logger_->debug("[{}] {}", __func__, walletId.toStdString()); + WalletsMessage msg; + msg.set_wallet_rescan(walletId.toStdString()); + const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); + return (msgId == 0) ? -1 : 0; } int QtQuickAdapter::changePassword(const QString& walletId, const QString& oldPassword, const QString& newPassword) { - return 0; + SignerMessage msg; + auto msgReq = msg.mutable_change_wallet_pass(); + auto msgWallet = msgReq->mutable_wallet(); + msgWallet->set_wallet_id(walletId.toStdString()); + msgWallet->set_password(oldPassword.toStdString()); + msgReq->set_new_password(newPassword.toStdString()); + const auto msgId = pushRequest(user_, userSigner_, msg.SerializeAsString()); + return (msgId == 0) ? -1 : 0; } int QtQuickAdapter::exportWalletAuth(const QString& walletId, const QString& password) { - return 0; + SignerMessage msg; + auto msgReq = msg.mutable_export_wo_wallet(); + msgReq->set_wallet_id(walletId.toStdString()); + msgReq->set_password(password.toStdString()); + const auto msgId = pushRequest(user_, userSigner_, msg.SerializeAsString()); + return (msgId == 0) ? -1 : 0; } int QtQuickAdapter::viewWalletSeedAuth(const QString& walletId, const QString& password) { - return 0; + SignerMessage msg; + auto msgReq = msg.mutable_get_wallet_seed(); + msgReq->set_wallet_id(walletId.toStdString()); + msgReq->set_password(password.toStdString()); + const auto msgId = pushRequest(user_, userSigner_, msg.SerializeAsString()); + return (msgId == 0) ? -1 : 0; } int QtQuickAdapter::deleteWallet(const QString& walletId, const QString& password) { - return 0; + SignerMessage msg; + auto msgReq = msg.mutable_delete_wallet(); + msgReq->set_wallet_id(walletId.toStdString()); + msgReq->set_password(password.toStdString()); + const auto msgId = pushRequest(user_, userSigner_, msg.SerializeAsString()); + return (msgId == 0) ? -1 : 0; } void QtQuickAdapter::notifyNewTransaction(const bs::TXEntry& tx) @@ -1932,5 +1976,4 @@ void QtQuickAdapter::notifyNewTransaction(const bs::TXEntry& tx) ); txDetails->disconnect(this); }, Qt::QueuedConnection); - } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 0d0b05627..b11458b50 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -59,6 +59,7 @@ namespace BlockSettle { class SettingsMessage_ArmoryServers; class SettingsMessage_SettingsResponse; class SettingsMessage_SignerServers; + class SignerMessage_WalletSeed; } } class BSTerminalSplashScreen; @@ -169,7 +170,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE int exportWalletAuth(const QString& walletId, const QString& password); Q_INVOKABLE int viewWalletSeedAuth(const QString& walletId, const QString& password); Q_INVOKABLE int deleteWallet(const QString& walletId, const QString& password); - Q_INVOKABLE int exportWallet(const QString& walletId); + Q_INVOKABLE int rescanWallet(const QString& walletId); Q_INVOKABLE void walletSelected(int); void notifyNewTransaction(const bs::TXEntry& tx); @@ -216,6 +217,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop bs::message::ProcessingResult processAddressHist(const BlockSettle::Common::ArmoryMessage_AddressHistory&); bs::message::ProcessingResult processFeeLevels(const BlockSettle::Common::ArmoryMessage_FeeLevelsResponse&); bs::message::ProcessingResult processWalletsList(const BlockSettle::Common::WalletsMessage_WalletsListResponse&); + bs::message::ProcessingResult processWalletDeleted(const std::string& walletId); + bs::message::ProcessingResult processWalletSeed(const BlockSettle::Common::SignerMessage_WalletSeed&); bs::message::ProcessingResult processUTXOs(const BlockSettle::Common::WalletsMessage_UtxoListResponse&); bs::message::ProcessingResult processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse&); bs::message::ProcessingResult processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived&); diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index fd5363fb2..375f2add7 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -90,11 +90,34 @@ void WalletBalancesModel::addWallet(const Wallet& wallet) } } //logger_->debug("[WalletBalancesModel::addWallet] adding #{}: {}", rowCount(), wallet.walletName); - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - wallets_.push_back(wallet); - endInsertRows(); + QMetaObject::invokeMethod(this, [this, wallet] { + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + wallets_.push_back(wallet); + endInsertRows(); - emit rowCountChanged(); + emit rowCountChanged(); + }); +} + +void WalletBalancesModel::deleteWallet(const std::string& walletId) +{ + int idx = -1; + for (int i = 0; i < wallets_.size(); ++i) { + if (wallets_.at(i).walletId == walletId) { + idx = i; + break; + } + } + if (idx < 0) { + logger_->warn("[{}] wallet {} is not in the list", __func__, walletId); + return; + } + QMetaObject::invokeMethod(this, [this, idx] { + beginRemoveRows(QModelIndex(), idx, idx); + wallets_.erase(wallets_.cbegin() + idx); + endRemoveRows(); + emit rowCountChanged(); + }); } QStringList WalletBalancesModel::wallets() const diff --git a/GUI/QtQuick/WalletBalancesModel.h b/GUI/QtQuick/WalletBalancesModel.h index b4d3ca742..049a1a3f3 100644 --- a/GUI/QtQuick/WalletBalancesModel.h +++ b/GUI/QtQuick/WalletBalancesModel.h @@ -37,10 +37,7 @@ namespace WalletBalance { class WalletBalancesModel : public QAbstractTableModel { Q_OBJECT - - Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) public: - WalletBalancesModel(const std::shared_ptr&, QObject* parent = nullptr); int rowCount(const QModelIndex & = QModelIndex()) const override; @@ -55,6 +52,7 @@ class WalletBalancesModel : public QAbstractTableModel std::string walletName; }; void addWallet(const Wallet&); + void deleteWallet(const std::string& walletId); struct Balance { double confirmed{ 0 }; @@ -64,6 +62,8 @@ class WalletBalancesModel : public QAbstractTableModel }; void setWalletBalance(const std::string& walletId, const Balance&); + Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) + private: using FieldFunc = std::function; QString getBalance(const std::string& walletId, const FieldFunc&) const; diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index d30be96b4..017b26b1d 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -341,7 +341,7 @@ CustomPopup { icon_add_source: "qrc:/images/arrow.png" title_text: qsTr("Rescan wallet") - onClicked: console.log('Unsuported') + onClicked: bsApp.rescanWallet(wallet_properties_vm.walletId) } CustomListItem { diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index 6d13aca57..f83792172 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -23,6 +23,15 @@ void WalletPropertiesVM::setWalletInfo(const WalletInfo& info) emit changed(); } +void qtquick_gui::WalletPropertiesVM::setWalletSeed(const std::string& walletId, const std::string& seed) +{ + if (walletId != info_.walletId.toStdString()) { + return; + } + seed_ = QString::fromStdString(seed).split(QLatin1Char(' ')); + emit seedChanged(); +} + void qtquick_gui::WalletPropertiesVM::setNbActiveAddrs(const std::string& walletId, uint32_t nb) { if (info_.walletId.isEmpty() || (info_.walletId.toStdString() != walletId)) { @@ -96,12 +105,6 @@ const QStringList& WalletPropertiesVM::seed() const return seed_; } -void WalletPropertiesVM::setSeed(const QStringList& seed) -{ - seed_ = seed; - emit seedChanged(); -} - const QString& WalletPropertiesVM::exportPath() const { return exportPath_; diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h index 804abac2f..7a8d810fc 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h @@ -47,6 +47,7 @@ class WalletPropertiesVM: public QObject WalletPropertiesVM(QObject* parent = nullptr); void setWalletInfo(const WalletInfo& info); + void setWalletSeed(const std::string& walletId, const std::string& seed); void setNbActiveAddrs(const std::string& walletId, uint32_t nb); void setNbUTXOs(const std::string& walletId, uint32_t nb); @@ -62,7 +63,6 @@ class WalletPropertiesVM: public QObject bool isWatchingOnly() const; const QStringList& seed() const; - void setSeed(const QStringList& seed); const QString& exportPath() const; void setExportPath(const QString& path); diff --git a/GUI/QtWidgets/QtGuiAdapter.cpp b/GUI/QtWidgets/QtGuiAdapter.cpp index 6502b4ce9..6de27906f 100644 --- a/GUI/QtWidgets/QtGuiAdapter.cpp +++ b/GUI/QtWidgets/QtGuiAdapter.cpp @@ -1256,7 +1256,8 @@ void QtGuiAdapter::onNeedWalletDialog(bs::signer::ui::GeneralDialogType dlgType QMetaObject::invokeMethod(mainWindow_, [this, rootId, walletName] { if (mainWindow_->deleteWallet(rootId, walletName)) { SignerMessage msg; - msg.set_delete_wallet(rootId); + auto msgReq = msg.mutable_delete_wallet(); + msgReq->set_wallet_id(rootId); pushRequest(user_, userSigner_, msg.SerializeAsString()); } }); diff --git a/common b/common index 61887ef8b..d78819f1d 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 61887ef8bd2876f448ac93707ddee1bbc0e5dab6 +Subproject commit d78819f1df04d0cec57e240f6ff9c6f1fb8312ef From 9b7bb37c1acfd505a8c31cccda43a3ea965c2e31 Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 2 Mar 2023 23:04:16 +0100 Subject: [PATCH 185/436] Bugfix & cleanup --- GUI/QtQuick/AddressFilterModel.cpp | 10 +++-- GUI/QtQuick/QtQuickAdapter.cpp | 2 - GUI/QtQuick/TxListModel.cpp | 44 ------------------- GUI/QtQuick/TxListModel.h | 2 - GUI/QtQuick/qml/Overview/OverviewPanel.qml | 20 +++++++-- .../qml/StyledControls/CustomTableView.qml | 5 +++ GUI/QtQuick/qml/TransactionsPage.qml | 2 +- 7 files changed, 28 insertions(+), 57 deletions(-) diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp index bb827485f..81c20dbd8 100644 --- a/GUI/QtQuick/AddressFilterModel.cpp +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -10,7 +10,7 @@ */ #include "AddressFilterModel.h" #include "AddressListModel.h" -#include +#include AddressFilterModel::AddressFilterModel(QObject* parent) : QSortFilterProxyModel(parent) @@ -22,15 +22,17 @@ bool AddressFilterModel::filterAcceptsRow(int source_row, const QModelIndex& sou { if (hideUsed_) { const auto txCountIndex = sourceModel()->index(source_row, 1); - if (sourceModel()->data(txCountIndex, QmlAddressListModel::TableRoles::TableDataRole) != 0) + const auto bananceIndex = sourceModel()->index(source_row, 2); + if (sourceModel()->data(txCountIndex, QmlAddressListModel::TableRoles::TableDataRole) != 0 && + qFuzzyCompare(sourceModel()->data(bananceIndex, QmlAddressListModel::TableRoles::TableDataRole).toFloat(), 0.0f)) { return false; } } if (hideEmpty_) { - const auto txCountIndex = sourceModel()->index(source_row, 1); - if (sourceModel()->data(txCountIndex, QmlAddressListModel::TableRoles::TableDataRole) == 0) + const auto bananceIndex = sourceModel()->index(source_row, 2); + if (qFuzzyCompare(sourceModel()->data(bananceIndex, QmlAddressListModel::TableRoles::TableDataRole).toFloat(), 0.0f)) { return false; } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 4b341ca3e..f296ddb4d 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1564,8 +1564,6 @@ ProcessingResult QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMess } catch (const std::exception&) {} } - txModel_->prependRow(txEntry); - notifyNewTransaction(txEntry); } pushRequest(user_, userWallets_, msg.SerializeAsString()); diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 1fd0169f1..f54c80c6e 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -242,50 +242,6 @@ void TxListModel::addRows(const std::vector& entries) } } -void TxListModel::prependRow(const bs::TXEntry& entry) -{ - //logger_->debug("[{}::{}] prepending entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); - QMetaObject::invokeMethod(this, [this, entry] { - decltype(txDetails_) prevDet; - beginInsertRows(QModelIndex(), 0, 0); - data_.insert(data_.cbegin(), entry); - txDetails_.swap(prevDet); - for (auto txDet : prevDet) { - txDetails_[txDet.first] = std::move(txDet.second); - } - endInsertRows(); - emit nbTxChanged(); - }); -} - -void TxListModel::addRow(const bs::TXEntry& entry) -{ - int row = -1; - for (int i = 0; i < data_.size(); ++i) { - const auto& de = data_.at(i); - if ((entry.txHash == de.txHash) && (de.walletIds == entry.walletIds)) { - data_[i].txTime = entry.txTime; - data_[i].recvTime = entry.recvTime; - row = i; - break; - } - } - - if (row != -1) { - //logger_->debug("[{}::{}] updating entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); - emit dataChanged(createIndex(row, 0), createIndex(row, 0)); - } - else { - //logger_->debug("[{}::{}] adding entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); - QMetaObject::invokeMethod(this, [this, entry] { - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - data_.push_back(entry); - endInsertRows(); - emit nbTxChanged(); - }); - } -} - void TxListModel::clear() { beginResetModel(); diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index bdce6a4d2..4d3451f63 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -45,8 +45,6 @@ class TxListModel : public QAbstractTableModel Q_INVOKABLE bool exportCSVto(const QString&); - void prependRow(const bs::TXEntry&); - void addRow(const bs::TXEntry&); void addRows(const std::vector&); void clear(); void setTxComment(const std::string& txHash, const std::string& comment); diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index a1d74be49..69ee2c163 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -86,28 +86,40 @@ Rectangle { CustomSmallButton { width: 85 text: qsTr("Hide used") - onClicked: addressFilterModel.hideUsed = !addressFilterModel.hideUsed + onClicked: { + addressFilterModel.hideUsed = !addressFilterModel.hideUsed + tablewView.update() + } backgroundColor: addressFilterModel.hideUsed ? BSStyle.smallButtonBackgroundColor : 'transparent' } CustomSmallButton { width: 90 text: qsTr("Hide internal") - onClicked: addressFilterModel.hideInternal = !addressFilterModel.hideInternal + onClicked: { + addressFilterModel.hideInternal = !addressFilterModel.hideInternal + tablewView.update() + } backgroundColor: addressFilterModel.hideInternal ? BSStyle.smallButtonBackgroundColor : 'transparent' } CustomSmallButton { width: 90 text: qsTr("Hide external") - onClicked: addressFilterModel.hideExternal = !addressFilterModel.hideExternal + onClicked: { + addressFilterModel.hideExternal = !addressFilterModel.hideExternal + tablewView.update() + } backgroundColor: addressFilterModel.hideExternal ? BSStyle.smallButtonBackgroundColor : 'transparent' } CustomSmallButton { width: 85 text: qsTr("Hide empty") - onClicked: addressFilterModel.hideEmpty = !addressFilterModel.hideEmpty + onClicked: { + addressFilterModel.hideEmpty = !addressFilterModel.hideEmpty + tablewView.update() + } backgroundColor: addressFilterModel.hideEmpty ? BSStyle.smallButtonBackgroundColor : 'transparent' } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index 19ce12eea..3a1a58750 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -37,6 +37,10 @@ Column { signal cellDoubleClicked(var row, var column, var data) signal cellRightDoubleClicked(var row, var column, var data) + function update() { + component.forceLayout() + } + CustomHorizontalHeaderView { id: tableHeader width: parent.width @@ -62,6 +66,7 @@ Column { maximumFlickVelocity: 1000 ScrollBar.vertical: ScrollBar { + id: verticalScrollBar policy: component.contentHeight > component.height ? ScrollBar.AlwaysOn : ScrollBar.AsNeeded } diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index c7a6a96e2..abe28d6fc 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -160,7 +160,7 @@ Item { CustomTableView { width: parent.width - height: parent.height - transaction_header_menu.height + height: parent.height - transaction_header_menu.height - transaction_header_menu.spacing - 1 model: transactionModel copy_button_column_index: 3 From a3894e002bce7c5d995181c7b30f8022b64fa7ab Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 3 Mar 2023 01:54:38 +0200 Subject: [PATCH 186/436] qml: advansed send: improve gui --- GUI/QtQuick/TxOutputsModel.cpp | 9 ++++- GUI/QtQuick/TxOutputsModel.h | 4 +-- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 35 ++++++++++++++++--- GUI/QtQuick/qml/Send/SendPopup.qml | 23 ++++++++---- .../qml/Send/SignTransactionAdvanced.qml | 6 ++-- GUI/QtQuick/qml/main.qml | 5 ++- 6 files changed, 65 insertions(+), 17 deletions(-) diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index 5e61c46fa..577298eba 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -27,7 +27,14 @@ namespace { TxOutputsModel::TxOutputsModel(const std::shared_ptr& logger, QObject* parent) : QAbstractTableModel(parent), logger_(logger) , header_{ tr("Output Address"), tr("Amount (BTC)"), {} } -{ } +{ + connect(this, &TxOutputsModel::modelReset, + this, &TxOutputsModel::rowCountChanged); + connect(this, &TxOutputsModel::rowsInserted, + this, &TxOutputsModel::rowCountChanged); + connect(this, &TxOutputsModel::rowsRemoved, + this, &TxOutputsModel::rowCountChanged); +} int TxOutputsModel::rowCount(const QModelIndex &) const { diff --git a/GUI/QtQuick/TxOutputsModel.h b/GUI/QtQuick/TxOutputsModel.h index 16546cdaf..4ca955a03 100644 --- a/GUI/QtQuick/TxOutputsModel.h +++ b/GUI/QtQuick/TxOutputsModel.h @@ -29,7 +29,7 @@ class QTxDetails; class TxOutputsModel : public QAbstractTableModel { Q_OBJECT - //Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) + Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) public: enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, WidthRole @@ -54,7 +54,7 @@ class TxOutputsModel : public QAbstractTableModel signals: void selectionChanged() const; - //void rowCountChanged(); + void rowCountChanged(); private: QVariant getData(int row, int col) const; diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 9a6636fee..e66dc494c 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -156,6 +156,8 @@ ColumnLayout { CustomCheckBox { id: checkbox_rbf + activeFocusOnTab: false + implicitHeight: 18 Layout.alignment: Qt.AlignRight | Qt.AlignTop @@ -288,6 +290,8 @@ ColumnLayout { enabled: !isRBF && !isCPFP + activeFocusOnTab: false + text: qsTr("Select Inputs") font.family: "Roboto" @@ -429,7 +433,7 @@ ColumnLayout { //aliases title_text: qsTr("Comment") - onTabNavigated: continue_but.forceActiveFocus() + onTabNavigated: include_output_but.forceActiveFocus() onBackTabNavigated: fee_suggest_combo.forceActiveFocus() } @@ -441,7 +445,7 @@ ColumnLayout { Layout.topMargin: 16 Layout.alignment: Qt.AlignLeft | Qt.AlingTop - activeFocusOnTab: false + activeFocusOnTab: include_output_but.enabled enabled: isRBF || (rec_addr_input.isValid && rec_addr_input.input_text.length && parseFloat(amount_input.input_text) !== 0 && amount_input.input_text.length) @@ -456,13 +460,13 @@ ColumnLayout { } function click_enter() { + if (!include_output_but.enabled) return + if (isRBF) { txOutputsModel.setOutputsFrom(tx) return } - if (!include_output_but.enabled) return - txOutputsModel.addOutput(rec_addr_input.input_text, amount_input.input_text) } } @@ -519,7 +523,7 @@ ColumnLayout { activeFocusOnTab: continue_but.enabled - enabled: (table_outputs.rowCount > 1) + enabled: (txOutputsModel.rowCount > 1) width: 1084 @@ -563,6 +567,27 @@ ColumnLayout { } + + Keys.onEnterPressed: { + click_buttons() + } + + Keys.onReturnPressed: { + click_buttons() + } + + function click_buttons() + { + if (include_output_but.enabled) + { + include_output_but.click_enter() + } + else if (continue_but.enabled) + { + continue_but.click_enter() + } + } + function init() { rec_addr_input.setActiveFocus() diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 27bf403c9..75a76d08b 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -16,6 +16,10 @@ CustomPopup { _stack_view.initialItem: simple_details _arrow_but_visibility: !simple_details.visible && !advanced_details.visible + property var tx: null + property bool isRBF: false + property bool isCPFP: false + SimpleDetails { id: simple_details visible: false @@ -51,6 +55,10 @@ CustomPopup { id: advanced_details visible: false + tx: root.tx + isRBF: root.isRBF + isCPFP: root.isCPFP + onSig_continue: (signature) => { sign_trans_advanced.txSignRequest = signature _stack_view.push(sign_trans_advanced) @@ -77,6 +85,9 @@ CustomPopup { id: sign_trans_advanced visible: false + isRBF: root.isRBF + isCPFP: root.isCPFP + onSig_broadcast: { root.close() _stack_view.pop(null) @@ -97,17 +108,17 @@ CustomPopup { { advanced_details.init() } - advanced_details.tx = null - advanced_details.isRBF = false - advanced_details.isCPFP = false + root.tx = null + root.isRBF = false + root.isCPFP = false } function open(txId: string, isRBF: bool, isCPFP: bool) { _stack_view.replace(advanced_details) - advanced_details.tx = bsApp.getTXDetails(txId) - advanced_details.isRBF = isRBF - advanced_details.isCPFP = isCPFP + root.tx = bsApp.getTXDetails(txId) + root.isRBF = isRBF + root.isCPFP = isCPFP advanced_details.init() } diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml index 2186d3a87..d877970ae 100644 --- a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -13,6 +13,8 @@ ColumnLayout { property var txSignRequest property int time_progress + property bool isRBF: false + property bool isCPFP: false signal sig_broadcast() signal sig_time_finished() @@ -62,7 +64,7 @@ ColumnLayout { height: parent.height - 24 anchors.centerIn: parent - model: txInputsSelectedModel + model: isRBF ? tx.ownInputs : isCPFP ? tx.ownOutputs : txInputsSelectedModel columnWidths: [0.7, 0.1, 0, 0.2] copy_button_column_index: -1 @@ -127,7 +129,7 @@ ColumnLayout { Rectangle { id: details_rect - Layout.fillWidth: true + Layout.alignment: Qt.AlignHCenter | Qt.AlingTop Layout.preferredHeight : 100 Layout.topMargin: 20 diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 285482707..0427ca9e2 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -24,8 +24,11 @@ import "Settings" 1 ApplicationWindow { id: mainWindow + minimumWidth: 1200 - minimumHeight: 900 + minimumHeight: 800 + x: Screen.width / 2 - width / 2 + y: Screen.height / 2 - height / 2 visible: false title: qsTr("BlockSettle Terminal") From 4dba987ffe35dd24523aadcd45b7b0d014efd25f Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 3 Mar 2023 12:41:10 +0200 Subject: [PATCH 187/436] fix pr issues --- GUI/QtQuick/TxOutputsModel.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index 577298eba..e284d561c 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -28,12 +28,12 @@ TxOutputsModel::TxOutputsModel(const std::shared_ptr& logger, QO : QAbstractTableModel(parent), logger_(logger) , header_{ tr("Output Address"), tr("Amount (BTC)"), {} } { - connect(this, &TxOutputsModel::modelReset, - this, &TxOutputsModel::rowCountChanged); - connect(this, &TxOutputsModel::rowsInserted, - this, &TxOutputsModel::rowCountChanged); - connect(this, &TxOutputsModel::rowsRemoved, - this, &TxOutputsModel::rowCountChanged); + connect(this, &TxOutputsModel::modelReset, + this, &TxOutputsModel::rowCountChanged); + connect(this, &TxOutputsModel::rowsInserted, + this, &TxOutputsModel::rowCountChanged); + connect(this, &TxOutputsModel::rowsRemoved, + this, &TxOutputsModel::rowCountChanged); } int TxOutputsModel::rowCount(const QModelIndex &) const From d57224bc386309f94dd2493a7f5eb363566f4896 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 3 Mar 2023 13:55:08 +0300 Subject: [PATCH 188/436] minor log changes --- GUI/QtQuick/QtQuickAdapter.cpp | 2 ++ GUI/QtQuick/TxOutputsModel.cpp | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 153f92fc6..13ec6f152 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1258,6 +1258,7 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri if (walletIndex >= 0) { msgReq->set_hd_wallet_id(hdWalletIdByIndex(walletIndex)); } + logger_->debug("[{}] walletIdx={}", __func__, walletIndex); bool isMaxAmount = false; if (recvAddrs.isEmpty()) { const auto& recipients = txOutputsModel_->recipients(); @@ -1326,6 +1327,7 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri } const auto msgId = pushRequest(user_, userBlockchain_, msgSpendable.SerializeAsString()); txReqs_[msgId] = { txReq, isMaxAmount, msg }; + logger_->debug("[{}] {}", __func__, msgSpendable.DebugString()); return txReq; } else { diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index e284d561c..bb7eb2aa3 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -38,7 +38,6 @@ TxOutputsModel::TxOutputsModel(const std::shared_ptr& logger, QO int TxOutputsModel::rowCount(const QModelIndex &) const { - logger_->debug("[{}] data_.size() = {}", __func__, data_.size()); return data_.size() + 1; } From c81875d83dc52c714b02a1ea74fb0fca9d006686 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 3 Mar 2023 13:46:50 +0200 Subject: [PATCH 189/436] qml: RBF fix bugs, combobox editable --- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 4 ++++ GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 1 + GUI/QtQuick/qml/StyledControls/CustomComboBox.qml | 6 ++++-- GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml | 11 ++++++----- GUI/QtQuick/qml/TransactionsPage.qml | 2 ++ 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 5b2ccd093..7eaa24ef9 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -163,6 +163,8 @@ Rectangle { height: parent.height - 40 model: PendingTransactionFilterModel { + id: pendingTransactionModel + sourceModel: txListModel dynamicSortFilter: true } @@ -180,6 +182,8 @@ Rectangle { CustomRbfCpfpMenu { id: context_menu + model: pendingTransactionModel + onOpenSend: (txId, isRBF, isCPFP) => control.openSend(txId, isRBF, isCPFP) } diff --git a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml index 2bfb74a98..3496af1c9 100644 --- a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml +++ b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml @@ -19,6 +19,7 @@ CustomComboBox { id: fee_suggest_combo model: feeSuggestions + editable: true //aliases title_text: qsTr("Fee Suggestions") diff --git a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml index 9bedf2868..cf05d2fa6 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml @@ -22,6 +22,7 @@ ComboBox { property int fontSize: 16 property color fontColor: "#FFFFFF" + editable: false activeFocusOnTab: true leftPadding: 16 @@ -148,7 +149,7 @@ ComboBox { topPadding: 4 bottomPadding: 4 - contentItem: Text { + contentItem: TextInput { text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) @@ -158,7 +159,8 @@ ComboBox { font.family: "Roboto" font.weight: Font.Normal - elide: Text.ElideNone + enabled: control.editable + //elide: Text.ElideNone verticalAlignment: Text.AlignVCenter } diff --git a/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml b/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml index 4f0c4c362..3e638cd1d 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml @@ -23,22 +23,23 @@ CustomContextMenu { property int row property int column + property var model Action { text: qsTr("RBF") - enabled: transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.RBFRole) - //&& (transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) + enabled: model.data(model.index(context_menu.row, context_menu.column), TxListModel.RBFRole) + //&& (model.data(model.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) onTriggered: { - var txId = transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) + var txId = model.data(model.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) context_menu.openSend(txId, true, false) } } Action { text: qsTr("CPFP") - enabled: true//(transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) + enabled: true//(model.data(model.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) onTriggered: { - var txId = transactionModel.data(transactionModel.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) + var txId = model.data(model.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) context_menu.openSend(txId, false, true) } } diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 47c0ef7c7..ce5e9d8fd 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -192,6 +192,8 @@ Item { CustomRbfCpfpMenu { id: context_menu + model: transactionModel + onOpenSend: (txId, isRBF, isCPFP) => transactions.openSend(txId, isRBF, isCPFP) } } From fd96f8b3abd8ab9f69f8b15ff8bd48af0fc186fa Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 3 Mar 2023 14:08:30 +0200 Subject: [PATCH 190/436] qml: editable combobox without mask --- GUI/QtQuick/qml/StyledControls/CustomComboBox.qml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml index cf05d2fa6..6db859558 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml @@ -22,7 +22,6 @@ ComboBox { property int fontSize: 16 property color fontColor: "#FFFFFF" - editable: false activeFocusOnTab: true leftPadding: 16 @@ -67,7 +66,7 @@ ComboBox { color: "#7A88B0" } - Label { + TextInput { id: input focus: true @@ -87,6 +86,8 @@ ComboBox { color: control.fontColor text: control.currentText + enabled: control.editable + clip: true } } @@ -149,7 +150,7 @@ ComboBox { topPadding: 4 bottomPadding: 4 - contentItem: TextInput { + contentItem: Text { text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) @@ -159,8 +160,7 @@ ComboBox { font.family: "Roboto" font.weight: Font.Normal - enabled: control.editable - //elide: Text.ElideNone + elide: Text.ElideNone verticalAlignment: Text.AlignVCenter } From ebae765c61ed7198c2862eccf34d018cc85164f0 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 3 Mar 2023 15:21:16 +0300 Subject: [PATCH 191/436] conflict resolved --- GUI/QtQuick/QTXSignRequest.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h index 148d42396..d9aeb26d1 100644 --- a/GUI/QtQuick/QTXSignRequest.h +++ b/GUI/QtQuick/QTXSignRequest.h @@ -73,6 +73,8 @@ class QTXSignRequest : public QObject bool isHWW() const { return isHWW_; } Q_PROPERTY(bool isHWWready READ isHWWready NOTIFY hwwReady) bool isHWWready() const { return isHWWready_; } + Q_PROPERTY(bool hasError READ hasError NOTIFY error) + bool hasError() const { return !error_.isEmpty(); } signals: void txSignReqChanged(); From 42fe8f3766ff744ec93a3b5169154501eeced7ba Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 3 Mar 2023 20:58:01 +0200 Subject: [PATCH 192/436] qml: fee suggestions combo box: add validator to editable text --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 20 +++++++------ GUI/QtQuick/qml/Send/AmountInput.qml | 1 + GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 29 ++++++++++++++++++- GUI/QtQuick/qml/Send/RecvAddrTextInput.qml | 2 +- .../qml/StyledControls/CustomComboBox.qml | 10 +++++++ 5 files changed, 51 insertions(+), 11 deletions(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index e66dc494c..17d70632b 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -30,6 +30,7 @@ ColumnLayout { target:tx function onUpdated () { + bsApp.requestFeeSuggestions() if (isRBF) { txOutputsModel.setOutputsFrom(tx) } @@ -190,8 +191,7 @@ ColumnLayout { onActivated: (index_act) => { if (rec_addr_input.isValid) { var fpb = parseFloat(fee_suggest_combo.currentValue) - tempRequest = bsApp.createTXSignRequest(index_act - , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) + create_temp_request() } //I dont understand why but acceptableInput dont work... @@ -398,13 +398,6 @@ ColumnLayout { onFocus_next: { amount_input.setActiveFocus() } - - - function createTempRequest() { - var fpb = parseFloat(fee_suggest_combo.currentValue) - tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) - } } AmountInput { @@ -588,6 +581,15 @@ ColumnLayout { } } + function create_temp_request() + { + if (rec_addr_input.isValid) { + var fpb = parseFloat(fee_suggest_combo.currentValue) + tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) + } + } + function init() { rec_addr_input.setActiveFocus() diff --git a/GUI/QtQuick/qml/Send/AmountInput.qml b/GUI/QtQuick/qml/Send/AmountInput.qml index 96a727557..2648db37d 100644 --- a/GUI/QtQuick/qml/Send/AmountInput.qml +++ b/GUI/QtQuick/qml/Send/AmountInput.qml @@ -26,6 +26,7 @@ CustomTextInput { //it is why I have realized my validator inside of onTextEdited property string prev_text : "" onTextEdited : { + if (tempRequest === null || !tempRequest.isValid) { amount_input.input_text = "0" } diff --git a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml index 3496af1c9..7060d4002 100644 --- a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml +++ b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml @@ -8,7 +8,7 @@ ********************************************************************************** */ -import QtQuick 2.9 +import QtQuick 2.15 import QtQuick.Controls 2.3 import "../BsStyles" @@ -29,6 +29,8 @@ CustomComboBox { textRole: "text" valueRole: "value" + validator: RegExpValidator {regExp: new RegExp(create_regexp())} + Connections { target:feeSuggestions @@ -39,6 +41,9 @@ CustomComboBox { { change_index_handler() } + + validator.regExp = new RegExp(create_regexp()) + prev_text = fee_suggest_combo.currentText } } @@ -47,5 +52,27 @@ CustomComboBox { { change_index_handler() } + validator.regExp = new RegExp(create_regexp()) + prev_text = fee_suggest_combo.currentText + } + + function create_regexp() + { + var res = fee_suggest_combo.currentText + var index = res.indexOf(":") + res = res.slice(0, index+2) + res = res.replace("(", "\\(").replace(")", "\\)") + res = res + "\\d+\\.?\\d{0,1} s\/b" + return res + } + + property string prev_text : fee_suggest_combo.currentText + onTextEdited : { + if (!fee_suggest_combo.input_accept_input) + { + fee_suggest_combo.input_text = prev_text + } + + prev_text = fee_suggest_combo.input_text } } diff --git a/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml b/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml index 97182e185..be5b5de9d 100644 --- a/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml +++ b/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml @@ -63,7 +63,7 @@ CustomTextInput { rec_addr_input.isValid = bsApp.validateAddress(rec_addr_input.input_text) if (rec_addr_input.isValid) { - createTempRequest() + create_temp_request() focus_next() } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml index 6db859558..df8ac3f44 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml @@ -22,6 +22,11 @@ ComboBox { property int fontSize: 16 property color fontColor: "#FFFFFF" + property alias input_accept_input: input.acceptableInput + property alias input_text: input.text + + signal textEdited() + activeFocusOnTab: true leftPadding: 16 @@ -86,9 +91,14 @@ ComboBox { color: control.fontColor text: control.currentText + validator: control.validator enabled: control.editable clip: true + + onTextEdited : { + control.textEdited() + } } } From 76c4a02ec417b33f101bb590c4c8a6a3d36adcaa Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 3 Mar 2023 22:34:44 +0300 Subject: [PATCH 193/436] CPFP support --- GUI/QtQuick/QTXSignRequest.cpp | 31 +++++++-- GUI/QtQuick/QTXSignRequest.h | 22 ++++--- GUI/QtQuick/QtQuickAdapter.cpp | 56 ++++++++++++++-- GUI/QtQuick/QtQuickAdapter.h | 2 + GUI/QtQuick/TxInputsModel.cpp | 66 ++++++++----------- GUI/QtQuick/TxInputsModel.h | 20 ++++-- GUI/QtQuick/TxListModel.cpp | 3 +- GUI/QtQuick/qml/Send/SignTransaction.qml | 4 +- .../qml/Send/SignTransactionAdvanced.qml | 6 +- .../qml/StyledControls/CustomRbfCpfpMenu.qml | 4 +- common | 2 +- 11 files changed, 144 insertions(+), 72 deletions(-) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index a07afd83d..8de73a2cd 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -9,24 +9,47 @@ */ #include "QTXSignRequest.h" +#include #include "Address.h" #include "BTCNumericTypes.h" -QTXSignRequest::QTXSignRequest(QObject* parent) - : QObject(parent) +QTXSignRequest::QTXSignRequest(const std::shared_ptr& logger, QObject* parent) + : QObject(parent), logger_(logger) {} void QTXSignRequest::setTxSignReq(const bs::core::wallet::TXSignRequest& txReq) { txReq_ = txReq; - emit txSignReqChanged(); + std::vector inputs; + inputs.reserve(txReq.armorySigner_.getTxInCount()); + for (unsigned int i = 0; i < txReq.armorySigner_.getTxInCount(); ++i) { + const auto& spender = txReq.armorySigner_.getSpender(i); + inputs.push_back(spender->getUtxo()); + } + setInputs(inputs); } void QTXSignRequest::setError(const QString& err) { error_ = err; - emit error(); + emit errorSet(); +} + +void QTXSignRequest::setInputs(const std::vector& utxos) +{ + if (inputsModel_) { + inputsModel_->clear(); + inputsModel_->addUTXOs(utxos); + emit txSignReqChanged(); + } + else { + QMetaObject::invokeMethod(this, [this, utxos] { + inputsModel_ = new TxInputsModel(logger_, nullptr, this); + inputsModel_->addUTXOs(utxos); + emit txSignReqChanged(); + }); + } } QStringList QTXSignRequest::outputAddresses() const diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h index d9aeb26d1..983eaad43 100644 --- a/GUI/QtQuick/QTXSignRequest.h +++ b/GUI/QtQuick/QTXSignRequest.h @@ -16,6 +16,7 @@ #include #include "BinaryData.h" #include "CoreWallet.h" +#include "TxInputsModel.h" namespace spdlog { class logger; @@ -30,12 +31,13 @@ class QTXSignRequest : public QObject double amount; }; - QTXSignRequest(QObject* parent = nullptr); + QTXSignRequest(const std::shared_ptr&, QObject* parent = nullptr); bs::core::wallet::TXSignRequest txReq() const { return txReq_; } void setTxSignReq(const bs::core::wallet::TXSignRequest&); void setError(const QString&); - void addDummyUTXO(const UTXO& utxo) { dummyUTXOs_.push_back(utxo); } - std::vector dummyUTXOs() const { return dummyUTXOs_; } + void addInput(const QUTXO::Input& input) { inputs_.push_back(input); } + std::vector inputs() const { return inputs_; } + void setInputs(const std::vector&); void setHWW(bool hww) { @@ -64,7 +66,7 @@ class QTXSignRequest : public QObject quint32 txSize() const; Q_PROPERTY(QString feePerByte READ feePerByte NOTIFY txSignReqChanged) QString feePerByte() const; - Q_PROPERTY(QString errorText READ errorText NOTIFY error) + Q_PROPERTY(QString errorText READ errorText NOTIFY errorSet) QString errorText() const { return error_; } Q_PROPERTY(bool isValid READ isValid NOTIFY txSignReqChanged) bool isValid() const { return (error_.isEmpty() && txReq_.isValid()); } @@ -73,19 +75,23 @@ class QTXSignRequest : public QObject bool isHWW() const { return isHWW_; } Q_PROPERTY(bool isHWWready READ isHWWready NOTIFY hwwReady) bool isHWWready() const { return isHWWready_; } - Q_PROPERTY(bool hasError READ hasError NOTIFY error) + Q_PROPERTY(bool hasError READ hasError NOTIFY errorSet) bool hasError() const { return !error_.isEmpty(); } + Q_PROPERTY(TxInputsModel* inputs READ inputsModel NOTIFY txSignReqChanged) + TxInputsModel* inputsModel() const { return inputsModel_; } signals: void txSignReqChanged(); void hwwChanged(); void hwwReady(); - void error(); + void errorSet(); private: - bs::core::wallet::TXSignRequest txReq_{}; + std::shared_ptr logger_; + bs::core::wallet::TXSignRequest txReq_{}; QString error_; - std::vector dummyUTXOs_; + std::vector inputs_; + TxInputsModel* inputsModel_{ nullptr }; bool isHWW_{ false }; bool isHWWready_{ false }; }; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 13ec6f152..4edc2d144 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -946,6 +946,10 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId } QVector> addresses; for (const auto& addr : response.used_addresses()) { + try { + addressCache_[bs::Address::fromAddressString(addr.address())] = response.wallet_id(); + } + catch (const std::exception&) {} addresses.append({ QString::fromStdString(addr.address()) , QString::fromStdString(addr.comment()) , QString::fromStdString(addr.index()) @@ -993,6 +997,8 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId if (tx.isInitialized()) { txDet.tx = std::move(tx); txDet.tx.setTxHeight(resp.tx_height()); + logger_->debug("[{}] own txid: {}/{}", ownTxHash.toHexStr(true) + , txDet.tx.getThisHash().toHexStr(true)); } } } catch (const std::exception &e) { @@ -1305,11 +1311,12 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri msgReq->set_comment(comment.toStdString()); } QTXSignRequest* txReq = nullptr; + std::vector inputs; if (utxos) { if (walletIndex < 0) { - txReq = new QTXSignRequest(this); + txReq = new QTXSignRequest(logger_, this); for (const auto& qUtxo : utxos->data()) { - txReq->addDummyUTXO(qUtxo->utxo()); + txReq->addInput(qUtxo->input()); } ArmoryMessage msgSpendable; ArmoryMessage_WalletIDs* msgWltIds = nullptr; @@ -1338,12 +1345,16 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri else { for (const auto& qUtxo : utxos->data()) { msgReq->add_utxos(qUtxo->utxo().serialize().toBinStr()); + inputs.push_back(qUtxo->utxo()); } } } const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); if (!txReq) { - txReq = new QTXSignRequest(this); + txReq = new QTXSignRequest(logger_, this); + } + if (!inputs.empty()) { + txReq->setInputs(inputs); } txReqs_[msgId] = { txReq, isMaxAmount }; return txReq; @@ -1665,6 +1676,7 @@ void QtQuickAdapter::processWalletAddresses(const std::string& walletId } const auto lastAddr = addresses.at(addresses.size() - 1); logger_->debug("[{}] {} last address: {}", __func__, hdWalletId, lastAddr.address.display()); + addressCache_[lastAddr.address] = hdWalletId; addrModel_->addRow(hdWalletId, { QString::fromStdString(lastAddr.address.display()) , QString(), QString::fromStdString(lastAddr.index), assetTypeToString(lastAddr.assetType)}); generatedAddress_ = lastAddr.address; @@ -1722,6 +1734,18 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq return bs::message::ProcessingResult::Success; } +std::string QtQuickAdapter::hdWalletIdByLeafId(const std::string& walletId) const +{ + for (const auto& hdWallet : hdWallets_) { + for (const auto& leaf : hdWallet.second.leaves) { + if (walletId == leaf.first) { + return hdWallet.first; + } + } + } + return {}; +} + bs::message::ProcessingResult QtQuickAdapter::processUTXOs(bs::message::SeqId msgId , const ArmoryMessage_UTXOs& response) { @@ -1742,22 +1766,40 @@ bs::message::ProcessingResult QtQuickAdapter::processUTXOs(bs::message::SeqId ms catch (const std::exception& e) { logger_->error("[{}] failed to deser UTXO: {}", __func__, e.what()); } - const auto& dummyUTXOs = itReq->second.txReq->dummyUTXOs(); + const auto& dummyUTXOs = itReq->second.txReq->inputs(); auto msgReq = itReq->second.msg.mutable_tx_request(); + std::vector inputs; + std::set inputAddrs; for (const auto& u : dummyUTXOs) { for (const auto& utxo : utxos) { - if ((u.getTxHash() == utxo.getTxHash())) { + logger_->debug("[{}] {}:{} vs {}:{}", __func__, u.txHash.toHexStr(true), u.txOutIndex + , utxo.getTxHash().toHexStr(true), utxo.getTxOutIndex()); + if ((u.txHash == utxo.getTxHash()) && (u.txOutIndex == utxo.getTxOutIndex())) { + try { + inputAddrs.insert(bs::Address::fromUTXO(utxo)); + } + catch (const std::exception&) {} msgReq->add_utxos(utxo.serialize().toBinStr()); + inputs.push_back(utxo); break; } } } + itReq->second.txReq->setInputs(inputs); + logger_->debug("[{}] matched {} UTXOs of {}", __func__, msgReq->utxos_size(), dummyUTXOs.size()); if (msgReq->utxos_size() != dummyUTXOs.size()) { - emit showError(tr("failed to obtain UTXO[s]")); + itReq->second.txReq->setError(tr("Failed to obtain UTXO[s]")); txReqs_.erase(itReq); return bs::message::ProcessingResult::Error; } - msgReq->set_hd_wallet_id(response.wallet_id()); + for (const auto& addr : inputAddrs) { + const auto& itAddr = addressCache_.find(addr); + if (itAddr != addressCache_.end()) { + msgReq->set_hd_wallet_id(itAddr->second); + logger_->debug("[{}] set HD wallet id {} from {}", __func__, msgReq->hd_wallet_id(), addr.display()); + break; + } + } msgId = pushRequest(user_, userWallets_, itReq->second.msg.SerializeAsString()); txReqs_[msgId] = { itReq->second.txReq, itReq->second.isMaxAmount }; txReqs_.erase(itReq); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index b11458b50..4c4337903 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -207,6 +207,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void createWallet(bool primary); std::string hdWalletIdByIndex(int); std::string generateWalletName() const; + std::string hdWalletIdByLeafId(const std::string&) const; void processWalletLoaded(const bs::sync::WalletInfo &); bs::message::ProcessingResult processWalletData(const bs::message::SeqId @@ -288,6 +289,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop std::map txDetailReqs_; std::map settingsCache_; std::set expTxAddrReqs_, expTxAddrInReqs_; + std::map addressCache_; }; #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 42f3e309d..47e8f1e12 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -33,8 +33,7 @@ TxInputsModel::TxInputsModel(const std::shared_ptr& logger : QAbstractTableModel(parent), logger_(logger), outsModel_(outs) , header_{{ColumnAddress, tr("Address/Hash")}, {ColumnTx, tr("#Tx")}, {ColumnComment, tr("Comment")}, {ColumnBalance, tr("Balance (BTC)")}} -{ -} +{} int TxInputsModel::rowCount(const QModelIndex &) const { @@ -118,52 +117,42 @@ void TxInputsModel::clear() void TxInputsModel::addUTXOs(const std::vector& utxos) { - for (const auto& utxo : utxos) { - try { - const auto& addr = bs::Address::fromUTXO(utxo); - utxos_[addr].push_back(utxo); - int addrIndex = -1; - for (int i = 0; i < data_.size(); ++i) { - if (data_.at(i).address == addr) { - addrIndex = i; - break; + QMetaObject::invokeMethod(this, [this, utxos] { + for (const auto& utxo : utxos) { + try { + const auto& addr = bs::Address::fromUTXO(utxo); + utxos_[addr].push_back(utxo); + int addrIndex = -1; + for (int i = 0; i < data_.size(); ++i) { + if (data_.at(i).address == addr) { + addrIndex = i; + break; + } } - } - if (addrIndex < 0) { - QMetaObject::invokeMethod(this, [this, addr] { + if (addrIndex < 0) { beginInsertRows(QModelIndex(), rowCount(), rowCount()); data_.push_back({ addr }); endInsertRows(); emit rowCountChanged(); - waitCond_.wakeAll(); - }); - mutex_.lock(); - waitCond_.wait(&mutex_); - mutex_.unlock(); - } - else { - if (data_.at(addrIndex).expanded) { - QMetaObject::invokeMethod(this, [this, addrIndex, utxo] { + } + else { + if (data_.at(addrIndex).expanded) { beginInsertRows(QModelIndex(), addrIndex + 2, addrIndex + 2); data_.insert(data_.cbegin() + addrIndex + 1, { {}, utxo.getTxHash(), utxo.getTxOutIndex() }); endInsertRows(); emit rowCountChanged(); - waitCond_.wakeAll(); - }); - mutex_.lock(); - waitCond_.wait(&mutex_); - mutex_.unlock(); + } } } + catch (const std::exception&) { + continue; + } } - catch (const std::exception&) { - continue; + if (collectUTXOsForAmount_ > 0) { + collectUTXOsFor(collectUTXOsForAmount_); + collectUTXOsForAmount_ = 0; } - } - if (collectUTXOsForAmount_ > 0) { - collectUTXOsFor(collectUTXOsForAmount_); - collectUTXOsForAmount_ = 0; - } + }); } void TxInputsModel::addEntries(const std::vector& entries) @@ -386,8 +375,9 @@ QUTXOList* TxInputsModel::zcInputs() const { QList result; for (const auto& entry : data_) { - result.push_back(new QUTXO(UTXO(entry.amount, UINT32_MAX, UINT32_MAX - , entry.txOutIndex, entry.txId, BinaryData::fromString("dummy")), (QObject*)this)); + logger_->debug("[{}] {}:{} {}", __func__, entry.txId.toHexStr(true), entry.txOutIndex, entry.amount); + result.push_back(new QUTXO(QUTXO::Input{ entry.txId, entry.amount, entry.txOutIndex } + , (QObject*)this)); } return new QUTXOList(result, (QObject*)this); } @@ -400,7 +390,7 @@ QList TxInputsModel::collectUTXOsFor(double amount) allUTXOs.insert(allUTXOs.cend(), byAddr.second.cbegin(), byAddr.second.cend()); } bs::Address::decorateUTXOs(allUTXOs); - const auto& recipients = outsModel_->recipients(); + const auto& recipients = outsModel_ ? outsModel_->recipients() : decltype(outsModel_->recipients()){}; std::map>> recipientsMap; for (unsigned i = 0; i < recipients.size(); ++i) { recipientsMap[i] = { recipients.at(i) }; diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index 8b706812c..4e090e79c 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -35,10 +35,21 @@ class QUTXO : public QObject public: QUTXO(const UTXO& utxo, QObject* parent = nullptr) : QObject(parent), utxo_(utxo) {} + + struct Input { + BinaryData txHash; + uint64_t amount; + uint32_t txOutIndex; + }; + QUTXO(const Input& input, QObject* parent = nullptr) + : QObject(parent), input_(input) {} + UTXO utxo() const { return utxo_; } + Input input() const { return input_; } private: - const UTXO utxo_; + UTXO utxo_{}; + Input input_{}; }; class QUTXOList : public QObject @@ -62,7 +73,8 @@ class TxInputsModel : public QAbstractTableModel public: enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole, SelectedRole, ExpandedRole, CanBeExpandedRole }; - TxInputsModel(const std::shared_ptr&, TxOutputsModel*, QObject* parent = nullptr); + TxInputsModel(const std::shared_ptr&, TxOutputsModel* + , QObject* parent = nullptr); int rowCount(const QModelIndex & = QModelIndex()) const override; int columnCount(const QModelIndex & = QModelIndex()) const override; @@ -126,10 +138,6 @@ class TxInputsModel : public QAbstractTableModel QString fee_; uint32_t topBlock_{ 0 }; double collectUTXOsForAmount_{ 0 }; - - QMutex mutex_; - QWaitCondition waitCond_; - }; #endif // TX_INPUTS_MODEL_H diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 1fd0169f1..523bbb111 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -664,8 +664,9 @@ void QTxDetails::setDetails(const bs::sync::TXWalletDetails& details) ownOutputs_ = new TxInputsModel(logger_, outputsModel, this); outputs_.clear(); outputs_.reserve(details.inputAddresses.size()); + const auto& txId = details_.tx.isInitialized() ? details_.tx.getThisHash() : BinaryData{}; for (const auto& out : details.outputAddresses) { - outputs_.push_back({ out.address, out.outHash, out.outIndex, out.value }); + outputs_.push_back({ out.address, txId, out.outIndex, out.value }); } QMetaObject::invokeMethod(this, [this, inputs] { ownInputs_->addEntries(inputs); diff --git a/GUI/QtQuick/qml/Send/SignTransaction.qml b/GUI/QtQuick/qml/Send/SignTransaction.qml index e7cd5a9f4..26372dcc9 100644 --- a/GUI/QtQuick/qml/Send/SignTransaction.qml +++ b/GUI/QtQuick/qml/Send/SignTransaction.qml @@ -332,13 +332,13 @@ ColumnLayout { CustomButton { id: broadcast_but - text: qsTr("Broadcast") + text: txSignRequest.hasError ? txSignRequest.errorText : qsTr("Broadcast") width: 532 Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - enabled: (txSignRequest.isHWW && txSignRequest.isHWWready) || password.value.length + enabled: !txSignRequest.hasError && ((txSignRequest.isHWW && txSignRequest.isHWWready) || password.value.length) Component.onCompleted: { broadcast_but.preferred = true diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml index d877970ae..dbd589b81 100644 --- a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -64,7 +64,7 @@ ColumnLayout { height: parent.height - 24 anchors.centerIn: parent - model: isRBF ? tx.ownInputs : isCPFP ? tx.ownOutputs : txInputsSelectedModel + model: txSignRequest.inputs columnWidths: [0.7, 0.1, 0, 0.2] copy_button_column_index: -1 @@ -377,13 +377,13 @@ ColumnLayout { CustomButton { id: broadcast_but - text: qsTr("Broadcast") + text: txSignRequest.hasError ? txSignRequest.errorText : qsTr("Broadcast") width: 1084 Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - enabled: (txSignRequest.isHWW && txSignRequest.isHWWready) || password.value.length + enabled: !txSignRequest.hasError && ((txSignRequest.isHWW && txSignRequest.isHWWready) || password.value.length) Component.onCompleted: { broadcast_but.preferred = true diff --git a/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml b/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml index 3e638cd1d..bc991c247 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml @@ -28,7 +28,7 @@ CustomContextMenu { Action { text: qsTr("RBF") enabled: model.data(model.index(context_menu.row, context_menu.column), TxListModel.RBFRole) - //&& (model.data(model.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) + && (model.data(model.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) onTriggered: { var txId = model.data(model.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) context_menu.openSend(txId, true, false) @@ -37,7 +37,7 @@ CustomContextMenu { Action { text: qsTr("CPFP") - enabled: true//(model.data(model.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) + enabled: (model.data(model.index(context_menu.row, context_menu.column), TxListModel.NbConfRole) === 0) onTriggered: { var txId = model.data(model.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) context_menu.openSend(txId, false, true) diff --git a/common b/common index d78819f1d..ee8d404e7 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit d78819f1df04d0cec57e240f6ff9c6f1fb8312ef +Subproject commit ee8d404e7abad4bc8b2bcaf56f0c7c3880182842 From def06ee6800d1d84b46ebd0fe98e21a2420ac2ca Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 3 Mar 2023 22:20:03 +0200 Subject: [PATCH 194/436] qml: fixcombo box fee suggestions --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 14 +++++++------- GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 9 +++++++++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 5 +++-- GUI/QtQuick/qml/main.qml | 2 +- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 17d70632b..8ec8246af 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -190,7 +190,6 @@ ColumnLayout { onActivated: (index_act) => { if (rec_addr_input.isValid) { - var fpb = parseFloat(fee_suggest_combo.currentValue) create_temp_request() } @@ -225,7 +224,7 @@ ColumnLayout { else if (isCPFP) { } else { - txInputsModel.fee = parseFloat(fee_suggest_combo.currentValue) + txInputsModel.fee = parseFloat(fee_suggest_combo.edit_value()) bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) txOutputsModel.clearOutputs() } @@ -531,29 +530,30 @@ ColumnLayout { function click_enter() { + console.log ("fees = " + parseFloat(fee_suggest_combo.edit_value())) if (isRBF) { layout.sig_continue( bsApp.createTXSignRequest(-1 //special index for RBF mode , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() - , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text + , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text , checkbox_rbf.checked, tx.ownInputs.zcInputs()) ) } else if (isCPFP) { layout.sig_continue( bsApp.createTXSignRequest(-2 //special index for CPFP mode , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() - , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text + , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text , checkbox_rbf.checked, tx.ownOutputs.zcInputs()) ) } else { // normal operation if (table_sel_inputs.rowCount) { layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() - , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text + , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text , checkbox_rbf.checked, txInputsModel.getSelection()) ) } else { layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() - , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text) ) + , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text) ) } } } @@ -584,7 +584,7 @@ ColumnLayout { function create_temp_request() { if (rec_addr_input.isValid) { - var fpb = parseFloat(fee_suggest_combo.currentValue) + var fpb = parseFloat(fee_suggest_combo.edit_value()) tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) } diff --git a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml index 7060d4002..5b6a8231c 100644 --- a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml +++ b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml @@ -66,6 +66,15 @@ CustomComboBox { return res } + function edit_value() + { + var res = fee_suggest_combo.input_text + var index = res.indexOf(":") + res = res.slice(index+2) + res = res.replace(" s/b", "") + return res + } + property string prev_text : fee_suggest_combo.currentText onTextEdited : { if (!fee_suggest_combo.input_accept_input) diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 21d6e01b0..3c0905b84 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -187,9 +187,10 @@ ColumnLayout { } function click_enter() { + console.log ("fees = " + parseFloat(fee_suggest_combo.edit_value())) layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex , [rec_addr_input.input_text], [parseFloat(amount_input.input_text)] - , parseFloat(fee_suggest_combo.currentValue), comment_input.input_text)) + , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text)) } } @@ -222,7 +223,7 @@ ColumnLayout { function create_temp_request() { if (rec_addr_input.isValid) { - var fpb = parseFloat(fee_suggest_combo.currentValue) + var fpb = parseFloat(fee_suggest_combo.edit_value()) tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 0427ca9e2..f68bd59a7 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -106,7 +106,7 @@ ApplicationWindow { { //ibFailure.displayMessage(text) error_dialog.error = text - error_dialog.open() + show_popup(error_dialog) } } From 5e47d9995244dfccf2a435de6ad3c3246f3f0848 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 3 Mar 2023 23:51:51 +0200 Subject: [PATCH 195/436] qml: fixcombo box fee suggestions --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 6 +++++- GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 11 +++++++++-- GUI/QtQuick/qml/Send/SimpleDetails.qml | 6 +++++- GUI/QtQuick/qml/StyledControls/CustomComboBox.qml | 5 +++++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 8ec8246af..7947c2241 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -530,7 +530,11 @@ ColumnLayout { function click_enter() { - console.log ("fees = " + parseFloat(fee_suggest_combo.edit_value())) + if (!fee_suggest_combo.edit_value()) + { + fee_suggest_combo.input_text = fee_suggest_combo.currentText + } + if (isRBF) { layout.sig_continue( bsApp.createTXSignRequest(-1 //special index for RBF mode , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() diff --git a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml index 5b6a8231c..87ec872f8 100644 --- a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml +++ b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml @@ -62,7 +62,7 @@ CustomComboBox { var index = res.indexOf(":") res = res.slice(0, index+2) res = res.replace("(", "\\(").replace(")", "\\)") - res = res + "\\d+\\.?\\d{0,1} s\/b" + res = res + "\\d*\\.?\\d? s\/b" return res } @@ -79,9 +79,16 @@ CustomComboBox { onTextEdited : { if (!fee_suggest_combo.input_accept_input) { - fee_suggest_combo.input_text = prev_text + fee_suggest_combo.input_text = prev_text } prev_text = fee_suggest_combo.input_text } + + onEditingFinished : { + if (!edit_value()) + { + fee_suggest_combo.input_text = fee_suggest_combo.currentText + } + } } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 3c0905b84..b85b3da65 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -187,7 +187,11 @@ ColumnLayout { } function click_enter() { - console.log ("fees = " + parseFloat(fee_suggest_combo.edit_value())) + if (!fee_suggest_combo.edit_value()) + { + fee_suggest_combo.input_text = fee_suggest_combo.currentText + } + layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex , [rec_addr_input.input_text], [parseFloat(amount_input.input_text)] , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text)) diff --git a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml index df8ac3f44..7ea5bda43 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml @@ -26,6 +26,7 @@ ComboBox { property alias input_text: input.text signal textEdited() + signal editingFinished() activeFocusOnTab: true @@ -99,6 +100,10 @@ ComboBox { onTextEdited : { control.textEdited() } + + onEditingFinished : { + control.editingFinished() + } } } From 244f29f6c440ebe15c6edbf25446d1ff202f2293 Mon Sep 17 00:00:00 2001 From: YZ Date: Sun, 5 Mar 2023 02:33:56 +0100 Subject: [PATCH 196/436] Sorting --- GUI/QtQuick/AddressFilterModel.cpp | 4 ++-- GUI/QtQuick/PendingTransactionFilterModel.cpp | 7 +++++++ GUI/QtQuick/PendingTransactionFilterModel.h | 1 + GUI/QtQuick/TransactionFilterModel.cpp | 9 +++++++++ GUI/QtQuick/TransactionFilterModel.h | 1 + GUI/QtQuick/qml/TransactionDetails.qml | 2 +- GUI/QtQuick/qml/TransactionsPage.qml | 3 +++ 7 files changed, 24 insertions(+), 3 deletions(-) diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp index 81c20dbd8..bf5a55a03 100644 --- a/GUI/QtQuick/AddressFilterModel.cpp +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -24,7 +24,7 @@ bool AddressFilterModel::filterAcceptsRow(int source_row, const QModelIndex& sou const auto txCountIndex = sourceModel()->index(source_row, 1); const auto bananceIndex = sourceModel()->index(source_row, 2); if (sourceModel()->data(txCountIndex, QmlAddressListModel::TableRoles::TableDataRole) != 0 && - qFuzzyCompare(sourceModel()->data(bananceIndex, QmlAddressListModel::TableRoles::TableDataRole).toFloat(), 0.0f)) + qFuzzyIsNull(sourceModel()->data(bananceIndex, QmlAddressListModel::TableRoles::TableDataRole).toDouble())) { return false; } @@ -32,7 +32,7 @@ bool AddressFilterModel::filterAcceptsRow(int source_row, const QModelIndex& sou if (hideEmpty_) { const auto bananceIndex = sourceModel()->index(source_row, 2); - if (qFuzzyCompare(sourceModel()->data(bananceIndex, QmlAddressListModel::TableRoles::TableDataRole).toFloat(), 0.0f)) + if (qFuzzyIsNull(sourceModel()->data(bananceIndex, QmlAddressListModel::TableRoles::TableDataRole).toDouble())) { return false; } diff --git a/GUI/QtQuick/PendingTransactionFilterModel.cpp b/GUI/QtQuick/PendingTransactionFilterModel.cpp index 7b856318c..fa5060f14 100644 --- a/GUI/QtQuick/PendingTransactionFilterModel.cpp +++ b/GUI/QtQuick/PendingTransactionFilterModel.cpp @@ -14,6 +14,8 @@ PendingTransactionFilterModel::PendingTransactionFilterModel(QObject* parent) : QSortFilterProxyModel(parent) { + setDynamicSortFilter(true); + sort(0, Qt::AscendingOrder); } bool PendingTransactionFilterModel::filterAcceptsRow(int source_row, @@ -28,3 +30,8 @@ bool PendingTransactionFilterModel::filterAcceptsRow(int source_row, return true; } +bool PendingTransactionFilterModel::lessThan(const QModelIndex& left, const QModelIndex& right) const +{ + return sourceModel()->data(sourceModel()->index(left.row(), 5), TxListModel::TableRoles::TableDataRole) < + sourceModel()->data(sourceModel()->index(right.row(), 5), TxListModel::TableRoles::TableDataRole); +} diff --git a/GUI/QtQuick/PendingTransactionFilterModel.h b/GUI/QtQuick/PendingTransactionFilterModel.h index f2c11ec06..7e109403a 100644 --- a/GUI/QtQuick/PendingTransactionFilterModel.h +++ b/GUI/QtQuick/PendingTransactionFilterModel.h @@ -23,6 +23,7 @@ class PendingTransactionFilterModel: public QSortFilterProxyModel protected: bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; + bool lessThan(const QModelIndex& left, const QModelIndex& right) const override; }; #endif // PENDING_TRANSACTION_FILTER_MODEL_H diff --git a/GUI/QtQuick/TransactionFilterModel.cpp b/GUI/QtQuick/TransactionFilterModel.cpp index dfbb1adb4..0e3709ffb 100644 --- a/GUI/QtQuick/TransactionFilterModel.cpp +++ b/GUI/QtQuick/TransactionFilterModel.cpp @@ -10,10 +10,13 @@ */ #include "TransactionFilterModel.h" #include "TxListModel.h" +#include TransactionFilterModel::TransactionFilterModel(QObject* parent) : QSortFilterProxyModel(parent) { + setDynamicSortFilter(true); + sort(0, Qt::AscendingOrder); connect(this, &TransactionFilterModel::changed, this, &TransactionFilterModel::invalidate); } @@ -63,3 +66,9 @@ void TransactionFilterModel::setTransactionType(const QString& type) transactionType_ = type; emit changed(); } + +bool TransactionFilterModel::lessThan(const QModelIndex& left, const QModelIndex& right) const +{ + return sourceModel()->data(sourceModel()->index(left.row(), 5), TxListModel::TableRoles::TableDataRole) < + sourceModel()->data(sourceModel()->index(right.row(), 5), TxListModel::TableRoles::TableDataRole); +} diff --git a/GUI/QtQuick/TransactionFilterModel.h b/GUI/QtQuick/TransactionFilterModel.h index b6484d2e7..c2b9eae67 100644 --- a/GUI/QtQuick/TransactionFilterModel.h +++ b/GUI/QtQuick/TransactionFilterModel.h @@ -33,6 +33,7 @@ class TransactionFilterModel: public QSortFilterProxyModel protected: bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; + bool lessThan(const QModelIndex & left, const QModelIndex & right) const override; private: QString walletName_; diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index b1a8f0854..576f96d02 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -58,7 +58,7 @@ Popup { spacing: 20 Label { - text: qsTr("Transactions details") + text: qsTr("Transaction details") color: BSStyle.textColor font.pixelSize: 19 font.weight: Font.Medium diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index abe28d6fc..583fbc310 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -96,6 +96,7 @@ Item { onActivated: (index) => { transactionModel.walletName = index == 0 ? "" : txWalletsComboBox.currentValue + tableView.update() } } @@ -111,6 +112,7 @@ Item { onActivated: (index) => { transactionModel.transactionType = index == 0 ? "" : txTypesComboBox.currentValue + tableView.update() } } @@ -159,6 +161,7 @@ Item { } CustomTableView { + id: tableView width: parent.width height: parent.height - transaction_header_menu.height - transaction_header_menu.spacing - 1 model: transactionModel From 7a0beaca42286da38f117d9f628a7866762d7963 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 6 Mar 2023 17:38:35 +0300 Subject: [PATCH 197/436] RBF is functional --- GUI/QtQuick/QtQuickAdapter.cpp | 25 +++++++++++---- GUI/QtQuick/QtQuickAdapter.h | 1 + GUI/QtQuick/TxInputsModel.cpp | 3 ++ GUI/QtQuick/TxListModel.cpp | 37 ++++++++++++++++++++-- GUI/QtQuick/TxListModel.h | 3 ++ GUI/QtQuick/qml/Overview/OverviewPanel.qml | 1 - GUI/QtQuick/qml/TransactionDetails.qml | 3 +- GUI/QtQuick/qml/TransactionsPage.qml | 1 - common | 2 +- 9 files changed, 63 insertions(+), 13 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index b29299656..ee238079d 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1055,7 +1055,12 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId const auto& itTxDet = txDetailReqs_.find(msgId); if (itTxDet == txDetailReqs_.end()) { - txModel_->setDetails(txDet); + if (txDet.direction == bs::sync::Transaction::Direction::Revoke) { + txModel_->removeTX(txDet.txHash); + } + else { + txModel_->setDetails(txDet); + } } else { itTxDet->second->setDetails(txDet); // shouldn't be more than one entry @@ -1264,7 +1269,6 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri if (walletIndex >= 0) { msgReq->set_hd_wallet_id(hdWalletIdByIndex(walletIndex)); } - logger_->debug("[{}] walletIdx={}", __func__, walletIndex); bool isMaxAmount = false; if (recvAddrs.isEmpty()) { const auto& recipients = txOutputsModel_->recipients(); @@ -1329,7 +1333,12 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri if (msgWltIds) { for (const auto& wallet : hdWallets_) { for (const auto& leaf : wallet.second.leaves) { - msgWltIds->add_wallet_ids(leaf.first); + auto leafId = leaf.first; + msgWltIds->add_wallet_ids(leafId); + for (auto& c : leafId) { + c = std::toupper(c); + } + msgWltIds->add_wallet_ids(leafId); } } const auto msgId = pushRequest(user_, userBlockchain_, msgSpendable.SerializeAsString()); @@ -1603,11 +1612,14 @@ ProcessingResult QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMess ProcessingResult QtQuickAdapter::processZCInvalidated(const ArmoryMessage_ZCInvalidated& zcInv) { - std::vector txHashes; for (const auto& hashStr : zcInv.tx_hashes()) { - txHashes.push_back(BinaryData::fromString(hashStr)); + const auto& txHash = BinaryData::fromString(hashStr); + WalletsMessage msg; + auto msgReq = msg.mutable_tx_details_request(); + auto txReq = msgReq->add_requests(); + txReq->set_tx_hash(txHash.toBinStr()); + pushRequest(user_, userWallets_, msg.SerializeAsString()); } - //TODO return ProcessingResult::Success; } @@ -2007,6 +2019,7 @@ void QtQuickAdapter::notifyNewTransaction(const bs::TXEntry& tx) const auto txId = QString::fromStdString(tx.txHash.toHexStr(true)); auto txDetails = getTXDetails(txId); connect(txDetails, &QTxDetails::updated, this, [txDetails, tx, this](){ + logger_->debug("[QtQuickAdapter::notifyNewTransaction] {}: {}", txDetails->txId().toStdString(), txDetails->timestamp().toStdString()); showNotification( tr("BlockSettle Terminal"), tr("%1: %2\n%3: %4\n%5: %6\n%7: %8\n").arg( diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 4c4337903..836135d99 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -290,6 +290,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop std::map settingsCache_; std::set expTxAddrReqs_, expTxAddrInReqs_; std::map addressCache_; + std::set rmTxOnInvalidation_; }; #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 47e8f1e12..ef1437dd6 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -157,6 +157,9 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) void TxInputsModel::addEntries(const std::vector& entries) { + if (entries.empty()) { + return; + } beginInsertRows(QModelIndex(), rowCount(), rowCount() + entries.size() - 1); data_.insert(data_.cend(), entries.cbegin(), entries.cend()); endInsertRows(); diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 914e1c2b0..a43d8870d 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -291,6 +291,33 @@ void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet) } } +void TxListModel::removeTX(const BinaryData& txHash) +{ + int rowStart = -1, rowEnd = -1; + for (int i = 0; i < data_.size(); ++i) { + const auto& entry = data_.at(i); + if (entry.txHash == txHash) { + if (rowStart < 0) { + rowStart = i; + } + rowEnd = i; + } + } + if ((rowEnd < 0) || (rowStart < 0)) { + logger_->warn("[{}] TX {} not found", __func__, txHash.toHexStr(true)); + return; + } + logger_->debug("[{}] {}: start: {}, end: {}", __func__, txHash.toHexStr(true), rowStart, rowEnd); + QMetaObject::invokeMethod(this, [this, rowStart, rowEnd] { + beginRemoveRows(QModelIndex(), rowStart, rowEnd); + data_.erase(data_.cbegin() + rowStart, data_.cbegin() + rowEnd + 1); + for (int i = rowEnd + 1; i < txDetails_.size(); i++) { + txDetails_[i - (rowEnd - rowStart) - 1] = std::move(txDetails_[i]); + } + endRemoveRows(); + }); +} + void TxListModel::setCurrentBlock(uint32_t nbBlock) { if (!nbBlock) { @@ -663,8 +690,8 @@ QString QTxDetails::virtSize() const QString QTxDetails::nbConf() const { - const int txHeight = details_.tx.getTxHeight(); - return displayNb((txHeight > 0) ? curBlock_ - txHeight + 1 : txHeight); + const auto txHeight = details_.tx.getTxHeight(); + return (txHeight != UINT32_MAX) ? displayNb(curBlock_ - txHeight + 1) : tr("-"); } QString QTxDetails::nbInputs() const @@ -723,6 +750,12 @@ QString QTxDetails::feePerByte() const return displayBTC(amount / txWeight, 1); } +QString QTxDetails::timestamp() const +{ + return QDateTime::fromSecsSinceEpoch(details_.tx.getTxTime()) + .toString(gui_utils::dateTimeFormat); +} + quint32 QTxDetails::height() const { return details_.tx.getTxHeight(); diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 4d3451f63..528cc8ded 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -49,6 +49,7 @@ class TxListModel : public QAbstractTableModel void clear(); void setTxComment(const std::string& txHash, const std::string& comment); void setDetails(const bs::sync::TXWalletDetails&); + void removeTX(const BinaryData& txHash); void setCurrentBlock(uint32_t); signals: @@ -193,6 +194,8 @@ class QTxDetails : public QObject QString feePerByte() const; Q_PROPERTY(quint32 height READ height NOTIFY updated) quint32 height() const; + Q_PROPERTY(QString timestamp READ timestamp NOTIFY updated) + QString timestamp() const; Q_PROPERTY(TxInOutModel* inputs READ inputs NOTIFY updated) TxInOutModel* inputs() const { return inputsModel_; } diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 7c0b38a22..74c9511e9 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -208,7 +208,6 @@ Rectangle { transactionDetails.txTypeColor = model.data(model.index(row, 2), TxListModel.ColorRole) transactionDetails.txComment = model.data(model.index(row, 7), TxListModel.TableDataRole) transactionDetails.txAmount = model.data(model.index(row, 4), TxListModel.TableDataRole) - transactionDetails.txConfirmations = model.data(model.index(row, 5), TxListModel.TableDataRole) transactionDetails.txConfirmationsColor = model.data(model.index(row, 5), TxListModel.ColorRole) transactionDetails.tx = bsApp.getTXDetails(txHash) transactionDetails.open() diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index 576f96d02..68f8b9838 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -28,7 +28,6 @@ Popup { property string txType: '' property color txTypeColor property string txComment: '' - property string txConfirmations: '' property color txConfirmationsColor width: 916 @@ -195,7 +194,7 @@ Popup { width: 170 } Label { - text: txConfirmations + text: transaction_details.nbConf color: txConfirmationsColor font.family: "Roboto" font.pixelSize: 14 diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index bf06c1d70..3d1d281fd 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -180,7 +180,6 @@ Item { transactionDetails.txTypeColor = model.data(model.index(row, 2), TxListModel.ColorRole) transactionDetails.txComment = model.data(model.index(row, 7), TxListModel.TableDataRole) transactionDetails.txAmount = model.data(model.index(row, 4), TxListModel.TableDataRole) - transactionDetails.txConfirmations = model.data(model.index(row, 5), TxListModel.TableDataRole) transactionDetails.txConfirmationsColor = model.data(model.index(row, 5), TxListModel.ColorRole) transactionDetails.tx = bsApp.getTXDetails(txHash) transactionDetails.open() diff --git a/common b/common index ee8d404e7..e3fcfaf4e 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit ee8d404e7abad4bc8b2bcaf56f0c7c3880182842 +Subproject commit e3fcfaf4e1d6d4b8e3f688bdcbef940e939f70a8 From 4dff03fd098c73fbf34b4b5193b0290c8514217b Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 6 Mar 2023 17:50:17 +0300 Subject: [PATCH 198/436] fixup --- GUI/QtQuick/qml/TransactionDetails.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index 68f8b9838..f9b21d744 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -194,7 +194,7 @@ Popup { width: 170 } Label { - text: transaction_details.nbConf + text: tx.nbConf color: txConfirmationsColor font.family: "Roboto" font.pixelSize: 14 From fd9411dc7f289fbdd2f09bcb6240af2216b482dc Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 6 Mar 2023 17:56:14 +0300 Subject: [PATCH 199/436] TX height fix --- GUI/QtQuick/TxListModel.cpp | 7 ++++--- GUI/QtQuick/TxListModel.h | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index a43d8870d..093d2ad74 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -691,7 +691,7 @@ QString QTxDetails::virtSize() const QString QTxDetails::nbConf() const { const auto txHeight = details_.tx.getTxHeight(); - return (txHeight != UINT32_MAX) ? displayNb(curBlock_ - txHeight + 1) : tr("-"); + return (txHeight != UINT32_MAX) ? displayNb(curBlock_ - txHeight + 1) : displayNb(0); } QString QTxDetails::nbInputs() const @@ -756,9 +756,10 @@ QString QTxDetails::timestamp() const .toString(gui_utils::dateTimeFormat); } -quint32 QTxDetails::height() const +QString QTxDetails::height() const { - return details_.tx.getTxHeight(); + return (details_.tx.getTxHeight() != UINT32_MAX) ? displayNb(details_.tx.getTxHeight()) + : tr("-"); } bs::sync::Transaction::Direction QTxDetails::direction() const diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 528cc8ded..743575b49 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -192,8 +192,8 @@ class QTxDetails : public QObject QString fee() const; Q_PROPERTY(QString feePerByte READ feePerByte NOTIFY updated) QString feePerByte() const; - Q_PROPERTY(quint32 height READ height NOTIFY updated) - quint32 height() const; + Q_PROPERTY(QString height READ height NOTIFY updated) + QString height() const; Q_PROPERTY(QString timestamp READ timestamp NOTIFY updated) QString timestamp() const; From 984b5ffcb77c018b8cbf1a316526059d4779031e Mon Sep 17 00:00:00 2001 From: YZ Date: Tue, 7 Mar 2023 01:51:36 +0100 Subject: [PATCH 200/436] Wallet properties fixes --- GUI/QtQuick/QtQuickAdapter.cpp | 1 - GUI/QtQuick/qml/BsStyles/BSStyle.qml | 3 +- .../qml/StyledControls/CustomListItem.qml | 4 +- .../WalletProperties/ExportWOWalletAuth.qml | 95 ------------------- .../WalletPropertiesPopup.qml | 45 ++------- GUI/QtQuick/qtquick.qrc | 1 - GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 5 - GUI/QtQuick/viewmodels/WalletPropertiesVM.h | 3 - 8 files changed, 14 insertions(+), 143 deletions(-) delete mode 100644 GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index b29299656..411631df1 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -870,7 +870,6 @@ void QtQuickAdapter::walletSelected(int index) if (hdWallets_.count(walletId) > 0) { walletPropertiesModel_->setWalletInfo({ QString::fromStdString(hdWallets_.at(walletId).name), - QString::fromStdString(hdWallets_.at(walletId).description), QString::fromStdString(walletId), QString::fromLatin1("1/") + QString::number(hdWallets_.at(walletId).leaves.size()), hdWallets_.at(walletId).encryptionTypes.size() > 0 diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index c6c04443d..7ba26a3dd 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -118,7 +118,8 @@ QtObject { readonly property color balanceValueTextColor: "#E2E7FF" readonly property color addressesPanelBackgroundColor: "#333C435A" - readonly property color listItemBorderColor: "#3C435A" + readonly property color listItemBorderColor: defaultGreyColor + readonly property color listItemHoveredBorderColor: wildBlueColor readonly property color popupBackgroundColor: "#191E2A" readonly property color popupBorderColor: defaultGreyColor diff --git a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml index e93d04761..c6349a124 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml @@ -37,7 +37,7 @@ Rectangle { opacity: 1 radius: 14 - border.color: BSStyle.listItemBorderColor + border.color: mouseArea.containsMouse ? BSStyle.listItemHoveredBorderColor : BSStyle.listItemBorderColor border.width: 1 Image { @@ -92,7 +92,9 @@ Rectangle { } MouseArea { + id: mouseArea anchors.fill: parent + hoverEnabled: true propagateComposedEvents: true onClicked: { if (isButton) diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml deleted file mode 100644 index 347faf3d0..000000000 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWalletAuth.qml +++ /dev/null @@ -1,95 +0,0 @@ -import QtQuick 2.12 -import QtQuick.Window 2.12 -import QtQuick.Controls 2.12 -import QtQuick.Layouts 1.15 - -import "../BsStyles" -import "../StyledControls" - -ColumnLayout { - id: layout - - height: 548 - width: 580 - - spacing: 0 - - property var wallet_properties_vm - signal authorized() - - CustomTitleLabel { - id: title - Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : title.height - text: qsTr("Export watching-only wallet") - } - - CustomTextInput { - id: password - - Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 - - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 - - title_text: qsTr("Password") - - Component.onCompleted: { - password.isPassword = true - password.isHiddenText = true - } - } - - Label { - id: spacer - Layout.fillWidth: true - Layout.fillHeight: true - } - - CustomButton { - id: confirm_but - text: qsTr("Continue") - preferred: true - - Layout.bottomMargin: 40 - Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - - width: 530 - enabled: (password.input_text !== "") - - function click_enter() { - const result = bsApp.exportWalletAuth( - wallet_properties_vm.walletId, - password.input_text - ) - if (result === 0) { - authorized() - clear() - } - } - } - - Keys.onEnterPressed: { - confirm_but.click_enter() - } - - Keys.onReturnPressed: { - confirm_but.click_enter() - } - - function init() - { - clear() - password.setActiveFocus() - } - - function clear() - { - password.isValid = true - password.input_text = "" - } -} diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 017b26b1d..4eb1c4860 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -23,14 +23,6 @@ CustomPopup { wallet_properties_vm: root.wallet_properties_vm } - ExportWOWalletAuth { - id: export_wo_wallet_auth - visible: false - onAuthorized: _stack_view.replace(export_wo_wallet) - - wallet_properties_vm: root.wallet_properties_vm - } - ExportWOWallet { id: export_wo_wallet visible: false @@ -134,14 +126,14 @@ CustomPopup { width: parent.width Text { - text: qsTr("Description") + text: qsTr("Encryption") color: BSStyle.titleTextColor font.family: "Roboto" font.pixelSize: 14 width: parent.width / 2 } Text { - text: wallet_properties_vm.walletDescription + text: wallet_properties_vm.walletEncryption color: BSStyle.textColor font.family: "Roboto" font.pixelSize: 14 @@ -203,26 +195,6 @@ CustomPopup { width: parent.width / 2 height: parent.height - Row { - width: parent.width - - Text { - text: qsTr("Encryption") - color: BSStyle.titleTextColor - font.family: "Roboto" - font.pixelSize: 14 - width: parent.width / 2 - } - Text { - text: wallet_properties_vm.walletEncryption - color: BSStyle.textColor - font.family: "Roboto" - font.pixelSize: 14 - width: parent.width / 2 - horizontalAlignment: Text.AlignRight - } - } - Row { width: parent.width @@ -293,7 +265,7 @@ CustomPopup { CustomListItem { width: parent.width - enabled: !wallet_properties_vm.isHardware + visible: (!wallet_properties_vm.isHardware && !wallet_properties_vm.isWatchingOnly) isButton: true @@ -301,7 +273,10 @@ CustomPopup { icon_add_source: "qrc:/images/arrow.png" title_text: qsTr("Change password") - onClicked: _stack_view.push(change_password) + onClicked: { + _stack_view.push(change_password) + change_password.init() + } } CustomListItem { @@ -313,15 +288,14 @@ CustomPopup { title_text: qsTr("Export watching-only wallet") onClicked: { - _stack_view.push(export_wo_wallet_auth) - export_wo_wallet_auth.init() + _stack_view.push(export_wo_wallet) } } CustomListItem { width: parent.width isButton: true - enabled: !wallet_properties_vm.isHardware + visible: (!wallet_properties_vm.isHardware && !wallet_properties_vm.isWatchingOnly) icon_source: "qrc:/images/shield_icon.svg" icon_add_source: "qrc:/images/arrow.png" @@ -347,7 +321,6 @@ CustomPopup { CustomListItem { width: parent.width isButton: true - enabled: wallet_properties_vm.isWatchingOnly || wallet_properties_vm.isHardware icon_source: "qrc:/images/delete_icon.svg" icon_add_source: "qrc:/images/arrow.png" diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 18495700a..d357be671 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -177,7 +177,6 @@ qml/WalletProperties/DeleteWallet.qml qml/WalletProperties/DeleteWalletWarn.qml qml/WalletProperties/ExportWOWallet.qml - qml/WalletProperties/ExportWOWalletAuth.qml qml/WalletProperties/WalletSeed.qml qml/WalletProperties/WalletSeedAuth.qml images/wallet_icon_warn.svg diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index f83792172..b22c3e21a 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -55,11 +55,6 @@ const QString& WalletPropertiesVM::walletName() const return info_.name; } -const QString& WalletPropertiesVM::walletDescription() const -{ - return info_.description; -} - const QString& WalletPropertiesVM::walletId() const { return info_.walletId; diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h index 7a8d810fc..7218c22dd 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h @@ -18,7 +18,6 @@ namespace qtquick_gui struct WalletInfo { QString name; - QString description; QString walletId; QString groups; QString ecryption; @@ -31,7 +30,6 @@ class WalletPropertiesVM: public QObject { Q_OBJECT Q_PROPERTY(QString walletName READ walletName NOTIFY changed) - Q_PROPERTY(QString walletDescription READ walletDescription NOTIFY changed) Q_PROPERTY(QString walletId READ walletId NOTIFY changed) Q_PROPERTY(QString walletGroups READ walletGroups NOTIFY changed) Q_PROPERTY(QString walletEncryption READ walletEncryption NOTIFY changed) @@ -52,7 +50,6 @@ class WalletPropertiesVM: public QObject void setNbUTXOs(const std::string& walletId, uint32_t nb); const QString& walletName() const; - const QString& walletDescription() const; const QString& walletId() const; const QString& walletGroups() const; const QString& walletEncryption() const; From 969b80020bfaa48d081ddafb6b90e901e602a61e Mon Sep 17 00:00:00 2001 From: YZ Date: Tue, 7 Mar 2023 02:57:23 +0100 Subject: [PATCH 201/436] Focus fix --- GUI/QtQuick/qml/StyledControls/CustomListItem.qml | 3 ++- GUI/QtQuick/qml/WalletProperties/ChangePassword.qml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml index c6349a124..f8d01fdf1 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml @@ -99,7 +99,8 @@ Rectangle { onClicked: { if (isButton) rect.clicked() - mouse.accepted = false + else + mouse.accepted = false } } } diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml index 4a43d9df7..7d44b6259 100644 --- a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -102,6 +102,7 @@ ColumnLayout { enabled: (password.input_text !== "") && (new_password.input_text != "") && (confirm_password.input_text !== "") + && (password.input_text == confirm_password.input_text !== "") function click_enter() { const result = bsApp.changePassword( From 287d7f012028e732ee950d08837d43d517938877 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Tue, 7 Mar 2023 14:50:45 +0200 Subject: [PATCH 202/436] qml: export wo wallet: design matches figma --- GUI/QtQuick/qml/BsStyles/BSStyle.qml | 3 +- .../qml/WalletProperties/ExportWOWallet.qml | 75 ++++++++++++++----- .../WalletPropertiesPopup.qml | 1 + 3 files changed, 59 insertions(+), 20 deletions(-) diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index 7ba26a3dd..7861d5642 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -81,6 +81,7 @@ QtObject { //new properties readonly property color defaultGreyColor: "#3C435A" readonly property color wildBlueColor: "#7A88B0" + readonly property color titanWhiteColor: "#E2E7FF" readonly property color buttonsStandardColor: defaultGreyColor readonly property color buttonsStandardPressedColor: "#232734" @@ -115,7 +116,7 @@ QtObject { readonly property color tableCellBackgroundColor: "transparent" readonly property color tableCellSelectedBackgroundColor: "#22293B" - readonly property color balanceValueTextColor: "#E2E7FF" + readonly property color balanceValueTextColor: titanWhiteColor readonly property color addressesPanelBackgroundColor: "#333C435A" readonly property color listItemBorderColor: defaultGreyColor diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml index 12057dd3e..ad6769f05 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -24,16 +24,13 @@ ColumnLayout { text: qsTr("Export watching-only wallet") } - Item { - width: parent.width - height: 24 - } - Rectangle { width: 530 height: 82 radius: 14 color: BSStyle.exportWalletLabelBackground + + Layout.topMargin: 24 Layout.alignment: Qt.AlignCenter Grid { @@ -80,33 +77,73 @@ ColumnLayout { } } - Item { - width: parent.width - height: 32 - } + Label { + + Layout.leftMargin: 24 + Layout.rightMargin: 24 + Layout.topMargin: 32 + Layout.preferredHeight: 16 + Layout.fillWidth: true + Layout.alignment: Qt.AlignLeft | Qt.AlingTop - CustomTitleLabel { - width: 530 font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + text: qsTr("Backup file:") - leftPadding: 24 + color: BSStyle.wildBlueColor } - CustomTitleLabel { + Label { + + Layout.leftMargin: 24 + Layout.rightMargin: 24 + Layout.topMargin: 8 + Layout.preferredHeight: 16 + Layout.fillWidth: true + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + font.pixelSize: 14 - color: BSStyle.textColor + color: BSStyle.titanWhiteColor text: wallet_properties_vm.exportPath leftPadding: 24 } - CustomButtonLeftIcon { + Button { + Layout.leftMargin: 24 - width: 160 + Layout.topMargin: 12 + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + activeFocusOnTab: false + + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Normal + palette.buttonText: BSStyle.buttonsHeaderTextColor + text: qsTr("Select target dir") - font.pixelSize: 12 - custom_icon.source: "qrc:/images/folder_icon.png" - onClicked: fileDialog.open() + icon.color: BSStyle.wildBlueColor + icon.source: "qrc:/images/folder_icon.png" + icon.width: 20 + icon.height: 16 + + background: Rectangle { + implicitWidth: 160 + implicitHeight: 34 + color: "transparent" + + radius: 14 + + border.color: BSStyle.defaultBorderColor + border.width: 1 + + } + + onClicked: { + fileDialog.open() + } } Label { diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 4eb1c4860..25466e736 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -2,6 +2,7 @@ import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 + import terminal.models 1.0 import "." From 757f33f9b03ec8dde8e413fc203eedf92d8528cf Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 8 Mar 2023 00:10:22 +0300 Subject: [PATCH 203/436] Moved ArmoryServersProvider to terminal's core --- .../InfoDialogs/StartupDialog.cpp | 2 +- .../Settings/ArmoryServersViewModel.cpp | 7 +- .../Settings/ArmoryServersViewModel.h | 2 +- .../Settings/ArmoryServersWidget.cpp | 2 +- .../Settings/ArmoryServersWidget.h | 2 +- BlockSettleUILib/Settings/ConfigDialog.cpp | 2 +- BlockSettleUILib/Settings/ConfigDialog.h | 2 +- .../Settings/NetworkSettingsPage.cpp | 29 +- Core/ArmoryServersProvider.cpp | 315 ++++++++++++++++++ Core/ArmoryServersProvider.h | 61 ++++ Core/SettingsAdapter.cpp | 118 +------ Core/SettingsAdapter.h | 12 +- Core/SignerAdapter.cpp | 1 + GUI/QtQuick/ArmoryServersModel.cpp | 135 ++++++++ GUI/QtQuick/ArmoryServersModel.h | 61 ++++ GUI/QtQuick/QtQuickAdapter.cpp | 114 ++++++- GUI/QtQuick/QtQuickAdapter.h | 20 +- common | 2 +- 18 files changed, 738 insertions(+), 149 deletions(-) create mode 100644 Core/ArmoryServersProvider.cpp create mode 100644 Core/ArmoryServersProvider.h create mode 100644 GUI/QtQuick/ArmoryServersModel.cpp create mode 100644 GUI/QtQuick/ArmoryServersModel.h diff --git a/BlockSettleUILib/InfoDialogs/StartupDialog.cpp b/BlockSettleUILib/InfoDialogs/StartupDialog.cpp index 338fe0b1f..f09b2e3e1 100644 --- a/BlockSettleUILib/InfoDialogs/StartupDialog.cpp +++ b/BlockSettleUILib/InfoDialogs/StartupDialog.cpp @@ -16,7 +16,7 @@ #include "ApplicationSettings.h" #include "ui_StartupDialog.h" -#include "ArmoryServersProvider.h" +#include "../../Core/ArmoryServersProvider.h" namespace { const char *kLicenseFilePath = "://resources/license.html"; diff --git a/BlockSettleUILib/Settings/ArmoryServersViewModel.cpp b/BlockSettleUILib/Settings/ArmoryServersViewModel.cpp index dc106ddaf..a3ec241f4 100644 --- a/BlockSettleUILib/Settings/ArmoryServersViewModel.cpp +++ b/BlockSettleUILib/Settings/ArmoryServersViewModel.cpp @@ -20,7 +20,7 @@ ArmoryServersViewModel::ArmoryServersViewModel(const std::shared_ptrservers(); + servers_.clear(); + for (const auto& server : serversProvider_->servers()) { + servers_.append(server); + } endResetModel(); } diff --git a/BlockSettleUILib/Settings/ArmoryServersViewModel.h b/BlockSettleUILib/Settings/ArmoryServersViewModel.h index 04da7fe70..cf0d6eb5a 100644 --- a/BlockSettleUILib/Settings/ArmoryServersViewModel.h +++ b/BlockSettleUILib/Settings/ArmoryServersViewModel.h @@ -17,7 +17,7 @@ #include "AuthAddress.h" #include "BinaryData.h" #include "ApplicationSettings.h" -#include "ArmoryServersProvider.h" +#include "../../Core/ArmoryServersProvider.h" class ArmoryServersViewModel : public QAbstractTableModel diff --git a/BlockSettleUILib/Settings/ArmoryServersWidget.cpp b/BlockSettleUILib/Settings/ArmoryServersWidget.cpp index a79c284f7..89a7eb477 100644 --- a/BlockSettleUILib/Settings/ArmoryServersWidget.cpp +++ b/BlockSettleUILib/Settings/ArmoryServersWidget.cpp @@ -339,7 +339,7 @@ void ArmoryServersWidget::setupServerFromSelected(bool needUpdate) return; } if (armoryServersProvider_) { - armoryServersProvider_->setupServer(index, needUpdate); + armoryServersProvider_->setupServer(index); setRowSelected(armoryServersProvider_->indexOfCurrent()); } else { diff --git a/BlockSettleUILib/Settings/ArmoryServersWidget.h b/BlockSettleUILib/Settings/ArmoryServersWidget.h index f37071b4a..c32ffd34e 100644 --- a/BlockSettleUILib/Settings/ArmoryServersWidget.h +++ b/BlockSettleUILib/Settings/ArmoryServersWidget.h @@ -15,7 +15,7 @@ #include #include -#include "ArmoryServersProvider.h" +#include "../Core/ArmoryServersProvider.h" #include "ArmoryServersViewModel.h" namespace Ui { diff --git a/BlockSettleUILib/Settings/ConfigDialog.cpp b/BlockSettleUILib/Settings/ConfigDialog.cpp index a6ebba26d..421999169 100644 --- a/BlockSettleUILib/Settings/ConfigDialog.cpp +++ b/BlockSettleUILib/Settings/ConfigDialog.cpp @@ -10,7 +10,7 @@ */ #include "ConfigDialog.h" -#include "ArmoryServersProvider.h" +#include "../../Core/ArmoryServersProvider.h" #include "AssetManager.h" #include "GeneralSettingsPage.h" #include "NetworkSettingsPage.h" diff --git a/BlockSettleUILib/Settings/ConfigDialog.h b/BlockSettleUILib/Settings/ConfigDialog.h index a66cff364..f25a52f21 100644 --- a/BlockSettleUILib/Settings/ConfigDialog.h +++ b/BlockSettleUILib/Settings/ConfigDialog.h @@ -14,7 +14,7 @@ #include #include #include "ApplicationSettings.h" -#include "ArmoryServersProvider.h" +#include "../../Core/ArmoryServersProvider.h" #include "Settings/SignersProvider.h" #include "Wallets/SignContainer.h" diff --git a/BlockSettleUILib/Settings/NetworkSettingsPage.cpp b/BlockSettleUILib/Settings/NetworkSettingsPage.cpp index f8fe5d9c1..7ed6defc2 100644 --- a/BlockSettleUILib/Settings/NetworkSettingsPage.cpp +++ b/BlockSettleUILib/Settings/NetworkSettingsPage.cpp @@ -144,7 +144,7 @@ void NetworkSettingsPage::initSettings() { if (armoryServersProvider_) { armoryServerModel_ = new ArmoryServersViewModel(armoryServersProvider_); - connect(armoryServersProvider_.get(), &ArmoryServersProvider::dataChanged, this, &NetworkSettingsPage::displayArmorySettings); + //connect(armoryServersProvider_.get(), &ArmoryServersProvider::dataChanged, this, &NetworkSettingsPage::displayArmorySettings); } else { armoryServerModel_ = new ArmoryServersViewModel(this); @@ -177,7 +177,10 @@ void NetworkSettingsPage::displayArmorySettings() // set index of selected server selectedServer = armoryServersProvider_->getArmorySettings(); selectedServerIndex = armoryServersProvider_->indexOfCurrent(); - connectedServerSettings = armoryServersProvider_->connectedArmorySettings(); + const auto& connectedIdx = armoryServersProvider_->indexOfCurrent(); + if (connectedIdx >= 0) { + connectedServerSettings = armoryServersProvider_->servers().at(connectedIdx); + } connectedServerIndex = armoryServersProvider_->indexOfConnected(); } else { @@ -273,8 +276,15 @@ void NetworkSettingsPage::onEnvSelected(int envIndex) const auto env = ApplicationSettings::EnvConfiguration(envIndex); const int armoryIndex = ui_->comboBoxArmoryServer->currentIndex(); int serverIndex = armoryIndex; - const auto &armoryServers = armoryServersProvider_ ? armoryServersProvider_->servers() - : armoryServers_; + QList armoryServers; + if (armoryServersProvider_) { + for (const auto& server : armoryServersProvider_->servers()) { + armoryServers.append(server); + } + } + else { + armoryServers = armoryServers_; + } if (armoryIndex < 0 || armoryIndex >= armoryServers.count()) { return; } @@ -292,8 +302,15 @@ void NetworkSettingsPage::onEnvSelected(int envIndex) void NetworkSettingsPage::onArmorySelected(int armoryIndex) { int envIndex = ui_->comboBoxEnvironment->currentIndex(); - auto armoryServers = armoryServersProvider_ ? armoryServersProvider_->servers() - : armoryServers_; + QList armoryServers; + if (armoryServersProvider_) { + for (const auto& server : armoryServersProvider_->servers()) { + armoryServers.append(server); + } + } + else { + armoryServers = armoryServers_; + } if (armoryIndex < 0 || armoryIndex >= armoryServers.count()) { return; } diff --git a/Core/ArmoryServersProvider.cpp b/Core/ArmoryServersProvider.cpp new file mode 100644 index 000000000..6dff8967f --- /dev/null +++ b/Core/ArmoryServersProvider.cpp @@ -0,0 +1,315 @@ +/* + +*********************************************************************************** +* Copyright (C) 2019 - 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "ArmoryServersProvider.h" +#include "BootstrapDataManager.h" +#include +#include + +namespace { + + // Change to true if local ArmoryDB auto-start should be reverted (not tested, see BST-2131) + const bool kEnableLocalAutostart = false; + + enum class ServerIndices { + MainNet = 0, + TestNet, + LocalhostMainNet, + LocalHostTestNet + }; + +} // namespace + +const std::vector ArmoryServersProvider::defaultServers_ = { + ArmoryServer::fromTextSettings(QStringLiteral(ARMORY_BLOCKSETTLE_NAME":0:mainnet.blocksettle.com:9003:")), + ArmoryServer::fromTextSettings(QStringLiteral(ARMORY_BLOCKSETTLE_NAME":1:testnet.blocksettle.com:19003:")), + ArmoryServer::fromTextSettings(kEnableLocalAutostart ? + QStringLiteral("%1:0:127.0.0.1::").arg(QObject::tr("Local Auto-launch Node")) : + QStringLiteral("%1:0:127.0.0.1::").arg(QObject::tr("Local BlockSettleDB Node"))), + ArmoryServer::fromTextSettings(kEnableLocalAutostart ? + QStringLiteral("%1:1:127.0.0.1::").arg(QObject::tr("Local Auto-launch Node")) : + QStringLiteral("%1:1:127.0.0.1:81:").arg(QObject::tr("Local BlockSettleDB Node"))) +}; + +const int ArmoryServersProvider::kDefaultServersCount = ArmoryServersProvider::defaultServers_.size(); + +ArmoryServersProvider::ArmoryServersProvider(const std::shared_ptr &appSettings) + : appSettings_(appSettings) +{} + +std::vector ArmoryServersProvider::servers() const +{ + QStringList userServers = appSettings_->get(ApplicationSettings::armoryServers); + std::vector servers; + + // #1 add MainNet blocksettle server + ArmoryServer bsMainNet = defaultServers_.at(static_cast(ServerIndices::MainNet)); + //bsMainNet.armoryDBKey = QString::fromStdString(bootstrapDataManager_->getArmoryMainnetKey()); //hard-code key + servers.push_back(bsMainNet); + + // #2 add TestNet blocksettle server + ArmoryServer bsTestNet = defaultServers_.at(static_cast(ServerIndices::TestNet)); + //bsTestNet.armoryDBKey = QString::fromStdString(bootstrapDataManager_->getArmoryTestnetKey()); + servers.push_back(bsTestNet); + + // #3 add localhost node MainNet + ArmoryServer localMainNet = defaultServers_.at(static_cast(ServerIndices::LocalhostMainNet)); + localMainNet.armoryDBPort = appSettings_->GetDefaultArmoryLocalPort(NetworkType::MainNet); + localMainNet.runLocally = kEnableLocalAutostart; + servers.push_back(localMainNet); + + // #4 add localhost node TestNet + ArmoryServer localTestNet = defaultServers_.at(static_cast(ServerIndices::LocalHostTestNet)); + localTestNet.armoryDBPort = appSettings_->GetDefaultArmoryLocalPort(NetworkType::TestNet); + localTestNet.runLocally = kEnableLocalAutostart; + servers.push_back(localTestNet); + + for (const QString &srv : userServers) { + servers.push_back(ArmoryServer::fromTextSettings(srv)); + } + return servers; +} + +ArmorySettings ArmoryServersProvider::getArmorySettings() const +{ + ArmorySettings settings; + + settings.netType = appSettings_->get(ApplicationSettings::netType); + settings.armoryDBIp = appSettings_->get(ApplicationSettings::armoryDbIp); + settings.armoryDBPort = appSettings_->GetArmoryRemotePort(); + settings.runLocally = appSettings_->get(ApplicationSettings::runArmoryLocally); + + const int serverIndex = indexOf(static_cast(settings)); + if (serverIndex >= 0) { + settings.armoryDBKey = servers().at(serverIndex).armoryDBKey; + } + + settings.socketType = appSettings_->GetArmorySocketType(); + + settings.armoryExecutablePath = QDir::cleanPath(appSettings_->get(ApplicationSettings::armoryPathName)); + settings.dbDir = appSettings_->GetDBDir(); + settings.bitcoinBlocksDir = appSettings_->GetBitcoinBlocksDir(); + settings.dataDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + + return settings; +} + +int ArmoryServersProvider::indexOfCurrent() const +{ + return indexOf(static_cast(getArmorySettings())); +} + +int ArmoryServersProvider::indexOfConnected() const +{ + return lastConnectedIndex_; +} + +int ArmoryServersProvider::indexOf(const QString &name) const +{ + // naive implementation + const auto& s = servers(); + for (int i = 0; i < s.size(); ++i) { + if (s.at(i).name == name) { + return i; + } + } + return -1; +} + +int ArmoryServersProvider::indexOf(const ArmoryServer &server) const +{ + const auto& srvrs = servers(); + for (int i = 0; i < srvrs.size(); ++i) { + const auto& s = srvrs.at(i); + if ((s.name == server.name) && (s.netType == server.netType) + && (s.armoryDBIp == server.armoryDBIp) && (s.armoryDBPort == server.armoryDBPort)) { + return i; + } + } + return -1; +} + +int ArmoryServersProvider::indexOfIpPort(const std::string &srvIPPort) const +{ + QString ipPort = QString::fromStdString(srvIPPort); + QStringList ipPortList = ipPort.split(QStringLiteral(":")); + if (ipPortList.size() != 2) { + return -1; + } + + for (int i = 0; i < servers().size(); ++i) { + if (servers().at(i).armoryDBIp == ipPortList.at(0) && servers().at(i).armoryDBPort == ipPortList.at(1).toInt()) { + return i; + } + } + return -1; +} + +int ArmoryServersProvider::getIndexOfMainNetServer() +{ + return static_cast(ServerIndices::MainNet); +} + +int ArmoryServersProvider::getIndexOfTestNetServer() +{ + return static_cast(ServerIndices::TestNet); +} + +bool ArmoryServersProvider::add(const ArmoryServer &server) +{ + if (server.armoryDBPort < 1 || server.armoryDBPort > USHRT_MAX) { + return false; + } + if (server.name.isEmpty()) { + return false; + } + + const auto& serversData = servers(); + // check if server with already exist + for (const ArmoryServer &s : serversData) { + if (s.name == server.name) { + return false; + } + if (s.armoryDBIp == server.armoryDBIp + && s.armoryDBPort == server.armoryDBPort + && s.netType == server.netType) { + return false; + } + } + + QStringList serversTxt = appSettings_->get(ApplicationSettings::armoryServers); + + serversTxt.append(server.toTextSettings()); + appSettings_->set(ApplicationSettings::armoryServers, serversTxt); + return true; +} + +bool ArmoryServersProvider::replace(int index, const ArmoryServer &server) +{ + if (server.armoryDBPort < 1 || server.armoryDBPort > USHRT_MAX) { + return false; + } + if (server.name.isEmpty()) { + return false; + } + if (index < kDefaultServersCount) { + return false; + } + + const auto& serversData = servers(); + if (index >= serversData.size()) { + return false; + } + + // check if server with already exist + for (int i = 0; i < serversData.size(); ++i) { + if (i == index) continue; + + const ArmoryServer &s = serversData.at(i); + if (s.name == server.name) { + return false; + } + if (s.armoryDBIp == server.armoryDBIp + && s.armoryDBPort == server.armoryDBPort + && s.netType == server.netType) { + return false; + } + } + + QStringList serversTxt = appSettings_->get(ApplicationSettings::armoryServers); + if (index - kDefaultServersCount >= serversTxt.size()) { + return false; + } + + serversTxt.replace(index - kDefaultServersCount, server.toTextSettings()); + appSettings_->set(ApplicationSettings::armoryServers, serversTxt); + return true; +} + +bool ArmoryServersProvider::remove(int index) +{ + if (index < kDefaultServersCount) { + return false; + } + + QStringList servers = appSettings_->get(ApplicationSettings::armoryServers); + int indexToRemove = index - kDefaultServersCount; + if (indexToRemove >= 0 && indexToRemove < servers.size()){ + servers.removeAt(indexToRemove); + appSettings_->set(ApplicationSettings::armoryServers, servers); + return true; + } + else { + return false; + } +} + +void ArmoryServersProvider::setupServer(int index) +{ + const auto& srvList = servers(); + if (index >= 0 && index < srvList.size()) { + ArmoryServer server = srvList.at(index); + appSettings_->set(ApplicationSettings::armoryDbName, server.name); + appSettings_->set(ApplicationSettings::armoryDbIp, server.armoryDBIp); + appSettings_->set(ApplicationSettings::armoryDbPort, server.armoryDBPort); + appSettings_->set(ApplicationSettings::netType, static_cast(server.netType)); + appSettings_->set(ApplicationSettings::runArmoryLocally, server.runLocally); + } +} + +int ArmoryServersProvider::addKey(const QString &address, int port, const QString &key) +{ + // find server + int index = -1; + for (int i = 0; i < servers().size(); ++i) { + if (servers().at(i).armoryDBIp == address && servers().at(i).armoryDBPort == port) { + index = i; + break; + } + } + + if (index == -1){ + return -1; + } + + if (index < ArmoryServersProvider::kDefaultServersCount) { + return -1; + } + + QStringList servers = appSettings_->get(ApplicationSettings::armoryServers); + QString serverTxt = servers.at(index - ArmoryServersProvider::kDefaultServersCount); + ArmoryServer server = ArmoryServer::fromTextSettings(serverTxt); + server.armoryDBKey = key; + servers[index - ArmoryServersProvider::kDefaultServersCount] = server.toTextSettings(); + + appSettings_->set(ApplicationSettings::armoryServers, servers); + return index; +} + +int ArmoryServersProvider::addKey(const std::string &srvIPPort, const BinaryData &srvPubKey) +{ + QString ipPort = QString::fromStdString(srvIPPort); + QStringList ipPortList = ipPort.split(QStringLiteral(":")); + if (ipPortList.size() == 2) { + return addKey(ipPortList.at(0), ipPortList.at(1).toInt() + , QString::fromStdString(srvPubKey.toHexStr())); + } + return -1; +} + +void ArmoryServersProvider::setConnectedArmorySettings(const ArmorySettings ¤tArmorySettings) +{ + lastConnectedIndex_ = indexOf(currentArmorySettings); +} + +bool ArmoryServersProvider::isDefault(int index) const +{ + return index == 0 || index == 1; +} diff --git a/Core/ArmoryServersProvider.h b/Core/ArmoryServersProvider.h new file mode 100644 index 000000000..ed0768b35 --- /dev/null +++ b/Core/ArmoryServersProvider.h @@ -0,0 +1,61 @@ +/* + +*********************************************************************************** +* Copyright (C) 2019 - 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#ifndef ARMORY_SERVERS_PROVIDER_H +#define ARMORY_SERVERS_PROVIDER_H + +#include "ApplicationSettings.h" +#include "BinaryData.h" + +#define ARMORY_BLOCKSETTLE_NAME "BlockSettle" + +#define MAINNET_ARMORY_BLOCKSETTLE_ADDRESS "armory.blocksettle.com" +#define MAINNET_ARMORY_BLOCKSETTLE_PORT 80 + +#define TESTNET_ARMORY_BLOCKSETTLE_ADDRESS "armory-testnet.blocksettle.com" +#define TESTNET_ARMORY_BLOCKSETTLE_PORT 80 + +class ArmoryServersProvider +{ +public: + ArmoryServersProvider(const std::shared_ptr&); + + std::vector servers() const; + ArmorySettings getArmorySettings() const; + + int indexOfCurrent() const; // index of server which set in ini file + int indexOfConnected() const; // index of server currently connected + int indexOf(const QString &name) const; + int indexOf(const ArmoryServer &server) const; + int indexOfIpPort(const std::string &srvIPPort) const; + static int getIndexOfMainNetServer(); + static int getIndexOfTestNetServer(); + + bool add(const ArmoryServer &server); + bool replace(int index, const ArmoryServer &server); + bool remove(int index); + void setupServer(int index); + + int addKey(const QString &address, int port, const QString &key); + int addKey(const std::string &srvIPPort, const BinaryData &srvPubKey); + + void setConnectedArmorySettings(const ArmorySettings &); + + // if default armory used + bool isDefault(int index) const; + static const int kDefaultServersCount; + +private: + std::shared_ptr appSettings_; + int lastConnectedIndex_{ -1 }; + static const std::vector defaultServers_; +}; + +#endif // ARMORY_SERVERS_PROVIDER_H diff --git a/Core/SettingsAdapter.cpp b/Core/SettingsAdapter.cpp index 2cf17799c..823d540ad 100644 --- a/Core/SettingsAdapter.cpp +++ b/Core/SettingsAdapter.cpp @@ -64,9 +64,7 @@ SettingsAdapter::SettingsAdapter(const std::shared_ptr &set , filePathInResources.toStdString()); } } - - armoryServersProvider_ = std::make_shared(settings, bootstrapDataManager_); - signersProvider_ = std::make_shared(appSettings_); + armoryServersProvider_ = std::make_shared(settings); } ProcessingResult SettingsAdapter::process(const bs::message::Envelope &env) @@ -96,18 +94,6 @@ ProcessingResult SettingsAdapter::process(const bs::message::Envelope &env) return processUpdArmoryServer(env, msg.upd_armory_server()); case SettingsMessage::kSignerRequest: return processSignerSettings(env); - case SettingsMessage::kSignerSetKey: - return processSignerSetKey(msg.signer_set_key()); - case SettingsMessage::kSignerReset: - return processSignerReset(); - case SettingsMessage::kSignerServersGet: - return processGetSigners(env); - case SettingsMessage::kSetSignerServer: - return processSetSigner(env, msg.set_signer_server()); - case SettingsMessage::kAddSignerServer: - return processAddSigner(env, msg.add_signer_server()); - case SettingsMessage::kDelSignerServer: - return processDelSigner(env, msg.del_signer_server()); case SettingsMessage::kStateGet: return processGetState(env); case SettingsMessage::kReset: @@ -592,6 +578,17 @@ ProcessingResult SettingsAdapter::processUpdArmoryServer(const bs::message::Enve return processGetArmoryServers(env); } +ProcessingResult SettingsAdapter::processSignerSettings(const bs::message::Envelope& env) +{ + SettingsMessage msg; + auto msgResp = msg.mutable_signer_response(); + msgResp->set_network_type(appSettings_->get(ApplicationSettings::netType)); + msgResp->set_home_dir(appSettings_->GetHomeDir().toStdString()); + //msgResp->set_auto_sign_spend_limit(appSettings_->get(ApplicationSettings::autoSignSpendLimit)); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Success; +} + #include static std::string convertPathname(const QString& pathname) { @@ -604,97 +601,6 @@ static std::string convertPathname(const QString& pathname) return baFilename.toStdString(); } -ProcessingResult SettingsAdapter::processSignerSettings(const bs::message::Envelope &env) -{ - SettingsMessage msg; - auto msgResp = msg.mutable_signer_response(); - msgResp->set_is_local(signersProvider_->currentSignerIsLocal()); - msgResp->set_network_type(appSettings_->get(ApplicationSettings::netType)); - - const auto &signerHost = signersProvider_->getCurrentSigner(); - msgResp->set_name(signerHost.name.toStdString()); - msgResp->set_host(signerHost.address.toStdString()); - msgResp->set_port(std::to_string(signerHost.port)); - msgResp->set_key(signerHost.key.toStdString()); - msgResp->set_id(signerHost.serverId()); - msgResp->set_remote_keys_dir(signersProvider_->remoteSignerKeysDir()); - msgResp->set_remote_keys_file(signersProvider_->remoteSignerKeysFile()); - - for (const auto &signer : signersProvider_->signers()) { - auto keyVal = msgResp->add_client_keys(); - keyVal->set_key(signer.serverId()); - keyVal->set_value(signer.key.toStdString()); - } - msgResp->set_home_dir(convertPathname(appSettings_->GetHomeDir())); - msgResp->set_auto_sign_spend_limit(appSettings_->get(ApplicationSettings::autoSignSpendLimit)); - - pushResponse(user_, env, msg.SerializeAsString()); - return ProcessingResult::Success; -} - -ProcessingResult SettingsAdapter::processSignerSetKey(const SettingsMessage_SignerSetKey &request) -{ - signersProvider_->addKey(request.server_id(), request.new_key()); - return ProcessingResult::Success; -} - -ProcessingResult SettingsAdapter::processSignerReset() -{ - signersProvider_->setupSigner(0, true); - return ProcessingResult::Success; -} - -ProcessingResult SettingsAdapter::processGetSigners(const bs::message::Envelope& env) -{ - SettingsMessage msg; - auto msgResp = msg.mutable_signer_servers(); - msgResp->set_own_key(signersProvider_->remoteSignerOwnKey().toHexStr()); - msgResp->set_idx_current(signersProvider_->indexOfCurrent()); - for (const auto& signer : signersProvider_->signers()) { - auto msgSrv = msgResp->add_servers(); - msgSrv->set_name(signer.name.toStdString()); - msgSrv->set_host(signer.address.toStdString()); - msgSrv->set_port(std::to_string(signer.port)); - msgSrv->set_key(signer.key.toStdString()); - } - pushResponse(user_, env, msg.SerializeAsString()); - return ProcessingResult::Success; -} - -ProcessingResult SettingsAdapter::processSetSigner(const bs::message::Envelope& env - , int index) -{ - signersProvider_->setupSigner(index); - return processGetSigners(env); -} - -static SignerHost fromMessage(const SettingsMessage_SignerServer& msg) -{ - SignerHost result; - result.name = QString::fromStdString(msg.name()); - result.address = QString::fromStdString(msg.host()); - result.port = std::stoi(msg.port()); - result.key = QString::fromStdString(msg.key()); - return result; -} - -ProcessingResult SettingsAdapter::processAddSigner(const bs::message::Envelope& env - , const SettingsMessage_SignerServer& request) -{ - const auto& signer = fromMessage(request); - signersProvider_->add(signer); - signersProvider_->setupSigner(signersProvider_->indexOf(signer)); - return processGetSigners(env); -} - -ProcessingResult SettingsAdapter::processDelSigner(const bs::message::Envelope& env - , int index) -{ - signersProvider_->remove(index); - return processGetSigners(env); -} - - void bs::message::setFromQVariant(const QVariant& val, SettingRequest* req, SettingResponse* resp) { switch (val.type()) { diff --git a/Core/SettingsAdapter.h b/Core/SettingsAdapter.h index e2878951a..79605be3a 100644 --- a/Core/SettingsAdapter.h +++ b/Core/SettingsAdapter.h @@ -79,14 +79,7 @@ class SettingsAdapter : public bs::message::Adapter bs::message::ProcessingResult processDelArmoryServer(const bs::message::Envelope&, int index); bs::message::ProcessingResult processUpdArmoryServer(const bs::message::Envelope& , const BlockSettle::Terminal::SettingsMessage_ArmoryServerUpdate&); - bs::message::ProcessingResult processSignerSettings(const bs::message::Envelope &); - bs::message::ProcessingResult processSignerSetKey(const BlockSettle::Terminal::SettingsMessage_SignerSetKey &); - bs::message::ProcessingResult processSignerReset(); - bs::message::ProcessingResult processGetSigners(const bs::message::Envelope&); - bs::message::ProcessingResult processSetSigner(const bs::message::Envelope&, int); - bs::message::ProcessingResult processAddSigner(const bs::message::Envelope& - , const BlockSettle::Terminal::SettingsMessage_SignerServer&); - bs::message::ProcessingResult processDelSigner(const bs::message::Envelope&, int); + bs::message::ProcessingResult processSignerSettings(const bs::message::Envelope&); bs::message::ProcessingResult processRemoteSettings(uint64_t msgId); bs::message::ProcessingResult processGetState(const bs::message::Envelope&); bs::message::ProcessingResult processReset(const bs::message::Envelope& @@ -104,8 +97,7 @@ class SettingsAdapter : public bs::message::Adapter std::shared_ptr appSettings_; std::shared_ptr bootstrapDataManager_; std::shared_ptr armoryServersProvider_; - std::shared_ptr signersProvider_; - std::shared_ptr ccFileManager_; + //std::shared_ptr ccFileManager_; std::shared_ptr tradeSettings_; std::map remoteSetReqs_; diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 3d92f6215..7035f034a 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -92,6 +92,7 @@ void SignerAdapter::start() walletsReady(); return; } + logger_->debug("[SignerAdapter::start]"); SettingsMessage msg; msg.mutable_signer_request(); pushRequest(user_, UserTerminal::create(TerminalUsers::Settings) diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp new file mode 100644 index 000000000..56b805212 --- /dev/null +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -0,0 +1,135 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "ArmoryServersModel.h" +#include "ArmoryServersProvider.h" + +namespace { + static const QHash kRoleNames{ + {ArmoryServersModel::TableDataRole, "tableData"}, + {ArmoryServersModel::NameRole, "name"}, + {ArmoryServersModel::NetTypeRole, "netType"}, + {ArmoryServersModel::AddressRole, "address"}, + {ArmoryServersModel::PortRole, "port"}, + {ArmoryServersModel::KeyRole, "key"} + }; +} + +ArmoryServersModel::ArmoryServersModel(QObject* parent) + : QAbstractTableModel(parent) + , header_{ tr("Name"), tr("Network"), tr("Address"), tr("Port"), tr("Key") } +{} + +void ArmoryServersModel::setData(int curIdx, int connIdx + , const std::vector& data) +{ + QMetaObject::invokeMethod(this, [this, curIdx, connIdx, data] { + beginResetModel(); + data_ = data; + endResetModel(); + + if (current_ != curIdx) { + current_ = curIdx; + emit currentChanged(); + } + if (connected_ != connIdx) { + connected_ = connIdx; + emit connectedChanged(); + } + }); +} + +void ArmoryServersModel::add(const ArmoryServer& srv) +{ + QMetaObject::invokeMethod(this, [this, srv] { + beginInsertRows(QModelIndex{}, rowCount(), rowCount()); + data_.push_back(srv); + endInsertRows(); + }); +} + +bool ArmoryServersModel::del(int idx) +{ + if ((idx >= rowCount()) || (idx < 0) || (idx < ArmoryServersProvider::kDefaultServersCount)) { + return false; + } + QMetaObject::invokeMethod(this, [this, idx] { + beginRemoveRows(QModelIndex{}, idx, idx); + data_.erase(data_.cbegin() + idx); + endRemoveRows(); + }); + return true; +} + +int ArmoryServersModel::rowCount(const QModelIndex&) const +{ + return data_.size(); +} + +int ArmoryServersModel::columnCount(const QModelIndex&) const +{ + return header_.size(); +} + +QVariant ArmoryServersModel::getData(int row, int col) const +{ + if ((row < 0) || (row >= rowCount())) { + return {}; + } + switch (col) { + case 0: return data_.at(row).name; + case 1: return (int)data_.at(row).netType; + case 2: return data_.at(row).armoryDBIp; + case 3: return QString::number(data_.at(row).armoryDBPort); + case 4: return data_.at(row).armoryDBKey; + default: break; + } + return {}; +} + +QVariant ArmoryServersModel::data(const QModelIndex& index, int role) const +{ + switch (role) { + case NameRole: return getData(index.row(), 0); + case NetTypeRole: return getData(index.row(), 1); + case AddressRole: return getData(index.row(), 2); + case PortRole: return getData(index.row(), 3); + case KeyRole: return getData(index.row(), 4); + default: return getData(index.row(), index.column()); + } + return {}; +} + +bool ArmoryServersModel::setData(const QModelIndex& index, const QVariant& value, int) +{ + if (!isEditable(index.row())) { + return false; + } + emit changed(index, value); + return true; +} + +QHash ArmoryServersModel::roleNames() const +{ + return kRoleNames; +} + +QVariant ArmoryServersModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Orientation::Horizontal) { + return header_.at(section); + } + return {}; +} + +bool ArmoryServersModel::isEditable(int row) const +{ + return ((row >= ArmoryServersProvider::kDefaultServersCount) && (row < rowCount())); +} diff --git a/GUI/QtQuick/ArmoryServersModel.h b/GUI/QtQuick/ArmoryServersModel.h new file mode 100644 index 000000000..61a59df00 --- /dev/null +++ b/GUI/QtQuick/ArmoryServersModel.h @@ -0,0 +1,61 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#pragma once + +#include +#include "ArmorySettings.h" + +class ArmoryServersModel: public QAbstractTableModel +{ + Q_OBJECT + Q_PROPERTY(int current READ current NOTIFY currentChanged) + Q_PROPERTY(int connected READ connected NOTIFY connectedChanged) + +public: + enum TableRoles { + TableDataRole = Qt::UserRole + 1, NameRole, NetTypeRole, AddressRole, + PortRole, KeyRole + }; + Q_ENUM(TableRoles) + + ArmoryServersModel(QObject* parent = nullptr); + + void setData(int curIdx, int connIdx, const std::vector&); + void add(const ArmoryServer&); + bool del(int idx); + auto data() const { return data_; } + auto data(int idx) const { return data_.at(idx); } + + int rowCount(const QModelIndex & = QModelIndex()) const override; + int columnCount(const QModelIndex & = QModelIndex()) const override; + QVariant data(const QModelIndex& index, int role) const override; + bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override; + QHash roleNames() const override; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + + Q_INVOKABLE bool isEditable(int row) const; + +signals: + void changed(const QModelIndex&, const QVariant&); + void currentChanged(); + void connectedChanged(); + +private: + int current() const { return current_; } + int connected() const { return connected_; } + QVariant getData(int row, int col) const; + +private: + const QStringList header_; + int current_{ -1 }; + int connected_{ -1 }; + std::vector data_; +}; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 69a430976..1d8611acf 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -29,6 +29,7 @@ #include #include #include +#include "ArmoryServersModel.h" #include "bip39/bip39.h" #include "BSMessageBox.h" #include "BSTerminalSplashScreen.h" @@ -237,6 +238,7 @@ void QtQuickAdapter::run(int &argc, char **argv) qmlRegisterInterface("QUTXO"); qmlRegisterInterface("QUTXOList"); qmlRegisterInterface("QTxDetails"); + qmlRegisterInterface("ArmoryServersModel"); qmlRegisterUncreatableMetaObject(WalletBalance::staticMetaObject, "wallet.balance" , 1, 0, "WalletBalance", tr("Error: only enums")); qmlRegisterType("terminal.models", 1, 0, "TransactionFilterModel"); @@ -358,7 +360,7 @@ ProcessingResult QtQuickAdapter::processSettings(const Envelope &env) case SettingsMessage::kState: return processSettingsState(msg.state()); case SettingsMessage::kArmoryServers: - return processArmoryServers(msg.armory_servers()); + return processArmoryServers(env.responseId(), msg.armory_servers()); default: break; } return ProcessingResult::Ignored; @@ -421,21 +423,25 @@ ProcessingResult QtQuickAdapter::processSettingsState(const SettingsMessage_Sett return ProcessingResult::Success; } -ProcessingResult QtQuickAdapter::processArmoryServers(const SettingsMessage_ArmoryServers& response) +ProcessingResult QtQuickAdapter::processArmoryServers(bs::message::SeqId msgId + , const SettingsMessage_ArmoryServers& response) { - QList servers; + const auto& itReq = armoryServersReq_.find(msgId); + if (itReq == armoryServersReq_.end()) { + logger_->warn("[{}] unknown request #{}", __func__, msgId); + return ProcessingResult::Error; + } + std::vector servers; for (const auto& server : response.servers()) { - servers << ArmoryServer{ QString::fromStdString(server.server_name()) + servers.push_back({ QString::fromStdString(server.server_name()) , static_cast(server.network_type()) , QString::fromStdString(server.server_address()) , std::stoi(server.server_port()), QString::fromStdString(server.server_key()) , SecureBinaryData::fromString(server.password()) - , server.run_locally(), server.one_way_auth() }; + , server.run_locally(), server.one_way_auth() }); } - - logger_->debug("[{}] {} servers, cur: {}, conn: {}", __func__, servers.size() - , response.idx_current(), response.idx_connected()); - //TODO + itReq->second->setData(response.idx_current(), response.idx_connected(), servers); + armoryServersReq_.erase(itReq); return ProcessingResult::Success; } @@ -1248,6 +1254,96 @@ bool QtQuickAdapter::validateAddress(const QString& addr) return true; } +ArmoryServersModel* QtQuickAdapter::getArmoryServers() +{ + SettingsMessage msg; + msg.mutable_armory_servers_get(); + const auto msgId = pushRequest(user_, userSettings_, msg.SerializeAsString()); + auto model = new ArmoryServersModel(this); + armoryServersReq_[msgId] = model; + connect(model, &ArmoryServersModel::changed, this, &QtQuickAdapter::onArmoryServerChanged); + return model; +} + +bool QtQuickAdapter::addArmoryServer(ArmoryServersModel* model, const QString& name + , int netType, const QString& ipAddr, const QString& ipPort, const QString& key) +{ + for (const auto& srv : model->data()) { + if (srv.name == name) { + logger_->debug("[{}] armory server {} already exists", __func__, name.toStdString()); + return false; + } + } + SettingsMessage msg; + auto msgReq = msg.mutable_add_armory_server(); + msgReq->set_server_name(name.toStdString()); + msgReq->set_network_type(netType); + msgReq->set_server_address(ipAddr.toStdString()); + msgReq->set_server_port(ipPort.toStdString()); + msgReq->set_server_key(key.toStdString()); + pushRequest(user_, userSettings_, msg.SerializeAsString()); + model->add({ name, static_cast(netType), ipAddr, ipPort.toInt(), key }); + return true; +} + +bool QtQuickAdapter::delArmoryServer(ArmoryServersModel* model, int idx) +{ + if (!model->isEditable(idx)) { + return false; + } + SettingsMessage msg; + msg.set_del_armory_server(idx); + pushRequest(user_, userSettings_, msg.SerializeAsString()); + model->del(idx); + return true; +} + +void QtQuickAdapter::onArmoryServerChanged(const QModelIndex& index, const QVariant& value) +{ + auto model = qobject_cast(sender()); + if (!model) { + logger_->error("[{}] invalid sender", __func__); + return; + } + auto srv = model->data(index.row()); + switch (index.column()) { + case 0: + for (int i = 0; i < model->rowCount(); ++i) { + if (i == index.row()) { + continue; + } + if (model->data(i).name == value.toString()) { + return; + } + } + srv.name = value.toString(); + break; + case 1: + srv.netType = static_cast(value.toInt()); + break; + case 2: + srv.armoryDBIp = value.toString(); + break; + case 3: + srv.armoryDBPort = value.toInt(); + break; + case 4: + srv.armoryDBKey = value.toString(); + break; + default: break; + } + SettingsMessage msg; + auto msgReq = msg.mutable_upd_armory_server(); + msgReq->set_index(index.row()); + auto msgSrv = msgReq->mutable_server(); + msgSrv->set_server_name(srv.name.toStdString()); + msgSrv->set_server_address(srv.armoryDBIp.toStdString()); + msgSrv->set_server_port(std::to_string(srv.armoryDBPort)); + msgSrv->set_server_key(srv.armoryDBKey.toStdString()); + msgSrv->set_network_type((int)srv.netType); + pushRequest(user_, userSettings_, msg.SerializeAsString()); +} + void QtQuickAdapter::requestFeeSuggestions() { ArmoryMessage msg; diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 836135d99..bf3b988b2 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -62,6 +62,7 @@ namespace BlockSettle { class SignerMessage_WalletSeed; } } +class ArmoryServersModel; class BSTerminalSplashScreen; class FeeSuggestionModel; class HwDeviceModel; @@ -117,14 +118,6 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_PROPERTY(QStringList settingEnvironments READ settingEnvironments) QStringList settingEnvironments() const; - Q_PROPERTY(QString settingArmoryHost READ settingArmoryHost WRITE setArmoryHost NOTIFY settingChanged) - QString settingArmoryHost() const { return getSetting(ApplicationSettings::Setting::armoryDbIp).toString(); } - void setArmoryHost(const QString& str) { setSetting(ApplicationSettings::Setting::armoryDbIp, str); } - - Q_PROPERTY(QString settingArmoryPort READ settingArmoryPort WRITE setArmoryPort NOTIFY settingChanged) - QString settingArmoryPort() const { return getSetting(ApplicationSettings::Setting::armoryDbPort).toString(); } - void setArmoryPort(const QString& str) { setSetting(ApplicationSettings::Setting::armoryDbPort, str); } - Q_PROPERTY(bool settingActivated READ settingActivated WRITE setActivated NOTIFY settingChanged) bool settingActivated() const { return getSetting(ApplicationSettings::Setting::initialized).toBool(); } void setActivated(bool b) { setSetting(ApplicationSettings::Setting::initialized, b); } @@ -157,6 +150,10 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void copyAddressToClipboard(const QString& addr); Q_INVOKABLE QString pasteTextFromClipboard(); Q_INVOKABLE bool validateAddress(const QString& addr); + Q_INVOKABLE ArmoryServersModel* getArmoryServers(); + Q_INVOKABLE bool addArmoryServer(ArmoryServersModel*, const QString& name + , int netType, const QString& ipAddr, const QString& ipPort, const QString& key = {}); + Q_INVOKABLE bool delArmoryServer(ArmoryServersModel*, int idx); Q_INVOKABLE void requestFeeSuggestions(); Q_INVOKABLE QTXSignRequest* createTXSignRequest(int walletIndex, const QStringList& recvAddrs @@ -187,11 +184,15 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void showError(const QString&); void showNotification(QString, QString); +private slots: + void onArmoryServerChanged(const QModelIndex&, const QVariant&); + private: bs::message::ProcessingResult processSettings(const bs::message::Envelope &); bs::message::ProcessingResult processSettingsGetResponse(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); bs::message::ProcessingResult processSettingsState(const BlockSettle::Terminal::SettingsMessage_SettingsResponse&); - bs::message::ProcessingResult processArmoryServers(const BlockSettle::Terminal::SettingsMessage_ArmoryServers&); + bs::message::ProcessingResult processArmoryServers(bs::message::SeqId + , const BlockSettle::Terminal::SettingsMessage_ArmoryServers&); bs::message::ProcessingResult processAdminMessage(const bs::message::Envelope &); bs::message::ProcessingResult processBlockchain(const bs::message::Envelope &); bs::message::ProcessingResult processSigner(const bs::message::Envelope &); @@ -291,6 +292,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop std::set expTxAddrReqs_, expTxAddrInReqs_; std::map addressCache_; std::set rmTxOnInvalidation_; + std::map armoryServersReq_; }; #endif // QT_QUICK_ADAPTER_H diff --git a/common b/common index e3fcfaf4e..8ac371fc2 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit e3fcfaf4e1d6d4b8e3f688bdcbef940e939f70a8 +Subproject commit 8ac371fc26515e3136fa9801ce290b78bd95c506 From 0b43c2d557d8330723969d3be226c9bd69a1a90e Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 8 Mar 2023 14:55:00 +0200 Subject: [PATCH 204/436] w/o wallets: add ExportDir to settings. remove old qmls --- GUI/QtQuick/QtQuickAdapter.cpp | 11 +- GUI/QtQuick/QtQuickAdapter.h | 6 + GUI/QtQuick/lof.patch | 108 +++++++ GUI/QtQuick/qml/CreateNewWallet.qml | 84 ----- GUI/QtQuick/qml/OverviewPage.qml | 5 - GUI/QtQuick/qml/ReceivePage.qml | 131 -------- GUI/QtQuick/qml/SeedPhrase.qml | 194 ----------- GUI/QtQuick/qml/SendAdvanced.qml | 306 ------------------ GUI/QtQuick/qml/SendPage.qml | 203 ------------ GUI/QtQuick/qml/SettingsPage.qml | 166 ---------- GUI/QtQuick/qml/VerifyAdvancedTX.qml | 179 ---------- GUI/QtQuick/qml/VerifySeedPhrase.qml | 144 --------- GUI/QtQuick/qml/WalletNamePass.qml | 112 ------- .../qml/WalletProperties/ExportWOWallet.qml | 8 +- GUI/QtQuick/qml/main.qml | 15 - GUI/QtQuick/qtquick.qrc | 9 - GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 19 +- GUI/QtQuick/viewmodels/WalletPropertiesVM.h | 17 +- 18 files changed, 143 insertions(+), 1574 deletions(-) create mode 100644 GUI/QtQuick/lof.patch delete mode 100644 GUI/QtQuick/qml/CreateNewWallet.qml delete mode 100644 GUI/QtQuick/qml/ReceivePage.qml delete mode 100644 GUI/QtQuick/qml/SeedPhrase.qml delete mode 100644 GUI/QtQuick/qml/SendAdvanced.qml delete mode 100644 GUI/QtQuick/qml/SendPage.qml delete mode 100644 GUI/QtQuick/qml/SettingsPage.qml delete mode 100644 GUI/QtQuick/qml/VerifyAdvancedTX.qml delete mode 100644 GUI/QtQuick/qml/VerifySeedPhrase.qml delete mode 100644 GUI/QtQuick/qml/WalletNamePass.qml diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 69a430976..c1e201696 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -148,7 +148,6 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) , userSigner_(std::make_shared(TerminalUsers::Signer)) , userHWW_(bs::message::UserTerminal::create(bs::message::TerminalUsers::HWWallets)) , txTypes_({ tr("All transactions"), tr("Received"), tr("Sent"), tr("Internal") }) - , walletPropertiesModel_(std::make_unique()) { staticLogger = logger; addrModel_ = new QmlAddressListModel(logger, this); @@ -161,6 +160,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) hwDeviceModel_ = new HwDeviceModel(logger, this); walletBalances_ = new WalletBalancesModel(logger, this); feeSuggModel_ = new FeeSuggestionModel(logger, this); + walletPropertiesModel_ = std::make_unique(logger); } QtQuickAdapter::~QtQuickAdapter() @@ -242,7 +242,9 @@ void QtQuickAdapter::run(int &argc, char **argv) qmlRegisterType("terminal.models", 1, 0, "TransactionFilterModel"); qmlRegisterType("terminal.models", 1, 0, "TransactionForAddressFilterModel"); qmlRegisterType("terminal.models", 1, 0, "PendingTransactionFilterModel"); - qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); + qmlRegisterUncreatableMetaObject(qtquick_gui::WalletPropertiesVM::staticMetaObject, "terminal.models" + , 1, 0, "WalletPropertiesVM", tr("Error: only enums")); +// qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); qmlRegisterUncreatableMetaObject(Transactions::staticMetaObject, "terminal.models" , 1, 0, "Transactions", tr("Error: only enums")); qmlRegisterUncreatableMetaObject(TxListModel::staticMetaObject, "terminal.models" @@ -812,6 +814,11 @@ void QtQuickAdapter::requestInitialSettings() setReq->set_index(SetIdx_ArmoryDbPort); setReq->set_type(SettingType_String); + setReq = msgReq->add_requests(); + setReq->set_source(SettingSource_Local); + setReq->set_index(SetIdx_ExportDir); + setReq->set_type(SettingType_String); + pushRequest(user_, userSettings_, msg.SerializeAsString()); } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 836135d99..3af7ee6e6 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -12,7 +12,9 @@ #define QT_QUICK_ADAPTER_H #include + #include + #include "Address.h" #include "AddressListModel.h" #include "ApiAdapter.h" @@ -128,6 +130,10 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_PROPERTY(bool settingActivated READ settingActivated WRITE setActivated NOTIFY settingChanged) bool settingActivated() const { return getSetting(ApplicationSettings::Setting::initialized).toBool(); } void setActivated(bool b) { setSetting(ApplicationSettings::Setting::initialized, b); } + + Q_PROPERTY(QString settingExportDir READ settingExportDir WRITE setExportDir NOTIFY settingChanged) + QString settingExportDir() const { return getSetting(ApplicationSettings::Setting::ExportDir).toString(); } + void setExportDir(const QString& str) {setSetting(ApplicationSettings::Setting::ExportDir, str); } Q_PROPERTY(int armoryState READ armoryState NOTIFY armoryStateChanged) int armoryState() const { return armoryState_; } diff --git a/GUI/QtQuick/lof.patch b/GUI/QtQuick/lof.patch new file mode 100644 index 000000000..ba9f39e70 --- /dev/null +++ b/GUI/QtQuick/lof.patch @@ -0,0 +1,108 @@ +diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp +index 69a430976..eb5e510f3 100644 +--- a/GUI/QtQuick/QtQuickAdapter.cpp ++++ b/GUI/QtQuick/QtQuickAdapter.cpp +@@ -148,7 +148,6 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) + , userSigner_(std::make_shared(TerminalUsers::Signer)) + , userHWW_(bs::message::UserTerminal::create(bs::message::TerminalUsers::HWWallets)) + , txTypes_({ tr("All transactions"), tr("Received"), tr("Sent"), tr("Internal") }) +- , walletPropertiesModel_(std::make_unique()) + { + staticLogger = logger; + addrModel_ = new QmlAddressListModel(logger, this); +@@ -161,6 +160,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) + hwDeviceModel_ = new HwDeviceModel(logger, this); + walletBalances_ = new WalletBalancesModel(logger, this); + feeSuggModel_ = new FeeSuggestionModel(logger, this); ++ walletPropertiesModel_ = std::make_unique(logger); + } + + QtQuickAdapter::~QtQuickAdapter() +@@ -242,7 +242,9 @@ void QtQuickAdapter::run(int &argc, char **argv) + qmlRegisterType("terminal.models", 1, 0, "TransactionFilterModel"); + qmlRegisterType("terminal.models", 1, 0, "TransactionForAddressFilterModel"); + qmlRegisterType("terminal.models", 1, 0, "PendingTransactionFilterModel"); +- qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); ++ qmlRegisterUncreatableMetaObject(qtquick_gui::WalletPropertiesVM::staticMetaObject, "terminal.models" ++ , 1, 0, "WalletPropertiesVM", tr("Error: only enums")); ++// qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); + qmlRegisterUncreatableMetaObject(Transactions::staticMetaObject, "terminal.models" + , 1, 0, "Transactions", tr("Error: only enums")); + qmlRegisterUncreatableMetaObject(TxListModel::staticMetaObject, "terminal.models" +diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +index b22c3e21a..8704ad9f2 100644 +--- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp ++++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +@@ -8,12 +8,16 @@ + ********************************************************************************** + + */ ++ + #include "WalletPropertiesVM.h" + ++#include ++ + using namespace qtquick_gui; + +-WalletPropertiesVM::WalletPropertiesVM(QObject* parent) +- : QObject(parent) ++WalletPropertiesVM::WalletPropertiesVM(const std::shared_ptr & logger, QObject* parent) ++ : QObject(parent), ++ logger_(logger) + { + } + +@@ -102,11 +106,13 @@ const QStringList& WalletPropertiesVM::seed() const + + const QString& WalletPropertiesVM::exportPath() const + { ++ logger_->debug("[{}] exportPath_: {}", __func__, exportPath_.toStdString()); + return exportPath_; + } + + void WalletPropertiesVM::setExportPath(const QString& path) + { ++ logger_->debug("[{}] exportPath_: {}", __func__, exportPath_.toStdString()); + exportPath_ = path; + emit pathChanged(); + } +diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +index 7218c22dd..fe9c51c0c 100644 +--- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h ++++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +@@ -10,8 +10,14 @@ + */ + #pragma once + ++#include ++ + #include + ++namespace spdlog { ++ class logger; ++} ++ + namespace qtquick_gui + { + +@@ -39,10 +45,10 @@ class WalletPropertiesVM: public QObject + Q_PROPERTY(bool isHardware READ isHardware NOTIFY changed) + Q_PROPERTY(bool isWatchingOnly READ isWatchingOnly NOTIFY changed) + Q_PROPERTY(QStringList seed READ seed NOTIFY seedChanged) +- Q_PROPERTY(QString exportPath READ exportPath WRITE setExportPath NOTIFY pathChanged) ++ Q_PROPERTY(QString exportPath READ exportPath WRITE setExportPath NOTIFY pathChanged) + + public: +- WalletPropertiesVM(QObject* parent = nullptr); ++ WalletPropertiesVM(const std::shared_ptr&, QObject* parent = nullptr); + + void setWalletInfo(const WalletInfo& info); + void setWalletSeed(const std::string& walletId, const std::string& seed); +@@ -75,6 +81,7 @@ private: + uint32_t nbUTXOs_{ 0 }; + QStringList seed_; + QString exportPath_; ++ std::shared_ptr logger_; + }; + + } diff --git a/GUI/QtQuick/qml/CreateNewWallet.qml b/GUI/QtQuick/qml/CreateNewWallet.qml deleted file mode 100644 index 7c4b92a91..000000000 --- a/GUI/QtQuick/qml/CreateNewWallet.qml +++ /dev/null @@ -1,84 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2 -import QtQuick.Controls 2.9 -import QtQuick.Layouts 1.3 -import QtQml.Models 2 - -import "StyledControls" -import "BsStyles" -//import "BsControls" -//import "BsDialogs" -//import "js/helper.js" as JsHelper - -Item { - SeedPhrase { - id: seedPhrasePage - visible: false - } - ImportSeedPhrase { - id: importSeedPhrasePage - visible: false - } - - Column { - spacing: 32 - anchors.fill: parent - - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() - } - } - Label { - text: qsTr("Create new wallet") - font.pointSize: 14 - } - - Text { - text: qsTr("

Terms and conditions

Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...
") - font.pointSize: 10 - } - CheckBox { - id: checkboxTerms - text: qsTr("Agree with terms and conditions") - font.pointSize: 12 - } - - Row { - spacing: 23 - - Button { - text: qsTr("Hardware Wallet") - font.pointSize: 12 - enabled: false - } - Button { - text: qsTr("Import Wallet") - font.pointSize: 12 - enabled: checkboxTerms.checked - onClicked: { - stack.push(importSeedPhrasePage) - } - } - Button { - text: qsTr("Create new") - font.pointSize: 12 - enabled: checkboxTerms.checked - onClicked: { - seedPhrasePage.phrase = bsApp.newSeedPhrase() - stack.push(seedPhrasePage) - } - } - } - } -} diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 8e3b314af..d3637bf85 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -30,11 +30,6 @@ Item { signal curWalletIndexChanged(index : int) signal openSend (string txId, bool isRBF, bool isCPFP) - CreateNewWallet { - id: createNewWalletPage - visible: false - } - AddressDetails { id: addressDetails visible: false diff --git a/GUI/QtQuick/qml/ReceivePage.qml b/GUI/QtQuick/qml/ReceivePage.qml deleted file mode 100644 index 013635f36..000000000 --- a/GUI/QtQuick/qml/ReceivePage.qml +++ /dev/null @@ -1,131 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2022, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2.12 -import QtQuick.Controls 2.12 -import QtQuick.Layouts 1.12 -import QtQml.Models 2 - -import "StyledControls" -import "BsStyles" -//import "BsControls" -//import "BsDialogs" -//import "js/helper.js" as JsHelper - -Item { - id: receive - - Column { - spacing: 23 - anchors.fill: parent - - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() - } - } - - Label { - text: qsTr("Generate address") - font.pointSize: 14 - } - Row { - spacing: 23 - ComboBox { - id: receiveWalletsComboBox - model: bsApp.walletsList - currentIndex: walletsComboBox.currentIndex - font.pointSize: 14 - width: 500 - visible: (bsApp.walletsList.length > 1) - - onActivated: (index) => { - bsApp.walletSelected(index) - } - } - Label { - text: qsTr("%1 BTC").arg(bsApp.totalBalance) - font.pointSize: 14 - } - } - Label { - text: bsApp.generatedAddress.length ? qsTr("Bitcoins sent to this address will appear in %1").arg(receiveWalletsComboBox.textAt(receiveWalletsComboBox.currentIndex)) - : qsTr("Select address type") - font.pointSize: 12 - } - Row { - spacing: 5 - visible: !bsApp.generatedAddress.length - - RadioButton { - id: rbNative - checked: true - text: qsTr("
Native SegWit
(bech32)
") - font.pointSize: 10 - } - RadioButton { - id: rbNested - checked: false - text: qsTr("
Nested SegWit
(P2SH)
") - font.pointSize: 10 - } - } - Label { - visible: bsApp.generatedAddress.length - width: 900 - height: 32 - text: qsTr("%1").arg(bsApp.generatedAddress) - font.pointSize: 14 - } - Button { - visible: !bsApp.generatedAddress.length - width: 600 - text: qsTr("Generate") - font.pointSize: 14 - onClicked: { - bsApp.generateNewAddress(receiveWalletsComboBox.currentIndex, rbNative.checked) - } - } - Button { - visible: bsApp.generatedAddress.length - width: 600 - text: qsTr("Copy to clipboard") - font.pointSize: 14 - onClicked: { - bsApp.copyAddressToClipboard(bsApp.generatedAddress) - } - } - - TableView { - width: 1000 - height: 300 - columnSpacing: 1 - rowSpacing: 1 - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } - model: addressListModel - delegate: Rectangle { - implicitWidth: firstcol ? 550 : 150 - implicitHeight: 20 - border.color: "black" - border.width: 1 - color: heading ? 'black' : 'darkslategrey' - Text { - text: tabledata - font.pointSize: heading ? 8 : 10 - color: heading ? 'darkgrey' : 'lightgrey' - anchors.centerIn: parent - } - } - } - } -} diff --git a/GUI/QtQuick/qml/SeedPhrase.qml b/GUI/QtQuick/qml/SeedPhrase.qml deleted file mode 100644 index 5a0674277..000000000 --- a/GUI/QtQuick/qml/SeedPhrase.qml +++ /dev/null @@ -1,194 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2 -import QtQuick.Controls 2.9 -import QtQuick.Layouts 1.3 -import QtQml.Models 2 - -import "StyledControls" -import "BsStyles" -//import "BsControls" -//import "BsDialogs" -//import "js/helper.js" as JsHelper - -Item { - property var phrase - - VerifySeedPhrase { - id: verifySeedPhrase - visible: false - } - - Column { - spacing: 32 - anchors.fill: parent - - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() - } - } - Label { - text: qsTr("Create new wallet") - font.pointSize: 14 - } - Label { - text: qsTr("Write down and store your 12 word seed someplace safe and offline") - font.pointSize: 10 - } - - Row { - spacing: 23 - - TextEdit { - id: word1 - width: 250 - height: 32 - text: phrase[0] - color: 'darkgrey' - font.pointSize: 12 - enabled: false - } - TextEdit { - id: word2 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase[1] - enabled: false - } - TextEdit { - id: word3 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase[2] - enabled: false - } - } - Row { - spacing: 23 - - TextEdit { - id: word4 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase[3] - enabled: false - } - TextEdit { - id: word5 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase[4] - enabled: false - } - TextEdit { - id: word6 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase[5] - enabled: false - } - } - Row { - spacing: 23 - - TextEdit { - id: word7 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase[6] - enabled: false - } - TextEdit { - id: word8 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase[7] - enabled: false - } - TextEdit { - id: word9 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase[8] - enabled: false - } - } - Row { - spacing: 23 - - TextEdit { - id: word10 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase[9] - enabled: false - } - TextEdit { - id: word11 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase[10] - enabled: false - } - TextEdit { - id: word12 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase[11] - enabled: false - } - } - Row { - spacing: 50 - Button { - width: 450 - text: qsTr("Copy Seed") - font.pointSize: 12 - onClicked: { - bsApp.copySeedToClipboard(phrase) - } - } - Button { - width: 450 - text: qsTr("Continue") - font.pointSize: 12 - onClicked: { - verifySeedPhrase.phrase = phrase - stack.push(verifySeedPhrase) - } - } - } - } -} diff --git a/GUI/QtQuick/qml/SendAdvanced.qml b/GUI/QtQuick/qml/SendAdvanced.qml deleted file mode 100644 index 0399775f4..000000000 --- a/GUI/QtQuick/qml/SendAdvanced.qml +++ /dev/null @@ -1,306 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2.12 -import QtQuick.Controls 2.12 -import QtQuick.Layouts 1.12 -import QtQml.Models 2 - -import "StyledControls" -import "BsStyles" -//import "BsControls" -//import "BsDialogs" -//import "js/helper.js" as JsHelper - -Item { - property var recvAddress: "" - property int walletIdx - property var sendAmount: "" - property var comment: "" - id: send - - VerifyAdvancedTX { - id: verifySignTX - visible: false - } - - Column { - spacing: 23 - anchors.fill: parent - - Row { - Button { - text: qsTr("Simple") - font.pointSize: 12 - onClicked: { - stack.pop() - } - } - Text { - text: qsTr("Send Bitcoin") - font.pointSize: 14 - } - } - - Row { - spacing: 23 - Column { - spacing: 12 - Label { - text: qsTr("Inputs") - font.pointSize: 14 - } - Row { - ComboBox { - id: sendWalletsComboBox - model: bsApp.walletsList - currentIndex: walletIdx - font.pointSize: 12 - enabled: (bsApp.walletsList.length > 1) - width: 350 - onCurrentIndexChanged: { - bsApp.getUTXOsForWallet(sendWalletsComboBox.currentIndex) - } - } - Label { - text: qsTr("%1 BTC").arg(bsApp.totalBalance) - font.pointSize: 12 - } - } - TextInput { - id: fees - width: 400 - height: 32 - text: txInputsModel.fee - color: 'lightgrey' - font.pointSize: 14 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: qsTr("Fee Suggestions") - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - Text { - text: qsTr("s/b") - font.pointSize: 10 - color: 'darkgrey' - anchors.right: parent - anchors.horizontalCenter: parent - } - onAccepted: { - txInputsModel.fee = text - } - } - Row { - spacing: 23 - Label { - text: qsTr("Input Addresses") - font.pointSize: 10 - } - CheckBox { - id: cbSelectInputs - font.pointSize: 10 - text: qsTr("Select Inputs") - } - Label { - text: qsTr("#Tx: %1").arg(txInputsModel.nbTx) - font.pointSize: 10 - } - Label { - text: qsTr("Balance (BTC): %1").arg(txInputsModel.balance) - font.pointSize: 10 - } - } - TableView { - width: 500 - height: 250 - columnSpacing: 1 - rowSpacing: 1 - visible: cbSelectInputs.checked - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } - model: txInputsModel - delegate: Rectangle { - implicitWidth: 100 * colWidth - implicitHeight: 20 - border.color: "black" - border.width: 1 - color: bgColor - Text { - text: tableData ? tableData : "" - font.pointSize: heading ? 8 : 10 - color: dataColor - anchors.centerIn: parent - } - MouseArea { - anchors.fill: parent - onClicked: { - if (!heading) { - if (model.column === 0) { - txInputsModel.toggleSelection(model.row) - } - else if (model.column === 1) { - txInputsModel.toggle(model.row) - } - } - } - } - } - } - } - - Column { - spacing: 12 - Row { - Label { - text: qsTr("Outputs") - font.pointSize: 14 - } - Button { - text: "+" - font.pointSize: 14 - onClicked: { - var outAmount = parseFloat(amount.text) - if (recvAddress.text.length && (outAmount > 0)) { - txOutputs.addOutput(recvAddress.text, outAmount) - recvAddress.text = "" - amount.text = "" - } - } - } - } - TextInput { - id: outAddr - width: 400 - height: 32 - text: recvAddress - color: 'lightgrey' - font.pointSize: 14 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: qsTr("Receiver address") - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - } - Row { - TextInput { - id: amount - width: 400 - height: 32 - text: sendAmount - color: 'lightgrey' - font.pointSize: 14 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: qsTr("Amount") - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - Text { - text: qsTr("BTC") - font.pointSize: 10 - color: 'darkgrey' - anchors.right: parent - anchors.horizontalCenter: parent - } - onAccepted: { - var outAmount = parseFloat(text) - if (recvAddress.text.length && (outAmount > 0)) { - txOutputs.addOutput(recvAddress.text, outAmount) - recvAddress.text = "" - amount.text = "" - } - } - } - Button { - text: qsTr("MAX") - font.pointSize: 14 - } - } - TableView { - width: 480 - height: 200 - columnSpacing: 1 - rowSpacing: 1 - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } - model: txOutputsModel - delegate: Rectangle { - implicitWidth: 160 * colWidth - implicitHeight: 20 - border.color: "black" - border.width: 1 - color: heading ? 'black' : 'darkslategrey' - Text { - text: tableData ? tableData : "" - font.pointSize: heading ? 8 : 10 - color: dataColor - anchors.centerIn: parent - } - MouseArea { - anchors.fill: parent - onClicked: { - if (!heading && (model.column === 2)) { - txOutputsModel.delOutput(model.row) - } - } - } - } - } - } - } - - - TextEdit { - id: txComment - text: comment - width: 900 - height: 50 - color: 'lightgrey' - verticalAlignment: TextEdit.AlignVCenter - font.pointSize: 12 - Text { - text: qsTr("Comment") - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - font.pointSize: 10 - } - } - - Button { - width: 900 - text: qsTr("Continue") - font.pointSize: 14 - enabled: recvAddress.text.length && (parseFloat(amount.text) >= 0.00001) - && (parseFloat(fees.text) >= 1.0) - - onClicked: { - verifySignTX.txSignRequest = bsApp.createTXSignRequest( - sendWalletsComboBox.currentIndex, [], [], - parseFloat(fees.text), txComment.text, - txInputsModel.getSelection()) - stack.push(verifySignTX) - } - } - } -} diff --git a/GUI/QtQuick/qml/SendPage.qml b/GUI/QtQuick/qml/SendPage.qml deleted file mode 100644 index e138b5e2f..000000000 --- a/GUI/QtQuick/qml/SendPage.qml +++ /dev/null @@ -1,203 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2 -import QtQuick.Controls 2.9 -import QtQuick.Layouts 1.3 -import QtQml.Models 2 - -import "StyledControls" -import "BsStyles" -//import "BsControls" -//import "BsDialogs" -//import "js/helper.js" as JsHelper -import wallet.balance 1.0 - -Item { - id: send - - VerifyTX { - id: verifySignTX - visible: false - } - SendAdvanced { - id: advancedCreateTX - visible: false - } - - Column { - spacing: 23 - anchors.fill: parent - - Row { - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() - } - } - Text { - text: qsTr("Send Bitcoin") - font.pointSize: 14 - } - Button { - width: 300 - text: qsTr("Advanced") - font.pointSize: 14 - onClicked: { - bsApp.getUTXOsForWallet(sendWalletsComboBox.currentIndex) - txOutputsModel.clearOutputs() - txInputsModel.fee = fees.text - advancedCreateTX.walletIdx = sendWalletsComboBox.currentIndex - var outAmount = parseFloat(amount.text) - if ((outAmount >= 0.0000001) && (recvAddress.text.length)) { - txOutputsModel.addOutput(recvAddress.text, outAmount) - txInputsModel.getSelection() - advancedCreateTX.recvAddress = recvAddress.text - advancedCreateTX.sendAmount = amount.text - } - advancedCreateTX.comment = txComment.text - stack.push(advancedCreateTX) - } - } - } - - TextInput { - id: recvAddress - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 14 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: qsTr("Receiver address") - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - } - - Row { - TextInput { - id: amount - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 14 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: qsTr("Amount") - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - Text { - text: qsTr("BTC") - font.pointSize: 10 - color: 'darkgrey' - anchors.right: parent - anchors.horizontalCenter: parent - } - } - Button { - text: qsTr("MAX") - font.pointSize: 14 - } - } - Row { - spacing: 23 - ComboBox { - id: sendWalletsComboBox - model: walletBalances - textRole: "name" - valueRole: "name" - currentIndex: walletsComboBox.currentIndex - font.pointSize: 14 - enabled: (bsApp.walletsList.length > 1) - width: 350 - } - Label { - text: qsTr("%1 BTC").arg(walletBalances.data( - walletBalances.index(sendWalletsComboBox, 0), WalletBalance.TotalRole)) - font.pointSize: 14 - } - ComboBox { - id: fees - model: feeSuggestions - font.pointSize: 14 - textRole: "text" - valueRole: "value" - width: 500 - editable: true - } -/* TextInput { - id: fees_ - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 14 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: qsTr("Fee Suggestions") - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - Text { - text: qsTr("s/b") - font.pointSize: 10 - color: 'darkgrey' - anchors.right: parent - anchors.horizontalCenter: parent - } - }*/ - } - TextEdit { - id: txComment - width: 900 - height: 84 - color: 'lightgrey' - verticalAlignment: TextEdit.AlignVCenter - font.pointSize: 12 - Text { - text: qsTr("Comment") - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - font.pointSize: 10 - } - } - - Button { - width: 900 - text: qsTr("Continue") - font.pointSize: 14 - enabled: recvAddress.text.length && (parseFloat(amount.text) >= 0.00001) - /*&& (parseFloat(fees.text) >= 1.0)*/ - - onClicked: { - console.log("fees.text = " + parseFloat(fees.text)) - console.log("amount.text = " + parseFloat(amount.text)) - console.log("recvAddress.text.length = " + recvAddress.text.length) - verifySignTX.txSignRequest = bsApp.createTXSignRequest( - sendWalletsComboBox.currentIndex, [recvAddress.text], - [parseFloat(amount.text)], parseFloat(fees.text), - txComment.text) - stack.push(verifySignTX) - } - } - } -} diff --git a/GUI/QtQuick/qml/SettingsPage.qml b/GUI/QtQuick/qml/SettingsPage.qml deleted file mode 100644 index e6bca4acc..000000000 --- a/GUI/QtQuick/qml/SettingsPage.qml +++ /dev/null @@ -1,166 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2 -import QtQuick.Controls 2.9 -import QtQuick.Layouts 1.3 -import QtQml.Models 2 - -import "StyledControls" -import "BsStyles" -//import "BsControls" -//import "BsDialogs" -//import "js/helper.js" as JsHelper - -Item { - id: settings - - Column { - spacing: 50 - anchors.fill: parent - - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() - } - } - CheckBox { - id: cbGeneral - text: qsTr("General >") - font.pointSize: 14 - onCheckStateChanged: { - if (checked) { - cbNetwork.checked = false - cbAbout.checked = false - } - } - } - GridLayout { - columns: 2 - visible: cbGeneral.checked - - Label { - text: qsTr("Log file:") - font.pointSize: 12 - } - TextInput { - id: mainLog - width: 500 - height: 32 - color: 'lightgrey' - text: bsApp.settingLogFile - font.pointSize: 12 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - } - Label { - text: qsTr("Messages log file:") - font.pointSize: 12 - } - TextInput { - id: msgLog - width: 500 - height: 32 - color: 'lightgrey' - text: bsApp.settingMsgLogFile - font.pointSize: 12 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - } - Label { - text: " " - font.pointSize: 12 - } - CheckBox { - id: cbAdvTX - width: 500 - height: 32 - text: qsTr("Advanced TX dialog by default") - font.pointSize: 12 - checked: bsApp.settingAdvancedTX - } - } - - CheckBox { - id: cbNetwork - text: qsTr("Network >") - font.pointSize: 14 - onCheckStateChanged: { - if (checked) { - cbGeneral.checked = false - cbAbout.checked = false - } - } - } - GridLayout { - columns: 2 - visible: cbNetwork.checked - Label { - text: qsTr("Environment:") - font.pointSize: 12 - } - ComboBox { - id: cbEnvironments - model: bsApp.settingEnvironments - font.pointSize: 12 - currentIndex: bsApp.settingEnvironment - onCurrentIndexChanged: { - bsApp.settingEnvironment = currentIndex - } - } - Label { - text: qsTr("Armory host:") - font.pointSize: 12 - } - TextInput { - id: armoryHost - width: 500 - height: 32 - color: 'lightgrey' - text: bsApp.settingArmoryHost - font.pointSize: 12 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - onTextChanged: { - bsApp.settingArmoryHost = text - } - } - Label { - text: qsTr("Armory port:") - font.pointSize: 12 - } - TextInput { - id: armoryPort - width: 500 - height: 32 - color: 'lightgrey' - text: bsApp.settingArmoryPort - font.pointSize: 12 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - onTextChanged: { - bsApp.settingArmoryPort = text - } - } - } - CheckBox { - id: cbAbout - text: qsTr("About >") - font.pointSize: 14 - onCheckStateChanged: { - if (checked) { - cbGeneral.checked = false - cbNetwork.checked = false - } - } - } - } -} diff --git a/GUI/QtQuick/qml/VerifyAdvancedTX.qml b/GUI/QtQuick/qml/VerifyAdvancedTX.qml deleted file mode 100644 index a84ab0f5c..000000000 --- a/GUI/QtQuick/qml/VerifyAdvancedTX.qml +++ /dev/null @@ -1,179 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2.12 -import QtQuick.Controls 2.12 -import QtQuick.Layouts 1.12 -import QtQml.Models 2 - -import "StyledControls" -import "BsStyles" -//import "BsControls" -//import "BsDialogs" -//import "js/helper.js" as JsHelper - -Item { - property var txSignRequest - - Column { - spacing: 23 - anchors.fill: parent - - Row { - spacing: 100 - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() - } - } - Label { - text: qsTr("Sign Transaction") - font.pointSize: 14 - } - } - Row { - spacing: 23 - - TableView { - width: 480 - height: 250 - columnSpacing: 1 - rowSpacing: 1 - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } - model: addressListModel - delegate: Rectangle { - implicitWidth: 120 - implicitHeight: 20 - border.color: "black" - border.width: 1 - color: heading ? 'black' : 'darkslategrey' - Text { - text: tabledata - font.pointSize: heading ? 8 : 10 - color: heading ? 'darkgrey' : 'lightgrey' - anchors.centerIn: parent - } - } - } - - TableView { - width: 480 - height: 250 - columnSpacing: 1 - rowSpacing: 1 - clip: true - ScrollIndicator.horizontal: ScrollIndicator { } - ScrollIndicator.vertical: ScrollIndicator { } - model: addressListModel - delegate: Rectangle { - implicitWidth: 120 - implicitHeight: 20 - border.color: "black" - border.width: 1 - color: heading ? 'black' : 'darkslategrey' - Text { - text: tabledata - font.pointSize: heading ? 8 : 10 - color: heading ? 'darkgrey' : 'lightgrey' - anchors.centerIn: parent - } - } - } - } - - GridLayout { - columns: 4 - columnSpacing: 50 - Label { - text: qsTr("Input amount:") - font.pointSize: 12 - } - Label { - text: qsTr("%1").arg(txSignRequest.inputAmount) - font.pointSize: 12 - } - Label { - text: qsTr("Transaction size:") - font.pointSize: 12 - } - Label { - text: qsTr("%1").arg(txSignRequest.txSize) - font.pointSize: 12 - } - Label { - text: qsTr("Return amount:") - font.pointSize: 12 - } - Label { - text: qsTr("%1").arg(txSignRequest.returnAmount) - font.pointSize: 12 - } - Label { - text: qsTr("Fee per byte:") - font.pointSize: 12 - } - Label { - text: qsTr("%1").arg(txSignRequest.feePerByte) - font.pointSize: 12 - } - Label { - text: qsTr("Transaction fee:") - font.pointSize: 12 - } - Label { - text: qsTr("%1").arg(txSignRequest.fee) - font.pointSize: 12 - } - Label { - text: qsTr("Total spent:") - font.pointSize: 12 - } - Label { - text: qsTr("%1").arg(txSignRequest.outputAmount) - font.pointSize: 12 - } - } - TextInput { - id: password - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 14 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - echoMode: TextInput.Password - passwordCharacter: '*' - Text { - text: qsTr("Password") - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - } - Button { - width: 900 - text: qsTr("Broadcast") - font.pointSize: 14 - enabled: txSignRequest.isValid && password.text.length - - onClicked: { - bsApp.signAndBroadcast(txSignRequest, password.text) - stack.pop() - stack.pop() - stack.pop() - password.text = "" - } - } - } -} diff --git a/GUI/QtQuick/qml/VerifySeedPhrase.qml b/GUI/QtQuick/qml/VerifySeedPhrase.qml deleted file mode 100644 index 59b28e54d..000000000 --- a/GUI/QtQuick/qml/VerifySeedPhrase.qml +++ /dev/null @@ -1,144 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2 -import QtQuick.Controls 2.9 -import QtQuick.Layouts 1.3 -import QtQml.Models 2 - -import "StyledControls" -import "BsStyles" - -Item { - property var phrase - - WalletNamePass { - id: walletNamePass - visible: false - } - - Column { - spacing: 23 - anchors.fill: parent - - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() - } - } - Label { - text: qsTr("Verify your seed") - font.pointSize: 14 - } - - TextInput { - id: word1 - property bool isValid: (phrase[0] === text) - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 12 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "1" - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - } - TextInput { - id: word6 - property bool isValid: (phrase[5] === text) - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 12 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "6" - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - } - TextInput { - id: word8 - property bool isValid: (phrase[7] === text) - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 12 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "8" - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - } - TextInput { - id: word11 - property bool isValid: (phrase[10] === text) - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 12 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "11" - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - } - - Label { - id: verifResult - height: 32 - color: 'red' - text: (word1.isValid && word6.isValid && word8.isValid && word11.isValid) - ? "" : qsTr("Your words are wrong") - } - - Row { - spacing: 50 - Button { - width: 450 - text: qsTr("Skip") - font.pointSize: 12 - onClicked: { // TODO: show confirmation or add a checkbox to confirm - walletNamePass.phrase = phrase - walletNamePass.popLevel = 4 - stack.push(walletNamePass) - } - } - Button { - width: 450 - text: qsTr("Continue") - font.pointSize: 12 - enabled: word1.isValid && word6.isValid && word8.isValid && word11.isValid - onClicked: { - walletNamePass.phrase = phrase - walletNamePass.popLevel = 4 - stack.push(walletNamePass) - } - } - } - } -} diff --git a/GUI/QtQuick/qml/WalletNamePass.qml b/GUI/QtQuick/qml/WalletNamePass.qml deleted file mode 100644 index 60e3cd18a..000000000 --- a/GUI/QtQuick/qml/WalletNamePass.qml +++ /dev/null @@ -1,112 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2 -import QtQuick.Controls 2.9 -import QtQuick.Layouts 1.3 -import QtQml.Models 2 - -import "StyledControls" -import "BsStyles" - -Item { - property var phrase - property int popLevel: 3 - property bool isImport: false - - Column { - spacing: 23 - anchors.fill: parent - - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() - } - } - Label { - text: qsTr("Set password") - font.pointSize: 14 - } - - TextInput { - id: walletName - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 14 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: qsTr("Wallet name") - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - } - - TextInput { - id: pass1 - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 14 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - echoMode: TextInput.Password - passwordCharacter: '*' - Text { - text: qsTr("Password") - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - } - TextInput { - id: pass2 - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 14 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - echoMode: TextInput.Password - passwordCharacter: '*' - Text { - text: qsTr("Confirm password") - font.pointSize: 6 - color: 'darkgrey' - anchors.left: parent - anchors.top: parent - } - } - - Button { - width: 900 - text: qsTr("Confirm") - font.pointSize: 14 - enabled: pass1.text.length && pass2.text.length && (pass1.text == pass2.text) - - onClicked: { - if (isImport) { - bsApp.importWallet(walletName.text, phrase, pass1.text) - } - else { - bsApp.createWallet(walletName.text, phrase, pass1.text) - } - for (var i = 0; i < popLevel; i++) { - stack.pop() - } - } - } - } -} diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml index ad6769f05..d49508a87 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -104,9 +104,11 @@ ColumnLayout { Layout.alignment: Qt.AlignLeft | Qt.AlingTop font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + + text: bsApp.settingExportDir color: BSStyle.titanWhiteColor - text: wallet_properties_vm.exportPath - leftPadding: 24 } Button { @@ -174,7 +176,7 @@ ColumnLayout { selectFolder: true onAccepted: { - wallet_properties_vm.exportPath = fileDialog.fileUrl + bsApp.settingExportDir = fileDialog.fileUrl.toString().replace(/^(file:\/{3})/,""); } } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index f68bd59a7..22eea1978 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -155,21 +155,6 @@ ApplicationWindow { anchors.fill: parent } - SendPage { - id: sendPage - visible: false - } - - ReceivePage { - id: receivePage - visible: false - } - - SettingsPage { - id: settingsPage - visible: false - } - header: Column { height: 57 width: parent.width diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index d357be671..75e362024 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -20,17 +20,8 @@ qml/ExplorerAddress.qml qml/ExplorerTX.qml qml/ExplorerLoader.qml - qml/SendPage.qml - qml/SendAdvanced.qml - qml/ReceivePage.qml - qml/SettingsPage.qml - qml/CreateNewWallet.qml - qml/SeedPhrase.qml qml/ImportSeedPhrase.qml - qml/VerifySeedPhrase.qml - qml/WalletNamePass.qml qml/VerifyTX.qml - qml/VerifyAdvancedTX.qml qml/InfoBanner.qml qml/InfoBannerComponent.qml qml/InfoBar.qml diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index b22c3e21a..20fac4bf1 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -8,12 +8,16 @@ ********************************************************************************** */ + #include "WalletPropertiesVM.h" +#include + using namespace qtquick_gui; -WalletPropertiesVM::WalletPropertiesVM(QObject* parent) - : QObject(parent) +WalletPropertiesVM::WalletPropertiesVM(const std::shared_ptr & logger, QObject* parent) + : QObject(parent), + logger_(logger) { } @@ -99,14 +103,3 @@ const QStringList& WalletPropertiesVM::seed() const { return seed_; } - -const QString& WalletPropertiesVM::exportPath() const -{ - return exportPath_; -} - -void WalletPropertiesVM::setExportPath(const QString& path) -{ - exportPath_ = path; - emit pathChanged(); -} diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h index 7218c22dd..0c5fd7229 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h @@ -10,8 +10,14 @@ */ #pragma once +#include + #include +namespace spdlog { + class logger; +} + namespace qtquick_gui { @@ -39,10 +45,9 @@ class WalletPropertiesVM: public QObject Q_PROPERTY(bool isHardware READ isHardware NOTIFY changed) Q_PROPERTY(bool isWatchingOnly READ isWatchingOnly NOTIFY changed) Q_PROPERTY(QStringList seed READ seed NOTIFY seedChanged) - Q_PROPERTY(QString exportPath READ exportPath WRITE setExportPath NOTIFY pathChanged) public: - WalletPropertiesVM(QObject* parent = nullptr); + WalletPropertiesVM(const std::shared_ptr & logger, QObject* parent = nullptr); void setWalletInfo(const WalletInfo& info); void setWalletSeed(const std::string& walletId, const std::string& seed); @@ -60,21 +65,17 @@ class WalletPropertiesVM: public QObject bool isWatchingOnly() const; const QStringList& seed() const; - - const QString& exportPath() const; - void setExportPath(const QString& path); - + signals: void changed(); void seedChanged(); - void pathChanged(); private: + std::shared_ptr logger_; WalletInfo info_; uint32_t nbActiveAddrs_{ 0 }; uint32_t nbUTXOs_{ 0 }; QStringList seed_; - QString exportPath_; }; } From 60505913a8ad9be44177f09c9f4b4338f801e51d Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 8 Mar 2023 17:09:11 +0200 Subject: [PATCH 205/436] rm patch --- GUI/QtQuick/lof.patch | 108 ------------------------------------------ 1 file changed, 108 deletions(-) delete mode 100644 GUI/QtQuick/lof.patch diff --git a/GUI/QtQuick/lof.patch b/GUI/QtQuick/lof.patch deleted file mode 100644 index ba9f39e70..000000000 --- a/GUI/QtQuick/lof.patch +++ /dev/null @@ -1,108 +0,0 @@ -diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp -index 69a430976..eb5e510f3 100644 ---- a/GUI/QtQuick/QtQuickAdapter.cpp -+++ b/GUI/QtQuick/QtQuickAdapter.cpp -@@ -148,7 +148,6 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) - , userSigner_(std::make_shared(TerminalUsers::Signer)) - , userHWW_(bs::message::UserTerminal::create(bs::message::TerminalUsers::HWWallets)) - , txTypes_({ tr("All transactions"), tr("Received"), tr("Sent"), tr("Internal") }) -- , walletPropertiesModel_(std::make_unique()) - { - staticLogger = logger; - addrModel_ = new QmlAddressListModel(logger, this); -@@ -161,6 +160,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) - hwDeviceModel_ = new HwDeviceModel(logger, this); - walletBalances_ = new WalletBalancesModel(logger, this); - feeSuggModel_ = new FeeSuggestionModel(logger, this); -+ walletPropertiesModel_ = std::make_unique(logger); - } - - QtQuickAdapter::~QtQuickAdapter() -@@ -242,7 +242,9 @@ void QtQuickAdapter::run(int &argc, char **argv) - qmlRegisterType("terminal.models", 1, 0, "TransactionFilterModel"); - qmlRegisterType("terminal.models", 1, 0, "TransactionForAddressFilterModel"); - qmlRegisterType("terminal.models", 1, 0, "PendingTransactionFilterModel"); -- qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); -+ qmlRegisterUncreatableMetaObject(qtquick_gui::WalletPropertiesVM::staticMetaObject, "terminal.models" -+ , 1, 0, "WalletPropertiesVM", tr("Error: only enums")); -+// qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); - qmlRegisterUncreatableMetaObject(Transactions::staticMetaObject, "terminal.models" - , 1, 0, "Transactions", tr("Error: only enums")); - qmlRegisterUncreatableMetaObject(TxListModel::staticMetaObject, "terminal.models" -diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp -index b22c3e21a..8704ad9f2 100644 ---- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp -+++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp -@@ -8,12 +8,16 @@ - ********************************************************************************** - - */ -+ - #include "WalletPropertiesVM.h" - -+#include -+ - using namespace qtquick_gui; - --WalletPropertiesVM::WalletPropertiesVM(QObject* parent) -- : QObject(parent) -+WalletPropertiesVM::WalletPropertiesVM(const std::shared_ptr & logger, QObject* parent) -+ : QObject(parent), -+ logger_(logger) - { - } - -@@ -102,11 +106,13 @@ const QStringList& WalletPropertiesVM::seed() const - - const QString& WalletPropertiesVM::exportPath() const - { -+ logger_->debug("[{}] exportPath_: {}", __func__, exportPath_.toStdString()); - return exportPath_; - } - - void WalletPropertiesVM::setExportPath(const QString& path) - { -+ logger_->debug("[{}] exportPath_: {}", __func__, exportPath_.toStdString()); - exportPath_ = path; - emit pathChanged(); - } -diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h -index 7218c22dd..fe9c51c0c 100644 ---- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h -+++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h -@@ -10,8 +10,14 @@ - */ - #pragma once - -+#include -+ - #include - -+namespace spdlog { -+ class logger; -+} -+ - namespace qtquick_gui - { - -@@ -39,10 +45,10 @@ class WalletPropertiesVM: public QObject - Q_PROPERTY(bool isHardware READ isHardware NOTIFY changed) - Q_PROPERTY(bool isWatchingOnly READ isWatchingOnly NOTIFY changed) - Q_PROPERTY(QStringList seed READ seed NOTIFY seedChanged) -- Q_PROPERTY(QString exportPath READ exportPath WRITE setExportPath NOTIFY pathChanged) -+ Q_PROPERTY(QString exportPath READ exportPath WRITE setExportPath NOTIFY pathChanged) - - public: -- WalletPropertiesVM(QObject* parent = nullptr); -+ WalletPropertiesVM(const std::shared_ptr&, QObject* parent = nullptr); - - void setWalletInfo(const WalletInfo& info); - void setWalletSeed(const std::string& walletId, const std::string& seed); -@@ -75,6 +81,7 @@ private: - uint32_t nbUTXOs_{ 0 }; - QStringList seed_; - QString exportPath_; -+ std::shared_ptr logger_; - }; - - } From 786f53fb02d8713d9c4053b5ac98e5d953e5438f Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 8 Mar 2023 22:11:52 +0200 Subject: [PATCH 206/436] qml: export wo wallet: fix bugs --- GUI/QtQuick/QtQuickAdapter.cpp | 5 ++-- GUI/QtQuick/QtQuickAdapter.h | 3 +- GUI/QtQuick/qml/CreateWallet/CreateWallet.qml | 4 ++- .../CustomSuccessWidget.qml} | 4 +++ .../qml/WalletProperties/ExportWOWallet.qml | 30 ++++++++++++++++++- .../WalletPropertiesPopup.qml | 15 ++++++++++ GUI/QtQuick/qtquick.qrc | 2 +- 7 files changed, 57 insertions(+), 6 deletions(-) rename GUI/QtQuick/qml/{CreateWallet/SuccessNewWallet.qml => StyledControls/CustomSuccessWidget.qml} (95%) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 1b470b0f7..f44a79c46 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2086,12 +2086,13 @@ int QtQuickAdapter::changePassword(const QString& walletId, const QString& oldPa return (msgId == 0) ? -1 : 0; } -int QtQuickAdapter::exportWalletAuth(const QString& walletId, const QString& password) +int QtQuickAdapter::exportWallet(const QString& walletId) { + //TODO + // exportDir = settingExportDir() SignerMessage msg; auto msgReq = msg.mutable_export_wo_wallet(); msgReq->set_wallet_id(walletId.toStdString()); - msgReq->set_password(password.toStdString()); const auto msgId = pushRequest(user_, userSigner_, msg.SerializeAsString()); return (msgId == 0) ? -1 : 0; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index b2a78cb19..d8ffca9e3 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -170,7 +170,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void startAddressSearch(const QString&); Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); Q_INVOKABLE int changePassword(const QString& walletId, const QString& oldPassword, const QString& newPassword); - Q_INVOKABLE int exportWalletAuth(const QString& walletId, const QString& password); + Q_INVOKABLE int exportWallet(const QString& walletId); Q_INVOKABLE int viewWalletSeedAuth(const QString& walletId, const QString& password); Q_INVOKABLE int deleteWallet(const QString& walletId, const QString& password); Q_INVOKABLE int rescanWallet(const QString& walletId); @@ -189,6 +189,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void invokePasswordEntry(const QString& devName, bool acceptOnDevice); void showError(const QString&); void showNotification(QString, QString); + void successExport(QString nameExport); private slots: void onArmoryServerChanged(const QModelIndex&, const QVariant&); diff --git a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml index 314584655..26ea7a5e3 100644 --- a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml @@ -129,8 +129,10 @@ CustomPopup { } } - SuccessNewWallet { + CustomSuccessWidget { id: success_wallet + + details_text: qsTr("Your wallet has successfully been created") visible: false onSig_finish: { root.close() diff --git a/GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml similarity index 95% rename from GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml rename to GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml index d3e8c0a31..2ba13699f 100644 --- a/GUI/QtQuick/qml/CreateWallet/SuccessNewWallet.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml @@ -10,6 +10,8 @@ ColumnLayout { id: layout + property alias details_text: details.text + signal sig_finish() height: 485 @@ -39,6 +41,8 @@ ColumnLayout { Label { + id: details + Layout.topMargin: 26 Layout.alignment: Qt.AlignTop | Qt.AlignHCenter text: qsTr("Your wallet has successfully been created") diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml index d49508a87..bb8954596 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -10,6 +10,8 @@ import "../StyledControls" ColumnLayout { id: layout + signal sig_success(string nameExport) + property var wallet_properties_vm height: 548 @@ -17,6 +19,16 @@ ColumnLayout { spacing: 0 + + Connections + { + target:bsApp + function onSuccessExport (nameExport) + { + layout.sig_success(nameExport) + } + } + CustomTitleLabel { id: title Layout.alignment: Qt.AlignCenter @@ -156,6 +168,8 @@ ColumnLayout { CustomButton { id: confirm_but + + enabled: bsApp.settingExportDir preferred: true text: qsTr("Export") @@ -166,9 +180,18 @@ ColumnLayout { function click_enter() { bsApp.exportWallet(wallet_properties_vm.walletId) + layout.sig_export() } } + Keys.onEnterPressed: { + confirm_but.click_enter() + } + + Keys.onReturnPressed: { + confirm_but.click_enter() + } + FileDialog { id: fileDialog title: qsTr("Please choose a directory") @@ -176,7 +199,12 @@ ColumnLayout { selectFolder: true onAccepted: { - bsApp.settingExportDir = fileDialog.fileUrl.toString().replace(/^(file:\/{3})/,""); + var res = fileDialog.fileUrl.toString().replace(/^(file:\/{3})/,"") + if (res) + { + bsApp.settingExportDir = res + } } } + } diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 25466e736..987b9b44a 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -29,6 +29,11 @@ CustomPopup { visible: false wallet_properties_vm: root.wallet_properties_vm + + onSig_success: (nameExport) => { + _stack_view.push(success) + success.details_text = qsTr("Wallet %1 has successfully been exported").arg(nameExport) + } } WalletSeedAuth { @@ -73,6 +78,16 @@ CustomPopup { } } + CustomSuccessWidget { + id: success + + visible: false + onSig_finish: { + root.close() + _stack_view.pop(null) + } + } + Rectangle { id: properties height: 548 diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 75e362024..e7e1047db 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -83,7 +83,6 @@ qml/CreateWallet/ImportWatchingWallet.qml qml/CreateWallet/qmldir qml/CreateWallet/StartCreateWallet.qml - qml/CreateWallet/SuccessNewWallet.qml qml/CreateWallet/TermsAndConditions.qml qml/CreateWallet/WalletSeed.qml qml/CreateWallet/WalletSeedSkipAccept.qml @@ -173,5 +172,6 @@ images/wallet_icon_warn.svg qml/StyledControls/CustomHorizontalHeaderView.qml qml/StyledControls/CustomRbfCpfpMenu.qml + qml/StyledControls/CustomSuccessWidget.qml From 94493444b5f08575c5b8a08c93fbdb64e8d98c1e Mon Sep 17 00:00:00 2001 From: dvajdual Date: Wed, 8 Mar 2023 22:57:30 +0200 Subject: [PATCH 207/436] qml: export wo wallet: fix bugs --- GUI/QtQuick/QtQuickAdapter.cpp | 4 +--- GUI/QtQuick/QtQuickAdapter.h | 2 +- GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml | 8 ++++---- .../qml/WalletProperties/WalletPropertiesPopup.qml | 4 ++-- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index f44a79c46..76e3cfb07 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2086,10 +2086,8 @@ int QtQuickAdapter::changePassword(const QString& walletId, const QString& oldPa return (msgId == 0) ? -1 : 0; } -int QtQuickAdapter::exportWallet(const QString& walletId) +int QtQuickAdapter::exportWallet(const QString& walletId, const QString & exportDir) { - //TODO - // exportDir = settingExportDir() SignerMessage msg; auto msgReq = msg.mutable_export_wo_wallet(); msgReq->set_wallet_id(walletId.toStdString()); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index d8ffca9e3..aa065c685 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -170,7 +170,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void startAddressSearch(const QString&); Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); Q_INVOKABLE int changePassword(const QString& walletId, const QString& oldPassword, const QString& newPassword); - Q_INVOKABLE int exportWallet(const QString& walletId); + Q_INVOKABLE int exportWallet(const QString& walletId, const QString & exportDir); Q_INVOKABLE int viewWalletSeedAuth(const QString& walletId, const QString& password); Q_INVOKABLE int deleteWallet(const QString& walletId, const QString& password); Q_INVOKABLE int rescanWallet(const QString& walletId); diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml index bb8954596..75c70e188 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -10,7 +10,7 @@ import "../StyledControls" ColumnLayout { id: layout - signal sig_success(string nameExport) + signal sig_success(string nameExport, string pathExport) property var wallet_properties_vm @@ -25,7 +25,7 @@ ColumnLayout { target:bsApp function onSuccessExport (nameExport) { - layout.sig_success(nameExport) + layout.sig_success(nameExport, bsApp.settingExportDir) } } @@ -169,7 +169,7 @@ ColumnLayout { CustomButton { id: confirm_but - enabled: bsApp.settingExportDir + enabled: bsApp.settingExportDir.length === 0 preferred: true text: qsTr("Export") @@ -179,7 +179,7 @@ ColumnLayout { width: 530 function click_enter() { - bsApp.exportWallet(wallet_properties_vm.walletId) + bsApp.exportWallet(wallet_properties_vm.walletId, bsApp.settingExportDir) layout.sig_export() } } diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 987b9b44a..03e0c2a97 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -30,9 +30,9 @@ CustomPopup { wallet_properties_vm: root.wallet_properties_vm - onSig_success: (nameExport) => { + onSig_success: (nameExport, pathExport) => { _stack_view.push(success) - success.details_text = qsTr("Wallet %1 has successfully been exported").arg(nameExport) + success.details_text = qsTr("Wallet %1 has successfully been exported to %2").arg(nameExport).arg(pathExport) } } From 09ad3b766b5dc12725ceb140ea2b7c15613b29bf Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 9 Mar 2023 09:55:56 +0200 Subject: [PATCH 208/436] pr fixes --- GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml index 75c70e188..8d0243446 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -169,7 +169,7 @@ ColumnLayout { CustomButton { id: confirm_but - enabled: bsApp.settingExportDir.length === 0 + enabled: bsApp.settingExportDir.length !== 0 preferred: true text: qsTr("Export") From 2e31b8834326d7dc40c225232f9592c7a118c4f5 Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 8 Mar 2023 21:57:21 +0100 Subject: [PATCH 209/436] QML warnings --- GUI/QtQuick/QtQuickAdapter.cpp | 13 +- GUI/QtQuick/QtQuickAdapter.h | 2 +- GUI/QtQuick/qml/AddressDetails.qml | 2 +- GUI/QtQuick/qml/ExplorerAddress.qml | 19 +- GUI/QtQuick/qml/ExplorerTX.qml | 39 ++-- GUI/QtQuick/qml/ImportSeedPhrase.qml | 48 ----- GUI/QtQuick/qml/Receive/ReceiveQrCode.qml | 2 +- GUI/QtQuick/qml/SeedPhrase.qml | 194 ++++++++++++++++++ GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 +- GUI/QtQuick/qml/Send/PasswordWithTimer.qml | 2 +- GUI/QtQuick/qml/Send/SelectInputs.qml | 3 + GUI/QtQuick/qml/Send/SignTransaction.qml | 22 +- .../qml/Send/SignTransactionAdvanced.qml | 24 ++- .../CustomHorizontalHeaderView.qml | 1 + .../qml/StyledControls/CustomListItem.qml | 2 +- .../StyledControls/CustomMessageDialog.qml | 1 + .../qml/StyledControls/CustomTableView.qml | 4 + .../StyledControls/InputOutputTableView.qml | 2 +- GUI/QtQuick/qml/TransactionDetails.qml | 18 +- GUI/QtQuick/qml/TransactionsPage.qml | 4 - GUI/QtQuick/qml/VerifySeedPhrase.qml | 136 ++++++++++++ GUI/QtQuick/qml/WalletNamePass.qml | 106 ++++++++++ 22 files changed, 528 insertions(+), 118 deletions(-) create mode 100644 GUI/QtQuick/qml/SeedPhrase.qml create mode 100644 GUI/QtQuick/qml/VerifySeedPhrase.qml create mode 100644 GUI/QtQuick/qml/WalletNamePass.qml diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 76e3cfb07..e7150b59f 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -73,7 +73,7 @@ namespace { return QObject::tr("Auth eID"); case bs::wallet::EncryptionType::Hardware : - return QObject::tr("Hardware Security Module"); + return QObject::tr("Hardware"); }; return QObject::tr("Unknown"); } @@ -1075,8 +1075,12 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId } } else { - itTxDet->second->setDetails(txDet); // shouldn't be more than one entry - itTxDet->second->setCurBlock(blockNum_); + const auto details = itTxDet->second; + QMetaObject::invokeMethod(this, [this, details, txDet] { + details->setDetails(txDet); + details->setCurBlock(blockNum_); + }); // shouldn't be more than one entry + txDetailReqs_.erase(itTxDet); } } @@ -1706,7 +1710,8 @@ ProcessingResult QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMess } catch (const std::exception&) {} } - notifyNewTransaction(txEntry); + QMetaObject::invokeMethod(this, [this, txEntry] { notifyNewTransaction(txEntry); }); + } pushRequest(user_, userWallets_, msg.SerializeAsString()); return ProcessingResult::Success; diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index aa065c685..455be86da 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -94,7 +94,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_PROPERTY(QStringList txWalletsList READ txWalletsList NOTIFY walletsListChanged) QStringList txWalletsList() const; - Q_PROPERTY(QStringList txTypesList READ txTypesList) + Q_PROPERTY(QStringList txTypesList READ txTypesList CONSTANT) QStringList txTypesList() const { return txTypes_; } Q_PROPERTY(QString generatedAddress READ generatedAddress NOTIFY addressGenerated) diff --git a/GUI/QtQuick/qml/AddressDetails.qml b/GUI/QtQuick/qml/AddressDetails.qml index e67af9d9b..c9cfb2c7b 100644 --- a/GUI/QtQuick/qml/AddressDetails.qml +++ b/GUI/QtQuick/qml/AddressDetails.qml @@ -71,7 +71,7 @@ Popup { anchors.verticalCenter: parent.verticalCenter Image { - source: "image://QR/" + address_details.address + source: address !== "" ? ("image://QR/" + address_details.address) : "" sourceSize.width: parent.width - parent.radius sourceSize.height: parent.width - parent.radius anchors.centerIn: parent diff --git a/GUI/QtQuick/qml/ExplorerAddress.qml b/GUI/QtQuick/qml/ExplorerAddress.qml index 596e19c74..cdeb30f96 100644 --- a/GUI/QtQuick/qml/ExplorerAddress.qml +++ b/GUI/QtQuick/qml/ExplorerAddress.qml @@ -21,7 +21,7 @@ import "Overview" //import "js/helper.js" as JsHelper Item { - property var address + property string address signal requestPageChange(var text) @@ -34,25 +34,28 @@ Item { Row { spacing: 16 + height: 20 Label { text: qsTr("Address") color: BSStyle.textColor font.pixelSize: 20 font.weight: Font.Bold - anchors.bottom: parent.bottom + height: parent.height + verticalAlignment: Text.AlignBottom } Label { id: address_label - text: address + text: address !== null ? address : "" color: BSStyle.textColor font.pixelSize: 14 - anchors.bottom: parent.bottom - } + height: parent.height + verticalAlignment: Text.AlignBottom - CopyIconButton { - anchors.left: address.right - onCopy: bsApp.copyAddressToClipboard(address) + CopyIconButton { + anchors.left: address_label.right + onCopy: bsApp.copyAddressToClipboard(address) + } } } diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index 90336910b..b7abd3d20 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -21,7 +21,7 @@ import "Overview" //import "js/helper.js" as JsHelper Item { - property var tx + property var tx: null signal requestPageChange(var text) @@ -34,24 +34,29 @@ Item { Row { spacing: 16 + height: 20 + width: parent.width Label { text: qsTr("Transaction ID") + height: parent.height color: BSStyle.textColor font.pixelSize: 20 font.weight: Font.Bold - anchors.bottom: parent.bottom + verticalAlignment: Text.AlignBottom } Label { + id: transactionIdLabel + height: parent.height text: tx ? tx.txId : qsTr("Unknown") color: BSStyle.textColor font.pixelSize: 14 - anchors.bottom: parent.bottom - } + verticalAlignment: Text.AlignBottom - CopyIconButton { - anchors.left: address.right - onCopy: bsApp.copyAddressToClipboard(tx.txId) + CopyIconButton { + anchors.left: transactionIdLabel.right + onCopy: bsApp.copyAddressToClipboard(tx.txId) + } } } @@ -76,7 +81,7 @@ Item { BaseBalanceLabel { width: 110 label_text: qsTr("Confirmations") - label_value: tx.nbConf + label_value: tx !== null ? tx.nbConf : "" anchors.verticalCenter: parent.verticalCenter label_value_color: "green" } @@ -91,7 +96,7 @@ Item { BaseBalanceLabel { width: 80 label_text: qsTr("Inputs") - label_value: tx.nbInputs + label_value: tx !== null ? tx.nbInputs : "" anchors.verticalCenter: parent.verticalCenter } @@ -105,7 +110,7 @@ Item { BaseBalanceLabel { width: 90 label_text: qsTr("Outputs") - label_value: tx.nbOutputs + label_value: tx !== null ? tx.nbOutputs : "" anchors.verticalCenter: parent.verticalCenter } @@ -119,7 +124,7 @@ Item { BaseBalanceLabel { width: 150 label_text: qsTr("Input Amount (BTC)") - label_value: tx.inputAmount + label_value: tx !== null ? tx.inputAmount : "" anchors.verticalCenter: parent.verticalCenter } @@ -133,7 +138,7 @@ Item { BaseBalanceLabel { width: 150 label_text: qsTr("Output Amount (BTC)") - label_value: tx.outputAmount + label_value: tx !== null ? tx.outputAmount : "" anchors.verticalCenter: parent.verticalCenter } @@ -147,7 +152,7 @@ Item { BaseBalanceLabel { width: 130 label_text: qsTr("Fees (BTC)") - label_value: tx.fee + label_value: tx !== null ? tx.fee : "" anchors.verticalCenter: parent.verticalCenter } @@ -161,7 +166,7 @@ Item { BaseBalanceLabel { width: 150 label_text: qsTr("Fee per byte (s/b)") - label_value: tx.feePerByte + label_value: tx !== null ? tx.feePerByte : "" anchors.verticalCenter: parent.verticalCenter } @@ -175,7 +180,7 @@ Item { BaseBalanceLabel { width: 150 label_text: qsTr("Size (virtual bytes)") - label_value: tx.virtSize + label_value: tx !== null ? tx.virtSize : "" anchors.verticalCenter: parent.verticalCenter } } @@ -220,7 +225,7 @@ Item { InputOutputTableView { width: parent.width height: parent.height - 20 - model: tx.inputs + model: tx !== null ? tx.inputs : [] copy_button_column_index: -1 columnWidths: [0.0, 0.7, 0.2, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) @@ -267,7 +272,7 @@ Item { InputOutputTableView { width: parent.width height: parent.height - 20 - model: tx.outputs + model: tx !== null ? tx.outputs : [] copy_button_column_index: -1 columnWidths: [0.0, 0.7, 0.2, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) diff --git a/GUI/QtQuick/qml/ImportSeedPhrase.qml b/GUI/QtQuick/qml/ImportSeedPhrase.qml index 9775bd264..6f9033323 100644 --- a/GUI/QtQuick/qml/ImportSeedPhrase.qml +++ b/GUI/QtQuick/qml/ImportSeedPhrase.qml @@ -77,8 +77,6 @@ Item { text: "1" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -93,8 +91,6 @@ Item { text: "2" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -109,8 +105,6 @@ Item { text: "3" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } } @@ -129,8 +123,6 @@ Item { text: "4" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -145,8 +137,6 @@ Item { text: "5" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -161,8 +151,6 @@ Item { text: "6" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } } @@ -181,8 +169,6 @@ Item { text: "7" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -197,8 +183,6 @@ Item { text: "8" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -213,8 +197,6 @@ Item { text: "9" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } } @@ -233,8 +215,6 @@ Item { text: "10" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -249,8 +229,6 @@ Item { text: "11" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -265,8 +243,6 @@ Item { text: "12" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } } @@ -286,8 +262,6 @@ Item { text: "13" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -302,8 +276,6 @@ Item { text: "14" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -318,8 +290,6 @@ Item { text: "15" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } } @@ -339,8 +309,6 @@ Item { text: "16" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -355,8 +323,6 @@ Item { text: "17" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -371,8 +337,6 @@ Item { text: "18" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } } @@ -392,8 +356,6 @@ Item { text: "19" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -408,8 +370,6 @@ Item { text: "20" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -424,8 +384,6 @@ Item { text: "21" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } } @@ -445,8 +403,6 @@ Item { text: "22" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -461,8 +417,6 @@ Item { text: "23" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } TextInput { @@ -477,8 +431,6 @@ Item { text: "24" font.pointSize: 6 color: 'darkgrey' - anchors.left: parent - anchors.top: parent } } } diff --git a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml index 2f892048d..542eab850 100644 --- a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml +++ b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml @@ -60,7 +60,7 @@ ColumnLayout { Layout.preferredHeight : 214 Layout.preferredWidth : 214 - source: "image://QR/" + bsApp.generatedAddress + source: bsApp.generatedAddress !== "" ? ("image://QR/" + bsApp.generatedAddress) : "" sourceSize.width: 214 sourceSize.height: 214 width: 214 diff --git a/GUI/QtQuick/qml/SeedPhrase.qml b/GUI/QtQuick/qml/SeedPhrase.qml new file mode 100644 index 000000000..e156e8e35 --- /dev/null +++ b/GUI/QtQuick/qml/SeedPhrase.qml @@ -0,0 +1,194 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" +//import "BsControls" +//import "BsDialogs" +//import "js/helper.js" as JsHelper + +Item { + property var phrase: null + + VerifySeedPhrase { + id: verifySeedPhrase + visible: false + } + + Column { + spacing: 32 + anchors.fill: parent + + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + Label { + text: qsTr("Create new wallet") + font.pointSize: 14 + } + Label { + text: qsTr("Write down and store your 12 word seed someplace safe and offline") + font.pointSize: 10 + } + + Row { + spacing: 23 + + TextEdit { + id: word1 + width: 250 + height: 32 + text: phrase !== null ? phrase[0] : "" + color: 'darkgrey' + font.pointSize: 12 + enabled: false + } + TextEdit { + id: word2 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase !== null ? phrase[1] : "" + enabled: false + } + TextEdit { + id: word3 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase !== null ? phrase[2] : "" + enabled: false + } + } + Row { + spacing: 23 + + TextEdit { + id: word4 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase !== null ? phrase[3] : "" + enabled: false + } + TextEdit { + id: word5 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase !== null ? phrase[4] : "" + enabled: false + } + TextEdit { + id: word6 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase !== null ? phrase[5] : "" + enabled: false + } + } + Row { + spacing: 23 + + TextEdit { + id: word7 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase !== null ? phrase[6] : "" + enabled: false + } + TextEdit { + id: word8 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase !== null ? phrase[7] : "" + enabled: false + } + TextEdit { + id: word9 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase !== null ? phrase[8] : "" + enabled: false + } + } + Row { + spacing: 23 + + TextEdit { + id: word10 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase !== null ? phrase[9] : "" + enabled: false + } + TextEdit { + id: word11 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase !== null ? phrase[10] : "" + enabled: false + } + TextEdit { + id: word12 + width: 250 + height: 32 + font.pointSize: 12 + color: 'darkgrey' + text: phrase !== null ? phrase[11] : "" + enabled: false + } + } + Row { + spacing: 50 + Button { + width: 450 + text: qsTr("Copy Seed") + font.pointSize: 12 + onClicked: { + bsApp.copySeedToClipboard(phrase) + } + } + Button { + width: 450 + text: qsTr("Continue") + font.pointSize: 12 + onClicked: { + verifySeedPhrase.phrase = phrase + stack.push(verifySeedPhrase) + } + } + } + } +} diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 7947c2241..6e74cb20d 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -132,7 +132,7 @@ ColumnLayout { Layout.fillWidth: true Layout.topMargin: 16 Layout.preferredHeight: 19 - Layout.alignment: Qt.AlingTop + Layout.alignment: Qt.AlignTop Label { id: inputs_title diff --git a/GUI/QtQuick/qml/Send/PasswordWithTimer.qml b/GUI/QtQuick/qml/Send/PasswordWithTimer.qml index fa79465d5..b6249bb0d 100644 --- a/GUI/QtQuick/qml/Send/PasswordWithTimer.qml +++ b/GUI/QtQuick/qml/Send/PasswordWithTimer.qml @@ -35,7 +35,7 @@ Item { title_leftMargin: 16 title_topMargin: 16 - visible: !txSignRequest.isHWW + visible: txSignRequest !== null ? !txSignRequest.isHWW : false title_text: qsTr("Password") Component.onCompleted: { diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml index 6b4163fe2..12a824665 100644 --- a/GUI/QtQuick/qml/Send/SelectInputs.qml +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -20,6 +20,9 @@ ColumnLayout { id: layout + property int text_header_size: 11 + property int cell_text_size: 12 + height: 662 width: 1132 spacing: 0 diff --git a/GUI/QtQuick/qml/Send/SignTransaction.qml b/GUI/QtQuick/qml/Send/SignTransaction.qml index 26372dcc9..9918dbd86 100644 --- a/GUI/QtQuick/qml/Send/SignTransaction.qml +++ b/GUI/QtQuick/qml/Send/SignTransaction.qml @@ -10,7 +10,7 @@ ColumnLayout { id: layout - property var txSignRequest + property var txSignRequest: null property int time_progress @@ -92,7 +92,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: 20 - text: txSignRequest.outputAddresses[0] + text: txSignRequest !== null ? txSignRequest.outputAddresses[0] : "" color: "#FFFFFF" @@ -110,7 +110,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: 20 - text: txSignRequest.outputAmount + text: txSignRequest !== null ? txSignRequest.outputAmount : "" color: "#FFFFFF" @@ -159,7 +159,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: 20 - text: txSignRequest.inputAmount + text: txSignRequest !== null ? txSignRequest.inputAmount : "" color: "#E2E7FF" @@ -195,7 +195,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: 20 - text: txSignRequest.returnAmount + text: txSignRequest !== null ? txSignRequest.returnAmount : "" color: "#E2E7FF" @@ -231,7 +231,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: 20 - text: txSignRequest.fee + text: txSignRequest !== null ? txSignRequest.fee : "" color: "#E2E7FF" @@ -267,7 +267,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: 20 - text: txSignRequest.txSize + text: txSignRequest !== null ? txSignRequest.txSize : "" color: "#E2E7FF" @@ -303,7 +303,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: 20 - text: txSignRequest.feePerByte + text: txSignRequest !== null ? txSignRequest.feePerByte : "" color: "#E2E7FF" @@ -332,13 +332,15 @@ ColumnLayout { CustomButton { id: broadcast_but - text: txSignRequest.hasError ? txSignRequest.errorText : qsTr("Broadcast") + text: txSignRequest !== null ? (txSignRequest.hasError ? txSignRequest.errorText : qsTr("Broadcast")) : "" width: 532 Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - enabled: !txSignRequest.hasError && ((txSignRequest.isHWW && txSignRequest.isHWWready) || password.value.length) + enabled: txSignRequest !== null ? + (!txSignRequest.hasError && ((txSignRequest.isHWW && txSignRequest.isHWWready) || password.value.length)) : + false Component.onCompleted: { broadcast_but.preferred = true diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml index dbd589b81..62f93d0f2 100644 --- a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -10,7 +10,7 @@ ColumnLayout { id: layout - property var txSignRequest + property var txSignRequest: null property int time_progress property bool isRBF: false @@ -64,7 +64,7 @@ ColumnLayout { height: parent.height - 24 anchors.centerIn: parent - model: txSignRequest.inputs + model: txSignRequest !== null ? txSignRequest.inputs : [] columnWidths: [0.7, 0.1, 0, 0.2] copy_button_column_index: -1 @@ -101,7 +101,7 @@ ColumnLayout { height: parent.height - 24 anchors.centerIn: parent - model:txOutputsModel + model: txOutputsModel columnWidths: [0.744, 0.20, 0.056] copy_button_column_index: -1 @@ -169,7 +169,7 @@ ColumnLayout { anchors.right: parent.horizontalCenter anchors.rightMargin: 24 - text: txSignRequest.inputAmount + text: txSignRequest !== null ? txSignRequest.inputAmount : "" color: "#E2E7FF" @@ -205,7 +205,7 @@ ColumnLayout { anchors.right: parent.horizontalCenter anchors.rightMargin: 24 - text: txSignRequest.returnAmount + text: txSignRequest !== null ? txSignRequest.returnAmount : "" color: "#E2E7FF" @@ -241,7 +241,7 @@ ColumnLayout { anchors.right: parent.horizontalCenter anchors.rightMargin: 24 - text: txSignRequest.fee + text: txSignRequest !== null ? txSignRequest.fee : "" color: "#E2E7FF" @@ -277,7 +277,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: 16 - text: txSignRequest.txSize + text: txSignRequest !== null ? txSignRequest.txSize : "" color: "#E2E7FF" @@ -313,7 +313,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: 16 - text: txSignRequest.feePerByte + text: txSignRequest !== null ? txSignRequest.feePerByte : "" color: "#E2E7FF" @@ -349,7 +349,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: 16 - text: txSignRequest.outputAmount + text: txSignRequest !== null ? txSignRequest.outputAmount : "" color: "#E2E7FF" @@ -377,13 +377,15 @@ ColumnLayout { CustomButton { id: broadcast_but - text: txSignRequest.hasError ? txSignRequest.errorText : qsTr("Broadcast") + text: txSignRequest !== null ? (txSignRequest.hasError ? txSignRequest.errorText : qsTr("Broadcast")) : "" width: 1084 Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - enabled: !txSignRequest.hasError && ((txSignRequest.isHWW && txSignRequest.isHWWready) || password.value.length) + enabled: txSignRequest !== null ? + (!txSignRequest.hasError && ((txSignRequest.isHWW && txSignRequest.isHWWready) || password.value.length)) : + false Component.onCompleted: { broadcast_but.preferred = true diff --git a/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml b/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml index 4d7a32a48..79718d5ca 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml @@ -10,6 +10,7 @@ HorizontalHeaderView { delegate: Rectangle { implicitHeight: 34 + implicitWidth: 100 color: BSStyle.tableCellBackgroundColor Text { diff --git a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml index f8d01fdf1..ea0b5ad30 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml @@ -72,7 +72,7 @@ Rectangle { Image { id: icon_add - visible: source.length + visible: source.length > 0 anchors.verticalCenter: parent.verticalCenter anchors.right: rect.right diff --git a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml index bb443aea0..ccd84023b 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml @@ -3,6 +3,7 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 +import "../BsStyles" Window { id: root diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index 3a1a58750..dacbad12e 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -22,6 +22,8 @@ Column { property alias model: component.model property alias delegate: component.delegate + property alias selected_row_index: component.selected_row_index + property bool is_expandable: false property var columnWidths property int copy_button_column_index: 0 property int delete_button_column_index: -1 @@ -82,6 +84,7 @@ Column { id: delega implicitHeight: 34 + implicitWidth: 100 color: row === component.selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor MouseArea { @@ -160,6 +163,7 @@ Column { Connections { target: row_loader.item + ignoreUnknownSignals: true function onDeleteRequested (row) { root.deleteRequested(row) diff --git a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml index a9f0b6eb1..28788f2cd 100644 --- a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml @@ -39,7 +39,7 @@ CustomTableView { onDoubleClicked: component.cellDoubleClicked(row, column, tableData) } - Row { + Item { width: parent.width height: parent.height diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index f9b21d744..6d1877d40 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -20,7 +20,7 @@ import "BsStyles" Popup { id: transaction_details - property var tx + property var tx: null property string walletName: '' property string address: '' property string txAmount: '' @@ -76,7 +76,7 @@ Popup { } Row { Text { - text: tx.txId + text: tx !== null ? tx.txId : "" color: BSStyle.textColor font.family: "Roboto" font.pixelSize: 14 @@ -110,7 +110,7 @@ Popup { width: 170 } Text { - text: tx.height + text: tx !== null ? tx.height : "" color: BSStyle.textColor font.family: "Roboto" font.pixelSize: 14 @@ -152,7 +152,7 @@ Popup { width: 170 } Label { - text: tx.virtSize + text: tx !== null ? tx.virtSize : "" color: BSStyle.textColor font.family: "Roboto" font.pixelSize: 14 @@ -166,7 +166,7 @@ Popup { width: 170 } Label { - text: tx.feePerByte + text: tx !== null ? tx.feePerByte : "" color: BSStyle.textColor font.family: "Roboto" font.pixelSize: 14 @@ -180,7 +180,7 @@ Popup { width: 170 } Label { - text: tx.fee + text: tx !== null ? tx.fee : "" color: BSStyle.textColor font.family: "Roboto" font.pixelSize: 14 @@ -194,7 +194,7 @@ Popup { width: 170 } Label { - text: tx.nbConf + text: tx !== null ? tx.nbConf : "" color: txConfirmationsColor font.family: "Roboto" font.pixelSize: 14 @@ -281,7 +281,7 @@ Popup { width: parent.width - 20 height: parent.height anchors.centerIn: parent - model: tx.inputs + model: tx !== null ? tx.inputs : [] copy_button_column_index: 1 columnWidths: [0.1, 0.5, 0.2, 0.2] @@ -320,7 +320,7 @@ Popup { width: parent.width - 20 height: parent.height anchors.centerIn: parent - model: tx.outputs + model: tx !== null ? tx.outputs : [] copy_button_column_index: 1 columnWidths: [0.1, 0.5, 0.2, 0.2] diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 3d1d281fd..4e7d7f1fc 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -73,16 +73,12 @@ Item { font.pixelSize: 19 font.weight: Font.DemiBold color: BSStyle.textColor - - anchors.verticalCenter: parent.verticalCenter } Row { spacing: 8 height: parent.height - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter CustomSmallComboBox { id: txWalletsComboBox diff --git a/GUI/QtQuick/qml/VerifySeedPhrase.qml b/GUI/QtQuick/qml/VerifySeedPhrase.qml new file mode 100644 index 000000000..6d2494ee6 --- /dev/null +++ b/GUI/QtQuick/qml/VerifySeedPhrase.qml @@ -0,0 +1,136 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" + +Item { + property var phrase: null + + WalletNamePass { + id: walletNamePass + visible: false + } + + Column { + spacing: 23 + anchors.fill: parent + + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + Label { + text: qsTr("Verify your seed") + font.pointSize: 14 + } + + TextInput { + id: word1 + property bool isValid: phrase !== null ? (phrase[0] === text) : false + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 12 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "1" + font.pointSize: 6 + color: 'darkgrey' + } + } + TextInput { + id: word6 + property bool isValid: phrase !== null ? (phrase[5] === text) : false + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 12 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "6" + font.pointSize: 6 + color: 'darkgrey' + } + } + TextInput { + id: word8 + property bool isValid: phrase !== null ? (phrase[7] === text) : false + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 12 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "8" + font.pointSize: 6 + color: 'darkgrey' + } + } + TextInput { + id: word11 + property bool isValid: phrase !== null ? (phrase[10] === text) : false + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 12 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: "11" + font.pointSize: 6 + color: 'darkgrey' + } + } + + Label { + id: verifResult + height: 32 + color: 'red' + text: (word1.isValid && word6.isValid && word8.isValid && word11.isValid) + ? "" : qsTr("Your words are wrong") + } + + Row { + spacing: 50 + Button { + width: 450 + text: qsTr("Skip") + font.pointSize: 12 + onClicked: { // TODO: show confirmation or add a checkbox to confirm + walletNamePass.phrase = phrase + walletNamePass.popLevel = 4 + stack.push(walletNamePass) + } + } + Button { + width: 450 + text: qsTr("Continue") + font.pointSize: 12 + enabled: word1.isValid && word6.isValid && word8.isValid && word11.isValid + onClicked: { + walletNamePass.phrase = phrase + walletNamePass.popLevel = 4 + stack.push(walletNamePass) + } + } + } + } +} diff --git a/GUI/QtQuick/qml/WalletNamePass.qml b/GUI/QtQuick/qml/WalletNamePass.qml new file mode 100644 index 000000000..2a0cd22c9 --- /dev/null +++ b/GUI/QtQuick/qml/WalletNamePass.qml @@ -0,0 +1,106 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2 +import QtQuick.Controls 2.9 +import QtQuick.Layouts 1.3 +import QtQml.Models 2 + +import "StyledControls" +import "BsStyles" + +Item { + property var phrase + property int popLevel: 3 + property bool isImport: false + + Column { + spacing: 23 + anchors.fill: parent + + Button { + icon.source: "qrc:/images/send_icon.png" + onClicked: { + stack.pop() + } + } + Label { + text: qsTr("Set password") + font.pointSize: 14 + } + + TextInput { + id: walletName + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + Text { + text: qsTr("Wallet name") + font.pointSize: 6 + color: 'darkgrey' + } + } + + TextInput { + id: pass1 + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + echoMode: TextInput.Password + passwordCharacter: '*' + Text { + text: qsTr("Password") + font.pointSize: 6 + color: 'darkgrey' + } + } + TextInput { + id: pass2 + width: 500 + height: 32 + color: 'lightgrey' + font.pointSize: 14 + horizontalAlignment: TextEdit.AlignHCenter + verticalAlignment: TextEdit.AlignVCenter + echoMode: TextInput.Password + passwordCharacter: '*' + Text { + text: qsTr("Confirm password") + font.pointSize: 6 + color: 'darkgrey' + } + } + + Button { + width: 900 + text: qsTr("Confirm") + font.pointSize: 14 + enabled: pass1.text.length && pass2.text.length && (pass1.text == pass2.text) + + onClicked: { + if (isImport) { + bsApp.importWallet(walletName.text, phrase, pass1.text) + } + else { + bsApp.createWallet(walletName.text, phrase, pass1.text) + } + for (var i = 0; i < popLevel; i++) { + stack.pop() + } + } + } + } +} From f839b54ad3b80106e19a7f11f9473bcd282f822d Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 8 Mar 2023 22:35:56 +0100 Subject: [PATCH 210/436] Renamed active addresses --- GUI/QtQuick/QtQuickAdapter.cpp | 2 +- .../qml/WalletProperties/WalletPropertiesPopup.qml | 4 ++-- GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 8 ++++---- GUI/QtQuick/viewmodels/WalletPropertiesVM.h | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index e7150b59f..0e28c7f7c 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -936,7 +936,7 @@ static QString assetTypeToString(const bs::AssetType assetType) ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId , const WalletsMessage_WalletData& response) { - walletPropertiesModel_->setNbActiveAddrs(response.wallet_id(), response.used_addresses_size()); + walletPropertiesModel_->setNbUsedAddrs(response.wallet_id(), response.used_addresses_size()); const auto& itReq = walletInfoReq_.find(msgId); if (itReq != walletInfoReq_.end()) { diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 03e0c2a97..f874dc793 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -235,14 +235,14 @@ CustomPopup { width: parent.width Text { - text: qsTr("Active addresses") + text: qsTr("Used addresses") color: BSStyle.titleTextColor font.family: "Roboto" font.pixelSize: 14 width: parent.width / 2 } Text { - text: wallet_properties_vm.walletActiveAddresses + text: wallet_properties_vm.walletUsedAddresses color: BSStyle.textColor font.family: "Roboto" font.pixelSize: 14 diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index 20fac4bf1..47c76de7a 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -36,12 +36,12 @@ void qtquick_gui::WalletPropertiesVM::setWalletSeed(const std::string& walletId, emit seedChanged(); } -void qtquick_gui::WalletPropertiesVM::setNbActiveAddrs(const std::string& walletId, uint32_t nb) +void qtquick_gui::WalletPropertiesVM::setNbUsedAddrs(const std::string& walletId, uint32_t nb) { if (info_.walletId.isEmpty() || (info_.walletId.toStdString() != walletId)) { return; } - nbActiveAddrs_ = nb; + nbUsedAddrs_ = nb; emit changed(); } @@ -79,9 +79,9 @@ quint32 WalletPropertiesVM::walletGeneratedAddresses() const return info_.generatedAddresses; } -quint32 WalletPropertiesVM::walletActiveAddresses() const +quint32 WalletPropertiesVM::walletUsedAddresses() const { - return nbActiveAddrs_; + return nbUsedAddrs_; } quint32 WalletPropertiesVM::walletAvailableUtxo() const diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h index 0c5fd7229..8bd62f649 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h @@ -40,7 +40,7 @@ class WalletPropertiesVM: public QObject Q_PROPERTY(QString walletGroups READ walletGroups NOTIFY changed) Q_PROPERTY(QString walletEncryption READ walletEncryption NOTIFY changed) Q_PROPERTY(quint32 walletGeneratedAddresses READ walletGeneratedAddresses NOTIFY changed) - Q_PROPERTY(quint32 walletActiveAddresses READ walletActiveAddresses NOTIFY changed) + Q_PROPERTY(quint32 walletUsedAddresses READ walletUsedAddresses NOTIFY changed) Q_PROPERTY(quint32 walletAvailableUtxo READ walletAvailableUtxo NOTIFY changed) Q_PROPERTY(bool isHardware READ isHardware NOTIFY changed) Q_PROPERTY(bool isWatchingOnly READ isWatchingOnly NOTIFY changed) @@ -51,7 +51,7 @@ class WalletPropertiesVM: public QObject void setWalletInfo(const WalletInfo& info); void setWalletSeed(const std::string& walletId, const std::string& seed); - void setNbActiveAddrs(const std::string& walletId, uint32_t nb); + void setNbUsedAddrs(const std::string& walletId, uint32_t nb); void setNbUTXOs(const std::string& walletId, uint32_t nb); const QString& walletName() const; @@ -59,7 +59,7 @@ class WalletPropertiesVM: public QObject const QString& walletGroups() const; const QString& walletEncryption() const; quint32 walletGeneratedAddresses() const; - quint32 walletActiveAddresses() const; + quint32 walletUsedAddresses() const; quint32 walletAvailableUtxo() const; bool isHardware() const; bool isWatchingOnly() const; @@ -73,7 +73,7 @@ class WalletPropertiesVM: public QObject private: std::shared_ptr logger_; WalletInfo info_; - uint32_t nbActiveAddrs_{ 0 }; + uint32_t nbUsedAddrs_{ 0 }; uint32_t nbUTXOs_{ 0 }; QStringList seed_; }; From 67921c5655a84781132e9ebf9dd3e3c70bd9ecef Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 9 Mar 2023 09:39:12 +0100 Subject: [PATCH 211/436] Removed double invokeMethod --- GUI/QtQuick/TxListModel.cpp | 9 +- GUI/QtQuick/qml/SeedPhrase.qml | 194 --------------------------- GUI/QtQuick/qml/VerifySeedPhrase.qml | 136 ------------------- GUI/QtQuick/qml/WalletNamePass.qml | 106 --------------- 4 files changed, 4 insertions(+), 441 deletions(-) delete mode 100644 GUI/QtQuick/qml/SeedPhrase.qml delete mode 100644 GUI/QtQuick/qml/VerifySeedPhrase.qml delete mode 100644 GUI/QtQuick/qml/WalletNamePass.qml diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 093d2ad74..6bbaeb766 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -651,11 +651,10 @@ void QTxDetails::setDetails(const bs::sync::TXWalletDetails& details) for (const auto& out : details.outputAddresses) { outputs_.push_back({ out.address, txId, out.outIndex, out.value }); } - QMetaObject::invokeMethod(this, [this, inputs] { - ownInputs_->addEntries(inputs); - ownOutputs_->addEntries(outputs_); - emit updated(); - }); + + ownInputs_->addEntries(inputs); + ownOutputs_->addEntries(outputs_); + emit updated(); } std::vector> QTxDetails::outputData() const diff --git a/GUI/QtQuick/qml/SeedPhrase.qml b/GUI/QtQuick/qml/SeedPhrase.qml deleted file mode 100644 index e156e8e35..000000000 --- a/GUI/QtQuick/qml/SeedPhrase.qml +++ /dev/null @@ -1,194 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2 -import QtQuick.Controls 2.9 -import QtQuick.Layouts 1.3 -import QtQml.Models 2 - -import "StyledControls" -import "BsStyles" -//import "BsControls" -//import "BsDialogs" -//import "js/helper.js" as JsHelper - -Item { - property var phrase: null - - VerifySeedPhrase { - id: verifySeedPhrase - visible: false - } - - Column { - spacing: 32 - anchors.fill: parent - - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() - } - } - Label { - text: qsTr("Create new wallet") - font.pointSize: 14 - } - Label { - text: qsTr("Write down and store your 12 word seed someplace safe and offline") - font.pointSize: 10 - } - - Row { - spacing: 23 - - TextEdit { - id: word1 - width: 250 - height: 32 - text: phrase !== null ? phrase[0] : "" - color: 'darkgrey' - font.pointSize: 12 - enabled: false - } - TextEdit { - id: word2 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase !== null ? phrase[1] : "" - enabled: false - } - TextEdit { - id: word3 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase !== null ? phrase[2] : "" - enabled: false - } - } - Row { - spacing: 23 - - TextEdit { - id: word4 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase !== null ? phrase[3] : "" - enabled: false - } - TextEdit { - id: word5 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase !== null ? phrase[4] : "" - enabled: false - } - TextEdit { - id: word6 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase !== null ? phrase[5] : "" - enabled: false - } - } - Row { - spacing: 23 - - TextEdit { - id: word7 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase !== null ? phrase[6] : "" - enabled: false - } - TextEdit { - id: word8 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase !== null ? phrase[7] : "" - enabled: false - } - TextEdit { - id: word9 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase !== null ? phrase[8] : "" - enabled: false - } - } - Row { - spacing: 23 - - TextEdit { - id: word10 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase !== null ? phrase[9] : "" - enabled: false - } - TextEdit { - id: word11 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase !== null ? phrase[10] : "" - enabled: false - } - TextEdit { - id: word12 - width: 250 - height: 32 - font.pointSize: 12 - color: 'darkgrey' - text: phrase !== null ? phrase[11] : "" - enabled: false - } - } - Row { - spacing: 50 - Button { - width: 450 - text: qsTr("Copy Seed") - font.pointSize: 12 - onClicked: { - bsApp.copySeedToClipboard(phrase) - } - } - Button { - width: 450 - text: qsTr("Continue") - font.pointSize: 12 - onClicked: { - verifySeedPhrase.phrase = phrase - stack.push(verifySeedPhrase) - } - } - } - } -} diff --git a/GUI/QtQuick/qml/VerifySeedPhrase.qml b/GUI/QtQuick/qml/VerifySeedPhrase.qml deleted file mode 100644 index 6d2494ee6..000000000 --- a/GUI/QtQuick/qml/VerifySeedPhrase.qml +++ /dev/null @@ -1,136 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2 -import QtQuick.Controls 2.9 -import QtQuick.Layouts 1.3 -import QtQml.Models 2 - -import "StyledControls" -import "BsStyles" - -Item { - property var phrase: null - - WalletNamePass { - id: walletNamePass - visible: false - } - - Column { - spacing: 23 - anchors.fill: parent - - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() - } - } - Label { - text: qsTr("Verify your seed") - font.pointSize: 14 - } - - TextInput { - id: word1 - property bool isValid: phrase !== null ? (phrase[0] === text) : false - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 12 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "1" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word6 - property bool isValid: phrase !== null ? (phrase[5] === text) : false - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 12 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "6" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word8 - property bool isValid: phrase !== null ? (phrase[7] === text) : false - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 12 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "8" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word11 - property bool isValid: phrase !== null ? (phrase[10] === text) : false - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 12 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "11" - font.pointSize: 6 - color: 'darkgrey' - } - } - - Label { - id: verifResult - height: 32 - color: 'red' - text: (word1.isValid && word6.isValid && word8.isValid && word11.isValid) - ? "" : qsTr("Your words are wrong") - } - - Row { - spacing: 50 - Button { - width: 450 - text: qsTr("Skip") - font.pointSize: 12 - onClicked: { // TODO: show confirmation or add a checkbox to confirm - walletNamePass.phrase = phrase - walletNamePass.popLevel = 4 - stack.push(walletNamePass) - } - } - Button { - width: 450 - text: qsTr("Continue") - font.pointSize: 12 - enabled: word1.isValid && word6.isValid && word8.isValid && word11.isValid - onClicked: { - walletNamePass.phrase = phrase - walletNamePass.popLevel = 4 - stack.push(walletNamePass) - } - } - } - } -} diff --git a/GUI/QtQuick/qml/WalletNamePass.qml b/GUI/QtQuick/qml/WalletNamePass.qml deleted file mode 100644 index 2a0cd22c9..000000000 --- a/GUI/QtQuick/qml/WalletNamePass.qml +++ /dev/null @@ -1,106 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2 -import QtQuick.Controls 2.9 -import QtQuick.Layouts 1.3 -import QtQml.Models 2 - -import "StyledControls" -import "BsStyles" - -Item { - property var phrase - property int popLevel: 3 - property bool isImport: false - - Column { - spacing: 23 - anchors.fill: parent - - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() - } - } - Label { - text: qsTr("Set password") - font.pointSize: 14 - } - - TextInput { - id: walletName - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 14 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: qsTr("Wallet name") - font.pointSize: 6 - color: 'darkgrey' - } - } - - TextInput { - id: pass1 - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 14 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - echoMode: TextInput.Password - passwordCharacter: '*' - Text { - text: qsTr("Password") - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: pass2 - width: 500 - height: 32 - color: 'lightgrey' - font.pointSize: 14 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - echoMode: TextInput.Password - passwordCharacter: '*' - Text { - text: qsTr("Confirm password") - font.pointSize: 6 - color: 'darkgrey' - } - } - - Button { - width: 900 - text: qsTr("Confirm") - font.pointSize: 14 - enabled: pass1.text.length && pass2.text.length && (pass1.text == pass2.text) - - onClicked: { - if (isImport) { - bsApp.importWallet(walletName.text, phrase, pass1.text) - } - else { - bsApp.createWallet(walletName.text, phrase, pass1.text) - } - for (var i = 0; i < popLevel; i++) { - stack.pop() - } - } - } - } -} From 28d4fe5ea76e182521333f1235c7e34b0c8182a9 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 9 Mar 2023 12:03:16 +0300 Subject: [PATCH 212/436] update common --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index 8ac371fc2..fbdc73844 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 8ac371fc26515e3136fa9801ce290b78bd95c506 +Subproject commit fbdc738448354d2413613e3fe1ba7053d246e7b0 From 5461e39cff1bab181d3d0122732159bade811118 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 9 Mar 2023 11:05:31 +0200 Subject: [PATCH 213/436] add new common version --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index 8ac371fc2..fbdc73844 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 8ac371fc26515e3136fa9801ce290b78bd95c506 +Subproject commit fbdc738448354d2413613e3fe1ba7053d246e7b0 From 2e7376343f3af6842baa0fd061cdb742c47d28ca Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 9 Mar 2023 18:53:04 +0300 Subject: [PATCH 214/436] TX details loading fixes --- GUI/QtQuick/QtQuickAdapter.cpp | 14 +++++++++++--- GUI/QtQuick/QtQuickAdapter.h | 1 + GUI/QtQuick/TxListModel.cpp | 17 ++++++++++++++--- GUI/QtQuick/TxListModel.h | 1 + common | 2 +- 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 0e28c7f7c..fa4f1355f 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -568,16 +568,18 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) break; case SignerMessage::kWalletSeed: return processWalletSeed(msg.wallet_seed()); + case SignerMessage::kWalletsListUpdated: default: return ProcessingResult::Ignored; } return ProcessingResult::Success; } +#include "StringUtils.h" ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) { WalletsMessage msg; if (!msg.ParseFromString(env.message)) { - logger_->error("[{}] failed to parse msg #{}", __func__, env.foreignId()); + logger_->error("[{}] failed to parse msg #{}\n{}", __func__, env.foreignId(), bs::toHex(env.message)); return ProcessingResult::Error; } switch (msg.data_case()) { @@ -586,6 +588,11 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) updateSplashProgress(); break; + case WalletsMessage::kReady: + emit walletsLoaded(msg.ready()); + logger_->debug("[{}] loaded {} wallet[s]", __func__, msg.ready()); + break; + case WalletsMessage::kWalletLoaded: { const auto &wi = bs::sync::WalletInfo::fromCommonMsg(msg.wallet_loaded()); processWalletLoaded(wi); @@ -974,7 +981,7 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId ProcessingResult QtQuickAdapter::processWalletBalances(bs::message::SeqId responseId , const WalletsMessage_WalletBalances &response) { - logger_->debug("[{}] {}", __func__, response.DebugString()); + //logger_->debug("[{}] {}", __func__, response.DebugString()); const WalletBalancesModel::Balance bal{ response.spendable_balance(), response.unconfirmed_balance() , response.total_balance(), response.nb_addresses() }; walletBalances_->setWalletBalance(response.wallet_id(), bal); @@ -1020,7 +1027,8 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId try { txDet.outAddresses.push_back(std::move(bs::Address::fromAddressString(addrStr))); } catch (const std::exception &e) { - logger_->warn("[QtGuiAdapter::processTXDetails] out deser error: {}", e.what()); + logger_->warn("[QtGuiAdapter::processTXDetails] out deser '{}' error: {}" + , addrStr, e.what()); } } for (const auto &inAddr : resp.input_addresses()) { diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 455be86da..7aaa7f222 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -179,6 +179,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop signals: void walletsListChanged(); + void walletsLoaded(quint32 nb); void walletBalanceChanged(); void addressGenerated(); void settingChanged(); diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 6bbaeb766..13974aa39 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -211,6 +211,7 @@ QHash TxListModel::roleNames() const void TxListModel::addRows(const std::vector& entries) { + logger_->debug("[TxListModel::addRows] {} entries", entries.size()); std::vector newEntries; for (const auto& entry : entries) { int row = -1; @@ -224,7 +225,7 @@ void TxListModel::addRows(const std::vector& entries) } } if (row != -1) { - //logger_->debug("[{}::{}] updating entry {}", (void*)this, __func__, entry.txHash.toHexStr(true)); + logger_->debug("[{}] updating entry #{} {}", __func__, row, entry.txHash.toHexStr(true)); emit dataChanged(createIndex(row, 0), createIndex(row, 0)); } else { @@ -234,10 +235,19 @@ void TxListModel::addRows(const std::vector& entries) } if (!newEntries.empty()) { QMetaObject::invokeMethod(this, [this, newEntries] { + logger_->debug("[TxListModel::addRows] {} new entries", newEntries.size()); beginInsertRows(QModelIndex(), rowCount(), rowCount() + newEntries.size() - 1); data_.insert(data_.end(), newEntries.cbegin(), newEntries.cend()); endInsertRows(); emit nbTxChanged(); + + if (!pendingDetails_.empty()) { + logger_->debug("[TxListModel::addRows] {} pending details", pendingDetails_.size()); + for (const auto& txDet : pendingDetails_) { + setDetails(txDet); + } + pendingDetails_.clear(); + } }); } } @@ -283,11 +293,12 @@ void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet) } if (row != -1) { emit dataChanged(createIndex(row, 1), createIndex(row, 6)); - //logger_->debug("[{}] {} {} found at row {}", __func__, txDet.txHash.toHexStr(), txDet.hdWalletId, row); + //logger_->debug("[TxListModel::setDetails] {} {} found at row {}", txDet.txHash.toHexStr(), txDet.hdWalletId, row); } else { - //logger_->debug("[{}] {} {} not found", __func__, txDet.txHash.toHexStr(), txDet.hdWalletId); + //logger_->warn("[TxListModel::setDetails] {} {} not found", txDet.txHash.toHexStr(), txDet.hdWalletId); + pendingDetails_.push_back(txDet); } } diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 743575b49..3672ba2a8 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -71,6 +71,7 @@ class TxListModel : public QAbstractTableModel std::vector data_; std::unordered_map txComments_; std::map txDetails_; + std::vector pendingDetails_; uint32_t curBlock_; }; diff --git a/common b/common index fbdc73844..c8411e6c4 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit fbdc738448354d2413613e3fe1ba7053d246e7b0 +Subproject commit c8411e6c4948ea1cd6ee8bd7b992f47b2680301e From 8b3fce95c1430504594462f76c0e930ff38321b7 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 9 Mar 2023 21:11:03 +0300 Subject: [PATCH 215/436] export WO wallet fixes --- Core/SignerAdapter.cpp | 46 +++++++++++++++++++++++++++------- Core/SignerAdapter.h | 3 ++- GUI/QtQuick/QtQuickAdapter.cpp | 15 ++++++++--- common | 2 +- 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 7035f034a..4f14715dd 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -13,9 +13,10 @@ #include "bip39/bip39.h" #include "Adapters/SignerClient.h" #include "CoreWalletsManager.h" +#include "SystemFileUtils.h" +#include "TerminalMessage.h" #include "Wallets/InprocSigner.h" #include "Wallets/ProtobufHeadlessUtils.h" -#include "TerminalMessage.h" #include "common.pb.h" #include "terminal.pb.h" @@ -142,8 +143,8 @@ ProcessingResult SignerAdapter::processOwnRequest(const bs::message::Envelope &e return processDeleteWallet(env, request.delete_wallet()); case SignerMessage::kImportHwWallet: return processImportHwWallet(env, request.import_hw_wallet()); - case SignerMessage::kExportWoWallet: - return processExportWoWallet(env, request.export_wo_wallet()); + case SignerMessage::kExportWoWalletRequest: + return processExportWoWallet(env, request.export_wo_wallet_request()); case SignerMessage::kChangeWalletPass: return processChangeWalletPass(env, request.change_wallet_pass()); case SignerMessage::kGetWalletSeed: @@ -683,23 +684,50 @@ ProcessingResult SignerAdapter::processDeleteWallet(const bs::message::Envelope& } ProcessingResult SignerAdapter::processExportWoWallet(const bs::message::Envelope& env - , const SignerMessage_WalletRequest& request) + , const SignerMessage_ExportWoWalletRequest& request) { - const auto& hdWallet = walletsMgr_->getHDWalletById(request.wallet_id()); + SignerMessage msg; + msg.set_export_wo_wallet_response(""); + const auto& hdWallet = walletsMgr_->getHDWalletById(request.wallet().wallet_id()); if (!hdWallet) { - logger_->error("[{}] wallet {} not found", __func__, request.wallet_id()); + logger_->error("[{}] wallet {} not found", __func__, request.wallet().wallet_id()); + pushResponse(user_, env, msg.SerializeAsString()); return ProcessingResult::Error; } if (hdWallet->isWatchingOnly()) { - logger_->error("[{}] can't export {} (already watching only)", __func__, request.wallet_id()); + logger_->error("[{}] can't export {} (already watching only)", __func__, request.wallet().wallet_id()); + pushResponse(user_, env, msg.SerializeAsString()); return ProcessingResult::Error; } auto woWallet = hdWallet->createWatchingOnly(); if (!woWallet) { - logger_->error("[{}] WO export {} failed", __func__, request.wallet_id()); + logger_->error("[{}] WO export {} failed", __func__, request.wallet().wallet_id()); + pushResponse(user_, env, msg.SerializeAsString()); return ProcessingResult::Error; } - logger_->debug("[{}] exported {} to {}", __func__, request.wallet_id(), woWallet->getFileName()); + const auto srcPathName = woWallet->getFileName(); + const auto& rm = [srcPathName]() -> bool + { + bool rc = SystemFileUtils::rmFile(srcPathName); + rc &= SystemFileUtils::rmFile(srcPathName + "-lock"); + return rc; + }; + woWallet->shutdown(); + woWallet.reset(); + const auto& fileName = SystemFileUtils::getFileName(srcPathName); + const auto& dstPathName = request.output_dir() + "/" + fileName; + if (!SystemFileUtils::cpFile(srcPathName, dstPathName)) { + rm(); + logger_->error("[{}] failed to copy {} -> {}", __func__, srcPathName, dstPathName); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Error; + } + if (!rm()) { + logger_->error("[{}] failed to rm {}", __func__, srcPathName); + } + logger_->debug("[{}] exported {} to {}", __func__, request.wallet().wallet_id(), dstPathName); + msg.set_export_wo_wallet_response(fileName); + pushResponse(user_, env, msg.SerializeAsString()); return ProcessingResult::Success; } diff --git a/Core/SignerAdapter.h b/Core/SignerAdapter.h index 393b373f7..7d167a504 100644 --- a/Core/SignerAdapter.h +++ b/Core/SignerAdapter.h @@ -32,6 +32,7 @@ namespace BlockSettle { class SignerMessage_ChangeWalletPassword; class SignerMessage_CreateWalletRequest; class SignerMessage_DialogRequest; + class SignerMessage_ExportWoWalletRequest; class SignerMessage_ExtendAddrChain; class SignerMessage_GetSettlPayinAddr; class SignerMessage_ImportHWWallet; @@ -112,7 +113,7 @@ class SignerAdapter : public bs::message::Adapter, public SignerCallbackTarget bs::message::ProcessingResult processDeleteWallet(const bs::message::Envelope& , const BlockSettle::Common::SignerMessage_WalletRequest&); bs::message::ProcessingResult processExportWoWallet(const bs::message::Envelope& - , const BlockSettle::Common::SignerMessage_WalletRequest&); + , const BlockSettle::Common::SignerMessage_ExportWoWalletRequest&); bs::message::ProcessingResult processChangeWalletPass(const bs::message::Envelope& , const BlockSettle::Common::SignerMessage_ChangeWalletPassword&); bs::message::ProcessingResult processGetWalletSeed(const bs::message::Envelope& diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index fa4f1355f..53a4156c6 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -566,6 +566,14 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) emit showError(tr("Failed to change wallet password - see log for details")); } break; + case SignerMessage::kExportWoWalletResponse: + if (msg.export_wo_wallet_response().empty()) { + emit showError(tr("WO wallet export failed - see log for details")); + } + else { + emit successExport(QString::fromStdString(msg.export_wo_wallet_response())); + } + break; case SignerMessage::kWalletSeed: return processWalletSeed(msg.wallet_seed()); case SignerMessage::kWalletsListUpdated: @@ -2099,11 +2107,12 @@ int QtQuickAdapter::changePassword(const QString& walletId, const QString& oldPa return (msgId == 0) ? -1 : 0; } -int QtQuickAdapter::exportWallet(const QString& walletId, const QString & exportDir) +int QtQuickAdapter::exportWallet(const QString& walletId, const QString& exportDir) { SignerMessage msg; - auto msgReq = msg.mutable_export_wo_wallet(); - msgReq->set_wallet_id(walletId.toStdString()); + auto msgReq = msg.mutable_export_wo_wallet_request(); + msgReq->mutable_wallet()->set_wallet_id(walletId.toStdString()); + msgReq->set_output_dir(exportDir.toStdString()); const auto msgId = pushRequest(user_, userSigner_, msg.SerializeAsString()); return (msgId == 0) ? -1 : 0; } diff --git a/common b/common index c8411e6c4..2e44ea312 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit c8411e6c4948ea1cd6ee8bd7b992f47b2680301e +Subproject commit 2e44ea312fb890cf692708b2f6beec5fc7ef1ce0 From c3370c94340b729487541058d652fd6536d7cc28 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 9 Mar 2023 20:28:46 +0200 Subject: [PATCH 216/436] qml: network settings --- GUI/QtQuick/ArmoryServersModel.cpp | 41 ++++++--- GUI/QtQuick/ArmoryServersModel.h | 5 +- GUI/QtQuick/QtQuickAdapter.h | 1 + GUI/QtQuick/images/disconn_ind.png | Bin 0 -> 144 bytes GUI/QtQuick/qml/Settings/SettingsMenu.qml | 9 -- GUI/QtQuick/qml/Settings/SettingsNetwork.qml | 80 ++++++++++-------- .../qml/StyledControls/CustomListItem.qml | 8 +- .../StyledControls/CustomListRadioButton.qml | 10 +-- .../WalletPropertiesPopup.qml | 7 +- GUI/QtQuick/qml/main.qml | 12 ++- GUI/QtQuick/qtquick.qrc | 1 + 11 files changed, 96 insertions(+), 78 deletions(-) create mode 100644 GUI/QtQuick/images/disconn_ind.png diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index 56b805212..a2d7bcaeb 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -18,7 +18,9 @@ namespace { {ArmoryServersModel::NetTypeRole, "netType"}, {ArmoryServersModel::AddressRole, "address"}, {ArmoryServersModel::PortRole, "port"}, - {ArmoryServersModel::KeyRole, "key"} + {ArmoryServersModel::KeyRole, "key"}, + {ArmoryServersModel::DefaultServerRole, "isDefault"}, + {ArmoryServersModel::CurrentServerRole, "isCurrent"}, }; } @@ -27,6 +29,12 @@ ArmoryServersModel::ArmoryServersModel(QObject* parent) , header_{ tr("Name"), tr("Network"), tr("Address"), tr("Port"), tr("Key") } {} +void ArmoryServersModel::setCurrent (int value) +{ + current_ = value; + emit currentChanged(); +} + void ArmoryServersModel::setData(int curIdx, int connIdx , const std::vector& data) { @@ -36,8 +44,7 @@ void ArmoryServersModel::setData(int curIdx, int connIdx endResetModel(); if (current_ != curIdx) { - current_ = curIdx; - emit currentChanged(); + setCurrent(curIdx); } if (connected_ != connIdx) { connected_ = connIdx; @@ -97,21 +104,33 @@ QVariant ArmoryServersModel::getData(int row, int col) const QVariant ArmoryServersModel::data(const QModelIndex& index, int role) const { switch (role) { - case NameRole: return getData(index.row(), 0); - case NetTypeRole: return getData(index.row(), 1); - case AddressRole: return getData(index.row(), 2); - case PortRole: return getData(index.row(), 3); - case KeyRole: return getData(index.row(), 4); + case NameRole: return getData(index.row(), 0); + case NetTypeRole: return getData(index.row(), 1); + case AddressRole: return getData(index.row(), 2); + case PortRole: return getData(index.row(), 3); + case KeyRole: return getData(index.row(), 4); + case DefaultServerRole: return (index.row() < ArmoryServersProvider::kDefaultServersCount) && (index.row() < rowCount()); + case CurrentServerRole: return (index.row() == current()); default: return getData(index.row(), index.column()); } return {}; } -bool ArmoryServersModel::setData(const QModelIndex& index, const QVariant& value, int) +bool ArmoryServersModel::setData(const QModelIndex& index, const QVariant& value, int role) { - if (!isEditable(index.row())) { + if(!index.isValid() || !isEditable(index.row())) { return false; } + + switch (role) + { + case CurrentServerRole: + setCurrent(value.toInt()); + break; + default: + break; + } + emit changed(index, value); return true; } @@ -131,5 +150,5 @@ QVariant ArmoryServersModel::headerData(int section, Qt::Orientation orientation bool ArmoryServersModel::isEditable(int row) const { - return ((row >= ArmoryServersProvider::kDefaultServersCount) && (row < rowCount())); + return data(index(row,0), DefaultServerRole).toBool(); } diff --git a/GUI/QtQuick/ArmoryServersModel.h b/GUI/QtQuick/ArmoryServersModel.h index 61a59df00..3758915eb 100644 --- a/GUI/QtQuick/ArmoryServersModel.h +++ b/GUI/QtQuick/ArmoryServersModel.h @@ -16,18 +16,19 @@ class ArmoryServersModel: public QAbstractTableModel { Q_OBJECT - Q_PROPERTY(int current READ current NOTIFY currentChanged) + Q_PROPERTY(int current READ current WRITE setCurrent NOTIFY currentChanged) Q_PROPERTY(int connected READ connected NOTIFY connectedChanged) public: enum TableRoles { TableDataRole = Qt::UserRole + 1, NameRole, NetTypeRole, AddressRole, - PortRole, KeyRole + PortRole, KeyRole, DefaultServerRole, CurrentServerRole }; Q_ENUM(TableRoles) ArmoryServersModel(QObject* parent = nullptr); + void setCurrent (int value); void setData(int curIdx, int connIdx, const std::vector&); void add(const ArmoryServer&); bool del(int idx); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index aa065c685..9c63afb6a 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -16,6 +16,7 @@ #include #include "Address.h" +#include "ArmoryServersModel.h" #include "AddressListModel.h" #include "ApiAdapter.h" #include "ApplicationSettings.h" diff --git a/GUI/QtQuick/images/disconn_ind.png b/GUI/QtQuick/images/disconn_ind.png new file mode 100644 index 0000000000000000000000000000000000000000..87129c611f965b2966fc53952fe3c8f7fbe48c4e GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJ3i-X*q7}lMWc?smOq&xaLGB9lH z=l+w(3gmMZctjR6FmMZlFeAgPITAoYRZkbk5Q*^Q6o#g@wzmHYQfv)1Zf+%x5(!P0 iBpOOMWu}=MFfsJZ;Odm(5G)63VDNPHb6Mw<&;$Ul{vrkd literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/qml/Settings/SettingsMenu.qml b/GUI/QtQuick/qml/Settings/SettingsMenu.qml index 28dabec2f..c5c4dda14 100644 --- a/GUI/QtQuick/qml/Settings/SettingsMenu.qml +++ b/GUI/QtQuick/qml/Settings/SettingsMenu.qml @@ -34,9 +34,6 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: 24 - //properties - isButton: true - //aliases icon_source: "qrc:/images/general.png" icon_add_source: "qrc:/images/arrow.png" @@ -51,9 +48,6 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: 10 - //properties - isButton: true - //aliases icon_source: "qrc:/images/network.png" icon_add_source: "qrc:/images/arrow.png" @@ -68,9 +62,6 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: 10 - //properties - isButton: true - //aliases icon_source: "qrc:/images/about.png" icon_add_source: "qrc:/images/arrow.png" diff --git a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml index 6044e94bc..2217a250c 100644 --- a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml +++ b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml @@ -10,6 +10,10 @@ ColumnLayout { id: layout + property var armoryServersModel: ({}) + + signal sig_add_custom() + height: 548 width: 580 @@ -24,46 +28,54 @@ ColumnLayout { text: qsTr("Network") } - CustomTextInput { - id: host - - input_validator: RegExpValidator { regExp: /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}(,(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})*/ } - - Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 24 - - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 - - title_text: qsTr("Armory host") + ListView { + id: list - onTextEdited : { - bsApp.settingArmoryHost = host.input_text + Layout.fillHeight: true + Layout.fillWidth: true + Layout.leftMargin: 25 + Layout.topMargin: 32 + + spacing: 10 + + model: armoryServersModel + + delegate: CustomListRadioButton { + id: _delegate + + width: 530 + title_text: name + icon_add_source: "qrc:/images/delete.png" + radio_checked: isCurrent + + onClicked_add: { + if (!isDefault) + { + bsApp.delArmoryServer(armoryServersModel, index) + } + } + + onSig_radio_clicked: { + if (radio_checked) + { + isCurrent = true + } + } } - } - CustomTextInput { - id: port + } - input_validator: IntValidator {bottom: 0; top: 65536;} + CustomListItem { + id: add_custom_server Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 Layout.topMargin: 10 - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + //aliases + icon_source: "qrc:/images/plus.svg" + title_text: qsTr("Add custom server") - title_text: qsTr("Armory port") - - onTextEdited : { - bsApp.settingArmoryPort = port.input_text - } + onClicked: sig_add_custom() } Label { @@ -74,9 +86,9 @@ ColumnLayout { function init() { - port.input_text = bsApp.settingArmoryPort - host.input_text = bsApp.settingArmoryHost + } - host.setActiveFocus() + Component.onCompleted: { + layout.armoryServersModel = bsApp.getArmoryServers() } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml index f8d01fdf1..ae6dca555 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml @@ -16,9 +16,6 @@ import "../BsStyles" Rectangle { id: rect - //properties - property bool isButton: false - //aliases property alias icon_source: icon.source property alias icon_visible: icon.visible @@ -97,10 +94,7 @@ Rectangle { hoverEnabled: true propagateComposedEvents: true onClicked: { - if (isButton) - rect.clicked() - else - mouse.accepted = false + rect.clicked() } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml b/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml index 5b18c4e4e..da4fc54a6 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml @@ -17,23 +17,23 @@ CustomListItem { id: root //properties - property bool rad_but_down: rad_but.down + property alias radio_checked: rad_but.checked - signal sig_rad_but_clicked() + signal sig_radio_clicked() icon_visible: false CustomRadioButton { id: rad_but - anchors.horizontalCenter: parent.horizontalCenter - anchors.left: rect.left + anchors.verticalCenter: parent.verticalCenter + anchors.left: root.left anchors.leftMargin: 21 width: 15 height: 15 - onClicked: root.sig_rad_but_clicked() + onClicked : root.sig_radio_clicked() } } diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 03e0c2a97..1e6fca0dc 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -283,8 +283,6 @@ CustomPopup { width: parent.width visible: (!wallet_properties_vm.isHardware && !wallet_properties_vm.isWatchingOnly) - isButton: true - icon_source: "qrc:/images/lock_icon.svg" icon_add_source: "qrc:/images/arrow.png" title_text: qsTr("Change password") @@ -297,7 +295,6 @@ CustomPopup { CustomListItem { width: parent.width - isButton: true icon_source: "qrc:/images/eye_icon.svg" icon_add_source: "qrc:/images/arrow.png" @@ -310,7 +307,7 @@ CustomPopup { CustomListItem { width: parent.width - isButton: true + visible: (!wallet_properties_vm.isHardware && !wallet_properties_vm.isWatchingOnly) icon_source: "qrc:/images/shield_icon.svg" @@ -325,7 +322,6 @@ CustomPopup { CustomListItem { width: parent.width - isButton: true icon_source: "qrc:/images/scan_icon.svg" icon_add_source: "qrc:/images/arrow.png" @@ -336,7 +332,6 @@ CustomPopup { CustomListItem { width: parent.width - isButton: true icon_source: "qrc:/images/delete_icon.svg" icon_add_source: "qrc:/images/arrow.png" diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 22eea1978..dd32f11bf 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -112,10 +112,14 @@ ApplicationWindow { Connections { - target:walletBalances - function onRowCountChanged () + target:bsApp + function onWalletsListChanged () { - if (overviewWalletIndex === -1) + if (walletBalances.rowCount === 0) + { + show_popup(create_wallet) + } + else if (overviewWalletIndex === -1) { overviewWalletIndex = 0 } @@ -178,7 +182,7 @@ ApplicationWindow { Image { id: imgArmoryStatus - source: (bsApp.armoryState === 7) ? "qrc:/images/conn_ind.png" : "qrc:/images/conn_inactive.png" + source: (bsApp.armoryState === 7) ? "qrc:/images/conn_ind.png" : "qrc:/images/disconn_ind.png" } Label { diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index e7e1047db..f1f0a3e0d 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -173,5 +173,6 @@ qml/StyledControls/CustomHorizontalHeaderView.qml qml/StyledControls/CustomRbfCpfpMenu.qml qml/StyledControls/CustomSuccessWidget.qml + images/disconn_ind.png From dca45251247193ab0b4e0c8140e5cc7206dd24a7 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 9 Mar 2023 21:36:10 +0300 Subject: [PATCH 217/436] wallet rename invokable --- GUI/QtQuick/QtQuickAdapter.cpp | 6 ++++++ GUI/QtQuick/QtQuickAdapter.h | 1 + 2 files changed, 7 insertions(+) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 53a4156c6..b5f2a9438 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2095,6 +2095,12 @@ int QtQuickAdapter::rescanWallet(const QString& walletId) return (msgId == 0) ? -1 : 0; } +int QtQuickAdapter::renameWallet(const QString& walletId, const QString& newName) +{ + logger_->debug("[{}] {} -> {}", __func__, walletId.toStdString(), newName.toStdString()); + return 0; +} + int QtQuickAdapter::changePassword(const QString& walletId, const QString& oldPassword, const QString& newPassword) { SignerMessage msg; diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 7aaa7f222..47c4e9744 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -174,6 +174,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE int viewWalletSeedAuth(const QString& walletId, const QString& password); Q_INVOKABLE int deleteWallet(const QString& walletId, const QString& password); Q_INVOKABLE int rescanWallet(const QString& walletId); + Q_INVOKABLE int renameWallet(const QString& walletId, const QString& newName); Q_INVOKABLE void walletSelected(int); void notifyNewTransaction(const bs::TXEntry& tx); From 11a0516caebb5f8f30ac1c8c4ff81a125b50a52f Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 10 Mar 2023 14:28:49 +0200 Subject: [PATCH 218/436] qml: add all inducators + wizard wallet in startup if no wallets --- GUI/QtQuick/ArmoryServersModel.cpp | 8 +- GUI/QtQuick/ArmoryServersModel.h | 9 +- GUI/QtQuick/QtQuickAdapter.cpp | 12 +- GUI/QtQuick/QtQuickAdapter.h | 2 + GUI/QtQuick/images/conn_ind_red.png | Bin 0 -> 190 bytes GUI/QtQuick/images/conn_ind_yellow.png | Bin 0 -> 199 bytes GUI/QtQuick/images/disconn_ind.png | Bin 144 -> 204 bytes GUI/QtQuick/qml/Settings/SettingsNetwork.qml | 12 +- .../StyledControls/CustomListRadioButton.qml | 8 +- .../StyledControls/CustomTitleToolButton.qml | 4 +- GUI/QtQuick/qml/main.qml | 107 ++++++++---------- GUI/QtQuick/qtquick.qrc | 2 + 12 files changed, 92 insertions(+), 72 deletions(-) create mode 100644 GUI/QtQuick/images/conn_ind_red.png create mode 100644 GUI/QtQuick/images/conn_ind_yellow.png diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index a2d7bcaeb..1af3a34fc 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -11,6 +11,8 @@ #include "ArmoryServersModel.h" #include "ArmoryServersProvider.h" +#include + namespace { static const QHash kRoleNames{ {ArmoryServersModel::TableDataRole, "tableData"}, @@ -24,9 +26,10 @@ namespace { }; } -ArmoryServersModel::ArmoryServersModel(QObject* parent) +ArmoryServersModel::ArmoryServersModel(const std::shared_ptr & logger, QObject* parent) : QAbstractTableModel(parent) , header_{ tr("Name"), tr("Network"), tr("Address"), tr("Port"), tr("Key") } + , logger_(logger) {} void ArmoryServersModel::setCurrent (int value) @@ -118,13 +121,14 @@ QVariant ArmoryServersModel::data(const QModelIndex& index, int role) const bool ArmoryServersModel::setData(const QModelIndex& index, const QVariant& value, int role) { - if(!index.isValid() || !isEditable(index.row())) { + if(!index.isValid()) { return false; } switch (role) { case CurrentServerRole: + logger_->debug("[{}] current = {}", __func__, value.toInt()); setCurrent(value.toInt()); break; default: diff --git a/GUI/QtQuick/ArmoryServersModel.h b/GUI/QtQuick/ArmoryServersModel.h index 3758915eb..7fc400bb9 100644 --- a/GUI/QtQuick/ArmoryServersModel.h +++ b/GUI/QtQuick/ArmoryServersModel.h @@ -10,9 +10,15 @@ */ #pragma once +#include + #include #include "ArmorySettings.h" +namespace spdlog { + class logger; +} + class ArmoryServersModel: public QAbstractTableModel { Q_OBJECT @@ -26,7 +32,7 @@ class ArmoryServersModel: public QAbstractTableModel }; Q_ENUM(TableRoles) - ArmoryServersModel(QObject* parent = nullptr); + ArmoryServersModel(const std::shared_ptr&, QObject* parent = nullptr); void setCurrent (int value); void setData(int curIdx, int connIdx, const std::vector&); @@ -55,6 +61,7 @@ class ArmoryServersModel: public QAbstractTableModel QVariant getData(int row, int col) const; private: + std::shared_ptr logger_; const QStringList header_; int current_{ -1 }; int connected_{ -1 }; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 53a4156c6..cec332fa7 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -275,6 +275,13 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("feeSuggestions"), feeSuggModel_); engine.addImageProvider(QLatin1Literal("QR"), new QRImageProvider); + connect(&engine, &QQmlApplicationEngine::objectCreated, + [this]() { + if(nWalletsLoaded >= 0) { + emit walletsLoaded(nWalletsLoaded); + } + }); + engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml"))); if (engine.rootObjects().empty()) { BSMessageBox box(BSMessageBox::critical, app.tr("BlockSettle Terminal") @@ -294,6 +301,7 @@ void QtQuickAdapter::run(int &argc, char **argv) updateStates(); requestInitialSettings(); + logger_->debug("[QtGuiAdapter::run] initial setup done"); app.exec(); } @@ -428,6 +436,7 @@ ProcessingResult QtQuickAdapter::processSettingsState(const SettingsMessage_Sett ProcessingResult QtQuickAdapter::processArmoryServers(bs::message::SeqId msgId , const SettingsMessage_ArmoryServers& response) { + logger_->debug("[{}]", __func__); const auto& itReq = armoryServersReq_.find(msgId); if (itReq == armoryServersReq_.end()) { logger_->warn("[{}] unknown request #{}", __func__, msgId); @@ -597,6 +606,7 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) break; case WalletsMessage::kReady: + nWalletsLoaded = msg.ready(); emit walletsLoaded(msg.ready()); logger_->debug("[{}] loaded {} wallet[s]", __func__, msg.ready()); break; @@ -1286,7 +1296,7 @@ ArmoryServersModel* QtQuickAdapter::getArmoryServers() SettingsMessage msg; msg.mutable_armory_servers_get(); const auto msgId = pushRequest(user_, userSettings_, msg.SerializeAsString()); - auto model = new ArmoryServersModel(this); + auto model = new ArmoryServersModel(logger_, this); armoryServersReq_[msgId] = model; connect(model, &ArmoryServersModel::changed, this, &QtQuickAdapter::onArmoryServerChanged); return model; diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 6c788c393..c6cf8d61a 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -302,6 +302,8 @@ private slots: std::map addressCache_; std::set rmTxOnInvalidation_; std::map armoryServersReq_; + + int nWalletsLoaded {-1}; }; #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/images/conn_ind_red.png b/GUI/QtQuick/images/conn_ind_red.png new file mode 100644 index 0000000000000000000000000000000000000000..6c29289b3c0657474448b24705626ea17b63cc34 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJ3i-X*q7}lMWc?smOq&xaLGB9lH z=l+w(3gmMZctjR6FmMZlFeAgPITAp@U{4pv5Q*?)hQ_%c=e^$lso)>;!`g>>><5~D zAD+wqFFoN$e^2?5>bwMol}^)tu!$ryWgljm(Z_0))3oW~gO>iUiUyAzW_(th@pSj2 ey=DeL0CbF=&cV0GAKe2Q&*16m=d#Wzp$Py0L_ur- literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/conn_ind_yellow.png b/GUI/QtQuick/images/conn_ind_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..fcfc8bd33849aa6c60f68c805cb5926acba19240 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJ3i-X*q7}lMWc?smOq&xaLGB9lH z=l+w(3gmMZctjR6FmMZlFeAgPITAp@7*7|+5Q*?)hQ_(pw(IL^&-|2c`Tn-3l0zu@ z&i>0k7dHQiv)sU?apUKW&sNGFqSvp#4^ZUzaqjHN11zb@49k+Q%dB(0Sy1q3*H>kO q#|QYHyBnM?fBS9Mu>%JVFfcfqs-KX5v+xMe9tKZWKbLh*2~7Z(`A3NW literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/disconn_ind.png b/GUI/QtQuick/images/disconn_ind.png index 87129c611f965b2966fc53952fe3c8f7fbe48c4e..ab6a72d4c72190b7ed6781dd5d0f90b4172304d2 100644 GIT binary patch delta 125 zcmV-@0D}LJ0n7oAR(4@YL_t&-S7T%Vf`podAI11z@PXKGKZt#w+nUJ5m{K+Os|?#? zE|4G$-21EaiAhNC4T>NLNb)`BV}i0V0Mna~5}%-KIC%R} 0) + text: qsTr("Send") icon.source: "qrc:/images/send_icon.png" font.pointSize: 16 Layout.fillHeight: true - onClicked: { - if (walletBalances.rowCount > 0) - { - topMenuBtnClicked(btnSend) - show_popup(send_popup) - } - else - { - show_popup(create_wallet) - } - } } + CustomTitleToolButton { id: btnReceive + + enabled: (walletBalances.rowCount > 0) + text: qsTr("Receive") icon.source: "qrc:/images/receive_icon.png" font.pointSize: 16 Layout.fillHeight: true - enabled: !bsApp.walletsList.empty - - onClicked: { - if (walletBalances.rowCount > 0) - { - topMenuBtnClicked(btnReceive) - bsApp.generateNewAddress(overviewWalletIndex, true) - show_popup(receive_popup) - } - else - { - show_popup(create_wallet) - } - } } + CustomTitleToolButton { id: btnSettings text: qsTr("Settings") @@ -354,25 +365,6 @@ ApplicationWindow { clickedBtn.select(true) } -/* function raiseWindow() { - JsHelper.raiseWindow(mainWindow) - } - function hideWindow() { - JsHelper.hideWindow(mainWindow) - } - - function customDialogRequest(dialogName, data) { - var newDialog = JsHelper.customDialogRequest(dialogName, data) - if (newDialog) { - raiseWindow() - JsHelper.prepareDialog(newDialog) - } - } - - function invokeQmlMethod(method, cppCallback, argList) { - JsHelper.evalWorker(method, cppCallback, argList) - }*/ - function moveMainWindowToScreenCenter() { mainWindow.x = Screen.virtualX + (Screen.width - mainWindow.width) / 2 mainWindow.y = Screen.virtualY + (Screen.height - mainWindow.height) / 2 @@ -460,11 +452,4 @@ ApplicationWindow { trayIcon.show() } } - - Connections { - target: bsApp - function onShowNotification(title, text) { - trayIcon.showMessage(title, text, SystemTrayIcon.Information, 5000) - } - } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index f1f0a3e0d..bd7c24b72 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -174,5 +174,7 @@ qml/StyledControls/CustomRbfCpfpMenu.qml qml/StyledControls/CustomSuccessWidget.qml images/disconn_ind.png + images/conn_ind_yellow.png + images/conn_ind_red.png From 08ea6c39c123d364e584cf2a8f97030a0886a211 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 10 Mar 2023 18:04:34 +0200 Subject: [PATCH 219/436] pr fixes --- GUI/QtQuick/ArmoryServersModel.cpp | 32 +++++++++++++++++++++++------- GUI/QtQuick/QtQuickAdapter.cpp | 6 +++--- GUI/QtQuick/QtQuickAdapter.h | 2 +- GUI/QtQuick/qml/main.qml | 9 --------- 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index 1af3a34fc..718ae1f6e 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -121,18 +121,36 @@ QVariant ArmoryServersModel::data(const QModelIndex& index, int role) const bool ArmoryServersModel::setData(const QModelIndex& index, const QVariant& value, int role) { - if(!index.isValid()) { + if(!index.isValid() || index.row() > rowCount() || index.column() > columnCount()) { return false; } - switch (role) - { - case CurrentServerRole: + if (role == CurrentServerRole) { logger_->debug("[{}] current = {}", __func__, value.toInt()); setCurrent(value.toInt()); - break; - default: - break; + } + else if (!isEditable(index.row())) { + auto row = index.row(); + switch (role) + { + case NameRole: + data_.at(row).name = value.toString(); + break; + case NetTypeRole: + data_.at(row).netType = static_cast(value.toInt()); + break; + case AddressRole: + data_.at(row).armoryDBIp = value.toString(); + break; + case PortRole: + data_.at(row).armoryDBPort = value.toInt(); + break; + case KeyRole: + data_.at(row).armoryDBKey = value.toString(); + break; + default: + break; + } } emit changed(index, value); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index e771c26a5..3a014f31c 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -277,8 +277,8 @@ void QtQuickAdapter::run(int &argc, char **argv) connect(&engine, &QQmlApplicationEngine::objectCreated, [this]() { - if(nWalletsLoaded >= 0) { - emit walletsLoaded(nWalletsLoaded); + if(nWalletsLoaded_ >= 0) { + emit walletsLoaded(nWalletsLoaded_); } }); @@ -606,7 +606,7 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) break; case WalletsMessage::kReady: - nWalletsLoaded = msg.ready(); + nWalletsLoaded_ = msg.ready(); emit walletsLoaded(msg.ready()); logger_->debug("[{}] loaded {} wallet[s]", __func__, msg.ready()); break; diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 966f639f6..98b10df46 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -304,7 +304,7 @@ private slots: std::set rmTxOnInvalidation_; std::map armoryServersReq_; - int nWalletsLoaded {-1}; + int nWalletsLoaded_ {-1}; }; #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 7f2754ab6..777b36b6e 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -105,7 +105,6 @@ ApplicationWindow { function onShowError(text) { - //ibFailure.displayMessage(text) error_dialog.error = text show_popup(error_dialog) } @@ -123,7 +122,6 @@ ApplicationWindow { if (nb === 0) { isNoWalletsWizard = true - console.log("isNoWalletsWizard = " + isNoWalletsWizard) } } @@ -144,8 +142,6 @@ ApplicationWindow { } onVisibleChanged: { - console.log("onVisibleChanged mainWindow.visible= " + mainWindow.visible) - console.log("onVisibleChanged isNoWalletsWizard= " + isNoWalletsWizard) if (mainWindow.visible && isNoWalletsWizard) { isNoWalletsWizard = false @@ -162,11 +158,6 @@ ApplicationWindow { color: BSStyle.backgroundModeLessColor } - // attached to use from c++ -/* function messageBoxCritical(title, text, details) { - return JsHelper.messageBoxCritical(title, text, details) - }*/ - InfoBanner { id: ibSuccess bgColor: "darkgreen" From a2f5b668fe97a8cbcaa7dfdef3602c653390a3d1 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sat, 11 Mar 2023 03:40:31 +0200 Subject: [PATCH 220/436] qml: settings/network according figma --- GUI/QtQuick/ArmoryServersModel.cpp | 37 +++- GUI/QtQuick/ArmoryServersModel.h | 12 +- GUI/QtQuick/QtQuickAdapter.cpp | 2 + GUI/QtQuick/images/delete_custom_server.svg | 8 + .../qml/CreateWallet/ConfirmPassword.qml | 21 +- .../qml/CreateWallet/ImportHardware.qml | 4 +- GUI/QtQuick/qml/CreateWallet/ImportWallet.qml | 10 +- .../qml/CreateWallet/ImportWatchingWallet.qml | 10 +- .../qml/CreateWallet/StartCreateWallet.qml | 15 +- .../qml/CreateWallet/TermsAndConditions.qml | 4 +- GUI/QtQuick/qml/CreateWallet/WalletSeed.qml | 9 +- .../qml/CreateWallet/WalletSeedSkipAccept.qml | 8 +- .../qml/CreateWallet/WalletSeedVerify.qml | 8 +- GUI/QtQuick/qml/Settings/AddArmoryServer.qml | 198 ++++++++++++++++++ .../qml/Settings/DeleteArmoryServer.qml | 101 +++++++++ GUI/QtQuick/qml/Settings/SettingsNetwork.qml | 38 ++-- GUI/QtQuick/qml/Settings/SettingsPopup.qml | 45 ++++ .../qml/StyledControls/CustomButton.qml | 2 +- .../qml/StyledControls/CustomListItem.qml | 5 +- .../StyledControls/CustomListRadioButton.qml | 4 + .../qml/StyledControls/CustomRadioButton.qml | 1 + .../qml/StyledControls/CustomTitleLabel.qml | 2 +- GUI/QtQuick/qml/main.qml | 11 + GUI/QtQuick/qtquick.qrc | 3 + 24 files changed, 472 insertions(+), 86 deletions(-) create mode 100644 GUI/QtQuick/images/delete_custom_server.svg create mode 100644 GUI/QtQuick/qml/Settings/AddArmoryServer.qml create mode 100644 GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index 718ae1f6e..751cd09a6 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -30,7 +30,14 @@ ArmoryServersModel::ArmoryServersModel(const std::shared_ptr & l : QAbstractTableModel(parent) , header_{ tr("Name"), tr("Network"), tr("Address"), tr("Port"), tr("Key") } , logger_(logger) -{} +{ + connect(this, &ArmoryServersModel::modelReset, + this, &ArmoryServersModel::rowCountChanged); + connect(this, &ArmoryServersModel::rowsInserted, + this, &ArmoryServersModel::rowCountChanged); + connect(this, &ArmoryServersModel::rowsRemoved, + this, &ArmoryServersModel::rowCountChanged); +} void ArmoryServersModel::setCurrent (int value) { @@ -65,6 +72,24 @@ void ArmoryServersModel::add(const ArmoryServer& srv) }); } +// netType==0 => MainNet, netType==1 => TestNet +void ArmoryServersModel::add(QString name, QString armoryDBIp, int armoryDBPort, int netType, QString armoryDBKey) +{ + ArmoryServer server; + server.name = name; + server.armoryDBPort = armoryDBPort; + server.armoryDBIp = armoryDBIp; + server.armoryDBKey = armoryDBKey; + if (netType == 0) { + server.netType = NetworkType::MainNet; + } + else if (netType == 1) { + server.netType = NetworkType::TestNet; + } + + add(server); +} + bool ArmoryServersModel::del(int idx) { if ((idx >= rowCount()) || (idx < 0) || (idx < ArmoryServersProvider::kDefaultServersCount)) { @@ -75,6 +100,10 @@ bool ArmoryServersModel::del(int idx) data_.erase(data_.cbegin() + idx); endRemoveRows(); }); + if (idx == current()) { + //@dvajdual dont sure - what server must be default? + setCurrent(0); + } return true; } @@ -125,12 +154,12 @@ bool ArmoryServersModel::setData(const QModelIndex& index, const QVariant& value return false; } + int row = index.row(); + if (role == CurrentServerRole) { - logger_->debug("[{}] current = {}", __func__, value.toInt()); - setCurrent(value.toInt()); + setCurrent(row); } else if (!isEditable(index.row())) { - auto row = index.row(); switch (role) { case NameRole: diff --git a/GUI/QtQuick/ArmoryServersModel.h b/GUI/QtQuick/ArmoryServersModel.h index 7fc400bb9..9ce922936 100644 --- a/GUI/QtQuick/ArmoryServersModel.h +++ b/GUI/QtQuick/ArmoryServersModel.h @@ -22,8 +22,9 @@ namespace spdlog { class ArmoryServersModel: public QAbstractTableModel { Q_OBJECT - Q_PROPERTY(int current READ current WRITE setCurrent NOTIFY currentChanged) - Q_PROPERTY(int connected READ connected NOTIFY connectedChanged) + Q_PROPERTY(int current READ current WRITE setCurrent NOTIFY currentChanged) + Q_PROPERTY(int connected READ connected NOTIFY connectedChanged) + Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) public: enum TableRoles { @@ -37,7 +38,9 @@ class ArmoryServersModel: public QAbstractTableModel void setCurrent (int value); void setData(int curIdx, int connIdx, const std::vector&); void add(const ArmoryServer&); - bool del(int idx); + // netType==0 => MainNet, netType==1 => TestNet + Q_INVOKABLE void add(QString name, QString armoryDBIp, int armoryDBPort, int netType, QString armoryDBKey); + Q_INVOKABLE bool del(int idx); auto data() const { return data_; } auto data(int idx) const { return data_.at(idx); } @@ -48,12 +51,13 @@ class ArmoryServersModel: public QAbstractTableModel QHash roleNames() const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; - Q_INVOKABLE bool isEditable(int row) const; + bool isEditable(int row) const; signals: void changed(const QModelIndex&, const QVariant&); void currentChanged(); void connectedChanged(); + void rowCountChanged(); private: int current() const { return current_; } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 3a014f31c..3d1200f76 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -253,6 +253,8 @@ void QtQuickAdapter::run(int &argc, char **argv) , 1, 0, "TxListModel", tr("Error: only enums")); qmlRegisterUncreatableMetaObject(QmlAddressListModel::staticMetaObject, "terminal.models" , 1, 0, "QmlAddressListModel", tr("Error: only enums")); + qmlRegisterUncreatableMetaObject(ArmoryServersModel::staticMetaObject, "terminal.models" + , 1, 0, "ArmoryServersModel", tr("Error: only enums")); qmlRegisterType("terminal.models", 1, 0, "AddressFilterModel"); //need to read files in qml diff --git a/GUI/QtQuick/images/delete_custom_server.svg b/GUI/QtQuick/images/delete_custom_server.svg new file mode 100644 index 000000000..bd0571a2f --- /dev/null +++ b/GUI/QtQuick/images/delete_custom_server.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml index 0f88eb0bc..f6871bb72 100644 --- a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml @@ -36,12 +36,10 @@ ColumnLayout { title_leftMargin: 16 title_topMargin: 16 - title_text: qsTr("Password") + isPassword: true + isHiddenText: true - Component.onCompleted: { - password.isPassword = true - password.isHiddenText = true - } + title_text: qsTr("Password") } @@ -57,12 +55,10 @@ ColumnLayout { title_leftMargin: 16 title_topMargin: 16 - title_text: qsTr("Confirm Password") + isPassword: true + isHiddenText: true - Component.onCompleted: { - confirm_password.isPassword = true - confirm_password.isHiddenText = true - } + title_text: qsTr("Confirm Password") } Label { @@ -81,10 +77,7 @@ ColumnLayout { width: 530 enabled: (password.input_text !== "") && (confirm_password.input_text !== "") - - Component.onCompleted: { - confirm_but.preferred = true - } + preferred: true function click_enter() { if (!confirm_but.enabled) return diff --git a/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml index 9b1d1481f..2a5bbdef6 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml @@ -100,10 +100,8 @@ ColumnLayout { width: 530 enabled: /*layout.isConnected &&*/ (hwDeviceModel.selDevice >= 0) + preferred: true - Component.onCompleted: { - confirm_but.preferred = true - } function click_enter() { if (!confirm_but.enabled) return diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml index 249081ced..64b393987 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml @@ -45,6 +45,8 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: 24 + isFullChoosed: true + onSig_full_changed: (isFull) => { if (isFull === false) { @@ -52,10 +54,6 @@ ColumnLayout { layout.sig_only_watching() } } - - Component.onCompleted: { - type_switch.isFullChoosed = true - } } RowLayout { @@ -339,10 +337,8 @@ ColumnLayout { width: 530 enabled: !grid.hasEmptyWords + preferred: true - Component.onCompleted: { - import_but.preferred = true - } function click_enter() { if (!import_but.enabled) return diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml index f7b81d4c2..d9aee737d 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml @@ -34,6 +34,7 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: 24 + isFullChoosed: false onSig_full_changed: (isFull) => { if (isFull === true) @@ -42,10 +43,6 @@ ColumnLayout { layout.sig_full() } } - - Component.onCompleted: { - type_switch.isFullChoosed = false - } } Image { @@ -145,10 +142,7 @@ ColumnLayout { Layout.topMargin: 32 width: 530 enabled: layout.isFileChoosen - - Component.onCompleted: { - import_but.preferred = true - } + preferred: true function click_enter() { if (!import_but.enabled) return diff --git a/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml b/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml index dc8523970..cb455f274 100644 --- a/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml @@ -73,9 +73,8 @@ ColumnLayout { text: qsTr("Hardware Wallet") width: 170 - Component.onCompleted: { - hardware_but.preferred = false - } + preferred: false + function click_enter() { sig_hardware_wallet() } @@ -86,9 +85,8 @@ ColumnLayout { text: qsTr("Import Wallet") width: 170 - Component.onCompleted: { - import_but.preferred = false - } + preferred: false + function click_enter() { sig_import_wallet() } @@ -99,9 +97,8 @@ ColumnLayout { text: qsTr("Create new") width: 170 - Component.onCompleted: { - create_but.preferred = true - } + preferred: true + function click_enter() { sig_create_new() } diff --git a/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml b/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml index 2695ca3fc..00c01c1f6 100644 --- a/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml +++ b/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml @@ -92,10 +92,8 @@ ColumnLayout { text: qsTr("Continue") Layout.leftMargin: 24 width: 532 + preferred: true - Component.onCompleted: { - continue_but.preferred = true - } function click_enter() { bsApp.settingActivated = true sig_continue() diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml index ee3515d9d..987b29dea 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml @@ -68,9 +68,8 @@ ColumnLayout { text: qsTr("Copy Seed") width: 261 - Component.onCompleted: { - copy_seed_but.preferred = false - } + preferred: false + function click_enter() { bsApp.copySeedToClipboard(phrase) } @@ -81,9 +80,7 @@ ColumnLayout { text: qsTr("Continue") width: 261 - Component.onCompleted: { - continue_but.preferred = true - } + preferred: true function click_enter() { layout.sig_continue() diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml index 1195e1360..cbe378327 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml @@ -73,9 +73,7 @@ ColumnLayout { text: qsTr("Yes, Skip") width: 261 - Component.onCompleted: { - skip_but.preferred = false - } + preferred: false function click_enter() { layout.sig_skip() @@ -87,9 +85,7 @@ ColumnLayout { text: qsTr("No") width: 261 - Component.onCompleted: { - no_but.preferred = true - } + preferred: true function click_enter() { layout.sig_not_skip() diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml index 15657bcc7..fb1ccdad6 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml @@ -93,9 +93,7 @@ ColumnLayout { text: qsTr("Skip") width: 261 - Component.onCompleted: { - skip_but.preferred = false - } + preferred: false function click_enter() { layout.sig_skipped() @@ -109,9 +107,7 @@ ColumnLayout { enabled: list.isComplete - Component.onCompleted: { - continue_but.preferred = true - } + preferred: true function click_enter() { if (!continue_but.enabled) return diff --git a/GUI/QtQuick/qml/Settings/AddArmoryServer.qml b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml new file mode 100644 index 000000000..34af0fbc7 --- /dev/null +++ b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml @@ -0,0 +1,198 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + + id: layout + + property var armoryServersModel: ({}) + signal sig_added() + + height: 548 + width: 580 + + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : title.height + text: qsTr("Add custom server") + } + + RowLayout { + id: row + spacing: 12 + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.topMargin: 24 + Layout.preferredHeight: 19 + + Label { + Layout.fillWidth: true + } + + Label { + id: radbut_text + + text: qsTr("Network type:") + + Layout.leftMargin: 25 + Layout.alignment: Qt.AlignVCenter + + width: 126 + height: 19 + + color: "#E2E7FF" + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Normal + } + + CustomRadioButton { + id: radbut_main + + Layout.alignment: Qt.AlignVCenter + + text: "MainNet" + + spacing: 6 + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Normal + + checked: true + } + + CustomRadioButton { + id: radbut_test + + Layout.alignment: Qt.AlignVCenter + + text: "TestNet" + + spacing: 6 + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Normal + + checked: false + } + + Label { + Layout.fillWidth: true + } + } + + CustomTextInput { + id: name_text_input + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + title_text: qsTr("Name") + } + + CustomTextInput { + id: ip_dns_text_input + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + title_text: qsTr("IP/DNS") + + input_validator: RegExpValidator { regExp: /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}(,(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})*/ } + } + + CustomTextInput { + id: port_text_input + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + title_text: qsTr("Port") + + input_validator: IntValidator {bottom: 0; top: 65536;} + } + + CustomTextInput { + id: db_key_text_input + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + title_text: qsTr("DB Key (optional)") + } + + CustomButton { + id: save_but + text: qsTr("Save") + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + height : 70 + width: 532 + Layout.topMargin: 10 + + enabled: (name_text_input.input_text !== "") + && (ip_dns_text_input.input_text !== "") + && (port_text_input.input_text !== "") + preferred: true + + function click_enter() { + if (!save_but.enabled) return + + var networkType = radbut_main.checked ? 0 : 1 + var name = radbut_main.checked ? name_text_input.input_text + " (Mainnet)" : name_text_input.input_text + " (Testnet)" + var ip_dns = ip_dns_text_input.input_text + var port = parseInt(port_text_input.input_text) + var db_key = db_key_text_input.input_text + + armoryServersModel.add(name, ip_dns, port, networkType, db_key) + + clear() + + sig_added() + } + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + Keys.onEnterPressed: { + save_but.click_enter() + } + + Keys.onReturnPressed: { + save_but.click_enter() + } + + function init() + { + clear() + name_text_input.setActiveFocus() + } + + function clear() + { + ip_dns_text_input.input_text = "" + port_text_input.input_text = "" + db_key_text_input.input_text = "" + name_text_input.input_text = "" + } +} diff --git a/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml b/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml new file mode 100644 index 000000000..b95a3f977 --- /dev/null +++ b/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml @@ -0,0 +1,101 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +import terminal.models 1.0 + +ColumnLayout { + + id: layout + + property var armoryServersModel: ({}) + property int server_index + + signal sig_back() + signal sig_delete() + + height: 548 + width: 580 + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : title.height + text: qsTr("Delete custom server") + } + + Image { + id: wallet_icon + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.topMargin: 24 + Layout.preferredHeight : 120 + Layout.preferredWidth : 120 + + source: "qrc:/images/delete_custom_server.svg" + width: 120 + height: 120 + } + + Label { + id: description + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.topMargin: 16 + Layout.preferredHeight : 16 + + text: qsTr("Are you sure you want to delete the \"%1\" server?") + .arg(armoryServersModel.data(armoryServersModel.index(server_index, 0), ArmoryServersModel.NameRole)) + + color: BSStyle.titanWhiteColor + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Label { + Layout.fillWidth: true + Layout.fillHeight: true + } + + RowLayout { + id: row + spacing: 11 + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + CustomButton { + id: back_but + text: qsTr("No, back") + width: 262 + + preferred: false + function click_enter() { + sig_back() + } + } + + CustomButton { + id: delete_but + text: qsTr("Yes, delete") + width: 262 + + preferred: true + function click_enter() { + armoryServersModel.del(server_index) + sig_delete() + } + } + } + + function init() + { + back_but.forceActiveFocus() + } +} diff --git a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml index 7628b17a5..47ce3e713 100644 --- a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml +++ b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml @@ -13,6 +13,7 @@ ColumnLayout { property var armoryServersModel: ({}) signal sig_add_custom() + signal sig_delete_custom(int ind) height: 548 width: 580 @@ -31,15 +32,23 @@ ColumnLayout { ListView { id: list -// Layout.preferredHeight: Math.min(armoryServersModel.rowCount * 50 + (armoryServersModel.rowCount - 1) * 10, -// 425) Layout.fillWidth: true - Layout.fillHeight: true Layout.leftMargin: 24 Layout.topMargin: 24 spacing: 10 + clip: true + boundsBehavior: Flickable.StopAtBounds + + flickDeceleration: 750 + maximumFlickVelocity: 1000 + + ScrollBar.vertical: ScrollBar { + id: verticalScrollBar + policy: list.contentHeight > list.height ? ScrollBar.AlwaysOn : ScrollBar.AsNeeded + } + model: armoryServersModel ButtonGroup { id: radioGroup } @@ -48,15 +57,12 @@ ColumnLayout { id: _delegate title_text: name - icon_add_source: "qrc:/images/delete.png" + icon_add_source: isDefault ? "" : "qrc:/images/delete.png" radio_checked: isCurrent radio_group: radioGroup onClicked_add: { - if (!isDefault) - { - bsApp.delArmoryServer(armoryServersModel, index) - } + sig_delete_custom (index) } onSig_radio_clicked: { @@ -67,6 +73,18 @@ ColumnLayout { } } + + Connections + { + target:armoryServersModel + function onRowCountChanged () + { + var new_height = Math.min(armoryServersModel.rowCount * 50 + (armoryServersModel.rowCount - 1) * 10, + 425) + //list.height = new_height + list.implicitHeight = new_height + } + } } CustomListItem { @@ -91,8 +109,4 @@ ColumnLayout { function init() { } - - Component.onCompleted: { - layout.armoryServersModel = bsApp.getArmoryServers() - } } diff --git a/GUI/QtQuick/qml/Settings/SettingsPopup.qml b/GUI/QtQuick/qml/Settings/SettingsPopup.qml index 607e03ad6..f544c897f 100644 --- a/GUI/QtQuick/qml/Settings/SettingsPopup.qml +++ b/GUI/QtQuick/qml/Settings/SettingsPopup.qml @@ -14,6 +14,8 @@ CustomPopup { _stack_view.initialItem: settings_menu _arrow_but_visibility: !settings_menu.visible + property var armoryServersModel: ({}) + SettingsMenu { id: settings_menu visible: false @@ -41,9 +43,52 @@ CustomPopup { SettingsNetwork { id: settings_network visible: false + + armoryServersModel: root.armoryServersModel + + onSig_add_custom: { + _stack_view.push(add_armory_server) + add_armory_server.init() + } + + onSig_delete_custom: (server_index) => { + _stack_view.push(delete_armory_server) + delete_armory_server.init() + delete_armory_server.server_index = server_index + } + } + + AddArmoryServer { + id: add_armory_server + visible: false + + armoryServersModel: root.armoryServersModel + + onSig_added: { + _stack_view.pop() + } + } + + DeleteArmoryServer { + id: delete_armory_server + visible: false + + armoryServersModel: root.armoryServersModel + + onSig_delete: { + _stack_view.pop() + } + + onSig_back: { + _stack_view.pop() + } } function init() { settings_menu.init() } + + Component.onCompleted: { + root.armoryServersModel = bsApp.getArmoryServers() + } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomButton.qml b/GUI/QtQuick/qml/StyledControls/CustomButton.qml index 7e38b5a72..bdc742f5e 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButton.qml @@ -23,7 +23,7 @@ Button { //aliases property alias back_radius: back.radius - activeFocusOnTab: true + activeFocusOnTab: control.enabled font.pixelSize: 16 font.family: "Roboto" diff --git a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml index 917462f95..b2dfdf924 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml @@ -69,12 +69,13 @@ Rectangle { Image { id: icon_add - visible: source.length > 0 + visible: source.toString().length > 0 anchors.verticalCenter: parent.verticalCenter anchors.right: rect.right anchors.rightMargin: 13 + z: 1 width: 24 height: 24 sourceSize.width: 24 @@ -91,10 +92,10 @@ Rectangle { MouseArea { id: mouseArea anchors.fill: parent - hoverEnabled: true propagateComposedEvents: true onClicked: { rect.clicked() + mouse.accepted = false } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml b/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml index 512e04f58..598e04110 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml @@ -42,4 +42,8 @@ CustomListItem { onClicked : root.sig_radio_clicked() } + onClicked : { + rad_but.checked = true + root.sig_radio_clicked() + } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml b/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml index 24b508ae3..b56754fa8 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml @@ -17,6 +17,7 @@ RadioButton { id: control checked: true + activeFocusOnTab: false indicator: Rectangle { implicitWidth: 16 diff --git a/GUI/QtQuick/qml/StyledControls/CustomTitleLabel.qml b/GUI/QtQuick/qml/StyledControls/CustomTitleLabel.qml index 7a99bf906..1d4513406 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTitleLabel.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTitleLabel.qml @@ -15,7 +15,7 @@ import "../BsStyles" Label { id: title height : 23 - color: "#E2E7FF" + color: BSStyle.titanWhiteColor font.pixelSize: 20 font.family: "Roboto" font.weight: Font.Medium diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 777b36b6e..a580fc470 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -218,6 +218,11 @@ ApplicationWindow { icon.source: "qrc:/images/send_icon.png" font.pointSize: 16 Layout.fillHeight: true + + onClicked: { + topMenuBtnClicked(btnSend) + show_popup(send_popup) + } } CustomTitleToolButton { @@ -230,6 +235,12 @@ ApplicationWindow { font.pointSize: 16 Layout.fillHeight: true + + onClicked: { + topMenuBtnClicked(btnReceive) + bsApp.generateNewAddress(overviewWalletIndex, true) + show_popup(receive_popup) + } } CustomTitleToolButton { diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index bd7c24b72..6975f3d22 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -176,5 +176,8 @@ images/disconn_ind.png images/conn_ind_yellow.png images/conn_ind_red.png + qml/Settings/AddArmoryServer.qml + images/delete_custom_server.svg + qml/Settings/DeleteArmoryServer.qml From 767e92a1c39ffe5c6e73ad216a75a7576ec7d188 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Sun, 12 Mar 2023 01:36:17 +0200 Subject: [PATCH 221/436] qml: refactoring: remove unnecessary component.oncompleted --- GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml | 14 ++++---------- GUI/QtQuick/qml/Pin/PinEntriesPopup.qml | 4 +--- GUI/QtQuick/qml/Receive/ReceiveQrCode.qml | 4 +--- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 9 ++------- GUI/QtQuick/qml/Send/PasswordWithTimer.qml | 6 ++---- GUI/QtQuick/qml/Send/SignTransaction.qml | 5 ++--- .../qml/Send/SignTransactionAdvanced.qml | 5 ++--- GUI/QtQuick/qml/Send/SimpleDetails.qml | 4 +--- GUI/QtQuick/qml/Settings/qmldir | 4 ++++ .../qml/StyledControls/CustomMessageDialog.qml | 4 +--- .../qml/StyledControls/CustomSuccessWidget.qml | 5 ++--- .../qml/WalletProperties/ChangePassword.qml | 18 ++++++------------ .../qml/WalletProperties/DeleteWallet.qml | 6 ++---- .../qml/WalletProperties/WalletSeedAuth.qml | 6 ++---- 14 files changed, 32 insertions(+), 62 deletions(-) diff --git a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml index 26dab0955..9a54da870 100644 --- a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml +++ b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml @@ -127,10 +127,8 @@ Window { title_text: qsTr("Password") - Component.onCompleted: { - password.isPassword = true - password.isHiddenText = true - } + isPassword: true + isHiddenText: true } RowLayout { @@ -146,9 +144,7 @@ Window { text: qsTr("Cancel") width: 190 - Component.onCompleted: { - cancel_but.preferred = false - } + preferred: false function click_enter() { root.clean() root.close() @@ -162,9 +158,7 @@ Window { //enabled: accept_on_device || password.input_text.length //always accept now - Component.onCompleted: { - accept_but.preferred = true - } + preferred: true function click_enter() { bsApp.setHWpassword(password.input_text) diff --git a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml index 2c060e950..90e11da2e 100644 --- a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml +++ b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml @@ -186,9 +186,7 @@ Window { width: 380 - Component.onCompleted: { - accept_but.preferred = true - } + preferred: true function click_enter() { if (!accept_but.enabled) return diff --git a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml index 542eab850..756f4f747 100644 --- a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml +++ b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml @@ -97,9 +97,7 @@ ColumnLayout { icon.height: 24 icon.color: "#FFFFFF" - Component.onCompleted: { - copy_but.preferred = true - } + preferred: true function click_enter() { bsApp.copySeedToClipboard(bsApp.generatedAddress) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 6e74cb20d..97592e19d 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -447,9 +447,7 @@ ColumnLayout { width: 504 - Component.onCompleted: { - include_output_but.preferred = false - } + preferred: false function click_enter() { if (!include_output_but.enabled) return @@ -524,10 +522,7 @@ ColumnLayout { text: qsTr("Continue") - Component.onCompleted: { - continue_but.preferred = true - } - + preferred: true function click_enter() { if (!fee_suggest_combo.edit_value()) diff --git a/GUI/QtQuick/qml/Send/PasswordWithTimer.qml b/GUI/QtQuick/qml/Send/PasswordWithTimer.qml index b6249bb0d..e3770c561 100644 --- a/GUI/QtQuick/qml/Send/PasswordWithTimer.qml +++ b/GUI/QtQuick/qml/Send/PasswordWithTimer.qml @@ -38,10 +38,8 @@ Item { visible: txSignRequest !== null ? !txSignRequest.isHWW : false title_text: qsTr("Password") - Component.onCompleted: { - password.isPassword = true - password.isHiddenText = true - } + isPassword: true + isHiddenText: true } CustomProgressBar { diff --git a/GUI/QtQuick/qml/Send/SignTransaction.qml b/GUI/QtQuick/qml/Send/SignTransaction.qml index 9918dbd86..6e645745c 100644 --- a/GUI/QtQuick/qml/Send/SignTransaction.qml +++ b/GUI/QtQuick/qml/Send/SignTransaction.qml @@ -342,9 +342,8 @@ ColumnLayout { (!txSignRequest.hasError && ((txSignRequest.isHWW && txSignRequest.isHWWready) || password.value.length)) : false - Component.onCompleted: { - broadcast_but.preferred = true - } + preferred: true + function click_enter() { bsApp.signAndBroadcast(txSignRequest, password.value) password.value = "" diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml index 62f93d0f2..35b06c76b 100644 --- a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -387,9 +387,8 @@ ColumnLayout { (!txSignRequest.hasError && ((txSignRequest.isHWW && txSignRequest.isHWWready) || password.value.length)) : false - Component.onCompleted: { - broadcast_but.preferred = true - } + preferred: true + function click_enter() { bsApp.signAndBroadcast(txSignRequest, password.value) password.value = "" diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index b85b3da65..b67f3f1b9 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -182,9 +182,7 @@ ColumnLayout { text: qsTr("Continue") - Component.onCompleted: { - continue_but.preferred = true - } + preferred: true function click_enter() { if (!fee_suggest_combo.edit_value()) diff --git a/GUI/QtQuick/qml/Settings/qmldir b/GUI/QtQuick/qml/Settings/qmldir index 659ef1b71..9b9d82b2d 100644 --- a/GUI/QtQuick/qml/Settings/qmldir +++ b/GUI/QtQuick/qml/Settings/qmldir @@ -2,3 +2,7 @@ module Settings SettingsPopup 1.0 SettingsPopup.qml SettingsMenu 1.0 SettingsMenu.qml +AddArmoryServer 1.0 AddArmoryServer.qml +DeleteArmoryServer 1.0 DeleteArmoryServer.qml +SettingsGeneral 1.0 SettingsGeneral.qml +SettingsNetwork 1.0 SettingsNetwork.qml diff --git a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml index ccd84023b..546f34192 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml @@ -85,9 +85,7 @@ Window { width: 250 height: 40 - Component.onCompleted: { - ok_but.preferred = true - } + preferred: true function click_enter() { root.close() diff --git a/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml index 2ba13699f..90b246eab 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml @@ -67,9 +67,8 @@ ColumnLayout { text: qsTr("Finish") - Component.onCompleted: { - finish_but.preferred = true - } + preferred: true + function click_enter() { sig_finish() } diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml index 7d44b6259..9014362e2 100644 --- a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -37,10 +37,8 @@ ColumnLayout { title_text: qsTr("Password") - Component.onCompleted: { - password.isPassword = true - password.isHiddenText = true - } + isPassword: true + isHiddenText: true } CustomTextInput { @@ -57,10 +55,8 @@ ColumnLayout { title_text: qsTr("New Password") - Component.onCompleted: { - new_password.isPassword = true - new_password.isHiddenText = true - } + isPassword: true + isHiddenText: true } @@ -78,10 +74,8 @@ ColumnLayout { title_text: qsTr("Confirm Password") - Component.onCompleted: { - confirm_password.isPassword = true - confirm_password.isHiddenText = true - } + isPassword: true + isHiddenText: true } Label { diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml index 7ca80d064..5773bdd26 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml @@ -42,10 +42,8 @@ ColumnLayout { title_text: qsTr("Password") - Component.onCompleted: { - password.isPassword = true - password.isHiddenText = true - } + isPassword: true + isHiddenText: true } Label { diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml index 6d5828f7c..a6cf5491f 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml @@ -39,10 +39,8 @@ ColumnLayout { title_text: qsTr("Password") - Component.onCompleted: { - password.isPassword = true - password.isHiddenText = true - } + isPassword: true + isHiddenText: true } Label { From fde9fa5990ffcf04d2cc08b0c31b4e09808e2a21 Mon Sep 17 00:00:00 2001 From: YZ Date: Sun, 12 Mar 2023 16:02:43 +0100 Subject: [PATCH 222/436] Sync states --- GUI/QtQuick/AddressFilterModel.cpp | 28 ++++++++- GUI/QtQuick/AddressFilterModel.h | 4 +- GUI/QtQuick/QtQuickAdapter.cpp | 19 ++++++- GUI/QtQuick/QtQuickAdapter.h | 7 +++ GUI/QtQuick/SettingsController.cpp | 57 +++++++++++++++++++ GUI/QtQuick/SettingsController.h | 40 +++++++++++++ GUI/QtQuick/TransactionFilterModel.cpp | 21 ++++++- GUI/QtQuick/TransactionFilterModel.h | 4 +- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 5 -- .../qml/StyledControls/CustomTableView.qml | 1 + GUI/QtQuick/qml/TransactionDetails.qml | 4 +- GUI/QtQuick/qml/TransactionsPage.qml | 39 ++++++++++--- 12 files changed, 203 insertions(+), 26 deletions(-) create mode 100644 GUI/QtQuick/SettingsController.cpp create mode 100644 GUI/QtQuick/SettingsController.h diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp index bf5a55a03..9ff2b4120 100644 --- a/GUI/QtQuick/AddressFilterModel.cpp +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -12,10 +12,30 @@ #include "AddressListModel.h" #include -AddressFilterModel::AddressFilterModel(QObject* parent) - : QSortFilterProxyModel(parent) +AddressFilterModel::AddressFilterModel(std::shared_ptr settings) + : QSortFilterProxyModel() + , settings_(settings) { connect(this, &AddressFilterModel::changed, this, &AddressFilterModel::invalidate); + + if (settings_ != nullptr) + { + connect(settings_.get(), &SettingsController::reseted, this, [this]() + { + if (settings_->hasParam(ApplicationSettings::Setting::AddressFilterHideUsed)) { + setHideUsed(settings_->getParam(ApplicationSettings::Setting::AddressFilterHideUsed).toBool()); + } + if (settings_->hasParam(ApplicationSettings::Setting::AddressFilterHideInternal)) { + setHideInternal(settings_->getParam(ApplicationSettings::Setting::AddressFilterHideInternal).toBool()); + } + if (settings_->hasParam(ApplicationSettings::Setting::AddressFilterHideExternal)) { + setHideExternal(settings_->getParam(ApplicationSettings::Setting::AddressFilterHideExternal).toBool()); + } + if (settings_->hasParam(ApplicationSettings::Setting::AddressFilterHideEmpty)) { + setHideEmpty(settings_->getParam(ApplicationSettings::Setting::AddressFilterHideEmpty).toBool()); + } + }); + } } bool AddressFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const @@ -80,6 +100,7 @@ void AddressFilterModel::setHideUsed(bool hideUsed) noexcept { if (hideUsed != hideUsed_) { hideUsed_ = hideUsed; + settings_->setParam(ApplicationSettings::Setting::AddressFilterHideUsed, hideUsed_); emit changed(); } } @@ -88,6 +109,7 @@ void AddressFilterModel::setHideInternal(bool hideInternal) noexcept { if (hideInternal_ != hideInternal) { hideInternal_ = hideInternal; + settings_->setParam(ApplicationSettings::Setting::AddressFilterHideInternal, hideInternal_); emit changed(); } } @@ -96,6 +118,7 @@ void AddressFilterModel::setHideExternal(bool hideExternal) noexcept { if (hideExternal_ != hideExternal) { hideExternal_ = hideExternal; + settings_->setParam(ApplicationSettings::Setting::AddressFilterHideExternal, hideExternal_); emit changed(); } } @@ -104,6 +127,7 @@ void AddressFilterModel::setHideEmpty(bool hideEmpty) noexcept { if (hideEmpty_ != hideEmpty) { hideEmpty_ = hideEmpty; + settings_->setParam(ApplicationSettings::Setting::AddressFilterHideEmpty, hideEmpty_); emit changed(); } } diff --git a/GUI/QtQuick/AddressFilterModel.h b/GUI/QtQuick/AddressFilterModel.h index 3803c27e9..b9511b1c9 100644 --- a/GUI/QtQuick/AddressFilterModel.h +++ b/GUI/QtQuick/AddressFilterModel.h @@ -11,6 +11,7 @@ #pragma once #include +#include "SettingsController.h" class AddressFilterModel: public QSortFilterProxyModel { @@ -21,7 +22,7 @@ class AddressFilterModel: public QSortFilterProxyModel Q_PROPERTY(bool hideEmpty READ hideEmpty WRITE setHideEmpty NOTIFY changed) public: - AddressFilterModel(QObject* parent = nullptr); + AddressFilterModel(std::shared_ptr settings); bool hideUsed() const; bool hideInternal() const; @@ -44,4 +45,5 @@ class AddressFilterModel: public QSortFilterProxyModel bool hideInternal_ { false }; bool hideExternal_ { false }; bool hideEmpty_ { false }; + std::shared_ptr settings_; }; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 3d1200f76..b6fe43110 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -149,6 +149,9 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) , userSigner_(std::make_shared(TerminalUsers::Signer)) , userHWW_(bs::message::UserTerminal::create(bs::message::TerminalUsers::HWWallets)) , txTypes_({ tr("All transactions"), tr("Received"), tr("Sent"), tr("Internal") }) + , settingsController_(std::make_shared()) + , addressFilterModel_(std::make_unique(settingsController_)) + , transactionFilterModel_(std::make_unique(settingsController_)) { staticLogger = logger; addrModel_ = new QmlAddressListModel(logger, this); @@ -162,6 +165,14 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) walletBalances_ = new WalletBalancesModel(logger, this); feeSuggModel_ = new FeeSuggestionModel(logger, this); walletPropertiesModel_ = std::make_unique(logger); + + addressFilterModel_->setSourceModel(addrModel_); + transactionFilterModel_->setSourceModel(txModel_); + + connect(settingsController_.get(), &SettingsController::changed, this, [this](ApplicationSettings::Setting key) + { + setSetting(key, settingsController_->getParam(key)); + }); } QtQuickAdapter::~QtQuickAdapter() @@ -241,7 +252,6 @@ void QtQuickAdapter::run(int &argc, char **argv) qmlRegisterInterface("ArmoryServersModel"); qmlRegisterUncreatableMetaObject(WalletBalance::staticMetaObject, "wallet.balance" , 1, 0, "WalletBalance", tr("Error: only enums")); - qmlRegisterType("terminal.models", 1, 0, "TransactionFilterModel"); qmlRegisterType("terminal.models", 1, 0, "TransactionForAddressFilterModel"); qmlRegisterType("terminal.models", 1, 0, "PendingTransactionFilterModel"); qmlRegisterUncreatableMetaObject(qtquick_gui::WalletPropertiesVM::staticMetaObject, "terminal.models" @@ -255,7 +265,6 @@ void QtQuickAdapter::run(int &argc, char **argv) , 1, 0, "QmlAddressListModel", tr("Error: only enums")); qmlRegisterUncreatableMetaObject(ArmoryServersModel::staticMetaObject, "terminal.models" , 1, 0, "ArmoryServersModel", tr("Error: only enums")); - qmlRegisterType("terminal.models", 1, 0, "AddressFilterModel"); //need to read files in qml qputenv("QML_XHR_ALLOW_FILE_READ", QByteArray("1")); @@ -275,6 +284,8 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("hwDeviceModel"), hwDeviceModel_); rootCtxt_->setContextProperty(QLatin1Literal("walletBalances"), walletBalances_); rootCtxt_->setContextProperty(QLatin1Literal("feeSuggestions"), feeSuggModel_); + rootCtxt_->setContextProperty(QLatin1Literal("addressFilterModel"), addressFilterModel_.get()); + rootCtxt_->setContextProperty(QLatin1Literal("transactionFilterModel"), transactionFilterModel_.get()); engine.addImageProvider(QLatin1Literal("QR"), new QRImageProvider); connect(&engine, &QQmlApplicationEngine::objectCreated, @@ -308,7 +319,7 @@ void QtQuickAdapter::run(int &argc, char **argv) app.exec(); } -QStringList QtQuickAdapter::txWalletsList() const +QStringList QtQuickAdapter::txWalletsList() const\ { QStringList result = { tr("All wallets") }; result.append(walletBalances_->wallets()); @@ -332,6 +343,7 @@ ProcessingResult QtQuickAdapter::process(const Envelope &env) default: break; } } + return ProcessingResult::Ignored; } @@ -421,6 +433,7 @@ ProcessingResult QtQuickAdapter::processSettingsGetResponse(const SettingsMessag } emit settingChanged(); } + QMetaObject::invokeMethod(this, [this] { settingsController_->resetCache(settingsCache_); }); return ProcessingResult::Success; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 98b10df46..b7200bf15 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -28,6 +28,7 @@ #include "UiUtils.h" #include "Wallets/SignContainer.h" #include "viewmodels/WalletPropertiesVM.h" +#include "SettingsController.h" #include "common.pb.h" @@ -76,6 +77,9 @@ class QTXSignRequest; class TxInputsModel; class TxOutputsModel; class WalletBalancesModel; +class AddressFilterModel; +class TransactionFilterModel; +class PendingTransactionFilterModel; class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoopRuner { @@ -305,6 +309,9 @@ private slots: std::map armoryServersReq_; int nWalletsLoaded_ {-1}; + std::shared_ptr settingsController_; + std::unique_ptr addressFilterModel_; + std::unique_ptr transactionFilterModel_; }; #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/SettingsController.cpp b/GUI/QtQuick/SettingsController.cpp new file mode 100644 index 000000000..cff05ba14 --- /dev/null +++ b/GUI/QtQuick/SettingsController.cpp @@ -0,0 +1,57 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "SettingsController.h" + +SettingsController::SettingsController() + : QObject() +{ +} + +SettingsController::SettingsController(const SettingsController& settingsController) + : settingsCache_(settingsController.settingsCache_) +{ +} + +SettingsController& SettingsController::operator=(const SettingsController& other) +{ + settingsCache_ = other.settingsCache_; + return *this; +} + +void SettingsController::resetCache(const SettingsController::SettingsCache& cache) +{ + settingsCache_ = cache; + emit reseted(); +} + +const SettingsController::SettingsCache& SettingsController::getCache() const +{ + return settingsCache_; +} + +void SettingsController::setParam(ApplicationSettings::Setting key, const QVariant& value) +{ + settingsCache_[key] = value; + emit changed(key); +} + +const QVariant& SettingsController::getParam(ApplicationSettings::Setting key) const +{ + if (settingsCache_.count(key) > 0) { + return settingsCache_.at(key); + } + return QVariant(); +} + +bool SettingsController::hasParam(ApplicationSettings::Setting key) const +{ + return settingsCache_.count(key) > 0; +} \ No newline at end of file diff --git a/GUI/QtQuick/SettingsController.h b/GUI/QtQuick/SettingsController.h new file mode 100644 index 000000000..b0a5d9802 --- /dev/null +++ b/GUI/QtQuick/SettingsController.h @@ -0,0 +1,40 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#pragma once + +#include +#include +#include "ApplicationSettings.h" + +class SettingsController: public QObject +{ + Q_OBJECT + using SettingsCache = std::map; + +public: + SettingsController(); + SettingsController(const SettingsController& settingsController); + SettingsController& operator=(const SettingsController& settingsController); + + bool hasParam(ApplicationSettings::Setting key) const; + const QVariant& getParam(ApplicationSettings::Setting key) const; + void setParam(ApplicationSettings::Setting key, const QVariant& value); + + const SettingsCache& getCache() const; + void resetCache(const SettingsCache& cache); + +signals: + void changed(ApplicationSettings::Setting); + void reseted(); + +private: + SettingsCache settingsCache_; +}; diff --git a/GUI/QtQuick/TransactionFilterModel.cpp b/GUI/QtQuick/TransactionFilterModel.cpp index 0e3709ffb..c07e175fb 100644 --- a/GUI/QtQuick/TransactionFilterModel.cpp +++ b/GUI/QtQuick/TransactionFilterModel.cpp @@ -10,14 +10,27 @@ */ #include "TransactionFilterModel.h" #include "TxListModel.h" -#include -TransactionFilterModel::TransactionFilterModel(QObject* parent) - : QSortFilterProxyModel(parent) +TransactionFilterModel::TransactionFilterModel(std::shared_ptr settings) + : QSortFilterProxyModel() + , settings_(settings) { setDynamicSortFilter(true); sort(0, Qt::AscendingOrder); connect(this, &TransactionFilterModel::changed, this, &TransactionFilterModel::invalidate); + + if (settings_ != nullptr) + { + connect(settings_.get(), &SettingsController::reseted, this, [this]() + { + if (settings_->hasParam(ApplicationSettings::Setting::TransactionFilterWalletName)) { + setWalletName(settings_->getParam(ApplicationSettings::Setting::TransactionFilterWalletName).toString()); + } + if (settings_->hasParam(ApplicationSettings::Setting::TransactionFilterTransactionType)) { + setTransactionType(settings_->getParam(ApplicationSettings::Setting::TransactionFilterTransactionType).toString()); + } + }); + } } bool TransactionFilterModel::filterAcceptsRow(int source_row, @@ -53,6 +66,7 @@ const QString& TransactionFilterModel::walletName() const void TransactionFilterModel::setWalletName(const QString& name) { walletName_ = name; + settings_->setParam(ApplicationSettings::Setting::TransactionFilterWalletName, walletName_); emit changed(); } @@ -64,6 +78,7 @@ const QString& TransactionFilterModel::transactionType() const void TransactionFilterModel::setTransactionType(const QString& type) { transactionType_ = type; + settings_->setParam(ApplicationSettings::Setting::TransactionFilterTransactionType, transactionType_); emit changed(); } diff --git a/GUI/QtQuick/TransactionFilterModel.h b/GUI/QtQuick/TransactionFilterModel.h index c2b9eae67..000f0c123 100644 --- a/GUI/QtQuick/TransactionFilterModel.h +++ b/GUI/QtQuick/TransactionFilterModel.h @@ -12,6 +12,7 @@ #define TRANSACTION_FILTER_MODEL_H #include +#include "SettingsController.h" class TransactionFilterModel: public QSortFilterProxyModel { @@ -20,7 +21,7 @@ class TransactionFilterModel: public QSortFilterProxyModel Q_PROPERTY(QString transactionType READ transactionType WRITE setTransactionType NOTIFY changed) public: - TransactionFilterModel(QObject* parent = nullptr); + TransactionFilterModel(std::shared_ptr settings); const QString& walletName() const; void setWalletName(const QString&); @@ -38,6 +39,7 @@ class TransactionFilterModel: public QSortFilterProxyModel private: QString walletName_; QString transactionType_; + std::shared_ptr settings_; }; #endif // TRANSACTION_FILTER_MODEL_H diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 74c9511e9..1000ac128 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -31,11 +31,6 @@ Rectangle { signal walletIndexChanged(index : int) signal openAddressDetails(var address, var transactions, var balance, var comment, var asset_type, var type, var wallet) - AddressFilterModel { - id: addressFilterModel - sourceModel: addressListModel - } - Column { anchors.leftMargin: 18 anchors.rightMargin: 18 diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index dacbad12e..22a30dc02 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -41,6 +41,7 @@ Column { function update() { component.forceLayout() + verticalScrollBar.position = 0 } CustomHorizontalHeaderView { diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index 6d1877d40..1cdf6d698 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -138,7 +138,7 @@ Popup { width: 170 } Text { - text: transaction_details.txType + text: transaction_details.txType !== "" ? transaction_details.txType : "..." color: transaction_details.txTypeColor font.family: "Roboto" font.pixelSize: 14 @@ -208,7 +208,7 @@ Popup { width: 170 } Label { - text: transaction_details.walletName + text: transaction_details.walletName !== "" ? transaction_details.walletName : "..." color: BSStyle.textColor font.family: "Roboto" font.pixelSize: 14 diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 4e7d7f1fc..bed2cc7c6 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -27,11 +27,6 @@ Item { signal openSend (string txId, bool isRBF, bool isCPFP) - TransactionFilterModel { - id: transactionModel - sourceModel: txListModel - } - TransactionDetails { id: transactionDetails visible: false @@ -91,9 +86,22 @@ Item { anchors.verticalCenter: parent.verticalCenter onActivated: (index) => { - transactionModel.walletName = index == 0 ? "" : txWalletsComboBox.currentValue + transactionFilterModel.walletName = index == 0 ? "" : txWalletsComboBox.currentValue tableView.update() } + + Connections { + target: transactionFilterModel + onChanged: { + if (transactionFilterModel.walletName != currentValue) { + for (var i = 0; i < bsApp.txWalletsList.length; ++i) { + if (bsApp.txWalletsList[i] == transactionFilterModel.walletName) { + txWalletsComboBox.currentIndex = i + } + } + } + } + } } CustomSmallComboBox { @@ -107,9 +115,22 @@ Item { anchors.verticalCenter: parent.verticalCenter onActivated: (index) => { - transactionModel.transactionType = index == 0 ? "" : txTypesComboBox.currentValue + transactionFilterModel.transactionType = index == 0 ? "" : txTypesComboBox.currentValue tableView.update() } + + Connections { + target: transactionFilterModel + onChanged: { + if (transactionFilterModel.transactionType != currentValue) { + for (var i = 0; i < bsApp.txTypesList.length; ++i) { + if (bsApp.txTypesList[i] == transactionFilterModel.transactionType) { + txTypesComboBox.currentIndex = i + } + } + } + } + } } @@ -160,7 +181,7 @@ Item { id: tableView width: parent.width height: parent.height - transaction_header_menu.height - transaction_header_menu.spacing - 1 - model: transactionModel + model: transactionFilterModel copy_button_column_index: 3 columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] @@ -190,7 +211,7 @@ Item { CustomRbfCpfpMenu { id: context_menu - model: transactionModel + model: transactionFilterModel onOpenSend: (txId, isRBF, isCPFP) => transactions.openSend(txId, isRBF, isCPFP) } From 2a3cb275a057e3f67e826b6578f5126946382b76 Mon Sep 17 00:00:00 2001 From: YZ Date: Sun, 12 Mar 2023 16:30:31 +0100 Subject: [PATCH 223/436] Optimizing initialization --- GUI/QtQuick/AddressFilterModel.cpp | 9 +++++---- GUI/QtQuick/TransactionFilterModel.cpp | 21 +++++++++++++-------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp index 9ff2b4120..365d37275 100644 --- a/GUI/QtQuick/AddressFilterModel.cpp +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -23,17 +23,18 @@ AddressFilterModel::AddressFilterModel(std::shared_ptr setti connect(settings_.get(), &SettingsController::reseted, this, [this]() { if (settings_->hasParam(ApplicationSettings::Setting::AddressFilterHideUsed)) { - setHideUsed(settings_->getParam(ApplicationSettings::Setting::AddressFilterHideUsed).toBool()); + hideUsed_ = settings_->getParam(ApplicationSettings::Setting::AddressFilterHideUsed).toBool(); } if (settings_->hasParam(ApplicationSettings::Setting::AddressFilterHideInternal)) { - setHideInternal(settings_->getParam(ApplicationSettings::Setting::AddressFilterHideInternal).toBool()); + hideInternal_ = settings_->getParam(ApplicationSettings::Setting::AddressFilterHideInternal).toBool(); } if (settings_->hasParam(ApplicationSettings::Setting::AddressFilterHideExternal)) { - setHideExternal(settings_->getParam(ApplicationSettings::Setting::AddressFilterHideExternal).toBool()); + hideExternal_ = settings_->getParam(ApplicationSettings::Setting::AddressFilterHideExternal).toBool(); } if (settings_->hasParam(ApplicationSettings::Setting::AddressFilterHideEmpty)) { - setHideEmpty(settings_->getParam(ApplicationSettings::Setting::AddressFilterHideEmpty).toBool()); + hideEmpty_ = settings_->getParam(ApplicationSettings::Setting::AddressFilterHideEmpty).toBool(); } + emit changed(); }); } } diff --git a/GUI/QtQuick/TransactionFilterModel.cpp b/GUI/QtQuick/TransactionFilterModel.cpp index c07e175fb..4d788df6b 100644 --- a/GUI/QtQuick/TransactionFilterModel.cpp +++ b/GUI/QtQuick/TransactionFilterModel.cpp @@ -24,11 +24,12 @@ TransactionFilterModel::TransactionFilterModel(std::shared_ptrhasParam(ApplicationSettings::Setting::TransactionFilterWalletName)) { - setWalletName(settings_->getParam(ApplicationSettings::Setting::TransactionFilterWalletName).toString()); + walletName_ = settings_->getParam(ApplicationSettings::Setting::TransactionFilterWalletName).toString(); } if (settings_->hasParam(ApplicationSettings::Setting::TransactionFilterTransactionType)) { - setTransactionType(settings_->getParam(ApplicationSettings::Setting::TransactionFilterTransactionType).toString()); + transactionType_ = settings_->getParam(ApplicationSettings::Setting::TransactionFilterTransactionType).toString(); } + emit changed(); }); } } @@ -65,9 +66,11 @@ const QString& TransactionFilterModel::walletName() const void TransactionFilterModel::setWalletName(const QString& name) { - walletName_ = name; - settings_->setParam(ApplicationSettings::Setting::TransactionFilterWalletName, walletName_); - emit changed(); + if (walletName_ != name) { + walletName_ = name; + settings_->setParam(ApplicationSettings::Setting::TransactionFilterWalletName, walletName_); + emit changed(); + } } const QString& TransactionFilterModel::transactionType() const @@ -77,9 +80,11 @@ const QString& TransactionFilterModel::transactionType() const void TransactionFilterModel::setTransactionType(const QString& type) { - transactionType_ = type; - settings_->setParam(ApplicationSettings::Setting::TransactionFilterTransactionType, transactionType_); - emit changed(); + if (transactionType_ != type) { + transactionType_ = type; + settings_->setParam(ApplicationSettings::Setting::TransactionFilterTransactionType, transactionType_); + emit changed(); + } } bool TransactionFilterModel::lessThan(const QModelIndex& left, const QModelIndex& right) const From dd4f3c05569edfe660dc4604cd44d95be65e3857 Mon Sep 17 00:00:00 2001 From: YZ Date: Sun, 12 Mar 2023 17:19:24 +0100 Subject: [PATCH 224/436] Transaction details --- GUI/QtQuick/QtQuickAdapter.cpp | 2 +- GUI/QtQuick/SettingsController.cpp | 2 +- GUI/QtQuick/qml/TransactionDetails.qml | 50 +++++++------------------- 3 files changed, 15 insertions(+), 39 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index b6fe43110..cdb669f90 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -319,7 +319,7 @@ void QtQuickAdapter::run(int &argc, char **argv) app.exec(); } -QStringList QtQuickAdapter::txWalletsList() const\ +QStringList QtQuickAdapter::txWalletsList() const { QStringList result = { tr("All wallets") }; result.append(walletBalances_->wallets()); diff --git a/GUI/QtQuick/SettingsController.cpp b/GUI/QtQuick/SettingsController.cpp index cff05ba14..0e16b5282 100644 --- a/GUI/QtQuick/SettingsController.cpp +++ b/GUI/QtQuick/SettingsController.cpp @@ -54,4 +54,4 @@ const QVariant& SettingsController::getParam(ApplicationSettings::Setting key) c bool SettingsController::hasParam(ApplicationSettings::Setting key) const { return settingsCache_.count(key) > 0; -} \ No newline at end of file +} diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index 1cdf6d698..6ce21891d 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -54,7 +54,7 @@ Popup { anchors.leftMargin: 12 anchors.rightMargin: 12 anchors.bottomMargin: 12 - spacing: 20 + spacing: 14 Label { text: qsTr("Transaction details") @@ -250,28 +250,16 @@ Popup { } } - Row { - spacing: 8 - - Label { - text: qsTr("Input addresses") - color: BSStyle.textColor - font.pixelSize: 19 - font.weight: Font.Medium - } - - Image { - width: 9 - height: 12 - source: "qrc:/images/up_arrow.svg" - anchors.leftMargin: 20 - anchors.verticalCenter: parent.verticalCenter - } + Label { + text: qsTr("Input addresses") + color: BSStyle.textColor + font.pixelSize: 19 + font.weight: Font.Medium } Rectangle { width: parent.width - height: 100 + height: 110 color: "transparent" radius: 14 border.color: BSStyle.popupBorderColor @@ -289,28 +277,16 @@ Popup { } } - Row { - spacing: 8 - - Label { - text: qsTr("Output addresses") - color: BSStyle.textColor - font.pixelSize: 19 - font.weight: Font.Medium - } - - Image { - width: 9 - height: 12 - source: "qrc:/images/down_arrow.svg" - anchors.leftMargin: 20 - anchors.verticalCenter: parent.verticalCenter - } + Label { + text: qsTr("Output addresses") + color: BSStyle.textColor + font.pixelSize: 19 + font.weight: Font.Medium } Rectangle { width: parent.width - height: 100 + height: 110 color: "transparent" radius: 14 border.color: BSStyle.popupBorderColor From 3cc11a3a4db22ce8f3b05d4ad67dc59b102ed596 Mon Sep 17 00:00:00 2001 From: YZ Date: Sun, 12 Mar 2023 20:19:56 +0100 Subject: [PATCH 225/436] Transaction list fix --- GUI/QtQuick/qml/TransactionsPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index bed2cc7c6..a998f19ce 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -74,6 +74,7 @@ Item { { spacing: 8 height: parent.height + anchors.right: parent.right CustomSmallComboBox { id: txWalletsComboBox From 27306aeab0601b787ecabf24539e4c91a8575e10 Mon Sep 17 00:00:00 2001 From: YZ Date: Mon, 13 Mar 2023 14:44:15 +0100 Subject: [PATCH 226/436] Fixed state initial loaging --- GUI/QtQuick/AddressFilterModel.cpp | 2 +- GUI/QtQuick/QtQuickAdapter.cpp | 46 +++++++++++++++++-- GUI/QtQuick/QtQuickAdapter.h | 2 + GUI/QtQuick/SettingsController.cpp | 2 +- GUI/QtQuick/SettingsController.h | 2 +- GUI/QtQuick/TransactionFilterModel.cpp | 2 +- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 1 - .../qml/Overview/OverviewWalletBar.qml | 12 +++-- GUI/QtQuick/qml/TransactionsPage.qml | 4 +- 9 files changed, 58 insertions(+), 15 deletions(-) diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp index 365d37275..29a31e3e6 100644 --- a/GUI/QtQuick/AddressFilterModel.cpp +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -20,7 +20,7 @@ AddressFilterModel::AddressFilterModel(std::shared_ptr setti if (settings_ != nullptr) { - connect(settings_.get(), &SettingsController::reseted, this, [this]() + connect(settings_.get(), &SettingsController::reset, this, [this]() { if (settings_->hasParam(ApplicationSettings::Setting::AddressFilterHideUsed)) { hideUsed_ = settings_->getParam(ApplicationSettings::Setting::AddressFilterHideUsed).toBool(); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index cdb669f90..405552971 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -865,6 +865,45 @@ void QtQuickAdapter::requestInitialSettings() setReq->set_index(SetIdx_ExportDir); setReq->set_type(SettingType_String); + setReq = msgReq->add_requests(); + setReq->set_source(SettingSource_Local); + setReq->set_index(SetIdx_AddressFilterHideUsed); + setReq->set_type(SettingType_Bool); + + setReq = msgReq->add_requests(); + setReq->set_source(SettingSource_Local); + setReq->set_index(SetIdx_AddressFilterHideInternal); + setReq->set_type(SettingType_Bool); + + setReq = msgReq->add_requests(); + setReq->set_source(SettingSource_Local); + setReq->set_index(SetIdx_AddressFilterHideExternal); + setReq->set_type(SettingType_Bool); + + setReq = msgReq->add_requests(); + setReq->set_source(SettingSource_Local); + setReq->set_index(SetIdx_AddressFilterHideEmpty); + setReq->set_type(SettingType_Bool); + + pushRequest(user_, userSettings_, msg.SerializeAsString()); +} + +void QtQuickAdapter::requestPostLoadingSettings() +{ + SettingsMessage msg; + auto msgReq = msg.mutable_get_request(); + auto setReq = msgReq->add_requests(); + + setReq = msgReq->add_requests(); + setReq->set_source(SettingSource_Local); + setReq->set_index(SetIdx_TransactionFilterWalletName); + setReq->set_type(SettingType_String); + + setReq = msgReq->add_requests(); + setReq->set_source(SettingSource_Local); + setReq->set_index(SetIdx_TransactionFilterTransactionType); + setReq->set_type(SettingType_String); + pushRequest(user_, userSettings_, msg.SerializeAsString()); } @@ -947,11 +986,8 @@ void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) hwDeviceModel_->setLoaded(walletId); walletBalances_->addWallet({ walletId, walletName }); if (isInitialLoad) { - auto comboWalletsList = rootObj_->findChild(QLatin1Literal("walletsComboBox")); - if (comboWalletsList) { - comboWalletsList->setProperty("currentIndex", 0); - } - walletSelected(0); + requestWalletSelection(0); + requestPostLoadingSettings(); } emit walletsListChanged(); }); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index b7200bf15..5bfb39f49 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -197,6 +197,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void showError(const QString&); void showNotification(QString, QString); void successExport(QString nameExport); + void requestWalletSelection(quint32 index); private slots: void onArmoryServerChanged(const QModelIndex&, const QVariant&); @@ -214,6 +215,7 @@ private slots: bs::message::ProcessingResult processHWW(const bs::message::Envelope&); void requestInitialSettings(); + void requestPostLoadingSettings(); void updateSplashProgress(); void splashProgressCompleted(); void updateStates(); diff --git a/GUI/QtQuick/SettingsController.cpp b/GUI/QtQuick/SettingsController.cpp index 0e16b5282..3941fab6c 100644 --- a/GUI/QtQuick/SettingsController.cpp +++ b/GUI/QtQuick/SettingsController.cpp @@ -29,7 +29,7 @@ SettingsController& SettingsController::operator=(const SettingsController& othe void SettingsController::resetCache(const SettingsController::SettingsCache& cache) { settingsCache_ = cache; - emit reseted(); + emit reset(); } const SettingsController::SettingsCache& SettingsController::getCache() const diff --git a/GUI/QtQuick/SettingsController.h b/GUI/QtQuick/SettingsController.h index b0a5d9802..6a9e3d9b7 100644 --- a/GUI/QtQuick/SettingsController.h +++ b/GUI/QtQuick/SettingsController.h @@ -33,7 +33,7 @@ class SettingsController: public QObject signals: void changed(ApplicationSettings::Setting); - void reseted(); + void reset(); private: SettingsCache settingsCache_; diff --git a/GUI/QtQuick/TransactionFilterModel.cpp b/GUI/QtQuick/TransactionFilterModel.cpp index 4d788df6b..99ccc817f 100644 --- a/GUI/QtQuick/TransactionFilterModel.cpp +++ b/GUI/QtQuick/TransactionFilterModel.cpp @@ -21,7 +21,7 @@ TransactionFilterModel::TransactionFilterModel(std::shared_ptrhasParam(ApplicationSettings::Setting::TransactionFilterWalletName)) { walletName_ = settings_->getParam(ApplicationSettings::Setting::TransactionFilterWalletName).toString(); diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 1000ac128..9a3c3a4af 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -162,7 +162,6 @@ Rectangle { font.pixelSize: 19 font.family: "Roboto" font.weight: Font.DemiBold - } CustomTableView { diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index b34b26091..b050aa881 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -43,9 +43,15 @@ Rectangle { textRole: "name" valueRole: "name" - onActivated: (ind) => { - bsApp.walletSelected(ind) - control.walletIndexChanged(ind) + onCurrentIndexChanged: { + bsApp.walletSelected(currentIndex) + } + + Connections { + target: bsApp + onRequestWalletSelection: (index) => { + currentIndex = index + } } } diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index a998f19ce..2f7dc04da 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -94,7 +94,7 @@ Item { Connections { target: transactionFilterModel onChanged: { - if (transactionFilterModel.walletName != currentValue) { + if (transactionFilterModel.walletName != txWalletsComboBox.currentValue) { for (var i = 0; i < bsApp.txWalletsList.length; ++i) { if (bsApp.txWalletsList[i] == transactionFilterModel.walletName) { txWalletsComboBox.currentIndex = i @@ -123,7 +123,7 @@ Item { Connections { target: transactionFilterModel onChanged: { - if (transactionFilterModel.transactionType != currentValue) { + if (transactionFilterModel.transactionType != txTypesComboBox.currentValue) { for (var i = 0; i < bsApp.txTypesList.length; ++i) { if (bsApp.txTypesList[i] == transactionFilterModel.transactionType) { txTypesComboBox.currentIndex = i From b903ac9bfa07b237bfcfad29e40307243aaf9a22 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Mon, 13 Mar 2023 23:45:12 +0200 Subject: [PATCH 227/436] qml: add modify settings/network, add real license, fix right click, fix clicking to child items --- GUI/QtQuick/ArmoryServersModel.cpp | 59 +- GUI/QtQuick/ArmoryServersModel.h | 8 +- GUI/QtQuick/TermsAndConditions.txt | 663 +++++++++++++++++- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 30 +- GUI/QtQuick/qml/Send/WalletsComboBox.qml | 18 +- GUI/QtQuick/qml/Settings/AddArmoryServer.qml | 2 +- .../qml/Settings/ModifyArmoryServer.qml | 202 ++++++ GUI/QtQuick/qml/Settings/SettingsNetwork.qml | 15 +- GUI/QtQuick/qml/Settings/SettingsPopup.qml | 15 +- GUI/QtQuick/qml/Settings/qmldir | 1 + .../qml/StyledControls/CustomListItem.qml | 4 +- .../StyledControls/CustomListRadioButton.qml | 5 - .../qml/StyledControls/CustomTextInput.qml | 3 +- GUI/QtQuick/qml/TransactionsPage.qml | 20 +- GUI/QtQuick/qml/main.qml | 1 + GUI/QtQuick/qtquick.qrc | 1 + 16 files changed, 972 insertions(+), 75 deletions(-) create mode 100644 GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index 751cd09a6..4764940ad 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -15,6 +15,7 @@ namespace { static const QHash kRoleNames{ + {Qt::DisplayRole, "display"}, {ArmoryServersModel::TableDataRole, "tableData"}, {ArmoryServersModel::NameRole, "name"}, {ArmoryServersModel::NetTypeRole, "netType"}, @@ -27,8 +28,7 @@ namespace { } ArmoryServersModel::ArmoryServersModel(const std::shared_ptr & logger, QObject* parent) - : QAbstractTableModel(parent) - , header_{ tr("Name"), tr("Network"), tr("Address"), tr("Port"), tr("Key") } + : QAbstractListModel(parent) , logger_(logger) { connect(this, &ArmoryServersModel::modelReset, @@ -52,7 +52,7 @@ void ArmoryServersModel::setData(int curIdx, int connIdx beginResetModel(); data_ = data; endResetModel(); - + logger_->debug("[{}] curIdx = {}", __func__, curIdx); if (current_ != curIdx) { setCurrent(curIdx); } @@ -112,45 +112,32 @@ int ArmoryServersModel::rowCount(const QModelIndex&) const return data_.size(); } -int ArmoryServersModel::columnCount(const QModelIndex&) const -{ - return header_.size(); -} - -QVariant ArmoryServersModel::getData(int row, int col) const +QVariant ArmoryServersModel::data(const QModelIndex& index, int role) const { - if ((row < 0) || (row >= rowCount())) { - return {}; - } - switch (col) { - case 0: return data_.at(row).name; - case 1: return (int)data_.at(row).netType; - case 2: return data_.at(row).armoryDBIp; - case 3: return QString::number(data_.at(row).armoryDBPort); - case 4: return data_.at(row).armoryDBKey; - default: break; + if(!index.isValid() || index.row() > rowCount()) { + return QVariant(); } - return {}; -} -QVariant ArmoryServersModel::data(const QModelIndex& index, int role) const -{ + int row = index.row(); + switch (role) { - case NameRole: return getData(index.row(), 0); - case NetTypeRole: return getData(index.row(), 1); - case AddressRole: return getData(index.row(), 2); - case PortRole: return getData(index.row(), 3); - case KeyRole: return getData(index.row(), 4); + case Qt::DisplayRole: return (data_.at(row).netType == NetworkType::MainNet) ? (data_.at(row).name + QLatin1String(" (Mainnet)")) + : (data_.at(row).name + QLatin1String(" (Testnet)")); + case NameRole: return data_.at(row).name; + case NetTypeRole: return (int)data_.at(row).netType; + case AddressRole: return data_.at(row).armoryDBIp; + case PortRole: return QString::number(data_.at(row).armoryDBPort); + case KeyRole: return data_.at(row).armoryDBKey; case DefaultServerRole: return (index.row() < ArmoryServersProvider::kDefaultServersCount) && (index.row() < rowCount()); case CurrentServerRole: return (index.row() == current()); - default: return getData(index.row(), index.column()); + default: return QVariant(); } - return {}; + return QVariant(); } bool ArmoryServersModel::setData(const QModelIndex& index, const QVariant& value, int role) { - if(!index.isValid() || index.row() > rowCount() || index.column() > columnCount()) { + if(!index.isValid() || index.row() > rowCount()) { return false; } @@ -191,15 +178,7 @@ QHash ArmoryServersModel::roleNames() const return kRoleNames; } -QVariant ArmoryServersModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - if (orientation == Qt::Orientation::Horizontal) { - return header_.at(section); - } - return {}; -} - bool ArmoryServersModel::isEditable(int row) const { - return data(index(row,0), DefaultServerRole).toBool(); + return data(index(row), DefaultServerRole).toBool(); } diff --git a/GUI/QtQuick/ArmoryServersModel.h b/GUI/QtQuick/ArmoryServersModel.h index 9ce922936..389d12e88 100644 --- a/GUI/QtQuick/ArmoryServersModel.h +++ b/GUI/QtQuick/ArmoryServersModel.h @@ -12,14 +12,14 @@ #include -#include +#include #include "ArmorySettings.h" namespace spdlog { class logger; } -class ArmoryServersModel: public QAbstractTableModel +class ArmoryServersModel: public QAbstractListModel { Q_OBJECT Q_PROPERTY(int current READ current WRITE setCurrent NOTIFY currentChanged) @@ -45,11 +45,9 @@ class ArmoryServersModel: public QAbstractTableModel auto data(int idx) const { return data_.at(idx); } int rowCount(const QModelIndex & = QModelIndex()) const override; - int columnCount(const QModelIndex & = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role) const override; bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override; QHash roleNames() const override; - QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; bool isEditable(int row) const; @@ -62,11 +60,9 @@ class ArmoryServersModel: public QAbstractTableModel private: int current() const { return current_; } int connected() const { return connected_; } - QVariant getData(int row, int col) const; private: std::shared_ptr logger_; - const QStringList header_; int current_{ -1 }; int connected_{ -1 }; std::vector data_; diff --git a/GUI/QtQuick/TermsAndConditions.txt b/GUI/QtQuick/TermsAndConditions.txt index 162e96136..25c066be0 100644 --- a/GUI/QtQuick/TermsAndConditions.txt +++ b/GUI/QtQuick/TermsAndConditions.txt @@ -1 +1,662 @@ -"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n\nSed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\n\nNeque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n\nSed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\n\nNeque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit" +GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. + diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 74c9511e9..1e1f75bed 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -185,12 +185,6 @@ Rectangle { columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) - onCellRightClicked: (row, column, data) => { - context_menu.row = row - context_menu.column = column - context_menu.popup() - } - CustomRbfCpfpMenu { id: context_menu @@ -200,6 +194,24 @@ Rectangle { } onCellClicked: (row, column, data) => { + show_transaction_details(row, column, data) + } + + onCellRightClicked: (row, column, data) => { + var nbConf = model.data(model.index(row, 5), TxListModel.NbConfRole) + if (nbConf === 0) + { + show_rbf_cfpf_menu(row, column, data) + } + else + { + show_transaction_details(row, column, data) + } + } + + + function show_transaction_details(row, column, data) + { const txHash = model.data(model.index(row, 0), TxListModel.TxIdRole) transactionDetails.walletName = model.data(model.index(row, 1), TxListModel.TableDataRole) transactionDetails.address = model.data(model.index(row, 3), TxListModel.TableDataRole) @@ -213,6 +225,12 @@ Rectangle { transactionDetails.open() } + function show_rbf_cfpf_menu(row, column, data) + { + context_menu.row = row + context_menu.column = column + context_menu.popup() + } TransactionDetails { id: transactionDetails diff --git a/GUI/QtQuick/qml/Send/WalletsComboBox.qml b/GUI/QtQuick/qml/Send/WalletsComboBox.qml index 61f442d68..f0495f64d 100644 --- a/GUI/QtQuick/qml/Send/WalletsComboBox.qml +++ b/GUI/QtQuick/qml/Send/WalletsComboBox.qml @@ -23,6 +23,7 @@ CustomComboBox { height: 70 model: walletBalances + currentIndex: overviewWalletIndex //aliases title_text: qsTr("From Wallet") @@ -31,12 +32,13 @@ CustomComboBox { textRole: "name" valueRole: "name" - Connections - { - target:walletBalances - function onRowCountChanged () - { - from_wallet_combo.currentIndex = overviewWalletIndex - } - } +// Connections +// { +// target:walletBalances +// function onRowCountChanged () +// { +// console.log("WalletsComboBox: overviewWalletIndex = " + overviewWalletIndex) +// from_wallet_combo.currentIndex = overviewWalletIndex +// } +// } } diff --git a/GUI/QtQuick/qml/Settings/AddArmoryServer.qml b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml index 34af0fbc7..ac7108b0f 100644 --- a/GUI/QtQuick/qml/Settings/AddArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml @@ -155,7 +155,7 @@ ColumnLayout { if (!save_but.enabled) return var networkType = radbut_main.checked ? 0 : 1 - var name = radbut_main.checked ? name_text_input.input_text + " (Mainnet)" : name_text_input.input_text + " (Testnet)" + var name = name_text_input.input_text var ip_dns = ip_dns_text_input.input_text var port = parseInt(port_text_input.input_text) var db_key = db_key_text_input.input_text diff --git a/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml b/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml new file mode 100644 index 000000000..c5374e888 --- /dev/null +++ b/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml @@ -0,0 +1,202 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +import terminal.models 1.0 + +ColumnLayout { + + id: layout + + property var armoryServersModel: ({}) + property int server_index + + height: 548 + width: 580 + + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : title.height + text: qsTr("Modify custom server") + } + + RowLayout { + id: row + spacing: 12 + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.topMargin: 24 + Layout.preferredHeight: 19 + + Label { + Layout.fillWidth: true + } + + Label { + id: radbut_text + + text: qsTr("Network type:") + + Layout.leftMargin: 25 + Layout.alignment: Qt.AlignVCenter + + width: 126 + height: 19 + + color: "#E2E7FF" + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Normal + } + + CustomRadioButton { + id: radbut_main + + Layout.alignment: Qt.AlignVCenter + + text: "MainNet" + + spacing: 6 + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Normal + + checked: true + + // netType==0 => MainNet, netType==1 => TestNet + onClicked : { + armoryServersModel.setData(armoryServersModel.index(server_index, 0) + , 0, ArmoryServersModel.NetTypeRole) + } + } + + CustomRadioButton { + id: radbut_test + + Layout.alignment: Qt.AlignVCenter + + text: "TestNet" + + spacing: 6 + font.pixelSize: 13 + font.family: "Roboto" + font.weight: Font.Normal + + checked: false + + // netType==0 => MainNet, netType==1 => TestNet + onClicked : { + armoryServersModel.setData(armoryServersModel.index(server_index, 0) + , 1, ArmoryServersModel.NetTypeRole) + } + } + + Label { + Layout.fillWidth: true + } + } + + CustomTextInput { + id: name_text_input + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + title_text: qsTr("Name") + + onTextEdited: { + armoryServersModel.setData(armoryServersModel.index(server_index, 0) + , name_text_input.input_text, ArmoryServersModel.NameRole) + } + } + + CustomTextInput { + id: ip_dns_text_input + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + title_text: qsTr("IP/DNS") + + input_validator: RegExpValidator { regExp: /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}(,(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})*/ } + + onTextEdited: { + armoryServersModel.setData(armoryServersModel.index(server_index, 0) + , ip_dns_text_input.input_text, ArmoryServersModel.AddressRole) + } + } + + CustomTextInput { + id: port_text_input + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + title_text: qsTr("Port") + + input_validator: IntValidator {bottom: 0; top: 65536;} + + onTextEdited: { + armoryServersModel.setData(armoryServersModel.index(server_index, 0) + , port_text_input.input_text, ArmoryServersModel.PortRole) + } + } + + CustomTextInput { + id: db_key_text_input + + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + title_text: qsTr("DB Key (optional)") + + onTextEdited: { + armoryServersModel.setData(armoryServersModel.index(server_index, 0) + , db_key_text_input.input_text, ArmoryServersModel.KeyRole) + } + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + function init() + { + // netType==0 => MainNet, netType==1 => TestNet + var netType = armoryServersModel.data(armoryServersModel.index(server_index, 0), ArmoryServersModel.NetTypeRole) + if (netType === 0) + { + radbut_main.checked = true + } + else if (netType === 1) + { + radbut_test.checked = true + } + name_text_input.input_text = armoryServersModel.data(armoryServersModel.index(server_index, 0) + , ArmoryServersModel.NameRole) + ip_dns_text_input.input_text = armoryServersModel.data(armoryServersModel.index(server_index, 0) + , ArmoryServersModel.AddressRole) + port_text_input.input_text = armoryServersModel.data(armoryServersModel.index(server_index, 0) + , ArmoryServersModel.PortRole) + db_key_text_input.input_text = armoryServersModel.data(armoryServersModel.index(server_index, 0) + , ArmoryServersModel.KeyRole) + name_text_input.setActiveFocus() + } +} diff --git a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml index 47ce3e713..9abdea853 100644 --- a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml +++ b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml @@ -14,6 +14,7 @@ ColumnLayout { signal sig_add_custom() signal sig_delete_custom(int ind) + signal sig_modify_custom(int ind) height: 548 width: 580 @@ -56,13 +57,23 @@ ColumnLayout { delegate: CustomListRadioButton { id: _delegate - title_text: name + title_text: display icon_add_source: isDefault ? "" : "qrc:/images/delete.png" radio_checked: isCurrent radio_group: radioGroup onClicked_add: { - sig_delete_custom (index) + if (!isDefault) + { + sig_delete_custom (index) + } + } + + onClicked: { + if (!isDefault) + { + sig_modify_custom (index) + } } onSig_radio_clicked: { diff --git a/GUI/QtQuick/qml/Settings/SettingsPopup.qml b/GUI/QtQuick/qml/Settings/SettingsPopup.qml index f544c897f..970b89ebd 100644 --- a/GUI/QtQuick/qml/Settings/SettingsPopup.qml +++ b/GUI/QtQuick/qml/Settings/SettingsPopup.qml @@ -51,10 +51,16 @@ CustomPopup { add_armory_server.init() } + onSig_modify_custom: (server_index) => { + _stack_view.push(modify_armory_server) + modify_armory_server.server_index = server_index + modify_armory_server.init() + } + onSig_delete_custom: (server_index) => { _stack_view.push(delete_armory_server) - delete_armory_server.init() delete_armory_server.server_index = server_index + delete_armory_server.init() } } @@ -69,6 +75,13 @@ CustomPopup { } } + ModifyArmoryServer { + id: modify_armory_server + visible: false + + armoryServersModel: root.armoryServersModel + } + DeleteArmoryServer { id: delete_armory_server visible: false diff --git a/GUI/QtQuick/qml/Settings/qmldir b/GUI/QtQuick/qml/Settings/qmldir index 9b9d82b2d..1580ebf96 100644 --- a/GUI/QtQuick/qml/Settings/qmldir +++ b/GUI/QtQuick/qml/Settings/qmldir @@ -3,6 +3,7 @@ module Settings SettingsPopup 1.0 SettingsPopup.qml SettingsMenu 1.0 SettingsMenu.qml AddArmoryServer 1.0 AddArmoryServer.qml +ModifyArmoryServer 1.0 ModifyArmoryServer.qml DeleteArmoryServer 1.0 DeleteArmoryServer.qml SettingsGeneral 1.0 SettingsGeneral.qml SettingsNetwork 1.0 SettingsNetwork.qml diff --git a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml index b2dfdf924..0878cd88d 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml @@ -92,10 +92,10 @@ Rectangle { MouseArea { id: mouseArea anchors.fill: parent - propagateComposedEvents: true + //propagateComposedEvents: true onClicked: { rect.clicked() - mouse.accepted = false + //mouse.accepted = false } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml b/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml index 598e04110..d0ca71863 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml @@ -41,9 +41,4 @@ CustomListItem { onClicked : root.sig_radio_clicked() } - - onClicked : { - rad_but.checked = true - root.sig_radio_clicked() - } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index 75acdd2ad..6dde70e87 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -115,6 +115,7 @@ Rectangle { anchors.rightMargin: 23 source: isHiddenText? "qrc:/images/Eye_icon _unvisible.png" : "qrc:/images/Eye_icon _visible.png" + z: 1 width: 24 height: 24 @@ -128,10 +129,8 @@ Rectangle { MouseArea { anchors.fill: parent - propagateComposedEvents: true onClicked: { input.forceActiveFocus() - mouse.accepted = false } } diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 4e7d7f1fc..70f51a98a 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -168,6 +168,23 @@ Item { onCopyRequested: bsApp.copyAddressToClipboard(id) onCellClicked: (row, column, data) => { + show_transaction_details(row, column, data) + } + + onCellRightClicked: (row, column, data) => { + var nbConf = model.data(model.index(row, 5), TxListModel.NbConfRole) + if (nbConf === 0) + { + show_rbf_cfpf_menu(row, column, data) + } + else + { + show_transaction_details(row, column, data) + } + } + + function show_transaction_details(row, column, data) + { const txHash = model.data(model.index(row, 0), TxListModel.TxIdRole) transactionDetails.walletName = model.data(model.index(row, 1), TxListModel.TableDataRole) transactionDetails.address = model.data(model.index(row, 3), TxListModel.TableDataRole) @@ -181,7 +198,8 @@ Item { transactionDetails.open() } - onCellRightClicked: (row, column, data) => { + function show_rbf_cfpf_menu(row, column, data) + { context_menu.row = row context_menu.column = column context_menu.popup() diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index a580fc470..ea670c521 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -111,6 +111,7 @@ ApplicationWindow { function onWalletsListChanged () { + console.log("onWalletsListChanged: overviewWalletIndex = " + overviewWalletIndex) if (overviewWalletIndex === -1) { overviewWalletIndex = 0 diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 6975f3d22..1f21c908d 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -179,5 +179,6 @@ qml/Settings/AddArmoryServer.qml images/delete_custom_server.svg qml/Settings/DeleteArmoryServer.qml + qml/Settings/ModifyArmoryServer.qml From c310c8dedf74978e55b674508f8de253878e0465 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Tue, 14 Mar 2023 14:58:33 +0200 Subject: [PATCH 228/436] pr fixed --- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 61 ++--------------- GUI/QtQuick/qml/Settings/AddArmoryServer.qml | 4 +- .../qml/Settings/ModifyArmoryServer.qml | 4 +- .../qml/StyledControls/CustomTableView.qml | 24 ++----- .../CustomTransactionsTableView.qml | 65 +++++++++++++++++++ GUI/QtQuick/qml/TransactionsPage.qml | 53 +-------------- GUI/QtQuick/qtquick.qrc | 1 + 7 files changed, 78 insertions(+), 134 deletions(-) create mode 100644 GUI/QtQuick/qml/StyledControls/CustomTransactionsTableView.qml diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 1e1f75bed..812245c85 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -170,10 +170,10 @@ Rectangle { } - CustomTableView { + CustomTransactionsTableView { width: parent.width height: parent.height - 40 - + model: PendingTransactionFilterModel { id: pendingTransactionModel @@ -181,62 +181,9 @@ Rectangle { dynamicSortFilter: true } - copy_button_column_index: 3 - columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] - onCopyRequested: bsApp.copyAddressToClipboard(id) - - CustomRbfCpfpMenu { - id: context_menu - - model: pendingTransactionModel - - onOpenSend: (txId, isRBF, isCPFP) => control.openSend(txId, isRBF, isCPFP) - } - - onCellClicked: (row, column, data) => { - show_transaction_details(row, column, data) - } - - onCellRightClicked: (row, column, data) => { - var nbConf = model.data(model.index(row, 5), TxListModel.NbConfRole) - if (nbConf === 0) - { - show_rbf_cfpf_menu(row, column, data) - } - else - { - show_transaction_details(row, column, data) - } - } - - - function show_transaction_details(row, column, data) - { - const txHash = model.data(model.index(row, 0), TxListModel.TxIdRole) - transactionDetails.walletName = model.data(model.index(row, 1), TxListModel.TableDataRole) - transactionDetails.address = model.data(model.index(row, 3), TxListModel.TableDataRole) - transactionDetails.txDateTime = model.data(model.index(row, 0), TxListModel.TableDataRole) - transactionDetails.txType = model.data(model.index(row, 2), TxListModel.TableDataRole) - transactionDetails.txTypeColor = model.data(model.index(row, 2), TxListModel.ColorRole) - transactionDetails.txComment = model.data(model.index(row, 7), TxListModel.TableDataRole) - transactionDetails.txAmount = model.data(model.index(row, 4), TxListModel.TableDataRole) - transactionDetails.txConfirmationsColor = model.data(model.index(row, 5), TxListModel.ColorRole) - transactionDetails.tx = bsApp.getTXDetails(txHash) - transactionDetails.open() - } - - function show_rbf_cfpf_menu(row, column, data) - { - context_menu.row = row - context_menu.column = column - context_menu.popup() - } - - TransactionDetails { - id: transactionDetails - visible: false - } + onOpenSend: (txId, isRBF, isCPFP) => control.openSend(txId, isRBF, isCPFP) } + } } } diff --git a/GUI/QtQuick/qml/Settings/AddArmoryServer.qml b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml index ac7108b0f..9fc830075 100644 --- a/GUI/QtQuick/qml/Settings/AddArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml @@ -109,8 +109,6 @@ ColumnLayout { Layout.topMargin: 10 title_text: qsTr("IP/DNS") - - input_validator: RegExpValidator { regExp: /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}(,(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})*/ } } CustomTextInput { @@ -123,7 +121,7 @@ ColumnLayout { title_text: qsTr("Port") - input_validator: IntValidator {bottom: 0; top: 65536;} + input_validator: IntValidator {bottom: 80; top: 65535;} } CustomTextInput { diff --git a/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml b/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml index c5374e888..52b50c077 100644 --- a/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml @@ -129,8 +129,6 @@ ColumnLayout { title_text: qsTr("IP/DNS") - input_validator: RegExpValidator { regExp: /(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}(,(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3})*/ } - onTextEdited: { armoryServersModel.setData(armoryServersModel.index(server_index, 0) , ip_dns_text_input.input_text, ArmoryServersModel.AddressRole) @@ -147,7 +145,7 @@ ColumnLayout { title_text: qsTr("Port") - input_validator: IntValidator {bottom: 0; top: 65536;} + input_validator: IntValidator {bottom: 80; top: 65535;} onTextEdited: { armoryServersModel.setData(armoryServersModel.index(server_index, 0) diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index dacbad12e..32ca9c1ba 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -34,10 +34,8 @@ Column { signal copyRequested(var id) signal deleteRequested(int id) - signal cellClicked(var row, var column, var data) - signal cellRightClicked(var row, var column, var data) - signal cellDoubleClicked(var row, var column, var data) - signal cellRightDoubleClicked(var row, var column, var data) + signal cellClicked(var row, var column, var data, var mouse) + signal cellDoubleClicked(var row, var column, var data, var mouse) function update() { component.forceLayout() @@ -97,24 +95,10 @@ Column { onEntered: component.selected_row_index = row onExited: component.selected_row_index = -1 onClicked: (mouse) => { - if (mouse.button === Qt.LeftButton) - { - root.cellClicked(row, column, tableData) - } - else if (mouse.button === Qt.RightButton) - { - root.cellRightClicked(row, column, tableData) - } + root.cellClicked(row, column, tableData, mouse) } onDoubleClicked: (mouse) => { - if (mouse.button === Qt.LeftButton) - { - root.cellDoubleClicked(row, column, tableData) - } - else if (mouse.button === Qt.RightButton) - { - root.cellRightDoubleClicked(row, column, tableData) - } + root.cellDoubleClicked(row, column, tableData, mouse) } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTransactionsTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTransactionsTableView.qml new file mode 100644 index 000000000..b5459c0fe --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomTransactionsTableView.qml @@ -0,0 +1,65 @@ + +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +import "../BsStyles" +import ".." + +import terminal.models 1.0 + +CustomTableView { + id: control + + signal openSend (string txId, bool isRBF, bool isCPFP) + + copy_button_column_index: 3 + columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] + onCopyRequested: bsApp.copyAddressToClipboard(id) + + CustomRbfCpfpMenu { + id: context_menu + + model: pendingTransactionModel + + onOpenSend: (txId, isRBF, isCPFP) => control.openSend(txId, isRBF, isCPFP) + } + + onCellClicked: (row, column, data, mouse) => { + var nbConf = model.data(model.index(row, 5), TxListModel.NbConfRole) + if (mouse.button === Qt.RightButton && nbConf === 0) + { + context_menu.row = row + context_menu.column = column + context_menu.popup() + } + else + { + const txHash = model.data(model.index(row, 0), TxListModel.TxIdRole) + transactionDetails.walletName = model.data(model.index(row, 1), TxListModel.TableDataRole) + transactionDetails.address = model.data(model.index(row, 3), TxListModel.TableDataRole) + transactionDetails.txDateTime = model.data(model.index(row, 0), TxListModel.TableDataRole) + transactionDetails.txType = model.data(model.index(row, 2), TxListModel.TableDataRole) + transactionDetails.txTypeColor = model.data(model.index(row, 2), TxListModel.ColorRole) + transactionDetails.txComment = model.data(model.index(row, 7), TxListModel.TableDataRole) + transactionDetails.txAmount = model.data(model.index(row, 4), TxListModel.TableDataRole) + transactionDetails.txConfirmationsColor = model.data(model.index(row, 5), TxListModel.ColorRole) + transactionDetails.tx = bsApp.getTXDetails(txHash) + transactionDetails.open() + } + } + + TransactionDetails { + id: transactionDetails + visible: false + } +} diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 70f51a98a..7c59af984 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -156,62 +156,13 @@ Item { } } - CustomTableView { + CustomTransactionsTableView { id: tableView width: parent.width height: parent.height - transaction_header_menu.height - transaction_header_menu.spacing - 1 model: transactionModel - copy_button_column_index: 3 - columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] - - onCopyRequested: bsApp.copyAddressToClipboard(id) - - onCellClicked: (row, column, data) => { - show_transaction_details(row, column, data) - } - - onCellRightClicked: (row, column, data) => { - var nbConf = model.data(model.index(row, 5), TxListModel.NbConfRole) - if (nbConf === 0) - { - show_rbf_cfpf_menu(row, column, data) - } - else - { - show_transaction_details(row, column, data) - } - } - - function show_transaction_details(row, column, data) - { - const txHash = model.data(model.index(row, 0), TxListModel.TxIdRole) - transactionDetails.walletName = model.data(model.index(row, 1), TxListModel.TableDataRole) - transactionDetails.address = model.data(model.index(row, 3), TxListModel.TableDataRole) - transactionDetails.txDateTime = model.data(model.index(row, 0), TxListModel.TableDataRole) - transactionDetails.txType = model.data(model.index(row, 2), TxListModel.TableDataRole) - transactionDetails.txTypeColor = model.data(model.index(row, 2), TxListModel.ColorRole) - transactionDetails.txComment = model.data(model.index(row, 7), TxListModel.TableDataRole) - transactionDetails.txAmount = model.data(model.index(row, 4), TxListModel.TableDataRole) - transactionDetails.txConfirmationsColor = model.data(model.index(row, 5), TxListModel.ColorRole) - transactionDetails.tx = bsApp.getTXDetails(txHash) - transactionDetails.open() - } - - function show_rbf_cfpf_menu(row, column, data) - { - context_menu.row = row - context_menu.column = column - context_menu.popup() - } - - CustomRbfCpfpMenu { - id: context_menu - - model: transactionModel - - onOpenSend: (txId, isRBF, isCPFP) => transactions.openSend(txId, isRBF, isCPFP) - } + onOpenSend: (txId, isRBF, isCPFP) => control.openSend(txId, isRBF, isCPFP) } } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 1f21c908d..8b8f7b56b 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -180,5 +180,6 @@ images/delete_custom_server.svg qml/Settings/DeleteArmoryServer.qml qml/Settings/ModifyArmoryServer.qml + qml/StyledControls/CustomTransactionsTableView.qml From 8e3de161a79e552aea9a8d11f8d68a03636637f4 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 16 Mar 2023 01:57:54 +0200 Subject: [PATCH 229/436] fix bugs --- GUI/QtQuick/ArmoryServersModel.cpp | 5 +- GUI/QtQuick/TermsAndConditions.txt | 743 ++++-------------- GUI/QtQuick/WalletBalancesModel.cpp | 2 +- .../qml/CreateWallet/TermsAndConditions.qml | 7 +- .../qml/Overview/OverviewWalletBar.qml | 1 + GUI/QtQuick/qml/Settings/SettingsNetwork.qml | 16 +- .../qml/StyledControls/CustomListItem.qml | 5 +- .../qml/StyledControls/CustomPopup.qml | 31 +- common | 2 +- 9 files changed, 197 insertions(+), 615 deletions(-) diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index 4764940ad..1e3c5a158 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -87,7 +87,10 @@ void ArmoryServersModel::add(QString name, QString armoryDBIp, int armoryDBPort, server.netType = NetworkType::TestNet; } - add(server); + QMetaObject::invokeMethod(this, [this, server] { + add(server); + setCurrent(rowCount() - 1); + }); } bool ArmoryServersModel::del(int idx) diff --git a/GUI/QtQuick/TermsAndConditions.txt b/GUI/QtQuick/TermsAndConditions.txt index 25c066be0..27482c55b 100644 --- a/GUI/QtQuick/TermsAndConditions.txt +++ b/GUI/QtQuick/TermsAndConditions.txt @@ -1,662 +1,225 @@ -GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS + GNU AFFERO GENERAL PUBLIC LICENSE + + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. The precise terms and conditions for copying, distribution and modification follow. + + TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU Affero General Public License. - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. + "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based on the Program. + + To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. + The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. + + A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. + + The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + + The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. + All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. + No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. + When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. + You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. + You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. + You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". + + c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + + A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. + You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + + If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + + The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. + "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + + All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. + You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + + However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + + Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. + You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. + Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. + A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + + If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + + A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Remote Network Interaction; Use with the GNU General Public License. - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. + Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. + + Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. 14. Revised Versions of this License. - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. + The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + + Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. + If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. - END OF TERMS AND CONDITIONS + END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Programs + How to Apply These Terms to Your New Programs - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. + To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . + You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. + If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. + + You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index 375f2add7..f0b873de2 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -71,7 +71,7 @@ QString WalletBalancesModel::getBalance(const std::string& walletId { const auto& itBal = balances_.find(walletId); if (itBal == balances_.end()) { - return tr("-"); + return QLatin1String("0.00000000"); } return ff(itBal->second); } diff --git a/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml b/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml index 00c01c1f6..25d58a73d 100644 --- a/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml +++ b/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml @@ -57,13 +57,12 @@ ColumnLayout { width: parent.width height: parent.height - font.pixelSize: 16 + font.pixelSize: 14 font.family: "Roboto" font.weight: Font.Normal leftPadding: 0 - rightPadding: 24 - color: "#E2E7FF" - text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n\nSed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\n\nNeque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n\nSed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.\n\nNeque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit" + rightPadding: 10 + color: BSStyle.titanWhiteColor selectByMouse: true wrapMode: TextEdit.WordWrap readOnly: true diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index b050aa881..b9c4caa1e 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -45,6 +45,7 @@ Rectangle { onCurrentIndexChanged: { bsApp.walletSelected(currentIndex) + control.walletIndexChanged(currentIndex) } Connections { diff --git a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml index 9abdea853..728d892b4 100644 --- a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml +++ b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml @@ -61,6 +61,7 @@ ColumnLayout { icon_add_source: isDefault ? "" : "qrc:/images/delete.png" radio_checked: isCurrent radio_group: radioGroup + icon_add_z: 1 onClicked_add: { if (!isDefault) @@ -70,16 +71,17 @@ ColumnLayout { } onClicked: { - if (!isDefault) + console.log("SettingsNetwork: radiolistitem: onclicked") + console.log("isCurrent = " + isCurrent) + console.log("isDefault = " + isDefault) + if (isCurrent === false) { - sig_modify_custom (index) + isCurrent = true + radio_checked = true } - } - - onSig_radio_clicked: { - if (radio_checked) + else if (isDefault === false) { - isCurrent = true + sig_modify_custom (index) } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml index 0878cd88d..83f6194f9 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml @@ -22,6 +22,7 @@ Rectangle { //usually we dont need only if custom margin and size property alias _icon: icon property alias icon_add_source: icon_add.source + property alias icon_add_z: icon_add.z property alias title_text: title.text signal clicked_add() @@ -75,7 +76,7 @@ Rectangle { anchors.right: rect.right anchors.rightMargin: 13 - z: 1 + z: 0 width: 24 height: 24 sourceSize.width: 24 @@ -92,10 +93,8 @@ Rectangle { MouseArea { id: mouseArea anchors.fill: parent - //propagateComposedEvents: true onClicked: { rect.clicked() - //mouse.accepted = false } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml index 4a7d05c3f..4c3e917da 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml @@ -44,17 +44,32 @@ Window { border.color : BSStyle.defaultBorderColor border.width : 1 - Image { - id: close_button + + Rectangle { + id: close_rect anchors.top: parent.top - anchors.topMargin: 24 + anchors.topMargin: 1 anchors.right: parent.right - anchors.rightMargin: 24 + anchors.rightMargin: 1 + radius: 16 - source: "qrc:/images/close_button.svg" - width: 16 - height: 16 + color: BSStyle.popupBackgroundColor + height: 39 + width: 110 + + Image { + id: close_button + + anchors.top: parent.top + anchors.topMargin: 23 + anchors.right: parent.right + anchors.rightMargin: 23 + + source: "qrc:/images/close_button.svg" + width: 16 + height: 16 + } MouseArea { anchors.fill: parent onClicked: { @@ -85,7 +100,7 @@ Window { StackView { id: stack_popup - anchors.top: close_button.bottom + anchors.top: close_rect.bottom anchors.topMargin: 0 implicitHeight: currentItem.height diff --git a/common b/common index 2e44ea312..06408c3a1 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 2e44ea312fb890cf692708b2f6beec5fc7ef1ce0 +Subproject commit 06408c3a193b41c10ae2c1b2ab76308c234cd9c2 From 8bee8619ad94745d7f939a15da996bf5badd67ef Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 16 Mar 2023 14:12:09 +0300 Subject: [PATCH 230/436] Live reconnect and wallet reload --- Core/ArmoryServersProvider.cpp | 18 +++++-- Core/ArmoryServersProvider.h | 10 +++- Core/SettingsAdapter.cpp | 79 +++++++++++++++++++++--------- Core/SettingsAdapter.h | 2 + Core/SignerAdapter.cpp | 5 ++ GUI/QtQuick/ArmoryServersModel.cpp | 8 ++- GUI/QtQuick/ArmoryServersModel.h | 2 +- GUI/QtQuick/QtQuickAdapter.cpp | 33 +++++++++++-- GUI/QtQuick/QtQuickAdapter.h | 1 + GUI/QtQuick/TxListModel.cpp | 23 +++++++-- GUI/QtQuick/TxListModel.h | 2 + common | 2 +- 12 files changed, 143 insertions(+), 42 deletions(-) diff --git a/Core/ArmoryServersProvider.cpp b/Core/ArmoryServersProvider.cpp index 6dff8967f..3cb36a4d5 100644 --- a/Core/ArmoryServersProvider.cpp +++ b/Core/ArmoryServersProvider.cpp @@ -12,6 +12,7 @@ #include "BootstrapDataManager.h" #include #include +#include namespace { @@ -40,8 +41,9 @@ const std::vector ArmoryServersProvider::defaultServers_ = { const int ArmoryServersProvider::kDefaultServersCount = ArmoryServersProvider::defaultServers_.size(); -ArmoryServersProvider::ArmoryServersProvider(const std::shared_ptr &appSettings) - : appSettings_(appSettings) +ArmoryServersProvider::ArmoryServersProvider(const std::shared_ptr &appSettings + , const std::shared_ptr& logger) + : appSettings_(appSettings), logger_(logger) {} std::vector ArmoryServersProvider::servers() const @@ -128,7 +130,11 @@ int ArmoryServersProvider::indexOf(const ArmoryServer &server) const const auto& srvrs = servers(); for (int i = 0; i < srvrs.size(); ++i) { const auto& s = srvrs.at(i); - if ((s.name == server.name) && (s.netType == server.netType) + logger_->debug("[{}] {}: {} vs {}, {} vs {}, {} vs {}, {} vs {}", __func__ + , i, s.name.toStdString(), server.name.toStdString(), (int)s.netType + , (int)server.netType, s.armoryDBIp.toStdString() + , server.armoryDBIp.toStdString(), s.armoryDBPort, server.armoryDBPort); + if ((server.name.isEmpty() || (s.name == server.name)) && (s.netType == server.netType) && (s.armoryDBIp == server.armoryDBIp) && (s.armoryDBPort == server.armoryDBPort)) { return i; } @@ -251,8 +257,9 @@ bool ArmoryServersProvider::remove(int index) } } -void ArmoryServersProvider::setupServer(int index) +NetworkType ArmoryServersProvider::setupServer(int index) { + NetworkType netType{ NetworkType::Invalid }; const auto& srvList = servers(); if (index >= 0 && index < srvList.size()) { ArmoryServer server = srvList.at(index); @@ -261,7 +268,10 @@ void ArmoryServersProvider::setupServer(int index) appSettings_->set(ApplicationSettings::armoryDbPort, server.armoryDBPort); appSettings_->set(ApplicationSettings::netType, static_cast(server.netType)); appSettings_->set(ApplicationSettings::runArmoryLocally, server.runLocally); + netType = server.netType; } + lastConnectedIndex_ = index; + return netType; } int ArmoryServersProvider::addKey(const QString &address, int port, const QString &key) diff --git a/Core/ArmoryServersProvider.h b/Core/ArmoryServersProvider.h index ed0768b35..e040c2014 100644 --- a/Core/ArmoryServersProvider.h +++ b/Core/ArmoryServersProvider.h @@ -22,10 +22,15 @@ #define TESTNET_ARMORY_BLOCKSETTLE_ADDRESS "armory-testnet.blocksettle.com" #define TESTNET_ARMORY_BLOCKSETTLE_PORT 80 +namespace spdlog { + class logger; +} + class ArmoryServersProvider { public: - ArmoryServersProvider(const std::shared_ptr&); + ArmoryServersProvider(const std::shared_ptr& + , const std::shared_ptr &); std::vector servers() const; ArmorySettings getArmorySettings() const; @@ -41,7 +46,7 @@ class ArmoryServersProvider bool add(const ArmoryServer &server); bool replace(int index, const ArmoryServer &server); bool remove(int index); - void setupServer(int index); + NetworkType setupServer(int index); int addKey(const QString &address, int port, const QString &key); int addKey(const std::string &srvIPPort, const BinaryData &srvPubKey); @@ -54,6 +59,7 @@ class ArmoryServersProvider private: std::shared_ptr appSettings_; + std::shared_ptr logger_; int lastConnectedIndex_{ -1 }; static const std::vector defaultServers_; }; diff --git a/Core/SettingsAdapter.cpp b/Core/SettingsAdapter.cpp index 823d540ad..e1cfd5696 100644 --- a/Core/SettingsAdapter.cpp +++ b/Core/SettingsAdapter.cpp @@ -64,7 +64,7 @@ SettingsAdapter::SettingsAdapter(const std::shared_ptr &set , filePathInResources.toStdString()); } } - armoryServersProvider_ = std::make_shared(settings); + armoryServersProvider_ = std::make_shared(settings, logger_); } ProcessingResult SettingsAdapter::process(const bs::message::Envelope &env) @@ -126,28 +126,41 @@ bool SettingsAdapter::processBroadcast(const bs::message::Envelope& env) return false; } if (msg.data_case() == ArmoryMessage::kSettingsRequest) { - ArmoryMessage msgReply; - auto msgResp = msgReply.mutable_settings_response(); - const auto& armorySettings = armoryServersProvider_->getArmorySettings(); - armoryServersProvider_->setConnectedArmorySettings(armorySettings); - msgResp->set_socket_type(armorySettings.socketType); - msgResp->set_network_type((int)armorySettings.netType); - msgResp->set_host(armorySettings.armoryDBIp.toStdString()); - msgResp->set_port(std::to_string(armorySettings.armoryDBPort)); - msgResp->set_bip15x_key(armorySettings.armoryDBKey.toStdString()); - msgResp->set_run_locally(armorySettings.runLocally); - msgResp->set_data_dir(armorySettings.dataDir.toStdString()); - msgResp->set_executable_path(armorySettings.armoryExecutablePath.toStdString()); - msgResp->set_bitcoin_dir(armorySettings.bitcoinBlocksDir.toStdString()); - msgResp->set_db_dir(armorySettings.dbDir.toStdString()); - msgResp->set_cache_file_name(appSettings_->get(ApplicationSettings::txCacheFileName)); - pushResponse(user_, env, msgReply.SerializeAsString()); + sendSettings(armoryServersProvider_->getArmorySettings()); + logger_->debug("current={}, connected={}", armoryServersProvider_->indexOfCurrent() + , armoryServersProvider_->indexOfConnected()); return true; } } return false; } +void SettingsAdapter::sendSettings(const ArmorySettings& armorySettings, bool netTypeChanged) +{ + { + ArmoryMessage msg; + auto msgResp = msg.mutable_settings_response(); + armoryServersProvider_->setConnectedArmorySettings(armorySettings); + msgResp->set_socket_type(armorySettings.socketType); + msgResp->set_network_type((int)armorySettings.netType); + msgResp->set_host(armorySettings.armoryDBIp.toStdString()); + msgResp->set_port(std::to_string(armorySettings.armoryDBPort)); + msgResp->set_bip15x_key(armorySettings.armoryDBKey.toStdString()); + msgResp->set_run_locally(armorySettings.runLocally); + msgResp->set_data_dir(armorySettings.dataDir.toStdString()); + msgResp->set_executable_path(armorySettings.armoryExecutablePath.toStdString()); + msgResp->set_bitcoin_dir(armorySettings.bitcoinBlocksDir.toStdString()); + msgResp->set_db_dir(armorySettings.dbDir.toStdString()); + msgResp->set_cache_file_name(appSettings_->get(ApplicationSettings::txCacheFileName)); + pushResponse(user_, bs::message::UserTerminal::create(bs::message::TerminalUsers::Blockchain) + , msg.SerializeAsString()); + } + if (netTypeChanged) { + logger_->debug("[{}] network type changed - reloading wallets", __func__); + processSignerSettings({}); + } +} + ProcessingResult SettingsAdapter::processRemoteSettings(uint64_t msgId) { const auto &itReq = remoteSetReqs_.find(msgId); @@ -327,7 +340,7 @@ ProcessingResult SettingsAdapter::processGetRequest(const bs::message::Envelope for (const auto &req : request.requests()) { auto resp = msgResp->add_responses(); resp->set_allocated_request(new SettingRequest(req)); - if (req.source() == SettingSource_Local) { + if ((req.source() == SettingSource_Local) || (req.source() == SettingSource_Unknown)) { switch (req.index()) { case SetIdx_BlockSettleSignAddress: resp->set_s(appSettings_->GetBlocksettleSignAddress()); @@ -497,7 +510,7 @@ ProcessingResult SettingsAdapter::processArmoryServer(const BlockSettle::Termina } if (selIndex >= armoryServersProvider_->servers().size()) { logger_->error("[{}] failed to find Armory server {}", __func__, request.server_name()); - return ProcessingResult::Success; + return ProcessingResult::Error; } armoryServersProvider_->setupServer(selIndex); appSettings_->selectNetwork(); @@ -506,9 +519,21 @@ ProcessingResult SettingsAdapter::processArmoryServer(const BlockSettle::Termina ProcessingResult SettingsAdapter::processSetArmoryServer(const bs::message::Envelope& env, int index) { - armoryServersProvider_->setupServer(index); + if (armoryServersProvider_->indexOfConnected() == index) { + return ProcessingResult::Ignored; + } + logger_->debug("[{}] #{}", __func__, index); + const auto prevNetType = armoryServersProvider_->getArmorySettings().netType; + const auto newNetType = armoryServersProvider_->setupServer(index); + if (newNetType == NetworkType::Invalid) { + logger_->error("[{}] Failed to setup server #{}", __func__, index); + return ProcessingResult::Error; + } appSettings_->selectNetwork(); - return processGetArmoryServers(env); + logger_->debug("[{}] net {} selected", __func__ + , (int)appSettings_->get(ApplicationSettings::Setting::netType)); + sendSettings(armoryServersProvider_->getArmorySettings(), (prevNetType != newNetType)); + return ProcessingResult::Success; } ProcessingResult SettingsAdapter::processGetArmoryServers(const bs::message::Envelope& env) @@ -582,10 +607,18 @@ ProcessingResult SettingsAdapter::processSignerSettings(const bs::message::Envel { SettingsMessage msg; auto msgResp = msg.mutable_signer_response(); - msgResp->set_network_type(appSettings_->get(ApplicationSettings::netType)); + const auto netType = appSettings_->get(ApplicationSettings::netType); + logger_->debug("[{}] network type: {}", __func__, netType); + msgResp->set_network_type(netType); msgResp->set_home_dir(appSettings_->GetHomeDir().toStdString()); //msgResp->set_auto_sign_spend_limit(appSettings_->get(ApplicationSettings::autoSignSpendLimit)); - pushResponse(user_, env, msg.SerializeAsString()); + if (env.sender) { + pushResponse(user_, env, msg.SerializeAsString()); + } + else { + pushResponse(user_, bs::message::UserTerminal::create(bs::message::TerminalUsers::Signer) + , msg.SerializeAsString()); + } return ProcessingResult::Success; } diff --git a/Core/SettingsAdapter.h b/Core/SettingsAdapter.h index 79605be3a..bafc866cd 100644 --- a/Core/SettingsAdapter.h +++ b/Core/SettingsAdapter.h @@ -14,6 +14,7 @@ #include #include #include +#include "ArmorySettings.h" #include "Message/Adapter.h" #include "TerminalMessage.h" @@ -80,6 +81,7 @@ class SettingsAdapter : public bs::message::Adapter bs::message::ProcessingResult processUpdArmoryServer(const bs::message::Envelope& , const BlockSettle::Terminal::SettingsMessage_ArmoryServerUpdate&); bs::message::ProcessingResult processSignerSettings(const bs::message::Envelope&); + void sendSettings(const ArmorySettings&, bool netTypeChanged = false); bs::message::ProcessingResult processRemoteSettings(uint64_t msgId); bs::message::ProcessingResult processGetState(const bs::message::Envelope&); bs::message::ProcessingResult processReset(const bs::message::Envelope& diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 4f14715dd..e4e577b43 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -158,6 +158,11 @@ ProcessingResult SignerAdapter::processOwnRequest(const bs::message::Envelope &e ProcessingResult SignerAdapter::processSignerSettings(const SettingsMessage_SignerServer &response) { + { + SignerMessage msg; + msg.mutable_wallets_reset(); + pushBroadcast(user_, msg.SerializeAsString(), true); + } curServerId_ = response.id(); netType_ = static_cast(response.network_type()); walletsDir_ = response.home_dir(); diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index 1e3c5a158..a92a897f0 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -41,8 +41,12 @@ ArmoryServersModel::ArmoryServersModel(const std::shared_ptr & l void ArmoryServersModel::setCurrent (int value) { + logger_->debug("[{}] {} -> {}", __func__, current_, value); + if (current_ == value) { + return; + } current_ = value; - emit currentChanged(); + emit currentChanged(value); } void ArmoryServersModel::setData(int curIdx, int connIdx @@ -140,7 +144,7 @@ QVariant ArmoryServersModel::data(const QModelIndex& index, int role) const bool ArmoryServersModel::setData(const QModelIndex& index, const QVariant& value, int role) { - if(!index.isValid() || index.row() > rowCount()) { + if (!index.isValid() || index.row() > rowCount()) { return false; } diff --git a/GUI/QtQuick/ArmoryServersModel.h b/GUI/QtQuick/ArmoryServersModel.h index 389d12e88..706f8b362 100644 --- a/GUI/QtQuick/ArmoryServersModel.h +++ b/GUI/QtQuick/ArmoryServersModel.h @@ -53,7 +53,7 @@ class ArmoryServersModel: public QAbstractListModel signals: void changed(const QModelIndex&, const QVariant&); - void currentChanged(); + void currentChanged(int index); void connectedChanged(); void rowCountChanged(); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 405552971..ec17f3ed4 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -369,6 +369,19 @@ bool QtQuickAdapter::processBroadcast(const bs::message::Envelope& env) return false; } +void QtQuickAdapter::onArmoryServerSelected(int index) +{ + auto model = qobject_cast(sender()); + if (!model) { + logger_->error("[{}] invalid sender", __func__); + return; + } + logger_->debug("[{}] #{}", __func__, index); + SettingsMessage msg; + msg.set_set_armory_server(index); + pushRequest(user_, userSettings_, msg.SerializeAsString()); +} + ProcessingResult QtQuickAdapter::processSettings(const Envelope &env) { SettingsMessage msg; @@ -451,7 +464,8 @@ ProcessingResult QtQuickAdapter::processSettingsState(const SettingsMessage_Sett ProcessingResult QtQuickAdapter::processArmoryServers(bs::message::SeqId msgId , const SettingsMessage_ArmoryServers& response) { - logger_->debug("[{}]", __func__); + logger_->debug("[{}] current={}, connected={}", __func__, response.idx_current() + , response.idx_connected()); const auto& itReq = armoryServersReq_.find(msgId); if (itReq == armoryServersReq_.end()) { logger_->warn("[{}] unknown request #{}", __func__, msgId); @@ -527,6 +541,7 @@ ProcessingResult QtQuickAdapter::processBlockchain(const Envelope &env) break; case ArmoryMessage::kWalletRegistered: if (msg.wallet_registered().success() && msg.wallet_registered().wallet_id().empty()) { + logger_->debug("wallets ready"); walletsReady_ = true; WalletsMessage msg; msg.set_get_ledger_entries({}); @@ -600,6 +615,13 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) break; case SignerMessage::kWalletSeed: return processWalletSeed(msg.wallet_seed()); + case SignerMessage::kWalletsReset: + hdWallets_.clear(); + if (walletBalances_) { + walletBalances_->clear(); + } + walletsReady_ = false; + break; case SignerMessage::kWalletsListUpdated: default: return ProcessingResult::Ignored; } @@ -686,6 +708,7 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) return processReservedUTXOs(msg.reserved_utxos()); case WalletsMessage::kWalletChanged: if (walletsReady_) { + logger_->debug("ledger entries"); WalletsMessage msg; msg.set_get_ledger_entries({}); pushRequest(user_, userWallets_, msg.SerializeAsString()); @@ -947,6 +970,9 @@ std::string QtQuickAdapter::generateWalletName() const void QtQuickAdapter::walletSelected(int index) { + if (index < 0) { + return; + } logger_->debug("[{}] {}", __func__, index); QMetaObject::invokeMethod(this, [this, index] { try { @@ -1152,12 +1178,10 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId } } else { - const auto details = itTxDet->second; - QMetaObject::invokeMethod(this, [this, details, txDet] { + QMetaObject::invokeMethod(this, [this, details = itTxDet->second, txDet] { details->setDetails(txDet); details->setCurBlock(blockNum_); }); // shouldn't be more than one entry - txDetailReqs_.erase(itTxDet); } } @@ -1350,6 +1374,7 @@ ArmoryServersModel* QtQuickAdapter::getArmoryServers() auto model = new ArmoryServersModel(logger_, this); armoryServersReq_[msgId] = model; connect(model, &ArmoryServersModel::changed, this, &QtQuickAdapter::onArmoryServerChanged); + connect(model, &ArmoryServersModel::currentChanged, this, &QtQuickAdapter::onArmoryServerSelected); return model; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 5bfb39f49..3f2fea355 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -201,6 +201,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop private slots: void onArmoryServerChanged(const QModelIndex&, const QVariant&); + void onArmoryServerSelected(int index); private: bs::message::ProcessingResult processSettings(const bs::message::Envelope &); diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 13974aa39..b166241e1 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -215,11 +215,12 @@ void TxListModel::addRows(const std::vector& entries) std::vector newEntries; for (const auto& entry : entries) { int row = -1; + std::shared_lock readLock{ dataMtx_ }; for (int i = 0; i < data_.size(); ++i) { - const auto& de = data_.at(i); + auto& de = data_.at(i); if ((entry.txHash == de.txHash) && (de.walletIds == entry.walletIds)) { - data_[i].txTime = entry.txTime; - data_[i].recvTime = entry.recvTime; + de.txTime = entry.txTime; + de.recvTime = entry.recvTime; row = i; break; } @@ -236,6 +237,7 @@ void TxListModel::addRows(const std::vector& entries) if (!newEntries.empty()) { QMetaObject::invokeMethod(this, [this, newEntries] { logger_->debug("[TxListModel::addRows] {} new entries", newEntries.size()); + //std::unique_lock writeLock{ dataMtx_ }; beginInsertRows(QModelIndex(), rowCount(), rowCount() + newEntries.size() - 1); data_.insert(data_.end(), newEntries.cbegin(), newEntries.cend()); endInsertRows(); @@ -254,6 +256,7 @@ void TxListModel::addRows(const std::vector& entries) void TxListModel::clear() { + //std::unique_lock writeLock{ dataMtx_ }; beginResetModel(); data_.clear(); txDetails_.clear(); @@ -282,9 +285,11 @@ void TxListModel::setTxComment(const std::string& txHash, const std::string& com void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet) { int row = -1; + //std::shared_lock readLock{ dataMtx_ }; for (int i = 0; i < data_.size(); ++i) { const auto& entry = data_.at(i); if ((entry.txHash == txDet.txHash) && (txDet.walletIds == entry.walletIds)) { + std::unique_lock writeLock{ dataMtx_ }; txDetails_[i] = txDet; data_[i].addresses = txDet.ownAddresses; row = i; @@ -293,11 +298,12 @@ void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet) } if (row != -1) { emit dataChanged(createIndex(row, 1), createIndex(row, 6)); - //logger_->debug("[TxListModel::setDetails] {} {} found at row {}", txDet.txHash.toHexStr(), txDet.hdWalletId, row); + logger_->debug("[TxListModel::setDetails] {} {} found at row {}", txDet.txHash.toHexStr(), txDet.hdWalletId, row); } else { - //logger_->warn("[TxListModel::setDetails] {} {} not found", txDet.txHash.toHexStr(), txDet.hdWalletId); + logger_->warn("[TxListModel::setDetails] {} {} not found", txDet.txHash.toHexStr(), txDet.hdWalletId); + //std::unique_lock writeLock{ dataMtx_ }; pendingDetails_.push_back(txDet); } } @@ -305,6 +311,7 @@ void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet) void TxListModel::removeTX(const BinaryData& txHash) { int rowStart = -1, rowEnd = -1; + std::shared_lock readLock{ dataMtx_ }; for (int i = 0; i < data_.size(); ++i) { const auto& entry = data_.at(i); if (entry.txHash == txHash) { @@ -320,6 +327,10 @@ void TxListModel::removeTX(const BinaryData& txHash) } logger_->debug("[{}] {}: start: {}, end: {}", __func__, txHash.toHexStr(true), rowStart, rowEnd); QMetaObject::invokeMethod(this, [this, rowStart, rowEnd] { + if (rowStart >= rowCount()) { + return; + } + //std::unique_lock writeLock{ dataMtx_ }; beginRemoveRows(QModelIndex(), rowStart, rowEnd); data_.erase(data_.cbegin() + rowStart, data_.cbegin() + rowEnd + 1); for (int i = rowEnd + 1; i < txDetails_.size(); i++) { @@ -339,6 +350,7 @@ void TxListModel::setCurrentBlock(uint32_t nbBlock) return; } const int diff = nbBlock - curBlock_; + std::unique_lock writeLock{ dataMtx_ }; curBlock_ = nbBlock; for (auto& entry : data_) { entry.nbConf += diff; @@ -360,6 +372,7 @@ bool TxListModel::exportCSVto(const QString& filename) return false; } fstrm << "sep=;\nTimestamp;Wallet;Type;Address;TxId;Amount;Comment\n"; + std::shared_lock readLock{ dataMtx_ }; for (int i = 0; i < rowCount(); ++i) { const auto& entry = data_.at(i); std::time_t txTime = entry.txTime; diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 3672ba2a8..9f574bc6f 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -12,6 +12,7 @@ #define TX_LIST_MODEL_H #include +#include #include #include #include @@ -73,6 +74,7 @@ class TxListModel : public QAbstractTableModel std::map txDetails_; std::vector pendingDetails_; uint32_t curBlock_; + std::shared_mutex dataMtx_; }; class TxListForAddr : public QAbstractTableModel diff --git a/common b/common index 06408c3a1..b11114f76 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 06408c3a193b41c10ae2c1b2ab76308c234cd9c2 +Subproject commit b11114f76c1d0f9a1d5198f321df6ee96dcce10d From f7062c61276e358a0d0c208eecb191ac38408397 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 16 Mar 2023 14:26:02 +0300 Subject: [PATCH 231/436] removed local servers --- Core/ArmoryServersProvider.cpp | 12 ++++++------ GUI/QtQuick/QtQuickAdapter.cpp | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Core/ArmoryServersProvider.cpp b/Core/ArmoryServersProvider.cpp index 3cb36a4d5..064e13ca1 100644 --- a/Core/ArmoryServersProvider.cpp +++ b/Core/ArmoryServersProvider.cpp @@ -22,8 +22,8 @@ namespace { enum class ServerIndices { MainNet = 0, TestNet, - LocalhostMainNet, - LocalHostTestNet + //LocalhostMainNet, + //LocalHostTestNet }; } // namespace @@ -31,12 +31,12 @@ namespace { const std::vector ArmoryServersProvider::defaultServers_ = { ArmoryServer::fromTextSettings(QStringLiteral(ARMORY_BLOCKSETTLE_NAME":0:mainnet.blocksettle.com:9003:")), ArmoryServer::fromTextSettings(QStringLiteral(ARMORY_BLOCKSETTLE_NAME":1:testnet.blocksettle.com:19003:")), - ArmoryServer::fromTextSettings(kEnableLocalAutostart ? +/* ArmoryServer::fromTextSettings(kEnableLocalAutostart ? QStringLiteral("%1:0:127.0.0.1::").arg(QObject::tr("Local Auto-launch Node")) : QStringLiteral("%1:0:127.0.0.1::").arg(QObject::tr("Local BlockSettleDB Node"))), ArmoryServer::fromTextSettings(kEnableLocalAutostart ? QStringLiteral("%1:1:127.0.0.1::").arg(QObject::tr("Local Auto-launch Node")) : - QStringLiteral("%1:1:127.0.0.1:81:").arg(QObject::tr("Local BlockSettleDB Node"))) + QStringLiteral("%1:1:127.0.0.1:81:").arg(QObject::tr("Local BlockSettleDB Node")))*/ }; const int ArmoryServersProvider::kDefaultServersCount = ArmoryServersProvider::defaultServers_.size(); @@ -61,7 +61,7 @@ std::vector ArmoryServersProvider::servers() const //bsTestNet.armoryDBKey = QString::fromStdString(bootstrapDataManager_->getArmoryTestnetKey()); servers.push_back(bsTestNet); - // #3 add localhost node MainNet +/* // #3 add localhost node MainNet ArmoryServer localMainNet = defaultServers_.at(static_cast(ServerIndices::LocalhostMainNet)); localMainNet.armoryDBPort = appSettings_->GetDefaultArmoryLocalPort(NetworkType::MainNet); localMainNet.runLocally = kEnableLocalAutostart; @@ -71,7 +71,7 @@ std::vector ArmoryServersProvider::servers() const ArmoryServer localTestNet = defaultServers_.at(static_cast(ServerIndices::LocalHostTestNet)); localTestNet.armoryDBPort = appSettings_->GetDefaultArmoryLocalPort(NetworkType::TestNet); localTestNet.runLocally = kEnableLocalAutostart; - servers.push_back(localTestNet); + servers.push_back(localTestNet);*/ for (const QString &srv : userServers) { servers.push_back(ArmoryServer::fromTextSettings(srv)); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index ec17f3ed4..8ed694386 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1401,6 +1401,7 @@ bool QtQuickAdapter::addArmoryServer(ArmoryServersModel* model, const QString& n bool QtQuickAdapter::delArmoryServer(ArmoryServersModel* model, int idx) { + logger_->debug("[{}] #{}", __func__, idx); if (!model->isEditable(idx)) { return false; } From 2301a08798f267d4f57abdd2b8a793d2c2d3c27c Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 16 Mar 2023 20:14:18 +0200 Subject: [PATCH 232/436] qml: settings/network: fix bugs --- GUI/QtQuick/ArmoryServersModel.cpp | 6 ++---- GUI/QtQuick/ArmoryServersModel.h | 4 ++-- GUI/QtQuick/qml/Overview/OverviewWalletBar.qml | 2 +- GUI/QtQuick/qml/Send/SimpleDetails.qml | 1 - GUI/QtQuick/qml/Send/WalletsComboBox.qml | 10 ---------- GUI/QtQuick/qml/Settings/AddArmoryServer.qml | 2 +- GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml | 2 +- GUI/QtQuick/qml/Settings/SettingsNetwork.qml | 8 ++++---- GUI/QtQuick/qml/Settings/SettingsPopup.qml | 11 ++++++++--- 9 files changed, 19 insertions(+), 27 deletions(-) diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index a92a897f0..f0925b21b 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -57,9 +57,7 @@ void ArmoryServersModel::setData(int curIdx, int connIdx data_ = data; endResetModel(); logger_->debug("[{}] curIdx = {}", __func__, curIdx); - if (current_ != curIdx) { - setCurrent(curIdx); - } + setCurrent(curIdx); if (connected_ != connIdx) { connected_ = connIdx; emit connectedChanged(); @@ -187,5 +185,5 @@ QHash ArmoryServersModel::roleNames() const bool ArmoryServersModel::isEditable(int row) const { - return data(index(row), DefaultServerRole).toBool(); + return !data(index(row), DefaultServerRole).toBool(); } diff --git a/GUI/QtQuick/ArmoryServersModel.h b/GUI/QtQuick/ArmoryServersModel.h index 706f8b362..77140cb75 100644 --- a/GUI/QtQuick/ArmoryServersModel.h +++ b/GUI/QtQuick/ArmoryServersModel.h @@ -39,8 +39,8 @@ class ArmoryServersModel: public QAbstractListModel void setData(int curIdx, int connIdx, const std::vector&); void add(const ArmoryServer&); // netType==0 => MainNet, netType==1 => TestNet - Q_INVOKABLE void add(QString name, QString armoryDBIp, int armoryDBPort, int netType, QString armoryDBKey); - Q_INVOKABLE bool del(int idx); + void add(QString name, QString armoryDBIp, int armoryDBPort, int netType, QString armoryDBKey); + bool del(int idx); auto data() const { return data_; } auto data(int idx) const { return data_.at(idx); } diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index b9c4caa1e..aaa29563e 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -51,7 +51,7 @@ Rectangle { Connections { target: bsApp onRequestWalletSelection: (index) => { - currentIndex = index + wallet_selection_combobox.currentIndex = index } } } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index b67f3f1b9..0e7cf8b71 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -214,7 +214,6 @@ ColumnLayout { var cur_value = parseFloat(amount_input.input_text) var bottom = 0 var top = tempRequest.maxAmount - console.log("tempRequest.maxAmount = " + tempRequest.maxAmount) if(cur_value < bottom || cur_value > top) { amount_input.input_text = tempRequest.maxAmount diff --git a/GUI/QtQuick/qml/Send/WalletsComboBox.qml b/GUI/QtQuick/qml/Send/WalletsComboBox.qml index f0495f64d..7c9464169 100644 --- a/GUI/QtQuick/qml/Send/WalletsComboBox.qml +++ b/GUI/QtQuick/qml/Send/WalletsComboBox.qml @@ -31,14 +31,4 @@ CustomComboBox { textRole: "name" valueRole: "name" - -// Connections -// { -// target:walletBalances -// function onRowCountChanged () -// { -// console.log("WalletsComboBox: overviewWalletIndex = " + overviewWalletIndex) -// from_wallet_combo.currentIndex = overviewWalletIndex -// } -// } } diff --git a/GUI/QtQuick/qml/Settings/AddArmoryServer.qml b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml index 9fc830075..fe5944a6b 100644 --- a/GUI/QtQuick/qml/Settings/AddArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml @@ -158,7 +158,7 @@ ColumnLayout { var port = parseInt(port_text_input.input_text) var db_key = db_key_text_input.input_text - armoryServersModel.add(name, ip_dns, port, networkType, db_key) + bsApp.addArmoryServer(armoryServersModel, name, networkType, ip_dns, port, db_key) clear() diff --git a/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml b/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml index b95a3f977..8602c9c7f 100644 --- a/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml @@ -88,7 +88,7 @@ ColumnLayout { preferred: true function click_enter() { - armoryServersModel.del(server_index) + bsApp.delArmoryServer(armoryServersModel, server_index) sig_delete() } } diff --git a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml index 728d892b4..1c5992993 100644 --- a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml +++ b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml @@ -71,9 +71,6 @@ ColumnLayout { } onClicked: { - console.log("SettingsNetwork: radiolistitem: onclicked") - console.log("isCurrent = " + isCurrent) - console.log("isDefault = " + isDefault) if (isCurrent === false) { isCurrent = true @@ -94,9 +91,12 @@ ColumnLayout { { var new_height = Math.min(armoryServersModel.rowCount * 50 + (armoryServersModel.rowCount - 1) * 10, 425) - //list.height = new_height list.implicitHeight = new_height } + function onCurrentChanged (ind) + { + list.itemAtIndex(ind).radio_checked = true + } } } diff --git a/GUI/QtQuick/qml/Settings/SettingsPopup.qml b/GUI/QtQuick/qml/Settings/SettingsPopup.qml index 970b89ebd..73b0ef82d 100644 --- a/GUI/QtQuick/qml/Settings/SettingsPopup.qml +++ b/GUI/QtQuick/qml/Settings/SettingsPopup.qml @@ -14,7 +14,7 @@ CustomPopup { _stack_view.initialItem: settings_menu _arrow_but_visibility: !settings_menu.visible - property var armoryServersModel: ({}) + property var armoryServersModel: null SettingsMenu { id: settings_menu @@ -27,6 +27,7 @@ CustomPopup { onSig_network: { _stack_view.push(settings_network) + root.updateServersModel() settings_network.init() } @@ -101,7 +102,11 @@ CustomPopup { settings_menu.init() } - Component.onCompleted: { - root.armoryServersModel = bsApp.getArmoryServers() + function updateServersModel() + { + if (root.armoryServersModel === null) + { + root.armoryServersModel = bsApp.getArmoryServers() + } } } From 86af16f385c6dc1060d5446200054185c81c1efb Mon Sep 17 00:00:00 2001 From: dvajdual Date: Thu, 16 Mar 2023 20:43:36 +0200 Subject: [PATCH 233/436] fix pr --- GUI/QtQuick/qml/Settings/SettingsPopup.qml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/GUI/QtQuick/qml/Settings/SettingsPopup.qml b/GUI/QtQuick/qml/Settings/SettingsPopup.qml index 73b0ef82d..841e0445f 100644 --- a/GUI/QtQuick/qml/Settings/SettingsPopup.qml +++ b/GUI/QtQuick/qml/Settings/SettingsPopup.qml @@ -104,9 +104,6 @@ CustomPopup { function updateServersModel() { - if (root.armoryServersModel === null) - { - root.armoryServersModel = bsApp.getArmoryServers() - } + root.armoryServersModel = bsApp.getArmoryServers() } } From 6271dc461189f619b948da12ea962b38fa33c987 Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 16 Mar 2023 18:40:17 +0100 Subject: [PATCH 234/436] Selected wallet sync; font fix --- GUI/QtQuick/QtQuickAdapter.cpp | 32 +++++++++++++----- GUI/QtQuick/WalletBalancesModel.cpp | 11 +++--- GUI/QtQuick/fonts/Roboto-Regular.ttf | Bin 0 -> 168260 bytes GUI/QtQuick/qml/AddressDetails.qml | 20 ++++++----- GUI/QtQuick/qml/ExplorerAddress.qml | 3 ++ GUI/QtQuick/qml/ExplorerLoader.qml | 21 ------------ GUI/QtQuick/qml/ExplorerPage.qml | 3 -- GUI/QtQuick/qml/ExplorerTX.qml | 5 +++ GUI/QtQuick/qml/Overview/BalanceBar.qml | 8 ----- GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml | 14 ++++---- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 16 +++++---- .../qml/Overview/OverviewWalletBar.qml | 10 ++++-- .../qml/StyledControls/CustomHeader.qml | 1 + .../qml/StyledControls/CustomHeaderPanel.qml | 1 + .../CustomHorizontalHeaderView.qml | 2 +- .../qml/StyledControls/CustomLabel.qml | 1 + .../CustomLabelCopyableValue.qml | 1 + .../qml/StyledControls/CustomLabelValue.qml | 1 + .../qml/StyledControls/CustomMediumButton.qml | 1 + .../qml/StyledControls/CustomSmallButton.qml | 7 ++-- .../StyledControls/CustomSmallComboBox.qml | 4 ++- .../qml/StyledControls/CustomTabButton.qml | 1 + .../StyledControls/CustomTableDelegateRow.qml | 1 + .../qml/StyledControls/CustomTableView.qml | 4 +-- .../qml/StyledControls/CustomTextArea.qml | 1 + .../StyledControls/InputOutputTableView.qml | 4 +++ GUI/QtQuick/qml/TransactionDetails.qml | 18 ++++++---- GUI/QtQuick/qml/TransactionsPage.qml | 11 +++--- GUI/QtQuick/qml/main.qml | 12 +++++-- GUI/QtQuick/qtquick.qrc | 2 +- 30 files changed, 121 insertions(+), 95 deletions(-) create mode 100644 GUI/QtQuick/fonts/Roboto-Regular.ttf delete mode 100644 GUI/QtQuick/qml/ExplorerLoader.qml diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 8ed694386..ca80b6931 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -173,6 +173,14 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) { setSetting(key, settingsController_->getParam(key)); }); + + + connect(settingsController_.get(), &SettingsController::reset, this, [this]() + { + if (settingsController_->hasParam(ApplicationSettings::Setting::SelectedWallet)) { + emit requestWalletSelection(settingsController_->getParam(ApplicationSettings::Setting::SelectedWallet).toInt()); + } + }); } QtQuickAdapter::~QtQuickAdapter() @@ -927,6 +935,11 @@ void QtQuickAdapter::requestPostLoadingSettings() setReq->set_index(SetIdx_TransactionFilterTransactionType); setReq->set_type(SettingType_String); + setReq = msgReq->add_requests(); + setReq->set_source(SettingSource_Local); + setReq->set_index(SetIdx_SelectedWallet); + setReq->set_type(SettingType_Int); + pushRequest(user_, userSettings_, msg.SerializeAsString()); } @@ -997,6 +1010,8 @@ void QtQuickAdapter::walletSelected(int index) hdWallets_.at(walletId).watchOnly }); } + + settingsController_->setParam(ApplicationSettings::Setting::SelectedWallet, index); } catch (const std::exception&) {} }); @@ -1011,11 +1026,10 @@ void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) QMetaObject::invokeMethod(this, [this, isInitialLoad, walletId, walletName = wi.name] { hwDeviceModel_->setLoaded(walletId); walletBalances_->addWallet({ walletId, walletName }); + emit walletsListChanged(); if (isInitialLoad) { - requestWalletSelection(0); requestPostLoadingSettings(); } - emit walletsListChanged(); }); WalletsMessage msg; @@ -1718,12 +1732,14 @@ ProcessingResult QtQuickAdapter::processFeeLevels(const ArmoryMessage_FeeLevelsR ProcessingResult QtQuickAdapter::processWalletsList(const WalletsMessage_WalletsListResponse& response) { logger_->debug("[QtQuickAdapter::processWalletsList] {}", response.DebugString()); - walletBalances_->clear(); - for (const auto& wallet : response.wallets()) { - const auto& hdWallet = bs::sync::HDWalletData::fromCommonMessage(wallet); - walletBalances_->addWallet({hdWallet.id, hdWallet.name}); - } - emit walletsListChanged(); + QMetaObject::invokeMethod(this, [this, response] { + walletBalances_->clear(); + for (const auto& wallet : response.wallets()) { + const auto& hdWallet = bs::sync::HDWalletData::fromCommonMessage(wallet); + walletBalances_->addWallet({hdWallet.id, hdWallet.name}); + } + emit walletsListChanged(); + }); return ProcessingResult::Success; } diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index f0b873de2..e2829d684 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -90,13 +90,10 @@ void WalletBalancesModel::addWallet(const Wallet& wallet) } } //logger_->debug("[WalletBalancesModel::addWallet] adding #{}: {}", rowCount(), wallet.walletName); - QMetaObject::invokeMethod(this, [this, wallet] { - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - wallets_.push_back(wallet); - endInsertRows(); - - emit rowCountChanged(); - }); + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + wallets_.push_back(wallet); + endInsertRows(); + emit rowCountChanged(); } void WalletBalancesModel::deleteWallet(const std::string& walletId) diff --git a/GUI/QtQuick/fonts/Roboto-Regular.ttf b/GUI/QtQuick/fonts/Roboto-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ddf4bfacb396e97546364ccfeeb9c31dfaea4c25 GIT binary patch literal 168260 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

S&jh1n&JeeMOkU4{=4@cYr6k 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≤FHXCuU9Qce=@vmZ{%9^5??OaVQJ8!4u8-w;yt zGSf}w{_*50pIMtH))x&$Q}axgpy4z3*ZNBi`SbQCA6bGSU<$bp;prp9IP*#G5;tDF z!#;m)YCm)K?3H1p9|vVdnN*ofj-$y*meTV~S;HwjPnNth*M{+|_sp6PC(Trj<o-- z)0y^aD}vzUH`&)RDUAL@>zjYZ7)trPKdc188#9mmW|KTF;z^`d=eQ4^87+tnf_oLX z<|Fnq*c5&#`g8WP*%a|5n}RN~oc&6Al_EB=Dg5gAHlDtNO@V6KmJIQvlwAHGw@pm{3FdkUYpWt5%3{x`IDO*x<(6{-@Y*oe8O++&}qWU|jz zve`dUa)g5K2xZ3dM444D)r-B4T9AEFwJ7_NYAN<*_=OQgtxh{2=T%Cs)>3P+udCK) zKS&+Mei~Y=q9$weg`$0hE~RKcqAMxrNr%`UVa-y}Zfej_OVI4>?`kRR)3glsSy&$x z{WI3P6{)GP|3arV(H_W6|3<&aK1xq#pQ%4!|A@DM6pS~8p}FJ}f&3AoCdWl+>7T@A zwk>R1*?ty3OPVuptHyN;e6tB&*d}K;oD06T`4ar82L^ZUDQXYJl?&T)Ka%M?X-b3(XHe;A)T=VtjsV@my z)bBo{u28Z{M754+9r1#AVQ8QlxU==e;ERFNUl!E;mZ43s+y|Abzq-vP&Nej&e7(TyYhKT3nAB!knQ?CV-d|IoHlsKZz>ejd0v*qZnEWM zyaz3~cR?P4LdUyH32NW^V$j0Y zw*v=LU-&9`TANnTX*HBtDK}YWPb-l_3zJSzMz(QlN)S9PuU*Y6l9F7Nn`~`K1(|1? zU~ID#Z&926wjl4UKqF_m+F%8(}EUCt_*4c-$w)_(JU|vpkgE*lb=qV=OX5Jof+kC-2Mq zli!8*{23oUEit(~iO;+K--pJ^|D4uC4U&eovo00jvRPvW`{?ni5PR|qbKld;9`93{2zA>&oJ$v5K zv%HqS)t{I8?{WOHZlZA)t~UADup4~!;lKSe!f5O7^HLi}pyoC9*Nu(FUgNCcG}gn% z#f+`SN#i!{j$g3+<4N>3NeiPEa0$uh=W?&De?E0RSD&{x?ipAVUy5~^x4l(`QOAEDYB=rPnEQV-g%NMm(u@D9-cICf!)l>lyh)F;(xf8 z7BpoPvj-yzT>5wE`JL4N;mVUf8ROLL|fvTu?iXDH`|WbFU>@Bbi2^K_s5&v+`kjNS5gSD*JMf8m(A-8EKA zt;YC4_Cxcpm^m&YTmSw?{~ni@pYbJknPWHU6fA_^%(hF27nno8$oDNvi!yxSxtu7E zW?WTN6V>^8&MVlIYhp2~jTK4S;p$c$FXt+G-10ZYfntV-ouOJjX%wmL_h ztA44@Q|GG-)UVWq`PbH-uB)lPs{7R6)Pw3_HB3FGo={J!r_~7coO)ips7CRnju=*s zW7RnIrkbGMW-Tq5b+o&zprx{Umd>hKHfv=MSSQP2b(!~yc%{Re6|q9Bi21QvRzfSO zmD0*+<+KW#zg9_mNvon&(_Uuntd=(0vr@(i{CsmYdXZh4!|X?Ol-eejQDr5!(y2a!Yt5NCd+j9YjYgE}hx@ zMOU@}(VefKRKjlA3$E$SRteibvQ*b1?Rd!NzA1 z0RM~S5w4Y_%&7BgJ)eL1-^YOoT{N3;!jMY$N~8-m3Rox z77>r&TR-s_-Yq6_;8}lRz_(Qt0pC_rba?k=#iG^G8nN=(R%@sDXN^9e^@k#~lL+wK)04|@eRN`HWwMuo?ch@V8v`yM3r7^b1AC)HB7Hx~tRD-vb zW^yf8X#sEVS6ac*hm>~MC{HLIwUgQ@r5o?2oKt%6c1pC;3+}$6^oGN)Dt+McIHj+4 zOG{D)vO;T9hRan~Wdxk>Rz|Xd`cN6AL-kPQI`5S1 zRATkr`fth&{h)qOxvd}3k0^KaWBN%YNk6ThR_^K%`dQ^3Z=PIGoLE|;lvLh9xu&G) z@p`=C(jB@(aqIW=drG>_rex^ZdN!8if}#;m?+V@5cl%2}}XA z!7bGDG zSPRyH@4$Mn!AMazg73j5@B`Qieg@mXFJL^2;{TkTMPCI7wTvyX5; z;ctWo2oG`35pWb72jSopfDYl404*nqGh&u9$zoqK#0QuLOfHE0WhKqnx7 zpR_CJ4&Zqmp4Z<7eLz1j01N^{z%b*UJ_3vcqrtmi92gHKQm4saD)@jtw~8{rkNO(! zTMssoW-}o?$NTdo^y8!p2WO2iJqp~z_D~<0aYZ!2=Ghb-v^jHuD9&SyD@tkJKx<4G z1X4s1#<(JkXGPRiMm#d*3NqyiGUbZq&sUx+5%&_PCyHpK(Ov@$!0VtPXau@|H$Yb~ zpR}vNT5yy+qRHb5xC*Wlch5-DGK_eA0+UL}!ed5~egd523z%m`5j_gr zW3E@8+JsV@RBCdOnuJo5P->D&O+u+jD5bwh>G>oeCT7$MA2=oE{zyL4=tO1+BR_fgfDmkH& z6Dm2Ok`pR9p^y^_IiZjf3OS*W6AC$@kP`|yp^y^_IiZjf3OS*W6KXi2h7)Qyp@tJ` zIH86UYB-^W6KXi2h7)Qyp@tJ`IH86UYB-^W6KXi2h7)Qyp@tJ`IH86UYB-^Q6ACz? zfD;Nhp@0(#IH7penziS8uoKV0C1)Na8 z$vFNdH7LcCIb&>bGPXDwTbzt7PW4al5Ip9|)CxK5MBX})kxt~J6M5uB9yyUmPUI24 zMhBoE^2mt{aw12Zk}r)}jNr2vC1){8&SI3D#V9$;5vR?>o?FV>O);1IZPWHWMSDzl6X8H|vbjF6d(PMM4_nT#Bnj2fAY8kyP+BSVV=w?GQ#nMNj~KqjL=CZj+mQZo~& znTgcQL?UJ)5i^Pj? z=m2Je#b60o3dmFa8XN?NK^Qm&E&^(xVlPr-z#rfNctj0qfq7sBfHE5QXsN(W=?j9w zz!!7`oxvNR8|VRgf?l9EfVz5rFc1s|-+_J9trfMmQF|M;w^4f=wYO1w8@0Dldz;v2 z9D@RWP{0NSY*4@k1#D2j1_f+Tzy<|uP{0NSY*4@k1#D2j1_f+Tzy<|uP{0NSY*4@k z1#D2j1_f+Tzy<|uP{0NSY*4@k1#D2j1_f+Tzy<|uP{0NSY*4@k1#D2j1_f+Tzy<|u zP{0NSY*4@k1#D2j1_f+Tzy<|uP{0NSY*4@k1#D2j1_f+rq*WLJn_-`BZbYMFCZS^{ zi4(?c5o<)DMYNkTtKLN`f5FG)ftNkShbm)G(47Mv7DPr@}@g{kj7Ex&r;W0{yxIHH@T&k<>7f8b(sXNNN~K4I`;tB(;mA zc9GO7k{U%)i%3czNvR_#btEN@q{NYwIFb@aQsPKT97%~IDRCqvj-Ss)wyPI~&Lpl^zYAcuZ0fM&!g7Q#|S3{oqRQ6`R2CQd=7D6fNNpap0{ z+?#}Nfwuwukx?j)Q7Dd4D2`Dmj!`I%Q7Dd4D2`DmPThhW*lNTe+hdUJG0659WP6Mn zYQ!^dh-cmq&%7ZXshEgVOk~uGW7LXc)QV%&ieuD@W7LXc)QV%&ic=%O1#k&OgDc=F z$ly8DQ@sy<2Y>R6hv2ah!~7tg`9VDMgLvi#@yrk6nIFU>ffE_+;P1&JKnh_@4_aPH(d9b|HB7;%i8 zak>hS!+HTw$cSMSjnn-IOBjhr`9!@GD95$(#5V+uK~vBiv;?g|TMz^~abFkE6?6yi z7UN$G<6jJ;ZXBa-9HVX=V_^&ho4CH2y1@q58>(uKpLpD_N#GXBNF@oqTY4ad9TcsCsGhQnQOcpMxa2Zy`i za5o(8g2UZ#cpO~qr04j;(f8nJHyrJTqffxmE;!l_$GYK8H(VJ9SGwU!H(cn3>)ddi z8?JLR#>O(n#xlmnGRDR-#>T>lZaC2mC%WN8H=O8(<6Ll@3yyQaaV|J64vve1G$BxG4^9a=}S1ILQt7xZ$2SxW^6G#KARj+6^O?F+Y|uKNjwB!#Qzq4sX(fOpXma z#}%N0BA^7VP!f~^xGyVe1HiW& zA0j-4+>#?Mx*DzNPiv;rg5k8(dRl5dEw!GOT2D)@r&ZEvm2_GqomNSwRl;eNaHyLO zbvy6I3i9qNWd*>ory4rSA!Y&sMThnnF~GaPEJhnnl5=6Wa@4h6%ZSU405 zhhpK>KAqa9Q~PvkpHA)5seL-NPp9_b)IOZrhg0)(Y8+0D!1?_X)*d;d_9HBTM?y(Z3j8-S>`vU%1#|`70er?Nc#l!=9{l`t_C1JmIRl?a zzLUXJAZO$2iO-#p>&J-;2WR;r#RV)R7x_v}6vsCS6Tv->(}~Xl+1PFVBz(Z^O7;Ty zOh8Y5hc8v6nR?(BT6_~cMc$AW`y+3GIJ=lKB$=$6S`8!sXv93E z33_NVN+RbY-C4En0eS*vFqGECSYe~2Qm?%vqDUVDc(S+&B@)poY~1hUS{iBHgy|p? zWPxmOpEdbE2p@olAji0b9(xHL_LAabBx5tX%y?r{{Ea*4u$P$sNNTvyWiMe%i$Zpt zP?~Yv0<`5?AlHJ3Z-?&N0lZ24Ti|WbA3$B&!leu)-(g6S;Yjkaq#tLTVN8o)Op9Pl zi(pKPU`&fpL2W~k^+GDgzIB}=I8R8?*D$a3y2{8NAIY-MR%r;xt#T+dQesZCcUP33mq!))HOE9y1fv_aui-e^JOQY|VLM518wHWa^HW%z4{N((VC!!4a+<z|>8Z_$#ew4#evWaWdeXEh-%h_JJ9*KCDxd>w8#dfXnUP{cS4MGr&K z!&+s|e*{N4K0_DK!EkIDX=PU&s%m;)Yjz*Dk+ zr^8cr_$d{BvcXRm;T=1*u~8cvwXwk;c6h@MZ`k1tJ9F<0c*71)q)|f~JR#*mI&E*K zjqS9rowk*7BAvFCvLc-}O`|>2Xv;L((Lo#9X+Jw{XQ$RS+RZ_m*{QvacCyn(c069H zputt6b~QkK&;T?t5}-%|)VL)+=X@Dh33ifp7vXNgD6V5&W$oJ!N+s~7L0 zZB}PZoyHv;HU&s5=xv> z0blxnFMYrl3fkaxUwGXYUibZrWRjzn4c_&IqBi)}7pmIuj4uLJ8MV;yxYr}4h`UbQ zZO-ozW&rdjc-9x5_0=_Wsp9BeFMt<8X}-e8$~S!L3*Y*}x4!VLFMR6@-}=J0zVNLt zeCrF}`og!q@U1VcBS$7VD#;N^O15Nu8u?(yg%5pmC7c|EY`hWH2-{gRsNNhKV-&}i zIgTN`ZrVVe3uMmli<5#Wdhnec1x&r z2j05_@7;m-lAxBfqe>fU61GcTDE=7q_ zplK#FO`$Y$^yZxf*6ml(&sf_g*A#M1fhL*IBomrsLX%ABA^TwpbjXAbvae-Q=S=FH zNu5)ub0$wn;eD&_jL$tlPtYHm(NRJtkh9Y?&fOfR1IBxi1+u|?uKhvy06YXa=oY+} zkJjiy*T_Q8NJm?AF><@n6kUwmF0@1!TB3{5+l^M}LMwEk6}r$0U5wstMr;?Fo(m1n zg@)%s!*ikGxzOBPXlgDrH5a3^8!gR+mgYhmbD@p77@ggW%x<(UmtFvr1D}AE0DT6n z$t5a_rz=a@Xi3>=dmp;GGDqKj6IxX4xssvQwC4r!bRtGm}nX7M;Q@+RZFlzDMFVErZeu zm}ddZZ~gPU8{%e`obq2;{{H>@8c(f)p7%A}%!b{}hEw!Biy!adFxyRGwwuCCH--0G zt;|#l0_=*kaws;jP;6qMyjNKm8xJ4LV0Ggy!lyQ#P_c^h1HfbB31!`8E3F@ftt=E9 z?-ly&7G%?Q@jGuhXh1i%E9OcB_MUR^Sq0+!vFB7GYy-M;eK6q=FpM-Kz`GnzAbuA1 zo-e>0Fc*9Y{=c>Zp*g7E0;r{;J*c!KZ%w(?^UX>0`FgH7NE@VwQJJR8wo?%5CM z5$Yk*@@57$z)HqlMNg!zkkjbcS(8XEU#C@{(FaHhE=}S2lTNlb6&KvdJr(yt1*_ zc;1`$7u|U44G&R&0o%c!;30TyglHCHvE~JQ zKtWI#Y$AROI0+(+#q{J5dT|K7ECj1=2v*$?thymsbwl*Gz}sLDSP!-de|Jc9-1J$t{`OlF2QZ+>*&HncVJ@TQXnJ z@RTb}K9>(=#PEIo8}N=IDTx09Z-I!`@YE1A%Pwe9FY?~XW!6O8tfr;1zEo61FlUx) zqLJiwp7LF1j(CsR$$jH0Eqj%gjb`2#!`y(izE3WA<}o%C1?#34_LXv2uWB3dN?rOmwjZSxVAYRj#43Y~ zL&|8QbDikD@+Bgkcn?PF~ch2)&^wA zw<45s4E5_k{R&aimP(hLbm$nS49aoQV_v1l45GdTsIP^R*M+86@Fpq1j7PrnSj4zs zzW3OXRjyvF1@tDA?>mlz!k_Sl$PCs?XY)P8FVTGV@qXt)u6y3^IEnX2VOsgFI1cqs zVmUiy{6-D$(%NTf?O0m-l=2m=d&4+O3!bF~BjJzAP`5V{s2{et)zEt%e6b&jdU)kD z{85}12!{p{)a^T3pgVQ@n7T#Ke(}^TgVvZzYedi*U8&OoC5HEDlHpG;?s7w^bf}cc z-RV#u6AIiVRWx6}>B#f?G4qXqKYb{xTo>HOJ@>fBZO){c&}XEroHarZUnu;Ni?lt! zZT+CbK1vpWC*eIjzwaCSxo;<}62-lzdERxHl5f^WZrfBep304RR`|xNFSEgkfDr1!{K7)=q9&@nWgf^=cfp5^BrxG zEl%)W|0$?=-S~<6M8M&9o>}z_rDUE}Pbh$OrZ+xi{owxkLZ`)h8G9(tDKRc*A1z*; zT)WWX3u*BU)b~I2&n0B}a zC2qmJ3A9%N(u&!i&}r#Y9A$7<26yqbA7c2Dk6h)YO;kg*!5HV+DvSPn9qJ|12dtXu16CdH zuifNyh^>~8Uwf);e&?wU7QHKYh4C|>@Ix$HeG!L6?=}3sZ1@^F*;??8#xzzGerIci z@7E(}lp_q$Mt+HrUm%y>U%{sLS3A@DtGy!qzB-wHUvHRxU)@c=uO6n~*PEu_7hYfZ zec|G#zKzpr_GA#I_uNDMRmzDAfHU+cCYv5#Q%#Sr5AgWd3}eM*9q~1>CN@4^f44+rZ?Ad)0^vr z>CF{xdUKt`=P+5EGJU#En?7AC<)2^y!K;eY#>zpROCGPgk7j(-m*} zblo(4x^Cf*a0wdKEN%y$YGWUd2pbuS%w`S7p=J>m}3ItBUFCRaJg% z7=JM7c%)4waw^zRBX{kwuq|E`Xve^)otzpFd`T@RHvP0y}D zrf1g>)3a-Y>De{X^z0gCdUlOBJ-b$#o?WX<&#r&zL-nD`Px^3uxU$*w^4em0d4-x@ zUOP-LuU)2>*KX6x>sQmuYp?0$wa@hOI%Ilz9X7qZ!b~r(qo$YF3De6f-1PD~ZF+f~ zF}=JZOfN51@bL1A(vRZh6^)nISvyGK) zh0Il^nEkV~**{C0{WHMqp8@pGD)iN=Y~}F4tj4%iolT*yy^Q>=%~k+Cp$>P}Wh+Jh z;#*<#uh;PGlwO`iun0CLO%t~Ac!f2^7q}Ul^bSMQr}wo$N(Zr7@dFJ;+O%VP(d_@; zX8+ge|2>cqZ?b9lYW5_J^a_2!lm$M>g8q#01K50!3Ii#<^bPeg<${7-*um^zC!31b z@Gi=>n@u$(g^wvIbW>7znUccalo7>{5I3oJ5}QAA!p2@oiZZ68zz>Yg%ajxqkrX+i zBGSSTUZ%XLXv&Ld`U}~azsIn^yjVttQ{0n2I5Ov!t^CAt;|+tivZK3 zw6ro0DHC8ynE+GDR5qndVWdogcu7fA5=8}MO$wuoQ*ok;^0p1f($lnpDR(NEa;LB< zcYIB`Q{0q0^80Te^ZhsJX<7ui^Mz3HiJmQr;}<RBz3?s-o10swpN)$y9 zkSHoB5*=2DRX~HXh=_oK#)rN<#034gA`*j3UU-`5%rN8oJf8}P3b=qED(<3wqM}h; z;ub<=f8SGm@7$RLOybLb?{$Cr^y%8Vx~lqAb^ZF(L0kF}(pl!05pp?rhW9J{3iwCC zHN0QxSHeGr_G(lAIA5j3L5H=eU&YsHanNLK>eujb@n_tiRem9`mX_ES8+;5Rvu%fa6o17`uYrd5` zE@Hjr2I!yvl8}pKF}j|2$Q?ZCopL9!?gE=?!ivqmf?py_A~h+`(&}jR@!P$^iajbuKX^TN-yj>%DtwOFjEroQjZrIl zl$UXT1?|;CtY3kmHw@j34r`IT#XnXB@;0+&E$L(4g}yKE^F&*~*t~oo%+<2q^oQgP z-D1-GR6dOkWmV_Th=qnRIsBU0l4A6Xzacd=O>qAcm|PRtF5Ah;w_tN#cE}FW*$GDH zWtZ%N-z$4bb04!T8G0|)*ksLSiJGu(v!bQfKpA^!krrW#1x;mW6K#SOz^0&k9km&A za|PNQl&_<w*l?*+7@duv6h1Rc|A-IgKr1==e0dnZer~K3g}to zza#wNpn+bG&?DeGfeL#4f&KvgNYFvAN9j@Uok0n`9<4{i9|KzGu@BG%{#Z~$uU)k( zd^ha|f1Dl%-(9=I_s|~jJ+)_)(&L#o%4jd`1^+|lk1~3Ko&bL$^GF%(t-aw-(v#p> zyb%5r=9MzqNBh9{)xPkj>Z$OjG0&9Ie%cTIbmp5f^y_7m)c_qpDGk(t@Pl*^{9qjn zKSYPX55*3W)3fv}_;M|WAExwBI$VdtkI)hDBXuPFC>;fl{x_6SLR4s@1n5k(oQw1l zW+4moQna0mbQXWV73gfVo{RJ{{(>v8F$DPQm3n2=jy1Qhidu#BGgYtFtC?Aur}J<} zYn*viw8n|GSQkgCcYvsRy;B)?>s@*m&-H8lH91+LOUMIyI3=!X`)#UMYB9A(TDY6+?VMx=yF|7$Q8N*&Fn|@QBpwToHQAWklQu7 zhNpWHo$W*QDdtcM^l5ar4^{ryg{v44y{dem6g>w4xsH|PdZdk&3D>}l$Y_Fo^G zmyK-f!YZ5Sreix3-E??#({V>PoiOO8^CjST!avdf=e9i8ihj9O&iOmf_GRL;A(C_Z z+VFO5hiOn2GJU{YH^_!*9L_Bnk=a%n z=wA{`wK<2C-XVdS3rj_?CWyJ&W;Eek2xD&flBl0!^D|$i_7Yq7RuUFEUp65~AW5qE z>&Dr)&8I6NPSRp>F|3Si%jYPGowy!|wxxyJDu>Nz z=SJLO<)Q!Ms8R=aAus1Sy6!HxFJ6aH?h-Wit-l+Dll=G!|5cQwm_t$zdw5epb z`7GOuvoUh+mSS$(pIgo^e@;Rr*O&$hd(!@M_poyZ?u2ceu;nBkxLTd-y1i8LOhw2Z zduppOD_fJ+wq{cz(NpmC<#$pu?Wp^@TauQigd5W?Ofo0ETmiDsu5xlgNY_d^cUWng zl(NmJgf?YY7Rxr1(1~nLWTC~dRUWNB$hAKUmuqi{{7qbvwvx0EOT(TkqNgdSJrWsh z{c$d>zxSNG-+|9b9&+t-|L6QWlgnkUT_!bQWuHHiwrTCt${^pzBqf#HFGuUHEmv1c zosl0glX>NK>Gz+hV!Lv z=nV56In(I4Sr<>3>CT@u>)5Vt3bdP>4n5AzhIV&zpgr7NXiqmEdc3=Fw#8b=d`;{c zVkMvxb3VOXA9n_pc1An1EjH6#;pV#Q+yb}QEpZiCR$J~?yJy`d=54B|j!jXz@0im| z{ruC)heP|9_bqk12Mrlm>PHXmJF?UtSw3VC{P6Mt_)<2x+D+=$QC8+=eW36j7KhQ8 z3oS~KTLs~;)?mDav^UN1RvWdpXzz+q8=*L)j!}~}w#oq8g*DYYfFEshf(&ek?vd~o)9PWF67_B=1^KliWB;STZ7 zYQrVhbF%+oia#B%E)TF9jQl91`Y5!U3S$qh>tgE!RDccuK7p&R@|p>2fl_vJeE z9l7@L@Mx#|*k9saq7}dBUU1L5jqW+O!L4`CGNahdcV%|5ll#d1-hJpka9fy ze#ac;JML}P!P`vRf5W}*UURRySFmfb)qUb;`OExlf4RTZ|HPML<>E7DF8|=Za9?7R zkCn=>c(Dz87u(&R-M4Os+v#>;_hOIR%K*sfUW_?nbJb%t6WbRVEMFA*2L42U5ObZ4 z{K5JyRxq0SX1+OgFp9D7*AmNyt$iDRsLhWtJJwB(lkU<(ddl(AOMWOP$cfThPLh-5 z6zL;<l43)E_T!t~1HbO?qC>bqh%NQ9eF}%RIS8ekMO>z-C|48})hYD!!?eM{fg zclfIQoxZE@VR>Y|*o#dVs z>)uFeT;HM2zp^LD*8EP(Z?49%OBscH+v;`ut@*kwWxuVUm=L)K$D88U;}7Gl@#pb3eDEmN zV~f(w(yi0&(#NEGr~9PK(&g#V>B;G7>DlSI>G|pF(>JFVrf*N*lYSumXnJk>Wu*E< zq^?g-j$+m~&0yoWFtl-Vr|&CbPT#m9knS|kU-VTZ>GA1_=_y=~ci6vy&Ipu0iqhl3 zF*;*Q$EQca9pk&e4F?@L9aN>iKf|BtFYr_Rg?_5P$WQYZ<690wFx}7aGvJ4^hT<51 zt{?43_)&hOAB)x1bNo0z#FzO2exM)Z2lKt(+7I)S2z@ehy^H)zy-9D@TXccm>L=?$ zy^U~#2|0jRlcH9B7~#tZT}s+xNiCoH*`z#%xr@5%_uA^c%?RCwv~Sgg`P51KwlJzF zVRUf_VOkNgH8X*Wc=i%^HEn=1$1$NFv#%JRZXFf6b#ASD#<%sQ{xILpxAz@9IAhv_ zwVWKy!P3=ie~Rzp`}$M;X}%vN{{O2A-|>HNRbjKcRR}iRA58cRFyS)(h#km3vV)@` z{OM@8@G$V;5um}N_~Ykn5aF?)!RLSi|2)E$DOSR+k8X%=iWWo*`GA$x!OiD2NJ}==(a}n_tf@r3}HJ4CQ)u5BhK{in`@8DxJmUqAex3Z%4 zHc&hV+J}ua{I(1Em)+{Kjlo$59BH~ z3O+Sb$ALCE9Rp$mr&Dw~v8IAMT@E@lTjvmRj?UHjdLuo=V%!$!?S!~p?*<`Cffn7z zzb6lZ_4q(tKz$x1#m6|FAjE3WoQ;gr-h_uTru-0uCS{b7<96K*4^4UMykUf8_Ef`E zvs9}T{eOz5;#o6dGd_m(uLOyIo)PnCt9^GR_uQKTf54JC-(TV2doV>gun!1yWuREq zqn&g?BG`B65&WHU6#t;~$jXcXSqWh?OlL*|{8Yk%hSEz#ezKoTe>2n11mn7i9*Yqy zd*V03pNr(NuU6|>Yx`MxPkLEm*6ClZcO|wVCCR*dYkELOoFTNuVf3^a`t5W1&tVch zZ_|+Hri2!^$StC6KjYRBx-I>m&2QQrEpKz-D-CsxYS04ZJw-(qz+Vfk03jtV*r>(53tFwefL8j~L#%4}8h@j?=ox{(0a~HF z58UxBXqEm7%4*ZlO8;?)W&ab`_)mh%XTin(v8j>w%tapxzF!C5KL+1N%te0*t?;)% zt7uIURgvDU7K(Oj=`ApS5LdhNZO|%kOS|(5Xrq__<{SWgME4fN34DOGc zJ8KYIm{lRnn(TdUw@|zhb{~6w{?>vn<a@nViJI7q$NdF-r7VZ__w7)-pIos=u&Sjph}lOtHFKkj{A%X?;!cN zwpfGgz*kbiy+LqC7IODSfnROBw;WdLguq)%s!+zR)J1b>mHq}=4O(oeJ!LLJOC|g| zbCFk}75<^%a!GKpHd+C8Zl!b?v`P+#R)Q{D_@j&$M&HoRf%3NjIk)n!^!652=#QXF z{oBwg{dZ`!j)qq1cxVk0)WVE|F4c3PReCnG5?vJY9Sf~MH^qE^46V}1&`PAO`A&gW z=v3%Zod&Ja3!s%c16rdOLM!wl=u&0ekMD1xmF@}JY*{qOS&0sEtHRY#XKiJuTL~?5 zYoMc@m8Rviab$neM##RS=_$ML|6K-43nwxMWmYs;7ai%>0=YSeQTh { expSearchBox.requestSearchText(text) } } -// ExplorerLoader { -// id: explorerTX -// } Column { anchors.fill: parent diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index b7abd3d20..101fa52f0 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -42,7 +42,9 @@ Item { height: parent.height color: BSStyle.textColor font.pixelSize: 20 + font.family: "Roboto" font.weight: Font.Bold + font.letterSpacing: 0.35 verticalAlignment: Text.AlignBottom } Label { @@ -51,6 +53,7 @@ Item { text: tx ? tx.txId : qsTr("Unknown") color: BSStyle.textColor font.pixelSize: 14 + font.family: "Roboto" verticalAlignment: Text.AlignBottom CopyIconButton { @@ -211,6 +214,7 @@ Item { text: qsTr("Input") color: BSStyle.textColor font.pixelSize: 20 + font.family: "Roboto" font.weight: Font.Bold } Image { @@ -259,6 +263,7 @@ Item { text: qsTr("Output") color: BSStyle.textColor font.pixelSize: 20 + font.family: "Roboto" font.weight: Font.Bold } Image { diff --git a/GUI/QtQuick/qml/Overview/BalanceBar.qml b/GUI/QtQuick/qml/Overview/BalanceBar.qml index 24f3ccbb2..1d927a1ca 100644 --- a/GUI/QtQuick/qml/Overview/BalanceBar.qml +++ b/GUI/QtQuick/qml/Overview/BalanceBar.qml @@ -36,8 +36,6 @@ Rectangle { width: 130 label_text: qsTr("Confirmed balance") value_suffix: qsTr('BTC') - label_text_font_size: 11 - label_value_font_size: 13 anchors.verticalCenter: parent.verticalCenter } @@ -53,8 +51,6 @@ Rectangle { width: 130 label_text: qsTr("Unconfirmed balance") value_suffix: qsTr('BTC') - label_text_font_size: 11 - label_value_font_size: 13 anchors.verticalCenter: parent.verticalCenter } @@ -70,8 +66,6 @@ Rectangle { width: 130 label_text: qsTr("Total balance") value_suffix: qsTr('BTC') - label_text_font_size: 11 - label_value_font_size: 13 anchors.verticalCenter: parent.verticalCenter } @@ -86,8 +80,6 @@ Rectangle { id: used_addresses label_text: qsTr("#Used addresses") value_suffix: "" - label_text_font_size: 11 - label_value_font_size: 13 anchors.verticalCenter: parent.verticalCenter } } diff --git a/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml b/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml index 6636db681..1265be227 100644 --- a/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml +++ b/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml @@ -16,12 +16,8 @@ Rectangle { id: control property string label_text - property int label_text_font_size: 12 - property string label_value - property int label_value_font_size: 14 property color label_value_color: BSStyle.balanceValueTextColor - property int label_value_font_weight: Font.DemiBold property string value_suffix property int left_text_padding: 10 @@ -39,7 +35,9 @@ Rectangle { leftPadding: control.left_text_padding color: BSStyle.titleTextColor - font.pixelSize: control.label_text_font_size + font.family: "Roboto" + font.pixelSize: 12 + font.letterSpacing: -0.2 } Text { @@ -47,8 +45,10 @@ Rectangle { leftPadding: control.left_text_padding color: control.label_value_color - font.weight: control.label_value_font_weight - font.pixelSize: control.label_value_font_size + font.family: "Roboto" + font.weight: Font.Bold + font.pixelSize: 14 + font.letterSpacing: 0.2 } } } diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index c41797184..7c5e217d4 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -11,10 +11,10 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 -import "../BsStyles" -import "../StyledControls" import "." as OverviewControls import ".." +import "../BsStyles" +import "../StyledControls" import terminal.models 1.0 Rectangle { @@ -71,9 +71,10 @@ Rectangle { Text { text: qsTr("Addresses") color: BSStyle.textColor - font.pixelSize: 19 + font.pixelSize: 20 font.family: "Roboto" - font.weight: Font.DemiBold + font.weight: Font.Bold + font.letterSpacing: 0.35 } Row { @@ -129,6 +130,8 @@ Rectangle { model: addressFilterModel copy_button_column_index: 0 + text_header_size: 12 + cell_text_size: 13 columnWidths: [0.35, 0.15, 0.1, 0.4] onCopyRequested: bsApp.copyAddressToClipboard(id) @@ -159,9 +162,10 @@ Rectangle { Text { text: qsTr("Non-settled Transactions") color: BSStyle.textColor - font.pixelSize: 19 + font.pixelSize: 20 font.family: "Roboto" - font.weight: Font.DemiBold + font.weight: Font.Bold + font.letterSpacing: 0.35 } CustomTransactionsTableView { diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index aaa29563e..2ac4b3a40 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -43,6 +43,8 @@ Rectangle { textRole: "name" valueRole: "name" + fontSize: 16 + onCurrentIndexChanged: { bsApp.walletSelected(currentIndex) control.walletIndexChanged(currentIndex) @@ -50,8 +52,10 @@ Rectangle { Connections { target: bsApp - onRequestWalletSelection: (index) => { - wallet_selection_combobox.currentIndex = index + function onRequestWalletSelection(index) { + if (wallet_selection_combobox.currentIndex != index && index < walletBalances.length) { + wallet_selection_combobox.currentIndex = index + } } } } @@ -77,7 +81,7 @@ Rectangle { anchors.right: parent.right Controls.CustomMediumButton { - text: "Wallet properties" + text: "Wallet Properties" onClicked: control.requestWalletProperties() } diff --git a/GUI/QtQuick/qml/StyledControls/CustomHeader.qml b/GUI/QtQuick/qml/StyledControls/CustomHeader.qml index ea72d1bbc..c4550677c 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomHeader.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomHeader.qml @@ -23,6 +23,7 @@ Button { contentItem: Text { text: parent.text + font.family: "Roboto" font.capitalization: Font.AllUppercase color: { parent.enabled ? textColor : BSStyle.disabledHeaderColor } font.pixelSize: 11 diff --git a/GUI/QtQuick/qml/StyledControls/CustomHeaderPanel.qml b/GUI/QtQuick/qml/StyledControls/CustomHeaderPanel.qml index 8dab2e4bd..21c9b1b98 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomHeaderPanel.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomHeaderPanel.qml @@ -37,6 +37,7 @@ Rectangle { font.capitalization: Font.AllUppercase color: BSStyle.textColor font.pixelSize: 11 + font.family: "Roboto" verticalAlignment: Text.AlignVCenter } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml b/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml index 79718d5ca..7de7addd6 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml @@ -20,8 +20,8 @@ HorizontalHeaderView { clip: true color: BSStyle.titleTextColor font.family: "Roboto" - font.weight: Font.Normal font.pixelSize: root.text_size + font.letterSpacing: -0.2 leftPadding: 10 } diff --git a/GUI/QtQuick/qml/StyledControls/CustomLabel.qml b/GUI/QtQuick/qml/StyledControls/CustomLabel.qml index 088570855..1e18f5dd9 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomLabel.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomLabel.qml @@ -15,6 +15,7 @@ import "../BsStyles" Label { horizontalAlignment: Text.AlignHLeft font.pixelSize: 11 + font.family: "Roboto" color: { enabled ? BSStyle.labelsTextColor : BSStyle.disabledColor } wrapMode: Text.WordWrap topPadding: 5 diff --git a/GUI/QtQuick/qml/StyledControls/CustomLabelCopyableValue.qml b/GUI/QtQuick/qml/StyledControls/CustomLabelCopyableValue.qml index 97a33f77c..5d2b80773 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomLabelCopyableValue.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomLabelCopyableValue.qml @@ -22,6 +22,7 @@ Label { property string textForCopy font.pixelSize: 11 + font.family: "Roboto" color: "white" wrapMode: Text.WordWrap padding: 5 diff --git a/GUI/QtQuick/qml/StyledControls/CustomLabelValue.qml b/GUI/QtQuick/qml/StyledControls/CustomLabelValue.qml index 3b021ddaf..1f3984d66 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomLabelValue.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomLabelValue.qml @@ -14,6 +14,7 @@ import "../BsStyles" Label { font.pixelSize: 11 + font.family: "Roboto" color: "white" wrapMode: Text.WordWrap topPadding: 5 diff --git a/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml b/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml index 95752b620..4e3cbf7b1 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml @@ -26,6 +26,7 @@ Button { font.pixelSize: 12 font.family: "Roboto" font.weight: Font.Normal + font.letterSpacing: 0.3 background: Rectangle { color: control.background_color diff --git a/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml index c08cb873d..744cd9584 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml @@ -19,10 +19,11 @@ Button { width: 134 height: 29 - hoverEnabled: true - font.pixelSize: 11 + font.pixelSize: 12 font.family: "Roboto" - font.weight: Font.Normal + font.letterSpacing: 0.3 + + hoverEnabled: true property alias backgroundColor: backgroundItem.color diff --git a/GUI/QtQuick/qml/StyledControls/CustomSmallComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomSmallComboBox.qml index a85ac980e..1b0a0eca0 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSmallComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSmallComboBox.qml @@ -17,7 +17,9 @@ import "." CustomComboBox { id: control - fontSize: 11 + font.family: "Roboto" + font.letterSpacing: 0.3 + fontSize: 12 fontColor: BSStyle.titleTextColor leftPadding: 10 diff --git a/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml b/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml index 669a72cfc..f71f2726a 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml @@ -24,6 +24,7 @@ TabButton { font.pixelSize: 10 font.family: "Roboto" font.weight: Font.Medium + font.letterSpacing: 0.2 property url selectedIcon_; property url nonSelectedIcon_; diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml b/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml index 3a8a800c3..282e3d425 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableDelegateRow.qml @@ -37,6 +37,7 @@ Component font.family: "Roboto" font.weight: Font.Normal font.pixelSize: text_size + font.letterSpacing: -0.2 leftPadding: get_text_left_padding(model_row, model_column, model_is_expandable) } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index fb3d63be3..ce6c51aad 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -29,8 +29,8 @@ Column { property int delete_button_column_index: -1 property int left_text_padding: 10 property bool has_header: true - property int text_header_size: 11 - property int cell_text_size: 12 + property int text_header_size: 12 + property int cell_text_size: 13 signal copyRequested(var id) signal deleteRequested(int id) diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextArea.qml b/GUI/QtQuick/qml/StyledControls/CustomTextArea.qml index 0654d4621..e72e9f9c7 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextArea.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextArea.qml @@ -16,6 +16,7 @@ TextArea { id: root horizontalAlignment: Text.AlignHLeft font.pixelSize: 11 + font.family: "Roboto" color: "white" wrapMode: TextEdit.WordWrap diff --git a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml index 28788f2cd..db0899c38 100644 --- a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml @@ -76,6 +76,7 @@ CustomTableView { font.family: "Roboto" font.weight: Font.Normal font.pixelSize: 13 + font.letterSpacing: -0.2 leftPadding: 10 } Text { @@ -85,6 +86,7 @@ CustomTableView { font.family: "Roboto" font.weight: Font.Normal font.pixelSize: 13 + font.letterSpacing: -0.2 clip: true } } @@ -98,6 +100,7 @@ CustomTableView { font.family: "Roboto" font.weight: Font.Normal font.pixelSize: 13 + font.letterSpacing: -0.2 leftPadding: 10 } Text { @@ -107,6 +110,7 @@ CustomTableView { font.family: "Roboto" font.weight: Font.Normal font.pixelSize: 13 + font.letterSpacing: -0.2 clip: true } } diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index 6ce21891d..3e48f046d 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -59,8 +59,10 @@ Popup { Label { text: qsTr("Transaction details") color: BSStyle.textColor - font.pixelSize: 19 - font.weight: Font.Medium + font.pixelSize: 20 + font.family: "Roboto" + font.weight: Font.Bold + font.letterSpacing: 0.35 } Grid { @@ -253,8 +255,9 @@ Popup { Label { text: qsTr("Input addresses") color: BSStyle.textColor - font.pixelSize: 19 - font.weight: Font.Medium + font.pixelSize: 16 + font.weight: Font.DemiBold + font.family: "Roboto" } Rectangle { @@ -277,11 +280,12 @@ Popup { } } - Label { + Text { text: qsTr("Output addresses") color: BSStyle.textColor - font.pixelSize: 19 - font.weight: Font.Medium + font.pixelSize: 16 + font.weight: Font.DemiBold + font.family: "Roboto" } Rectangle { diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index bf68215cb..247eadde9 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -65,9 +65,11 @@ Item { Label { text: qsTr("Transactions list") - font.pixelSize: 19 - font.weight: Font.DemiBold color: BSStyle.textColor + font.pixelSize: 20 + font.family: "Roboto" + font.weight: Font.Bold + font.letterSpacing: 0.35 } Row @@ -79,7 +81,6 @@ Item { CustomSmallComboBox { id: txWalletsComboBox model: bsApp.txWalletsList - font.pointSize: 8 width: 124 height: 29 @@ -108,7 +109,6 @@ Item { CustomSmallComboBox { id: txTypesComboBox model: bsApp.txTypesList - font.pointSize: 8 width: 124 height: 29 @@ -141,7 +141,6 @@ Item { CustomButtonLeftIcon { text: qsTr("From") - font.pointSize: 8 custom_icon.source: "qrc:/images/calendar_icon.svg" @@ -156,7 +155,6 @@ Item { CustomButtonLeftIcon { text: qsTr("To") - font.pointSize: 8 custom_icon.source: "qrc:/images/calendar_icon.svg" } @@ -164,7 +162,6 @@ Item { CustomButtonRightIcon { text: qsTr("CSV download") - font.pointSize: 8 custom_icon.source: "qrc:/images/download_icon.svg" custom_icon.width: 10 diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index ea670c521..eb7ec7c03 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -38,6 +38,10 @@ ApplicationWindow { property int overviewWalletIndex: -1 readonly property int resizeAnimationDuration: 25 + FontLoader { + source: "qrc:/fonts/Roboto-Regular.ttf" + } + Component.onCompleted: { hide() // qmlFactory.installEventFilterToObj(mainWindow) @@ -217,7 +221,8 @@ ApplicationWindow { text: qsTr("Send") icon.source: "qrc:/images/send_icon.png" - font.pointSize: 16 + font.pixelSize: 12 + font.letterSpacing: 0.3 Layout.fillHeight: true onClicked: { @@ -234,7 +239,8 @@ ApplicationWindow { text: qsTr("Receive") icon.source: "qrc:/images/receive_icon.png" - font.pointSize: 16 + font.pixelSize: 12 + font.letterSpacing: 0.3 Layout.fillHeight: true onClicked: { @@ -247,6 +253,8 @@ ApplicationWindow { CustomTitleToolButton { id: btnSettings text: qsTr("Settings") + font.pixelSize: 12 + font.letterSpacing: 0.3 icon.source: "qrc:/images/settings_icon.png" onClicked: { topMenuBtnClicked(btnSettings) diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 8b8f7b56b..6af8519c3 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -19,7 +19,6 @@ qml/ExplorerEmpty.qml qml/ExplorerAddress.qml qml/ExplorerTX.qml - qml/ExplorerLoader.qml qml/ImportSeedPhrase.qml qml/VerifyTX.qml qml/InfoBanner.qml @@ -181,5 +180,6 @@ qml/Settings/DeleteArmoryServer.qml qml/Settings/ModifyArmoryServer.qml qml/StyledControls/CustomTransactionsTableView.qml + fonts/Roboto-Regular.ttf From 96983f900b10fdf4d2f27142f16d06a90dd283ea Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 17 Mar 2023 09:35:18 +0100 Subject: [PATCH 235/436] Transaction for buttons --- GUI/QtQuick/qml/Overview/OverviewWalletBar.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index 2ac4b3a40..0bec9374b 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -81,12 +81,12 @@ Rectangle { anchors.right: parent.right Controls.CustomMediumButton { - text: "Wallet Properties" + text: qsTr("Wallet Properties") onClicked: control.requestWalletProperties() } Controls.CustomMediumButton { - text: "Create new wallet" + text: qsTr("Create new wallet") onClicked: control.createNewWallet() } } From b203416e362fd36e5b20be23b5ba873dd256062d Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 17 Mar 2023 10:50:47 +0200 Subject: [PATCH 236/436] ArmoryServersModel: mainnet is default --- GUI/QtQuick/ArmoryServersModel.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index f0925b21b..e91640cab 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -52,11 +52,14 @@ void ArmoryServersModel::setCurrent (int value) void ArmoryServersModel::setData(int curIdx, int connIdx , const std::vector& data) { - QMetaObject::invokeMethod(this, [this, curIdx, connIdx, data] { + QMetaObject::invokeMethod(this, [this, &curIdx, connIdx, data] { beginResetModel(); data_ = data; endResetModel(); logger_->debug("[{}] curIdx = {}", __func__, curIdx); + if (curIdx == -1) { + curIdx = 0; + } setCurrent(curIdx); if (connected_ != connIdx) { connected_ = connIdx; From 5a8224dfbfff38184b99a670b671af5ec38b2022 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 17 Mar 2023 11:18:51 +0200 Subject: [PATCH 237/436] ArmoryServersModel: mainnet is default to wallet wizard --- GUI/QtQuick/qml/main.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index ea670c521..af5dbcdad 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -138,6 +138,7 @@ ApplicationWindow { running: false repeat: false onTriggered: { + bsApp.getArmoryServers() show_popup(create_wallet) } } From 3e33694cdf358f2d5258ca9d6f2093aeedd4ad81 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 17 Mar 2023 13:01:34 +0300 Subject: [PATCH 238/436] armory reconnection fixes --- Core/SettingsAdapter.cpp | 9 ++++++--- common | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Core/SettingsAdapter.cpp b/Core/SettingsAdapter.cpp index e1cfd5696..379afeef9 100644 --- a/Core/SettingsAdapter.cpp +++ b/Core/SettingsAdapter.cpp @@ -114,6 +114,9 @@ ProcessingResult SettingsAdapter::process(const bs::message::Envelope &env) break; } } + else { + return ProcessingResult::Success; + } return ProcessingResult::Ignored; } @@ -137,7 +140,7 @@ bool SettingsAdapter::processBroadcast(const bs::message::Envelope& env) void SettingsAdapter::sendSettings(const ArmorySettings& armorySettings, bool netTypeChanged) { - { + if (!armorySettings.empty()) { ArmoryMessage msg; auto msgResp = msg.mutable_settings_response(); armoryServersProvider_->setConnectedArmorySettings(armorySettings); @@ -152,8 +155,8 @@ void SettingsAdapter::sendSettings(const ArmorySettings& armorySettings, bool ne msgResp->set_bitcoin_dir(armorySettings.bitcoinBlocksDir.toStdString()); msgResp->set_db_dir(armorySettings.dbDir.toStdString()); msgResp->set_cache_file_name(appSettings_->get(ApplicationSettings::txCacheFileName)); - pushResponse(user_, bs::message::UserTerminal::create(bs::message::TerminalUsers::Blockchain) - , msg.SerializeAsString()); + pushRequest(user_, bs::message::UserTerminal::create(bs::message::TerminalUsers::Blockchain) + , msg.SerializeAsString(), {}, 3, std::chrono::seconds{10}); } if (netTypeChanged) { logger_->debug("[{}] network type changed - reloading wallets", __func__); diff --git a/common b/common index b11114f76..b2d3ab3b6 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit b11114f76c1d0f9a1d5198f321df6ee96dcce10d +Subproject commit b2d3ab3b65dab05c0569950ea1a7a8141a9cb514 From 1e15a213de7ee6f8da2bd2244e2120e0f06a13dc Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 17 Mar 2023 16:57:32 +0300 Subject: [PATCH 239/436] fix armory servers index --- Core/ArmoryServersProvider.cpp | 4 ++-- GUI/QtQuick/ArmoryServersModel.cpp | 10 +++++----- common | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Core/ArmoryServersProvider.cpp b/Core/ArmoryServersProvider.cpp index 064e13ca1..8f49e1858 100644 --- a/Core/ArmoryServersProvider.cpp +++ b/Core/ArmoryServersProvider.cpp @@ -130,10 +130,10 @@ int ArmoryServersProvider::indexOf(const ArmoryServer &server) const const auto& srvrs = servers(); for (int i = 0; i < srvrs.size(); ++i) { const auto& s = srvrs.at(i); - logger_->debug("[{}] {}: {} vs {}, {} vs {}, {} vs {}, {} vs {}", __func__ +/* logger_->debug("[{}] {}: {} vs {}, {} vs {}, {} vs {}, {} vs {}", __func__ , i, s.name.toStdString(), server.name.toStdString(), (int)s.netType , (int)server.netType, s.armoryDBIp.toStdString() - , server.armoryDBIp.toStdString(), s.armoryDBPort, server.armoryDBPort); + , server.armoryDBIp.toStdString(), s.armoryDBPort, server.armoryDBPort);*/ if ((server.name.isEmpty() || (s.name == server.name)) && (s.netType == server.netType) && (s.armoryDBIp == server.armoryDBIp) && (s.armoryDBPort == server.armoryDBPort)) { return i; diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index e91640cab..7d8a00a4a 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -52,20 +52,20 @@ void ArmoryServersModel::setCurrent (int value) void ArmoryServersModel::setData(int curIdx, int connIdx , const std::vector& data) { - QMetaObject::invokeMethod(this, [this, &curIdx, connIdx, data] { + QMetaObject::invokeMethod(this, [this, curIdx, connIdx, data] { beginResetModel(); data_ = data; endResetModel(); - logger_->debug("[{}] curIdx = {}", __func__, curIdx); + int newCur = curIdx; if (curIdx == -1) { - curIdx = 0; + newCur = 0; } - setCurrent(curIdx); + setCurrent(newCur); if (connected_ != connIdx) { connected_ = connIdx; emit connectedChanged(); } - }); + }); } void ArmoryServersModel::add(const ArmoryServer& srv) diff --git a/common b/common index b2d3ab3b6..5220e6c4a 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit b2d3ab3b65dab05c0569950ea1a7a8141a9cb514 +Subproject commit 5220e6c4a9f2e8673cf16ea01041fb67fbd10804 From cb2680ed48e227fa80be26b2637046f9ebbdfa32 Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 17 Mar 2023 15:16:57 +0100 Subject: [PATCH 240/436] Plugin page --- GUI/QtQuick/QtQuickAdapter.cpp | 10 +- GUI/QtQuick/QtQuickAdapter.h | 4 + GUI/QtQuick/images/sideshift_plugin.png | Bin 0 -> 2299 bytes GUI/QtQuick/qml/Plugins/Common/Card.qml | 71 ++++++++++++++ .../qml/Plugins/Common/PluginsPage.qml | 79 +++++++++++++++ GUI/QtQuick/qml/main.qml | 5 + GUI/QtQuick/qtquick.qrc | 3 + .../viewmodels/plugins/PluginsFilterModel.cpp | 25 +++++ .../viewmodels/plugins/PluginsFilterModel.h | 32 ++++++ .../viewmodels/plugins/PluginsListModel.cpp | 92 ++++++++++++++++++ .../viewmodels/plugins/PluginsListModel.h | 48 +++++++++ 11 files changed, 366 insertions(+), 3 deletions(-) create mode 100644 GUI/QtQuick/images/sideshift_plugin.png create mode 100644 GUI/QtQuick/qml/Plugins/Common/Card.qml create mode 100644 GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml create mode 100644 GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.cpp create mode 100644 GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.h create mode 100644 GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp create mode 100644 GUI/QtQuick/viewmodels/plugins/PluginsListModel.h diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index ca80b6931..3d3bcb9f1 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -47,6 +47,8 @@ #include "PendingTransactionFilterModel.h" #include "Utils.h" #include "AddressFilterModel.h" +#include "viewmodels/plugins/PluginsListModel.h" +#include "viewmodels/plugins/PluginsFilterModel.h" #include "hardware_wallet.pb.h" #include "terminal.pb.h" @@ -152,6 +154,8 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) , settingsController_(std::make_shared()) , addressFilterModel_(std::make_unique(settingsController_)) , transactionFilterModel_(std::make_unique(settingsController_)) + , pluginsListModel_(std::make_unique()) + , pluginsFilterModel_(std::make_unique(settingsController_)) { staticLogger = logger; addrModel_ = new QmlAddressListModel(logger, this); @@ -168,6 +172,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) addressFilterModel_->setSourceModel(addrModel_); transactionFilterModel_->setSourceModel(txModel_); + pluginsFilterModel_->setSourceModel(pluginsListModel_.get()); connect(settingsController_.get(), &SettingsController::changed, this, [this](ApplicationSettings::Setting key) { @@ -294,11 +299,13 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("feeSuggestions"), feeSuggModel_); rootCtxt_->setContextProperty(QLatin1Literal("addressFilterModel"), addressFilterModel_.get()); rootCtxt_->setContextProperty(QLatin1Literal("transactionFilterModel"), transactionFilterModel_.get()); + rootCtxt_->setContextProperty(QLatin1Literal("pluginFilterModel"), pluginsFilterModel_.get()); engine.addImageProvider(QLatin1Literal("QR"), new QRImageProvider); connect(&engine, &QQmlApplicationEngine::objectCreated, [this]() { if(nWalletsLoaded_ >= 0) { + requestPostLoadingSettings(); emit walletsLoaded(nWalletsLoaded_); } }); @@ -1027,9 +1034,6 @@ void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) hwDeviceModel_->setLoaded(walletId); walletBalances_->addWallet({ walletId, walletName }); emit walletsListChanged(); - if (isInitialLoad) { - requestPostLoadingSettings(); - } }); WalletsMessage msg; diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 3f2fea355..43d181626 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -80,6 +80,8 @@ class WalletBalancesModel; class AddressFilterModel; class TransactionFilterModel; class PendingTransactionFilterModel; +class PluginsListModel; +class PluginsFilterModel; class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoopRuner { @@ -315,6 +317,8 @@ private slots: std::shared_ptr settingsController_; std::unique_ptr addressFilterModel_; std::unique_ptr transactionFilterModel_; + std::unique_ptr pluginsListModel_; + std::unique_ptr pluginsFilterModel_; }; #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/images/sideshift_plugin.png b/GUI/QtQuick/images/sideshift_plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..b27f3f7e1624ae2ecce65155816f9b7f09069db9 GIT binary patch literal 2299 zcmd6p`9ISQ0LQ;$ju8^I!X8IGg_ROJnZzvd6~8lY38jJpaY>!{_sUeLnxd=kvr4Z6P5hCk6n3gq5YK!yze$iWL<; zbYWYB`XM0qE#1NaKwRcOfq=rIlZPcJ+`+;GsHZ8c90qUz(gq0tjalOVV1)ocG~3D) z=@boGn?c=ix}hMvu2byXxb0_Gvz>F@yLZg=Qq`D5VIbz5Rm>ghH%2E4^JOPbLO=MG zoez{as}Y@U4iy5=j&>&>hle`KFy)>Z?b}&iuYeN_Dq-}fo**=DCXN-kjK0Y~zzudA zac5Y2G>&BN3zWV6=-Ho)uf7*s^)xjb%%$G}&CSi^HlrQ1t?fs&jm>Q1ReZrYzrtHY zGtJ4j>CRf7l&J44*2h0a)|n8>bHHO16n#w^l1L~c5*J`#1qASl8bp^XG%5uuB=MSs;g=V-hAzm zCmY?+=_Rr_eU)4Dqv!S0z?#0Nc>Hs9l?IOc0SDn#T(>vg8kyh`ze(lY_Kr1|hUa~8 z7XUBtQzJTCx?V00nwo=D)zs`cjE2&kxyi|VHjii9UZkz7TalWUR?N!F%d4%ey}q}? z<)ULWXQPt0>qsQ$JOZI=HgzhYfxa4%G-W=5+uGWy+1Lo3k6-6YZlC_Mk;&41mLZRz z#jQoukF5odv_j735{Talswboj0PIa*H#E>Go*6d|p$9}vu$Qvo0vcbYngecldU_58 zOp`)hMLFEhr578rT1!q_WWITAk!3)io}Qk_gc-h2jB{J+P7-7jco={N(S@ z$^DV<$q%SgRA(or-FI{PS7fjJm?i#fqDytMG*WQ$lrU`O1jlHP5@s01wT@97ND9Y_ zGa1Bi8Rs)_%DDz|Q7B-|8QmO0u_rS&ThbxMC=}iibt)tzg#CT+In7L`1@fyuc(OgJ zAzWo=b!w@@oYGi!;$rC(>E8Sm7obDqy<3-JoMDxnR~OE+g+!u}vzWi}rMOBLWW}=8 z{&GE+NnJ&dg4<)aZZl2ryoHmiLw&2fvTJF}6Eoa!_5gTccVnrxt}d7xUli@gV$d3%z4@+7;HIFg0=T=5)D1B;whPWzA_DpN zG=cQ`M6Vw!I|VUP$nNl+i`Z8_;1MvuM`&wn--CVXK6_^h44Rc5|DB?}*gAhjINraf zGd3dpekPO&qv)9e9qtlur5I4wpkxW8a3#0wZ+yADuWx)Q=4A;)jH(GFvUv3|8teSa zNT}v5YY0H>=FO3(_4TpA74Jv-fX$COei}+*pJ0HXkbuzXA$+^SqTIKWWOt=@J=(H| zrqfqAGGws1j36$SXn*kVNn5r*Q}+aZ50}auszd!qkS1NV86E00baKy+EYJca4t=f` zU_2`HrV`+_)zt$lP^O-GA@0L5{BW@G8pDB7iF#QSA4N|lCU6nW$8-ZN5bBPB#WS49 zor7>tOUJynU${}h& zMU^&|l~L3%Fc=J7wqAITCM3K1-tJRlR{m5Ii@c!#8aQ$ylR8@|&J^}XU3^TC;d|@A zoi&twhlhttN|lvxT`On|rLS1XZ8GB*BbEe8l_%%AP0usRBiZD!6RsE~_QT6-J zv0Or`n@C#_UY~s@3Y*_;y4oBv*D=*f+>Q-F!euabk~;#{}^d?OvhTEy^wy z^Uy&W-cpp(ovM-BT5!o|PxByN8*ZpC1sV+-I0$?EznYoUS4jqKX}~i%*f{E0~@0p%NaFQRn>81G)fv$-frTBMx!GQ1btx1mo_tG zbB@NITo1*zE;g$ulU5D0qEH@|7z!^w|JYHDhdo3*_?ik(bM rQ*l3am-9Kxidd?6qml/Settings/ModifyArmoryServer.qml qml/StyledControls/CustomTransactionsTableView.qml fonts/Roboto-Regular.ttf + qml/Plugins/Common/Card.qml + qml/Plugins/Common/PluginsPage.qml + images/sideshift_plugin.png diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.cpp b/GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.cpp new file mode 100644 index 000000000..ac3b8c1bf --- /dev/null +++ b/GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.cpp @@ -0,0 +1,25 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "PluginsFilterModel.h" +#include "PluginsListModel.h" + +PluginsFilterModel::PluginsFilterModel(std::shared_ptr settings) + : QSortFilterProxyModel() + , settings_(settings) +{ + connect(this, &PluginsFilterModel::changed, this, &PluginsFilterModel::invalidate); +} + +bool PluginsFilterModel::filterAcceptsRow(int source_row, + const QModelIndex& source_parent) const +{ + return true; +} diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.h b/GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.h new file mode 100644 index 000000000..bb3ca8718 --- /dev/null +++ b/GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.h @@ -0,0 +1,32 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#pragma once + +#include +#include "SettingsController.h" + +class PluginsFilterModel: public QSortFilterProxyModel +{ + Q_OBJECT + +public: + PluginsFilterModel(std::shared_ptr settings); + +signals: + void changed(); + +protected: + bool filterAcceptsRow(int source_row, + const QModelIndex& source_parent) const override; + +private: + std::shared_ptr settings_; +}; diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp new file mode 100644 index 000000000..f269cc878 --- /dev/null +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp @@ -0,0 +1,92 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "PluginsListModel.h" +#include + +namespace +{ + static const QHash kRoles { + {PluginsListModel::PluginRoles::Name, "name"}, + {PluginsListModel::PluginRoles::Description, "description"}, + {PluginsListModel::PluginRoles::Icon, "icon"}, + {PluginsListModel::PluginRoles::IsInstalled, "isInstalled"} + }; +} + +PluginsListModel::PluginsListModel(QObject* parent) + : QAbstractListModel(parent) +{ + // temporary model + plugins_ = { + { tr("SideShift.ai v1") + , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") + , QString::fromLatin1("qrc:/images/sideshift_plugin.png") + , false }, + { tr("SideShift.ai v2") + , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") + , QString::fromLatin1("qrc:/images/sideshift_plugin.png") + , false }, + { tr("SideShift.ai v3") + , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") + , QString::fromLatin1("qrc:/images/sideshift_plugin.png") + , false }, + { tr("SideShift.ai v4") + , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") + , QString::fromLatin1("qrc:/images/sideshift_plugin.png") + , false }, + { tr("SideShift.ai v5") + , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") + , QString::fromLatin1("qrc:/images/sideshift_plugin.png") + , false }, + { tr("SideShift.ai v6") + , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") + , QString::fromLatin1("qrc:/images/sideshift_plugin.png") + , false } + }; +} + +int PluginsListModel::rowCount(const QModelIndex&) const +{ + return plugins_.size(); +} + +QVariant PluginsListModel::data(const QModelIndex& index, int role) const +{ + const int row = index.row(); + try { + switch(role) { + case Name: return plugins_.at(row).name; + case Description: return plugins_.at(row).description; + case Icon: return plugins_.at(row).icon; + case IsInstalled: return plugins_.at(row).isInstalled; + default: break; + } + } + catch (const std::exception&) { + return QString{}; + } + return QVariant(); +} + +bool PluginsListModel::setData(const QModelIndex& index, const QVariant& value, int role) +{ + if(role == IsInstalled) { + plugins_.at(index.row()).isInstalled = value.toBool(); + emit dataChanged(index, index); + return true; + } + return false; +} + +QHash PluginsListModel::roleNames() const +{ + return kRoles; +} diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h new file mode 100644 index 000000000..e5e705b1a --- /dev/null +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h @@ -0,0 +1,48 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023 BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#pragma once + +#include +#include +#include +#include + +struct Plugin { + QString name; + QString description; + QString icon; + bool isInstalled; +}; + +class PluginsListModel: public QAbstractListModel +{ + Q_OBJECT +public: + enum PluginRoles + { + Name = Qt::UserRole + 1, + Description, + Icon, + IsInstalled + }; + Q_ENUM(PluginRoles) + + PluginsListModel(QObject* parent = nullptr); + + int rowCount(const QModelIndex & = QModelIndex()) const override; + QVariant data(const QModelIndex& index, int role) const override; + QHash roleNames() const override; + bool setData(const QModelIndex& index, const QVariant& value, int role) override; + +private: + std::vector plugins_; +}; + From 4084716dadeb8659135f6e015cbb9a9bcb17b6fd Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 17 Mar 2023 16:38:09 +0100 Subject: [PATCH 241/436] Cleanup --- GUI/QtQuick/qml/Plugins/Common/Card.qml | 2 +- .../qml/Plugins/Common/PluginsPage.qml | 15 ++++--- .../viewmodels/plugins/PluginsListModel.cpp | 44 +++---------------- .../viewmodels/plugins/PluginsListModel.h | 6 +-- 4 files changed, 15 insertions(+), 52 deletions(-) diff --git a/GUI/QtQuick/qml/Plugins/Common/Card.qml b/GUI/QtQuick/qml/Plugins/Common/Card.qml index 3b6e97b30..a067b1977 100644 --- a/GUI/QtQuick/qml/Plugins/Common/Card.qml +++ b/GUI/QtQuick/qml/Plugins/Common/Card.qml @@ -56,7 +56,7 @@ Rectangle { font.letterSpacing: 0.3 color: BSStyle.titleTextColor width: parent.width - wrapMode: Text.WrapAnywhere + wrapMode: Text.Wrap } } diff --git a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml index c4972872e..122cd0c64 100644 --- a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml +++ b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml @@ -12,6 +12,7 @@ import QtQuick 2.9 import QtQuick.Controls 2.3 import "." +import "../../BsStyles" import "../../StyledControls" Rectangle { @@ -53,7 +54,7 @@ Rectangle { width: parent.width height: parent.height - header.height cellWidth: 237 - cellHeight: 312 + cellHeight: 302 model: pluginFilterModel clip: true @@ -65,15 +66,15 @@ Rectangle { delegate: Rectangle { color: "transparent" width: 237 - height: 312 + height: 302 Card { - anchors.centerIn: parent - name: name - description: description - icon_source: icon + anchors.top: parent.top + name: name_role + description: description_role + icon_source: icon_role } } } } -} \ No newline at end of file +} diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp index f269cc878..d2f363f38 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp @@ -14,42 +14,19 @@ namespace { static const QHash kRoles { - {PluginsListModel::PluginRoles::Name, "name"}, - {PluginsListModel::PluginRoles::Description, "description"}, - {PluginsListModel::PluginRoles::Icon, "icon"}, - {PluginsListModel::PluginRoles::IsInstalled, "isInstalled"} + {PluginsListModel::PluginRoles::Name, "name_role"}, + {PluginsListModel::PluginRoles::Description, "description_role"}, + {PluginsListModel::PluginRoles::Icon, "icon_role"} }; } PluginsListModel::PluginsListModel(QObject* parent) : QAbstractListModel(parent) { - // temporary model plugins_ = { - { tr("SideShift.ai v1") + { tr("SideShift.ai") , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") - , QString::fromLatin1("qrc:/images/sideshift_plugin.png") - , false }, - { tr("SideShift.ai v2") - , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") - , QString::fromLatin1("qrc:/images/sideshift_plugin.png") - , false }, - { tr("SideShift.ai v3") - , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") - , QString::fromLatin1("qrc:/images/sideshift_plugin.png") - , false }, - { tr("SideShift.ai v4") - , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") - , QString::fromLatin1("qrc:/images/sideshift_plugin.png") - , false }, - { tr("SideShift.ai v5") - , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") - , QString::fromLatin1("qrc:/images/sideshift_plugin.png") - , false }, - { tr("SideShift.ai v6") - , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") - , QString::fromLatin1("qrc:/images/sideshift_plugin.png") - , false } + , QString::fromLatin1("qrc:/images/sideshift_plugin.png") } }; } @@ -66,7 +43,6 @@ QVariant PluginsListModel::data(const QModelIndex& index, int role) const case Name: return plugins_.at(row).name; case Description: return plugins_.at(row).description; case Icon: return plugins_.at(row).icon; - case IsInstalled: return plugins_.at(row).isInstalled; default: break; } } @@ -76,16 +52,6 @@ QVariant PluginsListModel::data(const QModelIndex& index, int role) const return QVariant(); } -bool PluginsListModel::setData(const QModelIndex& index, const QVariant& value, int role) -{ - if(role == IsInstalled) { - plugins_.at(index.row()).isInstalled = value.toBool(); - emit dataChanged(index, index); - return true; - } - return false; -} - QHash PluginsListModel::roleNames() const { return kRoles; diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h index e5e705b1a..21ba89eac 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h @@ -19,7 +19,6 @@ struct Plugin { QString name; QString description; QString icon; - bool isInstalled; }; class PluginsListModel: public QAbstractListModel @@ -30,8 +29,7 @@ class PluginsListModel: public QAbstractListModel { Name = Qt::UserRole + 1, Description, - Icon, - IsInstalled + Icon }; Q_ENUM(PluginRoles) @@ -40,9 +38,7 @@ class PluginsListModel: public QAbstractListModel int rowCount(const QModelIndex & = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role) const override; QHash roleNames() const override; - bool setData(const QModelIndex& index, const QVariant& value, int role) override; private: std::vector plugins_; }; - From bb24e054ab3b71de8b3c961f1a53e2b2e186669e Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 17 Mar 2023 19:12:10 +0300 Subject: [PATCH 242/436] update common --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index 5220e6c4a..a15d458e0 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 5220e6c4a9f2e8673cf16ea01041fb67fbd10804 +Subproject commit a15d458e0a450e146ddae39154e129f279de8758 From 13aadf7c479666dfb8c3cbfee0fb69646d974b7d Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 17 Mar 2023 17:48:18 +0100 Subject: [PATCH 243/436] Temporary fix for selected wallet sync --- GUI/QtQuick/QtQuickAdapter.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 3d3bcb9f1..82b18f448 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -305,7 +305,6 @@ void QtQuickAdapter::run(int &argc, char **argv) connect(&engine, &QQmlApplicationEngine::objectCreated, [this]() { if(nWalletsLoaded_ >= 0) { - requestPostLoadingSettings(); emit walletsLoaded(nWalletsLoaded_); } }); @@ -1034,6 +1033,10 @@ void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) hwDeviceModel_->setLoaded(walletId); walletBalances_->addWallet({ walletId, walletName }); emit walletsListChanged(); + if (isInitialLoad) { + emit requestWalletSelection(0); + requestPostLoadingSettings(); + } }); WalletsMessage msg; From eda35a58c1a8cb2a79c7c2562261d97d2f53d6ab Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 17 Mar 2023 19:10:17 +0100 Subject: [PATCH 244/436] Moved settings loading --- GUI/QtQuick/QtQuickAdapter.cpp | 7 ++----- GUI/QtQuick/qml/Overview/OverviewWalletBar.qml | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 82b18f448..82dee765a 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -658,6 +658,7 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) case WalletsMessage::kReady: nWalletsLoaded_ = msg.ready(); + requestPostLoadingSettings(); emit walletsLoaded(msg.ready()); logger_->debug("[{}] loaded {} wallet[s]", __func__, msg.ready()); break; @@ -989,7 +990,7 @@ std::string QtQuickAdapter::generateWalletName() const void QtQuickAdapter::walletSelected(int index) { - if (index < 0) { + if (index < 0 || index >= walletBalances_->wallets().size()) { return; } logger_->debug("[{}] {}", __func__, index); @@ -1033,10 +1034,6 @@ void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) hwDeviceModel_->setLoaded(walletId); walletBalances_->addWallet({ walletId, walletName }); emit walletsListChanged(); - if (isInitialLoad) { - emit requestWalletSelection(0); - requestPostLoadingSettings(); - } }); WalletsMessage msg; diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index 0bec9374b..ce493f4b5 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -53,7 +53,7 @@ Rectangle { Connections { target: bsApp function onRequestWalletSelection(index) { - if (wallet_selection_combobox.currentIndex != index && index < walletBalances.length) { + if (wallet_selection_combobox.currentIndex != index) { wallet_selection_combobox.currentIndex = index } } From a5dc7005a78d18922f9069a22f6c1c1a5714c508 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 17 Mar 2023 21:14:32 +0200 Subject: [PATCH 245/436] qml: nst table max 5 confirmations --- GUI/QtQuick/PendingTransactionFilterModel.cpp | 2 +- GUI/QtQuick/qml/TransactionsPage.qml | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/GUI/QtQuick/PendingTransactionFilterModel.cpp b/GUI/QtQuick/PendingTransactionFilterModel.cpp index fa5060f14..93f476211 100644 --- a/GUI/QtQuick/PendingTransactionFilterModel.cpp +++ b/GUI/QtQuick/PendingTransactionFilterModel.cpp @@ -22,7 +22,7 @@ bool PendingTransactionFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { const auto confirmationCountIndex = sourceModel()->index(source_row, 5); - if (sourceModel()->data(confirmationCountIndex, TxListModel::TableRoles::TableDataRole) > 6) + if (sourceModel()->data(confirmationCountIndex, TxListModel::TableRoles::TableDataRole) >= 6) { return false; } diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 247eadde9..3ecd07c64 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -27,11 +27,6 @@ Item { signal openSend (string txId, bool isRBF, bool isCPFP) - TransactionDetails { - id: transactionDetails - visible: false - } - FileDialog { id: fileDialogCSV visible: false From 5274f7bf58e6519a44cc4bc32ef2c063204ce648 Mon Sep 17 00:00:00 2001 From: YZ Date: Sat, 18 Mar 2023 10:39:02 +0100 Subject: [PATCH 246/436] Fixed balances value on load --- GUI/QtQuick/WalletBalancesModel.cpp | 55 ++++++++++++++++++- GUI/QtQuick/WalletBalancesModel.h | 22 ++++++-- .../qml/Overview/OverviewWalletBar.qml | 13 ++--- 3 files changed, 77 insertions(+), 13 deletions(-) diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index e2829d684..1718283d1 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -94,6 +94,7 @@ void WalletBalancesModel::addWallet(const Wallet& wallet) wallets_.push_back(wallet); endInsertRows(); emit rowCountChanged(); + emit changed(); } void WalletBalancesModel::deleteWallet(const std::string& walletId) @@ -114,7 +115,8 @@ void WalletBalancesModel::deleteWallet(const std::string& walletId) wallets_.erase(wallets_.cbegin() + idx); endRemoveRows(); emit rowCountChanged(); - }); + emit changed(); + }); } QStringList WalletBalancesModel::wallets() const @@ -133,6 +135,7 @@ void WalletBalancesModel::clear() balances_.clear(); endResetModel(); + emit changed(); emit rowCountChanged(); } @@ -155,4 +158,54 @@ void WalletBalancesModel::setWalletBalance(const std::string& walletId, const Ba else { logger_->warn("[{}] {} not found", __func__, walletId); } + emit changed(); +} + +void WalletBalancesModel::setSelectedWallet(int index) +{ + if (selectedWallet_ != index) { + selectedWallet_ = index; + emit changed(); + } +} + +int WalletBalancesModel::selectedWallet() const +{ + return selectedWallet_; +} + +QString WalletBalancesModel::confirmedBalance() const +{ + if (selectedWallet_ >= 0 & selectedWallet_ < wallets_.size()) { + return getBalance(wallets_.at(selectedWallet_).walletId + , [](const Balance& bal) { return gui_utils::xbtToQString(bal.confirmed); }); + } + return tr("-"); +} + +QString WalletBalancesModel::unconfirmedBalance() const +{ + if (selectedWallet_ >= 0 & selectedWallet_ < wallets_.size()) { + return getBalance(wallets_.at(selectedWallet_).walletId + , [](const Balance& bal) { return gui_utils::xbtToQString(bal.unconfirmed); }); + } + return tr("-"); +} + +QString WalletBalancesModel::totalBalance() const +{ + if (selectedWallet_ >= 0 & selectedWallet_ < wallets_.size()) { + return getBalance(wallets_.at(selectedWallet_).walletId + , [](const Balance& bal) { return gui_utils::xbtToQString(bal.total); }); + } + return tr("-"); +} + +QString WalletBalancesModel::numberAddresses() const +{ + if (selectedWallet_ >= 0 & selectedWallet_ < wallets_.size()) { + return getBalance(wallets_.at(selectedWallet_).walletId + , [](const Balance& bal) { return QString::number(bal.nbAddresses); }); + } + return tr("-"); } diff --git a/GUI/QtQuick/WalletBalancesModel.h b/GUI/QtQuick/WalletBalancesModel.h index 049a1a3f3..81439530d 100644 --- a/GUI/QtQuick/WalletBalancesModel.h +++ b/GUI/QtQuick/WalletBalancesModel.h @@ -37,6 +37,13 @@ namespace WalletBalance { class WalletBalancesModel : public QAbstractTableModel { Q_OBJECT + Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) + Q_PROPERTY(int selectedWallet READ selectedWallet WRITE setSelectedWallet NOTIFY changed) + Q_PROPERTY(QString confirmedBalance READ confirmedBalance NOTIFY changed) + Q_PROPERTY(QString unconfirmedBalance READ unconfirmedBalance NOTIFY changed) + Q_PROPERTY(QString totalBalance READ totalBalance NOTIFY changed) + Q_PROPERTY(QString numberAddresses READ numberAddresses NOTIFY changed) + public: WalletBalancesModel(const std::shared_ptr&, QObject* parent = nullptr); @@ -62,19 +69,26 @@ class WalletBalancesModel : public QAbstractTableModel }; void setWalletBalance(const std::string& walletId, const Balance&); - Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) + void setSelectedWallet(int index); + int selectedWallet() const; + QString confirmedBalance() const; + QString unconfirmedBalance() const; + QString totalBalance() const; + QString numberAddresses() const; + +signals: + void changed(); + void rowCountChanged(); private: using FieldFunc = std::function; QString getBalance(const std::string& walletId, const FieldFunc&) const; private: + int selectedWallet_; std::shared_ptr logger_; std::vector wallets_; std::unordered_map balances_; //key: walletId - -signals: - void rowCountChanged(); }; #endif // WALLET_BALANCES_MODEL_H diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index ce493f4b5..28e57dfa8 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -48,6 +48,7 @@ Rectangle { onCurrentIndexChanged: { bsApp.walletSelected(currentIndex) control.walletIndexChanged(currentIndex) + walletBalances.selectedWallet = currentIndex } Connections { @@ -64,14 +65,10 @@ Rectangle { id: balance_bar anchors.verticalCenter: parent.verticalCenter - confirmed_balance_value: walletBalances.data(walletBalances.index(wallet_selection_combobox.currentIndex, 0), - WalletBalance.ConfirmedRole) - uncorfirmed_balance_value: walletBalances.data(walletBalances.index(wallet_selection_combobox.currentIndex, 0), - WalletBalance.UnconfirmedRole) - total_balance_value: walletBalances.data(walletBalances.index(wallet_selection_combobox.currentIndex, 0), - WalletBalance.TotalRole) - used_addresses_value: walletBalances.data(walletBalances.index(wallet_selection_combobox.currentIndex, 0), - WalletBalance.NbAddrRole) + confirmed_balance_value: walletBalances.confirmedBalance + uncorfirmed_balance_value: walletBalances.unconfirmedBalance + total_balance_value: walletBalances.totalBalance + used_addresses_value: walletBalances.numberAddresses } } From 38e8bcd7b53f77444e6d3002df1f0a033b7c7c11 Mon Sep 17 00:00:00 2001 From: YZ Date: Sat, 18 Mar 2023 11:52:22 +0100 Subject: [PATCH 247/436] Fixed typo --- GUI/QtQuick/WalletBalancesModel.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index 1718283d1..a468d0d8c 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -176,7 +176,7 @@ int WalletBalancesModel::selectedWallet() const QString WalletBalancesModel::confirmedBalance() const { - if (selectedWallet_ >= 0 & selectedWallet_ < wallets_.size()) { + if (selectedWallet_ >= 0 && selectedWallet_ < wallets_.size()) { return getBalance(wallets_.at(selectedWallet_).walletId , [](const Balance& bal) { return gui_utils::xbtToQString(bal.confirmed); }); } @@ -185,7 +185,7 @@ QString WalletBalancesModel::confirmedBalance() const QString WalletBalancesModel::unconfirmedBalance() const { - if (selectedWallet_ >= 0 & selectedWallet_ < wallets_.size()) { + if (selectedWallet_ >= 0 && selectedWallet_ < wallets_.size()) { return getBalance(wallets_.at(selectedWallet_).walletId , [](const Balance& bal) { return gui_utils::xbtToQString(bal.unconfirmed); }); } @@ -194,7 +194,7 @@ QString WalletBalancesModel::unconfirmedBalance() const QString WalletBalancesModel::totalBalance() const { - if (selectedWallet_ >= 0 & selectedWallet_ < wallets_.size()) { + if (selectedWallet_ >= 0 && selectedWallet_ < wallets_.size()) { return getBalance(wallets_.at(selectedWallet_).walletId , [](const Balance& bal) { return gui_utils::xbtToQString(bal.total); }); } @@ -203,7 +203,7 @@ QString WalletBalancesModel::totalBalance() const QString WalletBalancesModel::numberAddresses() const { - if (selectedWallet_ >= 0 & selectedWallet_ < wallets_.size()) { + if (selectedWallet_ >= 0 && selectedWallet_ < wallets_.size()) { return getBalance(wallets_.at(selectedWallet_).walletId , [](const Balance& bal) { return QString::number(bal.nbAddresses); }); } From 53f5cfcb2601e8a414696c056b4ee4b99427e658 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Mon, 20 Mar 2023 08:50:19 +0200 Subject: [PATCH 248/436] [QT-37,38,41] update splash screen and icons --- .vscode/settings.json | 11 ++++++++ BlockSettleApp/blocksettle.ico | Bin 204862 -> 399142 bytes .../interfaces/GUI_QML/QMLApp.cpp | 2 +- BlockSettleUILib/BSTerminalSplashScreen.cpp | 24 ++++++++++-------- GUI/QtQuick/QtQuickAdapter.cpp | 7 ++++- GUI/QtQuick/QtQuickAdapter.h | 5 ++++ GUI/QtQuick/images/bitcoin-disabled.png | Bin 608 -> 619 bytes GUI/QtQuick/images/bitcoin-main-net.png | Bin 660 -> 517 bytes GUI/QtQuick/images/bitcoin-test-net.png | Bin 664 -> 616 bytes GUI/QtQuick/images/full_logo.png | Bin 16034 -> 5331 bytes GUI/QtQuick/images/terminal.ico | Bin 0 -> 399142 bytes GUI/QtQuick/qml/main.qml | 22 +++++++++++++++- GUI/QtQuick/qtquick.qrc | 2 +- 13 files changed, 58 insertions(+), 15 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 GUI/QtQuick/images/terminal.ico diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..6b66034bc --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "files.associations": { + "map": "cpp", + "iosfwd": "cpp", + "xlocbuf": "cpp", + "ios": "cpp", + "type_traits": "cpp", + "xstring": "cpp", + "xutility": "cpp" + } +} \ No newline at end of file diff --git a/BlockSettleApp/blocksettle.ico b/BlockSettleApp/blocksettle.ico index 6790f065cadd346f37770284b214c6c274e192dc..9715c9cecaa7964a39ac0254b0f43efcc129e689 100644 GIT binary patch literal 399142 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 diff --git a/BlockSettleSigner/interfaces/GUI_QML/QMLApp.cpp b/BlockSettleSigner/interfaces/GUI_QML/QMLApp.cpp index a00697208..f188f307b 100644 --- a/BlockSettleSigner/interfaces/GUI_QML/QMLApp.cpp +++ b/BlockSettleSigner/interfaces/GUI_QML/QMLApp.cpp @@ -111,7 +111,7 @@ QMLAppObj::QMLAppObj(SignerAdapter *adapter, const std::shared_ptrsetMinimum(0); progress_->setMaximum(100); progress_->setValue(0); - progress_->setMinimumWidth(this->width()); - progress_->setMaximumHeight(10); - - blockSettleLabel_ = new QLabel(this); - blockSettleLabel_->setText(QLatin1String("BLOCKSETTLE TERMINAL")); - blockSettleLabel_->move(30, 140); - blockSettleLabel_->setStyleSheet(QLatin1String("font-size: 18px; color: white")); - - progress_->setStyleSheet(QLatin1String("text-align: center; font-size: 8px; border-width: 0px;")); - SetTipText(tr("Loading")); + progress_->setMinimumWidth(this->width() - 10); + progress_->setMaximumHeight(8); + progress_->move(5, 289); + + //blockSettleLabel_ = new QLabel(this); + //blockSettleLabel_->setText(QLatin1String("BLOCKSETTLE TERMINAL")); + //blockSettleLabel_->move(30, 140); + //blockSettleLabel_->setStyleSheet(QLatin1String("font-size: 18px; color: white")); + + progress_->setStyleSheet(QLatin1String("QProgressBar::chunk{background-color:#45A6FF}; background:#191E2A; text-align: center; font-size: 8px; border-width: 1px; border-color: #3C435A")); + //SetTipText(tr("Loading")); + progress_->setFormat(QString::fromStdString("")); } BSTerminalSplashScreen::~BSTerminalSplashScreen() = default; void BSTerminalSplashScreen::SetTipText(const QString& tip) { - progress_->setFormat(tip + QString::fromStdString(" %p%")); + //progress_->setFormat(tip + QString::fromStdString(" %p%")); // QApplication::processEvents(); } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 8ed694386..160ae90a4 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -189,7 +189,7 @@ void QtQuickAdapter::run(int &argc, char **argv) QApplication app(argc, argv); QApplication::setOrganizationDomain(QLatin1String("blocksettle.com")); - QApplication::setWindowIcon(QIcon(QStringLiteral(":/images/bs_logo.png"))); + QApplication::setWindowIcon(QIcon(QStringLiteral(":/images/terminal.ico"))); const QFileInfo localStyleSheetFile(QLatin1String("stylesheet.css")); QFile stylesheetFile(localStyleSheetFile.exists() @@ -376,6 +376,11 @@ void QtQuickAdapter::onArmoryServerSelected(int index) logger_->error("[{}] invalid sender", __func__); return; } + + armoryServerIndex_ = index; + + emit armoryServerIndexChanged(); + logger_->debug("[{}] #{}", __func__, index); SettingsMessage msg; msg.set_set_armory_server(index); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 3f2fea355..f4f6fd970 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -136,6 +136,9 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_PROPERTY(int armoryState READ armoryState NOTIFY armoryStateChanged) int armoryState() const { return armoryState_; } + Q_PROPERTY(int armoryServerIndex READ armoryServerIndex NOTIFY armoryServerIndexChanged) + int armoryServerIndex() const { return armoryServerIndex_; } + Q_PROPERTY(HwDeviceModel* devices READ devices NOTIFY devicesChanged) HwDeviceModel* devices(); Q_PROPERTY(bool scanningDevices READ scanningDevices NOTIFY scanningChanged) @@ -190,6 +193,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void addressGenerated(); void settingChanged(); void armoryStateChanged(); + void armoryServerIndexChanged(); void devicesChanged(); void scanningChanged(); void invokePINentry(); @@ -272,6 +276,7 @@ private slots: std::set createdComponents_; std::set loadingComponents_; int armoryState_{ -1 }; + int armoryServerIndex_{ -1 }; uint32_t blockNum_{ 0 }; int signerState_{ -1 }; std::string signerDetails_; diff --git a/GUI/QtQuick/images/bitcoin-disabled.png b/GUI/QtQuick/images/bitcoin-disabled.png index 12aa8b9ae132a945dcc39f5b5075003658d55606..a6a75e5dd3244a54cba98428635caca2bdb30cff 100644 GIT binary patch delta 594 zcmV-Y0Px#1ZP1_ zK>z@;j|==^1poj707*naRCob>Q_oKmK@@)Tw!!tZHIlX$*`DxZ+JhD^U?GN+vHS}f zy%>%D1K2Shyh=3w4gQFUkf@=Obg$~A;Av~nwh4sg)V(bMW`B5Z63T4b@RHq`dGo$+ zzIpqtfT57`Wfjq>fq*4i7C9$Cx3s{PIy!hErR>=C;tVLWh!b_nJcIK><7=f7Ch89e z7%ZHLCN0W#t?RmwB*`cTD>^=$XAK-X41wn6W`E5*Y=_`a`S9lLyAdS{j^`0GP#@m-`Rg}ydp#r8oI>)RJbpA#Hc+B) z35C{W7!&zi4!YeQtgU^8^~MHdvmTU6*U|(iY8gG$I0Me-4S-{D@ir7_%@OzG;nE_G zJH1fInX&O>1ERgiko5^1w*QXQ5`pO032xv_rD8r`7=N~5bL$VZHn$9kKXoMqCiSh1 zR%(^*^7J(6QK9QzFdlgL;6B8048HH1y(rpG5eOlO0M!=(&VZmn4dc_9;Og`=$!(AetCXy{B-{*9b zJ+K!=@JsR2XBZb;%NU+J{0f2~sot9XK%TysQZg2-R|tGB^)uPQ))tPIB&}q5q@$Hy g<$lTK<-o2#0q+~jlT-U*$^ZZW07*qoM6N<$g3_=WmH+?% delta 583 zcmV-N0=WI_1mFaaB!2;OQb$4nuFf3k0006SNklfgc5PfSqj%z!Kt=u?N z0xp%xzbGffIX?hSRiz+=Dh`MvTnYzL0XKd??%Z1b0}>Lw6eQBR`2Z(wAc4l~WyY;t z$I3`ic4pr5?999sDA~(b`x~*8+ko1l)Vfka7f{Cv;=s_whks|gkG>QsB6B*OPIWw! zd*tuXPs`$^|3nD!ZsX>SC#_cNf^+Eyy4|jM^zHPc0`8UwD_tTTc(#7O-ERL&D;<3g zUaulMjswrDqvpEM^y^D8_Ug6}FZSNtiDmMcO67<~qYlSegC+##^S^Lh2fbbZrHFcM zNyRWWwOFbLMSn8qqi6~lOPHn!%d%kTI+{%%nwHmK7;)vcMiXAqw}MWjMI7Ta=%YUv zpZt6!d$^@6D&NhxBjDCg)!wJkvh2nM*N`EEPu|b3VMA6MG<27oq?MqLbJ19x8cp#%1(Pf>82-X=6k;};r`NZvDr6!Nj-#}t496Unw)Xt#J@!eU}1<8R8FB=K=Ok&dTCRAuMHn5A38L zU`xVex@tMc{|9$o V(Fms3fj$5L002ovPDHLkV1gv^8p{9x diff --git a/GUI/QtQuick/images/bitcoin-main-net.png b/GUI/QtQuick/images/bitcoin-main-net.png index 71e732649dc42ae47c6073d0a3a7c539c7adc9b6..2645a46fa884c3c89c3250e3a36663a718ca0057 100644 GIT binary patch delta 491 zcmVPx#1ZP1_ zK>z@;j|==^1poj6nn^@KRCob}Q$0w-Kp1^@#=5A8PD0UaLP0D}A`b21+JY{Qx^>dQ z*}vJLo$92ci-Rr>UF;z0A{2xUE~X&jpd#vGr8&PZm!`=j=zoJF?U(o7eSZ-!psMK{ zELngniuBj^f&vYC(?Cb=ijw1m`63V=*&}GX+Z5WspHO9_$Y|Ah4-7oJ3{fPho002ovPDHLkV1o0Z-);Z^ delta 635 zcmV->0)+jA1e67kB!2;OQb$4nuFf3k0006`NklC4H zb&60Q-Y6{RJ5Iqxj|Uj)T#p316uM*u&@c9(EOWkqcM~C}in}Cs=!F06NlIIB>=m7G zObK#oIQ=j3$W#>BFF~w~Rk1ty3r!6*UsGcJYJooC3}U0_Vp1=A;7I~^UPVx@32bjG zVq`Lkr$;}+Hh*Fz;%`_>piYbH7*rvWzEL9CW&)YCq z=e6-hWZo|GQ>z*)3Q~`3v&jnTFQcWN}WUb5m zry_oOO=8Ivq&wNhB-=QxxA7L+HvBS*4}~BSb`1u7nOa{&-_C;i5C6+H8rZ}Llm>B* zBE2d*`gA&ih~=VxcsU*)$srv4(|?6wg%|7t==BBsIhd!FJr0nzWH)s4s1!+Q%fucz z5B|_dPjf&zsd`bCrhrSy%zG^Rygvu}Fe!qJzO{kw1%s_!Xmg(P`H#`?vrA002ovPDHLkV1mPZA*uiX diff --git a/GUI/QtQuick/images/bitcoin-test-net.png b/GUI/QtQuick/images/bitcoin-test-net.png index a9ea588bd76d0088cd3516a4c129468f985c5b60..737dbc01a34ddb31c99abcdd273a78b6999c368c 100644 GIT binary patch delta 591 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 images/full_logo.png - images/bs_logo.png + images/terminal.ico images/bitcoin-test-net.png images/bitcoin-main-net.png images/bitcoin-disabled.png From 1d10e15adc71d366c6b93b59572b6106bdc106a5 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 20 Mar 2023 20:10:41 +0300 Subject: [PATCH 249/436] prevent various race conditions at armory servers switching --- GUI/QtQuick/AddressListModel.cpp | 80 +++++++++++++++++++++----------- GUI/QtQuick/QtQuickAdapter.cpp | 39 ++++++++++++++-- GUI/QtQuick/QtQuickAdapter.h | 7 +-- GUI/QtQuick/TxListModel.cpp | 36 +++++++------- GUI/QtQuick/TxListModel.h | 6 +-- GUI/QtQuick/qml/main.qml | 4 +- common | 2 +- 7 files changed, 115 insertions(+), 59 deletions(-) diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index c829f8632..f2534a664 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -24,8 +24,7 @@ namespace QmlAddressListModel::QmlAddressListModel(const std::shared_ptr& logger, QObject* parent) : QAbstractTableModel(parent), logger_(logger), header_({ tr("Address"), tr("#Tx"), tr("Balance (BTC)"), tr("Comment") }) -{ -} +{} int QmlAddressListModel::rowCount(const QModelIndex&) const { @@ -45,8 +44,7 @@ QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const { case TableDataRole: { - switch (index.column()) - { + switch (index.column()) { case 0: return table_.at(row).at(0); case 1: return QString::number(getTransactionCount(addresses_.at(row).id())); case 2: return getAddressBalance(addresses_.at(row).id()); @@ -74,17 +72,15 @@ QHash QmlAddressListModel::roleNames() const void QmlAddressListModel::addRow(const std::string& walletId, const QVector& row) { - if (walletId != expectedWalletId_) - { + if (walletId != expectedWalletId_) { logger_->warn("[QmlAddressListModel::addRow] wallet {} not expected ({})", walletId, expectedWalletId_); return; } - try - { + try { addresses_.push_back(bs::Address::fromAddressString(row.at(0).toStdString())); } - catch (const std::exception&) - { + catch (const std::exception&) { + logger_->warn("[{}] {} invalid address {}", __func__, walletId, row.at(0).toStdString()); addresses_.push_back(bs::Address{}); } QMetaObject::invokeMethod(this, [this, row] { @@ -96,42 +92,70 @@ void QmlAddressListModel::addRow(const std::string& walletId, const QVector>& rows) { - if (walletId != expectedWalletId_) - { + if (walletId != expectedWalletId_) { logger_->warn("[QmlAddressListModel::addRows] wallet {} not expected ({})", walletId, expectedWalletId_); return; } - if (rows.empty()) - { + if (rows.empty()) { return; } - for (const auto& row : rows) - { - try - { - addresses_.push_back(bs::Address::fromAddressString(row.at(0).toStdString())); + for (const auto& row : rows) { + try { + const auto& addr = bs::Address::fromAddressString(row.at(0).toStdString()); + bool found = false; + for (const auto& a : addresses_) { + if (a == addr) { + found = true; + break; + } + } + if (!found) { + addresses_.push_back(addr); + } } - catch (const std::exception&) - { + catch (const std::exception&) { addresses_.push_back(bs::Address{}); } } + logger_->debug("[{}] {} rows / {} addresses", __func__, rows.size(), addresses_.size()); QMetaObject::invokeMethod(this, [this, rows] { - beginInsertRows(QModelIndex(), rowCount(), rowCount() + rows.size() - 1); - table_.append(rows); - endInsertRows(); + QVector> newRows; + for (const auto& row : rows) { + bool found = false; + for (const auto& r : table_) { + if (r.at(0) == row.at(0)) { + found = true; + break; + } + } + if (!found) { + for (const auto& r : newRows) { + if (r.at(0) == row.at(0)) { + found = true; + break; + } + } + } + if (!found) { + newRows.append(row); + } + } + bool found = false; + if (!newRows.empty()) { + beginInsertRows(QModelIndex(), rowCount(), rowCount() + newRows.size() - 1); + table_.append(newRows); + endInsertRows(); + } }); } void QmlAddressListModel::updateRow(const BinaryData& addrPubKey, uint64_t bal, uint32_t nbTx) { pendingBalances_[addrPubKey] = { bal, nbTx }; - for (int i = 0; i < table_.size(); ++i) - { + for (int i = 0; i < table_.size(); ++i) { const auto& addr = addresses_.at(i); // logger_->debug("[QmlAddressListModel::updateRow] {} {} {}", addr.display(), bal, nbTx); - if (addr.id() == addrPubKey) - { + if (addr.id() == addrPubKey) { emit dataChanged(createIndex(i, 1), createIndex(i, 2)); break; } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 5fa9b0495..ee638e787 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -304,7 +304,7 @@ void QtQuickAdapter::run(int &argc, char **argv) connect(&engine, &QQmlApplicationEngine::objectCreated, [this]() { - if(nWalletsLoaded_ >= 0) { + if (nWalletsLoaded_ >= 0) { emit walletsLoaded(nWalletsLoaded_); } }); @@ -385,15 +385,24 @@ bool QtQuickAdapter::processBroadcast(const bs::message::Envelope& env) void QtQuickAdapter::onArmoryServerSelected(int index) { + if (armoryServerIndex_ == index) { + return; + } + armoryServerIndex_ = index; auto model = qobject_cast(sender()); if (!model) { logger_->error("[{}] invalid sender", __func__); return; } - armoryServerIndex_ = index; + armoryState_ = 0; + emit armoryStateChanged(); - emit armoryServerIndexChanged(); + const auto newNetType = model->data(index).netType; + if (netType_ != newNetType) { + netType_ = newNetType; + emit networkTypeChanged(); + } logger_->debug("[{}] #{}", __func__, index); SettingsMessage msg; @@ -483,6 +492,7 @@ ProcessingResult QtQuickAdapter::processSettingsState(const SettingsMessage_Sett ProcessingResult QtQuickAdapter::processArmoryServers(bs::message::SeqId msgId , const SettingsMessage_ArmoryServers& response) { + armoryServerIndex_ = response.idx_current(); logger_->debug("[{}] current={}, connected={}", __func__, response.idx_current() , response.idx_connected()); const auto& itReq = armoryServersReq_.find(msgId); @@ -616,6 +626,7 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) return processWalletDeleted(msg.wallet_deleted()); case SignerMessage::kCreatedWallet: walletBalances_->clear(); + addrModel_->reset(msg.created_wallet().wallet_id()); logger_->debug("[{}] wallet {} created: {}", __func__ //TODO: show something in the GUI if needed , msg.created_wallet().wallet_id(), msg.created_wallet().error_msg()); break; @@ -636,6 +647,12 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) return processWalletSeed(msg.wallet_seed()); case SignerMessage::kWalletsReset: hdWallets_.clear(); + if (addrModel_) { + addrModel_->reset({}); + } + if (txModel_) { + txModel_->clear(); + } if (walletBalances_) { walletBalances_->clear(); } @@ -666,6 +683,16 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) requestPostLoadingSettings(); emit walletsLoaded(msg.ready()); logger_->debug("[{}] loaded {} wallet[s]", __func__, msg.ready()); + { + const int lastIdx = settingsController_->getParam(ApplicationSettings::Setting::SelectedWallet).toInt(); + if ((lastIdx >= 0) && (lastIdx < nWalletsLoaded_)) { + logger_->debug("[{}] selecting wallet #{}", __func__, lastIdx); + walletSelected(lastIdx); + } + else { + logger_->debug("[{}] wallet #{} is not selectable", __func__, lastIdx); + } + } break; case WalletsMessage::kWalletLoaded: { @@ -1022,7 +1049,6 @@ void QtQuickAdapter::walletSelected(int index) hdWallets_.at(walletId).watchOnly }); } - settingsController_->setParam(ApplicationSettings::Setting::SelectedWallet, index); } catch (const std::exception&) {} @@ -1081,6 +1107,7 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId } walletInfoReq_.erase(itReq); } + logger_->debug("[{}] {} used addresses", __func__, response.used_addresses_size()); QVector> addresses; for (const auto& addr : response.used_addresses()) { try { @@ -1114,7 +1141,7 @@ ProcessingResult QtQuickAdapter::processWalletBalances(bs::message::SeqId respon ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId , const WalletsMessage_TXDetailsResponse &response) { - //logger_->debug("[{}] {}", __func__, response.DebugString()); + logger_->debug("[{}] {}", __func__, response.DebugString()); for (const auto &resp : response.responses()) { bs::sync::TXWalletDetails txDet{ BinaryData::fromString(resp.tx_hash()), resp.hd_wallet_id() , resp.wallet_name(), static_cast(resp.wallet_type()) @@ -1193,6 +1220,7 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId const auto& itTxDet = txDetailReqs_.find(msgId); if (itTxDet == txDetailReqs_.end()) { + logger_->debug("[{}] TX model update", __func__); if (txDet.direction == bs::sync::Transaction::Direction::Revoke) { txModel_->removeTX(txDet.txHash); } @@ -1910,6 +1938,7 @@ void QtQuickAdapter::processWalletAddresses(const std::string& walletId , const std::vector& addresses) { if (addresses.empty()) { + logger_->debug("[{}] {} no addresses", __func__, walletId); return; } auto hdWalletId = walletId; diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 92f07928d..8670b3999 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -138,8 +138,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_PROPERTY(int armoryState READ armoryState NOTIFY armoryStateChanged) int armoryState() const { return armoryState_; } - Q_PROPERTY(int armoryServerIndex READ armoryServerIndex NOTIFY armoryServerIndexChanged) - int armoryServerIndex() const { return armoryServerIndex_; } + Q_PROPERTY(int networkType READ networkType NOTIFY networkTypeChanged) + int networkType() const { return (int)netType_; } Q_PROPERTY(HwDeviceModel* devices READ devices NOTIFY devicesChanged) HwDeviceModel* devices(); @@ -195,7 +195,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void addressGenerated(); void settingChanged(); void armoryStateChanged(); - void armoryServerIndexChanged(); + void networkTypeChanged(); void devicesChanged(); void scanningChanged(); void invokePINentry(); @@ -279,6 +279,7 @@ private slots: std::set loadingComponents_; int armoryState_{ -1 }; int armoryServerIndex_{ -1 }; + NetworkType netType_{ NetworkType::Invalid }; uint32_t blockNum_{ 0 }; int signerState_{ -1 }; std::string signerDetails_; diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index b166241e1..c7c0e3305 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -215,7 +215,6 @@ void TxListModel::addRows(const std::vector& entries) std::vector newEntries; for (const auto& entry : entries) { int row = -1; - std::shared_lock readLock{ dataMtx_ }; for (int i = 0; i < data_.size(); ++i) { auto& de = data_.at(i); if ((entry.txHash == de.txHash) && (de.walletIds == entry.walletIds)) { @@ -237,18 +236,23 @@ void TxListModel::addRows(const std::vector& entries) if (!newEntries.empty()) { QMetaObject::invokeMethod(this, [this, newEntries] { logger_->debug("[TxListModel::addRows] {} new entries", newEntries.size()); - //std::unique_lock writeLock{ dataMtx_ }; - beginInsertRows(QModelIndex(), rowCount(), rowCount() + newEntries.size() - 1); - data_.insert(data_.end(), newEntries.cbegin(), newEntries.cend()); - endInsertRows(); + { + beginInsertRows(QModelIndex(), rowCount(), rowCount() + newEntries.size() - 1); + std::unique_lock lock{ dataMtx_ }; + data_.insert(data_.end(), newEntries.cbegin(), newEntries.cend()); + endInsertRows(); + } emit nbTxChanged(); if (!pendingDetails_.empty()) { logger_->debug("[TxListModel::addRows] {} pending details", pendingDetails_.size()); - for (const auto& txDet : pendingDetails_) { - setDetails(txDet); + while (!pendingDetails_.empty()) { + std::unique_lock lock{ dataMtx_ }; + auto txDet = *pendingDetails_.rbegin(); + pendingDetails_.pop_back(); + lock.unlock(); + setDetails(txDet, false); } - pendingDetails_.clear(); } }); } @@ -256,8 +260,8 @@ void TxListModel::addRows(const std::vector& entries) void TxListModel::clear() { - //std::unique_lock writeLock{ dataMtx_ }; beginResetModel(); + std::unique_lock lock{ dataMtx_ }; data_.clear(); txDetails_.clear(); endResetModel(); @@ -282,14 +286,13 @@ void TxListModel::setTxComment(const std::string& txHash, const std::string& com } } -void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet) +void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet, bool usePending) { int row = -1; - //std::shared_lock readLock{ dataMtx_ }; + std::unique_lock lock{ dataMtx_ }; for (int i = 0; i < data_.size(); ++i) { const auto& entry = data_.at(i); if ((entry.txHash == txDet.txHash) && (txDet.walletIds == entry.walletIds)) { - std::unique_lock writeLock{ dataMtx_ }; txDetails_[i] = txDet; data_[i].addresses = txDet.ownAddresses; row = i; @@ -303,15 +306,15 @@ void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet) } else { logger_->warn("[TxListModel::setDetails] {} {} not found", txDet.txHash.toHexStr(), txDet.hdWalletId); - //std::unique_lock writeLock{ dataMtx_ }; - pendingDetails_.push_back(txDet); + if (usePending) { + pendingDetails_.push_back(txDet); + } } } void TxListModel::removeTX(const BinaryData& txHash) { int rowStart = -1, rowEnd = -1; - std::shared_lock readLock{ dataMtx_ }; for (int i = 0; i < data_.size(); ++i) { const auto& entry = data_.at(i); if (entry.txHash == txHash) { @@ -330,8 +333,8 @@ void TxListModel::removeTX(const BinaryData& txHash) if (rowStart >= rowCount()) { return; } - //std::unique_lock writeLock{ dataMtx_ }; beginRemoveRows(QModelIndex(), rowStart, rowEnd); + std::unique_lock lock{ dataMtx_ }; data_.erase(data_.cbegin() + rowStart, data_.cbegin() + rowEnd + 1); for (int i = rowEnd + 1; i < txDetails_.size(); i++) { txDetails_[i - (rowEnd - rowStart) - 1] = std::move(txDetails_[i]); @@ -372,7 +375,6 @@ bool TxListModel::exportCSVto(const QString& filename) return false; } fstrm << "sep=;\nTimestamp;Wallet;Type;Address;TxId;Amount;Comment\n"; - std::shared_lock readLock{ dataMtx_ }; for (int i = 0; i < rowCount(); ++i) { const auto& entry = data_.at(i); std::time_t txTime = entry.txTime; diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 9f574bc6f..705d4bd6f 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -12,7 +12,7 @@ #define TX_LIST_MODEL_H #include -#include +#include #include #include #include @@ -49,7 +49,7 @@ class TxListModel : public QAbstractTableModel void addRows(const std::vector&); void clear(); void setTxComment(const std::string& txHash, const std::string& comment); - void setDetails(const bs::sync::TXWalletDetails&); + void setDetails(const bs::sync::TXWalletDetails&, bool usePending = true); void removeTX(const BinaryData& txHash); void setCurrentBlock(uint32_t); @@ -74,7 +74,7 @@ class TxListModel : public QAbstractTableModel std::map txDetails_; std::vector pendingDetails_; uint32_t curBlock_; - std::shared_mutex dataMtx_; + std::mutex dataMtx_; }; class TxListForAddr : public QAbstractTableModel diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 339bf8e66..caab52a0b 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -228,8 +228,8 @@ ApplicationWindow { Image { id: imgEnvKind width: 16 - source: (bsApp.armoryServerIndex === 0) ? "qrc:/images/bitcoin-main-net.png" : - ((bsApp.armoryServerIndex === 1) ? "qrc:/images/bitcoin-test-net.png" : "qrc:/images/bitcoin-disabled.png") + source: (bsApp.armoryState !== 7) ? "qrc:/images/bitcoin-disabled.png" : + ((bsApp.networkType === 0) ? "qrc:/images/bitcoin-main-net.png" : "qrc:/images/bitcoin-test-net.png") } Label { diff --git a/common b/common index a15d458e0..9eb75cb18 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit a15d458e0a450e146ddae39154e129f279de8758 +Subproject commit 9eb75cb18dc42e31b1cc32311c1b042c137f1d63 From c3adbc598eff1478de72c294c7d05e9b0e06dc7e Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 20 Mar 2023 20:32:54 +0300 Subject: [PATCH 250/436] properly init network type on start-up --- GUI/QtQuick/QtQuickAdapter.cpp | 7 ++++--- common | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index ee638e787..06522a6e0 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -400,6 +400,9 @@ void QtQuickAdapter::onArmoryServerSelected(int index) const auto newNetType = model->data(index).netType; if (netType_ != newNetType) { + if (txModel_) { + txModel_->clear(); + } netType_ = newNetType; emit networkTypeChanged(); } @@ -562,6 +565,7 @@ ProcessingResult QtQuickAdapter::processBlockchain(const Envelope &env) break; case ArmoryMessage::kStateChanged: armoryState_ = msg.state_changed().state(); + netType_ = static_cast(msg.state_changed().net_type()); setTopBlock(msg.state_changed().top_block()); emit armoryStateChanged(); break; @@ -650,9 +654,6 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) if (addrModel_) { addrModel_->reset({}); } - if (txModel_) { - txModel_->clear(); - } if (walletBalances_) { walletBalances_->clear(); } diff --git a/common b/common index 9eb75cb18..e0f7d2040 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 9eb75cb18dc42e31b1cc32311c1b042c137f1d63 +Subproject commit e0f7d2040388aa475c7b4be447987c7efb4181cc From 73fc9d2f7f7b429cddac76bde546b67e917b77f4 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 20 Mar 2023 20:42:21 +0300 Subject: [PATCH 251/436] initiate wallet selection after switching networks --- GUI/QtQuick/QtQuickAdapter.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 06522a6e0..e3cc4dd4f 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -687,11 +687,10 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) { const int lastIdx = settingsController_->getParam(ApplicationSettings::Setting::SelectedWallet).toInt(); if ((lastIdx >= 0) && (lastIdx < nWalletsLoaded_)) { - logger_->debug("[{}] selecting wallet #{}", __func__, lastIdx); walletSelected(lastIdx); } - else { - logger_->debug("[{}] wallet #{} is not selectable", __func__, lastIdx); + else if (nWalletsLoaded_ > 0) { + walletSelected(0); } } break; From 0f3258236b9dd54a514a40c42c33b1672aa7e082 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Tue, 21 Mar 2023 08:23:58 +0200 Subject: [PATCH 252/436] [QT-20,30,44] change password & setting general & replace plugins text --- GUI/QtQuick/QtQuickAdapter.cpp | 4 ++-- GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml | 2 +- GUI/QtQuick/qml/Settings/SettingsGeneral.qml | 2 +- GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml | 2 ++ GUI/QtQuick/qml/WalletProperties/ChangePassword.qml | 2 +- GUI/QtQuick/qml/main.qml | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 5fa9b0495..663f57f8e 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -621,12 +621,12 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) break; case SignerMessage::kWalletPassChanged: if (!msg.wallet_pass_changed()) { - emit showError(tr("Failed to change wallet password - see log for details")); + emit showError(tr("Failed to change wallet password\nsee log for details")); } break; case SignerMessage::kExportWoWalletResponse: if (msg.export_wo_wallet_response().empty()) { - emit showError(tr("WO wallet export failed - see log for details")); + emit showError(tr("WO wallet export failed\nsee log for details")); } else { emit successExport(QString::fromStdString(msg.export_wo_wallet_response())); diff --git a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml index 122cd0c64..f33bf184e 100644 --- a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml +++ b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml @@ -38,7 +38,7 @@ Rectangle { Text { height: parent.height width: 110 - text: qsTr("Plugins") + text: qsTr("Apps") color: BSStyle.textColor font.family: "Roboto" font.pixelSize: 20 diff --git a/GUI/QtQuick/qml/Settings/SettingsGeneral.qml b/GUI/QtQuick/qml/Settings/SettingsGeneral.qml index 2213c0d0e..8cbe1d15a 100644 --- a/GUI/QtQuick/qml/Settings/SettingsGeneral.qml +++ b/GUI/QtQuick/qml/Settings/SettingsGeneral.qml @@ -93,6 +93,6 @@ ColumnLayout { checkbox_advanced_tx.checked = bsApp.settingAdvancedTX log_file.input_text = bsApp.settingLogFile - log_file.setActiveFocus() + //log_file.setActiveFocus() } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml index 546f34192..6e05cdd62 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml @@ -72,6 +72,8 @@ Window { text: "Test Description" horizontalAlignment: Text.AlignHCenter + width: ApplicationWindow.width - 10; + wrapMode: Label.WordWrap } CustomButton { diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml index 9014362e2..32c238229 100644 --- a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -106,7 +106,7 @@ ColumnLayout { confirm_password.input_text ) if (result === 0) { - clear() + init() } } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 339bf8e66..4576d10f0 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -380,7 +380,7 @@ ApplicationWindow { CustomTabButton { id: btnPlugins - text: qsTr("Plugins") + text: qsTr("Apps") Component.onCompleted: { btnPlugins.setIcons ("qrc:/images/plugins_icon.png", "qrc:/images/plugins_icon_unchoosed.png") } From e929ef8e9881f7bc010bd0b1cdda36cee7388a54 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Tue, 21 Mar 2023 12:16:30 +0200 Subject: [PATCH 253/436] [QT-39] password confirm --- GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml index f6871bb72..e4370d281 100644 --- a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml @@ -40,6 +40,13 @@ ColumnLayout { isHiddenText: true title_text: qsTr("Password") + + Keys.onEnterPressed: { + confirm_password.setActiveFocus() + } + Keys.onReturnPressed: { + confirm_password.setActiveFocus() + } } @@ -77,6 +84,7 @@ ColumnLayout { width: 530 enabled: (password.input_text !== "") && (confirm_password.input_text !== "") + && (password.input_text === confirm_password.input_text) preferred: true function click_enter() { From 31f17536e9eabdc96868065b348c3e73dcd29d21 Mon Sep 17 00:00:00 2001 From: YZ Date: Tue, 21 Mar 2023 12:29:49 +0100 Subject: [PATCH 254/436] Fixing send behaviour --- GUI/QtQuick/qml/Receive/ReceiveQrCode.qml | 2 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 20 ++++++++++++++++---- GUI/QtQuick/qml/Send/SimpleDetails.qml | 12 ++++++++++-- GUI/QtQuick/qml/Send/WalletsComboBox.qml | 4 ++-- GUI/QtQuick/qml/main.qml | 12 +----------- 5 files changed, 30 insertions(+), 20 deletions(-) diff --git a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml index 756f4f747..72fb07e93 100644 --- a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml +++ b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml @@ -44,7 +44,7 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: 6 Layout.preferredHeight : 16 - text: qsTr("%1 / Native SegWit").arg(getWalletData(overviewWalletIndex, WalletBalance.NameRole)) + text: qsTr("%1 / Native SegWit").arg(getWalletData(walletBalances.selectedWallet, WalletBalance.NameRole)) color: "#E2E7FF" font.pixelSize: 14 font.family: "Roboto" diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 97592e19d..cedd71f79 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -188,7 +188,12 @@ ColumnLayout { width: 504 height: 70 - onActivated: (index_act) => { + onActivated: { + walletBalances.selectedWallet = currentIndex + prepareRequest() + } + + function prepareRequest() { if (rec_addr_input.isValid) { create_temp_request() } @@ -202,7 +207,16 @@ ColumnLayout { amount_input.input_text = tempRequest.maxAmount } - bsApp.getUTXOsForWallet(index_act) + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) + } + + Connections { + target: walletBalances + onChanged: { + if (layout.visible) { + prepareRequest() + } + } } } @@ -597,8 +611,6 @@ ColumnLayout { //only after we will have signal rowchanged if (fee_suggest_combo.currentIndex >= 0) fee_suggest_combo.currentIndex = 0 - if (from_wallet_combo.currentIndex >= 0) - from_wallet_combo.currentIndex = overviewWalletIndex amount_input.input_text = "" comment_input.input_text = "" diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 0e7cf8b71..3c26e2518 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -126,8 +126,18 @@ ColumnLayout { width: 271 onActivated: (index_act) => { + walletBalances.selectedWallet = currentIndex create_temp_request() } + + Connections { + target: walletBalances + onChanged: { + if (layout.visible) { + create_temp_request() + } + } + } } Label { @@ -239,8 +249,6 @@ ColumnLayout { //only after we will have signal rowchanged if (fee_suggest_combo.currentIndex >= 0) fee_suggest_combo.currentIndex = 0 - if (from_wallet_combo.currentIndex >= 0) - from_wallet_combo.currentIndex = overviewWalletIndex amount_input.input_text = "" comment_input.input_text = "" diff --git a/GUI/QtQuick/qml/Send/WalletsComboBox.qml b/GUI/QtQuick/qml/Send/WalletsComboBox.qml index 7c9464169..c956f075f 100644 --- a/GUI/QtQuick/qml/Send/WalletsComboBox.qml +++ b/GUI/QtQuick/qml/Send/WalletsComboBox.qml @@ -23,11 +23,11 @@ CustomComboBox { height: 70 model: walletBalances - currentIndex: overviewWalletIndex + currentIndex: walletBalances.selectedWallet //aliases title_text: qsTr("From Wallet") - details_text: getWalletData(currentIndex, WalletBalance.TotalRole) + details_text: walletBalances.totalBalance textRole: "name" valueRole: "name" diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index b2525ea3a..e9a2dff3b 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -36,7 +36,6 @@ ApplicationWindow { property var currentDialog: ({}) property bool isNoWalletsWizard: false - property int overviewWalletIndex: -1 readonly property int resizeAnimationDuration: 25 FontLoader { @@ -114,15 +113,6 @@ ApplicationWindow { show_popup(error_dialog) } - function onWalletsListChanged () - { - console.log("onWalletsListChanged: overviewWalletIndex = " + overviewWalletIndex) - if (overviewWalletIndex === -1) - { - overviewWalletIndex = 0 - } - } - function onWalletsLoaded (nb) { if (nb === 0) @@ -267,7 +257,7 @@ ApplicationWindow { onClicked: { topMenuBtnClicked(btnReceive) - bsApp.generateNewAddress(overviewWalletIndex, true) + bsApp.generateNewAddress(walletBalances.selectedWallet, true) show_popup(receive_popup) } } From 832c2011587f7237f53315ce3c5411c67ead9c9b Mon Sep 17 00:00:00 2001 From: YZ Date: Tue, 21 Mar 2023 16:05:11 +0100 Subject: [PATCH 255/436] Length check to fix errors --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 +- GUI/QtQuick/qml/Send/SimpleDetails.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index cedd71f79..4c84a997f 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -596,7 +596,7 @@ ColumnLayout { function create_temp_request() { - if (rec_addr_input.isValid) { + if (rec_addr_input.isValid && rec_addr_input.input_text.length) { var fpb = parseFloat(fee_suggest_combo.edit_value()) tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 3c26e2518..0ebfc2b56 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -233,7 +233,7 @@ ColumnLayout { function create_temp_request() { - if (rec_addr_input.isValid) { + if (rec_addr_input.isValid && rec_addr_input.input_text.length) { var fpb = parseFloat(fee_suggest_combo.edit_value()) tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) From e95cef1211bbfc2878f1d57155e1a3e4787d58b7 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Tue, 21 Mar 2023 17:29:28 +0200 Subject: [PATCH 256/436] [QT-29,32,38,46] advanced dlg option & simple tx & windows icons & number spacing --- .vscode/settings.json | 66 +++++++++++++++++- BlockSettleApp/blocksettle.ico | Bin 399142 -> 399142 bytes GUI/QtQuick/images/terminal.ico | Bin 399142 -> 399142 bytes GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml | 2 +- GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 2 +- GUI/QtQuick/qml/Send/SendPopup.qml | 7 +- 6 files changed, 72 insertions(+), 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 6b66034bc..27ef0bb60 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,6 +6,70 @@ "ios": "cpp", "type_traits": "cpp", "xstring": "cpp", - "xutility": "cpp" + "xutility": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "bitset": "cpp", + "cctype": "cpp", + "chrono": "cpp", + "cinttypes": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "condition_variable": "cpp", + "csignal": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "list": "cpp", + "set": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "regex": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "utility": "cpp", + "fstream": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "numbers": "cpp", + "ostream": "cpp", + "semaphore": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "typeinfo": "cpp", + "variant": "cpp" } } \ No newline at end of file diff --git a/BlockSettleApp/blocksettle.ico b/BlockSettleApp/blocksettle.ico index 9715c9cecaa7964a39ac0254b0f43efcc129e689..68a3bdfbd575e29a85950680f8491fb85540d40b 100644 GIT binary patch literal 399142 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 Date: Tue, 21 Mar 2023 17:53:52 +0200 Subject: [PATCH 257/436] [QT-45] remove old network icon and code --- BlockSettleSigner/main.cpp | 2 +- BlockSettleSigner/signer.qrc | 1 - GUI/QtQuick/images/bs_logo.png | Bin 3134 -> 0 bytes 3 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 GUI/QtQuick/images/bs_logo.png diff --git a/BlockSettleSigner/main.cpp b/BlockSettleSigner/main.cpp index 9d9a50aae..5e4e61aad 100644 --- a/BlockSettleSigner/main.cpp +++ b/BlockSettleSigner/main.cpp @@ -222,7 +222,7 @@ static int QMLApp(int argc, char **argv QApplication::setOrganizationName(QLatin1String("BlockSettle")); QApplication::setApplicationName(QLatin1String("Signer")); #endif - QApplication::setWindowIcon(QIcon(QStringLiteral(":/images/bs_logo.png"))); + QApplication::setWindowIcon(QIcon(QStringLiteral(":/images/terminal.ico"))); // ToDo: support 2.0 styles // app.setStyle(QStyleFactory::create(QStringLiteral("Universal"))); diff --git a/BlockSettleSigner/signer.qrc b/BlockSettleSigner/signer.qrc index 00d5f9317..429ef6ecb 100644 --- a/BlockSettleSigner/signer.qrc +++ b/BlockSettleSigner/signer.qrc @@ -10,7 +10,6 @@ --> - images/bs_logo.png images/full_logo.png images/notification_critical.png images/notification_info.png diff --git a/GUI/QtQuick/images/bs_logo.png b/GUI/QtQuick/images/bs_logo.png deleted file mode 100644 index 640473792e366e39f53ad1ac64fd028f6ebcdf09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3134 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 d Date: Tue, 21 Mar 2023 18:07:09 +0100 Subject: [PATCH 258/436] Fixed crash --- GUI/QtQuick/QtQuickAdapter.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 9b17c58bf..4a59de0aa 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -685,12 +685,14 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) emit walletsLoaded(msg.ready()); logger_->debug("[{}] loaded {} wallet[s]", __func__, msg.ready()); { - const int lastIdx = settingsController_->getParam(ApplicationSettings::Setting::SelectedWallet).toInt(); - if ((lastIdx >= 0) && (lastIdx < nWalletsLoaded_)) { - walletSelected(lastIdx); - } - else if (nWalletsLoaded_ > 0) { - walletSelected(0); + if (settingsController_->hasParam(ApplicationSettings::Setting::SelectedWallet)) { + const int lastIdx = settingsController_->getParam(ApplicationSettings::Setting::SelectedWallet).toInt(); + if ((lastIdx >= 0) && (lastIdx < nWalletsLoaded_)) { + walletSelected(lastIdx); + } + else if (nWalletsLoaded_ > 0) { + walletSelected(0); + } } } break; From b875c04c81f917d9d34ec26fb00d1c984dc30f8b Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Wed, 22 Mar 2023 09:11:28 +0200 Subject: [PATCH 259/436] [QT-27,38,47] make about dialog & update icons & simple dialog comment trigger --- BlockSettleApp/blocksettle.ico | Bin 399142 -> 399142 bytes GUI/QtQuick/images/about_github.svg | 10 ++ GUI/QtQuick/images/about_hello.svg | 3 + GUI/QtQuick/images/about_telegram.svg | 3 + GUI/QtQuick/images/about_terminal.svg | 3 + GUI/QtQuick/images/about_twitter.svg | 3 + GUI/QtQuick/images/terminal.ico | Bin 399142 -> 399142 bytes GUI/QtQuick/qml/Send/SimpleDetails.qml | 5 + GUI/QtQuick/qml/Settings/SettingsAbout.qml | 109 ++++++++++++++++++ GUI/QtQuick/qml/Settings/SettingsPopup.qml | 8 +- .../qml/StyledControls/CustomTextEdit.qml | 9 +- GUI/QtQuick/qtquick.qrc | 6 + 12 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 GUI/QtQuick/images/about_github.svg create mode 100644 GUI/QtQuick/images/about_hello.svg create mode 100644 GUI/QtQuick/images/about_telegram.svg create mode 100644 GUI/QtQuick/images/about_terminal.svg create mode 100644 GUI/QtQuick/images/about_twitter.svg create mode 100644 GUI/QtQuick/qml/Settings/SettingsAbout.qml diff --git a/BlockSettleApp/blocksettle.ico b/BlockSettleApp/blocksettle.ico index 68a3bdfbd575e29a85950680f8491fb85540d40b..99ce048b30e5bfd417f80a843ea82b12a48050cd 100644 GIT binary patch literal 399142 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 literal 399142 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 + + + + + + + + + diff --git a/GUI/QtQuick/images/about_hello.svg b/GUI/QtQuick/images/about_hello.svg new file mode 100644 index 000000000..9b6dbf497 --- /dev/null +++ b/GUI/QtQuick/images/about_hello.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/images/about_telegram.svg b/GUI/QtQuick/images/about_telegram.svg new file mode 100644 index 000000000..dfa1fc974 --- /dev/null +++ b/GUI/QtQuick/images/about_telegram.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/images/about_terminal.svg b/GUI/QtQuick/images/about_terminal.svg new file mode 100644 index 000000000..d7fee6f7c --- /dev/null +++ b/GUI/QtQuick/images/about_terminal.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/images/about_twitter.svg b/GUI/QtQuick/images/about_twitter.svg new file mode 100644 index 000000000..0dface869 --- /dev/null +++ b/GUI/QtQuick/images/about_twitter.svg @@ -0,0 +1,3 @@ + + + diff --git a/GUI/QtQuick/images/terminal.ico b/GUI/QtQuick/images/terminal.ico index 68a3bdfbd575e29a85950680f8491fb85540d40b..99ce048b30e5bfd417f80a843ea82b12a48050cd 100644 GIT binary patch literal 399142 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 literal 399142 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/StyledControls/CustomListItem.qml qml/StyledControls/CustomListRadioButton.qml qml/Settings/SettingsGeneral.qml + qml/Settings/SettingsAbout.qml + images/about_github.svg + images/about_hello.svg + images/about_telegram.svg + images/about_terminal.svg + images/about_twitter.svg images/combobox_open_button.svg qml/StyledControls/CustomTableView.qml qml/StyledControls/CustomSmallButton.qml From 1b3091fae053cfbfe87dd3fb36c66f8df168b59c Mon Sep 17 00:00:00 2001 From: YZ Date: Sun, 19 Mar 2023 21:13:50 +0100 Subject: [PATCH 260/436] Plugin popup --- GUI/QtQuick/QtQuickAdapter.cpp | 1 + GUI/QtQuick/images/sideshift_btc.png | Bin 0 -> 3074 bytes GUI/QtQuick/images/transfer_icon.png | Bin 0 -> 674 bytes .../qml/Plugins/Common/PluginPopup.qml | 34 ++++ .../qml/Plugins/Common/PluginsPage.qml | 11 +- .../qml/Plugins/SideShift/SideShiftButton.qml | 46 ++++++ .../Plugins/SideShift/SideShiftCombobox.qml | 126 +++++++++++++++ .../SideShift/SideShiftComboboxWithIcon.qml | 146 ++++++++++++++++++ .../Plugins/SideShift/SideShiftIconButton.qml | 36 +++++ .../qml/Plugins/SideShift/SideShiftPopup.qml | 123 +++++++++++++++ .../Plugins/SideShift/SideShiftTextInput.qml | 53 +++++++ GUI/QtQuick/qml/StyledControls/TestItem.qml | 106 +++++++++++++ GUI/QtQuick/qtquick.qrc | 10 ++ .../viewmodels/plugins/PluginsListModel.cpp | 14 +- .../viewmodels/plugins/PluginsListModel.h | 4 + .../plugins/SideShiftController.cpp | 21 +++ .../viewmodels/plugins/SideShiftController.h | 27 ++++ 17 files changed, 756 insertions(+), 2 deletions(-) create mode 100644 GUI/QtQuick/images/sideshift_btc.png create mode 100644 GUI/QtQuick/images/transfer_icon.png create mode 100644 GUI/QtQuick/qml/Plugins/Common/PluginPopup.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideShift/SideShiftIconButton.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml create mode 100644 GUI/QtQuick/qml/StyledControls/TestItem.qml create mode 100644 GUI/QtQuick/viewmodels/plugins/SideShiftController.cpp create mode 100644 GUI/QtQuick/viewmodels/plugins/SideShiftController.h diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 4a59de0aa..4306fad40 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -299,6 +299,7 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("feeSuggestions"), feeSuggModel_); rootCtxt_->setContextProperty(QLatin1Literal("addressFilterModel"), addressFilterModel_.get()); rootCtxt_->setContextProperty(QLatin1Literal("transactionFilterModel"), transactionFilterModel_.get()); + rootCtxt_->setContextProperty(QLatin1Literal("pluginsListModel"), pluginsListModel_.get()); rootCtxt_->setContextProperty(QLatin1Literal("pluginFilterModel"), pluginsFilterModel_.get()); engine.addImageProvider(QLatin1Literal("QR"), new QRImageProvider); diff --git a/GUI/QtQuick/images/sideshift_btc.png b/GUI/QtQuick/images/sideshift_btc.png new file mode 100644 index 0000000000000000000000000000000000000000..2d3a8b7d8f5b53741775d3ce64eeb67c81729344 GIT binary patch literal 3074 zcmV+d4E^(oP)ZgXgFbngSdJ^%mji)h5>(sGbr>PCGA$Cw4h(NLt0we@TutF;Y?gJyN)k>>f z_N>4eesAoq&N=+&T)yu+-#GeYNx&gO3O9Dz{NkEA#2`G^z0VSeb=mw-> zs40fdpn^tQ1P!HtrnCqE5Sy4njGjhpds%0nJv7m>`H)>eb%_F7?ykoAJtmYd)5uxX9HIV6eDeMvK6yWYcx+nMx?~fuw4w;x z_AST8y;V?Y6mnFNlh{N8m);vh+X+8n6A4-BATFS)xDa3YW(}PC%up09jzvB`IfL_W z_o3~b0VLuxM9U^B;JV!=>^istR2kX%jTGS^gHx|~(A_pdtV|*TDpiHJ_lbI}*g z;MQg{_B^t3UKK7@-hQ?VUFSohe<#|`SiP;{OD7%x-1mceEVGr0{+%cRm)R)X|KkSH zmD~y_iVAVyX*={Lao&<(0V#bE_8(pgg;M@G&t`DKQMFt4deSM;72&{PJBrl87eztQ zn1Vv!TR*ph(#vNc>og`bSsy~3VH*H|NziZ&otCY>Y#3^a(foKFjz8Na=zBpu@XqgA zVO}kMe&C}<@0b${m=!GbZ?%$wMc+uYPNA&XVZf%n%LIL!vj;A3&|>So)shA7*&JPJRc710BdM=G-eVChJ42RZ}QTA_{k?6~U+%!3ht-%E z<)oTGq_J)+;|R#=YlVse)HX^NurJ&RCLu0Nu2xcWy^W7{e+zHfOhUe_gca+!+OPyP z*OwC81ox$^hC$j3U)YsX)YM=?Hkbs>Yp$ewIwYxCqlHq%p5ItQxVoNP#HHQe0{2K8 z+@aRFUZGY}IJoKgti!BE=MWUaQYlL^K2Oe{a#5%#fN2E<{}(rhF-uO8es5p66Rx4t ztRa;v##fhPfdFQG=WHwbSHJGGMHHFqrfM(ndcnekmD z7JyD&iOuF_S)(}V8nK3OdA0o6QvuooCJ}`?%P_PVoSc>3$$nO!VT;`0>)DE?hg2R;A zu1pe)dWANNmry^uld%Q#=eGwY&6#Y}RpbsXsFf5RSoaKX4`dQiVu?zles(8gt-^!u z2_ltY&JKGDlftWakBdb;+yQf9bwKhj(}aQAtd6q zyag5jKr@f+&rC#^AkJSuDobW-j834pgPR}25ik*-L3is2)_%=Myb-CWmDFsOYK1fB zUT-d3Lub(8Z;>@q>*`0Lj7P&VMq^wb24xk{QMDU;>kkntuV1%Q#MZ z+s67MQa>NFC7V~%tx6Qgk`RfVwFb)?!R7!zehMaj*R0`$}vyrUfefRV|51Zgi$^}LKLgC{XC z-c7Xb(|_`!w>|e6VnOc4f8Mypi9+Oq)Ls>&y`0cjYT^<}x-N|1;}Zjdz7>4nnkp;8 zBfsC6*Bd!>8WSw~M%jeQ#OPoQe|+LHrWj!t_J}&MzRXsNgTHRftDl@tVsrwp{p1Qp z2ZTEjqLdiynZWVq$j&v3h3Ui%9DU|9QQ`sfIP&klID%70+Z7bQ_?6li|D9u32YhCL=(&K(PZ4o~6Idjq)m?jRWY7P-MP9Zjhcx7|~X4SP(`8P#%D zHOF8NjZe=6aPeJX{;U-8dW)}RtqvRRG@)*5Iq`XNY=}YE`C(l7ASmfNJF(^R}B%nl=1eD1C0oo>PMKE=i QS^xk507*qoM6N<$f~`==XaE2J literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/transfer_icon.png b/GUI/QtQuick/images/transfer_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba69cfa4f2cf8cec5886543c2b7407718909e60 GIT binary patch literal 674 zcmV;T0$u%yP)ZgXgFbngSdJ^%m$G)Y83R9J;$ z6y)aq&oIaU(?B}_8z9+HqT-SawodM}a0?u;kfPYu$%7#}Ih%otn}^}>zMZsk6LF5> z;^AdT%PnItGPj|bLy!SMM``LBGNk5~F^Gss(8E0p3=9Mu6%?7k5D*@ZRZc_4fGQ5S zapeMr7$deKK~!9lA-|%TK~7PbDi-4daRH7PVi+N1Y+=KYnp@7m#mz%=2jK!3MM6+S z!hkx6fdPx7T5Ad!j_ltx5N?43jOhFJm{k>NeVDBvu0pmU|`VHF=UuMse|F+{X0bKrFrzpDJnBG_s?c<_YEOh58cvKbaFOB zRZBln(TPz`1w|$>{HH?66&QiN#ro~*7lw%)bqv=ppC{f?i#F`1+(kryotxJ%ES)n2q}SPyhe`07*qo IM6N<$f*f}yfB*mh literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/qml/Plugins/Common/PluginPopup.qml b/GUI/QtQuick/qml/Plugins/Common/PluginPopup.qml new file mode 100644 index 000000000..ddbe98fb9 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/Common/PluginPopup.qml @@ -0,0 +1,34 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.12 + +import "../../StyledControls" + +Popup { + id: plugin_popup + width: 580 + height: 720 + anchors.centerIn: Overlay.overlay + + property var controller: null + + modal: true + focus: true + closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside + + CloseIconButton { + anchors.right: parent.right + anchors.top: parent.top + onClose: plugin_popup.close() + } +} diff --git a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml index f33bf184e..4701b6585 100644 --- a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml +++ b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml @@ -12,6 +12,7 @@ import QtQuick 2.9 import QtQuick.Controls 2.3 import "." +import "../SideShift" import "../../BsStyles" import "../../StyledControls" @@ -55,7 +56,7 @@ Rectangle { height: parent.height - header.height cellWidth: 237 cellHeight: 302 - model: pluginFilterModel + model: pluginsListModel clip: true ScrollBar.vertical: ScrollBar { @@ -73,6 +74,14 @@ Rectangle { name: name_role description: description_role icon_source: icon_role + onCardClicked: plugin_popup.open() + } + + SideShiftPopup { + id: plugin_popup + Component.onCompleted: { + plugin_popup.controller = pluginsListModel.getPlugin(index) + } } } } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml new file mode 100644 index 000000000..69788ec99 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml @@ -0,0 +1,46 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.3 + + +Button { + id: control + + width: 150 + height: 50 + + font.pixelSize: 14 + font.family: "Roboto" + font.letterSpacing: 0.5 + + hoverEnabled: true + + background: Rectangle { + id: backgroundItem + color: "black" + radius: 4 + + border.color: + (control.hovered ? "white" : + (control.activeFocus ? "gray" : "gray")) + border.width: 1 + } + + contentItem: Text { + text: control.text + font: control.font + anchors.fill: parent + color: "white" + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } +} diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml new file mode 100644 index 000000000..442593c20 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml @@ -0,0 +1,126 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ + +import QtQuick 2.9 +import QtQuick.Controls 2.3 + +import "../../BsStyles" + +ComboBox { + id: control + + width: 400 + height: 50 + + activeFocusOnTab: true + + contentItem: Rectangle { + + id: input_rect + color: "transparent" + + Column { + spacing: 8 + anchors.centerIn: parent + + Text { + text: control.currentText + font.pixelSize: 18 + font.family: "Roboto" + font.weight: Font.Bold + color: "white" + horizontalAlignment: Text.AlignHCenter + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + + indicator: Item {} + + background: Rectangle { + + color: "#181414" + opacity: 1 + radius: 4 + + border.color: control.popup.visible ? "white" : + (control.hovered ? "white" : + (control.activeFocus ? "white" : "gray")) + border.width: 1 + + implicitWidth: control.width + implicitHeight: control.height + } + + delegate: ItemDelegate { + + id: menuItem + + width: control.width - 12 + height: 50 + + leftPadding: 6 + topPadding: 4 + bottomPadding: 4 + + contentItem: Text { + + text: control.textRole + ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) + : modelData + color: "white" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + + elide: Text.ElideNone + verticalAlignment: Text.AlignVCenter + } + + highlighted: control.highlightedIndex === index + property bool currented: control.currentIndex === index + + background: Rectangle { + color: menuItem.highlighted ? "white" : "transparent" + opacity: menuItem.highlighted ? 0.2 : 1 + radius: 4 + } + } + + popup: Popup { + id: _popup + + y: control.height - 1 + width: control.width + padding: 6 + + contentItem: ListView { + id: popup_item + + clip: true + implicitHeight: contentHeight + model: control.popup.visible ? control.delegateModel : null + //model: control.delegateModel + currentIndex: control.highlightedIndex + + ScrollIndicator.vertical: ScrollIndicator { } + } + + background: Rectangle { + color: "black" + radius: 4 + + border.width: 1 + border.color: "white" + } + } +} + diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml new file mode 100644 index 000000000..8055a81a2 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml @@ -0,0 +1,146 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ + +import QtQuick 2.9 +import QtQuick.Controls 2.3 + +import "../../BsStyles" + +ComboBox { + id: control + + width: 200 + height: 200 + + property string controlHint + property int popupWidth + + activeFocusOnTab: true + + contentItem: Rectangle { + + id: input_rect + color: "transparent" + + Column { + spacing: 8 + anchors.centerIn: parent + + Image { + width: 80 + height: 80 + source: model[currentIndex].icon + anchors.horizontalCenter: parent.horizontalCenter + } + + Text { + text: control.controlHint + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + color: "white" + topPadding: 15 + anchors.horizontalCenter: parent.horizontalCenter + } + + Text { + text: control.currentText + font.pixelSize: 18 + font.family: "Roboto" + font.weight: Font.Bold + color: "white" + horizontalAlignment: Text.AlignHCenter + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + + indicator: Item {} + + background: Rectangle { + + color: "#181414" + opacity: 1 + radius: 14 + + border.color: control.popup.visible ? "white" : + (control.hovered ? "white" : + (control.activeFocus ? "white" : "gray")) + border.width: 1 + + implicitWidth: control.width + implicitHeight: control.height + } + + delegate: ItemDelegate { + + id: menuItem + + width: control.popupWidth - 12 + height: 50 + + leftPadding: 6 + topPadding: 4 + bottomPadding: 4 + + contentItem: Text { + + text: control.textRole + ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) + : modelData + color: "white" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + + elide: Text.ElideNone + verticalAlignment: Text.AlignVCenter + } + + highlighted: control.highlightedIndex === index + property bool currented: control.currentIndex === index + + background: Rectangle { + color: menuItem.highlighted ? "white" : "transparent" + opacity: menuItem.highlighted ? 0.2 : 1 + radius: 4 + } + } + + popup: Popup { + id: _popup + + y: control.height - 1 + width: control.popupWidth + padding: 6 + + contentItem: ListView { + id: popup_item + + clip: true + implicitHeight: contentHeight + model: control.popup.visible ? control.delegateModel : null + //model: control.delegateModel + currentIndex: control.highlightedIndex + + ScrollIndicator.vertical: ScrollIndicator { } + } + + background: Rectangle { + color: "black" + radius: 14 + + border.width: 1 + border.color: "white" + } + } +} + diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftIconButton.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftIconButton.qml new file mode 100644 index 000000000..7ed0377d9 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftIconButton.qml @@ -0,0 +1,36 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.12 + +Rectangle { + id: control + width: 40 + height: 40 + color: "transparent" + + signal buttonClicked() + + Image { + anchors.fill: parent + source: "qrc:/images/transfer_icon.png" + } + + MouseArea { + id: mouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + control.buttonClicked() + } + } +} \ No newline at end of file diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml new file mode 100644 index 000000000..edd692425 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml @@ -0,0 +1,123 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.12 + +import "." +import "../Common" +import "../../" + +PluginPopup { + id: root + + property bool receive: true + property var receiveModel: [ + { + currency: "BTC", + icon: "qrc:/images/sideshift_btc.png" + }, + { + currency: "ETC", + icon: "qrc:/images/sideshift_btc.png" + }, + { + currency: "DOG", + icon: "qrc:/images/sideshift_btc.png" + }, + { + currency: "XYZ", + icon: "qrc:/images/sideshift_btc.png" + }, + ] + property var sendModel: [ + { + currency: "BTC", + icon: "qrc:/images/sideshift_btc.png" + } + ] + + background: Rectangle { + anchors.fill: parent + color: "black" + radius: 14 + } + + contentItem: Item { + Column { + anchors.centerIn: parent + spacing: 20 + + Text { + text: root.controller.conversionRate + color: "gray" + font.pixelSize: 14 + font.family: "Roboto" + anchors.horizontalCenter: parent.horizontalCenter + } + + Row { + spacing: 20 + anchors.horizontalCenter: parent.horizontalCenter + + SideShiftComboboxWithIcon { + popupWidth: 200 + textRole: "currency" + controlHint: qsTr("YOU SEND") + model: root.receive ? root.receiveModel : root.sendModel + } + + SideShiftIconButton { + anchors.verticalCenter: parent.verticalCenter + onButtonClicked: root.receive = !root.receive + } + + SideShiftComboboxWithIcon { + id: receivingCombobox + popupWidth: 200 + textRole: "currency" + controlHint: qsTr("YOU RECEIVE") + model: root.receive ? root.sendModel : root.receiveModel + } + } + + Item { + width: 1 + height: 20 + } + + Text { + text: qsTr("RECEIVING ADDRESS") + color: "white" + font.pixelSize: 20 + font.family: "Roboto" + anchors.horizontalCenter: parent.horizontalCenter + } + + SideShiftTextInput { + visible: !root.receive + textHint: qsTr("Your ") + receivingCombobox.currentText + qsTr(" address") + anchors.horizontalCenter: parent.horizontalCenter + } + + SideShiftCombobox { + visible: root.receive + model: bsApp.txWalletsList + anchors.horizontalCenter: parent.horizontalCenter + } + + SideShiftButton { + text: qsTr("SHIFT") + anchors.horizontalCenter: parent.horizontalCenter + } + } + } +} diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml new file mode 100644 index 000000000..844371b14 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml @@ -0,0 +1,53 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.12 + +Rectangle { + id: control + width: 400 + height: 50 + radius: 4 + color: "#181414" + border.width: 1 + border.color: (mouseArea.containsMouse || control.activeFocus) ? "white" : "gray" + + property string textHint + property string fontFamily + + TextEdit { + id: textEdit + color: "white" + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + anchors.fill: parent + font.family: control.fontFamily + + Text { + text: control.textHint + color: "white" + anchors.centerIn: parent + font.family: control.fontFamily + visible: textEdit.text == "" && !textEdit.activeFocus + } + } + + MouseArea { + id: mouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + textEdit.forceActiveFocus() + mouse.accepted = false + } + } +} \ No newline at end of file diff --git a/GUI/QtQuick/qml/StyledControls/TestItem.qml b/GUI/QtQuick/qml/StyledControls/TestItem.qml new file mode 100644 index 000000000..0917218f9 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/TestItem.qml @@ -0,0 +1,106 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.9 +import QtQuick.Controls 2.3 + +Rectangle { + width: 300 + height: 300 + color: "black" + + FontLoader { + id: robotoFont + source: "file:////home/yauhen/Workspace/terminal/GUI/QtQuick/fonts/Roboto-Regular.ttf" + } + + FontLoader { + id: robotoFontBold + source: "file:////home/yauhen/Downloads/Roboto/Roboto-Bold.ttf" + } + + Column { + anchors.fill: parent + spacing: 1 + + Text { + text: "Confirmed balance" + font.pixelSize: 12 + font.family: "Roboto" + color: "red" + font.letterSpacing: -0.2 + } + + Text { + text: "0.00004494 BTC" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Bold + font.letterSpacing: 0.2 + color: "red" + } + + Text { + text: "0.00004495 BTC" + font.pixelSize: 14 + font.family: 'Helvetica' + font.weight: Font.Bold + font.letterSpacing: 0.2 + color: "red" + } + + Text { + text: "Addresses" + font.pixelSize: 20 + font.family: "Roboto" + font.weight: Font.Bold + font.letterSpacing: 0.35 + color: "red" + } + + Text { + text: "Alex Wallet" + font.pixelSize: 16 + font.family: "Roboto" + color: "red" + } + + Text { + text: "Wallet Properties" + font.pixelSize: 12 + font.family: "Roboto" + font.letterSpacing: 0.3 + color: "red" + } + + Text { + text: "Incoming transactions" + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.DemiBold + color: "red" + } + + Text { + text: "tb1qfxa27xqumquwcstuejvswv2tqt78z9a8r9dy7d" + font.pixelSize: 13 + font.family: "Roboto" + color: "red" + font.letterSpacing: -0.2 + } + + Text { + text: "Transactions" + font.pixelSize: 14 + font.family: "Roboto" + color: "red" + } + } +} \ No newline at end of file diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 7da02097c..5b3a84a55 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -190,5 +190,15 @@ qml/Plugins/Common/Card.qml qml/Plugins/Common/PluginsPage.qml images/sideshift_plugin.png + qml/Plugins/Common/PluginPopup.qml + qml/Plugins/SideShift/SideShiftButton.qml + qml/Plugins/SideShift/SideShiftCombobox.qml + qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml + qml/Plugins/SideShift/SideShiftIconButton.qml + qml/Plugins/SideShift/SideShiftPopup.qml + qml/Plugins/SideShift/SideShiftTextInput.qml + qml/Plugins/SideShift/SideShiftTextInput.qml + images/transfer_icon.png + images/sideshift_btc.png diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp index d2f363f38..0e761ea23 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp @@ -9,6 +9,7 @@ */ #include "PluginsListModel.h" +#include "SideShiftController.h" #include namespace @@ -26,7 +27,8 @@ PluginsListModel::PluginsListModel(QObject* parent) plugins_ = { { tr("SideShift.ai") , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") - , QString::fromLatin1("qrc:/images/sideshift_plugin.png") } + , QString::fromLatin1("qrc:/images/sideshift_plugin.png") + , std::dynamic_pointer_cast(std::make_shared())} }; } @@ -56,3 +58,13 @@ QHash PluginsListModel::roleNames() const { return kRoles; } + +QObject* PluginsListModel::getPlugin(int index) +{ + try { + return plugins_.at(index).controller.get(); + } + catch (...) { + } + return nullptr; +} \ No newline at end of file diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h index 21ba89eac..c5159593b 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h @@ -14,11 +14,13 @@ #include #include #include +#include struct Plugin { QString name; QString description; QString icon; + std::shared_ptr controller; }; class PluginsListModel: public QAbstractListModel @@ -39,6 +41,8 @@ class PluginsListModel: public QAbstractListModel QVariant data(const QModelIndex& index, int role) const override; QHash roleNames() const override; + Q_INVOKABLE QObject* getPlugin(int index); + private: std::vector plugins_; }; diff --git a/GUI/QtQuick/viewmodels/plugins/SideShiftController.cpp b/GUI/QtQuick/viewmodels/plugins/SideShiftController.cpp new file mode 100644 index 000000000..e98f7a7c8 --- /dev/null +++ b/GUI/QtQuick/viewmodels/plugins/SideShiftController.cpp @@ -0,0 +1,21 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "SideShiftController.h" + +SideShiftController::SideShiftController() + : QObject() +{ +} + +QString SideShiftController::conversionRate() const +{ + return tr("1 BTC = 1 ETC"); +} diff --git a/GUI/QtQuick/viewmodels/plugins/SideShiftController.h b/GUI/QtQuick/viewmodels/plugins/SideShiftController.h new file mode 100644 index 000000000..4184f6236 --- /dev/null +++ b/GUI/QtQuick/viewmodels/plugins/SideShiftController.h @@ -0,0 +1,27 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#pragma once + +#include + +class SideShiftController: public QObject +{ + Q_OBJECT + Q_PROPERTY(QString conversionRate READ conversionRate NOTIFY changed) + +public: + SideShiftController(); + + QString conversionRate() const; + +signals: + void changed(); +}; From 53ef18914166f85f57e9302acb91683acabd0488 Mon Sep 17 00:00:00 2001 From: YZ Date: Sun, 19 Mar 2023 22:36:51 +0100 Subject: [PATCH 261/436] Dynamic components --- GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml | 18 +++++++++++++++--- GUI/QtQuick/qtquick.qrc | 1 - .../viewmodels/plugins/PluginsListModel.cpp | 7 +++++-- .../viewmodels/plugins/PluginsListModel.h | 4 +++- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml index 4701b6585..63cecce56 100644 --- a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml +++ b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml @@ -65,10 +65,14 @@ Rectangle { } delegate: Rectangle { + id: plugin_item color: "transparent" width: 237 height: 302 + property var component + property var plugin_popup + Card { anchors.top: parent.top name: name_role @@ -77,12 +81,20 @@ Rectangle { onCardClicked: plugin_popup.open() } - SideShiftPopup { - id: plugin_popup - Component.onCompleted: { + function finishCreation() { + if (component.status == Component.Ready) { plugin_popup.controller = pluginsListModel.getPlugin(index) } } + + Component.onCompleted: { + component = Qt.createComponent(path_role); + plugin_popup = component.createObject(plugin_item) + if (component.status == Component.Ready) + finishCreation(); + else + component.statusChanged.connect(finishCreation); + } } } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 5b3a84a55..e7df1165e 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -197,7 +197,6 @@ qml/Plugins/SideShift/SideShiftIconButton.qml qml/Plugins/SideShift/SideShiftPopup.qml qml/Plugins/SideShift/SideShiftTextInput.qml - qml/Plugins/SideShift/SideShiftTextInput.qml images/transfer_icon.png images/sideshift_btc.png diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp index 0e761ea23..b5caf5b6f 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp @@ -17,7 +17,8 @@ namespace static const QHash kRoles { {PluginsListModel::PluginRoles::Name, "name_role"}, {PluginsListModel::PluginRoles::Description, "description_role"}, - {PluginsListModel::PluginRoles::Icon, "icon_role"} + {PluginsListModel::PluginRoles::Icon, "icon_role"}, + {PluginsListModel::PluginRoles::Path, "path_role"} }; } @@ -28,7 +29,8 @@ PluginsListModel::PluginsListModel(QObject* parent) { tr("SideShift.ai") , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") , QString::fromLatin1("qrc:/images/sideshift_plugin.png") - , std::dynamic_pointer_cast(std::make_shared())} + , std::dynamic_pointer_cast(std::make_shared()) + , QString::fromLatin1("qrc:/qml/Plugins/SideShift/SideShiftPopup.qml") } }; } @@ -45,6 +47,7 @@ QVariant PluginsListModel::data(const QModelIndex& index, int role) const case Name: return plugins_.at(row).name; case Description: return plugins_.at(row).description; case Icon: return plugins_.at(row).icon; + case Path: return plugins_.at(row).path; default: break; } } diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h index c5159593b..4a10c2413 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h @@ -21,6 +21,7 @@ struct Plugin { QString description; QString icon; std::shared_ptr controller; + QString path; }; class PluginsListModel: public QAbstractListModel @@ -31,7 +32,8 @@ class PluginsListModel: public QAbstractListModel { Name = Qt::UserRole + 1, Description, - Icon + Icon, + Path }; Q_ENUM(PluginRoles) From 38ee0b4ddfba3a1ddc450389d2c7c4cac3f91042 Mon Sep 17 00:00:00 2001 From: YZ Date: Tue, 21 Mar 2023 12:31:37 +0100 Subject: [PATCH 262/436] Plugin update --- GUI/QtQuick/images/sideshift_right_arrow.png | Bin 0 -> 3676 bytes .../qml/Plugins/SideShift/SideShiftButton.qml | 4 +- .../Plugins/SideShift/SideShiftBuyPage.qml | 289 ++++++++++++++++++ .../Plugins/SideShift/SideShiftMainPage.qml | 92 ++++++ .../qml/Plugins/SideShift/SideShiftPopup.qml | 77 +---- GUI/QtQuick/qtquick.qrc | 1 + 6 files changed, 397 insertions(+), 66 deletions(-) create mode 100644 GUI/QtQuick/images/sideshift_right_arrow.png create mode 100644 GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml diff --git a/GUI/QtQuick/images/sideshift_right_arrow.png b/GUI/QtQuick/images/sideshift_right_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..59d011d37d97698245d0dbb1c756d2b45b16d47c GIT binary patch literal 3676 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 c`@= 0 : addressInput.text != "" + anchors.horizontalCenter: parent.horizontalCenter + } + } +} diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml index edd692425..2d4ee25f1 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml @@ -51,73 +51,22 @@ PluginPopup { radius: 14 } - contentItem: Item { - Column { - anchors.centerIn: parent - spacing: 20 - - Text { - text: root.controller.conversionRate - color: "gray" - font.pixelSize: 14 - font.family: "Roboto" - anchors.horizontalCenter: parent.horizontalCenter - } - - Row { - spacing: 20 - anchors.horizontalCenter: parent.horizontalCenter - - SideShiftComboboxWithIcon { - popupWidth: 200 - textRole: "currency" - controlHint: qsTr("YOU SEND") - model: root.receive ? root.receiveModel : root.sendModel - } - - SideShiftIconButton { - anchors.verticalCenter: parent.verticalCenter - onButtonClicked: root.receive = !root.receive - } - - SideShiftComboboxWithIcon { - id: receivingCombobox - popupWidth: 200 - textRole: "currency" - controlHint: qsTr("YOU RECEIVE") - model: root.receive ? root.sendModel : root.receiveModel - } - } - - Item { - width: 1 - height: 20 - } - - Text { - text: qsTr("RECEIVING ADDRESS") - color: "white" - font.pixelSize: 20 - font.family: "Roboto" - anchors.horizontalCenter: parent.horizontalCenter - } + contentItem: StackView { + id: stackView + initialItem: mainPage + anchors.fill: parent + } - SideShiftTextInput { - visible: !root.receive - textHint: qsTr("Your ") + receivingCombobox.currentText + qsTr(" address") - anchors.horizontalCenter: parent.horizontalCenter - } + Component { + id: mainPage - SideShiftCombobox { - visible: root.receive - model: bsApp.txWalletsList - anchors.horizontalCenter: parent.horizontalCenter - } + SideShiftMainPage { - SideShiftButton { - text: qsTr("SHIFT") - anchors.horizontalCenter: parent.horizontalCenter - } } } + + function reset() { + stackView.clear() + stackView.pop() + } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index e7df1165e..89f3c08a0 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -199,5 +199,6 @@ qml/Plugins/SideShift/SideShiftTextInput.qml images/transfer_icon.png images/sideshift_btc.png + qml/Plugins/SideShift/SideShiftMainPage.qml From 28fd028ccb259d4d306378f3616a255869ada5b0 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Wed, 22 Mar 2023 11:27:38 +0200 Subject: [PATCH 263/436] [QT-29,45] advanced simple dialog & remove old network icon --- GUI/QtQuick/images/conn_ind.png | Bin 196 -> 0 bytes GUI/QtQuick/images/conn_ind_red.png | Bin 190 -> 0 bytes GUI/QtQuick/images/conn_ind_yellow.png | Bin 199 -> 0 bytes GUI/QtQuick/images/disconn_ind.png | Bin 204 -> 0 bytes GUI/QtQuick/qml/Send/SendPopup.qml | 6 +++--- GUI/QtQuick/qml/main.qml | 7 ------- GUI/QtQuick/qtquick.qrc | 4 ---- 7 files changed, 3 insertions(+), 14 deletions(-) delete mode 100755 GUI/QtQuick/images/conn_ind.png delete mode 100644 GUI/QtQuick/images/conn_ind_red.png delete mode 100644 GUI/QtQuick/images/conn_ind_yellow.png delete mode 100644 GUI/QtQuick/images/disconn_ind.png diff --git a/GUI/QtQuick/images/conn_ind.png b/GUI/QtQuick/images/conn_ind.png deleted file mode 100755 index 16a6c32bf81863945f03d9ec6c03389026120478..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJZ3p^r=85p>QL70(Y)*K0-AY*Zm zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#NKY5XkP61qQyT>x97I?y{N1l0mDCZ_!4<%0 zq;!`g>>><5~D zAD+wqFFoN$e^2?5>bwMol}^)tu!$ryWgljm(Z_0))3oW~gO>iUiUyAzW_(th@pSj2 ey=DeL0CbF=&cV0GAKe2Q&*16m=d#Wzp$Py0L_ur- diff --git a/GUI/QtQuick/images/conn_ind_yellow.png b/GUI/QtQuick/images/conn_ind_yellow.png deleted file mode 100644 index fcfc8bd33849aa6c60f68c805cb5926acba19240..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJ3i-X*q7}lMWc?smOq&xaLGB9lH z=l+w(3gmMZctjR6FmMZlFeAgPITAp@7*7|+5Q*?)hQ_(pw(IL^&-|2c`Tn-3l0zu@ z&i>0k7dHQiv)sU?apUKW&sNGFqSvp#4^ZUzaqjHN11zb@49k+Q%dB(0Sy1q3*H>kO q#|QYHyBnM?fBS9Mu>%JVFfcfqs-KX5v+xMe9tKZWKbLh*2~7Z(`A3NW diff --git a/GUI/QtQuick/images/disconn_ind.png b/GUI/QtQuick/images/disconn_ind.png deleted file mode 100644 index ab6a72d4c72190b7ed6781dd5d0f90b4172304d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJ3i-X*q7}lMWc?smOq&xaLGB9lH z=l+w(3gmMZctjR6FmMZlFeAgPITAp@L{AsT5Q*^Q6o#gjS*`L%f5d-iypeC;Q9J+k ztP@9P1etzc&2u|hZ-N5Po!_g!bb5Mx;O$c2@c3l=Jh^F;A;aa_{X+8>^>bP0l+XkKu;E8L diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index e9478c407..2f737b03b 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -13,7 +13,7 @@ CustomPopup { navig_bar_width: 30 - //_stack_view.initialItem: bsApp.settingAdvancedTX ? simple_details : advanced_details + _stack_view.initialItem: simple_details _arrow_but_visibility: !simple_details.visible && !advanced_details.visible property var tx: null @@ -100,8 +100,8 @@ CustomPopup { } function init() { - if (_stack_view.currentItem == null) - _stack_view.push(bsApp.settingAdvancedTX ? advanced_details : simple_details) + //if (_stack_view.currentItem == null) + _stack_view.push(bsApp.settingAdvancedTX ? advanced_details : simple_details) if (_stack_view.currentItem === simple_details) { diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index e9a2dff3b..530416602 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -195,13 +195,6 @@ ApplicationWindow { width: 13 } - Image { - id: imgArmoryStatus - source: (bsApp.armoryState === 7) ? "qrc:/images/conn_ind.png" : - ((bsApp.armoryState === 0) ? "qrc:/images/disconn_ind.png" : - ((bsApp.armoryState === 5) || (bsApp.armoryState === 6) ? "qrc:/images/conn_ind_red.png" : "qrc:/images/conn_ind_yellow.png")) - } - Label { Layout.fillWidth: true } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 7da02097c..f5578773a 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -46,7 +46,6 @@ qml/BsStyles/qmldir qml/StyledControls/CustomTitleToolButton.qml images/logo.png - images/conn_ind.png images/plugins_icon.png images/overview_icon_not_choosed.png images/plugins_icon_unchoosed.png @@ -178,9 +177,6 @@ qml/StyledControls/CustomHorizontalHeaderView.qml qml/StyledControls/CustomRbfCpfpMenu.qml qml/StyledControls/CustomSuccessWidget.qml - images/disconn_ind.png - images/conn_ind_yellow.png - images/conn_ind_red.png qml/Settings/AddArmoryServer.qml images/delete_custom_server.svg qml/Settings/DeleteArmoryServer.qml From 20396f53037cf0edb96479e0ec5729dc94ef4011 Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 22 Mar 2023 23:54:51 +0100 Subject: [PATCH 264/436] Sideshift buy page --- GUI/QtQuick/QtQuickAdapter.cpp | 4 - GUI/QtQuick/QtQuickAdapter.h | 2 - .../qml/Plugins/Common/PluginsPage.qml | 14 ++- .../qml/Plugins/SideShift/SideShiftButton.qml | 4 +- .../Plugins/SideShift/SideShiftBuyPage.qml | 55 ++++----- .../SideShift/SideShiftComboboxWithIcon.qml | 2 +- .../Plugins/SideShift/SideShiftCopyButton.qml | 50 +++++++++ .../Plugins/SideShift/SideShiftIconButton.qml | 1 + .../Plugins/SideShift/SideShiftMainPage.qml | 28 ++++- .../qml/Plugins/SideShift/SideShiftPopup.qml | 48 +++----- .../Plugins/SideShift/SideShiftTextInput.qml | 4 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 +- GUI/QtQuick/qml/Send/SimpleDetails.qml | 2 +- GUI/QtQuick/qml/StyledControls/TestItem.qml | 106 ------------------ GUI/QtQuick/qtquick.qrc | 3 + .../viewmodels/plugins/PluginsListModel.cpp | 2 +- 16 files changed, 146 insertions(+), 181 deletions(-) create mode 100644 GUI/QtQuick/qml/Plugins/SideShift/SideShiftCopyButton.qml delete mode 100644 GUI/QtQuick/qml/StyledControls/TestItem.qml diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 4306fad40..cdcb1b11b 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -48,7 +48,6 @@ #include "Utils.h" #include "AddressFilterModel.h" #include "viewmodels/plugins/PluginsListModel.h" -#include "viewmodels/plugins/PluginsFilterModel.h" #include "hardware_wallet.pb.h" #include "terminal.pb.h" @@ -155,7 +154,6 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) , addressFilterModel_(std::make_unique(settingsController_)) , transactionFilterModel_(std::make_unique(settingsController_)) , pluginsListModel_(std::make_unique()) - , pluginsFilterModel_(std::make_unique(settingsController_)) { staticLogger = logger; addrModel_ = new QmlAddressListModel(logger, this); @@ -172,7 +170,6 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) addressFilterModel_->setSourceModel(addrModel_); transactionFilterModel_->setSourceModel(txModel_); - pluginsFilterModel_->setSourceModel(pluginsListModel_.get()); connect(settingsController_.get(), &SettingsController::changed, this, [this](ApplicationSettings::Setting key) { @@ -300,7 +297,6 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("addressFilterModel"), addressFilterModel_.get()); rootCtxt_->setContextProperty(QLatin1Literal("transactionFilterModel"), transactionFilterModel_.get()); rootCtxt_->setContextProperty(QLatin1Literal("pluginsListModel"), pluginsListModel_.get()); - rootCtxt_->setContextProperty(QLatin1Literal("pluginFilterModel"), pluginsFilterModel_.get()); engine.addImageProvider(QLatin1Literal("QR"), new QRImageProvider); connect(&engine, &QQmlApplicationEngine::objectCreated, diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 8670b3999..3b9ce38d1 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -81,7 +81,6 @@ class AddressFilterModel; class TransactionFilterModel; class PendingTransactionFilterModel; class PluginsListModel; -class PluginsFilterModel; class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoopRuner { @@ -324,7 +323,6 @@ private slots: std::unique_ptr addressFilterModel_; std::unique_ptr transactionFilterModel_; std::unique_ptr pluginsListModel_; - std::unique_ptr pluginsFilterModel_; }; #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml index 63cecce56..7b253d692 100644 --- a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml +++ b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml @@ -83,17 +83,25 @@ Rectangle { function finishCreation() { if (component.status == Component.Ready) { + plugin_popup = component.createObject(plugin_item) plugin_popup.controller = pluginsListModel.getPlugin(index) } + else if (component.status == Component.Error) { + console.log(component.errorString()) + } } Component.onCompleted: { component = Qt.createComponent(path_role); - plugin_popup = component.createObject(plugin_item) - if (component.status == Component.Ready) + if (component.status == Component.Ready) { finishCreation(); - else + } + else if (component.status == Component.Error) { + console.log(component.errorString()) + } + else { component.statusChanged.connect(finishCreation); + } } } } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml index ee8ffcdae..fb2e824c6 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml @@ -23,6 +23,7 @@ Button { font.letterSpacing: 0.5 hoverEnabled: true + activeFocusOnTab: true background: Rectangle { id: backgroundItem @@ -30,8 +31,9 @@ Button { radius: 4 border.color: + (enabled ? "transparent" : (control.hovered ? "white" : - (control.activeFocus ? "gray" : "gray")) + (control.activeFocus ? "gray" : "gray"))) border.width: 1 } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml index 2963474a0..b86dc636b 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml @@ -11,15 +11,15 @@ import QtQuick 2.15 import QtQuick.Window 2.2 import QtQuick.Controls 2.12 -import QtGraphicalEffects 1.0 import "." import "../../" Item { - width: 720 - height: 800 + id: root + + property var controller property string inputCurrency: "ETH" property string outputCurrency: "BTC" property string orderId: "253380c874f87a7a4f70" @@ -65,14 +65,8 @@ Item { id: arrowImage width: 20 height: 20 - source: "file:////home/yauhen/Workspace/terminal/GUI/QtQuick/images/sideshift_right_arrow.png" + source: "qrc:/sideshift_right_arrow.png" anchors.verticalCenter: parent.verticalCenter - - ColorOverlay { - anchors.fill: arrowImage - source: arrowImage - color: "lightgray" - } } Text { @@ -89,7 +83,7 @@ Item { Text { color: "lightgray" - text: "ORDER" + text: qsTr("ORDER") anchors.right: parent.right } @@ -103,7 +97,7 @@ Item { Text { color: "white" - text: "WAITING FOR YOU TO SEND " + inputCurrency + text: qsTr("WAITING FOR YOU TO SEND ") + inputCurrency topPadding: 40 font.pixelSize: 24 anchors.horizontalCenter: parent.horizontalCenter @@ -128,7 +122,7 @@ Item { anchors.verticalCenter: parent.verticalCenter Text { - text: "PLEASE SEND" + text: qsTr("PLEASE SEND") color: "lightgray" font.pixelSize: 20 anchors.horizontalCenter: parent.horizontalCenter @@ -138,7 +132,7 @@ Item { spacing: 10 anchors.horizontalCenter: parent.horizontalCenter Text { - text: "Min" + text: qsTr("Min") color: "lightgray" anchors.verticalCenter: parent.verticalCenter } @@ -160,7 +154,7 @@ Item { spacing: 10 anchors.horizontalCenter: parent.horizontalCenter Text { - text: "Min" + text: qsTr("Min") color: "lightgray" anchors.verticalCenter: parent.verticalCenter } @@ -180,7 +174,7 @@ Item { Text { topPadding: 20 - text: "TO ADDRESS" + text: qsTr("TO ADDRESS") color: "lightgray" font.pixelSize: 20 anchors.horizontalCenter: parent.horizontalCenter @@ -207,12 +201,10 @@ Item { } } - Text { - text: "COPY ADDRESS" - color: "skyblue" - font.pixelSize: 14 - font.weight: Font.Bold + SideShiftCopyButton { + text: qsTr("COPY ADDRESS") anchors.horizontalCenter: parent.horizontalCenter + onClicked: bsApp.copyAddressToClipboard(toAddress) } } @@ -226,24 +218,33 @@ Item { height: 200 color: "gray" anchors.horizontalCenter: parent.horizontalCenter + + Image { + source: "image://QR/" + root.toAddress + sourceSize.width: 180 + sourceSize.height: 180 + width: 180 + height: 180 + anchors.centerIn: parent + } } } } Item { width: 1 - height: 100 + height: 80 } Text { - text: "ESTIMATED NETWORK FEES: " + networkFee + text: qsTr("ESTIMATED NETWORK FEES: ") + networkFee color: "white" anchors.horizontalCenter: parent.horizontalCenter } Item { width: 1 - height: 100 + height: 60 } Rectangle { @@ -257,13 +258,15 @@ Item { Text { color: "lightgray" - text: "RECEIVING ADDRESS" + text: qsTr("RECEIVING ADDRESS") } Text { + width: 200 color: "lightgray" text: receivingAddress font.weight: Font.Bold + clip: true } } @@ -273,7 +276,7 @@ Item { Text { color: "lightgray" - text: "CREATED AT" + text: qsTr("CREATED AT") anchors.right: parent.right } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml index 8055a81a2..2f2950c67 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml @@ -60,7 +60,7 @@ ComboBox { horizontalAlignment: Text.AlignHCenter anchors.horizontalCenter: parent.horizontalCenter } - } + } } indicator: Item {} diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCopyButton.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCopyButton.qml new file mode 100644 index 000000000..09cb5fa70 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCopyButton.qml @@ -0,0 +1,50 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.3 + + +Button { + id: control + + width: 150 + height: 50 + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Bold + + hoverEnabled: true + + background: Rectangle { + id: backgroundItem + color: "transparent" + } + + contentItem: Row { + spacing: 5 + anchors.fill: parent + + Image { + width: 20 + height: 20 + source: "qrc:/images/copy_icon.svg" + } + + Text { + text: control.text + font: control.font + color: "skyblue" + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + } +} diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftIconButton.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftIconButton.qml index 7ed0377d9..3d43497ac 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftIconButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftIconButton.qml @@ -17,6 +17,7 @@ Rectangle { width: 40 height: 40 color: "transparent" + activeFocusOnTab: true signal buttonClicked() diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml index ee57b1939..55a1145f3 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml @@ -17,12 +17,35 @@ import "../../" Item { + id: root + + property var controller + property bool receive: true + property var receiveModel: [ + { + currency: "BTC", + icon: "qrc:/images/sideshift_btc.png" + }, + { + currency: "ETC", + icon: "qrc:/images/sideshift_btc.png" + } + ] + property var sendModel: [ + { + currency: "BTC", + icon: "qrc:/images/sideshift_btc.png" + } + ] + + signal shift() + Column { anchors.centerIn: parent spacing: 20 Text { - text: root.controller.conversionRate + text: root.controller !== null ? root.controller.conversionRate : "" color: "gray" font.pixelSize: 14 font.family: "Roboto" @@ -85,8 +108,9 @@ Item { SideShiftButton { text: qsTr("SHIFT") - enabled: root.receive ? walletCombobox.currentIndex >= 0 : addressInput.text != "" + enabled: root.receive ? walletCombobox.currentIndex >= 0 : addressInput.text !== "" anchors.horizontalCenter: parent.horizontalCenter + onClicked: root.shift() } } } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml index 2d4ee25f1..7d95eba3d 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml @@ -19,32 +19,6 @@ import "../../" PluginPopup { id: root - property bool receive: true - property var receiveModel: [ - { - currency: "BTC", - icon: "qrc:/images/sideshift_btc.png" - }, - { - currency: "ETC", - icon: "qrc:/images/sideshift_btc.png" - }, - { - currency: "DOG", - icon: "qrc:/images/sideshift_btc.png" - }, - { - currency: "XYZ", - icon: "qrc:/images/sideshift_btc.png" - }, - ] - property var sendModel: [ - { - currency: "BTC", - icon: "qrc:/images/sideshift_btc.png" - } - ] - background: Rectangle { anchors.fill: parent color: "black" @@ -55,17 +29,27 @@ PluginPopup { id: stackView initialItem: mainPage anchors.fill: parent - } - - Component { - id: mainPage - + SideShiftMainPage { + id: mainPage + onShift: { + if (!mainPage.receive) { + stackView.push(buyPage) + } + } + controller: root.controller + visible: false + } + SideShiftBuyPage { + id: buyPage + controller: root.controller + visible: false } } - function reset() { + function reset() + { stackView.clear() stackView.pop() } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml index 844371b14..084449eb6 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml @@ -20,11 +20,13 @@ Rectangle { color: "#181414" border.width: 1 border.color: (mouseArea.containsMouse || control.activeFocus) ? "white" : "gray" + activeFocusOnTab: true property string textHint property string fontFamily + property alias text: textEdit.text - TextEdit { + TextInput { id: textEdit color: "white" verticalAlignment: Text.AlignVCenter diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 4c84a997f..a1ee3348f 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -212,7 +212,7 @@ ColumnLayout { Connections { target: walletBalances - onChanged: { + function onChanged() { if (layout.visible) { prepareRequest() } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 845902a06..a351a8c66 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -132,7 +132,7 @@ ColumnLayout { Connections { target: walletBalances - onChanged: { + function onChanged() { if (layout.visible) { create_temp_request() } diff --git a/GUI/QtQuick/qml/StyledControls/TestItem.qml b/GUI/QtQuick/qml/StyledControls/TestItem.qml deleted file mode 100644 index 0917218f9..000000000 --- a/GUI/QtQuick/qml/StyledControls/TestItem.qml +++ /dev/null @@ -1,106 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2.9 -import QtQuick.Controls 2.3 - -Rectangle { - width: 300 - height: 300 - color: "black" - - FontLoader { - id: robotoFont - source: "file:////home/yauhen/Workspace/terminal/GUI/QtQuick/fonts/Roboto-Regular.ttf" - } - - FontLoader { - id: robotoFontBold - source: "file:////home/yauhen/Downloads/Roboto/Roboto-Bold.ttf" - } - - Column { - anchors.fill: parent - spacing: 1 - - Text { - text: "Confirmed balance" - font.pixelSize: 12 - font.family: "Roboto" - color: "red" - font.letterSpacing: -0.2 - } - - Text { - text: "0.00004494 BTC" - font.pixelSize: 14 - font.family: "Roboto" - font.weight: Font.Bold - font.letterSpacing: 0.2 - color: "red" - } - - Text { - text: "0.00004495 BTC" - font.pixelSize: 14 - font.family: 'Helvetica' - font.weight: Font.Bold - font.letterSpacing: 0.2 - color: "red" - } - - Text { - text: "Addresses" - font.pixelSize: 20 - font.family: "Roboto" - font.weight: Font.Bold - font.letterSpacing: 0.35 - color: "red" - } - - Text { - text: "Alex Wallet" - font.pixelSize: 16 - font.family: "Roboto" - color: "red" - } - - Text { - text: "Wallet Properties" - font.pixelSize: 12 - font.family: "Roboto" - font.letterSpacing: 0.3 - color: "red" - } - - Text { - text: "Incoming transactions" - font.pixelSize: 16 - font.family: "Roboto" - font.weight: Font.DemiBold - color: "red" - } - - Text { - text: "tb1qfxa27xqumquwcstuejvswv2tqt78z9a8r9dy7d" - font.pixelSize: 13 - font.family: "Roboto" - color: "red" - font.letterSpacing: -0.2 - } - - Text { - text: "Transactions" - font.pixelSize: 14 - font.family: "Roboto" - color: "red" - } - } -} \ No newline at end of file diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 89f3c08a0..833c65e14 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -200,5 +200,8 @@ images/transfer_icon.png images/sideshift_btc.png qml/Plugins/SideShift/SideShiftMainPage.qml + qml/Plugins/SideShift/SideShiftBuyPage.qml + qml/Plugins/SideShift/SideShiftCopyButton.qml + images/sideshift_right_arrow.png diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp index b5caf5b6f..fd5eb3cad 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp @@ -70,4 +70,4 @@ QObject* PluginsListModel::getPlugin(int index) catch (...) { } return nullptr; -} \ No newline at end of file +} From e4d876bbd817cc30ed767477366a5a40cf91d45b Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Thu, 23 Mar 2023 08:27:42 +0200 Subject: [PATCH 265/436] [QT-19,53] update export watching only wallet success dlg & set minimum password length --- GUI/QtQuick/QtQuickAdapter.cpp | 7 +++ GUI/QtQuick/QtQuickAdapter.h | 1 + GUI/QtQuick/TxListModel.cpp | 43 +++++++++++++++++++ GUI/QtQuick/TxListModel.h | 4 ++ GUI/QtQuick/Utils.h | 9 ++-- .../qml/CreateWallet/ConfirmPassword.qml | 1 + .../qml/CreateWallet/ImportWatchingWallet.qml | 14 ++++++ .../StyledControls/CustomSuccessWidget.qml | 2 + GUI/QtQuick/qml/TransactionsPage.qml | 9 +++- .../qml/WalletProperties/ChangePassword.qml | 5 ++- .../WalletPropertiesPopup.qml | 4 +- a.out | 0 12 files changed, 90 insertions(+), 9 deletions(-) create mode 100644 a.out diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 4a59de0aa..89608210e 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2256,6 +2256,13 @@ int QtQuickAdapter::changePassword(const QString& walletId, const QString& oldPa return (msgId == 0) ? -1 : 0; } +bool QtQuickAdapter::isValidPassword(const QString& password) +{ +#define MINIMUM_PASSWORD_LENGTH 6 + + return password.length() >= MINIMUM_PASSWORD_LENGTH; +} + int QtQuickAdapter::exportWallet(const QString& walletId, const QString& exportDir) { SignerMessage msg; diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 8670b3999..10616d7c9 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -180,6 +180,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void startAddressSearch(const QString&); Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); Q_INVOKABLE int changePassword(const QString& walletId, const QString& oldPassword, const QString& newPassword); + Q_INVOKABLE bool isValidPassword(const QString& password); Q_INVOKABLE int exportWallet(const QString& walletId, const QString & exportDir); Q_INVOKABLE int viewWalletSeedAuth(const QString& walletId, const QString& password); Q_INVOKABLE int deleteWallet(const QString& walletId, const QString& password); diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index c7c0e3305..b5fffaeda 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -389,6 +389,49 @@ bool TxListModel::exportCSVto(const QString& filename) return true; } +QString TxListModel::getBegDate() const +{ + std::time_t minTime = std::numeric_limits::max(); + + for (int i = 0; i < rowCount(); ++i) { + const auto& entry = data_.at(i); + + if (minTime > entry.txTime) + minTime = entry.txTime; + } + + if (minTime == std::numeric_limits::max()) + minTime = std::time(nullptr); + + return getTime2String(minTime); +} + +QString TxListModel::getEndDate() const +{ + std::time_t maxTime = std::time(nullptr); + // std::time_t maxTime = std::numeric_limits::min(); + + // for (int i = 0; i < rowCount(); ++i) { + // const auto& entry = data_.at(i); + + // if (maxTime < entry.txTime) + // maxTime = entry.txTime; + // } + + // if (maxTime == std::numeric_limits::max()) + // maxTime = std::time(nullptr); + + return getTime2String(maxTime); +} + +QString TxListModel::getTime2String(std::time_t& t) const +{ + std::tm* tm = std::localtime(&t); + char buffer[50]; + + std::strftime(buffer, sizeof(buffer), "%y%m%d", tm); + return QString::fromStdString(std::string(buffer)); +} TxListForAddr::TxListForAddr(const std::shared_ptr& logger, QObject* parent) : QAbstractTableModel(parent), logger_(logger) diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 705d4bd6f..93fed0b41 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -46,6 +46,9 @@ class TxListModel : public QAbstractTableModel Q_INVOKABLE bool exportCSVto(const QString&); + Q_INVOKABLE QString getBegDate() const; + Q_INVOKABLE QString getEndDate() const; + void addRows(const std::vector&); void clear(); void setTxComment(const std::string& txHash, const std::string& comment); @@ -65,6 +68,7 @@ class TxListModel : public QAbstractTableModel QString txId(int row) const; bool isRBF(int row) const; quint32 nbConf(int row) const; + QString getTime2String(std::time_t& t) const; private: std::shared_ptr logger_; diff --git a/GUI/QtQuick/Utils.h b/GUI/QtQuick/Utils.h index ce947c544..c5d958913 100644 --- a/GUI/QtQuick/Utils.h +++ b/GUI/QtQuick/Utils.h @@ -4,10 +4,9 @@ #include "Wallets/SignerDefs.h" namespace gui_utils { + QString satoshiToQString(int64_t balance); + QString xbtToQString(double balance); + QString directionToQString(bs::sync::Transaction::Direction direction); -QString satoshiToQString(int64_t balance); -QString xbtToQString(double balance); -QString directionToQString(bs::sync::Transaction::Direction direction); - -static const QString dateTimeFormat = QString::fromStdString("yyyy-MM-dd hh:mm:ss"); + static const QString dateTimeFormat = QString::fromStdString("yyyy-MM-dd hh:mm:ss"); } diff --git a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml index e4370d281..c766ddb22 100644 --- a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml @@ -85,6 +85,7 @@ ColumnLayout { enabled: (password.input_text !== "") && (confirm_password.input_text !== "") && (password.input_text === confirm_password.input_text) + && bsApp.isValidPassword(password.input_text) preferred: true function click_enter() { diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml index d9aee737d..bde69009b 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml @@ -116,10 +116,24 @@ ColumnLayout { font.weight: Font.Normal } + // states: [ + // State { + // name: "clicked" + // AnchorChanges { target: file_icon; anchors { left: undefined; } } + // AnchorChanges { target: label_file; anchors { left: undefined; horizontalCenter: parent.horizontalCenter} } + + // PropertyChanges { target: file_icon; anchors.leftMargin: 0; x: 0; } + // PropertyChanges { target: label_file; anchors.horizontalCenterMargin: 13 } + // PropertyChanges { target: file_icon; x: label_file.x - 27; } + // }, + // ] + FileDialog { id: fileDialog visible: false onAccepted: { + dashed_border.state = "clicked" + label_file.text = basename(fileDialog.fileUrl.toString()) layout.isFileChoosen = true dashed_border.source = "qrc:/images/wallet_file.png" diff --git a/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml index 90b246eab..81a2feefe 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml @@ -11,6 +11,8 @@ ColumnLayout { id: layout property alias details_text: details.text + property alias details_font_size: details.font.pixelSize + property alias details_font_weight: details.font.weight signal sig_finish() diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 3ecd07c64..70ae1dbdc 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -129,7 +129,6 @@ Item { } } - Row { spacing: 4 anchors.verticalCenter: parent.verticalCenter @@ -163,6 +162,14 @@ Item { custom_icon.height: 10 onClicked: { + //There is a qtquick problem on setting currentFile. + + // fileDialogCSV.currentFile = "%1/BlockSettle_%2_%3_%4.csv" + // .arg(fileDialogCSV.folder) + // .arg(txWalletsComboBox.currentIndex === 0 ? "all" : txWalletsComboBox.currentText) + // .arg(txListModel.getBegDate()) + // .arg(txListModel.getEndDate()) + fileDialogCSV.visible = true } anchors.verticalCenter: parent.verticalCenter diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml index 32c238229..3f0c71a8e 100644 --- a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -94,9 +94,10 @@ ColumnLayout { width: 530 enabled: (password.input_text !== "") - && (new_password.input_text != "") + && (new_password.input_text !== "") && (confirm_password.input_text !== "") - && (password.input_text == confirm_password.input_text !== "") + && (new_password.input_text === confirm_password.input_text) + && bsApp.isValidPassword(new_password.input_text) function click_enter() { const result = bsApp.changePassword( diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 1ca1a6d37..a372893cb 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -32,7 +32,7 @@ CustomPopup { onSig_success: (nameExport, pathExport) => { _stack_view.push(success) - success.details_text = qsTr("Wallet %1 has successfully been exported to %2").arg(nameExport).arg(pathExport) + success.details_text = qsTr("Your watching-only wallet has successfully been exported\n\nFilename: %1\nFolder: %2").arg(nameExport).arg(pathExport) } } @@ -82,6 +82,8 @@ CustomPopup { id: success visible: false + details_font_size: 16 + details_font_weight: Font.Medium onSig_finish: { root.close() _stack_view.pop(null) diff --git a/a.out b/a.out new file mode 100644 index 000000000..e69de29bb From e12c6e111320d44a76c2392aef9fe2380c84761c Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 23 Mar 2023 10:00:55 +0100 Subject: [PATCH 266/436] Page reset on close --- GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml | 5 ++++- GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml | 4 ++++ GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml | 8 ++++---- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml index 7b253d692..bce1bd757 100644 --- a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml +++ b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml @@ -78,7 +78,10 @@ Rectangle { name: name_role description: description_role icon_source: icon_role - onCardClicked: plugin_popup.open() + onCardClicked: { + plugin_popup.reset() + plugin_popup.open() + } } function finishCreation() { diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml index 55a1145f3..810bf8a80 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml @@ -113,4 +113,8 @@ Item { onClicked: root.shift() } } + + function reset() { + addressInput.text = "" + } } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml index 7d95eba3d..cc34c6d3c 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml @@ -33,8 +33,8 @@ PluginPopup { SideShiftMainPage { id: mainPage onShift: { - if (!mainPage.receive) { - stackView.push(buyPage) + if (mainPage.receive) { + stackView.replace(buyPage) } } controller: root.controller @@ -50,7 +50,7 @@ PluginPopup { function reset() { - stackView.clear() - stackView.pop() + mainPage.reset() + stackView.replace(mainPage) } } From e2f71de60375fe1b12d01ed7c7cb2179cb361014 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Thu, 23 Mar 2023 11:12:41 +0200 Subject: [PATCH 267/436] [QT-19,53] fix comments --- GUI/QtQuick/QtQuickAdapter.cpp | 6 ++-- GUI/QtQuick/TxListModel.cpp | 34 ++++++------------- GUI/QtQuick/TxListModel.h | 1 - .../WalletPropertiesPopup.qml | 2 +- a.out | 0 5 files changed, 14 insertions(+), 29 deletions(-) delete mode 100644 a.out diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 89608210e..0bf13e352 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -60,6 +60,8 @@ using namespace bs::message; namespace { + const int kMinPasswordLength = 6; + std::shared_ptr staticLogger; static inline QString encTypeToString(bs::wallet::EncryptionType enc) @@ -2258,9 +2260,7 @@ int QtQuickAdapter::changePassword(const QString& walletId, const QString& oldPa bool QtQuickAdapter::isValidPassword(const QString& password) { -#define MINIMUM_PASSWORD_LENGTH 6 - - return password.length() >= MINIMUM_PASSWORD_LENGTH; + return password.length() >= kMinPasswordLength; } int QtQuickAdapter::exportWallet(const QString& walletId, const QString& exportDir) diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index b5fffaeda..8bdf378ed 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -32,6 +32,15 @@ namespace { {TxInOutModel::ColorRole, "dataColor"}, {TxInOutModel::TxHashRole, "txHash"}, }; + + QString getTime2String(std::time_t& t) + { + std::tm* tm = std::localtime(&t); + char buffer[50]; + + std::strftime(buffer, sizeof(buffer), "%y%m%d", tm); + return QString::fromStdString(std::string(buffer)); + } } TxListModel::TxListModel(const std::shared_ptr& logger, QObject* parent) @@ -391,7 +400,7 @@ bool TxListModel::exportCSVto(const QString& filename) QString TxListModel::getBegDate() const { - std::time_t minTime = std::numeric_limits::max(); + std::time_t minTime = std::time(nullptr); for (int i = 0; i < rowCount(); ++i) { const auto& entry = data_.at(i); @@ -400,39 +409,16 @@ QString TxListModel::getBegDate() const minTime = entry.txTime; } - if (minTime == std::numeric_limits::max()) - minTime = std::time(nullptr); - return getTime2String(minTime); } QString TxListModel::getEndDate() const { std::time_t maxTime = std::time(nullptr); - // std::time_t maxTime = std::numeric_limits::min(); - - // for (int i = 0; i < rowCount(); ++i) { - // const auto& entry = data_.at(i); - - // if (maxTime < entry.txTime) - // maxTime = entry.txTime; - // } - - // if (maxTime == std::numeric_limits::max()) - // maxTime = std::time(nullptr); return getTime2String(maxTime); } -QString TxListModel::getTime2String(std::time_t& t) const -{ - std::tm* tm = std::localtime(&t); - char buffer[50]; - - std::strftime(buffer, sizeof(buffer), "%y%m%d", tm); - return QString::fromStdString(std::string(buffer)); -} - TxListForAddr::TxListForAddr(const std::shared_ptr& logger, QObject* parent) : QAbstractTableModel(parent), logger_(logger) , header_{ tr("Date"), tr("Transaction ID"), tr("#Conf"), tr("#Ins"), tr("#Outs"), tr("Amount (BTC)") diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 93fed0b41..434267299 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -68,7 +68,6 @@ class TxListModel : public QAbstractTableModel QString txId(int row) const; bool isRBF(int row) const; quint32 nbConf(int row) const; - QString getTime2String(std::time_t& t) const; private: std::shared_ptr logger_; diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index a372893cb..dc31bae61 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -32,7 +32,7 @@ CustomPopup { onSig_success: (nameExport, pathExport) => { _stack_view.push(success) - success.details_text = qsTr("Your watching-only wallet has successfully been exported\n\nFilename: %1\nFolder: %2").arg(nameExport).arg(pathExport) + success.details_text = qsTr("Your watching-only wallet has successfully been exported\n\nFilename:\t%1\nFolder:\t%2").arg(nameExport).arg(pathExport) } } diff --git a/a.out b/a.out deleted file mode 100644 index e69de29bb..000000000 From c81afc0b603648974dc691a9246090861b6b0e4e Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 23 Mar 2023 10:49:17 +0100 Subject: [PATCH 268/436] Fixed double free --- GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp | 2 +- GUI/QtQuick/viewmodels/plugins/SideShiftController.cpp | 4 ++-- GUI/QtQuick/viewmodels/plugins/SideShiftController.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp index fd5eb3cad..1e5421719 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp @@ -29,7 +29,7 @@ PluginsListModel::PluginsListModel(QObject* parent) { tr("SideShift.ai") , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") , QString::fromLatin1("qrc:/images/sideshift_plugin.png") - , std::dynamic_pointer_cast(std::make_shared()) + , std::dynamic_pointer_cast(std::make_shared(this)) , QString::fromLatin1("qrc:/qml/Plugins/SideShift/SideShiftPopup.qml") } }; } diff --git a/GUI/QtQuick/viewmodels/plugins/SideShiftController.cpp b/GUI/QtQuick/viewmodels/plugins/SideShiftController.cpp index e98f7a7c8..934c933a0 100644 --- a/GUI/QtQuick/viewmodels/plugins/SideShiftController.cpp +++ b/GUI/QtQuick/viewmodels/plugins/SideShiftController.cpp @@ -10,8 +10,8 @@ */ #include "SideShiftController.h" -SideShiftController::SideShiftController() - : QObject() +SideShiftController::SideShiftController(QObject* parent) + : QObject(parent) { } diff --git a/GUI/QtQuick/viewmodels/plugins/SideShiftController.h b/GUI/QtQuick/viewmodels/plugins/SideShiftController.h index 4184f6236..81d8696bd 100644 --- a/GUI/QtQuick/viewmodels/plugins/SideShiftController.h +++ b/GUI/QtQuick/viewmodels/plugins/SideShiftController.h @@ -18,7 +18,7 @@ class SideShiftController: public QObject Q_PROPERTY(QString conversionRate READ conversionRate NOTIFY changed) public: - SideShiftController(); + SideShiftController(QObject* parent = nullptr); QString conversionRate() const; From 4a37b563aafd49a41eaa7b002f6a2f30c2424af2 Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 23 Mar 2023 11:17:05 +0100 Subject: [PATCH 269/436] cleanup --- .../viewmodels/plugins/PluginsFilterModel.cpp | 25 --------------- .../viewmodels/plugins/PluginsFilterModel.h | 32 ------------------- .../viewmodels/plugins/PluginsListModel.cpp | 4 +-- .../viewmodels/plugins/PluginsListModel.h | 2 +- 4 files changed, 3 insertions(+), 60 deletions(-) delete mode 100644 GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.cpp delete mode 100644 GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.h diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.cpp b/GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.cpp deleted file mode 100644 index ac3b8c1bf..000000000 --- a/GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.cpp +++ /dev/null @@ -1,25 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2023, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -#include "PluginsFilterModel.h" -#include "PluginsListModel.h" - -PluginsFilterModel::PluginsFilterModel(std::shared_ptr settings) - : QSortFilterProxyModel() - , settings_(settings) -{ - connect(this, &PluginsFilterModel::changed, this, &PluginsFilterModel::invalidate); -} - -bool PluginsFilterModel::filterAcceptsRow(int source_row, - const QModelIndex& source_parent) const -{ - return true; -} diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.h b/GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.h deleted file mode 100644 index bb3ca8718..000000000 --- a/GUI/QtQuick/viewmodels/plugins/PluginsFilterModel.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2023, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -#pragma once - -#include -#include "SettingsController.h" - -class PluginsFilterModel: public QSortFilterProxyModel -{ - Q_OBJECT - -public: - PluginsFilterModel(std::shared_ptr settings); - -signals: - void changed(); - -protected: - bool filterAcceptsRow(int source_row, - const QModelIndex& source_parent) const override; - -private: - std::shared_ptr settings_; -}; diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp index 1e5421719..a3e5dc781 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp @@ -29,7 +29,7 @@ PluginsListModel::PluginsListModel(QObject* parent) { tr("SideShift.ai") , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") , QString::fromLatin1("qrc:/images/sideshift_plugin.png") - , std::dynamic_pointer_cast(std::make_shared(this)) + , new SideShiftController(this) , QString::fromLatin1("qrc:/qml/Plugins/SideShift/SideShiftPopup.qml") } }; } @@ -65,7 +65,7 @@ QHash PluginsListModel::roleNames() const QObject* PluginsListModel::getPlugin(int index) { try { - return plugins_.at(index).controller.get(); + return plugins_.at(index).controller; } catch (...) { } diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h index 4a10c2413..90c5edeef 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h @@ -20,7 +20,7 @@ struct Plugin { QString name; QString description; QString icon; - std::shared_ptr controller; + QObject* controller; QString path; }; From 7b7ee851b100f3a49c5f57b857d9364a5453d450 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Thu, 23 Mar 2023 19:09:59 +0200 Subject: [PATCH 270/436] [QT-20,26,53,55] update password change success and fail dialog & center the imported filename --- GUI/QtQuick/QtQuickAdapter.cpp | 7 +- GUI/QtQuick/QtQuickAdapter.h | 2 + GUI/QtQuick/images/try_icon.png | Bin 0 -> 2368 bytes .../qml/CreateWallet/ConfirmPassword.qml | 26 +++- .../qml/CreateWallet/ImportWatchingWallet.qml | 22 +-- .../qml/StyledControls/CustomFailDialog.qml | 126 ++++++++++++++++++ .../qml/StyledControls/CustomTextInput.qml | 9 ++ .../qml/WalletProperties/ChangePassword.qml | 46 ++++++- .../WalletPropertiesPopup.qml | 7 +- GUI/QtQuick/qml/main.qml | 12 ++ GUI/QtQuick/qtquick.qrc | 2 + 11 files changed, 242 insertions(+), 17 deletions(-) create mode 100644 GUI/QtQuick/images/try_icon.png create mode 100644 GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 0bf13e352..3a893c40b 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -638,7 +638,10 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) break; case SignerMessage::kWalletPassChanged: if (!msg.wallet_pass_changed()) { - emit showError(tr("Failed to change wallet password\nsee log for details")); + emit showFail(tr("Incorrect password"), tr("The password you entered is incorrect")); + } + else { + emit successChangePassword(); } break; case SignerMessage::kExportWoWalletResponse: @@ -1833,7 +1836,7 @@ ProcessingResult QtQuickAdapter::processSignTX(const BlockSettle::Common::Signer pushRequest(user_, userBlockchain_, msg.SerializeAsString()); } else { - emit showError(tr("TX sign failed, error %1: %2").arg(response.error_code()) + emit showFail(tr("Incorrect password"), tr("TX sign failed\nerror %1: %2").arg(response.error_code()) .arg(QString::fromStdString(response.error_text()))); } return ProcessingResult::Success; diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 10616d7c9..d1e150325 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -202,9 +202,11 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void invokePINentry(); void invokePasswordEntry(const QString& devName, bool acceptOnDevice); void showError(const QString&); + void showFail(const QString&, const QString&); void showNotification(QString, QString); void successExport(QString nameExport); void requestWalletSelection(quint32 index); + void successChangePassword(); private slots: void onArmoryServerChanged(const QModelIndex&, const QVariant&); diff --git a/GUI/QtQuick/images/try_icon.png b/GUI/QtQuick/images/try_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d992260888596f388022ffa685a8f98d0ec87286 GIT binary patch literal 2368 zcmV-G3BUGTs%pVE(Agl z0<*BMacgQnzDAL|HMGtjxc?UgY$OSZ2p`eHe?iN}&*~^>Gs^$nbM4=DHUW+vC&>+X zj@JUSD<)x2=smmM3;bEKv!FPC#BqHCpoOBp!2hGpKR!pH&mQxQ;UnG(jN;b&09TqA zXMdw0jU~k(p;6Qr@*9UP&u#CEMPXyG01BJng*wE;J9OWBKDlde z1f~WRiu<0e>2f{mV8(HU&4{J7g1kGuj7Z^|Qm=8NU4zymmadkn*_&h!U$8la@brF9IU1R0+*ppDJ znp*eZFis21E|4x@*9GfU@VRtwQ`3^p;<^Pl=_SqQY@GtF_XF)+chjy5{DNL;xwW`P zhhDVF4kvM4;OzM}$fGZug65cMzcD(G>>REOT&I_x92EFb-c^D{BS&oGg$27f?yH@X z2rN{G2pl*faNvl*fg=J3jtCq$B5>e{z=0zI2aX6FI3jT1h`@m(0tZf|anWO$_!K!= zcYXS89-P8TbH!bp$G(1=B$rSjl?cqj9^;pv_%7%?I2$6_1bACTPLp+kzsB(~{=qFx z*ldjq+EDZxmxAlcK&uD*ie3qyea{DZicJ>rK|(_mwYJ;sw_p*g0^i2*8{lkw$c1f% zy7-BL(_LDSKZb~N{F_g~64nI%631<{+L)hFXZS~+!y17%H{IBj?m|iH$##-hNuaYL zu(DjAGv!x-zG?tivSi}|ql+S|ZIk8x0NC^W8M`d(vaj%v@|{ng8TMpG`@xjr6c zwBpP_SI{#QH}Kk+PJJ;dFuLPIc1ORj+cS3-d@VY-ZT&ZFbQ-~^z-hi55$#(bjFVY0 zWlx&4Vq*ehtNDPfx4W*5s#$RNkT#P#lE851}i=In^|PNzdJ z5hvN1z@!CdZf8>jo=R_+b5#dJm=xIAydqc7x{dxdvII8}fdfYb4jd6Ua75t15rG3o z1P+`{Fhu0w!YS*BF@d*}qya+Zh>H#!5jb#+xoDSAmC>k%A;)8Pq9{si$0%1p@D}_v zjwvRLg4~)~uzfR4)8sb)ENFrjm?Am{!*C(0jP{r|JXYbVEgx2GUxt;sXjMxv8pdKJ zRo4FFT1Uj`SkT}3Z5{{pnzs%F%1SL*6^cxUwR%q~EGQL_0_G}=-ox4i!pKZC$oD!WiG_lhG!@ic4Tz9tPeP|V@7x0V+@ z57Xzglm)BgGTc7Qa&>x|hUsK0VU*GWll7{GO21g@g`R9x2f+%Z1@3dhN_C6o{XSbU zEh)6s_o)7^@01dlEKsF}E>cslmyZF{8Xa-yW5BLZO5j=bd{MY})NtVKO8<<1S9P1j ziY>6Pz&xliwVrRJjqOGglB#^Gzw0{-3#;}4q5NC-%B;CO=pOm=F9w9 zS!rgSDJ(Dz(DR_ib#(z4a7Zq7Jp<_f&%poVU>X@Le;KOgR--#d_Q)9RTka6g{~nmDL2g?mwpbV+3J z!z?oe*1JXj41?5Wk`{}D8bKfY_%n`+Ok4;Bsm=NDzFX8NIESk(4K#8*3w`i|A}^%d zv^u5=%uDaj8`OBfBh7*zEnv+Y4br9WT$gT>b|V`LfT&IRVrp2aZqY)ER_oCkB_cOY z`J|55!HU%yl@u@mhL|WYb&J?~lQLytc$8`%7G!LJ&UI*Tsfn2`7~+AzW#@Wzo+L?9 zHbgcZdW@4b82mV-mzu%UnFj(d8mTePm!qS@FLC@0w~urT3qnf|N8D}dS)OgO31@rk zW^EjU#j{2Prhx`k8KtcCLYlTXH>sYcX`!ywI2*&kk6`DFBQ~VI;pLWVV_(|lFTE&R zUqP>A7L{xrjs?sI_bjF!3UDUKq@amaaxbtxsIg2yI6XsoV*PGV)(gN$zqml/Pin/PinEntriesPopup.qml qml/Pin/qmldir qml/StyledControls/CustomMessageDialog.qml + qml/StyledControls/CustomFailDialog.qml qml/StyledControls/CustomMediumButton.qml qml/Overview/BalanceBar.qml qml/Overview/BaseBalanceLabel.qml @@ -186,5 +187,6 @@ qml/Plugins/Common/Card.qml qml/Plugins/Common/PluginsPage.qml images/sideshift_plugin.png + images/try_icon.png From e20f8d540df547aeba9e36c13ee6339dd3e04dcf Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 23 Mar 2023 20:35:49 +0300 Subject: [PATCH 271/436] [QT-57] change WO wallet name --- Core/SignerAdapter.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index e4e577b43..5fc3be533 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -719,7 +719,8 @@ ProcessingResult SignerAdapter::processExportWoWallet(const bs::message::Envelop }; woWallet->shutdown(); woWallet.reset(); - const auto& fileName = SystemFileUtils::getFileName(srcPathName); + const std::string netType = (hdWallet->networkType() == NetworkType::TestNet) ? "Testnet_" : ""; + const std::string fileName = "BlockSettle_" + netType + hdWallet->walletId() + "_watchonly.lmdb"; const auto& dstPathName = request.output_dir() + "/" + fileName; if (!SystemFileUtils::cpFile(srcPathName, dstPathName)) { rm(); From 1a18975b4ccf7e7b7d1d556694afe26a87c91f35 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 24 Mar 2023 00:44:49 +0300 Subject: [PATCH 272/436] fix WO export --- Core/SignerAdapter.cpp | 25 ++++++++++--------------- GUI/QtQuick/QtQuickAdapter.cpp | 4 ++-- common | 2 +- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 5fc3be533..4c9e1da0c 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2020 - 2021, BlockSettle AB +* Copyright (C) 2020 - 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * @@ -9,6 +9,7 @@ */ #include "SignerAdapter.h" +#include #include #include "bip39/bip39.h" #include "Adapters/SignerClient.h" @@ -711,26 +712,20 @@ ProcessingResult SignerAdapter::processExportWoWallet(const bs::message::Envelop return ProcessingResult::Error; } const auto srcPathName = woWallet->getFileName(); - const auto& rm = [srcPathName]() -> bool - { - bool rc = SystemFileUtils::rmFile(srcPathName); - rc &= SystemFileUtils::rmFile(srcPathName + "-lock"); - return rc; - }; - woWallet->shutdown(); - woWallet.reset(); const std::string netType = (hdWallet->networkType() == NetworkType::TestNet) ? "Testnet_" : ""; const std::string fileName = "BlockSettle_" + netType + hdWallet->walletId() + "_watchonly.lmdb"; const auto& dstPathName = request.output_dir() + "/" + fileName; - if (!SystemFileUtils::cpFile(srcPathName, dstPathName)) { - rm(); - logger_->error("[{}] failed to copy {} -> {}", __func__, srcPathName, dstPathName); + woWallet->shutdown(); + try { + std::filesystem::rename(srcPathName, dstPathName); + std::filesystem::remove(srcPathName + "-lock"); + } + catch (const std::exception& e) { + logger_->error("[{}] failed to move {} -> {}: {}", __func__, srcPathName, dstPathName, e.what()); pushResponse(user_, env, msg.SerializeAsString()); return ProcessingResult::Error; } - if (!rm()) { - logger_->error("[{}] failed to rm {}", __func__, srcPathName); - } + logger_->debug("[{}] exported {} to {}", __func__, request.wallet().wallet_id(), dstPathName); msg.set_export_wo_wallet_response(fileName); pushResponse(user_, env, msg.SerializeAsString()); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 0bf13e352..f9a3fdd48 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1165,8 +1165,8 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId if (tx.isInitialized()) { txDet.tx = std::move(tx); txDet.tx.setTxHeight(resp.tx_height()); - logger_->debug("[{}] own txid: {}/{}", ownTxHash.toHexStr(true) - , txDet.tx.getThisHash().toHexStr(true)); + /*logger_->debug("[{}] own txid: {}/{}", ownTxHash.toHexStr(true) + , txDet.tx.getThisHash().toHexStr(true));*/ } } } catch (const std::exception &e) { diff --git a/common b/common index e0f7d2040..a29e93cb1 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit e0f7d2040388aa475c7b4be447987c7efb4181cc +Subproject commit a29e93cb1cbd6799def3de2f66119d3f52408bab From f3cb17fa866424c55a801f79f45952a3012d0731 Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 23 Mar 2023 22:47:28 +0100 Subject: [PATCH 273/436] Copyright update --- GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml | 2 +- GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml | 2 +- GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml | 2 +- GUI/QtQuick/qml/Plugins/SideShift/SideShiftCopyButton.qml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml index fb2e824c6..43f5c946c 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml index 442593c20..7bef156e4 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml index 2f2950c67..78b4d5697 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCopyButton.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCopyButton.qml index 09cb5fa70..093afd5f8 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCopyButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCopyButton.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * From 193f34dde834a96d819b2b37e5d97cb913c790d5 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Fri, 24 Mar 2023 05:57:36 +0200 Subject: [PATCH 274/436] password integrity check & advanced simple dialog --- GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml | 4 ++-- GUI/QtQuick/qml/Send/SendPopup.qml | 3 +-- GUI/QtQuick/qml/WalletProperties/ChangePassword.qml | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml index 0a4b2b82a..116fa8a90 100644 --- a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml @@ -26,7 +26,7 @@ ColumnLayout { CustomMessageDialog { id: error_dialog - error: qsTr("Password should be over 6 charaters") + error: qsTr("Password strength is insufficient") visible: false } @@ -144,7 +144,7 @@ ColumnLayout { function checkPasswordLength() { - if (password.input_text.length < 6) { + if (!bsApp.validatePassword(password.input_text)) { error_dialog.show() error_dialog.raise() error_dialog.requestActivate() diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 2f737b03b..6a0e6e411 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -100,8 +100,7 @@ CustomPopup { } function init() { - //if (_stack_view.currentItem == null) - _stack_view.push(bsApp.settingAdvancedTX ? advanced_details : simple_details) + _stack_view.replace(bsApp.settingAdvancedTX ? advanced_details : simple_details) if (_stack_view.currentItem === simple_details) { diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml index 342c6a11d..c3f3a4058 100644 --- a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -29,7 +29,7 @@ ColumnLayout { CustomMessageDialog { id: error_dialog - error: qsTr("Password should be over 6 charaters") + error: qsTr("Password strength is insufficient") visible: false } @@ -171,7 +171,7 @@ ColumnLayout { function checkPasswordLength() { - if (new_password.input_text.length < 6) { + if (!bsApp.validatePassword(new_password.input_text)) { error_dialog.show() error_dialog.raise() error_dialog.requestActivate() From 70871a4ab1d22e6f790a6f47f1952f74c59ec3b3 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 24 Mar 2023 09:15:29 +0300 Subject: [PATCH 275/436] proper validation method name --- GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml index 116fa8a90..b8e723572 100644 --- a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml @@ -144,7 +144,7 @@ ColumnLayout { function checkPasswordLength() { - if (!bsApp.validatePassword(password.input_text)) { + if (!bsApp.isValidPassword(password.input_text)) { error_dialog.show() error_dialog.raise() error_dialog.requestActivate() From 00e2bf7e75693ef65798952aa0719b170a41a62d Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 24 Mar 2023 09:16:52 +0300 Subject: [PATCH 276/436] proper method name --- GUI/QtQuick/qml/WalletProperties/ChangePassword.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml index c3f3a4058..dec611285 100644 --- a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -171,7 +171,7 @@ ColumnLayout { function checkPasswordLength() { - if (!bsApp.validatePassword(new_password.input_text)) { + if (!bsApp.isValidPassword(new_password.input_text)) { error_dialog.show() error_dialog.raise() error_dialog.requestActivate() From 6999e145942eafe5ddace835115869bba0bd4654 Mon Sep 17 00:00:00 2001 From: dvajdual Date: Fri, 24 Mar 2023 13:53:13 +0200 Subject: [PATCH 277/436] qml: send advanced inside app --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index a1ee3348f..4d9c45591 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -16,7 +16,7 @@ ColumnLayout { signal sig_simple() signal sig_select_inputs() - height: 748 + height: 723 width: 1132 spacing: 0 @@ -101,7 +101,7 @@ ColumnLayout { Layout.fillWidth: true Layout.preferredHeight : 580 - Layout.topMargin: 20 + Layout.topMargin: 15 spacing: 12 @@ -112,7 +112,7 @@ ColumnLayout { Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter width: 536 - height: 580 + height: 565 color: "transparent" radius: 16 @@ -364,7 +364,7 @@ ColumnLayout { Layout.alignment: Qt.AlignRight | Qt.AlingVCenter width: 536 - height: 580 + height: 565 color: "transparent" radius: 16 @@ -531,7 +531,7 @@ ColumnLayout { width: 1084 - Layout.bottomMargin: 40 + Layout.bottomMargin: 30 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter text: qsTr("Continue") From def14cf25c825082765b168fa228845d610200d3 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 24 Mar 2023 15:04:15 +0300 Subject: [PATCH 278/436] import WO wallet --- Core/SignerAdapter.cpp | 32 +++++++++++++++++++ Core/SignerAdapter.h | 2 ++ GUI/QtQuick/QtQuickAdapter.cpp | 17 +++++++++- GUI/QtQuick/QtQuickAdapter.h | 1 + .../qml/CreateWallet/ImportWatchingWallet.qml | 19 ++++++----- common | 2 +- 6 files changed, 63 insertions(+), 10 deletions(-) diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 4c9e1da0c..a1101c00f 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -150,6 +150,8 @@ ProcessingResult SignerAdapter::processOwnRequest(const bs::message::Envelope &e return processChangeWalletPass(env, request.change_wallet_pass()); case SignerMessage::kGetWalletSeed: return processGetWalletSeed(env, request.get_wallet_seed()); + case SignerMessage::kImportWoWallet: + return processImportWoWallet(env, request.import_wo_wallet()); default: logger_->warn("[{}] unknown signer request: {}", __func__, request.data_case()); break; @@ -795,3 +797,33 @@ bs::message::ProcessingResult SignerAdapter::processGetWalletSeed(const bs::mess pushResponse(user_, env, msg.SerializeAsString()); return bs::message::ProcessingResult::Success; } + +bs::message::ProcessingResult SignerAdapter::processImportWoWallet(const bs::message::Envelope& env + , const std::string& filename) +{ + SignerMessage msg; + auto msgResp = msg.mutable_created_wallet(); + const auto& fn = SystemFileUtils::getFileName(filename); + const auto& targetFile = walletsDir_ + "/" + fn; + try { + std::filesystem::copy(filename, targetFile); + } + catch (const std::exception& e) { + logger_->error("[{}] failed to copy {} to wallets dir {}: {}", __func__ + , filename, walletsDir_, e.what()); + msgResp->set_error_msg("failed to copy"); + pushResponse(user_, env, msg.SerializeAsString()); + return bs::message::ProcessingResult::Error; + } + const auto& wallet = signer_->importWoWallet(netType_, targetFile); + if (!wallet) { + msgResp->set_error_msg("failed to import"); + pushResponse(user_, env, msg.SerializeAsString()); + return bs::message::ProcessingResult::Error; + } + msgResp->set_wallet_id(wallet->walletId()); + pushResponse(user_, env, msg.SerializeAsString()); + walletsChanged(); + walletsReady(); + return bs::message::ProcessingResult::Success; +} diff --git a/Core/SignerAdapter.h b/Core/SignerAdapter.h index 7d167a504..06827e47e 100644 --- a/Core/SignerAdapter.h +++ b/Core/SignerAdapter.h @@ -118,6 +118,8 @@ class SignerAdapter : public bs::message::Adapter, public SignerCallbackTarget , const BlockSettle::Common::SignerMessage_ChangeWalletPassword&); bs::message::ProcessingResult processGetWalletSeed(const bs::message::Envelope& , const BlockSettle::Common::SignerMessage_WalletRequest&); + bs::message::ProcessingResult processImportWoWallet(const bs::message::Envelope& + , const std::string& filename); private: std::shared_ptr logger_; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 767052220..cbc4273ab 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -39,6 +39,7 @@ #include "TxOutputsModel.h" #include "TxInputsSelectedModel.h" #include "SettingsAdapter.h" +#include "SystemFileUtils.h" #include "Wallets/ProtobufHeadlessUtils.h" #include "WalletBalancesModel.h" #include "TransactionFilterModel.h" @@ -1145,7 +1146,7 @@ ProcessingResult QtQuickAdapter::processWalletBalances(bs::message::SeqId respon ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId , const WalletsMessage_TXDetailsResponse &response) { - logger_->debug("[{}] {}", __func__, response.DebugString()); + //logger_->debug("[{}] {}", __func__, response.DebugString()); for (const auto &resp : response.responses()) { bs::sync::TXWalletDetails txDet{ BinaryData::fromString(resp.tx_hash()), resp.hd_wallet_id() , resp.wallet_name(), static_cast(resp.wallet_type()) @@ -1707,12 +1708,26 @@ void QtQuickAdapter::setHWpassword(const QString& password) curAuthDevice_ = {}; } +void QtQuickAdapter::importWOWallet(const QString& filename) +{ + if (filename.isEmpty() || !SystemFileUtils::fileExist(filename.toStdString())) { + emit showError(tr("Invalid or non-existing wallet file %1").arg(filename)); + return; + } + logger_->debug("[{}] {}", __func__, filename.toStdString()); + SignerMessage msg; + msg.set_import_wo_wallet(filename.toStdString()); + pushRequest(user_, userSigner_, msg.SerializeAsString()); +} + void QtQuickAdapter::importHWWallet(int deviceIndex) { auto devKey = hwDeviceModel_->getDevice(deviceIndex); if (devKey.id.empty() && (deviceIndex >= 0)) { + emit showError(tr("Invalid device #%1").arg(deviceIndex)); return; } + logger_->debug("[{}] {}", __func__, deviceIndex); HW::DeviceMgrMessage msg; bs::hww::deviceKeyToMsg(devKey, msg.mutable_import_device()); pushRequest(user_, userHWW_, msg.SerializeAsString()); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index b5db6b0e7..e0d822792 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -160,6 +160,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void stopHWWalletsPolling(); Q_INVOKABLE void setHWpin(const QString&); Q_INVOKABLE void setHWpassword(const QString&); + Q_INVOKABLE void importWOWallet(const QString& filename); Q_INVOKABLE void importHWWallet(int deviceIndex); Q_INVOKABLE void generateNewAddress(int walletIndex, bool isNative); Q_INVOKABLE void copyAddressToClipboard(const QString& addr); diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml index bf4d6b01f..00f13dd2e 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml @@ -15,7 +15,7 @@ ColumnLayout { signal sig_import() signal sig_full() - property bool isFileChoosen: false + property string chosenFilename: "" height: 515 width: 580 @@ -60,7 +60,7 @@ ColumnLayout { Image { id: file_icon - visible: layout.isFileChoosen + visible: layout.chosenFilename.length > 0 width:12 height: 16 @@ -75,7 +75,7 @@ ColumnLayout { Image { id: folder_icon - visible: !layout.isFileChoosen + visible: layout.chosenFilename === "" width: 20 height: 16 @@ -90,7 +90,7 @@ ColumnLayout { Label { id: label_file - visible: layout.isFileChoosen + visible: layout.chosenFilename.length > 0 anchors.left: parent.left anchors.leftMargin: 230 @@ -104,7 +104,7 @@ ColumnLayout { Label { id: label_folder - visible: !layout.isFileChoosen + visible: layout.chosenFilename === "" anchors.left: parent.left anchors.leftMargin: 225 @@ -135,7 +135,9 @@ ColumnLayout { dashed_border.state = "clicked" label_file.text = basename(fileDialog.fileUrl.toString()) - layout.isFileChoosen = true + var pathname = fileDialog.fileUrl.toString() + pathname = pathname.replace(/^(file:\/{3})/, "") + layout.chosenFilename = decodeURIComponent(pathname) dashed_border.source = "qrc:/images/wallet_file.png" } } @@ -155,12 +157,13 @@ ColumnLayout { Layout.leftMargin: 25 Layout.topMargin: 32 width: 530 - enabled: layout.isFileChoosen + enabled: layout.chosenFilename.length > 0 preferred: true function click_enter() { if (!import_but.enabled) return - + console.log("import: ", layout.chosenFilename) + bsApp.importWOWallet(layout.chosenFilename) layout.sig_import() } } diff --git a/common b/common index a29e93cb1..3ad75b56f 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit a29e93cb1cbd6799def3de2f66119d3f52408bab +Subproject commit 3ad75b56fde21d1162aa37e054ebab218d105f0f From fee11c3d2fad1478e0302525dcff8f0b1985c830 Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 24 Mar 2023 14:11:27 +0100 Subject: [PATCH 279/436] Address filter; plugins stubs; sideswap main page --- GUI/QtQuick/AddressFilterModel.cpp | 28 ++- GUI/QtQuick/AddressFilterModel.h | 3 +- GUI/QtQuick/images/leverex_plugin.png | Bin 0 -> 19146 bytes GUI/QtQuick/images/sideswap/btc_icon.svg | 10 + GUI/QtQuick/images/sideswap/lbtc_icon.svg | 11 + GUI/QtQuick/images/sideswap_plugin.png | Bin 0 -> 11298 bytes .../SideSwap/Controls/CurrencyLabel.qml | 55 +++++ .../SideSwap/Controls/CustomButton.qml | 45 ++++ .../SideSwap/Controls/CustomCombobox.qml | 136 ++++++++++++ .../SideSwap/Controls/CustomSwitch.qml | 40 ++++ .../SideSwap/Controls/CustomTextEdit.qml | 61 ++++++ .../Plugins/SideSwap/Controls/IconButton.qml | 39 ++++ .../qml/Plugins/SideSwap/SideSwapMainPage.qml | 194 ++++++++++++++++++ .../qml/Plugins/SideSwap/SideSwapPegIn.qml | 0 .../qml/Plugins/SideSwap/SideSwapPegOut.qml | 0 .../qml/Plugins/SideSwap/SideSwapPopup.qml | 41 ++++ .../SideSwap/Styles/SideSwapStyles.qml | 26 +++ .../qml/Plugins/SideSwap/Styles/qmldir | 3 + GUI/QtQuick/qtquick.qrc | 14 ++ .../viewmodels/plugins/PluginsListModel.cpp | 14 +- 20 files changed, 717 insertions(+), 3 deletions(-) create mode 100644 GUI/QtQuick/images/leverex_plugin.png create mode 100644 GUI/QtQuick/images/sideswap/btc_icon.svg create mode 100644 GUI/QtQuick/images/sideswap/lbtc_icon.svg create mode 100644 GUI/QtQuick/images/sideswap_plugin.png create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/Controls/CurrencyLabel.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/Styles/qmldir diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp index 29a31e3e6..dce38c1a0 100644 --- a/GUI/QtQuick/AddressFilterModel.cpp +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -11,11 +11,14 @@ #include "AddressFilterModel.h" #include "AddressListModel.h" #include +#include AddressFilterModel::AddressFilterModel(std::shared_ptr settings) : QSortFilterProxyModel() , settings_(settings) { + setDynamicSortFilter(true); + sort(0, Qt::AscendingOrder); connect(this, &AddressFilterModel::changed, this, &AddressFilterModel::invalidate); if (settings_ != nullptr) @@ -77,6 +80,29 @@ bool AddressFilterModel::filterAcceptsRow(int source_row, const QModelIndex& sou return true; } +bool AddressFilterModel::lessThan(const QModelIndex& left, const QModelIndex& right) const +{ + try { + if (qFuzzyIsNull(sourceModel()->data(sourceModel()->index(left.row(), 2) + , QmlAddressListModel::TableRoles::TableDataRole).toDouble()) && + !qFuzzyIsNull(sourceModel()->data(sourceModel()->index(right.row(), 2) + , QmlAddressListModel::TableRoles::TableDataRole).toDouble())) { + return true; + } + else if (qFuzzyIsNull(sourceModel()->data(sourceModel()->index(left.row(), 2) + , QmlAddressListModel::TableRoles::TableDataRole).toDouble()) == + qFuzzyIsNull(sourceModel()->data(sourceModel()->index(right.row(), 2) + , QmlAddressListModel::TableRoles::TableDataRole).toDouble())) { + return (sourceModel()->data(sourceModel()->index(left.row(), 0) + , QmlAddressListModel::TableRoles::AddressTypeRole).toString().remove(0, 2).toInt() < + sourceModel()->data(sourceModel()->index(right.row(), 0) + , QmlAddressListModel::TableRoles::AddressTypeRole).toString().remove(0, 2).toInt()); + } + } + catch (...) {} + return false; +} + bool AddressFilterModel::hideUsed() const { return hideUsed_; @@ -107,7 +133,7 @@ void AddressFilterModel::setHideUsed(bool hideUsed) noexcept } void AddressFilterModel::setHideInternal(bool hideInternal) noexcept -{ +{\ if (hideInternal_ != hideInternal) { hideInternal_ = hideInternal; settings_->setParam(ApplicationSettings::Setting::AddressFilterHideInternal, hideInternal_); diff --git a/GUI/QtQuick/AddressFilterModel.h b/GUI/QtQuick/AddressFilterModel.h index b9511b1c9..d8592d298 100644 --- a/GUI/QtQuick/AddressFilterModel.h +++ b/GUI/QtQuick/AddressFilterModel.h @@ -39,9 +39,10 @@ class AddressFilterModel: public QSortFilterProxyModel protected: bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; + bool lessThan(const QModelIndex & left, const QModelIndex & right) const override; private: - bool hideUsed_ { false }; + bool hideUsed_ { true }; bool hideInternal_ { false }; bool hideExternal_ { false }; bool hideEmpty_ { false }; diff --git a/GUI/QtQuick/images/leverex_plugin.png b/GUI/QtQuick/images/leverex_plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..b8c5fa31214fdb427a008c92dca58e8d6660c663 GIT binary patch literal 19146 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 za + + + + + + + + + diff --git a/GUI/QtQuick/images/sideswap/lbtc_icon.svg b/GUI/QtQuick/images/sideswap/lbtc_icon.svg new file mode 100644 index 000000000..eb5408309 --- /dev/null +++ b/GUI/QtQuick/images/sideswap/lbtc_icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/GUI/QtQuick/images/sideswap_plugin.png b/GUI/QtQuick/images/sideswap_plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..377c792b670f1379d14f8bc5541887b9923d2eed GIT binary patch literal 11298 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 Yf1{TjC@gQho&W#<07*qoM6N<$g1D}&UjP6A literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CurrencyLabel.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CurrencyLabel.qml new file mode 100644 index 000000000..eca77b6e0 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CurrencyLabel.qml @@ -0,0 +1,55 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 + +import "../Styles" + +Column { + property string header_text + property string currency + property string currency_icon + property string comment + + spacing: 10 + + Text { + text: header_text + font.family: "Roboto" + font.pixelSize: 14 + color: SideSwapStyles.secondaryTextColor + } + + Row { + spacing: 10 + + Image { + source: currency_icon + width: 24 + height: 24 + } + + Text { + text: currency + font.family: "Roboto" + font.pixelSize: 18 + color: SideSwapStyles.primaryTextColor + } + } + + + Text { + text: comment + font.family: "Roboto" + font.pixelSize: 16 + color: SideSwapStyles.parapraphTextColor + } +} + diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml new file mode 100644 index 000000000..b54faa99d --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml @@ -0,0 +1,45 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.3 + +import "../Styles" + +Button { + id: control + + width: 150 + height: 50 + + property bool active: true + + font.pixelSize: 16 + font.family: "Roboto" + font.letterSpacing: 0.5 + + hoverEnabled: true + activeFocusOnTab: true + + background: Rectangle { + id: backgroundItem + color: control.active ? SideSwapStyles.buttonBackground : SideSwapStyles.buttonSecondartBackground + radius: 8 + } + + contentItem: Text { + text: control.text + font: control.font + anchors.fill: parent + color: control.active ? SideSwapStyles.primaryTextColor : SideSwapStyles.parapraphTextColor + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } +} diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml new file mode 100644 index 000000000..438765cb0 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml @@ -0,0 +1,136 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ + +import QtQuick 2.9 +import QtQuick.Controls 2.3 + +import "../Styles" +import "../../../BsStyles" + +ComboBox { + id: control + + width: 400 + height: 50 + + activeFocusOnTab: true + + property string comboboxHint + + contentItem: Rectangle { + + id: input_rect + color: "transparent" + + Column { + spacing: 4 + anchors.verticalCenter: parent.verticalCenter + + Text { + text: control.comboboxHint + font.pixelSize: 12 + font.family: "Roboto" + font.weight: Font.Bold + color: SideSwapStyles.secondaryTextColor + leftPadding: 10 + } + + Text { + text: control.currentText + font.pixelSize: 18 + font.family: "Roboto" + color: "white" + leftPadding: 10 + } + } + } + + // indicator: Item {} + + background: Rectangle { + + color: SideSwapStyles.buttonSecondartBackground + opacity: 1 + radius: 4 + + border.color: control.popup.visible ? SideSwapStyles.buttonBackground : + (control.hovered ? SideSwapStyles.buttonBackground : + (control.activeFocus ? SideSwapStyles.buttonBackground : SideSwapStyles.spacerColor)) + border.width: 1 + + implicitWidth: control.width + implicitHeight: control.height + } + + delegate: ItemDelegate { + + id: menuItem + + width: control.width - 12 + height: 50 + + leftPadding: 6 + topPadding: 4 + bottomPadding: 4 + + contentItem: Text { + + text: control.textRole + ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) + : modelData + color: "white" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + + elide: Text.ElideNone + verticalAlignment: Text.AlignVCenter + } + + highlighted: control.highlightedIndex === index + property bool currented: control.currentIndex === index + + background: Rectangle { + color: menuItem.highlighted ? "white" : "transparent" + opacity: menuItem.highlighted ? 0.2 : 1 + radius: 4 + } + } + + popup: Popup { + id: _popup + + y: control.height - 1 + width: control.width + padding: 6 + + contentItem: ListView { + id: popup_item + + clip: true + implicitHeight: contentHeight + model: control.popup.visible ? control.delegateModel : null + //model: control.delegateModel + currentIndex: control.highlightedIndex + + ScrollIndicator.vertical: ScrollIndicator { } + } + + background: Rectangle { + color: SideSwapStyles.buttonSecondartBackground + radius: 4 + + border.width: 1 + border.color: SideSwapStyles.spacerColor + } + } +} + diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml new file mode 100644 index 000000000..96adb638a --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml @@ -0,0 +1,40 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.3 + +import "../Styles" + +Rectangle { + id: root + color: "transparent" + + property bool checked: true + + Row { + anchors.fill: parent + + CustomButton { + text: qsTr("PEG-IN") + width: parent.width / 2 + height: parent.height + active: root.checked + onClicked: root.checked = true + } + CustomButton { + text: qsTr("PEG-OUT") + width: parent.width / 2 + height: parent.height + active: !root.checked + onClicked: root.checked = false + } + } +} \ No newline at end of file diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml new file mode 100644 index 000000000..ae6e1dcc8 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml @@ -0,0 +1,61 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.12 + +import "../Styles" + +Rectangle { + id: control + width: 400 + height: 50 + radius: 12 + color: SideSwapStyles.darkBlueBackground + border.width: 1 + border.color: textEdit.activeFocus ? SideSwapStyles.buttonBackground : SideSwapStyles.spacerColor + activeFocusOnTab: true + + property string textHint + property string fontFamily + property alias text: textEdit.text + property alias inputHints: textEdit.inputMethodHints + + TextInput { + id: textEdit + color: "white" + leftPadding: 10 + topPadding: 32 + rightPadding: 10 + bottomPadding: 10 + clip: true + anchors.fill: parent + font.family: control.fontFamily + + Text { + text: control.textHint + color: SideSwapStyles.secondaryTextColor + font.family: control.fontFamily + leftPadding: 10 + topPadding: 10 + } + } + + MouseArea { + id: mouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + textEdit.forceActiveFocus() + mouse.accepted = false + } + } +} \ No newline at end of file diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml new file mode 100644 index 000000000..87cdd2d3b --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml @@ -0,0 +1,39 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.12 + +import "../Styles" + +Rectangle { + id: control + width: 50 + height: 50 + color: SideSwapStyles.buttonBackground + activeFocusOnTab: true + + signal buttonClicked() + + // Image { + // anchors.fill: parent + // source: "qrc:/images/transfer_icon.png" + // } + + MouseArea { + id: mouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: { + control.buttonClicked() + } + } +} \ No newline at end of file diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml new file mode 100644 index 000000000..948a64896 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml @@ -0,0 +1,194 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.12 + +import "." +import "Styles" +import "Controls" +import "../../" + + +Item { + id: root + width: 620 + height: 720 + + property bool peg_in: true + + Rectangle{ + anchors.fill: parent + color: "transparent" + + + Rectangle { + id: topPanel + width: parent.width + height: 350 + anchors.top: parent.top + color: SideSwapStyles.darkBlueBackground + } + + Rectangle { + width: parent.width + height: parent.height - topPanel.height + anchors.bottom: parent.bottom + color: SideSwapStyles.skyBlueBackground + } + + Column { + spacing: 20 + anchors.fill: parent + anchors.topMargin: 40 + anchors.rightMargin: 20 + anchors.leftMargin: 20 + + CustomSwitch { + width: parent.width + height: 30 + anchors.horizontalCenter: parent.horizontalCenter + checked: root.peg_in + + onCheckedChanged: root.peg_in = checked + } + + CurrencyLabel { + header_text: qsTr("Deliver") + currency: root.peg_in ? qsTr("BTC") : qsTr("L-BTC") + currency_icon: root.peg_in + ? "qrc:/images/sideswap/btc_icon.svg" + : "qrc:/images/sideswap/lbtc_icon.svg" + comment: qsTr("Min: 0.001 ") + currency + } + + Rectangle { + height: 2 + width: parent.width + color: SideSwapStyles.spacerColor + } + + Text { + text: "SideSwap will generate a Peg-In address for you to deliver BTC into. Each peg-in/out URL is unique and can be re-entered to view your progress. A peg-in/out address may be re-used." + width: parent.width - 20 + color: SideSwapStyles.parapraphTextColor + clip: true + wrapMode: Text.Wrap + } + + Row { + spacing: 20 + width: parent.width + height: 50 + + IconButton { + width: 50 + height: 50 + radius: 25 + + onButtonClicked: root.peg_in = !root.peg_in + } + + Rectangle { + width: 200 + height: 30 + radius: 15 + color: "lightblue" + anchors.verticalCenter: parent.verticalCenter + + Rectangle { + width: 15 + height: 15 + anchors.left: parent.left + anchors.top: parent.top + color: "lightblue" + } + + Text { + text: qsTr("Covertion rate 99.9%") + color: "black" + anchors.centerIn: parent + } + } + } + + Row { + spacing: 20 + height: 60 + width: parent.width + + CurrencyLabel { + id: receiveLabel + header_text: qsTr("Receive") + currency: root.peg_in ? qsTr("L-BTC") : qsTr("BTC") + currency_icon: root.peg_in + ? "qrc:/images/sideswap/lbtc_icon.svg" + : "qrc:/images/sideswap/btc_icon.svg" + comment: "" + width: 100 + } + + CustomCombobox { + model: ['A', 'B', 'C'] + height: 60 + width: parent.width - receiveLabel.width - 20 + anchors.verticalCenter: parent.verticalCenter + visible: !root.peg_in + comboboxHint: qsTr("Fee suggestion") + } + } + + Rectangle { + height: 2 + width: parent.width + color: SideSwapStyles.spacerColor + } + + Column { + width: parent.width + spacing: 5 + + CustomCombobox { + height: 60 + width: parent.width + model: walletBalances + textRole: "name" + valueRole: "name" + comboboxHint: qsTr("Wallet") + } + + CustomTextEdit { + width: parent.width + height: 60 + textHint: qsTr("Amount") + visible: root.peg_in + inputHints: Text.ImhDigitsOnly + } + + CustomTextEdit { + width: parent.width + height: 60 + textHint: qsTr("Your Liquid Address") + visible: root.peg_in + } + } + + CustomButton { + text: qsTr("CONTINUE") + width: parent.width + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + + function reset() { + } +} diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml new file mode 100644 index 000000000..e69de29bb diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml new file mode 100644 index 000000000..e69de29bb diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml new file mode 100644 index 000000000..d1c78a4b6 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml @@ -0,0 +1,41 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.12 + +import "." +import "../Common" +import "../../" + +PluginPopup { + id: root + + background: Rectangle { + anchors.fill: parent + color: "black" + radius: 14 + } + + contentItem: StackView { + id: stackView + initialItem: mainPage + anchors.fill: parent + + SideSwapMainPage { + id: mainPage + } + } + + function reset() + { + } +} diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml new file mode 100644 index 000000000..c6c044c29 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml @@ -0,0 +1,26 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +pragma Singleton +import QtQuick 2.0 + +QtObject { + readonly property color darkBlueBackground: "#003150" + readonly property color skyBlueBackground: "#064066" + + readonly property color primaryTextColor: "white" + readonly property color secondaryTextColor: "#03b3f3" + readonly property color parapraphTextColor: "#6d9dab" + + readonly property color spacerColor: "#104c72" + + readonly property color buttonBackground: "#00b4e9" + readonly property color buttonSecondartBackground: "#043857" +} \ No newline at end of file diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Styles/qmldir b/GUI/QtQuick/qml/Plugins/SideSwap/Styles/qmldir new file mode 100644 index 000000000..cab2ea498 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Styles/qmldir @@ -0,0 +1,3 @@ +module BlockSettleStyle + +singleton SideSwapStyles 1.0 SideSwapStyles.qml diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 833c65e14..42aae1512 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -203,5 +203,19 @@ qml/Plugins/SideShift/SideShiftBuyPage.qml qml/Plugins/SideShift/SideShiftCopyButton.qml images/sideshift_right_arrow.png + images/sideswap_plugin.png + images/leverex_plugin.png + qml/Plugins/SideSwap/SideSwapPopup.qml + qml/Plugins/SideSwap/SideSwapMainPage.qml + qml/Plugins/SideSwap/Controls/CurrencyLabel.qml + qml/Plugins/SideSwap/Controls/CustomButton.qml + qml/Plugins/SideSwap/Controls/CustomCombobox.qml + qml/Plugins/SideSwap/Controls/CustomSwitch.qml + qml/Plugins/SideSwap/Controls/CustomTextEdit.qml + qml/Plugins/SideSwap/Controls/IconButton.qml + qml/Plugins/SideSwap/Styles/qmldir + qml/Plugins/SideSwap/Styles/SideSwapStyles.qml + images/sideswap/btc_icon.svg + images/sideswap/lbtc_icon.svg diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp index a3e5dc781..be909f239 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp @@ -26,11 +26,23 @@ PluginsListModel::PluginsListModel(QObject* parent) : QAbstractListModel(parent) { plugins_ = { + { tr("Leverex") + , tr("Levereage made simple") + , QString::fromLatin1("qrc:/images/leverex_plugin.png") + , nullptr + , QString::fromLatin1("") }, + { tr("SideShift.ai") , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") , QString::fromLatin1("qrc:/images/sideshift_plugin.png") , new SideShiftController(this) - , QString::fromLatin1("qrc:/qml/Plugins/SideShift/SideShiftPopup.qml") } + , QString::fromLatin1("qrc:/qml/Plugins/SideShift/SideShiftPopup.qml") }, + + { tr("SideSwap.io") + , tr("Easiest way to get started on the Liquid Network") + , QString::fromLatin1("qrc:/images/sideswap_plugin.png") + , nullptr + , QString::fromLatin1("qrc:/qml/Plugins/SideSwap/SideSwapPopup.qml") } }; } From 6820a82d7ff8108039d0ab60572000c6e2c0a588 Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 24 Mar 2023 14:15:24 +0100 Subject: [PATCH 280/436] Formatting --- GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml | 2 +- GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml | 2 +- GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml | 2 +- GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml index 96adb638a..50ebbe2f4 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml @@ -37,4 +37,4 @@ Rectangle { onClicked: root.checked = false } } -} \ No newline at end of file +} diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml index ae6e1dcc8..976ef7e04 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml @@ -58,4 +58,4 @@ Rectangle { mouse.accepted = false } } -} \ No newline at end of file +} diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml index 87cdd2d3b..d48e92b4b 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml @@ -36,4 +36,4 @@ Rectangle { control.buttonClicked() } } -} \ No newline at end of file +} diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml index c6c044c29..f5b6d1427 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml @@ -23,4 +23,4 @@ QtObject { readonly property color buttonBackground: "#00b4e9" readonly property color buttonSecondartBackground: "#043857" -} \ No newline at end of file +} From 501e4485e1c15f78d0f330e0d123d3957dea63d5 Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 24 Mar 2023 14:34:14 +0100 Subject: [PATCH 281/436] SideSwap MainPage background sizes --- GUI/QtQuick/AddressFilterModel.cpp | 5 ++--- GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp index dce38c1a0..5b419de52 100644 --- a/GUI/QtQuick/AddressFilterModel.cpp +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -11,7 +11,6 @@ #include "AddressFilterModel.h" #include "AddressListModel.h" #include -#include AddressFilterModel::AddressFilterModel(std::shared_ptr settings) : QSortFilterProxyModel() @@ -83,9 +82,9 @@ bool AddressFilterModel::filterAcceptsRow(int source_row, const QModelIndex& sou bool AddressFilterModel::lessThan(const QModelIndex& left, const QModelIndex& right) const { try { - if (qFuzzyIsNull(sourceModel()->data(sourceModel()->index(left.row(), 2) + if (!qFuzzyIsNull(sourceModel()->data(sourceModel()->index(left.row(), 2) , QmlAddressListModel::TableRoles::TableDataRole).toDouble()) && - !qFuzzyIsNull(sourceModel()->data(sourceModel()->index(right.row(), 2) + qFuzzyIsNull(sourceModel()->data(sourceModel()->index(right.row(), 2) , QmlAddressListModel::TableRoles::TableDataRole).toDouble())) { return true; } diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml index 948a64896..1c00986b3 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml @@ -33,7 +33,7 @@ Item { Rectangle { id: topPanel width: parent.width - height: 350 + height: 270 anchors.top: parent.top color: SideSwapStyles.darkBlueBackground } From ae4c9960f4a9593244b04934a87376aab24be39c Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 24 Mar 2023 14:44:38 +0100 Subject: [PATCH 282/436] Copyrights --- GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml | 2 +- GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml | 2 +- GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml | 2 +- GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml | 5 ----- GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml | 2 +- 5 files changed, 4 insertions(+), 9 deletions(-) diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml index b54faa99d..0a0b7dadd 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml index 438765cb0..75f69696f 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml index 50ebbe2f4..ebc6ce13c 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml index d48e92b4b..09a861e1e 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml @@ -23,11 +23,6 @@ Rectangle { signal buttonClicked() - // Image { - // anchors.fill: parent - // source: "qrc:/images/transfer_icon.png" - // } - MouseArea { id: mouseArea anchors.fill: parent diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml index 1c00986b3..813dfc0cb 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml @@ -33,7 +33,7 @@ Item { Rectangle { id: topPanel width: parent.width - height: 270 + height: 290 anchors.top: parent.top color: SideSwapStyles.darkBlueBackground } From abcc6a5b34280a6e16678b92b18dbdde8fd32099 Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 24 Mar 2023 15:37:52 +0100 Subject: [PATCH 283/436] Review fixes --- GUI/QtQuick/AddressFilterModel.cpp | 2 +- GUI/QtQuick/qml/Plugins/SideSwap/Controls/CurrencyLabel.qml | 2 +- GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml | 4 ++-- GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml | 4 ++-- GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml | 4 ++-- GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml | 0 GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml | 0 GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml | 4 ++-- 8 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml delete mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp index 5b419de52..752d1a4e4 100644 --- a/GUI/QtQuick/AddressFilterModel.cpp +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -132,7 +132,7 @@ void AddressFilterModel::setHideUsed(bool hideUsed) noexcept } void AddressFilterModel::setHideInternal(bool hideInternal) noexcept -{\ +{ if (hideInternal_ != hideInternal) { hideInternal_ = hideInternal; settings_->setParam(ApplicationSettings::Setting::AddressFilterHideInternal, hideInternal_); diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CurrencyLabel.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CurrencyLabel.qml index eca77b6e0..d2239aa01 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CurrencyLabel.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CurrencyLabel.qml @@ -49,7 +49,7 @@ Column { text: comment font.family: "Roboto" font.pixelSize: 16 - color: SideSwapStyles.parapraphTextColor + color: SideSwapStyles.paragraphTextColor } } diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml index 0a0b7dadd..dba8c1ab2 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml @@ -30,7 +30,7 @@ Button { background: Rectangle { id: backgroundItem - color: control.active ? SideSwapStyles.buttonBackground : SideSwapStyles.buttonSecondartBackground + color: control.active ? SideSwapStyles.buttonBackground : SideSwapStyles.buttonSecondaryBackground radius: 8 } @@ -38,7 +38,7 @@ Button { text: control.text font: control.font anchors.fill: parent - color: control.active ? SideSwapStyles.primaryTextColor : SideSwapStyles.parapraphTextColor + color: control.active ? SideSwapStyles.primaryTextColor : SideSwapStyles.paragraphTextColor verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter } diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml index 75f69696f..054dfa586 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml @@ -57,7 +57,7 @@ ComboBox { background: Rectangle { - color: SideSwapStyles.buttonSecondartBackground + color: SideSwapStyles.buttonSecondaryBackground opacity: 1 radius: 4 @@ -125,7 +125,7 @@ ComboBox { } background: Rectangle { - color: SideSwapStyles.buttonSecondartBackground + color: SideSwapStyles.buttonSecondaryBackground radius: 4 border.width: 1 diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml index 813dfc0cb..ed425f5ed 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml @@ -79,7 +79,7 @@ Item { Text { text: "SideSwap will generate a Peg-In address for you to deliver BTC into. Each peg-in/out URL is unique and can be re-entered to view your progress. A peg-in/out address may be re-used." width: parent.width - 20 - color: SideSwapStyles.parapraphTextColor + color: SideSwapStyles.paragraphTextColor clip: true wrapMode: Text.Wrap } @@ -113,7 +113,7 @@ Item { } Text { - text: qsTr("Covertion rate 99.9%") + text: qsTr("Coversion rate 99.9%") color: "black" anchors.centerIn: parent } diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml deleted file mode 100644 index e69de29bb..000000000 diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml deleted file mode 100644 index e69de29bb..000000000 diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml index f5b6d1427..07f84d7f6 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Styles/SideSwapStyles.qml @@ -17,10 +17,10 @@ QtObject { readonly property color primaryTextColor: "white" readonly property color secondaryTextColor: "#03b3f3" - readonly property color parapraphTextColor: "#6d9dab" + readonly property color paragraphTextColor: "#6d9dab" readonly property color spacerColor: "#104c72" readonly property color buttonBackground: "#00b4e9" - readonly property color buttonSecondartBackground: "#043857" + readonly property color buttonSecondaryBackground: "#043857" } From 9ac17016545b8f97aaf812ac885935d81be29f4d Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 24 Mar 2023 17:49:42 +0300 Subject: [PATCH 284/436] update common --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index 3ad75b56f..b16f26f6f 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 3ad75b56fde21d1162aa37e054ebab218d105f0f +Subproject commit b16f26f6fb6bc576e859f6a542cb51ffa35ed43e From b5513f5858902f01dc2282014d034075fa536917 Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 24 Mar 2023 15:59:41 +0100 Subject: [PATCH 285/436] Fixed typo --- GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp index be909f239..01d1eb0cd 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp @@ -27,7 +27,7 @@ PluginsListModel::PluginsListModel(QObject* parent) { plugins_ = { { tr("Leverex") - , tr("Levereage made simple") + , tr("Leverage made simple") , QString::fromLatin1("qrc:/images/leverex_plugin.png") , nullptr , QString::fromLatin1("") }, From 0d1af7cbe6703755f80c5243bbcf650def9d667d Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 24 Mar 2023 16:00:58 +0100 Subject: [PATCH 286/436] Missed translaction --- GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml index ed425f5ed..99e1323eb 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml @@ -77,7 +77,7 @@ Item { } Text { - text: "SideSwap will generate a Peg-In address for you to deliver BTC into. Each peg-in/out URL is unique and can be re-entered to view your progress. A peg-in/out address may be re-used." + text: qsTr("SideSwap will generate a Peg-In address for you to deliver BTC into. Each peg-in/out URL is unique and can be re-entered to view your progress. A peg-in/out address may be re-used.") width: parent.width - 20 color: SideSwapStyles.paragraphTextColor clip: true From a3212cc7d35eb931eb8030368de8e0966adb7572 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 24 Mar 2023 22:17:16 +0300 Subject: [PATCH 287/436] [QT-52] TX comments --- GUI/QtQuick/QtQuickAdapter.cpp | 4 ---- GUI/QtQuick/TxListModel.cpp | 44 ++++++++++------------------------ GUI/QtQuick/TxListModel.h | 3 +-- UnitTests/TestWallet.cpp | 2 ++ common | 2 +- 5 files changed, 17 insertions(+), 38 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index cbc4273ab..1c866c995 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1155,9 +1155,6 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId if (!response.error_msg().empty()) { txDet.comment = response.error_msg(); } - if (!resp.comment().empty()) { - txModel_->setTxComment(resp.tx_hash(), txDet.comment); - } const auto &ownTxHash = BinaryData::fromString(resp.tx_hash()); try { @@ -1225,7 +1222,6 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId const auto& itTxDet = txDetailReqs_.find(msgId); if (itTxDet == txDetailReqs_.end()) { - logger_->debug("[{}] TX model update", __func__); if (txDet.direction == bs::sync::Transaction::Direction::Revoke) { txModel_->removeTX(txDet.txHash); } diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 8bdf378ed..225b20be9 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -79,16 +79,7 @@ QVariant TxListModel::getData(int row, int col) const case 4: return gui_utils::satoshiToQString(std::abs(entry.value)); case 5: return entry.nbConf; case 6: return txFlag(row); - case 7: { - const auto& itComm = txComments_.find(entry.txHash.toBinStr()); - if (itComm != txComments_.end()) { - return QString::fromStdString(itComm->second); - } - else { - return QString(); - } - break; - } + case 7: return txComment(row); default: break; } return {}; @@ -146,6 +137,15 @@ QString TxListModel::txType(int row) const return {}; } +QString TxListModel::txComment(int row) const +{ + const auto& itTxDet = txDetails_.find(row); + if (itTxDet != txDetails_.end()) { + return QString::fromStdString(itTxDet->second.comment); + } + return {}; +} + QString TxListModel::txFlag(int row) const { if (isRBF(row)) { @@ -277,24 +277,6 @@ void TxListModel::clear() emit nbTxChanged(); } -void TxListModel::setTxComment(const std::string& txHash, const std::string& comment) -{ - txComments_[txHash] = comment; - int rowFirst = -1, rowLast = -1; - for (int i = 0; i < data_.size(); ++i) { - const auto& txEntryHash = data_.at(i).txHash.toBinStr(); - if (txHash == txEntryHash) { - if (!rowFirst) { - rowFirst = i; - } - rowLast = i; - } - } - if (rowFirst != -1 && rowLast != -1) { - emit dataChanged(createIndex(rowFirst, 7), createIndex(rowLast, 7)); - } -} - void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet, bool usePending) { int row = -1; @@ -309,12 +291,12 @@ void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet, bool usePen } } if (row != -1) { - emit dataChanged(createIndex(row, 1), createIndex(row, 6)); - logger_->debug("[TxListModel::setDetails] {} {} found at row {}", txDet.txHash.toHexStr(), txDet.hdWalletId, row); + emit dataChanged(createIndex(row, 1), createIndex(row, 7)); + //logger_->debug("[TxListModel::setDetails] {} {} found at row {}", txDet.txHash.toHexStr(), txDet.hdWalletId, row); } else { - logger_->warn("[TxListModel::setDetails] {} {} not found", txDet.txHash.toHexStr(), txDet.hdWalletId); + //logger_->warn("[TxListModel::setDetails] {} {} not found", txDet.txHash.toHexStr(), txDet.hdWalletId); if (usePending) { pendingDetails_.push_back(txDet); } diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 434267299..694ec4abe 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -51,7 +51,6 @@ class TxListModel : public QAbstractTableModel void addRows(const std::vector&); void clear(); - void setTxComment(const std::string& txHash, const std::string& comment); void setDetails(const bs::sync::TXWalletDetails&, bool usePending = true); void removeTX(const BinaryData& txHash); void setCurrentBlock(uint32_t); @@ -66,6 +65,7 @@ class TxListModel : public QAbstractTableModel QString txType(int row) const; QString txFlag(int row) const; QString txId(int row) const; + QString txComment(int row) const; bool isRBF(int row) const; quint32 nbConf(int row) const; @@ -73,7 +73,6 @@ class TxListModel : public QAbstractTableModel std::shared_ptr logger_; const QStringList header_; std::vector data_; - std::unordered_map txComments_; std::map txDetails_; std::vector pendingDetails_; uint32_t curBlock_; diff --git a/UnitTests/TestWallet.cpp b/UnitTests/TestWallet.cpp index 68d4ce32b..c8d161bc6 100644 --- a/UnitTests/TestWallet.cpp +++ b/UnitTests/TestWallet.cpp @@ -2057,10 +2057,12 @@ TEST_F(TestWallet, WalletMeta) EXPECT_EQ(result.first, settlCp.settlementId); EXPECT_EQ(result.second, settlCp.cpAddr); } +#if 0 for (auto &settlMeta : settlMetas) { auto result = leafNative->getSettlAuthAddr(settlMeta.settlementId); EXPECT_EQ(result, settlMeta.authAddr); } +#endif for (auto &addr : addrComments) { EXPECT_EQ(leafNative->getAddressComment(addr.first), addr.second); } diff --git a/common b/common index b16f26f6f..8af5fb50c 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit b16f26f6fb6bc576e859f6a542cb51ffa35ed43e +Subproject commit 8af5fb50ce00ee569a8e0f79e567fee8033457bc From 856223cd12ccfac93f97a345f26b7175cb7f41ef Mon Sep 17 00:00:00 2001 From: YZ Date: Sat, 25 Mar 2023 11:15:04 +0100 Subject: [PATCH 288/436] Peg-In/Out --- .../qml/Overview/OverviewWalletBar.qml | 13 +- .../Controls/CustomBorderedButton.qml | 46 ++++++ .../SideSwap/Controls/CustomTextEdit.qml | 2 + .../qml/Plugins/SideSwap/SideSwapMainPage.qml | 7 + .../qml/Plugins/SideSwap/SideSwapPegIn.qml | 43 +++++ .../qml/Plugins/SideSwap/SideSwapPegOut.qml | 154 ++++++++++++++++++ .../qml/Plugins/SideSwap/SideSwapPopup.qml | 24 +++ GUI/QtQuick/qtquick.qrc | 3 + 8 files changed, 288 insertions(+), 4 deletions(-) create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml create mode 100644 GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index 28e57dfa8..b7fd0cc10 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -39,16 +39,21 @@ Rectangle { width: 263 height: 53 - model: walletBalances + model: walletBalances.rowCount > 0 ? walletBalances : [{ "name": qsTr("Create new wallet")}] textRole: "name" valueRole: "name" fontSize: 16 onCurrentIndexChanged: { - bsApp.walletSelected(currentIndex) - control.walletIndexChanged(currentIndex) - walletBalances.selectedWallet = currentIndex + if (walletBalances.rowCount === 0) { + control.createNewWallet() + } + else { + bsApp.walletSelected(currentIndex) + control.walletIndexChanged(currentIndex) + walletBalances.selectedWallet = currentIndex + } } Connections { diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml new file mode 100644 index 000000000..afea010ff --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml @@ -0,0 +1,46 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Controls 2.3 + +import "../Styles" + +Button { + id: control + + width: 150 + height: 50 + + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Bold + font.letterSpacing: 0.5 + + hoverEnabled: true + activeFocusOnTab: true + + background: Rectangle { + id: backgroundItem + color: "transparent" + radius: 8 + border.width: 1 + border.color: SideSwapStyles.buttonBackground + } + + contentItem: Text { + text: control.text + font: control.font + anchors.fill: parent + color: SideSwapStyles.primaryTextColor + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } +} diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml index 976ef7e04..cf389c177 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml @@ -38,12 +38,14 @@ Rectangle { bottomPadding: 10 clip: true anchors.fill: parent + font.pixelSize: 14 font.family: control.fontFamily Text { text: control.textHint color: SideSwapStyles.secondaryTextColor font.family: control.fontFamily + font.pixelSize: 12 leftPadding: 10 topPadding: 10 } diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml index 99e1323eb..688712556 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml @@ -25,6 +25,8 @@ Item { property bool peg_in: true + signal continueClicked() + Rectangle{ anchors.fill: parent color: "transparent" @@ -166,6 +168,7 @@ Item { } CustomTextEdit { + id: amountInput width: parent.width height: 60 textHint: qsTr("Amount") @@ -174,6 +177,7 @@ Item { } CustomTextEdit { + id: addressInput width: parent.width height: 60 textHint: qsTr("Your Liquid Address") @@ -185,10 +189,13 @@ Item { text: qsTr("CONTINUE") width: parent.width anchors.horizontalCenter: parent.horizontalCenter + onClicked: root.continueClicked() } } } function reset() { + amountInput.text = "" + addressInput.text = "" } } diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml new file mode 100644 index 000000000..f4a0c18fd --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml @@ -0,0 +1,43 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.12 + +import "." +import "Styles" +import "Controls" +import "../../" + + +Item { + id: root + width: 620 + height: 720 + + signal back() + + Rectangle { + anchors.fill: parent + color: SideSwapStyles.darkBlueBackground + } + + Column { + anchors.fill: parent + anchors.margins: 20 + + CustomBorderedButton { + width: parent.width + text: qsTr("BACK") + onClicked: root.back() + } + } +} \ No newline at end of file diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml new file mode 100644 index 000000000..c1a422007 --- /dev/null +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml @@ -0,0 +1,154 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +import QtQuick 2.15 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.12 + +import "." +import "Styles" +import "Controls" +import "../../" + + +Item { + id: root + width: 620 + height: 720 + + property string minTransferAmount: qsTr("0.001") + property string toAddress: "bc1qvrl85pygns90xut25qu0tpmawm9h03j3d9w94a" + property string fromAddress: "bc1qvrl85pygns90xut25qu0tpmawm9h03j3d9w94a" + + signal back() + + Rectangle { + anchors.fill: parent + color: SideSwapStyles.darkBlueBackground + } + + Column { + spacing: 30 + anchors.fill: parent + anchors.margins: 20 + + Text { + text: qsTr("Send L-BTC to the following address:") + color: SideSwapStyles.primaryTextColor + font.pixelSize: 24 + anchors.horizontalCenter: parent.horizontalCenter + topPadding: 20 + } + + Text { + text: qsTr("Min amount: ") + minTransferAmount + color: SideSwapStyles.primaryTextColor + font.pixelSize: 14 + anchors.horizontalCenter: parent.horizontalCenter + } + + Rectangle { + height: 1 + width: parent.width + color: SideSwapStyles.spacerColor + } + + Row { + spacing: 20 + width: parent.width + height: 300 + + Item { + width: parent.width / 2 - parent.spacing + height: parent.height + + Rectangle { + width: 240 + height: 240 + radius: 20 + color: SideSwapStyles.buttonBackground + anchors.centerIn: parent + + Rectangle { + width: 226 + height: 226 + radius: 16 + anchors.centerIn: parent + + Image { + source: "image://QR/" + root.toAddress + sourceSize.width: 220 + sourceSize.height: 220 + width: 220 + height: 220 + anchors.centerIn: parent + } + } + } + } + + Item { + width: parent.width / 2 - parent.spacing + height: parent.height + + Column { + spacing: 20 + anchors.fill: parent + anchors.margins: 20 + + Text { + text: root.toAddress + color: SideSwapStyles.primaryTextColor + font.pixelSize: 18 + width: parent.width + clip: true + wrapMode: Text.Wrap + } + + CustomButton { + text: qsTr("Copy Address") + width: parent.width + height: 50 + anchors.horizontalCenter: parent.horizontalCenter + onClicked: bsApp.copyAddressToClipboard(root.toAddress) + } + } + } + } + + Rectangle { + width: parent.width + height: 1 + color: SideSwapStyles.spacerColor + } + + Column { + Text { + text: qsTr("BTC payment address") + font.pixelSize: 14 + color: SideSwapStyles.paragraphTextColor + } + + Text { + text: root.fromAddress + font.pixelSize: 14 + color: SideSwapStyles.paragraphTextColor + } + } + + CustomBorderedButton { + text: qsTr("BACK") + width: parent.width + height: 60 + anchors.horizontalCenter: parent.horizontalCenter + onClicked: root.back() + } + } +} \ No newline at end of file diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml index d1c78a4b6..9733c7e3b 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml @@ -32,10 +32,34 @@ PluginPopup { SideSwapMainPage { id: mainPage + visible: false + + onContinueClicked: { + if (mainPage.peg_in) { + stackView.replace(pegInPage) + } + else { + stackView.replace(pegOutPage) + } + } + } + + SideSwapPegOut { + id: pegOutPage + visible: false + onBack: root.reset() + } + + SideSwapPegIn { + id: pegInPage + visible: false + onBack: root.reset() } } function reset() { + stackView.replace(mainPage) + mainPage.reset() } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 42aae1512..116d3ad60 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -217,5 +217,8 @@ qml/Plugins/SideSwap/Styles/SideSwapStyles.qml images/sideswap/btc_icon.svg images/sideswap/lbtc_icon.svg + qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml + qml/Plugins/SideSwap/SideSwapPegOut.qml + qml/Plugins/SideSwap/SideSwapPegIn.qml From 1af0fd92279c7d1fc0933618c6b539083aa98088 Mon Sep 17 00:00:00 2001 From: YZ Date: Sun, 26 Mar 2023 22:23:54 +0200 Subject: [PATCH 289/436] Wallet creation from combobox; view in explorer --- GUI/QtQuick/qml/ExplorerPage.qml | 4 ++++ GUI/QtQuick/qml/Overview/OverviewPanel.qml | 5 +++-- GUI/QtQuick/qml/Overview/OverviewWalletBar.qml | 8 +++++++- GUI/QtQuick/qml/OverviewPage.qml | 2 ++ .../qml/StyledControls/CustomContextMenu.qml | 1 + .../qml/StyledControls/CustomRbfCpfpMenu.qml | 8 ++++++++ .../StyledControls/CustomTransactionsTableView.qml | 5 +++-- GUI/QtQuick/qml/TransactionsPage.qml | 2 ++ GUI/QtQuick/qml/main.qml | 13 +++++++++---- 9 files changed, 39 insertions(+), 9 deletions(-) diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml index 01417bf0c..e03a33104 100644 --- a/GUI/QtQuick/qml/ExplorerPage.qml +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -26,6 +26,10 @@ Item { id: explorer + function openTransaction(txId) { + expSearchBox.requestSearchText(txId) + } + ExplorerEmpty { id: explorerEmpty visible: false diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 7c5e217d4..8342481ef 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -21,6 +21,7 @@ Rectangle { id: control signal openSend (string txId, bool isRBF, bool isCPFP) + signal openExplorer (string txId) width: 1200 height: 788 @@ -61,7 +62,7 @@ Rectangle { anchors.fill: parent anchors.margins: 20 spacing: 10 - + Rectangle { id: tableMenu color: "transparent" @@ -180,8 +181,8 @@ Rectangle { } onOpenSend: (txId, isRBF, isCPFP) => control.openSend(txId, isRBF, isCPFP) + onOpenExplorer: (txId) => control.openExplorer(txId) } - } } } diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index b7fd0cc10..72a6c938e 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -39,7 +39,7 @@ Rectangle { width: 263 height: 53 - model: walletBalances.rowCount > 0 ? walletBalances : [{ "name": qsTr("Create new wallet")}] + model: walletBalances.rowCount > 0 ? walletBalances : [{ "name": qsTr("Create wallet")}] textRole: "name" valueRole: "name" @@ -56,6 +56,12 @@ Rectangle { } } + onActivated: { + if (walletBalances.rowCount === 0) { + control.createNewWallet() + } + } + Connections { target: bsApp function onRequestWalletSelection(index) { diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index d3637bf85..b8003a227 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -29,6 +29,7 @@ Item { signal newWalletClicked(); signal curWalletIndexChanged(index : int) signal openSend (string txId, bool isRBF, bool isCPFP) + signal openExplorer (string txId) AddressDetails { id: addressDetails @@ -69,5 +70,6 @@ Item { } onOpenSend: (txId, isRBF, isCPFP) => overview.openSend(txId, isRBF, isCPFP) + onOpenExplorer: (txId) => overview.openExplorer(txId) } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml b/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml index 38c122738..af7785c3f 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml @@ -19,6 +19,7 @@ Menu { leftPadding: 6 topPadding: 4 bottomPadding: 4 + rightPadding: 6 delegate: MenuItem { id: menuItem diff --git a/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml b/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml index bc991c247..341ea0c44 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomRbfCpfpMenu.qml @@ -20,6 +20,7 @@ CustomContextMenu { id: context_menu signal openSend (string txId, bool isRBF, bool isCPFP) + signal openExplorer(string txId) property int row property int column @@ -44,4 +45,11 @@ CustomContextMenu { } } + Action { + text: qsTr("View in explorer") + onTriggered: { + var txId = model.data(model.index(context_menu.row, context_menu.column), TxListModel.TxIdRole) + context_menu.openExplorer(txId) + } + } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTransactionsTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTransactionsTableView.qml index ae634f099..59cd82ca7 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTransactionsTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTransactionsTableView.qml @@ -21,6 +21,7 @@ CustomTableView { id: control signal openSend (string txId, bool isRBF, bool isCPFP) + signal openExplorer (string txId) copy_button_column_index: 3 columnWidths: [0.12, 0.1, 0.08, 0.3, 0.1, 0.1, 0.1, 0.1] @@ -32,11 +33,11 @@ CustomTableView { model: control.model onOpenSend: (txId, isRBF, isCPFP) => control.openSend(txId, isRBF, isCPFP) + onOpenExplorer: (txId) => control.openExplorer(txId) } onCellClicked: (row, column, data, mouse) => { - var nbConf = model.data(model.index(row, 5), TxListModel.NbConfRole) - if (mouse.button === Qt.RightButton && nbConf === 0) + if (mouse.button === Qt.RightButton) { context_menu.row = row context_menu.column = column diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 3ecd07c64..9f3584927 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -26,6 +26,7 @@ Item { height: 788 signal openSend (string txId, bool isRBF, bool isCPFP) + signal openExplorer (string txId) FileDialog { id: fileDialogCSV @@ -177,6 +178,7 @@ Item { model: transactionFilterModel onOpenSend: (txId, isRBF, isCPFP) => control.openSend(txId, isRBF, isCPFP) + onOpenExplorer: (txId) => transactions.openExplorer(txId) } } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index e9a2dff3b..83eeba0da 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -293,14 +293,15 @@ ApplicationWindow { show_popup(create_wallet) } - onCurWalletIndexChanged: (ind) => { - overviewWalletIndex = ind - } - onOpenSend: (txId, isRBF, isCPFP) => { send_popup.open(txId, isRBF, isCPFP) show_popup(send_popup, true) } + + onOpenExplorer: (txId) => { + tabBar.currentIndex = 2 + explorerPage.openTransaction(txId) + } } TransactionsPage { @@ -310,6 +311,10 @@ ApplicationWindow { send_popup.open(txId, isRBF, isCPFP) show_popup(send_popup, true) } + onOpenExplorer: (txId) => { + tabBar.currentIndex = 2 + explorerPage.openTransaction(txId) + } } ExplorerPage { From eb39d86f09c7847f9c2f68e30b908b13470fa3ac Mon Sep 17 00:00:00 2001 From: YZ Date: Sun, 26 Mar 2023 22:34:51 +0200 Subject: [PATCH 290/436] new lines --- GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml | 2 +- GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml index f4a0c18fd..0d8002eab 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml @@ -40,4 +40,4 @@ Item { onClicked: root.back() } } -} \ No newline at end of file +} diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml index c1a422007..5fb6bc9ca 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml @@ -151,4 +151,4 @@ Item { onClicked: root.back() } } -} \ No newline at end of file +} From 318b37df330cd92bcae061cbff94aecb365e2488 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Mon, 27 Mar 2023 09:07:38 +0300 Subject: [PATCH 291/436] [QT-49,54,73] wallet name & delete software wallet & create new wallet --- BlockSettleApp/blocksettle.ico | Bin 399142 -> 399142 bytes GUI/QtQuick/QtQuickAdapter.cpp | 43 ++++++-- GUI/QtQuick/QtQuickAdapter.h | 7 +- GUI/QtQuick/WalletBalancesModel.cpp | 11 ++ GUI/QtQuick/WalletBalancesModel.h | 1 + GUI/QtQuick/images/edit_wallet_name.ico | Bin 0 -> 1150 bytes GUI/QtQuick/images/terminal.ico | Bin 399142 -> 399142 bytes .../qml/CreateWallet/ConfirmPassword.qml | 5 +- GUI/QtQuick/qml/CreateWallet/CreateWallet.qml | 22 +++- GUI/QtQuick/qml/CreateWallet/WalletName.qml | 103 ++++++++++++++++++ .../qml/StyledControls/CustomTextInput.qml | 12 ++ .../qml/WalletProperties/ChangePassword.qml | 2 +- .../qml/WalletProperties/DeleteWallet.qml | 43 +++++++- .../WalletPropertiesPopup.qml | 9 +- GUI/QtQuick/qml/main.qml | 2 +- GUI/QtQuick/qtquick.qrc | 2 + 16 files changed, 236 insertions(+), 26 deletions(-) create mode 100644 GUI/QtQuick/images/edit_wallet_name.ico create mode 100644 GUI/QtQuick/qml/CreateWallet/WalletName.qml diff --git a/BlockSettleApp/blocksettle.ico b/BlockSettleApp/blocksettle.ico index 99ce048b30e5bfd417f80a843ea82b12a48050cd..511034bb59228c863685df06785fce7ff1e73bb7 100644 GIT binary patch literal 399142 zcmeI*ziu4o6^8Lq;KFGFm97#t0aWS|7C|n+cVKo-moD`-i7Yn?EC(s=GF>WzKpMNs zCBzV=WUVfh%NQVqFf*aJmc7H>A#3m`r}_V&Ch?)G^^F+#}9th zG=Kkf)4c!w<;Va2uwCD7xL&`${@r`cKfZ16pndD^@4?YK&42%MuX)gZ+-}`oa(Q|C zU$biOH|y=>$)lr_Pe1x>$nnLWK5jqTAHJPDeY84x`uJkl@o4qK)lIYX^?z%bo;>~d z%OS@XPj>l#x7i%MdimnB1IGtH=6?0@`R41@`R4Ru-|_0@>1S8B|MCAzUw^haefVnA z^51v7d~q%RAM>2*<8IEhqpj(L?&eSTcHGXmxBczplgHmgjzfHg&B5#ErTwpG)3L>8 z?tC7t+sE`r_dO0?f8De7)%rvKU%$t`$6)*K=Z4Q%d|qu% zH#a@bUjFm9hjQ=wegfTj*in0|+T-dxY~6hU=nLoqEPt$(ybanE{$H$`{?VbbgzUjXA zcJ|`*IC@-czCIdypKspoZ1e2%{pX$gzNY#9y7qf$$8YXC^nLe_zx;jg(QR4q&-@uW zbKkt(Mfo6*1K9{M%=r;j)NRSmyX{nvcoV@MD1Z{$aQhEJQ_Tgs38?51M) zCGsOb!_%^ROZkzX-Bb*}M1Jl#KYwn2U;hq|;YoQrZ`u8B)NQ}de$#as1l2$M=Oy^> z5|AJH*-gdpOXNp>hNorsmhvM%yQvs{iTudV@U-mSQhx3>Kj)k0Uv@p1;@IuJOAtT+ zf%y{Xeot%F9_#kF`aP|teJ&Dj2q1s}0yiV@|K~>vJfA`PH;T7@E`%Gey}{qE4yDl6 z(EfdG;AdWwt{wijQ$GJ;1oU72`EUN!$bk7jY^o2xmHBV}*Kog^(fl87_OM&>pa1-K z{#PRd=Krv%KKxeZzxiLoedmA9f6f2llYQ7NZ}R#CLteum^EQ32k1*`BbSnh<37l;< z4_|%L{?6G&ZR?M-{Yo#*A%+_zfQl(`AqwF_4yxueV9-`54`rw&ffYj z|NW|_T*`m`@64c^&a5$SZ~mEoDU+^$Q}fUKGyjJF%~Lun^WXgMAJr+Bn*Zj1`b@jY z`LX$D{-sR1{!Pt4^KZ%XuX}y*o4?-bZC;~w*qZir&Ohik)ujj^fB*srAaIC4_dF5r zx5wx0arHbAUwznq;0*x;5I_I{1WFS4>y!2UyL^uLjQj3Br>UCJ{vLh%oGn%U=4)u3 zkJk7NWz}~({9;bvhhLvpQ(Y#1@;6o1`tC>mmmmmmO#d@-q5rYxG0o`7lzZyG{%=R@tlu&JGv)&S`9Evzx5e?F z|I2n&|Mh?D40!xscBb@S|F@@Dvwp|<-`KOi+mHYJpSAYe;`q=1WxJ~X`agCCJpL~` zQ~Iy}+f%GrzvKLG?AhP#$AA9MTKjEr{OA9&UDbd6A3Fmc|CgO9{n!8PDb}ptasD^< z?Cc9SvodJ*k%g&Vk>;Lu?Yu4{L{~LSucl+_5|FhP9TO9xS zzie0aU;oF>fXDx3XG;I|e|w5G>vx?0jXnFj{rJ!SS!=&7j{p2$wyXND|6^ys!JI?>cp8ef^{OA9ywci%UfBrAq)y4OJbvXkbt^Ge5gVlDxdItdn5I_I{ z1Q3`Rf%DDt)%oVx+HoC&=c}2uY}9ft`+j(KM-*;mTk)U&%l2FU^?zRmJpL~`ANsHVGdpP;u^i`r`(}T4 z9sl`1qHr_YivRpyw%_`%|NAoF@qgL*(0~1(*-6`o_-A5plOZN-27 zFWc{B_kU*NNI3`~fB*srAbvfBzzY00IagfB*srAb?g zNxxmW#jOe%U}_G53cXjO8I_ZMyK;+L6*9oo90C=3uSPQ}C;fKi7Pl&7fT=kID)e5B zW>il4?aD1~RmcESa|l%Ey&BD^ob=n3TimLU0jA~gno&9Fw=1`}RUrdR%^^^s z_i8kwa?)>CZgHzZ2AG;dphEA}Xh!9v->%%^R)q{OHHScj-mB4!%1OUnxy7vt8DMG- zfeO7>qZyTxe!FsuTNN_E)Eoj8dap(^DkuGRC%`t8asZdJ$t zQ*#JZ=)D@vsGRiMm0R4ZkO8LV5U9|5HJVX5>9;GlxK$woOwA!sq4#PuqjJ)3S8j2u zLI#+cL!d(M)o4cLq~EUG;#P$WFg1rjh2E>tjLJ#BUAe`r3K?K(4uJ~2SECt~lYYB$ zi(3^kz|?gNxxmW#jOe%U}_G53cXjO8I_ZMyK;+L6*9oo90C=3uSPQ}C;fKi7Pl&7 zfT=kID)e5BW>il4?aD1~RmcESa|l%Ey&BD^ob=n3TimLU0jA~gno&9Fw=1`} zRUrdRMF0T=5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q56+aK1UcaA0uT4DhHnf!p@oIy0loK<)Iap2s|nWPm}n2}F8tt=UmK{i^3Mha(wa zP;CN{-dk&S)K0(ZIn3cm1{hSEK&1E9njN*%uX+x1IFbPd)g}<>y|rdX?ewdj!yJxe zfI+nhM0#(n*-<6=BN<>&Z32`x;JN>HX zFoz=N(8eNCp^Gn?R)Z)|wr))316Cb2yR#2Gu4I>AkgPNA2{h zp2HlDWPm}n2}F8tt=UmK{i^3Mha(waP;CN{-dk&S)K0(ZIn3cm1{hSEK&1E9njN*% zuX+x1IFbPd)g}<>y|rdX?ewdj!yJxefI+nhM0#(n*-<6=BN<>&Z32`x;JN>HXFoz=N(8eNCp^Gn?R)Z z)|wr))316Cb2yR#2Gu4I>AkgPNA2{hp2HlDWPm}n2}F8tt=UmK{i^3Mha(waP;CN{ z-dk&S)K0(ZIn3cm1{hSEK&1E9njN*%uX+x1IFbPd)g}<>y|rdX?ewdj!yJxefI+nh zM0#(n*-<6=BN<>&Z32`x;JN>HXFoz=< zU{GxWk=|QtcGOP4>N(8eNCp^Gn?R)Z)|wr))316Cb2yR#2Gu4I>AkgPNA2{hp2HlD zWPm}n2}F8tt=UmK{i^3Mha(wa5CRAwfB*srAbA(@)=>|MRo)@#BI=M?Zf2<2%FO|22Ms@ooBi_YOW9{`>Dc!@co*Tzb6n?)o?k zhvVm+dpmu6{NVJ-!}INqC&!1UUp#uc)p2rs5cPYrdU5#n)yt$V~J-F`iX7%mi=9=%H zzgay$YIz>~(44og&Yr%%-sbz(m(PdTnXcpK^83)6&S%r-tn=wU>|i_&$7A|BaC$qM zz5u-BZM;`{c6tAQ|6byn?|z80FkpO<+|YsUIljjvbFpIvq@d!3KHU7fA2`n>URpI`phVeGQU;E#XN zU#=SUAN}XDUUHp}ZPS0Q;&UG#pT18q-5@*|kNYGm6f@9_`%N{7p>RugP&Gb=H}t26Mh~) zT%9iPXywPen@!;D_beqm>%jl*$bkQC z)?duxKmTus`%@3+|ApCY@A04i{CEF%I~dUa+q(Y6Ed5{qza8$o|8xJV|6g?Ww)gaZ z{a^og|9?9e(Er=I{>3c)zj*(jez#fD?{U8Ab-p~g>NlxgaPK_{ObMK?R(G%aJH~(N z$Gv^|{L}2JO}{67o7V>2=-ltlzVYwRO+fwef1^$}{ym}}_Q-$zFSq>-`k(%%|K05C z<(u=@|Mh?UKQ#f*f1dxE`|mdQ>id|h|Lgy$-EVOJ@B4qg|GAG|y^l5ZfBj$oPffu6 zzx#jp|8>9rmD)@!w%7!w-xD#tc;MN1#P5mt=Cko+%eV3MV$W{JYXz_In$JuAMr&(~ z@@q|MexCg1b7{RQzt*JY=gDtAm)5KDYfWl?p8V!>X}v1H)}-d=$!|WF)~oVsO=^Cg z{N{6My(+)fq~_X}v1H)}-d=$!|WF)~oVsO=^Cg{N{6My(+)fq~_*Q@8xy7_s^AO7~iRqLAg!(S^a`09{%vR z53X9*#2@}zS=q-t{NZmOT(z!=Km4__vX6QA!{0u*YF!h5_-kclAM@~szkP7kx+ebc z*UHL1=HU;2`{1f|P5kx1-)^t|^=Ju5V4n$0f9L0D`UH0_{?5Wptf9G4frUl&pEv@%Y`{6(T zoAljz694&M+cou9|D`eD`M)-k>aYGg-`X`T;QnuEy?@#d|M}mf@6MC>&;Q!4slWO! zjRDX9wV70Z_22o{u4w`He@pBA(|-8R|0aERp2UCt*LF?))qiOWc>b@=r24D>&bM|= z3%LJVTJN9s!+-ua>AUkJ{`0@KYwEB5OJl(Ee{Ck!U;TH!wQE|y{om4h|Fj?e^S?>o zohR|1|FvCHfAwD)1D^kDGpYXSzw@nK(*o}Qme%{H{qUdvP5SOUiU0hs?V9?l|I!%n z{9l_%^;iF$Z|#~EaR0Zo-aqY!|NL*#cjrl8J$`s{`uO3>v78LPdh+P^I~Udh5|Drd zBp?9^NI(J-kbnd>5_t3K#mVdMo`3I1&fwKQy7(II_3HVvH>KMJm6xDgKAA*(3k?zoyzE zPxznheXPfS{x4GbwN3Fqe9a#D&;K>m7J0(|Z0}<|{_}s4%CBvT|KV%)$bbH?skX=y z{%3n1>+zrei&TDXQ~VEKvq%2(e@(STp71~0`&f_v{9mN>m|C(xxJmG(~ z_pu)T`M*fz*EYrf@HKnnKmXTMTjUAa080&^;7cyikj<YBP!B~$4{@1HH&(%B_ z;6E0E1!FxH_+PK)JXiBzfd5zs7L4^+;D5cE^IXk?0sdnlSTNROf&cYt&T};n2KbMK zV8K|A1^(BoInUKR7~nq^f(2te7WiMU<~&#PV1WNv2o{X>Sm1xXn)6)Eg8}|yAy_ch zV}bwmYR+>t4+i*;gz1Jr?+1ujV{g^I(AgSO^x3^;qD4 zy_)k}&4U5{VYBP!B~$4{@1HH&(%B_ z;6E0E1!FxH_+PK)JXiBzfd5zs7L4^+;D5cE^IXk?0sdnlSTNROf&cYt&T};n2KbMK zV8K|A1^(BoInUKR7~nq^f(2te7WiMU<~&#PV1WNv2o{X>Sm1xXn)6)Eg8}|yAy_ch zV}bwmYR+>t4+i*;gz1Jr?+1ujV{g^I(AgSO^x3^;qD4 zy_)k}&4U5{VYBP!B~$4{@1HH&(%B_ z;6E0E1!FxH_+PK)JXiBzfd5zs7L4^+;D5cE^IXk?0sdnlSTNROf&cYt&T};n2KbMK zV8K|A1^(BoInUKR7~nq^f(2te7WiMU<~&#PV1WNv2o{X>Sm1xXn)6)Eg8}|yAy_ch zV}bwmYR+>t4+i*;gz1Jr?+1ujV{g^I(AgSO^x3^;qD4 zy_)k}&4U5{VYBP!B~$4{@1HH&(%B_ z;6E0E1!FxH_+PK)JXiBzfd5zs7L4^+;D5cE^IXk?0sdnlSTNROf&cYt&T};n2KbMK zV8K|A1^(BoInUKR7~nq^f(2te7WiMU<~&#PV1WNv2o{X>Sm1xXn)6)Eg8}|yAy_ch zV}bwmYR+>t4+i*;gz1Jr?+1ujV{g^I(AgSO^x3^;o!t z{(pILa`*Jfqpuw@z`zv@+(Q2cZxWDz1SB8<2}nQ!5|DrdBp?9^NI(J-kbndvAOQ(T zKmrnwfCMBU0SQPz0uqpb1SB8<2}nQ!5|DrdBp?9^EIxtr)#~osS1+GBWY7x(6SIpK ztCJ1>XZ7vDo7LI5Lk7Jta6U5IiC&A}CjWWgi}$fl{^zw7{_{V)>Sg3V|9fH8KJ)u4 z|M}0We6M=Rl>hwig;o2^?^FEeKdLpYD^S>8X?K8hm@t^;^%J-_5O!?3MURbry z{658h{_`r|t6nnYKmU7S)jsq46#x0pt9-9|$&~;6?}b(S%V zR_!ytPw}7syvp~gmrVK3|6W+N&-^~cfBy3-->Y6SVbwnK`xO8A&#Qc|ddZak z{O^TT`^@iC{O3Qf^1bRMQ~vY67gp^vzfbX>|Gdigs+Uap&;MRnwa@%M#ee?uD&MPK zGUY%2dtuc+^ZOM4`Om9-uX@Rp|NQTTRr}2EQ~c*YukyX>B~$+MzZX{RGrv#qpZ~nd z_o|mn`Op7eShdgmKE;3j^D5t~UNYrB|9fH8KJ)t&|M}0We6M=Rl>hwig;o2^?^FEe zKdLpYD^S>8X?K8hm@t^;^%J-_5O!?3MURbry{658h{_`r|t6nnYKmU7S)jsq4 z6#x0pt9-9|$&~;6?}b(S%VR_!ytPw}7syvp~gmrVK3|6W+N z&-^~cfBy3-->Y6SVbwnK`xO8A&#Qc|ddZak{O^TT`^@iC{O3Qf^1bRMQ~vY6 z7gp^vzfbX>|Gdigs+Uap&;MRnwa@%M#ee?uD&MPKGUY%2dtuc+^ZOM4`Om9-uX@Rp z|NQTTRr}2EQ~c*YukyX>B~$+MzZX{RGrv#qpZ~nd_o|mn`Op7eShdgmKE;3j^D5t~ zUNYrB|9fH8KJ)t&|M}0We6M=Rl>hwig;o2^?^FEeKdLpYD^S>8X?K8hm@t^;^ z%J-_5O!?3MURbry{658h{_`r|t6nnYKmU7S)jsq46#x0pt9-9|$&~;6?}b(S%VR_!ytPw}7syvp~gmrVK3|6W+N&-^~cfBy3-->Y6SVbwnK z`xO8A&#Qc|ddZak{O^TT`^@iC{O3Qf^1bRMQ~vY67gp^vzfbX>|Gdigs+Uap&;MRn zwa@%M#ee?uD&MPKGUY%2dtuc+^ZOM4`Om9-uX@Rp|NQTTRr}2EQ~c*YukyX>B~$+M zzZX{RGrv#qpZ~nd_o|mn`Op7eShdgmKE;3j^D5t~UNYrB|9fH8KJ)t&|M}0We6M=R zl>hwig;o2^?^FEeKdLpYD^S>8X?K8hm@t^;^%J-_5O!?3MURbry{658h{_`r| zt6nnYKmU7S)jsq46#x0pt9-9|$&~;6?}b(S%VR_!ytPw}7s zyvp~gmrVK3|6W+N&-^~cfBy3-->Y6SVbwnK`xO8A&#Qc|ddZak{O^TT`^@iC z{O3Qf^1bRMQ~vY67gp^vzfbX>|Gdigs+UappXa}oBp?9^NI(J-kbndvAOQ(TKmrnw dfCMBU0SQPz0uqpb1SB8<2}nQ!64+k?{{uXtTbcj> diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 1c866c995..7eeb71af7 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -607,6 +607,7 @@ ProcessingResult QtQuickAdapter::processBlockchain(const Envelope &env) ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) { SignerMessage msg; + if (!msg.ParseFromString(env.message)) { logger_->error("[QtGuiAdapter::processSigner] failed to parse msg #{}" , env.foreignId()); @@ -629,6 +630,7 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) case SignerMessage::kWalletDeleted: return processWalletDeleted(msg.wallet_deleted()); case SignerMessage::kCreatedWallet: + createdWallet_ = true; walletBalances_->clear(); addrModel_->reset(msg.created_wallet().wallet_id()); logger_->debug("[{}] wallet {} created: {}", __func__ //TODO: show something in the GUI if needed @@ -688,15 +690,21 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) emit walletsLoaded(msg.ready()); logger_->debug("[{}] loaded {} wallet[s]", __func__, msg.ready()); { - if (settingsController_->hasParam(ApplicationSettings::Setting::SelectedWallet)) { - const int lastIdx = settingsController_->getParam(ApplicationSettings::Setting::SelectedWallet).toInt(); - if ((lastIdx >= 0) && (lastIdx < nWalletsLoaded_)) { - walletSelected(lastIdx); - } - else if (nWalletsLoaded_ > 0) { - walletSelected(0); + if (!createdWallet_) { + if (settingsController_->hasParam(ApplicationSettings::Setting::SelectedWallet)) { + const int lastIdx = settingsController_->getParam(ApplicationSettings::Setting::SelectedWallet).toInt(); + if ((lastIdx >= 0) && (lastIdx < nWalletsLoaded_)) { + walletSelected(lastIdx); + } + else if (nWalletsLoaded_ > 0) { + walletSelected(0); + } } } + else { + createdWallet_ = false; + emit requestWalletSelection(nWalletsLoaded_ - 1); + } } break; @@ -1028,6 +1036,7 @@ std::string QtQuickAdapter::generateWalletName() const void QtQuickAdapter::walletSelected(int index) { if (index < 0 || index >= walletBalances_->wallets().size()) { + addrModel_->reset(""); return; } logger_->debug("[{}] {}", __func__, index); @@ -1798,10 +1807,13 @@ ProcessingResult QtQuickAdapter::processWalletsList(const WalletsMessage_Wallets bs::message::ProcessingResult QtQuickAdapter::processWalletDeleted(const std::string& walletId) { if (walletId.empty()) { + emit failedDeleteWallet(); return bs::message::ProcessingResult::Ignored; } logger_->debug("[{}] {}", __func__, walletId); + walletBalances_->deleteWallet(walletId); + emit successDeleteWallet(); return bs::message::ProcessingResult::Success; } @@ -2269,7 +2281,21 @@ int QtQuickAdapter::changePassword(const QString& walletId, const QString& oldPa return (msgId == 0) ? -1 : 0; } -bool QtQuickAdapter::isValidPassword(const QString& password) +bool QtQuickAdapter::isWalletPasswordValid(const QString& walletId, const QString& Password) +{ + if (Password.isEmpty()) { + return false; + } + + return true; +} + +bool QtQuickAdapter::isWalletNameExist(const QString& walletName) +{ + return walletBalances_->nameExist(walletName.toStdString()); +} + +bool QtQuickAdapter::verifyPasswordIntegrity(const QString& password) { return password.length() >= kMinPasswordLength; } @@ -2301,6 +2327,7 @@ int QtQuickAdapter::deleteWallet(const QString& walletId, const QString& passwor msgReq->set_wallet_id(walletId.toStdString()); msgReq->set_password(password.toStdString()); const auto msgId = pushRequest(user_, userSigner_, msg.SerializeAsString()); + return (msgId == 0) ? -1 : 0; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index e0d822792..69d39c04c 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -180,7 +180,9 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void startAddressSearch(const QString&); Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); Q_INVOKABLE int changePassword(const QString& walletId, const QString& oldPassword, const QString& newPassword); - Q_INVOKABLE bool isValidPassword(const QString& password); + Q_INVOKABLE bool isWalletNameExist(const QString& walletName); + Q_INVOKABLE bool isWalletPasswordValid(const QString& walletId, const QString& Password); + Q_INVOKABLE bool verifyPasswordIntegrity(const QString& password); Q_INVOKABLE int exportWallet(const QString& walletId, const QString & exportDir); Q_INVOKABLE int viewWalletSeedAuth(const QString& walletId, const QString& password); Q_INVOKABLE int deleteWallet(const QString& walletId, const QString& password); @@ -207,6 +209,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void successExport(QString nameExport); void requestWalletSelection(quint32 index); void successChangePassword(); + void failedDeleteWallet(); + void successDeleteWallet(); private slots: void onArmoryServerChanged(const QModelIndex&, const QVariant&); @@ -287,6 +291,7 @@ private slots: int signerState_{ -1 }; std::string signerDetails_; bool walletsReady_{ false }; + bool createdWallet_{ false }; std::unordered_map hdWallets_; std::unordered_map walletNames_; diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index a468d0d8c..1e7eee30d 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -209,3 +209,14 @@ QString WalletBalancesModel::numberAddresses() const } return tr("-"); } + +bool WalletBalancesModel::nameExist(const std::string& walletName) +{ + for (int i = 0; i < wallets_.size(); ++i) { + const auto& w = wallets_.at(i); + if (w.walletName == walletName) { + return true; + } + } + return false; +} diff --git a/GUI/QtQuick/WalletBalancesModel.h b/GUI/QtQuick/WalletBalancesModel.h index 81439530d..174a90c5a 100644 --- a/GUI/QtQuick/WalletBalancesModel.h +++ b/GUI/QtQuick/WalletBalancesModel.h @@ -75,6 +75,7 @@ class WalletBalancesModel : public QAbstractTableModel QString unconfirmedBalance() const; QString totalBalance() const; QString numberAddresses() const; + bool nameExist(const std::string& walletName); signals: void changed(); diff --git a/GUI/QtQuick/images/edit_wallet_name.ico b/GUI/QtQuick/images/edit_wallet_name.ico new file mode 100644 index 0000000000000000000000000000000000000000..5fc6fe78706d183d8270b39b4cca1a6b26c692d1 GIT binary patch literal 1150 zcmb`Gu}T9$6h*I5M1n{v5e*VVFopk+*3N&B6n=nM#!f^;41%TpgNUf4un^hO!b(IC z1iKU#f)HHKjk~buOk&{+Co{ac@6MYURvO_~sfhoY*2ko2Np&Da<~z?2j5JN};Tkq! z8G^c45`708kI;iB*oShgrkF>!k=2NC2G+n{?rE~94b9Qi!BO=(;|k1!J#JtsRF~&i zca62pjCaOu$USbE5A)bV<9n>a88~*}Paf#Xa0Pb|^GI0plLmve|L~Z==K==xaS&`E zOHyl(^N7bR`5GL+miG#C-n}c&nDkj0&RGPSLqAyjscti literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/terminal.ico b/GUI/QtQuick/images/terminal.ico index 99ce048b30e5bfd417f80a843ea82b12a48050cd..511034bb59228c863685df06785fce7ff1e73bb7 100644 GIT binary patch literal 399142 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 diff --git a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml index b8e723572..bccdaaad9 100644 --- a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml @@ -10,6 +10,7 @@ ColumnLayout { id: layout + property string wallet_name signal sig_confirm() height: 485 @@ -108,7 +109,7 @@ ColumnLayout { if(password.input_text === confirm_password.input_text) { - bsApp.createWallet("", phrase, password.input_text) + bsApp.createWallet(layout.wallet_name, phrase, password.input_text) layout.sig_confirm() clear() } @@ -144,7 +145,7 @@ ColumnLayout { function checkPasswordLength() { - if (!bsApp.isValidPassword(password.input_text)) { + if (!bsApp.verifyPasswordIntegrity(password.input_text)) { error_dialog.show() error_dialog.raise() error_dialog.requestActivate() diff --git a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml index 26ea7a5e3..80b25b2ac 100644 --- a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml @@ -59,8 +59,8 @@ CustomPopup { visible: false phrase: root.phrase onSig_verified: { - _stack_view.push(confirm_password) - confirm_password.init() + _stack_view.push(wallet_name) + wallet_name.init() } onSig_skipped: { _stack_view.push(wallet_seed_accept) @@ -72,14 +72,24 @@ CustomPopup { id: wallet_seed_accept visible: false onSig_skip: { - _stack_view.replace(confirm_password) - confirm_password.init() + _stack_view.replace(wallet_name) + wallet_name.init() } onSig_not_skip: { _stack_view.pop() } } + WalletName { + id: wallet_name + visible: false + onSig_confirm: { + _stack_view.push(confirm_password) + confirm_password.wallet_name = wallet_name.wallet_name + confirm_password.init() + } + } + ConfirmPassword { id: confirm_password visible: false @@ -120,8 +130,8 @@ CustomPopup { id: import_wallet visible: false onSig_import: { - _stack_view.push(confirm_password) - confirm_password.init() + _stack_view.push(wallet_name) + wallet_name.init() root.phrase = import_wallet.phrase } onSig_only_watching: { diff --git a/GUI/QtQuick/qml/CreateWallet/WalletName.qml b/GUI/QtQuick/qml/CreateWallet/WalletName.qml new file mode 100644 index 000000000..7399948ae --- /dev/null +++ b/GUI/QtQuick/qml/CreateWallet/WalletName.qml @@ -0,0 +1,103 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +ColumnLayout { + + id: layout + + property alias wallet_name: input.input_text + + signal sig_confirm() + + height: 485 + width: 580 + + spacing: 0 + + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Name your wallet") + } + + CustomMessageDialog { + id: error_dialog + error: qsTr("Wallet name already exist") + visible: false + } + + CustomTextInput { + id: input + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + activeFocusOnTab: true + hide_placeholder_when_activefocus: false + + title_text: qsTr("Wallet Name") + placeholder_text: qsTr("Primary wallet") + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + CustomButton { + id: confirm_but + text: qsTr("Confirm") + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + width: 530 + enabled: (input.input_text !== "") + preferred: true + + function click_enter() { + if (!confirm_but.enabled) return + + if (bsApp.isWalletNameExist(input.input_text)) { + error_dialog.show() + error_dialog.raise() + error_dialog.requestActivate() + init() + } + else { + layout.sig_confirm() + } + } + } + + Keys.onEnterPressed: { + confirm_but.click_enter() + } + + Keys.onReturnPressed: { + confirm_but.click_enter() + } + + function init() + { + clear() + input.setActiveFocus() + } + + function clear() + { + input.input_text = "" + } +} diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index 43de41476..9d566561d 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -17,6 +17,8 @@ Rectangle { //aliases - title property alias title_text: title.text + property string placeholder_text + property bool hide_placeholder_when_activefocus: true property alias title_leftMargin: title.anchors.leftMargin property alias title_topMargin: title.anchors.topMargin property alias title_font_size: title.font.pixelSize @@ -88,6 +90,16 @@ Rectangle { color: "#E2E7FF" + Text { + text: rect.placeholder_text + color: "#7A88B0" + visible: !input.text && (!hide_placeholder_when_activefocus || !input.activeFocus) + + font.pixelSize: 16 + font.family: "Roboto" + font.weight: Font.Normal + } + onTextEdited : { rect.textEdited() } diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml index dec611285..b17050367 100644 --- a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -171,7 +171,7 @@ ColumnLayout { function checkPasswordLength() { - if (!bsApp.isValidPassword(new_password.input_text)) { + if (!bsApp.verifyPasswordIntegrity(new_password.input_text)) { error_dialog.show() error_dialog.raise() error_dialog.requestActivate() diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml index 5773bdd26..e5e3d8bfb 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml @@ -16,10 +16,30 @@ ColumnLayout { signal back() signal walletDeleted() + signal sig_success() property var wallet_properties_vm property bool is_password_requried: !(wallet_properties_vm.isHardware || wallet_properties_vm.isWatchingOnly) + Connections + { + target:bsApp + function onSuccessDeleteWallet () + { + layout.sig_success() + } + function onFailedDeleteWallet() + { + showError(qsTr("Failed to delete")) + } + } + + CustomMessageDialog { + id: error_dialog + error: qsTr("Password is incorrect") + visible: false + } + CustomTitleLabel { id: title Layout.alignment: Qt.AlignCenter @@ -77,16 +97,23 @@ ColumnLayout { width: 260 - function click_enter() { + if (!bsApp.isWalletPasswordValid(wallet_properties_vm.walletId, password.input_text)){ + showError(qsTr("Password is incorrect")) + init() + + return + } + const result = bsApp.deleteWallet( wallet_properties_vm.walletId, password.input_text ) - if (result === 0) { - walletDeleted() - clear() + if (result === -1) { + showError(qsTr("Failed to delete")) + + init() } } } @@ -103,4 +130,12 @@ ColumnLayout { password.isValid = true password.input_text = "" } + + function showError(msg) + { + error_dialog.error = msg + error_dialog.show() + error_dialog.raise() + error_dialog.requestActivate() + } } diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 9bca242df..a6c5cb690 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -77,9 +77,12 @@ CustomPopup { wallet_properties_vm: root.wallet_properties_vm onWalletDeleted: { - _stack_view.pop() - _stack_view.pop() - root.close() + _stack_view.push(success) + success.details_text = qsTr("Wallet %1 has successfully been deleted").arg(wallet_properties_vm.walletName) + } + onSig_success: { + _stack_view.push(success) + success.details_text = qsTr("Wallet has successfully been deleted") } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 7cade9dc7..7441fdce0 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -299,7 +299,7 @@ ApplicationWindow { } onCurWalletIndexChanged: (ind) => { - overviewWalletIndex = ind + //overviewWalletIndex = ind } onOpenSend: (txId, isRBF, isCPFP) => { diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index d96a3eb47..2d0669d7b 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -74,6 +74,7 @@ images/copy_icon.svg qml/Receive/qmldir qml/Receive/ReceivePopup.qml + qml/CreateWallet/WalletName.qml qml/CreateWallet/ConfirmPassword.qml qml/CreateWallet/CreateWallet.qml qml/CreateWallet/ImportHardware.qml @@ -175,6 +176,7 @@ qml/WalletProperties/WalletSeed.qml qml/WalletProperties/WalletSeedAuth.qml images/wallet_icon_warn.svg + images/edit_wallet_name.ico qml/StyledControls/CustomHorizontalHeaderView.qml qml/StyledControls/CustomRbfCpfpMenu.qml qml/StyledControls/CustomSuccessWidget.qml From 955faeffc6a32e47a6f8c4cb0921f9b196006582 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Mon, 27 Mar 2023 12:59:58 +0300 Subject: [PATCH 292/436] [QT-51] csv file name --- GUI/QtQuick/QtQuickAdapter.cpp | 2 + .../CustomExportSuccessDialog.qml | 130 ++++++++++++++++++ GUI/QtQuick/qml/TransactionsPage.qml | 37 ++++- GUI/QtQuick/qtquick.qrc | 1 + 4 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 GUI/QtQuick/qml/StyledControls/CustomExportSuccessDialog.qml diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 7eeb71af7..4d42f2447 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1037,6 +1037,8 @@ void QtQuickAdapter::walletSelected(int index) { if (index < 0 || index >= walletBalances_->wallets().size()) { addrModel_->reset(""); + txModel_->clear(); + return; } logger_->debug("[{}] {}", __func__, index); diff --git a/GUI/QtQuick/qml/StyledControls/CustomExportSuccessDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomExportSuccessDialog.qml new file mode 100644 index 000000000..53b8fabb6 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomExportSuccessDialog.qml @@ -0,0 +1,130 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" + +Window { + id: root + + property alias header: title.text + property alias export_type: export_type.text + property alias path_name: file_path.text + + visible: true + flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog + modality: Qt.WindowModal + + height: 400 + width: 580 + + color: "transparent" + + x: mainWindow.x + (mainWindow.width - width)/2 + y: mainWindow.y + (mainWindow.height - height)/2 + + Rectangle { + id: rect + + color: "#191E2A" + opacity: 1 + radius: 16 + + anchors.fill: parent + + border.color : BSStyle.defaultBorderColor + border.width : 1 + + ColumnLayout { + id: layout + + anchors.fill: parent + + CustomTitleLabel { + id: title + Layout.topMargin: 36 + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Success") + } + + + Image { + id: wallet_icon + + Layout.topMargin: 5 + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : 120 + Layout.preferredWidth : 120 + + source: "qrc:/images/success.png" + width: 120 + height: 120 + } + + Label { + + id: export_type + + Layout.leftMargin: 24 + Layout.rightMargin: 24 + Layout.topMargin: 8 + Layout.preferredHeight: 16 + Layout.fillWidth: true + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + + text: qsTr("Export file:") + color: BSStyle.wildBlueColor + } + + Label { + + id: file_path + + Layout.leftMargin: 24 + Layout.rightMargin: 24 + Layout.topMargin: 4 + Layout.preferredHeight: 16 + Layout.fillWidth: true + Layout.alignment: Qt.AlignHCenter | Qt.AlingTop + + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + + text: "/home" + color: BSStyle.titanWhiteColor + } + + CustomButton { + id: finish_but + + width: 532 + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + text: qsTr("Finish") + + preferred: true + + function click_enter() { + root.close() + } + } + + Keys.onEnterPressed: { + finish_but.click_enter() + } + + Keys.onReturnPressed: { + finish_but.click_enter() + } + } + } +} diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 70ae1dbdc..47a244e62 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -31,7 +31,7 @@ Item { id: fileDialogCSV visible: false title: qsTr("Choose CSV file name") - folder: shortcuts.home + folder: shortcuts.documents defaultSuffix: "csv" selectExisting: false onAccepted: { @@ -45,6 +45,17 @@ Item { } } + CustomFailDialog { + id: fail_dialog + visible: false; + } + + CustomExportSuccessDialog{ + id: succes_dialog + header: "Success" + visible: false + } + Column { spacing: 18 anchors.fill: parent @@ -169,8 +180,21 @@ Item { // .arg(txWalletsComboBox.currentIndex === 0 ? "all" : txWalletsComboBox.currentText) // .arg(txListModel.getBegDate()) // .arg(txListModel.getEndDate()) - - fileDialogCSV.visible = true + var csvFile = "%1/BlockSettle_%2_%3_%4.csv" + .arg(fileDialogCSV.folder) + .arg(txWalletsComboBox.currentIndex === 0 ? "all" : txWalletsComboBox.currentText) + .arg(txListModel.getBegDate()) + .arg(txListModel.getEndDate()) + + if (txListModel.exportCSVto(csvFile)) { + succes_dialog.path_name = csvFile.substring(("file:///").length, csvFile.length) + show_popup(succes_dialog) + } + else { + fail_dialog.header = "Export CSV Error" + fail_dialog.fail = "Failed to export CSV File" + show_popup(fail_dialog) + } } anchors.verticalCenter: parent.verticalCenter } @@ -185,5 +209,12 @@ Item { onOpenSend: (txId, isRBF, isCPFP) => control.openSend(txId, isRBF, isCPFP) } + + function show_popup (id) + { + id.show() + id.raise() + id.requestActivate() + } } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 2d0669d7b..00d2315bd 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -94,6 +94,7 @@ qml/StyledControls/CustomTextEdit.qml qml/StyledControls/CustomTitleDialogWindow.qml qml/StyledControls/CustomTitleDialogWindowWithExpander.qml + qml/StyledControls/CustomExportSuccessDialog.qml qml/Send/qmldir qml/Send/SendPopup.qml qml/Send/SimpleDetails.qml From 054c09c0fde532fa80d75ed84bedde9899e8e497 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 27 Mar 2023 13:10:20 +0300 Subject: [PATCH 293/436] show error on failed import --- GUI/QtQuick/QtQuickAdapter.cpp | 4 ++++ common | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 1c866c995..6dbfaa7ea 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -629,6 +629,10 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) case SignerMessage::kWalletDeleted: return processWalletDeleted(msg.wallet_deleted()); case SignerMessage::kCreatedWallet: + if (!msg.created_wallet().error_msg().empty() && msg.created_wallet().wallet_id().empty()) { + emit showError(QString::fromStdString(msg.created_wallet().error_msg())); + break; + } walletBalances_->clear(); addrModel_->reset(msg.created_wallet().wallet_id()); logger_->debug("[{}] wallet {} created: {}", __func__ //TODO: show something in the GUI if needed diff --git a/common b/common index 8af5fb50c..24634f082 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 8af5fb50ce00ee569a8e0f79e567fee8033457bc +Subproject commit 24634f0822460bf142380e0e1ae7b336a1975b84 From 693a1092da36469ac2b3f3683b7524040284e25d Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Mon, 27 Mar 2023 18:59:35 +0300 Subject: [PATCH 294/436] fixed add wallet --- GUI/QtQuick/QtQuickAdapter.cpp | 25 ++++++++++++++++--------- GUI/QtQuick/QtQuickAdapter.h | 2 +- GUI/QtQuick/WalletBalancesModel.cpp | 12 ++++++++++++ GUI/QtQuick/WalletBalancesModel.h | 3 +++ 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 4d42f2447..91c7e9d75 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -186,6 +186,11 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) emit requestWalletSelection(settingsController_->getParam(ApplicationSettings::Setting::SelectedWallet).toInt()); } }); + + connect(walletBalances_, &WalletBalancesModel::walletSelected, this, [this](int index) + { + walletSelected(index); + }); } QtQuickAdapter::~QtQuickAdapter() @@ -477,7 +482,12 @@ ProcessingResult QtQuickAdapter::processSettingsGetResponse(const SettingsMessag } emit settingChanged(); } - QMetaObject::invokeMethod(this, [this] { settingsController_->resetCache(settingsCache_); }); + if (createdWalletId_ == "") { + QMetaObject::invokeMethod(this, [this] { settingsController_->resetCache(settingsCache_); }); + } + else { + createdWalletId_ = ""; + } return ProcessingResult::Success; } @@ -630,9 +640,10 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) case SignerMessage::kWalletDeleted: return processWalletDeleted(msg.wallet_deleted()); case SignerMessage::kCreatedWallet: - createdWallet_ = true; + createdWalletId_ = msg.created_wallet().wallet_id(); walletBalances_->clear(); - addrModel_->reset(msg.created_wallet().wallet_id()); + addrModel_->reset(createdWalletId_); + walletBalances_->setCreateWalletId(createdWalletId_); logger_->debug("[{}] wallet {} created: {}", __func__ //TODO: show something in the GUI if needed , msg.created_wallet().wallet_id(), msg.created_wallet().error_msg()); break; @@ -690,7 +701,7 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) emit walletsLoaded(msg.ready()); logger_->debug("[{}] loaded {} wallet[s]", __func__, msg.ready()); { - if (!createdWallet_) { + if (createdWalletId_.empty()) { if (settingsController_->hasParam(ApplicationSettings::Setting::SelectedWallet)) { const int lastIdx = settingsController_->getParam(ApplicationSettings::Setting::SelectedWallet).toInt(); if ((lastIdx >= 0) && (lastIdx < nWalletsLoaded_)) { @@ -701,10 +712,6 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) } } } - else { - createdWallet_ = false; - emit requestWalletSelection(nWalletsLoaded_ - 1); - } } break; @@ -1038,9 +1045,9 @@ void QtQuickAdapter::walletSelected(int index) if (index < 0 || index >= walletBalances_->wallets().size()) { addrModel_->reset(""); txModel_->clear(); - return; } + logger_->debug("[{}] {}", __func__, index); QMetaObject::invokeMethod(this, [this, index] { try { diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 69d39c04c..07908e858 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -291,7 +291,7 @@ private slots: int signerState_{ -1 }; std::string signerDetails_; bool walletsReady_{ false }; - bool createdWallet_{ false }; + std::string createdWalletId_; std::unordered_map hdWallets_; std::unordered_map walletNames_; diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index 1e7eee30d..0546ed222 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -93,6 +93,13 @@ void WalletBalancesModel::addWallet(const Wallet& wallet) beginInsertRows(QModelIndex(), rowCount(), rowCount()); wallets_.push_back(wallet); endInsertRows(); + + //find index of new created wallet + if (createdWalletId_ != "" && wallet.walletId == createdWalletId_) { + createdWalletId_ = ""; + int findIndex = wallets_.size() - 1; + emit walletSelected(findIndex); + } emit rowCountChanged(); emit changed(); } @@ -220,3 +227,8 @@ bool WalletBalancesModel::nameExist(const std::string& walletName) } return false; } + +void WalletBalancesModel::setCreateWalletId(const std::string& walletId) +{ + createdWalletId_ = walletId; +} diff --git a/GUI/QtQuick/WalletBalancesModel.h b/GUI/QtQuick/WalletBalancesModel.h index 174a90c5a..ced4ff2fb 100644 --- a/GUI/QtQuick/WalletBalancesModel.h +++ b/GUI/QtQuick/WalletBalancesModel.h @@ -76,10 +76,12 @@ class WalletBalancesModel : public QAbstractTableModel QString totalBalance() const; QString numberAddresses() const; bool nameExist(const std::string& walletName); + void setCreateWalletId(const std::string& walletId); signals: void changed(); void rowCountChanged(); + void walletSelected(int index); private: using FieldFunc = std::function; @@ -90,6 +92,7 @@ class WalletBalancesModel : public QAbstractTableModel std::shared_ptr logger_; std::vector wallets_; std::unordered_map balances_; //key: walletId + std::string createdWalletId_; }; #endif // WALLET_BALANCES_MODEL_H From 40a8199d8ccf1735f0f230350852bf86840a1727 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 27 Mar 2023 19:24:06 +0300 Subject: [PATCH 295/436] [QT-78] wallet rename --- Core/SignerAdapter.cpp | 15 ++++++++++++ Core/SignerAdapter.h | 2 ++ GUI/QtQuick/QtQuickAdapter.cpp | 12 ++++++++++ GUI/QtQuick/WalletBalancesModel.cpp | 37 ++++++++++++++++++----------- GUI/QtQuick/WalletBalancesModel.h | 4 +++- common | 2 +- 6 files changed, 56 insertions(+), 16 deletions(-) diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index a1101c00f..6c7022a3d 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -152,6 +152,9 @@ ProcessingResult SignerAdapter::processOwnRequest(const bs::message::Envelope &e return processGetWalletSeed(env, request.get_wallet_seed()); case SignerMessage::kImportWoWallet: return processImportWoWallet(env, request.import_wo_wallet()); + case SignerMessage::kSetWalletName: + return processWalletRename(env, request.set_wallet_name().wallet().wallet_id() + , request.set_wallet_name().new_name()); default: logger_->warn("[{}] unknown signer request: {}", __func__, request.data_case()); break; @@ -827,3 +830,15 @@ bs::message::ProcessingResult SignerAdapter::processImportWoWallet(const bs::mes walletsReady(); return bs::message::ProcessingResult::Success; } + +bs::message::ProcessingResult SignerAdapter::processWalletRename(const bs::message::Envelope& + , const std::string& walletId, const std::string& newName) +{ + const auto& hdWallet = walletsMgr_->getHDWalletById(walletId); + if (!hdWallet) { + logger_->error("[{}] wallet {} not found", __func__, walletId); + return bs::message::ProcessingResult::Error; + } + hdWallet->setName(newName); + return bs::message::ProcessingResult::Success; +} diff --git a/Core/SignerAdapter.h b/Core/SignerAdapter.h index 06827e47e..b0406f50f 100644 --- a/Core/SignerAdapter.h +++ b/Core/SignerAdapter.h @@ -120,6 +120,8 @@ class SignerAdapter : public bs::message::Adapter, public SignerCallbackTarget , const BlockSettle::Common::SignerMessage_WalletRequest&); bs::message::ProcessingResult processImportWoWallet(const bs::message::Envelope& , const std::string& filename); + bs::message::ProcessingResult processWalletRename(const bs::message::Envelope& + , const std::string& walletId, const std::string& newName); private: std::shared_ptr logger_; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 6dbfaa7ea..e63fca3e8 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2258,6 +2258,18 @@ int QtQuickAdapter::rescanWallet(const QString& walletId) int QtQuickAdapter::renameWallet(const QString& walletId, const QString& newName) { logger_->debug("[{}] {} -> {}", __func__, walletId.toStdString(), newName.toStdString()); + const auto& itWallet = hdWallets_.find(walletId.toStdString()); + if (itWallet == hdWallets_.end()) { + showError(tr("Wallet %1 not found").arg(walletId)); + return -1; + } + itWallet->second.name = newName.toStdString(); + SignerMessage msg; + auto msgReq = msg.mutable_set_wallet_name(); + msgReq->mutable_wallet()->set_wallet_id(walletId.toStdString()); + msgReq->set_new_name(newName.toStdString()); + pushRequest(user_, userSigner_, msg.SerializeAsString()); + walletBalances_->rename(walletId.toStdString(), newName.toStdString()); return 0; } diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index a468d0d8c..85df93dfb 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -83,11 +83,10 @@ QHash WalletBalancesModel::roleNames() const void WalletBalancesModel::addWallet(const Wallet& wallet) { - for (int i = 0; i < wallets_.size(); ++i) { - const auto& w = wallets_.at(i); - if (wallet.walletId == w.walletId) { - return; - } + const auto idx = getWalletIndex(wallet.walletId); + if (idx >= 0) { + logger_->warn("[{}] wallet {} already exists (#{})", __func__, wallet.walletId, idx); + return; } //logger_->debug("[WalletBalancesModel::addWallet] adding #{}: {}", rowCount(), wallet.walletName); beginInsertRows(QModelIndex(), rowCount(), rowCount()); @@ -97,7 +96,7 @@ void WalletBalancesModel::addWallet(const Wallet& wallet) emit changed(); } -void WalletBalancesModel::deleteWallet(const std::string& walletId) +int WalletBalancesModel::getWalletIndex(const std::string& walletId) const { int idx = -1; for (int i = 0; i < wallets_.size(); ++i) { @@ -106,6 +105,12 @@ void WalletBalancesModel::deleteWallet(const std::string& walletId) break; } } + return idx; +} + +void WalletBalancesModel::deleteWallet(const std::string& walletId) +{ + const auto idx = getWalletIndex(walletId); if (idx < 0) { logger_->warn("[{}] wallet {} is not in the list", __func__, walletId); return; @@ -119,6 +124,17 @@ void WalletBalancesModel::deleteWallet(const std::string& walletId) }); } +void WalletBalancesModel::rename(const std::string& walletId, const std::string& newName) +{ + const auto idx = getWalletIndex(walletId); + if (idx < 0) { + logger_->warn("[{}] wallet {} is not in the list", __func__, walletId); + return; + } + wallets_.at(idx).walletName = newName; + emit dataChanged(createIndex(idx, 0), createIndex(idx, 0), { WalletBalance::NameRole }); +} + QStringList WalletBalancesModel::wallets() const { QStringList result; @@ -142,14 +158,7 @@ void WalletBalancesModel::clear() void WalletBalancesModel::setWalletBalance(const std::string& walletId, const Balance& bal) { balances_[walletId] = bal; - int row = -1; - for (int i = 0; i < wallets_.size(); ++i) { - const auto& w = wallets_.at(i); - if (w.walletId == walletId) { - row = i; - break; - } - } + const int row = getWalletIndex(walletId); if (row >= 0) { //logger_->debug("[{}] {} {} found at row {}", __func__, txDet.txHash.toHexStr(), txDet.hdWalletId, row); emit dataChanged(createIndex(row, 0), createIndex(row, 0), { WalletBalance::TotalRole diff --git a/GUI/QtQuick/WalletBalancesModel.h b/GUI/QtQuick/WalletBalancesModel.h index 81439530d..7e67e84cd 100644 --- a/GUI/QtQuick/WalletBalancesModel.h +++ b/GUI/QtQuick/WalletBalancesModel.h @@ -60,6 +60,7 @@ class WalletBalancesModel : public QAbstractTableModel }; void addWallet(const Wallet&); void deleteWallet(const std::string& walletId); + void rename(const std::string& walletId, const std::string& newName); struct Balance { double confirmed{ 0 }; @@ -83,9 +84,10 @@ class WalletBalancesModel : public QAbstractTableModel private: using FieldFunc = std::function; QString getBalance(const std::string& walletId, const FieldFunc&) const; + int getWalletIndex(const std::string& walletId) const; private: - int selectedWallet_; + int selectedWallet_{ -1 }; std::shared_ptr logger_; std::vector wallets_; std::unordered_map balances_; //key: walletId diff --git a/common b/common index 24634f082..c8e42bf62 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 24634f0822460bf142380e0e1ae7b336a1975b84 +Subproject commit c8e42bf628e636713cec182bedd0851c772f182a From dba58f7a310c67c7ea346dc1b47688ffde6cc252 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Mon, 27 Mar 2023 21:57:26 +0300 Subject: [PATCH 296/436] fix comments --- GUI/QtQuick/QtQuickAdapter.cpp | 10 +++------- GUI/QtQuick/WalletBalancesModel.cpp | 6 +++--- GUI/QtQuick/WalletBalancesModel.h | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index afdb224e9..38b280211 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -482,11 +482,11 @@ ProcessingResult QtQuickAdapter::processSettingsGetResponse(const SettingsMessag } emit settingChanged(); } - if (createdWalletId_ == "") { + if (createdWalletId_.empty()) { QMetaObject::invokeMethod(this, [this] { settingsController_->resetCache(settingsCache_); }); } else { - createdWalletId_ = ""; + createdWalletId_.clear(); } return ProcessingResult::Success; } @@ -641,13 +641,9 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) return processWalletDeleted(msg.wallet_deleted()); case SignerMessage::kCreatedWallet: createdWalletId_ = msg.created_wallet().wallet_id(); - if (!msg.created_wallet().error_msg().empty() && msg.created_wallet().wallet_id().empty()) { - emit showError(QString::fromStdString(msg.created_wallet().error_msg())); - break; - } walletBalances_->clear(); addrModel_->reset(createdWalletId_); - walletBalances_->setCreateWalletId(createdWalletId_); + walletBalances_->setCreatedWalletId(createdWalletId_); logger_->debug("[{}] wallet {} created: {}", __func__ //TODO: show something in the GUI if needed , msg.created_wallet().wallet_id(), msg.created_wallet().error_msg()); break; diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index 0546ed222..a2f3455e6 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -95,8 +95,8 @@ void WalletBalancesModel::addWallet(const Wallet& wallet) endInsertRows(); //find index of new created wallet - if (createdWalletId_ != "" && wallet.walletId == createdWalletId_) { - createdWalletId_ = ""; + if (!createdWalletId_.empty() && wallet.walletId == createdWalletId_) { + createdWalletId_.clear(); int findIndex = wallets_.size() - 1; emit walletSelected(findIndex); } @@ -228,7 +228,7 @@ bool WalletBalancesModel::nameExist(const std::string& walletName) return false; } -void WalletBalancesModel::setCreateWalletId(const std::string& walletId) +void WalletBalancesModel::setCreatedWalletId(const std::string& walletId) { createdWalletId_ = walletId; } diff --git a/GUI/QtQuick/WalletBalancesModel.h b/GUI/QtQuick/WalletBalancesModel.h index ced4ff2fb..b6eaa926c 100644 --- a/GUI/QtQuick/WalletBalancesModel.h +++ b/GUI/QtQuick/WalletBalancesModel.h @@ -76,7 +76,7 @@ class WalletBalancesModel : public QAbstractTableModel QString totalBalance() const; QString numberAddresses() const; bool nameExist(const std::string& walletName); - void setCreateWalletId(const std::string& walletId); + void setCreatedWalletId(const std::string& walletId); signals: void changed(); From 5b37630fbbc1d0b3b22f1c0013d6899959500d54 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 28 Mar 2023 10:31:37 +0300 Subject: [PATCH 297/436] wallet password validation --- Core/SignerAdapter.cpp | 50 +++++++++++++++++++++++++++++++++++++++++- Core/SignerAdapter.h | 1 + 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 6c7022a3d..07ca16e6a 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -683,6 +683,12 @@ ProcessingResult SignerAdapter::processDeleteWallet(const bs::message::Envelope& , const SignerMessage_WalletRequest& request) { SignerMessage msg; + if (!isPasswordValid(request.wallet_id(), SecureBinaryData::fromString(request.password()))) { + logger_->warn("[{}] {} password check failed", __func__, request.wallet_id()); + msg.set_wallet_deleted(""); + pushBroadcast(user_, msg.SerializeAsString()); + return ProcessingResult::Error; + } const auto& hdWallet = walletsMgr_->getHDWalletById(request.wallet_id()); if (hdWallet && walletsMgr_->deleteWalletFile(hdWallet)) { msg.set_wallet_deleted(request.wallet_id()); @@ -759,6 +765,37 @@ bs::message::ProcessingResult SignerAdapter::processChangeWalletPass(const bs::m return bs::message::ProcessingResult::Success; } +bool SignerAdapter::isPasswordValid(const std::string& walletId + , const SecureBinaryData& password) const +{ + const auto& hdWallet = walletsMgr_->getHDWalletById(walletId); + if (!hdWallet) { + logger_->error("[{}] wallet {} not found", __func__, walletId); + return false; + } + if (hdWallet->isWatchingOnly() || hdWallet->isHardwareWallet()) { + if (password.empty()) { + return true; + } + else { + return false; + } + } + try { + const bs::core::WalletPasswordScoped lock(hdWallet, password); + const auto& seed = hdWallet->getDecryptedSeed(); + logger_->debug("[{}] seed id: {}, walletId: {}, pass size: {}", __func__, seed.getWalletId(), walletId, password.getSize()); + return (seed.getWalletId() == walletId); + } + catch (const Armory::Wallets::WalletException& e) { + logger_->error("[{}] failed to decrypt wallet {}: {}", __func__, walletId, e.what()); + } + catch (const Armory::Wallets::Encryption::DecryptedDataContainerException&) { + logger_->error("[{}] failed to decrypt wallet {}", __func__, walletId); + } + return false; +} + bs::message::ProcessingResult SignerAdapter::processGetWalletSeed(const bs::message::Envelope& env , const SignerMessage_WalletRequest& request) { @@ -771,14 +808,21 @@ bs::message::ProcessingResult SignerAdapter::processGetWalletSeed(const bs::mess pushResponse(user_, env, msg.SerializeAsString()); return ProcessingResult::Error; } + const auto& password = SecureBinaryData::fromString(request.password()); + if (!isPasswordValid(request.wallet_id(), password)) { + logger_->warn("[{}] invalid password supplied", __func__); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Error; + } try { - const bs::core::WalletPasswordScoped lock(hdWallet, SecureBinaryData::fromString(request.password())); + const bs::core::WalletPasswordScoped lock(hdWallet, password); const auto& seed = hdWallet->getDecryptedSeed(); msgResp->set_xpriv(seed.toXpriv().toBinStr()); msgResp->set_seed(seed.seed().toBinStr()); if (seed.hasPrivateKey()) { const auto& privKey = seed.privateKey(); + logger_->debug("[{}] priv key size: {}", __func__, privKey.getSize()); std::vector privData; for (int i = 0; i < (int)privKey.getSize(); ++i) { privData.push_back(privKey.getPtr()[i]); @@ -797,6 +841,10 @@ bs::message::ProcessingResult SignerAdapter::processGetWalletSeed(const bs::mess pushResponse(user_, env, msg.SerializeAsString()); return ProcessingResult::Error; } + catch (const Armory::Wallets::Encryption::DecryptedDataContainerException&) { + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Error; + } pushResponse(user_, env, msg.SerializeAsString()); return bs::message::ProcessingResult::Success; } diff --git a/Core/SignerAdapter.h b/Core/SignerAdapter.h index b0406f50f..8b1b2b447 100644 --- a/Core/SignerAdapter.h +++ b/Core/SignerAdapter.h @@ -77,6 +77,7 @@ class SignerAdapter : public bs::message::Adapter, public SignerCallbackTarget void newWalletPrompt() override; void autoSignStateChanged(bs::error::ErrorCode , const std::string& walletId) override; + bool isPasswordValid(const std::string& walletId, const SecureBinaryData& password) const; bs::message::ProcessingResult processOwnRequest(const bs::message::Envelope & , const BlockSettle::Common::SignerMessage &); From 58a011cde16c134b77632ae783c8ab274cab9220 Mon Sep 17 00:00:00 2001 From: YZ Date: Mon, 27 Mar 2023 23:04:23 +0200 Subject: [PATCH 298/436] Bugfix --- GUI/QtQuick/QtQuickAdapter.cpp | 32 ++++++++++++------- GUI/QtQuick/SettingsController.cpp | 6 ++-- GUI/QtQuick/WalletBalancesModel.cpp | 6 ++-- .../qml/Overview/OverviewWalletBar.qml | 23 +++++++++---- .../Controls/CustomBorderedButton.qml | 1 + .../SideSwap/Controls/CustomButton.qml | 1 + GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 +- .../qml/StyledControls/CustomButton.qml | 1 + .../qml/StyledControls/CustomComboBox.qml | 1 + .../qml/StyledControls/CustomMediumButton.qml | 1 + .../qml/StyledControls/CustomSmallButton.qml | 1 + .../WalletPropertiesPopup.qml | 4 +-- GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 4 +-- GUI/QtQuick/viewmodels/WalletPropertiesVM.h | 6 ++-- 14 files changed, 58 insertions(+), 31 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index ee2b453ec..c0f38cffb 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -81,6 +81,17 @@ namespace { }; return QObject::tr("Unknown"); } + + static inline QString walletType(bool isHardware, bool isWatchingOnly) + { + if (isHardware) { + return QObject::tr("Hardware"); + } + if (isWatchingOnly) { + return QObject::tr("Watch-only"); + } + return QObject::tr("Software"); + } } // redirect qDebug() to the log // stdout redirected to parent process @@ -705,10 +716,10 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) if (settingsController_->hasParam(ApplicationSettings::Setting::SelectedWallet)) { const int lastIdx = settingsController_->getParam(ApplicationSettings::Setting::SelectedWallet).toInt(); if ((lastIdx >= 0) && (lastIdx < nWalletsLoaded_)) { - walletSelected(lastIdx); + emit requestWalletSelection(lastIdx); } else if (nWalletsLoaded_ > 0) { - walletSelected(0); + emit requestWalletSelection(0); } } } @@ -1024,7 +1035,7 @@ std::string QtQuickAdapter::hdWalletIdByIndex(int index) std::string QtQuickAdapter::generateWalletName() const { - int index = walletNames_.size(); + int index = walletBalances_->rowCount(); std::string name; bool nameExists = true; while (nameExists) { @@ -1061,15 +1072,15 @@ void QtQuickAdapter::walletSelected(int index) walletInfoReq_[msgId] = walletName; if (hdWallets_.count(walletId) > 0) { + const auto& hdWallet = hdWallets_.at(walletId); walletPropertiesModel_->setWalletInfo({ - QString::fromStdString(hdWallets_.at(walletId).name), + QString::fromStdString(hdWallet.name), QString::fromStdString(walletId), - QString::fromLatin1("1/") + QString::number(hdWallets_.at(walletId).leaves.size()), - hdWallets_.at(walletId).encryptionTypes.size() > 0 - ? encTypeToString(hdWallets_.at(walletId).encryptionTypes[0]) : tr("Unknown"), - hdWallets_.at(walletId).nbAddresses, - hdWallets_.at(walletId).isHardware, - hdWallets_.at(walletId).watchOnly + QString::fromLatin1("1/") + QString::number(hdWallet.leaves.size()), + walletType(hdWallet.isHardware, hdWallet.watchOnly), + hdWallet.nbAddresses, + hdWallet.isHardware, + hdWallet.watchOnly }); } settingsController_->setParam(ApplicationSettings::Setting::SelectedWallet, index); @@ -1417,7 +1428,6 @@ void QtQuickAdapter::copyAddressToClipboard(const QString& addr) } } - QString QtQuickAdapter::pasteTextFromClipboard() { return QGuiApplication::clipboard()->text(); diff --git a/GUI/QtQuick/SettingsController.cpp b/GUI/QtQuick/SettingsController.cpp index 3941fab6c..0f559f16e 100644 --- a/GUI/QtQuick/SettingsController.cpp +++ b/GUI/QtQuick/SettingsController.cpp @@ -39,8 +39,10 @@ const SettingsController::SettingsCache& SettingsController::getCache() const void SettingsController::setParam(ApplicationSettings::Setting key, const QVariant& value) { - settingsCache_[key] = value; - emit changed(key); + if (settingsCache_.count(key) == 0 || settingsCache_.at(key) != value) { + settingsCache_[key] = value; + emit changed(key); + } } const QVariant& SettingsController::getParam(ApplicationSettings::Setting key) const diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index 670909cd6..6eb6c0e55 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -179,10 +179,8 @@ void WalletBalancesModel::setWalletBalance(const std::string& walletId, const Ba void WalletBalancesModel::setSelectedWallet(int index) { - if (selectedWallet_ != index) { - selectedWallet_ = index; - emit changed(); - } + selectedWallet_ = index; + emit changed(); } int WalletBalancesModel::selectedWallet() const diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index 72a6c938e..053a57e2b 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -50,9 +50,9 @@ Rectangle { control.createNewWallet() } else { - bsApp.walletSelected(currentIndex) - control.walletIndexChanged(currentIndex) - walletBalances.selectedWallet = currentIndex + bsApp.walletSelected(wallet_selection_combobox.currentIndex) + control.walletIndexChanged(wallet_selection_combobox.currentIndex) + walletBalances.selectedWallet = wallet_selection_combobox.currentIndex } } @@ -60,14 +60,25 @@ Rectangle { if (walletBalances.rowCount === 0) { control.createNewWallet() } + else { + bsApp.walletSelected(wallet_selection_combobox.currentIndex) + control.walletIndexChanged(wallet_selection_combobox.currentIndex) + walletBalances.selectedWallet = wallet_selection_combobox.currentIndex + } + } + + onModelChanged: { + if (model === walletBalances) { + wallet_selection_combobox.currentIndex = walletBalances.selectedWallet + } } Connections { target: bsApp function onRequestWalletSelection(index) { - if (wallet_selection_combobox.currentIndex != index) { - wallet_selection_combobox.currentIndex = index - } + bsApp.walletSelected(index) + control.walletIndexChanged(index) + wallet_selection_combobox.currentIndex = index } } } diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml index afea010ff..db1fc2c9f 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml @@ -18,6 +18,7 @@ Button { width: 150 height: 50 + focusPolicy: Qt.NoFocus font.pixelSize: 16 font.family: "Roboto" diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml index dba8c1ab2..6b16b1010 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml @@ -19,6 +19,7 @@ Button { width: 150 height: 50 + focusPolicy: Qt.NoFocus property bool active: true font.pixelSize: 16 diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 4d9c45591..bbab0ea7c 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -622,10 +622,10 @@ ColumnLayout { bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) } else { - bsApp.requestFeeSuggestions() if (isRBF) { txOutputsModel.setOutputsFrom(tx) } } + bsApp.requestFeeSuggestions() } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomButton.qml b/GUI/QtQuick/qml/StyledControls/CustomButton.qml index bdc742f5e..146b1f6c6 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButton.qml @@ -29,6 +29,7 @@ Button { font.family: "Roboto" font.weight: Font.Bold palette.buttonText: enabled ? BSStyle.buttonsTextColor : BSStyle.buttonsDisabledTextColor + focusPolicy: Qt.NoFocus icon.color: "transparent" diff --git a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml index 7ea5bda43..5ef7ba24f 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml @@ -29,6 +29,7 @@ ComboBox { signal editingFinished() activeFocusOnTab: true + focusPolicy: Qt.NoFocus leftPadding: 16 rightPadding: 36 diff --git a/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml b/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml index 4e3cbf7b1..448c74a99 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml @@ -22,6 +22,7 @@ Button { width: 136 height: 36 hoverEnabled: true + focusPolicy: Qt.NoFocus font.pixelSize: 12 font.family: "Roboto" diff --git a/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml index 744cd9584..03d19b869 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml @@ -19,6 +19,7 @@ Button { width: 134 height: 29 + focusPolicy: Qt.NoFocus font.pixelSize: 12 font.family: "Roboto" font.letterSpacing: 0.3 diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index a6c5cb690..dbe243aef 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -152,14 +152,14 @@ CustomPopup { width: parent.width Text { - text: qsTr("Encryption") + text: qsTr("Wallet type") color: BSStyle.titleTextColor font.family: "Roboto" font.pixelSize: 14 width: parent.width / 2 } Text { - text: wallet_properties_vm.walletEncryption + text: wallet_properties_vm.walletType color: BSStyle.textColor font.family: "Roboto" font.pixelSize: 14 diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index 47c76de7a..a44ab2f63 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -69,9 +69,9 @@ const QString& WalletPropertiesVM::walletGroups() const return info_.groups; } -const QString& WalletPropertiesVM::walletEncryption() const +const QString& WalletPropertiesVM::walletType() const { - return info_.ecryption; + return info_.walletType; } quint32 WalletPropertiesVM::walletGeneratedAddresses() const diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h index 8bd62f649..1b2b5412d 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h @@ -26,7 +26,7 @@ struct WalletInfo QString name; QString walletId; QString groups; - QString ecryption; + QString walletType; quint32 generatedAddresses; bool isHardware; bool isWatchingOnly; @@ -38,7 +38,7 @@ class WalletPropertiesVM: public QObject Q_PROPERTY(QString walletName READ walletName NOTIFY changed) Q_PROPERTY(QString walletId READ walletId NOTIFY changed) Q_PROPERTY(QString walletGroups READ walletGroups NOTIFY changed) - Q_PROPERTY(QString walletEncryption READ walletEncryption NOTIFY changed) + Q_PROPERTY(QString walletType READ walletType NOTIFY changed) Q_PROPERTY(quint32 walletGeneratedAddresses READ walletGeneratedAddresses NOTIFY changed) Q_PROPERTY(quint32 walletUsedAddresses READ walletUsedAddresses NOTIFY changed) Q_PROPERTY(quint32 walletAvailableUtxo READ walletAvailableUtxo NOTIFY changed) @@ -57,7 +57,7 @@ class WalletPropertiesVM: public QObject const QString& walletName() const; const QString& walletId() const; const QString& walletGroups() const; - const QString& walletEncryption() const; + const QString& walletType() const; quint32 walletGeneratedAddresses() const; quint32 walletUsedAddresses() const; quint32 walletAvailableUtxo() const; From 05e493c32a2e98705c1e1daedd4f253589ea1ce9 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Tue, 28 Mar 2023 12:17:53 +0300 Subject: [PATCH 299/436] [QT-50] rename wallet --- GUI/QtQuick/images/edit_wallet_name.ico | Bin 1150 -> 0 bytes GUI/QtQuick/images/edit_wallet_name.png | Bin 0 -> 514 bytes .../qml/WalletProperties/RenameWallet.qml | 153 ++++++++++++++++++ .../WalletPropertiesPopup.qml | 38 +++++ GUI/QtQuick/qtquick.qrc | 3 +- 5 files changed, 193 insertions(+), 1 deletion(-) delete mode 100644 GUI/QtQuick/images/edit_wallet_name.ico create mode 100644 GUI/QtQuick/images/edit_wallet_name.png create mode 100644 GUI/QtQuick/qml/WalletProperties/RenameWallet.qml diff --git a/GUI/QtQuick/images/edit_wallet_name.ico b/GUI/QtQuick/images/edit_wallet_name.ico deleted file mode 100644 index 5fc6fe78706d183d8270b39b4cca1a6b26c692d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmb`Gu}T9$6h*I5M1n{v5e*VVFopk+*3N&B6n=nM#!f^;41%TpgNUf4un^hO!b(IC z1iKU#f)HHKjk~buOk&{+Co{ac@6MYURvO_~sfhoY*2ko2Np&Da<~z?2j5JN};Tkq! z8G^c45`708kI;iB*oShgrkF>!k=2NC2G+n{?rE~94b9Qi!BO=(;|k1!J#JtsRF~&i zca62pjCaOu$USbE5A)bV<9n>a88~*}Paf#Xa0Pb|^GI0plLmve|L~Z==K==xaS&`E zOHyl(^N7bR`5GL+miG#C-n}c&nDkj0&RGPSLqAyjscti diff --git a/GUI/QtQuick/images/edit_wallet_name.png b/GUI/QtQuick/images/edit_wallet_name.png new file mode 100644 index 0000000000000000000000000000000000000000..23a4bead4301341600b2e5b7b79c4a5afcea4454 GIT binary patch literal 514 zcmV+d0{#7oP)Px$yh%hsR5(wilRapYQ51%sQ|uZF6-o^__zen5>5xf&S`3Faid?}T*A>f6(TzH@Rp7)$1 z{O6HT^{RRlr~q3*5G;4Q-EXEH381P|z;WOXa2R+J1i_L)h623zW35&zsMqWB3E(xb z2pj@xA`;)kdT7q2Ilo z4n$Q?CYJ95bAV-V4|rk811p(KrrK_|e+>Xs)!OqASOX3K=Ya>nE8wZUM^SXsd;fjs z>})$w)n|YWht+0vJ_0@gk%?=y+U+n5{}FFz;Jx4PoO{>n_2xUB&arGZ`xBT3&YG)Y zvA9~PRDSF>wSOI`>OvgHw@RhbY`I*XNvG2xFbiDE<#KPD&F1gDM!pYt37m@Kcr%qs zO#n?xUPLT;9kwrhz+2!m@H~p5HShhGQI~9_Wf}(i16Dbh5vB!<2mk;807*qoM6N<$ Eg8c#EIsgCw literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml b/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml new file mode 100644 index 000000000..befa6d4ef --- /dev/null +++ b/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml @@ -0,0 +1,153 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" +import "../StyledControls" + +Window { + id: root + + property alias header: title.text + property alias wallet_name: input.input_text + property var wallet_properties_vm + + signal sig_confirm() + + visible: true + flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog + modality: Qt.WindowModal + + height: 375 + width: 400 + + color: "transparent" + + x: mainWindow.x + (mainWindow.width - width)/2 + y: mainWindow.y + (mainWindow.height - height)/2 + + CustomMessageDialog { + id: error_dialog + error: qsTr("Wallet name already exist") + visible: false + } + + + Rectangle { + id: rect + + color: "#191E2A" + opacity: 1 + radius: 16 + + anchors.fill: parent + + border.color : BSStyle.defaultBorderColor + border.width : 1 + + ColumnLayout { + + id: layout + + anchors.fill: parent + + CustomTitleLabel { + id: title + Layout.topMargin: 32 + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Rename your wallet") + } + + CustomTextInput { + id: input + + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 375 + Layout.topMargin: 32 + + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + activeFocusOnTab: true + + title_text: qsTr("Wallet Name") + } + + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } + + RowLayout { + id: row + spacing: 10 + + anchors.bottom: parent.bottom + anchors.bottomMargin: 40 + anchors.horizontalCenter: parent.horizontalCenter + + CustomButton { + id: cancel_but + text: qsTr("Cancel") + width: 190 + + preferred: false + function click_enter() { + //root.clean() + root.close() + } + } + + CustomButton { + id: accept_but + text: qsTr("Accept") + width: 190 + + preferred: true + + function click_enter() { + if (bsApp.isWalletNameExist(input.input_text)) { + showError(qsTr("Wallet name already exist")) + } + else { + if (bsApp.renameWallet(wallet_properties_vm.walletId, input.input_text) === 0) { + root.sig_confirm() + root.close() + } + else { + showError(qsTr("Failed to rename wallet")) + } + } + } + + } + } + + Keys.onEnterPressed: { + confirm_but.click_enter() + } + + Keys.onReturnPressed: { + confirm_but.click_enter() + } + + function init() + { + input.setActiveFocus() + } + + function showError(error) + { + error_dialog.error = error + error_dialog.show() + error_dialog.raise() + error_dialog.requestActivate() + init() + } + } + } +} \ No newline at end of file diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index a6c5cb690..9385d2565 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -17,6 +17,16 @@ CustomPopup { property var wallet_properties_vm + RenameWallet { + id: rename_wallet + visible: false + wallet_properties_vm: root.wallet_properties_vm + + onSig_confirm: { + wallet_name.text = rename_wallet.wallet_name; + } + } + ChangePassword { id: change_password visible: false @@ -139,6 +149,7 @@ CustomPopup { width: parent.width / 2 } Text { + id: wallet_name text: wallet_properties_vm.walletName color: BSStyle.textColor font.family: "Roboto" @@ -146,8 +157,33 @@ CustomPopup { width: parent.width / 2 horizontalAlignment: Text.AlignRight } + + Image { + id: close_button + + x: parent.horizontalCenter - 10 + y: wallet_name.top + + source: "qrc:/images/edit_wallet_name.png" + width: 32 + height: 16 + + horizontalAlignment: Image.AlignHCenter + fillMode: Image.PreserveAspectFit; + MouseArea { + anchors.fill: parent + onClicked: { + rename_wallet.wallet_name = wallet_name.text + + rename_wallet.show() + rename_wallet.raise() + rename_wallet.requestActivate() + } + } + } } + Row { width: parent.width @@ -351,5 +387,7 @@ CustomPopup { } } } + + } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index a9e46792e..5ae4af4c2 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -171,13 +171,14 @@ images/scan_icon.svg qml/WalletProperties/WalletPropertiesPopup.qml qml/WalletProperties/ChangePassword.qml + qml/WalletProperties/RenameWallet.qml qml/WalletProperties/DeleteWallet.qml qml/WalletProperties/DeleteWalletWarn.qml qml/WalletProperties/ExportWOWallet.qml qml/WalletProperties/WalletSeed.qml qml/WalletProperties/WalletSeedAuth.qml images/wallet_icon_warn.svg - images/edit_wallet_name.ico + images/edit_wallet_name.png qml/StyledControls/CustomHorizontalHeaderView.qml qml/StyledControls/CustomRbfCpfpMenu.qml qml/StyledControls/CustomSuccessWidget.qml From 0321bb431e1feb5724624400293985d275063b92 Mon Sep 17 00:00:00 2001 From: YZ Date: Tue, 28 Mar 2023 12:54:04 +0200 Subject: [PATCH 300/436] Review refactoring --- GUI/QtQuick/QtQuickAdapter.cpp | 21 +---------------- GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 23 +++++++++++++++++-- GUI/QtQuick/viewmodels/WalletPropertiesVM.h | 3 ++- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index c0f38cffb..2e6e9c795 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -81,17 +81,6 @@ namespace { }; return QObject::tr("Unknown"); } - - static inline QString walletType(bool isHardware, bool isWatchingOnly) - { - if (isHardware) { - return QObject::tr("Hardware"); - } - if (isWatchingOnly) { - return QObject::tr("Watch-only"); - } - return QObject::tr("Software"); - } } // redirect qDebug() to the log // stdout redirected to parent process @@ -1073,15 +1062,7 @@ void QtQuickAdapter::walletSelected(int index) if (hdWallets_.count(walletId) > 0) { const auto& hdWallet = hdWallets_.at(walletId); - walletPropertiesModel_->setWalletInfo({ - QString::fromStdString(hdWallet.name), - QString::fromStdString(walletId), - QString::fromLatin1("1/") + QString::number(hdWallet.leaves.size()), - walletType(hdWallet.isHardware, hdWallet.watchOnly), - hdWallet.nbAddresses, - hdWallet.isHardware, - hdWallet.watchOnly - }); + walletPropertiesModel_->setWalletInfo(QString::fromStdString(walletId), hdWallet); } settingsController_->setParam(ApplicationSettings::Setting::SelectedWallet, index); } diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index a44ab2f63..d7b164698 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -15,15 +15,34 @@ using namespace qtquick_gui; +namespace { + static inline QString walletTypeFromInfo(const bs::sync::WalletInfo& info) + { + if (info.isHardware) { + return QObject::tr("Hardware"); + } + if (info.watchOnly) { + return QObject::tr("Watch-only"); + } + return QObject::tr("Software"); + } +} + WalletPropertiesVM::WalletPropertiesVM(const std::shared_ptr & logger, QObject* parent) : QObject(parent), logger_(logger) { } -void WalletPropertiesVM::setWalletInfo(const WalletInfo& info) +void WalletPropertiesVM::setWalletInfo(const QString& walletId, const bs::sync::WalletInfo& info) { - info_ = info; + info_.name = QString::fromStdString(info.name); + info_.walletId = walletId; + info_.groups = QString::fromLatin1("1/") + QString::number(info.leaves.size()); + info_.walletType = walletTypeFromInfo(info); + info_.generatedAddresses = info.nbAddresses; + info_.isHardware = info.isHardware; + info_.isWatchingOnly = info.watchOnly; emit changed(); } diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h index 1b2b5412d..5677475f9 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h @@ -13,6 +13,7 @@ #include #include +#include namespace spdlog { class logger; @@ -49,7 +50,7 @@ class WalletPropertiesVM: public QObject public: WalletPropertiesVM(const std::shared_ptr & logger, QObject* parent = nullptr); - void setWalletInfo(const WalletInfo& info); + void setWalletInfo(const QString& walletId, const bs::sync::WalletInfo& info); void setWalletSeed(const std::string& walletId, const std::string& seed); void setNbUsedAddrs(const std::string& walletId, uint32_t nb); void setNbUTXOs(const std::string& walletId, uint32_t nb); From 27bc8a4ab97753775d66bab1bb8a11dfb0ab523c Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 28 Mar 2023 15:10:01 +0300 Subject: [PATCH 301/436] [QT-65] initial plugin classes --- GUI/QtQuick/LeverexPlugin.cpp | 15 +++++++ GUI/QtQuick/LeverexPlugin.h | 29 ++++++++++++++ GUI/QtQuick/Plugin.cpp | 15 +++++++ GUI/QtQuick/Plugin.h | 28 +++++++++++++ GUI/QtQuick/QtQuickAdapter.cpp | 12 ++++++ GUI/QtQuick/QtQuickAdapter.h | 1 + GUI/QtQuick/SideshiftPlugin.cpp | 20 ++++++++++ GUI/QtQuick/SideshiftPlugin.h | 29 ++++++++++++++ GUI/QtQuick/SideswapPlugin.cpp | 15 +++++++ GUI/QtQuick/SideswapPlugin.h | 29 ++++++++++++++ .../viewmodels/plugins/PluginsListModel.cpp | 40 ++++++++----------- .../viewmodels/plugins/PluginsListModel.h | 11 ++--- common | 2 +- 13 files changed, 213 insertions(+), 33 deletions(-) create mode 100644 GUI/QtQuick/LeverexPlugin.cpp create mode 100644 GUI/QtQuick/LeverexPlugin.h create mode 100644 GUI/QtQuick/Plugin.cpp create mode 100644 GUI/QtQuick/Plugin.h create mode 100644 GUI/QtQuick/SideshiftPlugin.cpp create mode 100644 GUI/QtQuick/SideshiftPlugin.h create mode 100644 GUI/QtQuick/SideswapPlugin.cpp create mode 100644 GUI/QtQuick/SideswapPlugin.h diff --git a/GUI/QtQuick/LeverexPlugin.cpp b/GUI/QtQuick/LeverexPlugin.cpp new file mode 100644 index 000000000..3f295cf69 --- /dev/null +++ b/GUI/QtQuick/LeverexPlugin.cpp @@ -0,0 +1,15 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "LeverexPlugin.h" + +LeverexPlugin::LeverexPlugin(QObject* parent) + : Plugin(parent) +{} diff --git a/GUI/QtQuick/LeverexPlugin.h b/GUI/QtQuick/LeverexPlugin.h new file mode 100644 index 000000000..e9785715a --- /dev/null +++ b/GUI/QtQuick/LeverexPlugin.h @@ -0,0 +1,29 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#pragma once + +#include "Plugin.h" + +class LeverexPlugin: public Plugin +{ + Q_OBJECT +public: + LeverexPlugin(QObject *parent); + + QString name() override { return QLatin1Literal("Leverex"); } + QString description() override { return tr("Leverage made simple"); } + QString icon() override { return QLatin1Literal("qrc:/images/leverex_plugin.png"); } + QString path() override { return {}; } + + Q_INVOKABLE void init() override {} + +private: +}; diff --git a/GUI/QtQuick/Plugin.cpp b/GUI/QtQuick/Plugin.cpp new file mode 100644 index 000000000..b5583c314 --- /dev/null +++ b/GUI/QtQuick/Plugin.cpp @@ -0,0 +1,15 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "Plugin.h" + +Plugin::Plugin(QObject* parent) + : QObject(parent) +{} diff --git a/GUI/QtQuick/Plugin.h b/GUI/QtQuick/Plugin.h new file mode 100644 index 000000000..ab2b7ed17 --- /dev/null +++ b/GUI/QtQuick/Plugin.h @@ -0,0 +1,28 @@ +/* +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** +*/ +#pragma once + +#include +#include "Message/Adapter.h" + +class Plugin: public QObject +{ + Q_OBJECT +public: + Plugin(QObject *parent); + + virtual QString name() = 0; + virtual QString description() = 0; + virtual QString icon() = 0; + virtual QString path() = 0; + + Q_INVOKABLE virtual void init() = 0; + +private: +}; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index ee2b453ec..d958c5785 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -49,6 +49,9 @@ #include "Utils.h" #include "AddressFilterModel.h" #include "viewmodels/plugins/PluginsListModel.h" +#include "LeverexPlugin.h" +#include "SideshiftPlugin.h" +#include "SideswapPlugin.h" #include "hardware_wallet.pb.h" #include "terminal.pb.h" @@ -333,6 +336,7 @@ void QtQuickAdapter::run(int &argc, char **argv) updateStates(); requestInitialSettings(); + loadPlugins(); logger_->debug("[QtGuiAdapter::run] initial setup done"); app.exec(); @@ -831,6 +835,14 @@ void QtQuickAdapter::setTopBlock(uint32_t topBlock) txInputsModel_->setTopBlock(topBlock); } +void QtQuickAdapter::loadPlugins() +{ // load embedded plugins + pluginsListModel_->addPlugins({ new LeverexPlugin(this), new SideshiftPlugin(this) + , new SideswapPlugin(this) }); + + //TODO: send broadcast to request 3rd-party plugins loading +} + //#define DEBUG_LOADING_PROGRESS void QtQuickAdapter::updateSplashProgress() { diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 07908e858..8f07968dd 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -234,6 +234,7 @@ private slots: void splashProgressCompleted(); void updateStates(); void setTopBlock(uint32_t); + void loadPlugins(); void createWallet(bool primary); std::string hdWalletIdByIndex(int); diff --git a/GUI/QtQuick/SideshiftPlugin.cpp b/GUI/QtQuick/SideshiftPlugin.cpp new file mode 100644 index 000000000..c686bcb3b --- /dev/null +++ b/GUI/QtQuick/SideshiftPlugin.cpp @@ -0,0 +1,20 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "SideshiftPlugin.h" + +SideshiftPlugin::SideshiftPlugin(QObject* parent) + : Plugin(parent) +{} + +void SideshiftPlugin::init() +{ + +} diff --git a/GUI/QtQuick/SideshiftPlugin.h b/GUI/QtQuick/SideshiftPlugin.h new file mode 100644 index 000000000..d665fb657 --- /dev/null +++ b/GUI/QtQuick/SideshiftPlugin.h @@ -0,0 +1,29 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#pragma once + +#include "Plugin.h" + +class SideshiftPlugin: public Plugin +{ + Q_OBJECT +public: + SideshiftPlugin(QObject *parent); + + QString name() override { return QLatin1Literal("SideShift.ai"); } + QString description() override { return tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies"); } + QString icon() override { return QLatin1Literal("qrc:/images/sideshift_plugin.png"); } + QString path() override { return QLatin1Literal("qrc:/qml/Plugins/SideShift/SideShiftPopup.qml"); } + + Q_INVOKABLE void init() override; + +private: +}; diff --git a/GUI/QtQuick/SideswapPlugin.cpp b/GUI/QtQuick/SideswapPlugin.cpp new file mode 100644 index 000000000..c0134d193 --- /dev/null +++ b/GUI/QtQuick/SideswapPlugin.cpp @@ -0,0 +1,15 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "SideswapPlugin.h" + +SideswapPlugin::SideswapPlugin(QObject* parent) + : Plugin(parent) +{} diff --git a/GUI/QtQuick/SideswapPlugin.h b/GUI/QtQuick/SideswapPlugin.h new file mode 100644 index 000000000..fd6bc32c6 --- /dev/null +++ b/GUI/QtQuick/SideswapPlugin.h @@ -0,0 +1,29 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#pragma once + +#include "Plugin.h" + +class SideswapPlugin: public Plugin +{ + Q_OBJECT +public: + SideswapPlugin(QObject *parent); + + QString name() override { return QLatin1Literal("SideSwap.io"); } + QString description() override { return tr("Easiest way to get started on the Liquid Network"); } + QString icon() override { return QLatin1Literal("qrc:/images/sideswap_plugin.png"); } + QString path() override { return QLatin1Literal("qrc:/qml/Plugins/SideSwap/SideSwapPopup.qml"); } + + Q_INVOKABLE void init() override {} + +private: +}; diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp index 01d1eb0cd..a8e589807 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp @@ -24,26 +24,18 @@ namespace PluginsListModel::PluginsListModel(QObject* parent) : QAbstractListModel(parent) -{ - plugins_ = { - { tr("Leverex") - , tr("Leverage made simple") - , QString::fromLatin1("qrc:/images/leverex_plugin.png") - , nullptr - , QString::fromLatin1("") }, - - { tr("SideShift.ai") - , tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies") - , QString::fromLatin1("qrc:/images/sideshift_plugin.png") - , new SideShiftController(this) - , QString::fromLatin1("qrc:/qml/Plugins/SideShift/SideShiftPopup.qml") }, +{} - { tr("SideSwap.io") - , tr("Easiest way to get started on the Liquid Network") - , QString::fromLatin1("qrc:/images/sideswap_plugin.png") - , nullptr - , QString::fromLatin1("qrc:/qml/Plugins/SideSwap/SideSwapPopup.qml") } - }; +void PluginsListModel::addPlugins(const std::vector& plugins) +{ + if (plugins.empty()) { + return; + } + QMetaObject::invokeMethod(this, [this, plugins] { + beginInsertRows(QModelIndex(), rowCount(), rowCount() + plugins.size() - 1); + plugins_.insert(plugins_.cend(), plugins.cbegin(), plugins.cend()); + endInsertRows(); + }); } int PluginsListModel::rowCount(const QModelIndex&) const @@ -56,10 +48,10 @@ QVariant PluginsListModel::data(const QModelIndex& index, int role) const const int row = index.row(); try { switch(role) { - case Name: return plugins_.at(row).name; - case Description: return plugins_.at(row).description; - case Icon: return plugins_.at(row).icon; - case Path: return plugins_.at(row).path; + case Name: return plugins_.at(row)->name(); + case Description: return plugins_.at(row)->description(); + case Icon: return plugins_.at(row)->icon(); + case Path: return plugins_.at(row)->path(); default: break; } } @@ -77,7 +69,7 @@ QHash PluginsListModel::roleNames() const QObject* PluginsListModel::getPlugin(int index) { try { - return plugins_.at(index).controller; + return plugins_.at(index); } catch (...) { } diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h index 90c5edeef..f76b6a294 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.h @@ -15,14 +15,8 @@ #include #include #include +#include "Plugin.h" -struct Plugin { - QString name; - QString description; - QString icon; - QObject* controller; - QString path; -}; class PluginsListModel: public QAbstractListModel { @@ -38,6 +32,7 @@ class PluginsListModel: public QAbstractListModel Q_ENUM(PluginRoles) PluginsListModel(QObject* parent = nullptr); + void addPlugins(const std::vector&); int rowCount(const QModelIndex & = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role) const override; @@ -46,5 +41,5 @@ class PluginsListModel: public QAbstractListModel Q_INVOKABLE QObject* getPlugin(int index); private: - std::vector plugins_; + std::vector plugins_; }; diff --git a/common b/common index c8e42bf62..3ab5d4c16 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit c8e42bf628e636713cec182bedd0851c772f182a +Subproject commit 3ab5d4c16a148d329e69b6b69369408d17b499c8 From 5ceef841588f385aa6e0a75fe254a75bdef11530 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 28 Mar 2023 21:42:53 +0300 Subject: [PATCH 302/436] [WIP] SideShift.ai plugin implementation --- BlockSettleHW/jade/jadeClient.cpp | 1 - BlockSettleHW/trezor/trezorClient.h | 2 +- GUI/QtQuick/AddressListModel.cpp | 3 + GUI/QtQuick/CMakeLists.txt | 1 + GUI/QtQuick/LeverexPlugin.cpp | 5 +- GUI/QtQuick/QtQuickAdapter.cpp | 10 +- GUI/QtQuick/SideshiftPlugin.cpp | 113 +++++++++++++++++- GUI/QtQuick/SideshiftPlugin.h | 51 +++++++- GUI/QtQuick/SideswapPlugin.cpp | 5 +- .../qml/Plugins/Common/PluginsPage.qml | 20 ++-- .../Plugins/SideShift/SideShiftBuyPage.qml | 43 +++---- .../SideShift/SideShiftComboboxWithIcon.qml | 3 +- .../Plugins/SideShift/SideShiftMainPage.qml | 28 ++--- .../qml/Plugins/SideShift/SideShiftPopup.qml | 2 + 14 files changed, 221 insertions(+), 66 deletions(-) diff --git a/BlockSettleHW/jade/jadeClient.cpp b/BlockSettleHW/jade/jadeClient.cpp index 29a0ba538..a33aa5f11 100644 --- a/BlockSettleHW/jade/jadeClient.cpp +++ b/BlockSettleHW/jade/jadeClient.cpp @@ -9,7 +9,6 @@ */ #include "jadeClient.h" -#include #include "hwdevicemanager.h" #include "jadeDevice.h" #include "SystemFileUtils.h" diff --git a/BlockSettleHW/trezor/trezorClient.h b/BlockSettleHW/trezor/trezorClient.h index e84c3b57b..4fa35ce18 100644 --- a/BlockSettleHW/trezor/trezorClient.h +++ b/BlockSettleHW/trezor/trezorClient.h @@ -45,7 +45,7 @@ namespace bs { class TrezorPostHandler : public bs::HandlerImpl { public: - TrezorPostHandler(const std::shared_ptr& logger + TrezorPostHandler(const std::shared_ptr& , const std::string& baseURL); ~TrezorPostHandler() override; diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index f2534a664..3a2468196 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -16,6 +16,7 @@ namespace { static const QHash kRoles{ + {Qt::DisplayRole, "address"}, {QmlAddressListModel::TableDataRole, "tableData"}, {QmlAddressListModel::ColorRole, "dataColor"}, {QmlAddressListModel::AddressTypeRole, "addressType"}, @@ -42,6 +43,8 @@ QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const try { switch (role) { + case Qt::DisplayRole: + return table_.at(row).at(0); case TableDataRole: { switch (index.column()) { diff --git a/GUI/QtQuick/CMakeLists.txt b/GUI/QtQuick/CMakeLists.txt index f1777b366..ec394ed5a 100644 --- a/GUI/QtQuick/CMakeLists.txt +++ b/GUI/QtQuick/CMakeLists.txt @@ -35,6 +35,7 @@ INCLUDE_DIRECTORIES(${Qt5Network_INCLUDE_DIRS} ) INCLUDE_DIRECTORIES(${Qt5Qml_INCLUDE_DIRS} ) INCLUDE_DIRECTORIES(${Qt5DBus_INCLUDE_DIRS} ) INCLUDE_DIRECTORIES(${Qt5Charts_INCLUDE_DIRS} ) +INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR}) qt5_add_resources(GENERATED_RESOURCES qtquick.qrc) diff --git a/GUI/QtQuick/LeverexPlugin.cpp b/GUI/QtQuick/LeverexPlugin.cpp index 3f295cf69..f23ad51dc 100644 --- a/GUI/QtQuick/LeverexPlugin.cpp +++ b/GUI/QtQuick/LeverexPlugin.cpp @@ -9,7 +9,10 @@ */ #include "LeverexPlugin.h" +#include LeverexPlugin::LeverexPlugin(QObject* parent) : Plugin(parent) -{} +{ + qmlRegisterInterface("LeverexPlugin"); +} diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 13df9e4e0..119629fc5 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -732,8 +732,11 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) break; case WalletsMessage::kWalletDeleted: { - const auto& wi = bs::sync::WalletInfo::fromCommonMsg(msg.wallet_deleted()); - //TODO + if (!msg.wallet_deleted().id_size()) { + showError(tr("Wallet deletion failed")); + break; + } + //const auto& wi = bs::sync::WalletInfo::fromCommonMsg(msg.wallet_deleted()); } break; @@ -837,7 +840,8 @@ void QtQuickAdapter::setTopBlock(uint32_t topBlock) void QtQuickAdapter::loadPlugins() { // load embedded plugins - pluginsListModel_->addPlugins({ new LeverexPlugin(this), new SideshiftPlugin(this) + pluginsListModel_->addPlugins({ new LeverexPlugin(this) + , new SideshiftPlugin(logger_, this) , new SideswapPlugin(this) }); //TODO: send broadcast to request 3rd-party plugins loading diff --git a/GUI/QtQuick/SideshiftPlugin.cpp b/GUI/QtQuick/SideshiftPlugin.cpp index c686bcb3b..23fa300ec 100644 --- a/GUI/QtQuick/SideshiftPlugin.cpp +++ b/GUI/QtQuick/SideshiftPlugin.cpp @@ -9,12 +9,119 @@ */ #include "SideshiftPlugin.h" +#include +#include +#include +#include -SideshiftPlugin::SideshiftPlugin(QObject* parent) - : Plugin(parent) -{} +using json = nlohmann::json; + +SideshiftPlugin::SideshiftPlugin(const std::shared_ptr& logger, QObject* parent) + : Plugin(parent), logger_(logger) +{ + qmlRegisterInterface("SideshiftPlugin"); + outputCurrencies_.append(QLatin1Literal("BTC")); +} + +SideshiftPlugin::~SideshiftPlugin() +{ + deinit(); +} + +static size_t writeToString(void* ptr, size_t size, size_t count, std::string* stream) +{ + const size_t resSize = size * count; + stream->append((char*)ptr, resSize); + return resSize; +} + +static int dumpFunc(CURL* handle, curl_infotype type, + char* data, size_t size, void* clientp) +{ + if (!data || !size) { + return 0; + } + const auto log = static_cast(clientp); + if (log) { + log->debug("[dump] {}", std::string(data, size)); + } + return 0; +}; void SideshiftPlugin::init() { + deinit(); + curl_ = curl_easy_init(); + curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, writeToString); + curl_easy_setopt(curl_, CURLOPT_USERAGENT, std::string("BlockSettle " + name().toStdString() + " plugin").c_str()); + curl_easy_setopt(curl_, CURLOPT_SSL_VERIFYPEER, 0L); + curl_easy_setopt(curl_, CURLOPT_SSL_VERIFYHOST, 0L); + curl_easy_setopt(curl_, CURLOPT_FOLLOWLOCATION, 1L); + + //curl_easy_setopt(curl_, CURLOPT_DEBUGFUNCTION, dumpFunc); + //curl_easy_setopt(curl_, CURLOPT_DEBUGDATA, logger_.get()); + //curl_easy_setopt(curl_, CURLOPT_VERBOSE, 1L); + curlHeaders_ = curl_slist_append(curlHeaders_, "accept: */*"); + curl_easy_setopt(curl_, CURLOPT_HTTPHEADER, curlHeaders_); + + const auto& response = get("/coins"); + if (!response.empty()) { + try { + const auto& msg = json::parse(response); + for (const auto& coin : msg) { + const auto& currency = coin["coin"].get(); + //if (currency != "BTC") { + inputCurrencies_.append(QString::fromStdString(currency)); + //} + } + logger_->debug("[{}] {} input currencies", __func__, inputCurrencies_.size()); + emit inited(); + } + catch (const json::exception&) { + logger_->error("[{}] failed to parse {}", __func__, response); + } + } +} + +void SideshiftPlugin::deinit() +{ + inputCurrencies_.clear(); + if (curlHeaders_) { + curl_slist_free_all(curlHeaders_); + curlHeaders_ = nullptr; + } + if (curl_) { + curl_easy_cleanup(curl_); + curl_ = NULL; + } +} + +std::string SideshiftPlugin::get(const std::string& request) +{ + if (!curl_) { + logger_->error("[{}] curl not inited"); + return {}; + } + const auto url = baseURL_ + request; + curl_easy_setopt(curl_, CURLOPT_URL, url.c_str()); + std::string response; + curl_easy_setopt(curl_, CURLOPT_WRITEDATA, &response); + //long respCode = 0; + //curl_easy_getinfo(curl_, CURLINFO_RESPONSE_CODE, &respCode); + + const auto res = curl_easy_perform(curl_); + if (res != CURLE_OK) { + logger_->error("[{}] {} failed: {}", __func__, url, res); + return {}; + } + logger_->debug("[{}] {} response: {}", __func__, url, response); + return response; +} + +void SideshiftPlugin::inputCurrencySelected(const QString& cur) +{ + logger_->debug("{{}] {}", __func__, cur.toStdString()); + depositAddr_.clear(); + emit inputCurSelected(); } diff --git a/GUI/QtQuick/SideshiftPlugin.h b/GUI/QtQuick/SideshiftPlugin.h index d665fb657..4df81e826 100644 --- a/GUI/QtQuick/SideshiftPlugin.h +++ b/GUI/QtQuick/SideshiftPlugin.h @@ -11,19 +11,68 @@ #pragma once #include "Plugin.h" +#include + +namespace spdlog { + class logger; +} class SideshiftPlugin: public Plugin { Q_OBJECT public: - SideshiftPlugin(QObject *parent); + SideshiftPlugin(const std::shared_ptr&, QObject *parent); + ~SideshiftPlugin() override; QString name() override { return QLatin1Literal("SideShift.ai"); } QString description() override { return tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies"); } QString icon() override { return QLatin1Literal("qrc:/images/sideshift_plugin.png"); } QString path() override { return QLatin1Literal("qrc:/qml/Plugins/SideShift/SideShiftPopup.qml"); } + Q_PROPERTY(QStringList inputCurrencies READ inputCurrencies NOTIFY inited) + QStringList inputCurrencies() const { return inputCurrencies_; } + Q_PROPERTY(QStringList outputCurrencies READ outputCurrencies NOTIFY inited) + QStringList outputCurrencies() const { return outputCurrencies_; } + Q_PROPERTY(QString depositAddress READ depositAddress WRITE setDepositAddr NOTIFY inputCurSelected) + QString depositAddress() const { return depositAddr_; } + void setDepositAddr(const QString& addr) { depositAddr_ = addr; } + Q_PROPERTY(QString conversionRate READ conversionRate NOTIFY inputCurSelected) + QString conversionRate() const { return convRate_; } + Q_PROPERTY(QString networkFee READ networkFee NOTIFY inputCurSelected) + QString networkFee() const { return networkFee_; } + Q_PROPERTY(QString minAmount READ minAmount NOTIFY inputCurSelected) + QString minAmount() const { return minAmount_; } + Q_PROPERTY(QString maxAmount READ maxAmount NOTIFY inputCurSelected) + QString maxAmount() const { return maxAmount_; } + + Q_PROPERTY(QString orderId READ orderId NOTIFY orderSent) + QString orderId() const { return orderId_; } + Q_PROPERTY(QString creationDate READ creationDate NOTIFY orderSent) + QString creationDate() const { return creationDate_; } + Q_INVOKABLE void init() override; + Q_INVOKABLE void inputCurrencySelected(const QString& cur); + +signals: + void inited(); + void inputCurSelected(); + void orderSent(); private: + void deinit(); + std::string get(const std::string& request); + +private: + std::shared_ptr logger_; + const std::string baseURL_{"https://sideshift.ai/api/v2"}; + struct curl_slist* curlHeaders_{ NULL }; + void* curl_{ nullptr }; + + QStringList inputCurrencies_, outputCurrencies_; + QString convRate_; + QString depositAddr_; + QString networkFee_; + QString minAmount_, maxAmount_; + QString creationDate_; + QString orderId_; }; diff --git a/GUI/QtQuick/SideswapPlugin.cpp b/GUI/QtQuick/SideswapPlugin.cpp index c0134d193..20f48e08a 100644 --- a/GUI/QtQuick/SideswapPlugin.cpp +++ b/GUI/QtQuick/SideswapPlugin.cpp @@ -9,7 +9,10 @@ */ #include "SideswapPlugin.h" +#include SideswapPlugin::SideswapPlugin(QObject* parent) : Plugin(parent) -{} +{ + qmlRegisterInterface("SideswapPlugin"); +} diff --git a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml index bce1bd757..7dee5e784 100644 --- a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml +++ b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml @@ -79,27 +79,25 @@ Rectangle { description: description_role icon_source: icon_role onCardClicked: { - plugin_popup.reset() - plugin_popup.open() + console.log("onCardClicked") + //plugin_popup = component.createObject(plugin_item) + plugin_popup.reset() + plugin_popup.controller = pluginsListModel.getPlugin(index) + plugin_popup.controller.init() + plugin_popup.open() } } function finishCreation() { - if (component.status == Component.Ready) { - plugin_popup = component.createObject(plugin_item) - plugin_popup.controller = pluginsListModel.getPlugin(index) - } - else if (component.status == Component.Error) { - console.log(component.errorString()) - } + plugin_popup = component.createObject(plugin_item) } Component.onCompleted: { component = Qt.createComponent(path_role); - if (component.status == Component.Ready) { + if (component.status === Component.Ready) { finishCreation(); } - else if (component.status == Component.Error) { + else if (component.status === Component.Error) { console.log(component.errorString()) } else { diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml index b86dc636b..0f9a3925e 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml @@ -20,16 +20,14 @@ Item { id: root property var controller - property string inputCurrency: "ETH" + property string inputCurrency property string outputCurrency: "BTC" - property string orderId: "253380c874f87a7a4f70" - property string conversionRate: "1 ETH = 0.06177451 BTC" - property string minAmout: "0.0286751507" - property string maxAmout: "22.94012056" - property string toAddress: "0x514cD3B3a164A78BA93b881C7b567d19CC6a1843" - property string networkFee: "1.97 USD" - property string receivingAddress: "bc1qvrl85pygns90xut25qu0tpmawm9h03j3d9w94a" - property string creationDate: "2023-03-21 07:48" +// property string orderId: "253380c874f87a7a4f70" + //property string conversionRate: "1 ETH = 0.06177451 BTC" + //property string toAddress: "0x514cD3B3a164A78BA93b881C7b567d19CC6a1843" + //property string networkFee: "1.97 USD" + property string receivingAddress + //property string creationDate: "2023-03-21 07:48" Rectangle { anchors.fill: parent @@ -55,7 +53,8 @@ Item { anchors.verticalCenter: parent.verticalCenter Text { - text: inputCurrency + //id: inputCurrency + //model: controller.inputCurrencies color: "lightgray" font.weight: Font.Bold anchors.verticalCenter: parent.verticalCenter @@ -89,7 +88,7 @@ Item { Text { color: "lightgray" - text: orderId + text: controller.orderId font.weight: Font.Bold } } @@ -97,7 +96,7 @@ Item { Text { color: "white" - text: qsTr("WAITING FOR YOU TO SEND ") + inputCurrency + text: qsTr("WAITING FOR YOU TO SEND ") + inputCurrency.currentText topPadding: 40 font.pixelSize: 24 anchors.horizontalCenter: parent.horizontalCenter @@ -106,7 +105,7 @@ Item { Text { topPadding: 15 color: "lightgray" - text: conversionRate + text: controller.conversionRate anchors.horizontalCenter: parent.horizontalCenter } @@ -137,13 +136,13 @@ Item { anchors.verticalCenter: parent.verticalCenter } Text { - text: minAmout + text: controller.minAmount color: "white" font.weight: Font.Bold font.pixelSize: 18 } Text { - text: inputCurrency + text: inputCurrency.currentText color: "white" font.weight: Font.Bold font.pixelSize: 18 @@ -159,7 +158,7 @@ Item { anchors.verticalCenter: parent.verticalCenter } Text { - text: maxAmout + text: controller.maxAmount color: "white" font.weight: Font.Bold font.pixelSize: 18 @@ -191,7 +190,8 @@ Item { Text { anchors.fill: parent - text: toAddress + id: toAddress + text: controller.depositAddress color: "white" clip: true font.weight: Font.Bold @@ -204,7 +204,7 @@ Item { SideShiftCopyButton { text: qsTr("COPY ADDRESS") anchors.horizontalCenter: parent.horizontalCenter - onClicked: bsApp.copyAddressToClipboard(toAddress) + onClicked: bsApp.copyAddressToClipboard(toAddress.text) } } @@ -220,7 +220,7 @@ Item { anchors.horizontalCenter: parent.horizontalCenter Image { - source: "image://QR/" + root.toAddress + source: "image://QR/" + root.toAddress.text sourceSize.width: 180 sourceSize.height: 180 width: 180 @@ -237,7 +237,7 @@ Item { } Text { - text: qsTr("ESTIMATED NETWORK FEES: ") + networkFee + text: qsTr("ESTIMATED NETWORK FEES: ") + controller.networkFee color: "white" anchors.horizontalCenter: parent.horizontalCenter } @@ -265,6 +265,7 @@ Item { width: 200 color: "lightgray" text: receivingAddress + id: receivingAddress font.weight: Font.Bold clip: true } @@ -282,7 +283,7 @@ Item { Text { color: "lightgray" - text: creationDate + text: controller.creationDate font.weight: Font.Bold anchors.right: parent.right } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml index 78b4d5697..8406d23a4 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml @@ -37,7 +37,7 @@ ComboBox { Image { width: 80 height: 80 - source: model[currentIndex].icon + source: "qrc:/images/sideshift_btc.png" //model[currentIndex].icon anchors.horizontalCenter: parent.horizontalCenter } @@ -92,7 +92,6 @@ ComboBox { bottomPadding: 4 contentItem: Text { - text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml index 810bf8a80..0e3674929 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml @@ -21,22 +21,8 @@ Item { property var controller property bool receive: true - property var receiveModel: [ - { - currency: "BTC", - icon: "qrc:/images/sideshift_btc.png" - }, - { - currency: "ETC", - icon: "qrc:/images/sideshift_btc.png" - } - ] - property var sendModel: [ - { - currency: "BTC", - icon: "qrc:/images/sideshift_btc.png" - } - ] + property var receiveModel: controller.inputCurrencies + property var sendModel: controller.outputCurrencies signal shift() @@ -58,7 +44,7 @@ Item { SideShiftComboboxWithIcon { popupWidth: 200 - textRole: "currency" + //textRole: "currency" controlHint: qsTr("YOU SEND") model: root.receive ? root.receiveModel : root.sendModel } @@ -71,7 +57,7 @@ Item { SideShiftComboboxWithIcon { id: receivingCombobox popupWidth: 200 - textRole: "currency" + //textRole: "currency" controlHint: qsTr("YOU RECEIVE") model: root.receive ? root.sendModel : root.receiveModel } @@ -100,9 +86,9 @@ Item { SideShiftCombobox { id: walletCombobox visible: root.receive - model: walletBalances - textRole: "name" - valueRole: "name" + model: addressListModel + textRole: "address" + valueRole: "address" anchors.horizontalCenter: parent.horizontalCenter } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml index cc34c6d3c..5e4f07e3f 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml @@ -18,6 +18,7 @@ import "../../" PluginPopup { id: root + property var controller: null background: Rectangle { anchors.fill: parent @@ -33,6 +34,7 @@ PluginPopup { SideShiftMainPage { id: mainPage onShift: { + controller.inputCurrencySelected("USDT"); //TODO: should be a selected input currency from previous step if (mainPage.receive) { stackView.replace(buyPage) } From 9b20c1ba18759ece0766178dbf05bf38b1b37ce4 Mon Sep 17 00:00:00 2001 From: YZ Date: Tue, 28 Mar 2023 23:53:09 +0200 Subject: [PATCH 303/436] Wallet properties bugfix --- GUI/QtQuick/QtQuickAdapter.cpp | 3 ++- GUI/QtQuick/QtQuickAdapter.h | 1 + GUI/QtQuick/qml/BsStyles/BSStyle.qml | 2 +- .../Plugins/SideShift/SideShiftBuyPage.qml | 18 ++++++++----- .../Plugins/SideShift/SideShiftMainPage.qml | 9 +++++++ .../qml/Plugins/SideShift/SideShiftPopup.qml | 4 +++ .../qml/StyledControls/CustomButton.qml | 2 +- .../qml/StyledControls/CustomComboBox.qml | 2 +- .../qml/StyledControls/CustomListItem.qml | 1 + .../qml/StyledControls/CustomMediumButton.qml | 2 +- .../qml/StyledControls/CustomSmallButton.qml | 2 +- .../qml/WalletProperties/DeleteWallet.qml | 10 ++++--- .../qml/WalletProperties/DeleteWalletWarn.qml | 17 +++++++++++- .../WalletPropertiesPopup.qml | 21 ++++++++++++--- GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 3 +++ .../viewmodels/plugins/PluginsListModel.cpp | 1 - .../plugins/SideShiftController.cpp | 21 --------------- .../viewmodels/plugins/SideShiftController.h | 27 ------------------- 18 files changed, 76 insertions(+), 70 deletions(-) delete mode 100644 GUI/QtQuick/viewmodels/plugins/SideShiftController.cpp delete mode 100644 GUI/QtQuick/viewmodels/plugins/SideShiftController.h diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 119629fc5..3ec35c73e 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1837,6 +1837,7 @@ bs::message::ProcessingResult QtQuickAdapter::processWalletSeed(const BlockSettl { if (response.bip39_seed().empty()) { emit showError(tr("Failed to obtain wallet seed")); + emit walletSeedAuthFailed(); return bs::message::ProcessingResult::Error; } walletPropertiesModel_->setWalletSeed(response.wallet_id(), response.bip39_seed()); @@ -1880,7 +1881,7 @@ ProcessingResult QtQuickAdapter::processSignTX(const BlockSettle::Common::Signer ProcessingResult QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived& zcs) { - //logger_->debug("[{}] {}", __func__, zcs.DebugString()); + logger_->debug("[{}] {}", __func__, zcs.DebugString()); WalletsMessage msg; auto msgReq = msg.mutable_tx_details_request(); for (const auto& zcEntry : zcs.tx_entries()) { diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 8f07968dd..c76c6d950 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -211,6 +211,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void successChangePassword(); void failedDeleteWallet(); void successDeleteWallet(); + void walletSeedAuthFailed(); private slots: void onArmoryServerChanged(const QModelIndex&, const QVariant&); diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index 7861d5642..139fddde0 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -106,7 +106,7 @@ QtObject { readonly property color comboBoxBorderColor: defaultGreyColor readonly property color comboBoxHoveredBorderColor: wildBlueColor - readonly property color comboBoxFocusedBorderColor: "#FFFFFF" + readonly property color comboBoxFocusedBorderColor: wildBlueColor readonly property color comboBoxPopupedBorderColor: "#45A6FF" readonly property color comboBoxIndicatorColor: "#DCE2FF" diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml index 0f9a3925e..914773587 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml @@ -53,8 +53,7 @@ Item { anchors.verticalCenter: parent.verticalCenter Text { - //id: inputCurrency - //model: controller.inputCurrencies + text: root.inputCurrency color: "lightgray" font.weight: Font.Bold anchors.verticalCenter: parent.verticalCenter @@ -96,7 +95,7 @@ Item { Text { color: "white" - text: qsTr("WAITING FOR YOU TO SEND ") + inputCurrency.currentText + text: qsTr("WAITING FOR YOU TO SEND ") + root.inputCurrency topPadding: 40 font.pixelSize: 24 anchors.horizontalCenter: parent.horizontalCenter @@ -142,7 +141,7 @@ Item { font.pixelSize: 18 } Text { - text: inputCurrency.currentText + text: root.inputCurrency color: "white" font.weight: Font.Bold font.pixelSize: 18 @@ -164,7 +163,7 @@ Item { font.pixelSize: 18 } Text { - text: outputCurrency + text: root.inputCurrency color: "white" font.weight: Font.Bold font.pixelSize: 18 @@ -264,8 +263,7 @@ Item { Text { width: 200 color: "lightgray" - text: receivingAddress - id: receivingAddress + text: root.receivingAddress font.weight: Font.Bold clip: true } @@ -290,4 +288,10 @@ Item { } } } + + onVisibleChanged: { + if (visible) { + console.log('SideShift buy page opened') + } + } } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml index 0e3674929..b4155c8ce 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml @@ -24,6 +24,10 @@ Item { property var receiveModel: controller.inputCurrencies property var sendModel: controller.outputCurrencies + property alias inputCurrency: inputCombobox.currentText + property alias outputCurrency: receivingCombobox.currentText + property alias receivingAddress: walletCombobox.currentText + signal shift() Column { @@ -43,10 +47,15 @@ Item { anchors.horizontalCenter: parent.horizontalCenter SideShiftComboboxWithIcon { + id: inputCombobox popupWidth: 200 //textRole: "currency" controlHint: qsTr("YOU SEND") model: root.receive ? root.receiveModel : root.sendModel + + onActivated: { + root.controller.inputCurrencySelected(currentText) + } } SideShiftIconButton { diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml index 5e4f07e3f..3344edf93 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml @@ -47,6 +47,10 @@ PluginPopup { id: buyPage controller: root.controller visible: false + + inputCurrency: mainPage.inputCurrency + outputCurrency: mainPage.outputCurrency + receivingAddress: mainPage.receivingAddress } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomButton.qml b/GUI/QtQuick/qml/StyledControls/CustomButton.qml index 146b1f6c6..28dc20881 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButton.qml @@ -29,7 +29,7 @@ Button { font.family: "Roboto" font.weight: Font.Bold palette.buttonText: enabled ? BSStyle.buttonsTextColor : BSStyle.buttonsDisabledTextColor - focusPolicy: Qt.NoFocus + focusPolicy: Qt.TabFocus icon.color: "transparent" diff --git a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml index 5ef7ba24f..8de36902f 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml @@ -29,7 +29,7 @@ ComboBox { signal editingFinished() activeFocusOnTab: true - focusPolicy: Qt.NoFocus + focusPolicy: Qt.TabFocus leftPadding: 16 rightPadding: 36 diff --git a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml index 83f6194f9..17b1d27b9 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml @@ -93,6 +93,7 @@ Rectangle { MouseArea { id: mouseArea anchors.fill: parent + hoverEnabled: true onClicked: { rect.clicked() } diff --git a/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml b/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml index 448c74a99..32595c756 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml @@ -22,7 +22,7 @@ Button { width: 136 height: 36 hoverEnabled: true - focusPolicy: Qt.NoFocus + focusPolicy: Qt.TabFocus font.pixelSize: 12 font.family: "Roboto" diff --git a/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml index 03d19b869..8c8860459 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml @@ -19,7 +19,7 @@ Button { width: 134 height: 29 - focusPolicy: Qt.NoFocus + focusPolicy: Qt.TabFocus font.pixelSize: 12 font.family: "Roboto" font.letterSpacing: 0.3 diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml index e5e3d8bfb..c85aa3ed7 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml @@ -98,11 +98,13 @@ ColumnLayout { width: 260 function click_enter() { - if (!bsApp.isWalletPasswordValid(wallet_properties_vm.walletId, password.input_text)){ - showError(qsTr("Password is incorrect")) - init() + if (!wallet_properties_vm.isHardware && !wallet_properties_vm.isWatchingOnly) { + if (!bsApp.isWalletPasswordValid(wallet_properties_vm.walletId, password.input_text)){ + showError(qsTr("Password is incorrect")) + init() - return + return + } } const result = bsApp.deleteWallet( diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml index 4f0586f1c..185824431 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml @@ -15,8 +15,11 @@ ColumnLayout { spacing: 0 signal viewWalletSeed() + signal exportWOWallet() signal deleteWallet() + property var wallet_properties_vm + CustomTitleLabel { id: title Layout.alignment: Qt.AlignCenter @@ -53,7 +56,7 @@ ColumnLayout { CustomButton { text: qsTr("View wallet seed") - + visible: !wallet_properties_vm.isHardware && !wallet_properties_vm.isWatchingOnly Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom @@ -63,6 +66,18 @@ ColumnLayout { onClicked: viewWalletSeed() } + CustomButton { + text: qsTr("Export watching-only wallet") + visible: wallet_properties_vm.isHardware || wallet_properties_vm.isWatchingOnly + + Layout.bottomMargin: 40 + Layout.alignment: Qt.AlignBottom + + width: 260 + + onClicked: exportWOWallet() + } + CustomButton { text: qsTr("Continue") preferred: true diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 77890bc78..613aa2170 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -16,6 +16,17 @@ CustomPopup { _arrow_but_visibility: !properties.visible property var wallet_properties_vm + property bool walletSeedRequested: false + + Connections { + target: bsApp + onWalletSeedAuthFailed: { + if (_stack_view.currentItem == wallet_seed_auth || + _stack_view.currentItem == wallet_seed) { + _stack_view.replace(wallet_seed_auth) + } + } + } RenameWallet { id: rename_wallet @@ -54,7 +65,9 @@ CustomPopup { WalletSeedAuth { id: wallet_seed_auth visible: false - onAuthorized: _stack_view.replace(wallet_seed) + onAuthorized: { + _stack_view.replace(wallet_seed) + } wallet_properties_vm: root.wallet_properties_vm } @@ -69,6 +82,10 @@ CustomPopup { DeleteWalletWarn { id: delete_wallet_warn visible: false + wallet_properties_vm: root.wallet_properties_vm + onExportWOWallet: { + _stack_view.push(export_wo_wallet) + } onViewWalletSeed: { _stack_view.push(wallet_seed_auth) wallet_seed_auth.init() @@ -387,7 +404,5 @@ CustomPopup { } } } - - } } diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index d7b164698..bf5eceafc 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -43,6 +43,9 @@ void WalletPropertiesVM::setWalletInfo(const QString& walletId, const bs::sync:: info_.generatedAddresses = info.nbAddresses; info_.isHardware = info.isHardware; info_.isWatchingOnly = info.watchOnly; + nbUsedAddrs_ = 0; + nbUTXOs_ = 0; + seed_.clear(); emit changed(); } diff --git a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp index a8e589807..feddcaef3 100644 --- a/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp +++ b/GUI/QtQuick/viewmodels/plugins/PluginsListModel.cpp @@ -9,7 +9,6 @@ */ #include "PluginsListModel.h" -#include "SideShiftController.h" #include namespace diff --git a/GUI/QtQuick/viewmodels/plugins/SideShiftController.cpp b/GUI/QtQuick/viewmodels/plugins/SideShiftController.cpp deleted file mode 100644 index 934c933a0..000000000 --- a/GUI/QtQuick/viewmodels/plugins/SideShiftController.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2023, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -#include "SideShiftController.h" - -SideShiftController::SideShiftController(QObject* parent) - : QObject(parent) -{ -} - -QString SideShiftController::conversionRate() const -{ - return tr("1 BTC = 1 ETC"); -} diff --git a/GUI/QtQuick/viewmodels/plugins/SideShiftController.h b/GUI/QtQuick/viewmodels/plugins/SideShiftController.h deleted file mode 100644 index 81d8696bd..000000000 --- a/GUI/QtQuick/viewmodels/plugins/SideShiftController.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2023, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -#pragma once - -#include - -class SideShiftController: public QObject -{ - Q_OBJECT - Q_PROPERTY(QString conversionRate READ conversionRate NOTIFY changed) - -public: - SideShiftController(QObject* parent = nullptr); - - QString conversionRate() const; - -signals: - void changed(); -}; From 691a91ab0f3acd03ea38b4f5695822665331b976 Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 29 Mar 2023 07:28:32 +0200 Subject: [PATCH 304/436] Review fixes --- GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml | 6 +++--- GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml | 9 --------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml index b4155c8ce..edc8bc7a3 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml @@ -26,7 +26,7 @@ Item { property alias inputCurrency: inputCombobox.currentText property alias outputCurrency: receivingCombobox.currentText - property alias receivingAddress: walletCombobox.currentText + property alias receivingAddress: addressCombobox.currentText signal shift() @@ -93,7 +93,7 @@ Item { } SideShiftCombobox { - id: walletCombobox + id: addressCombobox visible: root.receive model: addressListModel textRole: "address" @@ -103,7 +103,7 @@ Item { SideShiftButton { text: qsTr("SHIFT") - enabled: root.receive ? walletCombobox.currentIndex >= 0 : addressInput.text !== "" + enabled: root.receive ? addressCombobox.currentIndex >= 0 : addressInput.text !== "" anchors.horizontalCenter: parent.horizontalCenter onClicked: root.shift() } diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml index c85aa3ed7..1beee5930 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml @@ -98,15 +98,6 @@ ColumnLayout { width: 260 function click_enter() { - if (!wallet_properties_vm.isHardware && !wallet_properties_vm.isWatchingOnly) { - if (!bsApp.isWalletPasswordValid(wallet_properties_vm.walletId, password.input_text)){ - showError(qsTr("Password is incorrect")) - init() - - return - } - } - const result = bsApp.deleteWallet( wallet_properties_vm.walletId, password.input_text From 76364fb6990561e5edd171b30639947abcc2bae8 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Wed, 29 Mar 2023 10:00:11 +0300 Subject: [PATCH 305/436] [QT-19] export w/o wallet --- GUI/QtQuick/qml/ExplorerPage.qml | 7 +++ GUI/QtQuick/qml/ExplorerTX.qml | 2 +- .../StyledControls/CustomSuccessDialog.qml | 54 +++++++++++++++++++ .../WalletPropertiesPopup.qml | 21 ++++++-- GUI/QtQuick/qtquick.qrc | 1 + 5 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 GUI/QtQuick/qml/StyledControls/CustomSuccessDialog.qml diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml index e03a33104..0899db00c 100644 --- a/GUI/QtQuick/qml/ExplorerPage.qml +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -142,14 +142,21 @@ Item { explorerAddress.address = expSearchBox.text bsApp.startAddressSearch(explorerAddress.address) explorerStack.replace(explorerAddress) + expSearchBox.text = "" } else if (rc === 2) { // TXid entered explorerTX.tx = bsApp.getTXDetails(expSearchBox.text) explorerStack.replace(explorerTX) + expSearchBox.text = "" } } onAccepted: requestSearch() + onTextEdited: { + if (bsApp.getSearchInputType(expSearchBox.text) != 0) { + requestSearch() + } + } Text { text: qsTr("Search for transaction or address") diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index 101fa52f0..db67cf337 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -192,7 +192,7 @@ Item { Row { spacing: 24 width: parent.width - height: 500 + height: 450 Rectangle { height: parent.height diff --git a/GUI/QtQuick/qml/StyledControls/CustomSuccessDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomSuccessDialog.qml new file mode 100644 index 000000000..652cddd70 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomSuccessDialog.qml @@ -0,0 +1,54 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" + +Window { + id: root + + property alias details_text: success.details_text + + signal sig_finish() + + visible: true + flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog + modality: Qt.WindowModal + + height: 430 + width: 580 + + color: "transparent" + + x: mainWindow.x + (mainWindow.width - width)/2 + y: mainWindow.y + (mainWindow.height - height)/2 + + Rectangle { + + id: rect + + color: "#191E2A" + opacity: 1 + radius: 16 + + anchors.fill: parent + + border.color : BSStyle.defaultBorderColor + border.width : 1 + + CustomSuccessWidget { + id: success + + anchors.topMargin: 24 + anchors.fill: parent + details_font_size: 16 + details_font_weight: Font.Medium + + onSig_finish: { + root.close() + root.sig_finish() + } + } + } +} \ No newline at end of file diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 77890bc78..c44a5335b 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -46,8 +46,13 @@ CustomPopup { wallet_properties_vm: root.wallet_properties_vm onSig_success: (nameExport, pathExport) => { - _stack_view.push(success) - success.details_text = qsTr("Your watching-only wallet has successfully been exported\n\nFilename:\t%1\nFolder:\t%2").arg(nameExport).arg(pathExport) + root.close_click() + + success_dialog.details_text = qsTr("Your watching-only wallet has successfully been exported\n\nFilename:\t%1\nFolder:\t%2").arg(nameExport).arg(pathExport) + + success_dialog.show() + success_dialog.raise() + success_dialog.requestActivate() } } @@ -108,6 +113,16 @@ CustomPopup { } } + CustomSuccessDialog { + id: success_dialog + + visible: false + onSig_finish: { + //root.close() + root.close_click() + } + } + Rectangle { id: properties height: 548 @@ -159,7 +174,7 @@ CustomPopup { } Image { - id: close_button + id: rename_button x: parent.horizontalCenter - 10 y: wallet_name.top diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 5ae4af4c2..1f7ed3eca 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -182,6 +182,7 @@ qml/StyledControls/CustomHorizontalHeaderView.qml qml/StyledControls/CustomRbfCpfpMenu.qml qml/StyledControls/CustomSuccessWidget.qml + qml/StyledControls/CustomSuccessDialog.qml qml/Settings/AddArmoryServer.qml images/delete_custom_server.svg qml/Settings/DeleteArmoryServer.qml From e2e43d3b9db41f8c8beb4159ae6e0602effa6d37 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Wed, 29 Mar 2023 12:26:54 +0300 Subject: [PATCH 306/436] [QT-53] minimum password length --- .../qml/CreateWallet/ConfirmPassword.qml | 67 ++++++++-- .../StyledControls/CustomMessageDialog.qml | 6 +- .../StyledControls/CustomSuccessDialog.qml | 54 ++++++++ .../qml/StyledControls/CustomTextInput.qml | 10 ++ .../qml/WalletProperties/ChangePassword.qml | 115 +++++++++++++++--- .../WalletPropertiesPopup.qml | 23 +++- GUI/QtQuick/qtquick.qrc | 1 + 7 files changed, 243 insertions(+), 33 deletions(-) create mode 100644 GUI/QtQuick/qml/StyledControls/CustomSuccessDialog.qml diff --git a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml index bccdaaad9..63079a2c9 100644 --- a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml @@ -27,7 +27,7 @@ ColumnLayout { CustomMessageDialog { id: error_dialog - error: qsTr("Password strength is insufficient") + error: qsTr("Password strength is insufficient,\nplease use at least 6 characters") visible: false } @@ -49,20 +49,46 @@ ColumnLayout { title_text: qsTr("Password") - Keys.onEnterPressed: { - checkPasswordLength() - confirm_password.setActiveFocus() + onEnterPressed: { + click_enter() } - Keys.onReturnPressed: { - checkPasswordLength() - confirm_password.setActiveFocus() + onReturnPressed: { + click_enter() } onTabNavigated: { - checkPasswordLength() - confirm_password.setActiveFocus() + if(checkPasswordLength()) { + confirm_password.setActiveFocus() + } + else { + password.setActiveFocus() + } } onBackTabNavigated: { - checkPasswordLength() + if(checkPasswordLength()) { + if (confirm_but.enabled) { + confirm_but.setActiveFocus() + } + else { + confirm_password.setActiveFocus() + } + } + else { + password.setActiveFocus() + } + } + + function click_enter() { + if (confirm_but.enabled) { + confirm_but.click_enter() + } + else { + if (checkPasswordLength()) { + confirm_password.setActiveFocus() + } + else { + password.setActiveFocus() + } + } } } @@ -83,6 +109,25 @@ ColumnLayout { isHiddenText: true title_text: qsTr("Confirm Password") + + onEnterPressed: { + confirm_but.click_enter() + } + onReturnPressed: { + confirm_but.click_enter() + } + + onTabNavigated: { + if (confirm_but.enabled) { + confirm_but.setActiveFocus() + } + else { + password.setActiveFocus() + } + } + onBackTabNavigated: { + password.setActiveFocus() + } } Label { @@ -149,6 +194,8 @@ ColumnLayout { error_dialog.show() error_dialog.raise() error_dialog.requestActivate() + return false } + return true } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml index 6e05cdd62..f201052cb 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml @@ -44,7 +44,7 @@ Window { id: tytleLabel anchors.top: rect.top - anchors.topMargin: 8 + anchors.topMargin: 16 anchors.horizontalCenter: rect.horizontalCenter color: "#E2E7FF" @@ -60,8 +60,8 @@ Window { Label { id: errorLabel - anchors.bottom: ok_but.top - anchors.bottomMargin: 70 + anchors.top: tytleLabel.bottom + anchors.topMargin: 20 anchors.horizontalCenter: rect.horizontalCenter color: "#E2E7FF" diff --git a/GUI/QtQuick/qml/StyledControls/CustomSuccessDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomSuccessDialog.qml new file mode 100644 index 000000000..652cddd70 --- /dev/null +++ b/GUI/QtQuick/qml/StyledControls/CustomSuccessDialog.qml @@ -0,0 +1,54 @@ +import QtQuick 2.12 +import QtQuick.Window 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.15 + +import "../BsStyles" + +Window { + id: root + + property alias details_text: success.details_text + + signal sig_finish() + + visible: true + flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog + modality: Qt.WindowModal + + height: 430 + width: 580 + + color: "transparent" + + x: mainWindow.x + (mainWindow.width - width)/2 + y: mainWindow.y + (mainWindow.height - height)/2 + + Rectangle { + + id: rect + + color: "#191E2A" + opacity: 1 + radius: 16 + + anchors.fill: parent + + border.color : BSStyle.defaultBorderColor + border.width : 1 + + CustomSuccessWidget { + id: success + + anchors.topMargin: 24 + anchors.fill: parent + details_font_size: 16 + details_font_weight: Font.Medium + + onSig_finish: { + root.close() + root.sig_finish() + } + } + } +} \ No newline at end of file diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index 9d566561d..d4e3fb231 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -43,6 +43,8 @@ Rectangle { signal activeFocusChanged() signal tabNavigated() signal backTabNavigated() + signal enterPressed() + signal returnPressed() color: "#020817" @@ -100,6 +102,14 @@ Rectangle { font.weight: Font.Normal } + Keys.onEnterPressed: { + enterPressed() + } + + Keys.onReturnPressed: { + returnPressed() + } + onTextEdited : { rect.textEdited() } diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml index b17050367..f1bd89a67 100644 --- a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -29,7 +29,7 @@ ColumnLayout { CustomMessageDialog { id: error_dialog - error: qsTr("Password strength is insufficient") + error: qsTr("Password strength is insufficient,\nplease use at least 6 characters") visible: false } @@ -56,6 +56,35 @@ ColumnLayout { isPassword: true isHiddenText: true + + onEnterPressed: { + click_enter() + } + + onReturnPressed: { + click_enter() + } + + onTabNavigated: { + new_password.setActiveFocus() + } + onBackTabNavigated: { + if (confirm_but.enabled){ + confirm_but.setActiveFocus() + } + else { + confirm_password.setActiveFocus() + } + } + + function click_enter() { + if (confirm_but.enabled) { + confirm_but.click_enter() + } + else { + new_password.setActiveFocus() + } + } } CustomTextInput { @@ -76,21 +105,43 @@ ColumnLayout { isPassword: true isHiddenText: true - Keys.onEnterPressed: { - checkPasswordLength() - confirm_password.setActiveFocus() + onEnterPressed: { + click_enter() } - Keys.onReturnPressed: { - checkPasswordLength() - confirm_password.setActiveFocus() + + onReturnPressed: { + click_enter() } + onTabNavigated: { - checkPasswordLength() - confirm_password.setActiveFocus() + if (checkPasswordLength()) { + confirm_password.setActiveFocus() + } + else { + new_password.setActiveFocus() + } } onBackTabNavigated: { - checkPasswordLength() - password.setActiveFocus() + if (checkPasswordLength()) { + password.setActiveFocus() + } + else { + new_password.setActiveFocus() + } + } + + function click_enter() { + if (confirm_but.enabled) { + confirm_but.click_enter() + } + else { + if (checkPasswordLength()) { + confirm_password.setActiveFocus() + } + else { + new_password.setActiveFocus() + } + } } } @@ -110,6 +161,30 @@ ColumnLayout { isPassword: true isHiddenText: true + + onEnterPressed: { + click_enter() + } + + onReturnPressed: { + click_enter() + } + + onTabNavigated: { + if (confirm_but.enabled) { + confirm_but.setActiveFocus() + } + else { + password.setActiveFocus() + } + } + onBackTabNavigated: new_password.setActiveFocus() + + function click_enter() { + if (confirm_but.enabled) { + confirm_but.click_enter() + } + } } Label { @@ -133,6 +208,10 @@ ColumnLayout { && (new_password.input_text === confirm_password.input_text) function click_enter() { + if (!confirm_but.enabled) { + return + } + const result = bsApp.changePassword( wallet_properties_vm.walletId, password.input_text, @@ -145,13 +224,13 @@ ColumnLayout { } } - Keys.onEnterPressed: { - confirm_but.click_enter() - } + // Keys.onEnterPressed: { + // confirm_but.click_enter() + // } - Keys.onReturnPressed: { - confirm_but.click_enter() - } + // Keys.onReturnPressed: { + // confirm_but.click_enter() + // } function init() { @@ -175,6 +254,8 @@ ColumnLayout { error_dialog.show() error_dialog.raise() error_dialog.requestActivate() + return false } + return true } } diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 77890bc78..5c6a7d468 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -17,6 +17,9 @@ CustomPopup { property var wallet_properties_vm + x: mainWindow.x + (mainWindow.width - width)/2 + y: mainWindow.y + (mainWindow.height - height)/2 + RenameWallet { id: rename_wallet visible: false @@ -46,8 +49,13 @@ CustomPopup { wallet_properties_vm: root.wallet_properties_vm onSig_success: (nameExport, pathExport) => { - _stack_view.push(success) - success.details_text = qsTr("Your watching-only wallet has successfully been exported\n\nFilename:\t%1\nFolder:\t%2").arg(nameExport).arg(pathExport) + root.close_click() + + success_dialog.details_text = qsTr("Your watching-only wallet has successfully been exported\n\nFilename:\t%1\nFolder:\t%2").arg(nameExport).arg(pathExport) + + success_dialog.show() + success_dialog.raise() + success_dialog.requestActivate() } } @@ -108,6 +116,15 @@ CustomPopup { } } + CustomSuccessDialog { + id: success_dialog + + visible: false + onSig_finish: { + root.close_click() + } + } + Rectangle { id: properties height: 548 @@ -159,7 +176,7 @@ CustomPopup { } Image { - id: close_button + id: rename_button x: parent.horizontalCenter - 10 y: wallet_name.top diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 5ae4af4c2..1f7ed3eca 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -182,6 +182,7 @@ qml/StyledControls/CustomHorizontalHeaderView.qml qml/StyledControls/CustomRbfCpfpMenu.qml qml/StyledControls/CustomSuccessWidget.qml + qml/StyledControls/CustomSuccessDialog.qml qml/Settings/AddArmoryServer.qml images/delete_custom_server.svg qml/Settings/DeleteArmoryServer.qml From 5116c8ddc83065da31d08acb189c5bbbec811f0f Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Wed, 29 Mar 2023 14:32:47 +0300 Subject: [PATCH 307/436] [QT-55] Import watching only wallet --- GUI/QtQuick/qml/CreateWallet/CreateWallet.qml | 2 ++ GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml index 80b25b2ac..c587b6809 100644 --- a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml @@ -156,6 +156,8 @@ CustomPopup { _stack_view.pop() _stack_view.replace(start_create, StackView.Immediate) start_create.init() + + import_watching_wallet.init() } } } diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml index 00f13dd2e..759c916a5 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml @@ -131,6 +131,7 @@ ColumnLayout { FileDialog { id: fileDialog visible: false + folder: shortcuts.documents onAccepted: { dashed_border.state = "clicked" @@ -188,4 +189,8 @@ ColumnLayout { return (str.slice(str.lastIndexOf("/")+1)) } + function init() { + chosenFilename = "" + } + } From 7320cd2e73f3bc427c5a33b907ca971a81219d64 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Wed, 29 Mar 2023 15:24:15 +0300 Subject: [PATCH 308/436] [QT-85] small tweak to wizard --- .../qml/CreateWallet/WalletSeedSkipAccept.qml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml index cbe378327..6d3c9f352 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml @@ -69,30 +69,30 @@ ColumnLayout { Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter CustomButton { - id: skip_but - text: qsTr("Yes, Skip") + id: no_but + text: qsTr("No") width: 261 preferred: false function click_enter() { - layout.sig_skip() + layout.sig_not_skip() } + } CustomButton { - id: no_but - text: qsTr("No") + id: skip_but + text: qsTr("Yes, Skip") width: 261 preferred: true function click_enter() { - layout.sig_not_skip() + layout.sig_skip() } - } - } + } function init() { From be2e8946d873097d116e6187f79d4b31345c6d99 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Wed, 29 Mar 2023 18:38:44 +0300 Subject: [PATCH 309/436] [QT-80] Desktop tray icon --- BlockSettleApp/blocksettle.ico | Bin 399142 -> 290950 bytes GUI/QtQuick/images/terminal.ico | Bin 399142 -> 290950 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/BlockSettleApp/blocksettle.ico b/BlockSettleApp/blocksettle.ico index 511034bb59228c863685df06785fce7ff1e73bb7..3b9b2b731779bcd515c0e967386f77e19cbbcf4c 100644 GIT binary patch delta 107 zcmZ3sPNMChpeq9dBLfSAfB=YAV8~!$U~pq#V33f2@H;pe7}f#B92_8g4JQT$Gd`dK qAONY?P+(z*3t-sT`jvO{DHjc=cBb!)K+FWh%s|Yto#{KPiUI&vVHAb{ literal 399142 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 Date: Wed, 29 Mar 2023 17:41:39 +0200 Subject: [PATCH 310/436] Currency; network --- GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml index edc8bc7a3..8f462a617 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml @@ -35,7 +35,7 @@ Item { spacing: 20 Text { - text: root.controller !== null ? root.controller.conversionRate : "" + text: "1 " + inputCurrency + " = " + controller.conversionRate + " " + outputCurrency color: "gray" font.pixelSize: 14 font.family: "Roboto" @@ -72,6 +72,13 @@ Item { } } + SideShiftCombobox { + id: networksController + // model: controller.inputNetworks + model: ['Network 1', 'Network 2'] + anchors.horizontalCenter: parent.horizontalCenter + } + Item { width: 1 height: 20 From 7d60ba68b22b2194ebd7edbaaa25e0315a5a8e83 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 29 Mar 2023 20:20:28 +0300 Subject: [PATCH 311/436] [WIP] SideShift.ai plugin implementation - day 2 --- GUI/QtQuick/LeverexPlugin.h | 8 +- GUI/QtQuick/Plugin.h | 8 +- GUI/QtQuick/QtQuickAdapter.cpp | 7 +- GUI/QtQuick/QtQuickAdapter.h | 5 +- GUI/QtQuick/SideshiftPlugin.cpp | 164 +++++++++++++++++- GUI/QtQuick/SideshiftPlugin.h | 47 +++-- GUI/QtQuick/SideswapPlugin.h | 8 +- .../SideShift/SideShiftComboboxWithIcon.qml | 4 +- .../Plugins/SideShift/SideShiftMainPage.qml | 23 ++- 9 files changed, 228 insertions(+), 46 deletions(-) diff --git a/GUI/QtQuick/LeverexPlugin.h b/GUI/QtQuick/LeverexPlugin.h index e9785715a..d6f37ea9f 100644 --- a/GUI/QtQuick/LeverexPlugin.h +++ b/GUI/QtQuick/LeverexPlugin.h @@ -18,10 +18,10 @@ class LeverexPlugin: public Plugin public: LeverexPlugin(QObject *parent); - QString name() override { return QLatin1Literal("Leverex"); } - QString description() override { return tr("Leverage made simple"); } - QString icon() override { return QLatin1Literal("qrc:/images/leverex_plugin.png"); } - QString path() override { return {}; } + QString name() const override { return QLatin1Literal("Leverex"); } + QString description() const override { return tr("Leverage made simple"); } + QString icon() const override { return QLatin1Literal("qrc:/images/leverex_plugin.png"); } + QString path() const override { return {}; } Q_INVOKABLE void init() override {} diff --git a/GUI/QtQuick/Plugin.h b/GUI/QtQuick/Plugin.h index ab2b7ed17..958ebf6e1 100644 --- a/GUI/QtQuick/Plugin.h +++ b/GUI/QtQuick/Plugin.h @@ -17,10 +17,10 @@ class Plugin: public QObject public: Plugin(QObject *parent); - virtual QString name() = 0; - virtual QString description() = 0; - virtual QString icon() = 0; - virtual QString path() = 0; + virtual QString name() const = 0; + virtual QString description() const = 0; + virtual QString icon() const = 0; + virtual QString path() const = 0; Q_INVOKABLE virtual void init() = 0; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 3ec35c73e..76b0d6cff 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -336,7 +335,7 @@ void QtQuickAdapter::run(int &argc, char **argv) updateStates(); requestInitialSettings(); - loadPlugins(); + loadPlugins(engine); logger_->debug("[QtGuiAdapter::run] initial setup done"); app.exec(); @@ -838,10 +837,10 @@ void QtQuickAdapter::setTopBlock(uint32_t topBlock) txInputsModel_->setTopBlock(topBlock); } -void QtQuickAdapter::loadPlugins() +void QtQuickAdapter::loadPlugins(QQmlApplicationEngine& engine) { // load embedded plugins pluginsListModel_->addPlugins({ new LeverexPlugin(this) - , new SideshiftPlugin(logger_, this) + , new SideshiftPlugin(logger_, engine, this) , new SideswapPlugin(this) }); //TODO: send broadcast to request 3rd-party plugins loading diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index c76c6d950..3be298e3b 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -12,9 +12,8 @@ #define QT_QUICK_ADAPTER_H #include - +#include #include - #include "Address.h" #include "ArmoryServersModel.h" #include "AddressListModel.h" @@ -235,7 +234,7 @@ private slots: void splashProgressCompleted(); void updateStates(); void setTopBlock(uint32_t); - void loadPlugins(); + void loadPlugins(QQmlApplicationEngine&); void createWallet(bool primary); std::string hdWalletIdByIndex(int); diff --git a/GUI/QtQuick/SideshiftPlugin.cpp b/GUI/QtQuick/SideshiftPlugin.cpp index 23fa300ec..3b987ecf4 100644 --- a/GUI/QtQuick/SideshiftPlugin.cpp +++ b/GUI/QtQuick/SideshiftPlugin.cpp @@ -10,16 +10,32 @@ */ #include "SideshiftPlugin.h" #include +#include #include #include #include using json = nlohmann::json; -SideshiftPlugin::SideshiftPlugin(const std::shared_ptr& logger, QObject* parent) +class CoinImageProvider : public QQuickImageProvider +{ +public: + CoinImageProvider(SideshiftPlugin* parent) + : QQuickImageProvider(QQuickImageProvider::Pixmap), parent_(parent) + {} + QPixmap requestPixmap(const QString& id, QSize* size, const QSize& requestedSize) override; + +private: + SideshiftPlugin* parent_; +}; + + +SideshiftPlugin::SideshiftPlugin(const std::shared_ptr& logger + , QQmlApplicationEngine& engine, QObject* parent) : Plugin(parent), logger_(logger) { qmlRegisterInterface("SideshiftPlugin"); + engine.addImageProvider(QLatin1Literal("coin"), new CoinImageProvider(this)); outputCurrencies_.append(QLatin1Literal("BTC")); } @@ -71,9 +87,11 @@ void SideshiftPlugin::init() const auto& msg = json::parse(response); for (const auto& coin : msg) { const auto& currency = coin["coin"].get(); - //if (currency != "BTC") { - inputCurrencies_.append(QString::fromStdString(currency)); - //} + auto& networks = networksByCur_[currency]; + for (const auto& network : coin["networks"]) { + networks.append(QString::fromStdString(network.get())); + } + inputCurrencies_.append(QString::fromStdString(currency)); } logger_->debug("[{}] {} input currencies", __func__, inputCurrencies_.size()); emit inited(); @@ -86,7 +104,14 @@ void SideshiftPlugin::init() void SideshiftPlugin::deinit() { + networksByCur_.clear(); inputCurrencies_.clear(); + inputNetworks_.clear(); + inputNetwork_.clear(); + inputCurrency_.clear(); + convRate_.clear(); + orderId_.clear(); + if (curlHeaders_) { curl_slist_free_all(curlHeaders_); curlHeaders_ = nullptr; @@ -97,6 +122,44 @@ void SideshiftPlugin::deinit() } } +void SideshiftPlugin::setInputNetwork(const QString& network) +{ + logger_->debug("[{}] {} '{}' -> '{}'", __func__, inputCurrency_.toStdString() + , inputNetwork_.toStdString(), network.toStdString()); + if (inputCurrency_.isEmpty() || (inputNetwork_ == network)) { + return; + } + inputNetwork_ = network; + const auto& response = get("/pair/" + inputCurrency_.toStdString() + "-" + + network.toStdString() + "/btc-bitcoin"); + try { + const auto& respJson = json::parse(response); + double rate = 0; + if (respJson["rate"].is_string()) { + rate = std::stod(respJson["rate"].get()); + } + else if (respJson["rate"].is_number_float()) { + rate = respJson["rate"].get(); + } + if (rate > 0) { + if (rate < 0.0001) { + convRate_ = tr("1 BTC = %1 %2").arg(QString::number(1.0 / rate, 'f', 2)) + .arg(inputCurrency_.toUpper()); + } + else { + convRate_ = tr("1 %1 = %2 BTC").arg(inputCurrency_.toUpper()) + .arg(QString::number(rate, 'f', 6)); + } + } + minAmount_ = QString::fromStdString(respJson["min"].get()); + maxAmount_ = QString::fromStdString(respJson["max"].get()); + } + catch (const json::exception& e) { + logger_->error("[{}] failed to parse {}: {}", __func__, response, e.what()); + } + emit inputSelected(); +} + std::string SideshiftPlugin::get(const std::string& request) { if (!curl_) { @@ -119,9 +182,98 @@ std::string SideshiftPlugin::get(const std::string& request) return response; } +std::string SideshiftPlugin::post(const std::string& path, const std::string& data) +{ + return std::string(); +} + void SideshiftPlugin::inputCurrencySelected(const QString& cur) { - logger_->debug("{{}] {}", __func__, cur.toStdString()); - depositAddr_.clear(); + logger_->debug("{{}] '{}' -> '{}'", __func__, inputCurrency_.toStdString() + , cur.toStdString()); + if (inputCurrency_ == cur) { + return; + } + inputCurrency_ = cur; + try { + inputNetworks_ = networksByCur_.at(cur.toStdString()); + } + catch (const std::exception&) { + inputNetworks_.clear(); + } emit inputCurSelected(); } + +static QString statusToQString(const std::string& s) +{ //TODO: should be translatable at some point + return QString::fromStdString(s); +} + +bool SideshiftPlugin::sendShift(const QString& recvAddr) +{ + if (inputCurrency_.isEmpty() || inputNetwork_.isEmpty() || recvAddr.isEmpty()) { + logger_->error("[{}] invalid input data: inCur: '{}', inNet: '{}', recvAddr: '{}'" + , __func__, inputCurrency_.toStdString(), inputNetwork_.toStdString(), recvAddr.toStdString()); + return false; + } + const json msgReq{ {"settleAddress", recvAddr.toStdString()}, {"affiliateId", affiliateId_} + , {"settleCoin", "btc"}, {"depositCoin", inputCurrency_.toStdString()} + , {"depositNetwork", inputNetwork_.toStdString()} }; + const auto& response = post("/shifts/variable", msgReq.dump()); + try { + const auto& msgResp = json::parse(response); + orderId_ = QString::fromStdString(msgResp["id"].get()); + creationDate_ = QString::fromStdString(msgResp["createdAt"].get()); + expireDate_ = QString::fromStdString(msgResp["expiresAt"].get()); + depositAddr_ = QString::fromStdString(msgResp["depositAddress"].get()); + shiftStatus_ = statusToQString(msgResp["status"].get()); + } + catch (const std::exception& e) { + logger_->error("[{}] failed to parse {}: {}", __func__, response, e.what()); + return false; + } + emit orderSent(); + return true; +} + +void SideshiftPlugin::updateShiftStatus() +{ + if (orderId_.isEmpty()) { + return; + } + const auto& response = get("/shifts/" + orderId_.toStdString()); + try { + const auto& msgResp = json::parse(response); + shiftStatus_ = statusToQString(msgResp["status"].get()); + emit orderSent(); + } + catch (const std::exception& e) { + logger_->error("[{}] failed to parse {}: {}", __func__, response, e.what()); + } +} + + +#include +#include +QPixmap CoinImageProvider::requestPixmap(const QString& id, QSize* size + , const QSize& requestedSize) +{ + const std::string request = "/coins/icon/" + id.toStdString(); + const auto& response = parent_->get(request); + parent_->logger_->debug("[{}] {} returned {} bytes", __func__, request + , response.size()); + if (response.empty()) { + return {}; + } + if (response.at(0) == '{') { //likely an error in json + return {}; + } + QSvgRenderer r(QByteArray::fromStdString(response)); + QImage img(requestedSize, QImage::Format_ARGB32); + QPainter p(&img); + r.render(&p); + if (size) { + *size = requestedSize; + } + return QPixmap::fromImage(img); +} diff --git a/GUI/QtQuick/SideshiftPlugin.h b/GUI/QtQuick/SideshiftPlugin.h index 4df81e826..70396905f 100644 --- a/GUI/QtQuick/SideshiftPlugin.h +++ b/GUI/QtQuick/SideshiftPlugin.h @@ -12,39 +12,48 @@ #include "Plugin.h" #include +#include namespace spdlog { class logger; } +class CoinImageProvider; class SideshiftPlugin: public Plugin { + friend class CoinImageProvider; Q_OBJECT public: - SideshiftPlugin(const std::shared_ptr&, QObject *parent); + SideshiftPlugin(const std::shared_ptr&, QQmlApplicationEngine & + , QObject *parent); ~SideshiftPlugin() override; - QString name() override { return QLatin1Literal("SideShift.ai"); } - QString description() override { return tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies"); } - QString icon() override { return QLatin1Literal("qrc:/images/sideshift_plugin.png"); } - QString path() override { return QLatin1Literal("qrc:/qml/Plugins/SideShift/SideShiftPopup.qml"); } + QString name() const override { return QLatin1Literal("SideShift.ai"); } + QString description() const override { return tr("Shift between BTC, ETH, BCH, XMR, USDT and 90+ other cryptocurrencies"); } + QString icon() const override { return QLatin1Literal("qrc:/images/sideshift_plugin.png"); } + QString path() const override { return QLatin1Literal("qrc:/qml/Plugins/SideShift/SideShiftPopup.qml"); } Q_PROPERTY(QStringList inputCurrencies READ inputCurrencies NOTIFY inited) QStringList inputCurrencies() const { return inputCurrencies_; } Q_PROPERTY(QStringList outputCurrencies READ outputCurrencies NOTIFY inited) QStringList outputCurrencies() const { return outputCurrencies_; } - Q_PROPERTY(QString depositAddress READ depositAddress WRITE setDepositAddr NOTIFY inputCurSelected) - QString depositAddress() const { return depositAddr_; } - void setDepositAddr(const QString& addr) { depositAddr_ = addr; } - Q_PROPERTY(QString conversionRate READ conversionRate NOTIFY inputCurSelected) + Q_PROPERTY(QStringList inputNetworks READ inputNetworks NOTIFY inputCurSelected) + QStringList inputNetworks() const { return inputNetworks_; } + + Q_PROPERTY(QString conversionRate READ conversionRate NOTIFY inputSelected) QString conversionRate() const { return convRate_; } - Q_PROPERTY(QString networkFee READ networkFee NOTIFY inputCurSelected) - QString networkFee() const { return networkFee_; } - Q_PROPERTY(QString minAmount READ minAmount NOTIFY inputCurSelected) + Q_PROPERTY(QString minAmount READ minAmount NOTIFY inputSelected) QString minAmount() const { return minAmount_; } - Q_PROPERTY(QString maxAmount READ maxAmount NOTIFY inputCurSelected) + Q_PROPERTY(QString maxAmount READ maxAmount NOTIFY inputSelected) QString maxAmount() const { return maxAmount_; } + Q_PROPERTY(QString inputNetwork READ inputNetwork WRITE setInputNetwork NOTIFY inputSelected) + QString inputNetwork() const { return inputNetwork_; } + void setInputNetwork(const QString&); + Q_PROPERTY(QString networkFee READ networkFee NOTIFY orderSent) + QString networkFee() const { return networkFee_; } + Q_PROPERTY(QString depositAddress READ depositAddress NOTIFY orderSent) + QString depositAddress() const { return depositAddr_; } Q_PROPERTY(QString orderId READ orderId NOTIFY orderSent) QString orderId() const { return orderId_; } Q_PROPERTY(QString creationDate READ creationDate NOTIFY orderSent) @@ -52,27 +61,37 @@ class SideshiftPlugin: public Plugin Q_INVOKABLE void init() override; Q_INVOKABLE void inputCurrencySelected(const QString& cur); + Q_INVOKABLE bool sendShift(const QString& recvAddr); + Q_INVOKABLE void updateShiftStatus(); signals: void inited(); void inputCurSelected(); + void inputSelected(); void orderSent(); private: void deinit(); std::string get(const std::string& request); + std::string post(const std::string& path, const std::string& data); private: std::shared_ptr logger_; const std::string baseURL_{"https://sideshift.ai/api/v2"}; + const std::string affiliateId_{"a9KgPNzTn"}; struct curl_slist* curlHeaders_{ NULL }; void* curl_{ nullptr }; QStringList inputCurrencies_, outputCurrencies_; + std::unordered_map networksByCur_; + QStringList inputNetworks_; + QString inputNetwork_; + QString inputCurrency_; QString convRate_; QString depositAddr_; QString networkFee_; QString minAmount_, maxAmount_; - QString creationDate_; + QString creationDate_, expireDate_; QString orderId_; + QString shiftStatus_; }; diff --git a/GUI/QtQuick/SideswapPlugin.h b/GUI/QtQuick/SideswapPlugin.h index fd6bc32c6..edef556e1 100644 --- a/GUI/QtQuick/SideswapPlugin.h +++ b/GUI/QtQuick/SideswapPlugin.h @@ -18,10 +18,10 @@ class SideswapPlugin: public Plugin public: SideswapPlugin(QObject *parent); - QString name() override { return QLatin1Literal("SideSwap.io"); } - QString description() override { return tr("Easiest way to get started on the Liquid Network"); } - QString icon() override { return QLatin1Literal("qrc:/images/sideswap_plugin.png"); } - QString path() override { return QLatin1Literal("qrc:/qml/Plugins/SideSwap/SideSwapPopup.qml"); } + QString name() const override { return QLatin1Literal("SideSwap.io"); } + QString description() const override { return tr("Easiest way to get started on the Liquid Network"); } + QString icon() const override { return QLatin1Literal("qrc:/images/sideswap_plugin.png"); } + QString path() const override { return QLatin1Literal("qrc:/qml/Plugins/SideSwap/SideSwapPopup.qml"); } Q_INVOKABLE void init() override {} diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml index 8406d23a4..ccbb608c5 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml @@ -22,6 +22,7 @@ ComboBox { property string controlHint property int popupWidth + property var networkControl: null activeFocusOnTab: true @@ -37,7 +38,8 @@ ComboBox { Image { width: 80 height: 80 - source: "qrc:/images/sideshift_btc.png" //model[currentIndex].icon + source: (networkControl === null) ? "qrc:/images/sideshift_btc.png" + : "image://coin/" + control.currentText + "-" + networkControl.currentText anchors.horizontalCenter: parent.horizontalCenter } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml index 8f462a617..21e447c59 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml @@ -35,7 +35,7 @@ Item { spacing: 20 Text { - text: "1 " + inputCurrency + " = " + controller.conversionRate + " " + outputCurrency + text: controller.conversionRate color: "gray" font.pixelSize: 14 font.family: "Roboto" @@ -48,11 +48,14 @@ Item { SideShiftComboboxWithIcon { id: inputCombobox + networkControl: networksController popupWidth: 200 - //textRole: "currency" controlHint: qsTr("YOU SEND") model: root.receive ? root.receiveModel : root.sendModel + onCurrentValueChanged: { + root.controller.inputCurrencySelected(currentText) + } onActivated: { root.controller.inputCurrencySelected(currentText) } @@ -66,7 +69,6 @@ Item { SideShiftComboboxWithIcon { id: receivingCombobox popupWidth: 200 - //textRole: "currency" controlHint: qsTr("YOU RECEIVE") model: root.receive ? root.sendModel : root.receiveModel } @@ -74,9 +76,14 @@ Item { SideShiftCombobox { id: networksController - // model: controller.inputNetworks - model: ['Network 1', 'Network 2'] + model: controller.inputNetworks anchors.horizontalCenter: parent.horizontalCenter + onCurrentValueChanged: { + root.controller.inputNetwork = currentText + } + onActivated: { + root.controller.inputNetwork = currentText + } } Item { @@ -112,7 +119,11 @@ Item { text: qsTr("SHIFT") enabled: root.receive ? addressCombobox.currentIndex >= 0 : addressInput.text !== "" anchors.horizontalCenter: parent.horizontalCenter - onClicked: root.shift() + onClicked: { + if (root.controller.sendShift(addressCombobox.currentText)) { + root.shift() + } + } } } From 48f6365fb065d0157e7a44623550488e47109845 Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 30 Mar 2023 07:55:28 +0200 Subject: [PATCH 312/436] Sideshift small fixes --- .../qml/Plugins/SideShift/SideShiftBuyPage.qml | 18 ++++++++++++++---- .../Plugins/SideShift/SideShiftCombobox.qml | 2 ++ .../Plugins/SideShift/SideShiftTextInput.qml | 2 ++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml index 914773587..11c093f89 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml @@ -152,7 +152,7 @@ Item { spacing: 10 anchors.horizontalCenter: parent.horizontalCenter Text { - text: qsTr("Min") + text: qsTr("Max") color: "lightgray" anchors.verticalCenter: parent.verticalCenter } @@ -188,8 +188,8 @@ Item { anchors.horizontalCenter: parent.horizontalCenter Text { - anchors.fill: parent id: toAddress + anchors.fill: parent text: controller.depositAddress color: "white" clip: true @@ -219,7 +219,7 @@ Item { anchors.horizontalCenter: parent.horizontalCenter Image { - source: "image://QR/" + root.toAddress.text + source: "image://QR/" + controller.depositAddress sourceSize.width: 180 sourceSize.height: 180 width: 180 @@ -289,9 +289,19 @@ Item { } } + Timer { + id: updateTimer + interval: 5000 + repeat: true + onTriggered: controller.updateShiftStatus() + } + onVisibleChanged: { if (visible) { - console.log('SideShift buy page opened') + updateTimer.start() + } + else { + updateTimer.stop() } } } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml index 7bef156e4..014dd4820 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml @@ -39,6 +39,8 @@ ComboBox { color: "white" horizontalAlignment: Text.AlignHCenter anchors.horizontalCenter: parent.horizontalCenter + clip: true + width: parent.width } } } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml index 084449eb6..a77d552a9 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml @@ -33,6 +33,8 @@ Rectangle { horizontalAlignment: Text.AlignHCenter anchors.fill: parent font.family: control.fontFamily + width: parent.width + clip: true Text { text: control.textHint From 0a500dd43d0922423a1ef8e079259bb0b47e8919 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Thu, 30 Mar 2023 09:14:01 +0300 Subject: [PATCH 313/436] [QT-83,90] wallet name and wizard popup --- GUI/QtQuick/QtQuickAdapter.cpp | 1 + .../qml/StyledControls/CustomExportSuccessDialog.qml | 5 +++-- GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml | 6 +++--- GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml | 10 +--------- GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml | 5 +++-- GUI/QtQuick/qml/WalletProperties/RenameWallet.qml | 2 +- .../qml/WalletProperties/WalletPropertiesPopup.qml | 4 ---- GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 10 ++++++++++ GUI/QtQuick/viewmodels/WalletPropertiesVM.h | 2 ++ 9 files changed, 24 insertions(+), 21 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 76b0d6cff..1ad633fa6 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2294,6 +2294,7 @@ int QtQuickAdapter::renameWallet(const QString& walletId, const QString& newName msgReq->set_new_name(newName.toStdString()); pushRequest(user_, userSigner_, msg.SerializeAsString()); walletBalances_->rename(walletId.toStdString(), newName.toStdString()); + walletPropertiesModel_->rename(walletId.toStdString(), newName.toStdString()); return 0; } diff --git a/GUI/QtQuick/qml/StyledControls/CustomExportSuccessDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomExportSuccessDialog.qml index 53b8fabb6..80b0ac441 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomExportSuccessDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomExportSuccessDialog.qml @@ -112,6 +112,7 @@ Window { text: qsTr("Finish") preferred: true + focus:true function click_enter() { root.close() @@ -119,11 +120,11 @@ Window { } Keys.onEnterPressed: { - finish_but.click_enter() + click_enter() } Keys.onReturnPressed: { - finish_but.click_enter() + click_enter() } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml index 33b121250..d2a1d74d8 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml @@ -106,8 +106,8 @@ Window { Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - preferred: true + focus:true function click_enter() { root.close() @@ -115,11 +115,11 @@ Window { } Keys.onEnterPressed: { - finish_but.click_enter() + click_enter() } Keys.onReturnPressed: { - finish_but.click_enter() + click_enter() } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml index f201052cb..43d8ccfbf 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml @@ -88,20 +88,12 @@ Window { height: 40 preferred: true + focus:true function click_enter() { root.close() } } - - Keys.onEnterPressed: { - ok_but.click_enter() - } - - Keys.onReturnPressed: { - ok_but.click_enter() - } - } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml index 81a2feefe..3d36e4a1b 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml @@ -70,6 +70,7 @@ ColumnLayout { text: qsTr("Finish") preferred: true + focus:true function click_enter() { sig_finish() @@ -77,10 +78,10 @@ ColumnLayout { } Keys.onEnterPressed: { - finish_but.click_enter() + click_enter() } Keys.onReturnPressed: { - finish_but.click_enter() + click_enter() } } diff --git a/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml b/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml index befa6d4ef..4976bce2a 100644 --- a/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml @@ -6,7 +6,7 @@ import QtQuick.Layouts 1.15 import "../BsStyles" import "../StyledControls" -Window { +CustomPopup { id: root property alias header: title.text diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 1cd29f088..892151fd8 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -35,10 +35,6 @@ CustomPopup { id: rename_wallet visible: false wallet_properties_vm: root.wallet_properties_vm - - onSig_confirm: { - wallet_name.text = rename_wallet.wallet_name; - } } ChangePassword { diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index bf5eceafc..7c594fe75 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -76,6 +76,16 @@ void qtquick_gui::WalletPropertiesVM::setNbUTXOs(const std::string& walletId, ui emit changed(); } +void qtquick_gui::WalletPropertiesVM::rename(const std::string& walletId, const std::string& newName) +{ + if (info_.walletId != QString::fromStdString(walletId)) { + logger_->warn("[{}] wallet {} does not match", __func__, walletId); + return; + } + info_.name = QString::fromStdString(newName); + emit changed(); +} + const QString& WalletPropertiesVM::walletName() const { return info_.name; diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h index 5677475f9..2d730e8d3 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h @@ -55,6 +55,8 @@ class WalletPropertiesVM: public QObject void setNbUsedAddrs(const std::string& walletId, uint32_t nb); void setNbUTXOs(const std::string& walletId, uint32_t nb); + void rename(const std::string& walletId, const std::string& newName); + const QString& walletName() const; const QString& walletId() const; const QString& walletGroups() const; From 32df21c9f3040fae9fef4a866e72379285026c68 Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 30 Mar 2023 09:23:55 +0200 Subject: [PATCH 314/436] Icon rendering --- GUI/QtQuick/SideshiftPlugin.cpp | 1 + GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/GUI/QtQuick/SideshiftPlugin.cpp b/GUI/QtQuick/SideshiftPlugin.cpp index 3b987ecf4..555ef209e 100644 --- a/GUI/QtQuick/SideshiftPlugin.cpp +++ b/GUI/QtQuick/SideshiftPlugin.cpp @@ -270,6 +270,7 @@ QPixmap CoinImageProvider::requestPixmap(const QString& id, QSize* size } QSvgRenderer r(QByteArray::fromStdString(response)); QImage img(requestedSize, QImage::Format_ARGB32); + img.fill(Qt::GlobalColor::transparent); QPainter p(&img); r.render(&p); if (size) { diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml index ccbb608c5..e73673c0c 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml @@ -38,6 +38,8 @@ ComboBox { Image { width: 80 height: 80 + sourceSize.width: 80 + sourceSize.height: 80 source: (networkControl === null) ? "qrc:/images/sideshift_btc.png" : "image://coin/" + control.currentText + "-" + networkControl.currentText anchors.horizontalCenter: parent.horizontalCenter From cd2e706fb1e825c1d0b193adc78845a62bd0402d Mon Sep 17 00:00:00 2001 From: YZ Date: Thu, 30 Mar 2023 10:00:52 +0200 Subject: [PATCH 315/436] Combobox fix --- .../Plugins/SideShift/SideShiftCombobox.qml | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml index 014dd4820..79efc915f 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml @@ -23,26 +23,20 @@ ComboBox { activeFocusOnTab: true contentItem: Rectangle { - id: input_rect color: "transparent" - Column { - spacing: 8 - anchors.centerIn: parent - - Text { - text: control.currentText - font.pixelSize: 18 - font.family: "Roboto" - font.weight: Font.Bold - color: "white" - horizontalAlignment: Text.AlignHCenter - anchors.horizontalCenter: parent.horizontalCenter - clip: true - width: parent.width - } - } + Text { + anchors.fill: parent + text: control.currentText + font.pixelSize: 18 + font.family: "Roboto" + font.weight: Font.Bold + color: "white" + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + clip: true + } } indicator: Item {} From bcb5bcb0c9a11bb13ef3afcfe6bf9a86ca05cd87 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 30 Mar 2023 16:58:35 +0300 Subject: [PATCH 316/436] Sideshift plugin implemented (with MT) --- GUI/QtQuick/SideshiftPlugin.cpp | 337 +++++++++++++----- GUI/QtQuick/SideshiftPlugin.h | 26 +- .../Plugins/SideShift/SideShiftBuyPage.qml | 9 +- 3 files changed, 280 insertions(+), 92 deletions(-) diff --git a/GUI/QtQuick/SideshiftPlugin.cpp b/GUI/QtQuick/SideshiftPlugin.cpp index 555ef209e..38f0ed65a 100644 --- a/GUI/QtQuick/SideshiftPlugin.cpp +++ b/GUI/QtQuick/SideshiftPlugin.cpp @@ -30,9 +30,93 @@ class CoinImageProvider : public QQuickImageProvider }; +struct PostIn : public bs::InData +{ + ~PostIn() override = default; + std::string path; + std::string data; +}; +struct PostOut : public bs::OutData +{ + ~PostOut() override = default; + std::string response; + std::string error; +}; + +class SideshiftPlugin::PostHandler : public bs::HandlerImpl +{ +public: + PostHandler(SideshiftPlugin* parent) + : parent_(parent) + {} + ~PostHandler() override = default; + +protected: + std::shared_ptr processData(const std::shared_ptr& in) override + { + std::unique_lock lock(parent_->curlMtx_); + if (!parent_->curl_) { + return nullptr; + } + auto out = std::make_shared(); + curl_easy_setopt(parent_->curl_, CURLOPT_POST, 1); + const auto url = parent_->baseURL_ + in->path; + curl_easy_setopt(parent_->curl_, CURLOPT_URL, url.c_str()); + curl_easy_setopt(parent_->curl_, CURLOPT_POSTFIELDS, in->data.data()); + std::string response; + curl_easy_setopt(parent_->curl_, CURLOPT_WRITEDATA, &response); + + const auto res = curl_easy_perform(parent_->curl_); + if (res != CURLE_OK) { + out->error = fmt::format("{} failed: {}", url, res); + parent_->logger_->error("[{}] {}", __func__, out->error); + return out; + } + out->response = std::move(response); + parent_->logger_->debug("[{}] {} response: {} [{}]", __func__, url, response, response.size()); + return out; + } + +private: + SideshiftPlugin* parent_{ nullptr }; +}; + +struct GetIn : public bs::InData +{ + ~GetIn() override = default; + std::string path; +}; +struct GetOut : public bs::OutData +{ + ~GetOut() override = default; + std::string response; +}; + +class SideshiftPlugin::GetHandler : public bs::HandlerImpl +{ +public: + GetHandler(SideshiftPlugin* parent) : parent_(parent) {} + ~GetHandler() override = default; + +protected: + std::shared_ptr processData(const std::shared_ptr& in) override + { + if (!parent_->curl_) { + return nullptr; + } + auto out = std::make_shared(); + out->response = parent_->get(in->path); + return out; + } + +private: + SideshiftPlugin* parent_{ nullptr }; +}; + + SideshiftPlugin::SideshiftPlugin(const std::shared_ptr& logger , QQmlApplicationEngine& engine, QObject* parent) - : Plugin(parent), logger_(logger) + : Plugin(parent), bs::WorkerPool(1, 1), logger_(logger) { qmlRegisterInterface("SideshiftPlugin"); engine.addImageProvider(QLatin1Literal("coin"), new CoinImageProvider(this)); @@ -67,22 +151,34 @@ static int dumpFunc(CURL* handle, curl_infotype type, void SideshiftPlugin::init() { deinit(); - curl_ = curl_easy_init(); - curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, writeToString); - curl_easy_setopt(curl_, CURLOPT_USERAGENT, std::string("BlockSettle " + name().toStdString() + " plugin").c_str()); - curl_easy_setopt(curl_, CURLOPT_SSL_VERIFYPEER, 0L); - curl_easy_setopt(curl_, CURLOPT_SSL_VERIFYHOST, 0L); - curl_easy_setopt(curl_, CURLOPT_FOLLOWLOCATION, 1L); - - //curl_easy_setopt(curl_, CURLOPT_DEBUGFUNCTION, dumpFunc); - //curl_easy_setopt(curl_, CURLOPT_DEBUGDATA, logger_.get()); - //curl_easy_setopt(curl_, CURLOPT_VERBOSE, 1L); - - curlHeaders_ = curl_slist_append(curlHeaders_, "accept: */*"); - curl_easy_setopt(curl_, CURLOPT_HTTPHEADER, curlHeaders_); - - const auto& response = get("/coins"); - if (!response.empty()) { + { + std::unique_lock lock(curlMtx_); + curl_ = curl_easy_init(); + curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, writeToString); + curl_easy_setopt(curl_, CURLOPT_USERAGENT, std::string("BlockSettle " + name().toStdString() + " plugin").c_str()); + curl_easy_setopt(curl_, CURLOPT_SSL_VERIFYPEER, 0L); + curl_easy_setopt(curl_, CURLOPT_SSL_VERIFYHOST, 0L); + curl_easy_setopt(curl_, CURLOPT_FOLLOWLOCATION, 1L); + + //curl_easy_setopt(curl_, CURLOPT_DEBUGFUNCTION, dumpFunc); + //curl_easy_setopt(curl_, CURLOPT_DEBUGDATA, logger_.get()); + //curl_easy_setopt(curl_, CURLOPT_VERBOSE, 1L); + + //curlHeaders_ = curl_slist_append(curlHeaders_, "accept: */*"); + curlHeaders_ = curl_slist_append(curlHeaders_, "Content-Type: application/json"); + curl_easy_setopt(curl_, CURLOPT_HTTPHEADER, curlHeaders_); + } + + auto in = std::make_shared(); + in->path = "/coins"; + const auto& getResult = [this](const std::shared_ptr& data) + { + const auto& reply = std::static_pointer_cast(data); + if (!reply || reply->response.empty()) { + logger_->error("[SideshiftPlugin::init] network error"); + return; + } + const auto& response = reply->response; try { const auto& msg = json::parse(response); for (const auto& coin : msg) { @@ -93,17 +189,20 @@ void SideshiftPlugin::init() } inputCurrencies_.append(QString::fromStdString(currency)); } - logger_->debug("[{}] {} input currencies", __func__, inputCurrencies_.size()); emit inited(); + logger_->debug("[SideshiftPlugin::init] {} input currencies" + , inputCurrencies_.size()); } catch (const json::exception&) { - logger_->error("[{}] failed to parse {}", __func__, response); + logger_->error("[SideshiftPlugin::init] failed to parse {}", response); } - } + }; + processQueued(in, getResult); } void SideshiftPlugin::deinit() { + cancel(); networksByCur_.clear(); inputCurrencies_.clear(); inputNetworks_.clear(); @@ -112,6 +211,7 @@ void SideshiftPlugin::deinit() convRate_.clear(); orderId_.clear(); + std::unique_lock lock(curlMtx_); if (curlHeaders_) { curl_slist_free_all(curlHeaders_); curlHeaders_ = nullptr; @@ -122,6 +222,62 @@ void SideshiftPlugin::deinit() } } +static QString getConvRate(const json& msg, const QString& inputCur) +{ + double rate = 0; + if (msg["rate"].is_string()) { + rate = std::stod(msg["rate"].get()); + } + else if (msg["rate"].is_number_float()) { + rate = msg["rate"].get(); + } + if (rate > 0) { + if (rate < 0.0001) { + return QObject::tr("1 BTC = %1 %2").arg(QString::number(1.0 / rate, 'f', 2)) + .arg(inputCur); + } + else { + return QObject::tr("1 %1 = %2 BTC").arg(inputCur) + .arg(QString::number(rate, 'f', 6)); + } + } + return {}; +} + +void SideshiftPlugin::getPair() +{ + auto in = std::make_shared(); + in->path = "/pair/" + inputCurrency_.toStdString() + "-" + + inputNetwork_.toStdString() + "/btc-bitcoin"; + const auto& getResult = [this](const std::shared_ptr& data) + { + const auto& reply = std::static_pointer_cast(data); + if (!reply || reply->response.empty()) { + logger_->error("[SideshiftPlugin::getPair] network error"); + return; + } + const auto& response = reply->response; + try { + const auto& respJson = json::parse(response); + if (respJson.contains("error")) { + const auto& errorMsg = respJson["error"]["message"].get(); + logger_->error("[{}] {}", __func__, errorMsg); + convRate_ = tr("Error: %1").arg(QString::fromStdString(errorMsg)); + emit pairUpdated(); + return; + } + convRate_ = getConvRate(respJson, inputCurrency_.toUpper()); + minAmount_ = QString::fromStdString(respJson["min"].get()); + maxAmount_ = QString::fromStdString(respJson["max"].get()); + } + catch (const json::exception& e) { + logger_->error("[{}] failed to parse {}: {}", __func__, response, e.what()); + } + emit pairUpdated(); + }; + processQueued(in, getResult); +} + void SideshiftPlugin::setInputNetwork(const QString& network) { logger_->debug("[{}] {} '{}' -> '{}'", __func__, inputCurrency_.toStdString() @@ -130,63 +286,31 @@ void SideshiftPlugin::setInputNetwork(const QString& network) return; } inputNetwork_ = network; - const auto& response = get("/pair/" + inputCurrency_.toStdString() + "-" - + network.toStdString() + "/btc-bitcoin"); - try { - const auto& respJson = json::parse(response); - double rate = 0; - if (respJson["rate"].is_string()) { - rate = std::stod(respJson["rate"].get()); - } - else if (respJson["rate"].is_number_float()) { - rate = respJson["rate"].get(); - } - if (rate > 0) { - if (rate < 0.0001) { - convRate_ = tr("1 BTC = %1 %2").arg(QString::number(1.0 / rate, 'f', 2)) - .arg(inputCurrency_.toUpper()); - } - else { - convRate_ = tr("1 %1 = %2 BTC").arg(inputCurrency_.toUpper()) - .arg(QString::number(rate, 'f', 6)); - } - } - minAmount_ = QString::fromStdString(respJson["min"].get()); - maxAmount_ = QString::fromStdString(respJson["max"].get()); - } - catch (const json::exception& e) { - logger_->error("[{}] failed to parse {}: {}", __func__, response, e.what()); - } - emit inputSelected(); + getPair(); } std::string SideshiftPlugin::get(const std::string& request) { + std::unique_lock lock(curlMtx_); if (!curl_) { logger_->error("[{}] curl not inited"); return {}; } + curl_easy_setopt(curl_, CURLOPT_POST, 0); const auto url = baseURL_ + request; curl_easy_setopt(curl_, CURLOPT_URL, url.c_str()); std::string response; curl_easy_setopt(curl_, CURLOPT_WRITEDATA, &response); - //long respCode = 0; - //curl_easy_getinfo(curl_, CURLINFO_RESPONSE_CODE, &respCode); const auto res = curl_easy_perform(curl_); if (res != CURLE_OK) { logger_->error("[{}] {} failed: {}", __func__, url, res); return {}; } - logger_->debug("[{}] {} response: {}", __func__, url, response); + //logger_->debug("[{}] {} response: {} [{}]", __func__, url, response, response.size()); return response; } -std::string SideshiftPlugin::post(const std::string& path, const std::string& data) -{ - return std::string(); -} - void SideshiftPlugin::inputCurrencySelected(const QString& cur) { logger_->debug("{{}] '{}' -> '{}'", __func__, inputCurrency_.toStdString() @@ -204,8 +328,11 @@ void SideshiftPlugin::inputCurrencySelected(const QString& cur) emit inputCurSelected(); } -static QString statusToQString(const std::string& s) -{ //TODO: should be translatable at some point +QString SideshiftPlugin::statusToQString(const std::string& s) const +{ + if (s == "waiting") { + return tr("WAITING FOR YOU TO SEND %1").arg(inputCurrency_.toUpper()); + } return QString::fromStdString(s); } @@ -216,23 +343,44 @@ bool SideshiftPlugin::sendShift(const QString& recvAddr) , __func__, inputCurrency_.toStdString(), inputNetwork_.toStdString(), recvAddr.toStdString()); return false; } + shiftStatus_ = tr("Sending request..."); const json msgReq{ {"settleAddress", recvAddr.toStdString()}, {"affiliateId", affiliateId_} - , {"settleCoin", "btc"}, {"depositCoin", inputCurrency_.toStdString()} + , {"settleCoin", "btc"}, {"depositCoin", inputCurrency_.toLower().toStdString()} , {"depositNetwork", inputNetwork_.toStdString()} }; - const auto& response = post("/shifts/variable", msgReq.dump()); - try { - const auto& msgResp = json::parse(response); - orderId_ = QString::fromStdString(msgResp["id"].get()); - creationDate_ = QString::fromStdString(msgResp["createdAt"].get()); - expireDate_ = QString::fromStdString(msgResp["expiresAt"].get()); - depositAddr_ = QString::fromStdString(msgResp["depositAddress"].get()); - shiftStatus_ = statusToQString(msgResp["status"].get()); - } - catch (const std::exception& e) { - logger_->error("[{}] failed to parse {}: {}", __func__, response, e.what()); - return false; - } - emit orderSent(); + auto in = std::make_shared(); + in->path = "/shifts/variable"; + in->data = msgReq.dump(); + const auto& postResult = [this](const std::shared_ptr& data) + { + const auto& reply = std::static_pointer_cast(data); + if (!reply || reply->response.empty()) { + logger_->error("[SideshiftPlugin::sendShift] network error {}" + , (reply == nullptr) ? "" : reply->error); + return; + } + const auto& response = reply->response; + try { + const auto& msgResp = json::parse(response); + if (msgResp.contains("error")) { + const auto& errMsg = msgResp["error"]["message"].get(); + logger_->error("[SideshiftPlugin::sendShift] failed: {}", errMsg); + shiftStatus_ = QString::fromStdString(errMsg); + } + else { + orderId_ = QString::fromStdString(msgResp["id"].get()); + creationDate_ = QString::fromStdString(msgResp["createdAt"].get()); + expireDate_ = QString::fromStdString(msgResp["expiresAt"].get()); + depositAddr_ = QString::fromStdString(msgResp["depositAddress"].get()); + shiftStatus_ = statusToQString(msgResp["status"].get()); + } + emit orderSent(); + } + catch (const std::exception& e) { + logger_->error("[SideshiftPlugin::sendShift] failed to parse {}: {}" + , response, e.what()); + } + }; + processQueued(in, postResult); return true; } @@ -241,15 +389,38 @@ void SideshiftPlugin::updateShiftStatus() if (orderId_.isEmpty()) { return; } - const auto& response = get("/shifts/" + orderId_.toStdString()); - try { - const auto& msgResp = json::parse(response); - shiftStatus_ = statusToQString(msgResp["status"].get()); - emit orderSent(); - } - catch (const std::exception& e) { - logger_->error("[{}] failed to parse {}: {}", __func__, response, e.what()); - } + auto in = std::make_shared(); + in->path = "/shifts/" + orderId_.toStdString(); + const auto& getResult = [this](const std::shared_ptr& data) + { + const auto& reply = std::static_pointer_cast(data); + if (!reply || reply->response.empty()) { + logger_->error("[SideshiftPlugin::updateShiftStatus] network error"); + return; + } + const auto& response = reply->response; + try { + logger_->debug("[SideshiftPlugin::updateShiftStatus] {}", response); + const auto& msgResp = json::parse(response); + if (msgResp.contains("error")) { + return; + } + shiftStatus_ = statusToQString(msgResp["status"].get()); + emit orderSent(); + } + catch (const std::exception& e) { + logger_->error("[{}] failed to parse {}: {}", __func__, response, e.what()); + } + }; + processQueued(in, getResult); + getPair(); +} + +std::shared_ptr SideshiftPlugin::worker(const std::shared_ptr&) +{ + const std::vector> handlers { + std::make_shared(this), std::make_shared(this) }; + return std::make_shared(handlers); } @@ -260,8 +431,6 @@ QPixmap CoinImageProvider::requestPixmap(const QString& id, QSize* size { const std::string request = "/coins/icon/" + id.toStdString(); const auto& response = parent_->get(request); - parent_->logger_->debug("[{}] {} returned {} bytes", __func__, request - , response.size()); if (response.empty()) { return {}; } diff --git a/GUI/QtQuick/SideshiftPlugin.h b/GUI/QtQuick/SideshiftPlugin.h index 70396905f..455ee574d 100644 --- a/GUI/QtQuick/SideshiftPlugin.h +++ b/GUI/QtQuick/SideshiftPlugin.h @@ -13,15 +13,21 @@ #include "Plugin.h" #include #include +#include "Message/Worker.h" namespace spdlog { class logger; } class CoinImageProvider; -class SideshiftPlugin: public Plugin +class SideshiftPlugin: public Plugin, protected bs::WorkerPool { + class GetHandler; + class PostHandler; + friend class CoinImageProvider; + friend class GetHandler; + friend class PostHandler; Q_OBJECT public: SideshiftPlugin(const std::shared_ptr&, QQmlApplicationEngine & @@ -40,13 +46,13 @@ class SideshiftPlugin: public Plugin Q_PROPERTY(QStringList inputNetworks READ inputNetworks NOTIFY inputCurSelected) QStringList inputNetworks() const { return inputNetworks_; } - Q_PROPERTY(QString conversionRate READ conversionRate NOTIFY inputSelected) + Q_PROPERTY(QString conversionRate READ conversionRate NOTIFY pairUpdated) QString conversionRate() const { return convRate_; } - Q_PROPERTY(QString minAmount READ minAmount NOTIFY inputSelected) + Q_PROPERTY(QString minAmount READ minAmount NOTIFY pairUpdated) QString minAmount() const { return minAmount_; } - Q_PROPERTY(QString maxAmount READ maxAmount NOTIFY inputSelected) + Q_PROPERTY(QString maxAmount READ maxAmount NOTIFY pairUpdated) QString maxAmount() const { return maxAmount_; } - Q_PROPERTY(QString inputNetwork READ inputNetwork WRITE setInputNetwork NOTIFY inputSelected) + Q_PROPERTY(QString inputNetwork READ inputNetwork WRITE setInputNetwork NOTIFY pairUpdated) QString inputNetwork() const { return inputNetwork_; } void setInputNetwork(const QString&); @@ -58,6 +64,8 @@ class SideshiftPlugin: public Plugin QString orderId() const { return orderId_; } Q_PROPERTY(QString creationDate READ creationDate NOTIFY orderSent) QString creationDate() const { return creationDate_; } + Q_PROPERTY(QString status READ status NOTIFY orderSent) + QString status() const { return shiftStatus_; } Q_INVOKABLE void init() override; Q_INVOKABLE void inputCurrencySelected(const QString& cur); @@ -69,11 +77,16 @@ class SideshiftPlugin: public Plugin void inputCurSelected(); void inputSelected(); void orderSent(); + void pairUpdated(); + +protected: + std::shared_ptr worker(const std::shared_ptr&) override final; private: void deinit(); std::string get(const std::string& request); - std::string post(const std::string& path, const std::string& data); + QString statusToQString(const std::string& status) const; + void getPair(); private: std::shared_ptr logger_; @@ -81,6 +94,7 @@ class SideshiftPlugin: public Plugin const std::string affiliateId_{"a9KgPNzTn"}; struct curl_slist* curlHeaders_{ NULL }; void* curl_{ nullptr }; + std::mutex curlMtx_; QStringList inputCurrencies_, outputCurrencies_; std::unordered_map networksByCur_; diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml index 11c093f89..1d18ea644 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml @@ -95,7 +95,7 @@ Item { Text { color: "white" - text: qsTr("WAITING FOR YOU TO SEND ") + root.inputCurrency + text: controller.status topPadding: 40 font.pixelSize: 24 anchors.horizontalCenter: parent.horizontalCenter @@ -293,7 +293,12 @@ Item { id: updateTimer interval: 5000 repeat: true - onTriggered: controller.updateShiftStatus() + onTriggered: { + controller.updateShiftStatus() + if (controller.status === "complete") { + close() + } + } } onVisibleChanged: { From 5ac8627e6a5003575d709736dc0d9d397bd67e9c Mon Sep 17 00:00:00 2001 From: slava-gen <102287844+slava-gen@users.noreply.github.com> Date: Thu, 30 Mar 2023 16:06:20 +0000 Subject: [PATCH 317/436] add ubuntu.Dockerfile and some debug about cmake call in generate.py --- README-dockerfile.md | 11 +++++++++++ generate.py | 8 +++++++- ubuntu.Dockerfile | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 README-dockerfile.md create mode 100644 ubuntu.Dockerfile diff --git a/README-dockerfile.md b/README-dockerfile.md new file mode 100644 index 000000000..79fc5d793 --- /dev/null +++ b/README-dockerfile.md @@ -0,0 +1,11 @@ +# How to run Ubuntu build in docker +## Run this command in terminal repo folder +``` +docker build . -t bsterminal:latest -f ubuntu.Dockerfile +``` +## Get bs terminal app (bsterminal) from docker container image +``` +docker create --name=terminal bsterminal:latest +docker cp terminal:/app/build_terminal/RelWithDebInfo/bin/blocksettle bsterminal +docker rm terminal +``` diff --git a/generate.py b/generate.py index a16686f9f..942b26995 100644 --- a/generate.py +++ b/generate.py @@ -154,7 +154,13 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma cmdStr = r' '.join(command) result = subprocess.call(cmdStr) else: - result = subprocess.call(command) + try: + subprocess.run(command, check=True) + result = 0 + except subprocess.CalledProcessError as error: + print('Error during cmake:', error) + result = 1 + if result == 0: print('Project generated to :' + build_dir) return 0 diff --git a/ubuntu.Dockerfile b/ubuntu.Dockerfile new file mode 100644 index 000000000..b604e5e09 --- /dev/null +++ b/ubuntu.Dockerfile @@ -0,0 +1,34 @@ +FROM ubuntu:22.04 as terminal_build_machine + +ENV TZ="Etc/UTC" + +RUN sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list \ + && apt update \ + # timezone thing + && apt install -y tzdata \ + && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ + && echo $TZ > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata \ + # main libs + && apt install -y \ + python3-pip cmake libmysqlclient-dev autoconf libtool yasm nasm libgmp3-dev libdouble-conversion-dev \ + qttools5-dev-tools libfreetype-dev libfontconfig-dev libcups2-dev xcb \ + libx11-xcb-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-sync-dev libxcb-render-util0-dev libxcb-xfixes0-dev \ + libxcb-xinerama0-dev libxcb-randr0-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-icccm4-dev libxcb-glx0-dev libxkbcommon-x11-dev \ + libudev-dev libxi-dev libsm-dev libxrender-dev libdbus-1-dev \ + && pip install wget requests pathlib \ + # free up space + && rm -rf /var/lib/apt/lists/* \ + && ln -s /usr/bin/python3 /usr/bin/python + + +WORKDIR app + +COPY . . + +RUN python generate.py release + +RUN cd terminal.release \ + && make + +RUN ls -la /app/build_terminal/RelWithDebInfo/bin + From 4a395b95bd0587a8df0c8325f073f06bf0283374 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Fri, 31 Mar 2023 13:25:54 +0300 Subject: [PATCH 318/436] [QT-19,23,26,49,53,83,90] closing popup on enter & delete wallet --- GUI/QtQuick/QtQuickAdapter.cpp | 4 +- GUI/QtQuick/qml/CreateWallet/CreateWallet.qml | 16 ++---- .../qml/CreateWallet/WalletSeedVerify.qml | 6 +++ GUI/QtQuick/qml/Send/PasswordWithTimer.qml | 10 ++++ GUI/QtQuick/qml/Send/SignTransaction.qml | 50 +++++++++++++++++-- .../qml/Send/SignTransactionAdvanced.qml | 44 ++++++++++++++-- GUI/QtQuick/qml/Send/SimpleDetails.qml | 7 +++ .../qml/StyledControls/CustomFailDialog.qml | 8 --- .../StyledControls/CustomSuccessWidget.qml | 4 ++ .../qml/WalletProperties/ChangePassword.qml | 4 ++ .../qml/WalletProperties/DeleteWallet.qml | 8 +++ .../qml/WalletProperties/ExportWOWallet.qml | 7 ++- .../qml/WalletProperties/RenameWallet.qml | 7 +++ GUI/QtQuick/qml/main.qml | 11 ++++ 14 files changed, 157 insertions(+), 29 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 1ad633fa6..4db97d423 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -649,6 +649,7 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) walletBalances_->setCreatedWalletId(createdWalletId_); logger_->debug("[{}] wallet {} created: {}", __func__ //TODO: show something in the GUI if needed , msg.created_wallet().wallet_id(), msg.created_wallet().error_msg()); + emit showSuccess(tr("Your wallet has successfully been created")); break; case SignerMessage::kWalletPassChanged: if (!msg.wallet_pass_changed()) { @@ -1870,9 +1871,10 @@ ProcessingResult QtQuickAdapter::processSignTX(const BlockSettle::Common::Signer msgTx->set_tx(response.signed_tx()); //not adding TX hashes atm pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + emit successTx(); } else { - emit showFail(tr("Incorrect password"), tr("TX sign failed\nerror %1: %2").arg(response.error_code()) + emit failedTx(tr("TX sign failed\nerror %1: %2").arg(response.error_code()) .arg(QString::fromStdString(response.error_text()))); } return ProcessingResult::Success; diff --git a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml index c587b6809..ad31a6ca5 100644 --- a/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/CreateWallet.qml @@ -14,7 +14,7 @@ CustomPopup { objectName: "create_wallet" _stack_view.initialItem: terms_conditions - _arrow_but_visibility: !(terms_conditions.visible || start_create.visible || success_wallet.visible) + _arrow_but_visibility: !(terms_conditions.visible || start_create.visible ) TermsAndConditions { id: terms_conditions @@ -94,7 +94,8 @@ CustomPopup { id: confirm_password visible: false onSig_confirm: { - _stack_view.push(success_wallet) + root.close() + _stack_view.pop(null) } } @@ -139,17 +140,6 @@ CustomPopup { } } - CustomSuccessWidget { - id: success_wallet - - details_text: qsTr("Your wallet has successfully been created") - visible: false - onSig_finish: { - root.close() - _stack_view.pop(null) - } - } - function init() { if (bsApp.settingActivated === true) { diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml index fb1ccdad6..61d7d8852 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml @@ -56,6 +56,12 @@ ColumnLayout { } } } + onEnterPressed: { + continue_but.click_enter() + } + onReturnPressed: { + continue_but.click_enter() + } } } diff --git a/GUI/QtQuick/qml/Send/PasswordWithTimer.qml b/GUI/QtQuick/qml/Send/PasswordWithTimer.qml index e3770c561..a55a2c2f0 100644 --- a/GUI/QtQuick/qml/Send/PasswordWithTimer.qml +++ b/GUI/QtQuick/qml/Send/PasswordWithTimer.qml @@ -21,6 +21,9 @@ Item { property alias value: password.input_text + signal enterPressed() + signal returnPressed() + CustomTextInput { id: password @@ -40,6 +43,13 @@ Item { isPassword: true isHiddenText: true + + onEnterPressed: { + root.enterPressed() + } + onReturnPressed: { + root.returnPressed() + } } CustomProgressBar { diff --git a/GUI/QtQuick/qml/Send/SignTransaction.qml b/GUI/QtQuick/qml/Send/SignTransaction.qml index 6e645745c..ed751e7e8 100644 --- a/GUI/QtQuick/qml/Send/SignTransaction.qml +++ b/GUI/QtQuick/qml/Send/SignTransaction.qml @@ -21,6 +21,37 @@ ColumnLayout { width: 580 spacing: 0 + property int k: 0 + Connections + { + target:bsApp + function onSuccessTx() + { + if (!layout.visible) { + return + } + + sig_broadcast() + } + function onFailedTx(error) + { + if (!layout.visible) { + return + } + + fail_dialog.fail = error + fail_dialog.show() + fail_dialog.raise() + fail_dialog.requestActivate() + } + } + + CustomFailDialog { + id: fail_dialog + header: "Failed to send" + visible: false; + } + CustomTitleLabel { id: title Layout.topMargin: 6 @@ -323,6 +354,13 @@ ColumnLayout { width: 532 time_progress: layout.time_progress + + onEnterPressed: { + broadcast_but.click_enter() + } + onReturnPressed: { + broadcast_but.click_enter() + } } Label { @@ -347,7 +385,6 @@ ColumnLayout { function click_enter() { bsApp.signAndBroadcast(txSignRequest, password.value) password.value = "" - sig_broadcast() } } @@ -366,12 +403,19 @@ ColumnLayout { running: true repeat: true onTriggered: { - layout.time_progress = layout.time_progress - 1 + if (layout.time_progress != 0) { + layout.time_progress = layout.time_progress - 1 + } - if (time_progress === 0) + if (time_progress === 0 && !fail_dialog.visible) { running = false password.value = "" + + if (fail_dialog.visible) { + fail_dialog.close() + } + sig_time_finished() } } diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml index 35b06c76b..fb0cadb4d 100644 --- a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -23,6 +23,36 @@ ColumnLayout { width: 1132 spacing: 0 + Connections + { + target:bsApp + function onSuccessTx() + { + if (!layout.visible) { + return + } + + sig_broadcast() + } + function onFailedTx(error) + { + if (!layout.visible) { + return + } + + fail_dialog.fail = error + fail_dialog.show() + fail_dialog.raise() + fail_dialog.requestActivate() + } + } + + CustomFailDialog { + id: fail_dialog + header: "Failed to send" + visible: false; + } + CustomTitleLabel { id: title Layout.topMargin: 6 @@ -368,6 +398,13 @@ ColumnLayout { width: 530 time_progress: layout.time_progress + + onEnterPressed: { + broadcast_but.click_enter() + } + onReturnPressed: { + broadcast_but.click_enter() + } } Label { @@ -392,7 +429,6 @@ ColumnLayout { function click_enter() { bsApp.signAndBroadcast(txSignRequest, password.value) password.value = "" - sig_broadcast() } } @@ -411,9 +447,11 @@ ColumnLayout { running: true repeat: true onTriggered: { - layout.time_progress = layout.time_progress - 1 + if (layout.time_progress != 0) { + layout.time_progress = layout.time_progress - 1 + } - if (time_progress === 0) + if (time_progress === 0 && !fail_dialog.visible) { running = false password.value = "" diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index a351a8c66..77532a283 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -108,6 +108,13 @@ ColumnLayout { Layout.preferredHeight : 70 Layout.preferredWidth: 552 Layout.topMargin: 10 + + onEnterPressed: { + continue_but.click_enter() + } + onReturnPressed: { + continue_but.click_enter() + } } RowLayout { diff --git a/GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml index d2a1d74d8..c827a6fea 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml @@ -113,14 +113,6 @@ Window { root.close() } } - - Keys.onEnterPressed: { - click_enter() - } - - Keys.onReturnPressed: { - click_enter() - } } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml index 3d36e4a1b..e4318cf16 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml @@ -84,4 +84,8 @@ ColumnLayout { Keys.onReturnPressed: { click_enter() } + + function init() { + finish_but.setActiveFocus() + } } diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml index f1bd89a67..ed3158a82 100644 --- a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -250,6 +250,10 @@ ColumnLayout { function checkPasswordLength() { + if (!visible) { + return false + } + if (!bsApp.verifyPasswordIntegrity(new_password.input_text)) { error_dialog.show() error_dialog.raise() diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml index 1beee5930..ec9de790a 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml @@ -64,6 +64,13 @@ ColumnLayout { isPassword: true isHiddenText: true + + onEnterPressed: { + delete_btn.click_enter() + } + onReturnPressed: { + delete_btn.click_enter() + } } Label { @@ -87,6 +94,7 @@ ColumnLayout { } CustomButton { + id: delete_btn text: qsTr("Delete") preferred: true diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml index 8d0243446..8a97f3518 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -16,6 +16,7 @@ ColumnLayout { height: 548 width: 580 + focus: true spacing: 0 @@ -169,8 +170,9 @@ ColumnLayout { CustomButton { id: confirm_but - enabled: bsApp.settingExportDir.length !== 0 + //enabled: bsApp.settingExportDir.length !== 0 preferred: true + focus: true text: qsTr("Export") Layout.bottomMargin: 40 @@ -207,4 +209,7 @@ ColumnLayout { } } + function init() { + confirm_but.setActiveFocus() + } } diff --git a/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml b/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml index 4976bce2a..f69226737 100644 --- a/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml @@ -74,6 +74,13 @@ CustomPopup { activeFocusOnTab: true title_text: qsTr("Wallet Name") + + onEnterPressed: { + accept_but.click_enter() + } + onReturnPressed: { + accept_but.click_enter() + } } Label { diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 45a69bab2..8c8f9d803 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -97,6 +97,11 @@ ApplicationWindow { visible: false; } + CustomSuccessDialog { + id: success_dialog + visible: false + } + Connections { target:bsApp @@ -125,6 +130,12 @@ ApplicationWindow { show_popup(fail_dialog) } + function onShowSuccess(success_) + { + success_dialog.details_text = success_ + show_popup(success_dialog) + } + function onWalletsLoaded (nb) { if (nb === 0) From e819b8f8a2505ea975fe714679ab9c20c4757df0 Mon Sep 17 00:00:00 2001 From: slava-gen <102287844+slava-gen@users.noreply.github.com> Date: Fri, 31 Mar 2023 10:48:48 +0000 Subject: [PATCH 319/436] adjust debug output for cmake call --- generate.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/generate.py b/generate.py index 942b26995..c45d6002d 100644 --- a/generate.py +++ b/generate.py @@ -155,14 +155,19 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma result = subprocess.call(cmdStr) else: try: - subprocess.run(command, check=True) - result = 0 + response = subprocess.run(command, check=True, capture_output=True) + result = response.returncode + print('response: ', response) + print('stderr: ', response.stderr) + print('stdout: ', response.stdout) except subprocess.CalledProcessError as error: - print('Error during cmake:', error) - result = 1 + result = error.returncode + print('response: ', error) + print('stderr: ', error.stderr) + print('stdout: ', error.stdout) if result == 0: - print('Project generated to :' + build_dir) + print('Project generated to: ' + build_dir) return 0 else: print('Cmake failed') From d463f02e77f1e46d05f665d07c23611a3ff39025 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Fri, 31 Mar 2023 15:05:43 +0300 Subject: [PATCH 320/436] fix comments --- GUI/QtQuick/QtQuickAdapter.cpp | 2 -- GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 4db97d423..afd7cf198 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -647,8 +647,6 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) walletBalances_->clear(); addrModel_->reset(createdWalletId_); walletBalances_->setCreatedWalletId(createdWalletId_); - logger_->debug("[{}] wallet {} created: {}", __func__ //TODO: show something in the GUI if needed - , msg.created_wallet().wallet_id(), msg.created_wallet().error_msg()); emit showSuccess(tr("Your wallet has successfully been created")); break; case SignerMessage::kWalletPassChanged: diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml index 8a97f3518..9ad8dfd34 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -170,7 +170,7 @@ ColumnLayout { CustomButton { id: confirm_but - //enabled: bsApp.settingExportDir.length !== 0 + enabled: bsApp.settingExportDir.length !== 0 preferred: true focus: true text: qsTr("Export") @@ -197,7 +197,7 @@ ColumnLayout { FileDialog { id: fileDialog title: qsTr("Please choose a directory") - folder: shortcuts.home + folder: shortcuts.documents selectFolder: true onAccepted: { From d485ca97315697f1fb4801532f4b72de6d6a76fa Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 31 Mar 2023 14:24:28 +0200 Subject: [PATCH 321/436] Transaction export; network switches --- GUI/QtQuick/ArmoryServersModel.cpp | 12 ++--- GUI/QtQuick/QTXSignRequest.cpp | 11 ++++ GUI/QtQuick/QTXSignRequest.h | 4 ++ GUI/QtQuick/QtQuickAdapter.cpp | 16 +++++- GUI/QtQuick/QtQuickAdapter.h | 3 ++ GUI/QtQuick/qml/Send/AdvancedDetails.qml | 53 +++++++++++++------ GUI/QtQuick/qml/Send/SendPopup.qml | 23 ++++++++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 31 +++++++++-- GUI/QtQuick/qml/Settings/AddArmoryServer.qml | 8 +++ GUI/QtQuick/qml/Settings/SettingsNetwork.qml | 8 +-- GUI/QtQuick/qml/Settings/SettingsPopup.qml | 7 +++ .../qml/WalletProperties/ExportWOWallet.qml | 1 - 12 files changed, 143 insertions(+), 34 deletions(-) diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index 7d8a00a4a..db9f24490 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -47,6 +47,8 @@ void ArmoryServersModel::setCurrent (int value) } current_ = value; emit currentChanged(value); + const auto dataIndex = index(current_, 0); + emit dataChanged(dataIndex, dataIndex, { ArmoryServersModel::TableRoles::CurrentServerRole }); } void ArmoryServersModel::setData(int curIdx, int connIdx @@ -70,11 +72,9 @@ void ArmoryServersModel::setData(int curIdx, int connIdx void ArmoryServersModel::add(const ArmoryServer& srv) { - QMetaObject::invokeMethod(this, [this, srv] { - beginInsertRows(QModelIndex{}, rowCount(), rowCount()); - data_.push_back(srv); - endInsertRows(); - }); + beginInsertRows(QModelIndex{}, rowCount(), rowCount()); + data_.push_back(srv); + endInsertRows(); } // netType==0 => MainNet, netType==1 => TestNet @@ -95,7 +95,7 @@ void ArmoryServersModel::add(QString name, QString armoryDBIp, int armoryDBPort, QMetaObject::invokeMethod(this, [this, server] { add(server); setCurrent(rowCount() - 1); - }); + }); } bool ArmoryServersModel::del(int idx) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index 8de73a2cd..9390a71ef 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -122,3 +122,14 @@ QString QTXSignRequest::feePerByte() const } return QString::number(txReq_.getFee() / (double)txReq_.estimateTxVirtSize(), 'f', 1); } + +bool QTXSignRequest::isWatchingOnly() const +{ + return isWatchingOnly_; +} + +void QTXSignRequest::setWatchingOnly(bool watchingOnly) +{ + isWatchingOnly_ = watchingOnly; + emit txSignReqChanged(); +} diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h index 983eaad43..ebea9901c 100644 --- a/GUI/QtQuick/QTXSignRequest.h +++ b/GUI/QtQuick/QTXSignRequest.h @@ -79,6 +79,9 @@ class QTXSignRequest : public QObject bool hasError() const { return !error_.isEmpty(); } Q_PROPERTY(TxInputsModel* inputs READ inputsModel NOTIFY txSignReqChanged) TxInputsModel* inputsModel() const { return inputsModel_; } + Q_PROPERTY(bool isWatchingOnly READ isWatchingOnly NOTIFY txSignReqChanged) + bool isWatchingOnly() const; + void setWatchingOnly(bool watchingOnly); signals: void txSignReqChanged(); @@ -94,6 +97,7 @@ class QTXSignRequest : public QObject TxInputsModel* inputsModel_{ nullptr }; bool isHWW_{ false }; bool isHWWready_{ false }; + bool isWatchingOnly_ { false }; }; #endif // Q_TX_SIGN_REQUEST_H diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 1ad633fa6..332935e73 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2032,7 +2032,8 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq for (const auto& walletId : hdWalletIds) { txReq.walletIds.push_back(walletId); try { - if (hdWallets_.at(walletId).isHardware) { + const auto wallet = hdWallets_.at(walletId); + if (wallet.isHardware) { qReq->setHWW(true); logger_->debug("[{}] noReqAmt: {} for {}", __func__, noReqAmount, walletId); if (!noReqAmount) { @@ -2042,6 +2043,9 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq hwwReady_[walletId] = qReq; } } + else if (wallet.watchOnly) { + qReq->setWatchingOnly(true); + } } catch (const std::exception&) { logger_->error("[{}] unknown walletId {}", __func__, walletId); @@ -2378,3 +2382,13 @@ void QtQuickAdapter::notifyNewTransaction(const bs::TXEntry& tx) txDetails->disconnect(this); }, Qt::QueuedConnection); } + +void QtQuickAdapter::exportTransaction(const QUrl& path) +{ + const QString exportPath = path.toLocalFile(); + logger_->debug("[{}] exporting transaction to {}", __func__, exportPath.toStdString()); + + QTimer::singleShot(1000, [this, exportPath](){ + emit transactionExported(tr("Transaction exported to ") + exportPath); + }); +} diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 3be298e3b..4c78cb560 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -188,6 +188,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE int rescanWallet(const QString& walletId); Q_INVOKABLE int renameWallet(const QString& walletId, const QString& newName); Q_INVOKABLE void walletSelected(int); + Q_INVOKABLE void exportTransaction(const QUrl& path); void notifyNewTransaction(const bs::TXEntry& tx); signals: @@ -211,6 +212,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void failedDeleteWallet(); void successDeleteWallet(); void walletSeedAuthFailed(); + void transactionExported(const QString&); + void transactionExportFailed(const QString&); private slots: void onArmoryServerChanged(const QModelIndex&, const QVariant&); diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index bbab0ea7c..deba52a30 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -2,6 +2,7 @@ import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 +import QtQuick.Dialogs 1.3 import "../BsStyles" import "../StyledControls" @@ -515,12 +516,21 @@ ColumnLayout { } } - Label { Layout.fillWidth: true Layout.fillHeight : true } + FileDialog { + id: exportFileDialog + title: qsTr("Please choose folder to export transaction") + folder: shortcuts.documents + selectFolder: true + selectExisting: false + onAccepted: { + bsApp.exportTransaction(exportFileDialog.fileUrl, continue_but.prepare_transaction()) + } + } CustomButton { id: continue_but @@ -534,43 +544,54 @@ ColumnLayout { Layout.bottomMargin: 30 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - text: qsTr("Continue") + text: tempRequest !== null ? (tempRequest.isWatchingOnly ? qstr("Export transaction") : qsTr("Continue")) : "" preferred: true - function click_enter() { - if (!fee_suggest_combo.edit_value()) - { - fee_suggest_combo.input_text = fee_suggest_combo.currentText - } - + function prepare_transaction() { if (isRBF) { - layout.sig_continue( bsApp.createTXSignRequest(-1 //special index for RBF mode + return bsApp.createTXSignRequest(-1 //special index for RBF mode , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text - , checkbox_rbf.checked, tx.ownInputs.zcInputs()) ) + , checkbox_rbf.checked, tx.ownInputs.zcInputs()) } else if (isCPFP) { - layout.sig_continue( bsApp.createTXSignRequest(-2 //special index for CPFP mode + return bsApp.createTXSignRequest(-2 //special index for CPFP mode , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text - , checkbox_rbf.checked, tx.ownOutputs.zcInputs()) ) + , checkbox_rbf.checked, tx.ownOutputs.zcInputs()) } else { // normal operation if (table_sel_inputs.rowCount) { - layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex + return bsApp.createTXSignRequest(from_wallet_combo.currentIndex , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text - , checkbox_rbf.checked, txInputsModel.getSelection()) ) + , checkbox_rbf.checked, txInputsModel.getSelection()) } else { - layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex + return bsApp.createTXSignRequest(from_wallet_combo.currentIndex , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() - , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text) ) + , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text) } } } + function click_enter() { + if (!fee_suggest_combo.edit_value()) + { + fee_suggest_combo.input_text = fee_suggest_combo.currentText + } + + if (tempRequest !== null && tempRequest.isWatchigOnly) + { + exportFileDialog.open() + } + else + { + layout.sig_continue(prepare_transaction()) + } + } + } diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 6a0e6e411..27d3e00c9 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -99,6 +99,29 @@ CustomPopup { } } + CustomSuccessDialog { + id: successDialog + visible: false + } + + CustomFailDialog { + id: failDialog + visible: false + } + + Connections { + target: bsApp + onTransactionExported: (text) => { + successDialog.details_text = text + successDialog.open() + } + onTransactionExportFailed: (text) => { + failDialog.header = qsTr("Export transaction failed") + failDialog.fail = text + failDialog.open() + } + } + function init() { _stack_view.replace(bsApp.settingAdvancedTX ? advanced_details : simple_details) diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index a351a8c66..fcccae442 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -2,6 +2,7 @@ import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 +import QtQuick.Dialogs 1.3 import "../BsStyles" import "../StyledControls" @@ -182,6 +183,17 @@ ColumnLayout { Layout.fillHeight: true } + FileDialog { + id: exportFileDialog + title: qsTr("Please choose folder to export transaction") + folder: shortcuts.documents + selectFolder: true + selectExisting: false + onAccepted: { + bsApp.exportTransaction(exportFileDialog.fileUrl, continue_but.prepare_transaction()) + } + } + CustomButton { id: continue_but @@ -195,19 +207,30 @@ ColumnLayout { Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - text: qsTr("Continue") + text: tempRequest !== null ? (tempRequest.isWatchingOnly ? qstr("Export transaction") : qsTr("Continue")) : "" preferred: true + function prepare_transaction() { + return bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , [rec_addr_input.input_text], [parseFloat(amount_input.input_text)] + , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text) + } + function click_enter() { if (!fee_suggest_combo.edit_value()) { fee_suggest_combo.input_text = fee_suggest_combo.currentText } - layout.sig_continue( bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , [rec_addr_input.input_text], [parseFloat(amount_input.input_text)] - , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text)) + if (tempRequest !== null && tempRequest.isWatchingOnly) + { + exportFileDialog.open() + } + else + { + layout.sig_continue( prepare_transaction() ) + } } } diff --git a/GUI/QtQuick/qml/Settings/AddArmoryServer.qml b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml index fe5944a6b..86d2f1e04 100644 --- a/GUI/QtQuick/qml/Settings/AddArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml @@ -98,6 +98,8 @@ ColumnLayout { Layout.topMargin: 10 title_text: qsTr("Name") + + onTabNavigated: ip_dns_text_input.setActiveFocus() } CustomTextInput { @@ -109,6 +111,8 @@ ColumnLayout { Layout.topMargin: 10 title_text: qsTr("IP/DNS") + + onTabNavigated: port_text_input.setActiveFocus() } CustomTextInput { @@ -122,6 +126,8 @@ ColumnLayout { title_text: qsTr("Port") input_validator: IntValidator {bottom: 80; top: 65535;} + + onTabNavigated: db_key_text_input.setActiveFocus() } CustomTextInput { @@ -133,6 +139,8 @@ ColumnLayout { Layout.topMargin: 10 title_text: qsTr("DB Key (optional)") + + onTabNavigated: save_but.forceActiveFocus() } CustomButton { diff --git a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml index 1c5992993..2eb09a39f 100644 --- a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml +++ b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml @@ -15,6 +15,7 @@ ColumnLayout { signal sig_add_custom() signal sig_delete_custom(int ind) signal sig_modify_custom(int ind) + signal request_close() height: 548 width: 580 @@ -74,7 +75,7 @@ ColumnLayout { if (isCurrent === false) { isCurrent = true - radio_checked = true + request_close() } else if (isDefault === false) { @@ -83,7 +84,6 @@ ColumnLayout { } } - Connections { target:armoryServersModel @@ -93,10 +93,6 @@ ColumnLayout { 425) list.implicitHeight = new_height } - function onCurrentChanged (ind) - { - list.itemAtIndex(ind).radio_checked = true - } } } diff --git a/GUI/QtQuick/qml/Settings/SettingsPopup.qml b/GUI/QtQuick/qml/Settings/SettingsPopup.qml index f18eeacf6..7d4d18ab3 100644 --- a/GUI/QtQuick/qml/Settings/SettingsPopup.qml +++ b/GUI/QtQuick/qml/Settings/SettingsPopup.qml @@ -64,6 +64,11 @@ CustomPopup { delete_armory_server.server_index = server_index delete_armory_server.init() } + + onRequest_close: { + _stack_view.pop() + root.close() + } } SettingsAbout { @@ -79,6 +84,8 @@ CustomPopup { onSig_added: { _stack_view.pop() + _stack_view.pop() + root.close() } } diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml index 8d0243446..14c5db4ea 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -206,5 +206,4 @@ ColumnLayout { } } } - } From 7dc8c46dbe06755477efddf5b2bd6a3ef3cc0451 Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 31 Mar 2023 15:46:55 +0200 Subject: [PATCH 322/436] Review fixes --- GUI/QtQuick/QtQuickAdapter.cpp | 6 ++++-- GUI/QtQuick/QtQuickAdapter.h | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 57b1eb124..1bdcc992f 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1470,7 +1470,9 @@ bool QtQuickAdapter::addArmoryServer(ArmoryServersModel* model, const QString& n msgReq->set_server_port(ipPort.toStdString()); msgReq->set_server_key(key.toStdString()); pushRequest(user_, userSettings_, msg.SerializeAsString()); - model->add({ name, static_cast(netType), ipAddr, ipPort.toInt(), key }); + QMetaObject::invokeMethod(this, [model, name, netType, ipAddr, ipPort, key] { + model->add({ name, static_cast(netType), ipAddr, ipPort.toInt(), key }); + }); return true; } @@ -2383,7 +2385,7 @@ void QtQuickAdapter::notifyNewTransaction(const bs::TXEntry& tx) }, Qt::QueuedConnection); } -void QtQuickAdapter::exportTransaction(const QUrl& path) +void QtQuickAdapter::exportTransaction(const QUrl& path, QTXSignRequest* request) { const QString exportPath = path.toLocalFile(); logger_->debug("[{}] exporting transaction to {}", __func__, exportPath.toStdString()); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 4c78cb560..1e0db7d7e 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -188,7 +188,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE int rescanWallet(const QString& walletId); Q_INVOKABLE int renameWallet(const QString& walletId, const QString& newName); Q_INVOKABLE void walletSelected(int); - Q_INVOKABLE void exportTransaction(const QUrl& path); + Q_INVOKABLE void exportTransaction(const QUrl& path, QTXSignRequest* request); void notifyNewTransaction(const bs::TXEntry& tx); signals: @@ -212,8 +212,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void failedDeleteWallet(); void successDeleteWallet(); void walletSeedAuthFailed(); - void transactionExported(const QString&); - void transactionExportFailed(const QString&); + void transactionExported(const QString& successMessage); + void transactionExportFailed(const QString& errorMessage); private slots: void onArmoryServerChanged(const QModelIndex&, const QVariant&); From a496ed4b019f42e0c87b88d3d1f91d23efe6affb Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Fri, 31 Mar 2023 16:57:50 +0300 Subject: [PATCH 323/436] fix ommitting qtquickadapter.h --- GUI/QtQuick/QtQuickAdapter.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 3be298e3b..10a50b0ee 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -211,6 +211,9 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void failedDeleteWallet(); void successDeleteWallet(); void walletSeedAuthFailed(); + void successTx(); + void failedTx(const QString&); + void showSuccess(const QString&); private slots: void onArmoryServerChanged(const QModelIndex&, const QVariant&); From aa033ac6a28d57edb62fd37022b839db7b64e701 Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 31 Mar 2023 16:21:40 +0200 Subject: [PATCH 324/436] Refactor success message on transaction export --- GUI/QtQuick/QtQuickAdapter.cpp | 2 +- GUI/QtQuick/QtQuickAdapter.h | 2 +- GUI/QtQuick/qml/Send/SendPopup.qml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 1bdcc992f..db98e2806 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2391,6 +2391,6 @@ void QtQuickAdapter::exportTransaction(const QUrl& path, QTXSignRequest* request logger_->debug("[{}] exporting transaction to {}", __func__, exportPath.toStdString()); QTimer::singleShot(1000, [this, exportPath](){ - emit transactionExported(tr("Transaction exported to ") + exportPath); + emit transactionExported(exportPath); }); } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 4d5685f97..3a8127a4d 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -212,7 +212,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void failedDeleteWallet(); void successDeleteWallet(); void walletSeedAuthFailed(); - void transactionExported(const QString& successMessage); + void transactionExported(const QString& destFilename); void transactionExportFailed(const QString& errorMessage); void successTx(); void failedTx(const QString&); diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 27d3e00c9..783eea222 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -112,7 +112,7 @@ CustomPopup { Connections { target: bsApp onTransactionExported: (text) => { - successDialog.details_text = text + successDialog.details_text = qsTr("Transaction successfully exported to ") + text successDialog.open() } onTransactionExportFailed: (text) => { From d4f64fad98db9d3574530cb096d2113a17e840ec Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 31 Mar 2023 16:26:04 +0200 Subject: [PATCH 325/436] String formatting --- GUI/QtQuick/qml/Send/SendPopup.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 783eea222..dcabc6e7f 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -112,7 +112,7 @@ CustomPopup { Connections { target: bsApp onTransactionExported: (text) => { - successDialog.details_text = qsTr("Transaction successfully exported to ") + text + successDialog.details_text = qsTr("Transaction successfully exported to %1").arg(text) successDialog.open() } onTransactionExportFailed: (text) => { From d52b5f0dc990b82d47c798c27f2a2cd6e1a5e722 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Fri, 31 Mar 2023 19:34:31 +0300 Subject: [PATCH 326/436] [QT-91] delete watch-only wallet --- GUI/QtQuick/qml/CreateWallet/WalletName.qml | 7 ++ .../qml/WalletProperties/DeleteWallet.qml | 8 +++ .../qml/WalletProperties/DeleteWalletWarn.qml | 64 +++++++++++++++++-- .../WalletPropertiesPopup.qml | 47 +++++++------- 4 files changed, 98 insertions(+), 28 deletions(-) diff --git a/GUI/QtQuick/qml/CreateWallet/WalletName.qml b/GUI/QtQuick/qml/CreateWallet/WalletName.qml index 7399948ae..57a2700e8 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletName.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletName.qml @@ -48,6 +48,13 @@ ColumnLayout { title_text: qsTr("Wallet Name") placeholder_text: qsTr("Primary wallet") + + onEnterPressed: { + confirm_but.click_enter() + } + onReturnPressed: { + confirm_but.click_enter() + } } Label { diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml index ec9de790a..2485cfc49 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml @@ -26,10 +26,18 @@ ColumnLayout { target:bsApp function onSuccessDeleteWallet () { + if (!layout.visible) { + return + } + layout.sig_success() } function onFailedDeleteWallet() { + if (!layout.visible) { + return + } + showError(qsTr("Failed to delete")) } } diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml index 185824431..85d5fcd48 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml @@ -16,10 +16,38 @@ ColumnLayout { signal viewWalletSeed() signal exportWOWallet() - signal deleteWallet() + signal deleteSWWallet() + signal sig_success() property var wallet_properties_vm + Connections + { + target:bsApp + function onSuccessDeleteWallet () + { + if (!layout.visible) { + return + } + + layout.sig_success() + } + function onFailedDeleteWallet() + { + if (!layout.visible) { + return + } + + showError(qsTr("Failed to delete")) + } + } + + CustomMessageDialog { + id: error_dialog + error: qsTr("Failed to delete") + visible: false + } + CustomTitleLabel { id: title Layout.alignment: Qt.AlignCenter @@ -56,7 +84,7 @@ ColumnLayout { CustomButton { text: qsTr("View wallet seed") - visible: !wallet_properties_vm.isHardware && !wallet_properties_vm.isWatchingOnly + visible: !isHW() Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom @@ -68,7 +96,7 @@ ColumnLayout { CustomButton { text: qsTr("Export watching-only wallet") - visible: wallet_properties_vm.isHardware || wallet_properties_vm.isWatchingOnly + visible: isHW() Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom @@ -79,7 +107,7 @@ ColumnLayout { } CustomButton { - text: qsTr("Continue") + text: isHW() ? qsTr("Delete") : qsTr("Continue") preferred: true Layout.bottomMargin: 40 @@ -87,7 +115,33 @@ ColumnLayout { width: 260 - onClicked: deleteWallet() + onClicked: { + if (isHW()) { + const result = bsApp.deleteWallet( + wallet_properties_vm.walletId, + "" + ) + + if (result === -1) { + showError(qsTr("Failed to delete")) + } + } + else{ + deleteSWWallet() + } + } } } + + function isHW(){ + return wallet_properties_vm.isHardware || wallet_properties_vm.isWatchingOnly + } + + function showError(msg) + { + error_dialog.error = msg + error_dialog.show() + error_dialog.raise() + error_dialog.requestActivate() + } } diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 892151fd8..24a3fc573 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -44,8 +44,9 @@ CustomPopup { wallet_properties_vm: root.wallet_properties_vm onSig_success: { - _stack_view.push(success) - success.details_text = qsTr("Your password has successfully been changed") + root.close_click() + + show_popup(qsTr("Your password has successfully been changed")) } } @@ -58,11 +59,9 @@ CustomPopup { onSig_success: (nameExport, pathExport) => { root.close_click() - success_dialog.details_text = qsTr("Your watching-only wallet has successfully been exported\n\nFilename:\t%1\nFolder:\t%2").arg(nameExport).arg(pathExport) - - success_dialog.show() - success_dialog.raise() - success_dialog.requestActivate() + show_popup(qsTr("Your watching-only wallet has successfully been exported\n\nFilename:\t%1\nFolder:\t%2") + .arg(nameExport) + .arg(pathExport)) } } @@ -94,10 +93,14 @@ CustomPopup { _stack_view.push(wallet_seed_auth) wallet_seed_auth.init() } - onDeleteWallet: { + onDeleteSWWallet: { _stack_view.push(delete_wallet) delete_wallet.init() } + onSig_success: { + root.close_click() + show_popup(qsTr("Wallet has successfully been deleted")) + } } DeleteWallet { @@ -108,24 +111,14 @@ CustomPopup { wallet_properties_vm: root.wallet_properties_vm onWalletDeleted: { - _stack_view.push(success) - success.details_text = qsTr("Wallet %1 has successfully been deleted").arg(wallet_properties_vm.walletName) + root.close_click() + + show_popup(qsTr("Wallet %1 has successfully been deleted").arg(wallet_properties_vm.walletName)) } onSig_success: { - _stack_view.push(success) - success.details_text = qsTr("Wallet has successfully been deleted") - } - } - - CustomSuccessWidget { - id: success + root.close_click() - visible: false - details_font_size: 16 - details_font_weight: Font.Medium - onSig_finish: { - //root.close() - _stack_view.pop(null) + show_popup(qsTr("Wallet has successfully been deleted")) } } @@ -418,4 +411,12 @@ CustomPopup { } } } + + function show_popup(success_) { + success_dialog.details_text = success_ + + success_dialog.show() + success_dialog.raise() + success_dialog.requestActivate() + } } From d68ff66cb1d818e2b64e51565a747495670f8dcc Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Fri, 31 Mar 2023 21:59:05 +0300 Subject: [PATCH 327/436] fix comments --- GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml index 85d5fcd48..13fc9b2a8 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml @@ -96,7 +96,7 @@ ColumnLayout { CustomButton { text: qsTr("Export watching-only wallet") - visible: isHW() + visible: !isHW() Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom From d84942f1c963b8fa18a0a5e3a103934cc244911c Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Sun, 2 Apr 2023 15:12:48 +0300 Subject: [PATCH 328/436] TX export --- GUI/QtQuick/QtQuickAdapter.cpp | 91 +++++++++++++++++-- GUI/QtQuick/QtQuickAdapter.h | 4 + GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 1 + common | 2 +- 4 files changed, 89 insertions(+), 9 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index db98e2806..b1ff637cb 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2007,9 +2007,16 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq { logger_->debug("[{}] {}", __func__, response.DebugString()); const auto& itReq = txReqs_.find(msgId); + auto txReq = bs::signer::pbTxRequestToCore(response.tx_sign_request(), logger_); if (itReq == txReqs_.end()) { - logger_->error("[{}] unknown request #{}", __func__, msgId); - return bs::message::ProcessingResult::Error; + if (txSaveReqs_.empty()) { + logger_->error("[{}] unknown request #{}", __func__, msgId); + return bs::message::ProcessingResult::Error; + } + const auto exportPath = *txSaveReqs_.rbegin(); + txSaveReqs_.pop_back(); + saveTransaction(txReq, exportPath); + return bs::message::ProcessingResult::Success; } auto qReq = itReq->second.txReq; const bool noReqAmount = itReq->second.isMaxAmount; @@ -2019,7 +2026,6 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq qReq->setError(QString::fromStdString(response.error_text())); return bs::message::ProcessingResult::Success; } - auto txReq = bs::signer::pbTxRequestToCore(response.tx_sign_request(), logger_); std::unordered_set hdWalletIds; for (const auto& walletId : txReq.walletIds) { @@ -2387,10 +2393,79 @@ void QtQuickAdapter::notifyNewTransaction(const bs::TXEntry& tx) void QtQuickAdapter::exportTransaction(const QUrl& path, QTXSignRequest* request) { - const QString exportPath = path.toLocalFile(); - logger_->debug("[{}] exporting transaction to {}", __func__, exportPath.toStdString()); + txSaveReqs_.push_back(path.toLocalFile().toStdString()); +} - QTimer::singleShot(1000, [this, exportPath](){ - emit transactionExported(exportPath); - }); +void QtQuickAdapter::saveTransaction(const bs::core::wallet::TXSignRequest& txReq, const std::string& exportPath) +{ + if (txReq.walletIds.empty()) { + emit transactionExportFailed(tr("TX request doesn't contain wallets")); + return; + } + const auto& timestamp = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + auto walletId = *txReq.walletIds.cbegin(); + for (const auto& hdWallet : hdWallets_) { + for (const auto& leaf : hdWallet.second.leaves) { + if (leaf.first == walletId) { + walletId = hdWallet.first; + break; + } + } + } + const std::string filename = "BlockSettle_" + walletId + "_" + std::to_string(timestamp) + "_unsigned.bin"; + const auto& pathName = exportPath + "/" + filename; + logger_->debug("[{}] exporting transaction to {}", __func__, pathName); + const auto& txSer = bs::signer::coreTxRequestToPb(txReq, false).SerializeAsString(); + + auto f = fopen(pathName.c_str(), "wb"); + if (!f) { + emit transactionExportFailed(tr("Failed to open %1 for writing").arg(QString::fromStdString(pathName))); + return; + } + if (fwrite(txSer.data(), 1, txSer.size(), f) != txSer.size()) { + logger_->error("[{}] failed to write {} bytes to {}", __func__, txSer.size(), pathName); + emit transactionExportFailed(tr("Failed to write %1 bytes to %2. Disk full?") + .arg(txSer.size()).arg(QString::fromStdString(pathName))); + return; + } + fclose(f); + logger_->debug("[{}] exporting {} done", __func__, pathName); + emit transactionExported(QString::fromStdString(pathName)); +} + +QTXSignRequest* QtQuickAdapter::importTransaction(const QUrl& path) +{ + const auto& pathName = path.toLocalFile().toStdString(); + auto f = fopen(pathName.c_str(), "rb"); + if (!f) { + emit transactionImportFailed(tr("Failed to open %1 for reading") + .arg(QString::fromStdString(pathName))); + return nullptr; + } + std::string txSer; + char buf[512]; + size_t rc = 0; + while ((rc = fread(buf, 1, sizeof(buf), f)) > 0) { + txSer.append(std::string(buf, rc)); + } + if (txSer.empty()) { + emit transactionImportFailed(tr("Failed to read from %1") + .arg(QString::fromStdString(pathName))); + return nullptr; + } + Blocksettle::Communication::headless::SignTxRequest msg; + if (!msg.ParseFromString(txSer)) { + emit transactionImportFailed(tr("Failed to parse %1 bytes from %2") + .arg(txSer.size()).arg(QString::fromStdString(pathName))); + return nullptr; + } + const auto& txReq = bs::signer::pbTxRequestToCore(msg); + if (!txReq.isValid()) { + emit transactionImportFailed(tr("Failed to obtain valid data from %1") + .arg(QString::fromStdString(pathName))); + return nullptr; + } + auto txSignRequest = new QTXSignRequest(logger_, this); + txSignRequest->setTxSignReq(txReq); + return txSignRequest; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 3a8127a4d..6a7aca0f2 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -189,6 +189,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE int renameWallet(const QString& walletId, const QString& newName); Q_INVOKABLE void walletSelected(int); Q_INVOKABLE void exportTransaction(const QUrl& path, QTXSignRequest* request); + Q_INVOKABLE QTXSignRequest* importTransaction(const QUrl& path); void notifyNewTransaction(const bs::TXEntry& tx); signals: @@ -214,6 +215,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void walletSeedAuthFailed(); void transactionExported(const QString& destFilename); void transactionExportFailed(const QString& errorMessage); + void transactionImportFailed(const QString& errorMessage); void successTx(); void failedTx(const QString&); void showSuccess(const QString&); @@ -241,6 +243,7 @@ private slots: void updateStates(); void setTopBlock(uint32_t); void loadPlugins(QQmlApplicationEngine&); + void saveTransaction(const bs::core::wallet::TXSignRequest&, const std::string& pathName); void createWallet(bool primary); std::string hdWalletIdByIndex(int); @@ -326,6 +329,7 @@ private slots: BlockSettle::Common::WalletsMessage msg{}; }; std::map txReqs_; + std::vector txSaveReqs_; std::unordered_map hwwReady_; std::map txDetailReqs_; std::map settingsCache_; diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index 7c594fe75..b404a83ed 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -55,6 +55,7 @@ void qtquick_gui::WalletPropertiesVM::setWalletSeed(const std::string& walletId, return; } seed_ = QString::fromStdString(seed).split(QLatin1Char(' ')); + logger_->debug("[{}] seed length: {}", __func__, seed_.size()); emit seedChanged(); } diff --git a/common b/common index 3ab5d4c16..de2e8a11d 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 3ab5d4c16a148d329e69b6b69369408d17b499c8 +Subproject commit de2e8a11d4d28c14ade06a9749ea0f472653974a From 441b5691853bb5fd302cf6b6aa6423e8428945aa Mon Sep 17 00:00:00 2001 From: YZ Date: Mon, 3 Apr 2023 00:48:27 +0200 Subject: [PATCH 329/436] Several fixes --- GUI/QtQuick/AddressFilterModel.cpp | 2 +- GUI/QtQuick/TxListModel.cpp | 6 ------ .../qml/Overview/OverviewWalletBar.qml | 5 +---- GUI/QtQuick/qml/Send/SendPopup.qml | 20 ++++++++++++------- .../qml/Settings/DeleteArmoryServer.qml | 2 +- 5 files changed, 16 insertions(+), 19 deletions(-) diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp index 752d1a4e4..f36199f5e 100644 --- a/GUI/QtQuick/AddressFilterModel.cpp +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -17,7 +17,7 @@ AddressFilterModel::AddressFilterModel(std::shared_ptr setti , settings_(settings) { setDynamicSortFilter(true); - sort(0, Qt::AscendingOrder); + sort(2, Qt::AscendingOrder); connect(this, &AddressFilterModel::changed, this, &AddressFilterModel::invalidate); if (settings_ != nullptr) diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 225b20be9..2b7848f4c 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -109,12 +109,6 @@ QColor TxListModel::dataColor(int row, int col) const default: break; } } - return QColorConstants::White; - } - else if (col == 4) { - if (entry.value < 0) { - return qRgb(208, 192, 192); - } } return QColorConstants::White; } diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index 053a57e2b..1ab4566e5 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -46,10 +46,7 @@ Rectangle { fontSize: 16 onCurrentIndexChanged: { - if (walletBalances.rowCount === 0) { - control.createNewWallet() - } - else { + if (walletBalances.rowCount !== 0) { bsApp.walletSelected(wallet_selection_combobox.currentIndex) control.walletIndexChanged(wallet_selection_combobox.currentIndex) walletBalances.selectedWallet = wallet_selection_combobox.currentIndex diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index dcabc6e7f..b747817f9 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -100,25 +100,31 @@ CustomPopup { } CustomSuccessDialog { - id: successDialog + id: exportTransactionSuccessDailog visible: false } CustomFailDialog { - id: failDialog + id: exportTransactionFailDialog visible: false } Connections { target: bsApp onTransactionExported: (text) => { - successDialog.details_text = qsTr("Transaction successfully exported to %1").arg(text) - successDialog.open() + exportTransactionSuccessDailog.details_text = qsTr("Transaction successfully exported to %1").arg(text) + + exportTransactionSuccessDailog.show() + exportTransactionSuccessDailog.raise() + exportTransactionSuccessDailog.requestActivate() } onTransactionExportFailed: (text) => { - failDialog.header = qsTr("Export transaction failed") - failDialog.fail = text - failDialog.open() + exportTransactionFailDialog.header = qsTr("Export transaction failed") + exportTransactionFailDialog.fail = text + + exportTransactionFailDialog.show() + exportTransactionFailDialog.raise() + exportTransactionFailDialog.requestActivate() } } diff --git a/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml b/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml index 8602c9c7f..20e36091c 100644 --- a/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml @@ -96,6 +96,6 @@ ColumnLayout { function init() { - back_but.forceActiveFocus() + delete_but.forceActiveFocus() } } From 4a28abbea8bc4a61a73616b487ce33889e586c01 Mon Sep 17 00:00:00 2001 From: YZ Date: Mon, 3 Apr 2023 01:34:22 +0200 Subject: [PATCH 330/436] Export transaction fix --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 6 +++--- GUI/QtQuick/qml/Send/SimpleDetails.qml | 4 ++-- GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml | 4 ++++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index deba52a30..e27c877b5 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -495,7 +495,7 @@ ColumnLayout { Layout.leftMargin: 16 Layout.rightMargin: 16 - model:txOutputsModel + model: txOutputsModel columnWidths: [0.744, 0.20, 0.056] copy_button_column_index: -1 @@ -544,7 +544,7 @@ ColumnLayout { Layout.bottomMargin: 30 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - text: tempRequest !== null ? (tempRequest.isWatchingOnly ? qstr("Export transaction") : qsTr("Continue")) : "" + text: bsApp.walletProperitesVM.isWatchingOnly ? qsTr("Export transaction") : qsTr("Continue") preferred: true @@ -582,7 +582,7 @@ ColumnLayout { fee_suggest_combo.input_text = fee_suggest_combo.currentText } - if (tempRequest !== null && tempRequest.isWatchigOnly) + if (bsApp.walletProperitesVM.isWatchingOnly) { exportFileDialog.open() } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 3db017ebb..a70a63ff1 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -214,7 +214,7 @@ ColumnLayout { Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - text: tempRequest !== null ? (tempRequest.isWatchingOnly ? qstr("Export transaction") : qsTr("Continue")) : "" + text: bsApp.walletProperitesVM.isWatchingOnly ? qsTr("Export transaction") : qsTr("Continue") preferred: true @@ -230,7 +230,7 @@ ColumnLayout { fee_suggest_combo.input_text = fee_suggest_combo.currentText } - if (tempRequest !== null && tempRequest.isWatchingOnly) + if (bsApp.walletProperitesVM.isWatchingOnly) { exportFileDialog.open() } diff --git a/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml index e4318cf16..b51e57a97 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml @@ -52,6 +52,10 @@ ColumnLayout { font.family: "Roboto" font.weight: Font.Normal color: "#E2E7FF" + wrapMode: Text.Wrap + Layout.maximumWidth: parent.width + Layout.leftMargin: 10 + Layout.rightMargin: 10 } Label { From 657f3e5c9626aef16a770ba4c6ff8c1fdb8c4cb7 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Mon, 3 Apr 2023 09:05:22 +0300 Subject: [PATCH 331/436] [QT-23,82,91,102] Delete Wallet and View Wallet Seed --- GUI/QtQuick/QtQuickAdapter.cpp | 4 +- GUI/QtQuick/QtQuickAdapter.h | 5 +- GUI/QtQuick/WalletBalancesModel.cpp | 2 + GUI/QtQuick/qml/Send/SignTransaction.qml | 4 - GUI/QtQuick/qml/TransactionsPage.qml | 9 +- .../qml/WalletProperties/ChangePassword.qml | 1 + .../qml/WalletProperties/DeleteWalletWarn.qml | 8 +- .../qml/WalletProperties/ExportWOWallet.qml | 1 + .../qml/WalletProperties/RenameWallet.qml | 202 ++++++++---------- .../WalletPropertiesPopup.qml | 41 ++-- .../qml/WalletProperties/WalletSeedAuth.qml | 41 +++- 11 files changed, 157 insertions(+), 161 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index b1ff637cb..42ab9374f 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1836,11 +1836,11 @@ bs::message::ProcessingResult QtQuickAdapter::processWalletDeleted(const std::st bs::message::ProcessingResult QtQuickAdapter::processWalletSeed(const BlockSettle::Common::SignerMessage_WalletSeed& response) { if (response.bip39_seed().empty()) { - emit showError(tr("Failed to obtain wallet seed")); - emit walletSeedAuthFailed(); + emit walletSeedAuthFailed(tr("Failed to obtain wallet seed")); return bs::message::ProcessingResult::Error; } walletPropertiesModel_->setWalletSeed(response.wallet_id(), response.bip39_seed()); + emit walletSeedAuthSuccess(); return bs::message::ProcessingResult::Success; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 6a7aca0f2..01bf70b7a 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -207,12 +207,13 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void showError(const QString&); void showFail(const QString&, const QString&); void showNotification(QString, QString); - void successExport(QString nameExport); + void successExport(const QString nameExport); void requestWalletSelection(quint32 index); void successChangePassword(); void failedDeleteWallet(); void successDeleteWallet(); - void walletSeedAuthFailed(); + void walletSeedAuthFailed(const QString&); + void walletSeedAuthSuccess(); void transactionExported(const QString& destFilename); void transactionExportFailed(const QString& errorMessage); void transactionImportFailed(const QString& errorMessage); diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index 6eb6c0e55..ff2a8d8e9 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -128,6 +128,8 @@ void WalletBalancesModel::deleteWallet(const std::string& walletId) endRemoveRows(); emit rowCountChanged(); emit changed(); + if (idx >= wallets_.size()) + emit walletSelected(wallets_.size() - 1); }); } diff --git a/GUI/QtQuick/qml/Send/SignTransaction.qml b/GUI/QtQuick/qml/Send/SignTransaction.qml index ed751e7e8..c8e2726a1 100644 --- a/GUI/QtQuick/qml/Send/SignTransaction.qml +++ b/GUI/QtQuick/qml/Send/SignTransaction.qml @@ -412,10 +412,6 @@ ColumnLayout { running = false password.value = "" - if (fail_dialog.visible) { - fail_dialog.close() - } - sig_time_finished() } } diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index c11927fcd..ab22cadf6 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -174,13 +174,6 @@ Item { custom_icon.height: 10 onClicked: { - //There is a qtquick problem on setting currentFile. - - // fileDialogCSV.currentFile = "%1/BlockSettle_%2_%3_%4.csv" - // .arg(fileDialogCSV.folder) - // .arg(txWalletsComboBox.currentIndex === 0 ? "all" : txWalletsComboBox.currentText) - // .arg(txListModel.getBegDate()) - // .arg(txListModel.getEndDate()) var csvFile = "%1/BlockSettle_%2_%3_%4.csv" .arg(fileDialogCSV.folder) .arg(txWalletsComboBox.currentIndex === 0 ? "all" : txWalletsComboBox.currentText) @@ -188,7 +181,7 @@ Item { .arg(txListModel.getEndDate()) if (txListModel.exportCSVto(csvFile)) { - succes_dialog.path_name = csvFile.substring(("file:///").length, csvFile.length) + succes_dialog.path_name = csvFile.replace(/^(file:\/{3})/,"") show_popup(succes_dialog) } else { diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml index ed3158a82..7a06b5f63 100644 --- a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -51,6 +51,7 @@ ColumnLayout { input_topMargin: 35 title_leftMargin: 16 title_topMargin: 16 + activeFocusOnTab: true title_text: qsTr("Password") diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml index 13fc9b2a8..e6cf9f17f 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml @@ -70,7 +70,7 @@ ColumnLayout { font.pixelSize: 14 Layout.alignment: Qt.AlignCenter Layout.preferredHeight : title.height - text: qsTr("Save the seed before deleting the wallet") + text: isHW() ? qsTr("Are you sure you want to delete this wallet?") : qsTr("Save the seed before deleting the wallet") } Label { @@ -89,7 +89,7 @@ ColumnLayout { Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom - width: 260 + width: 160 onClicked: viewWalletSeed() } @@ -101,7 +101,7 @@ ColumnLayout { Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom - width: 260 + width: 180 onClicked: exportWOWallet() } @@ -113,7 +113,7 @@ ColumnLayout { Layout.bottomMargin: 40 Layout.alignment: Qt.AlignBottom - width: 260 + width: isHW() ? 260 : 160 onClicked: { if (isHW()) { diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml index 9ad8dfd34..54a821f2d 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -13,6 +13,7 @@ ColumnLayout { signal sig_success(string nameExport, string pathExport) property var wallet_properties_vm + property bool isExitWhenSuccess height: 548 width: 580 diff --git a/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml b/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml index f69226737..2904fcfb9 100644 --- a/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml @@ -6,26 +6,18 @@ import QtQuick.Layouts 1.15 import "../BsStyles" import "../StyledControls" -CustomPopup { - id: root +ColumnLayout { - property alias header: title.text - property alias wallet_name: input.input_text - property var wallet_properties_vm - - signal sig_confirm() + id: layout - visible: true - flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog - modality: Qt.WindowModal + height: 548 + width: 580 - height: 375 - width: 400 + anchors.fill: parent - color: "transparent" + signal back() - x: mainWindow.x + (mainWindow.width - width)/2 - y: mainWindow.y + (mainWindow.height - height)/2 + property var wallet_properties_vm CustomMessageDialog { id: error_dialog @@ -33,128 +25,104 @@ CustomPopup { visible: false } + CustomTitleLabel { + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + text: qsTr("Rename your wallet") + } - Rectangle { - id: rect - - color: "#191E2A" - opacity: 1 - radius: 16 - - anchors.fill: parent - - border.color : BSStyle.defaultBorderColor - border.width : 1 - - ColumnLayout { + CustomTextInput { + id: input - id: layout + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : 70 + Layout.preferredWidth: 532 + Layout.topMargin: 10 - anchors.fill: parent + input_topMargin: 35 + title_leftMargin: 16 + title_topMargin: 16 + activeFocusOnTab: true - CustomTitleLabel { - id: title - Layout.topMargin: 32 - Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : title.height - text: qsTr("Rename your wallet") - } + title_text: qsTr("Wallet Name") - CustomTextInput { - id: input + onEnterPressed: { + accept_but.click_enter() + } + onReturnPressed: { + accept_but.click_enter() + } + } - Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 375 - Layout.topMargin: 32 + Label { + id: spacer + Layout.fillWidth: true + Layout.fillHeight: true + } - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 - activeFocusOnTab: true + RowLayout { + id: row + spacing: 10 - title_text: qsTr("Wallet Name") + anchors.bottom: parent.bottom + anchors.bottomMargin: 40 + anchors.horizontalCenter: parent.horizontalCenter - onEnterPressed: { - accept_but.click_enter() - } - onReturnPressed: { - accept_but.click_enter() - } - } + CustomButton { + id: cancel_but + text: qsTr("Cancel") + width: 260 - Label { - id: spacer - Layout.fillWidth: true - Layout.fillHeight: true + preferred: false + function click_enter() { + back() } + } - RowLayout { - id: row - spacing: 10 - - anchors.bottom: parent.bottom - anchors.bottomMargin: 40 - anchors.horizontalCenter: parent.horizontalCenter + CustomButton { + id: accept_but + text: qsTr("Accept") + width: 260 - CustomButton { - id: cancel_but - text: qsTr("Cancel") - width: 190 + preferred: true - preferred: false - function click_enter() { - //root.clean() - root.close() - } + function click_enter() { + if (bsApp.isWalletNameExist(input.input_text)) { + showError(qsTr("Wallet name already exist")) } - - CustomButton { - id: accept_but - text: qsTr("Accept") - width: 190 - - preferred: true - - function click_enter() { - if (bsApp.isWalletNameExist(input.input_text)) { - showError(qsTr("Wallet name already exist")) - } - else { - if (bsApp.renameWallet(wallet_properties_vm.walletId, input.input_text) === 0) { - root.sig_confirm() - root.close() - } - else { - showError(qsTr("Failed to rename wallet")) - } - } + else { + if (bsApp.renameWallet(wallet_properties_vm.walletId, input.input_text) === 0) { + layout.back() + } + else { + showError(qsTr("Failed to rename wallet")) } - } } - Keys.onEnterPressed: { - confirm_but.click_enter() - } + } + } - Keys.onReturnPressed: { - confirm_but.click_enter() - } + Keys.onEnterPressed: { + confirm_but.click_enter() + } - function init() - { - input.setActiveFocus() - } + Keys.onReturnPressed: { + confirm_but.click_enter() + } - function showError(error) - { - error_dialog.error = error - error_dialog.show() - error_dialog.raise() - error_dialog.requestActivate() - init() - } - } + function init() + { + input.input_text = wallet_properties_vm.walletName + input.setActiveFocus() + } + + function showError(error) + { + error_dialog.error = error + error_dialog.show() + error_dialog.raise() + error_dialog.requestActivate() } -} \ No newline at end of file +} diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 24a3fc573..97f370e58 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -18,16 +18,6 @@ CustomPopup { property var wallet_properties_vm property bool walletSeedRequested: false - Connections { - target: bsApp - onWalletSeedAuthFailed: { - if (_stack_view.currentItem == wallet_seed_auth || - _stack_view.currentItem == wallet_seed) { - _stack_view.replace(wallet_seed_auth) - } - } - } - x: mainWindow.x + (mainWindow.width - width)/2 y: mainWindow.y + (mainWindow.height - height)/2 @@ -35,6 +25,8 @@ CustomPopup { id: rename_wallet visible: false wallet_properties_vm: root.wallet_properties_vm + + onBack: _stack_view.pop() } ChangePassword { @@ -57,11 +49,20 @@ CustomPopup { wallet_properties_vm: root.wallet_properties_vm onSig_success: (nameExport, pathExport) => { - root.close_click() + if (export_wo_wallet.isExitWhenSuccess) { + root.close_click() - show_popup(qsTr("Your watching-only wallet has successfully been exported\n\nFilename:\t%1\nFolder:\t%2") - .arg(nameExport) - .arg(pathExport)) + show_popup(qsTr("Your watching-only wallet has successfully been exported\n\nFilename:\t%1\nFolder:\t%2") + .arg(nameExport) + .arg(pathExport)) + } + else { + _stack_view.pop() + + show_popup(qsTr("Your watching-only wallet has successfully been exported\n\nFilename:\t%1\nFolder:\t%2") + .arg(nameExport) + .arg(pathExport)) + } } } @@ -87,6 +88,7 @@ CustomPopup { visible: false wallet_properties_vm: root.wallet_properties_vm onExportWOWallet: { + export_wo_wallet.isExitWhenSuccess = false _stack_view.push(export_wo_wallet) } onViewWalletSeed: { @@ -126,9 +128,6 @@ CustomPopup { id: success_dialog visible: false - onSig_finish: { - root.close_click() - } } Rectangle { @@ -196,11 +195,8 @@ CustomPopup { MouseArea { anchors.fill: parent onClicked: { - rename_wallet.wallet_name = wallet_name.text - - rename_wallet.show() - rename_wallet.raise() - rename_wallet.requestActivate() + _stack_view.push(rename_wallet) + rename_wallet.init() } } } @@ -370,6 +366,7 @@ CustomPopup { title_text: qsTr("Export watching-only wallet") onClicked: { + export_wo_wallet.isExitWhenSuccess = true _stack_view.push(export_wo_wallet) } } diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml index a6cf5491f..648255ed0 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml @@ -18,6 +18,24 @@ ColumnLayout { signal authorized() + Connections { + target: bsApp + function onWalletSeedAuthFailed(error) { + init() + show_error(error) + } + function onWalletSeedAuthSuccess() { + authorized() + clear() + } + } + + CustomFailDialog { + id: fail_dialog + header: "Error" + visible: false + } + CustomTitleLabel { id: title Layout.alignment: Qt.AlignCenter @@ -41,6 +59,13 @@ ColumnLayout { isPassword: true isHiddenText: true + + onEnterPressed: { + confirm_but.click_enter() + } + onReturnPressed: { + confirm_but.click_enter() + } } Label { @@ -61,12 +86,16 @@ ColumnLayout { enabled: (password.input_text !== "") function click_enter() { + if (!confirm_but.enabled) { + return + } + const result = bsApp.viewWalletSeedAuth( wallet_properties_vm.walletId, password.input_text ) - if (result === 0) { - authorized() + if (result !== 0) { + show_error(qsTr("Failed to send wallet seed message")) clear() } } @@ -91,4 +120,12 @@ ColumnLayout { password.isValid = true password.input_text = "" } + + function show_error(error) + { + fail_dialog.fail = error + fail_dialog.show() + fail_dialog.raise() + fail_dialog.requestActivate() + } } From 97d153379a10c61f5c835f1823439dff1edc8994 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Mon, 3 Apr 2023 15:11:51 +0300 Subject: [PATCH 332/436] [QT-100,101] Advanced Transaction && Create Tx && Fix comments --- GUI/QtQuick/QtQuickAdapter.h | 2 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 63 ++++++++++++++++--- .../WalletPropertiesPopup.qml | 12 ++-- .../qml/WalletProperties/WalletSeedAuth.qml | 2 +- 4 files changed, 62 insertions(+), 17 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 01bf70b7a..b5825ccd5 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -207,7 +207,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void showError(const QString&); void showFail(const QString&, const QString&); void showNotification(QString, QString); - void successExport(const QString nameExport); + void successExport(const QString& nameExport); void requestWalletSelection(quint32 index); void successChangePassword(); void failedDeleteWallet(); diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index deba52a30..e36181419 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -25,13 +25,15 @@ ColumnLayout { property var tx: null property bool isRBF: false property bool isCPFP: false + property bool is_ready_broadcast: (txOutputsModel.rowCount > 1) && rec_addr_input.input_text.length === 0 && amount_input.input_text.length === 0 + property bool is_ready_output: (rec_addr_input.isValid && rec_addr_input.input_text.length + && parseFloat(amount_input.input_text) !== 0 && amount_input.input_text.length) Connections { target:tx function onUpdated () { - bsApp.requestFeeSuggestions() if (isRBF) { txOutputsModel.setOutputsFrom(tx) } @@ -409,6 +411,18 @@ ColumnLayout { wallets_current_index: from_wallet_combo.currentIndex + onEnterPressed: { + if (!processEnterKey()) { + amount_input.setActiveFocus() + } + } + + onReturnPressed: { + if (!processEnterKey()) { + amount_input.setActiveFocus() + } + } + onFocus_next: { amount_input.setActiveFocus() } @@ -424,6 +438,18 @@ ColumnLayout { width: 504 height: 70 + + onEnterPressed: { + if (!processEnterKey()) { + comment_input.setActiveFocus() + } + } + + onReturnPressed: { + if (!processEnterKey()) { + comment_input.setActiveFocus() + } + } } CustomTextEdit { @@ -454,16 +480,14 @@ ColumnLayout { activeFocusOnTab: include_output_but.enabled - enabled: isRBF || (rec_addr_input.isValid && rec_addr_input.input_text.length - && parseFloat(amount_input.input_text) !== 0 && amount_input.input_text.length) + enabled: isRBF || is_ready_output + preferred: !isRBF && is_ready_output icon.source: "qrc:/images/plus.svg" icon.color: include_output_but.enabled ? "#45A6FF" : BSStyle.buttonsDisabledTextColor width: 504 - preferred: false - function click_enter() { if (!include_output_but.enabled) return @@ -473,6 +497,9 @@ ColumnLayout { } txOutputsModel.addOutput(rec_addr_input.input_text, amount_input.input_text) + + rec_addr_input.input_text = "" + amount_input.input_text = "" } } @@ -538,6 +565,7 @@ ColumnLayout { activeFocusOnTab: continue_but.enabled enabled: (txOutputsModel.rowCount > 1) + preferred: isRBF || is_ready_broadcast width: 1084 @@ -546,8 +574,6 @@ ColumnLayout { text: tempRequest !== null ? (tempRequest.isWatchingOnly ? qstr("Export transaction") : qsTr("Continue")) : "" - preferred: true - function prepare_transaction() { if (isRBF) { return bsApp.createTXSignRequest(-1 //special index for RBF mode @@ -577,6 +603,9 @@ ColumnLayout { } function click_enter() { + if (!continue_but.enabled) { + return + } if (!fee_suggest_combo.edit_value()) { fee_suggest_combo.input_text = fee_suggest_combo.currentText @@ -624,6 +653,26 @@ ColumnLayout { } } + function processEnterKey() + { + if (isRBF) { + include_output_but.click_enter() + continue_but.click_enter() + return true + } + + if (is_ready_broadcast) { + continue_but.click_enter() + return true + } + else if (is_ready_output) { + include_output_but.click_enter() + rec_addr_input.setActiveFocus() + return true + } + return false + } + function init() { rec_addr_input.setActiveFocus() diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 97f370e58..8a3c12e0f 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -51,18 +51,14 @@ CustomPopup { onSig_success: (nameExport, pathExport) => { if (export_wo_wallet.isExitWhenSuccess) { root.close_click() - - show_popup(qsTr("Your watching-only wallet has successfully been exported\n\nFilename:\t%1\nFolder:\t%2") - .arg(nameExport) - .arg(pathExport)) } else { _stack_view.pop() - - show_popup(qsTr("Your watching-only wallet has successfully been exported\n\nFilename:\t%1\nFolder:\t%2") - .arg(nameExport) - .arg(pathExport)) } + + show_popup(qsTr("Your watching-only wallet has successfully been exported\n\nFilename:\t%1\nFolder:\t%2") + .arg(nameExport) + .arg(pathExport)) } } diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml index 648255ed0..5d461055f 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml @@ -32,7 +32,7 @@ ColumnLayout { CustomFailDialog { id: fail_dialog - header: "Error" + header: qsTr("Error") visible: false } From e447d28f4918d276f401666e895fa8e4376bfb57 Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Mon, 3 Apr 2023 17:11:04 +0300 Subject: [PATCH 333/436] [QT-95] seed error --- GUI/QtQuick/qml/CreateWallet/ImportWallet.qml | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml index 64b393987..b40116758 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml @@ -27,8 +27,8 @@ ColumnLayout { "17", "18", "19", "20", "21", "22", "23", "24"] - height: radbut_12.checked ? 555 : 779 - width: 580 + height: radbut_12.checked ? 555 : 670 + width: radbut_12.checked? 580: 760 spacing: 0 @@ -138,6 +138,7 @@ ColumnLayout { cellWidth : 180 property bool isValid: true + property bool isEmpty: true property bool hasEmptyWords: true model: radbut_12.checked ? layout.grid_model_12 : layout.grid_model_24 @@ -283,13 +284,16 @@ ColumnLayout { function validate() { grid.isValid = true - for (var i = 0; i < grid.count; i++) - { - if(!grid.itemAtIndex(i).isValid) - { + grid.isEmpty = true + for (var i = 0; i < grid.count; i++) { + if(!grid.itemAtIndex(i).isValid) { grid.isValid = false break } + if (!grid.itemAtIndex(i).input_text.length > 0) { + grid.isEmpty = false + break + } } } @@ -312,7 +316,7 @@ ColumnLayout { Label { id: error_description - visible: !grid.isValid + visible: !grid.isValid && !grid.isEmpty text: qsTr("Invalid seed") @@ -338,6 +342,7 @@ ColumnLayout { width: 530 enabled: !grid.hasEmptyWords preferred: true + Layout.alignment: Qt.AlignCenter function click_enter() { if (!import_but.enabled) return @@ -371,6 +376,7 @@ ColumnLayout { function init() { clear() + radbut_12.checked = true grid.itemAtIndex(0).setActiveFocus() } @@ -383,6 +389,7 @@ ColumnLayout { grid.itemAtIndex(i).input_text = "" } grid.isValid = true + grid.isEmpty = true grid.hasEmptyWords = true } } From fe981dda150af7fad972c1bd769a869352ccc455 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 3 Apr 2023 21:30:47 +0300 Subject: [PATCH 334/436] ZC UTXOs on by default --- GUI/QtQuick/QtQuickAdapter.cpp | 1 + common | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 42ab9374f..5c51aec14 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1662,6 +1662,7 @@ void QtQuickAdapter::getUTXOsForWallet(int walletIndex) WalletsMessage msg; auto msgReq = msg.mutable_get_utxos(); msgReq->set_wallet_id(hdWalletIdByIndex(walletIndex)); + msgReq->set_confirmed_only(false); pushRequest(user_, userWallets_, msg.SerializeAsString()); } diff --git a/common b/common index de2e8a11d..5725e095d 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit de2e8a11d4d28c14ade06a9749ea0f472653974a +Subproject commit 5725e095db99e7b90f381d7932a005e6863212a1 From 3d6cb8ba11f6914340eab146245c604c201548ee Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 3 Apr 2023 21:32:14 +0300 Subject: [PATCH 335/436] removed debug logging --- GUI/QtQuick/QtQuickAdapter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 5c51aec14..021734c11 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1657,7 +1657,6 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri void QtQuickAdapter::getUTXOsForWallet(int walletIndex) { - logger_->debug("[{}] #{}", __func__, walletIndex); txInputsModel_->clear(); WalletsMessage msg; auto msgReq = msg.mutable_get_utxos(); From 4aa67e5b464b3025971280a9e5fe23818ec0f04e Mon Sep 17 00:00:00 2001 From: nikitaromanenko99 Date: Tue, 4 Apr 2023 21:07:53 +0300 Subject: [PATCH 336/436] QT-17 Explorer updates --- GUI/QtQuick/qml/ExplorerPage.qml | 8 +++++++- GUI/QtQuick/qml/main.qml | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml index 0899db00c..42d8778a8 100644 --- a/GUI/QtQuick/qml/ExplorerPage.qml +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -30,6 +30,11 @@ Item { expSearchBox.requestSearchText(txId) } + function setFocus() + { + expSearchBox.forceActiveFocus() + } + ExplorerEmpty { id: explorerEmpty visible: false @@ -90,6 +95,7 @@ Item { clip: true color: 'lightgrey' font.pixelSize: 16 + focus: true function resetSearch() { searchHist = [] @@ -163,7 +169,7 @@ Item { font.pixelSize: 16 color: BSStyle.titleTextColor anchors.fill: parent - visible: !expSearchBox.text && !expSearchBox.activeFocus + visible: !expSearchBox.text verticalAlignment: Text.AlignVCenter } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 8c8f9d803..c3b4094a8 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -342,6 +342,12 @@ ApplicationWindow { PluginsPage { id: pluginPage } + + onCurrentIndexChanged: { + if (currentIndex === 2) { + explorerPage.setFocus() + } + } } footer: Rectangle { @@ -389,6 +395,9 @@ ApplicationWindow { Component.onCompleted: { btnExplorer.setIcons ("qrc:/images/explorer_icon.png", "qrc:/images/explorer_icon_unchoosed.png") } + onClicked: { + explorerPage.setFocus() + } } CustomTabButton { From c9a5c2883f52b47df247885da35f5e26727d11aa Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 5 Apr 2023 01:15:39 +0200 Subject: [PATCH 337/436] Sideshift plugin updates; advances tx max function --- GUI/QtQuick/SideshiftPlugin.cpp | 117 +++++++++++++-- GUI/QtQuick/SideshiftPlugin.h | 72 +++++++-- GUI/QtQuick/TxInputsModel.cpp | 12 ++ GUI/QtQuick/TxInputsModel.h | 1 + GUI/QtQuick/TxOutputsModel.h | 1 + GUI/QtQuick/images/sideshift_right_arrow.png | Bin 3676 -> 0 bytes GUI/QtQuick/images/sideshift_right_arrow.svg | 4 + .../qml/CreateWallet/ImportWatchingWallet.qml | 4 +- .../Plugins/SideShift/SideShiftBuyPage.qml | 28 +++- .../SideShift/SideShiftComboboxWithIcon.qml | 137 ++++++++++++++---- .../Plugins/SideShift/SideShiftMainPage.qml | 25 +--- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 4 + GUI/QtQuick/qml/Send/AmountInput.qml | 4 +- GUI/QtQuick/qtquick.qrc | 2 +- 14 files changed, 330 insertions(+), 81 deletions(-) delete mode 100644 GUI/QtQuick/images/sideshift_right_arrow.png create mode 100644 GUI/QtQuick/images/sideshift_right_arrow.svg diff --git a/GUI/QtQuick/SideshiftPlugin.cpp b/GUI/QtQuick/SideshiftPlugin.cpp index 38f0ed65a..2616d3269 100644 --- a/GUI/QtQuick/SideshiftPlugin.cpp +++ b/GUI/QtQuick/SideshiftPlugin.cpp @@ -15,6 +15,14 @@ #include #include +namespace { + const QHash kCurrencyListRoles { + {CurrencyListModel::CurrencyRoles::NameRole, "name"}, + {CurrencyListModel::CurrencyRoles::CoinRole, "coin"}, + {CurrencyListModel::CurrencyRoles::NetworkRole, "network"} + }; +} + using json = nlohmann::json; class CoinImageProvider : public QQuickImageProvider @@ -29,6 +37,78 @@ class CoinImageProvider : public QQuickImageProvider SideshiftPlugin* parent_; }; +CurrencyListModel::CurrencyListModel(QObject* parent) + : QAbstractListModel(parent) +{ +} + +int CurrencyListModel::rowCount(const QModelIndex&) const +{ + return currencies_.size(); +} + +QVariant CurrencyListModel::data(const QModelIndex& index, int role) const +{ + if (index.row() < 0 || index.row() >= currencies_.size()) { + return QVariant(); + } + switch(role) { + case CurrencyListModel::CurrencyRoles::NameRole: return currencies_.at(index.row()).name; + case CurrencyListModel::CurrencyRoles::CoinRole: return currencies_.at(index.row()).coin; + case CurrencyListModel::CurrencyRoles::NetworkRole: return currencies_.at(index.row()).network; + default: return QVariant(); + } + return QVariant(); +} + +QHash CurrencyListModel::roleNames() const +{ + return kCurrencyListRoles; +} + +void CurrencyListModel::reset(const QList& currencies) +{ + beginResetModel(); + currencies_ = currencies; + endResetModel(); +} + +CurrencyFilterModel::CurrencyFilterModel(QObject* parent) + : QSortFilterProxyModel(parent) +{ + connect(this, &CurrencyFilterModel::changed, this, &CurrencyFilterModel::invalidate); +} + +const QString& CurrencyFilterModel::filter() const +{ + return filter_; +} + +void CurrencyFilterModel::setFilter(const QString& filter) +{ + if (filter_ != filter) { + filter_ = filter; + emit changed(); + } +} + +bool CurrencyFilterModel::filterAcceptsRow(int source_row, + const QModelIndex& source_parent) const +{ + if (filter_.length() == 0) { + return true; + } + + return (sourceModel()->data(index(source_row, 0), CurrencyListModel::CurrencyRoles::NameRole).toString().contains(filter_) + || sourceModel()->data(index(source_row, 0), CurrencyListModel::CurrencyRoles::CoinRole).toString().contains(filter_) + || sourceModel()->data(index(source_row, 0), CurrencyListModel::CurrencyRoles::NetworkRole).toString().contains(filter_)); +} + +bool CurrencyFilterModel::lessThan(const QModelIndex& left, const QModelIndex& right) const +{ + return sourceModel()->data(index(left.row(), 0), CurrencyListModel::CurrencyRoles::NameRole) < + sourceModel()->data(index(right.row(), 0), CurrencyListModel::CurrencyRoles::NameRole); +} struct PostIn : public bs::InData { @@ -118,9 +198,18 @@ SideshiftPlugin::SideshiftPlugin(const std::shared_ptr& logger , QQmlApplicationEngine& engine, QObject* parent) : Plugin(parent), bs::WorkerPool(1, 1), logger_(logger) { + inputListModel_ = new CurrencyListModel(this); + inputFilterModel_ = new CurrencyFilterModel(this); + inputFilterModel_->setSourceModel(inputListModel_); + + outputListModel_ = new CurrencyListModel(this); + outputFilterModel_ = new CurrencyFilterModel(this); + outputFilterModel_->setSourceModel(outputListModel_); + qmlRegisterInterface("SideshiftPlugin"); + qmlRegisterInterface("CurrencyListModel"); + qmlRegisterInterface("CurrencyFilterModel"); engine.addImageProvider(QLatin1Literal("coin"), new CoinImageProvider(this)); - outputCurrencies_.append(QLatin1Literal("BTC")); } SideshiftPlugin::~SideshiftPlugin() @@ -181,17 +270,22 @@ void SideshiftPlugin::init() const auto& response = reply->response; try { const auto& msg = json::parse(response); + QList currencies; for (const auto& coin : msg) { - const auto& currency = coin["coin"].get(); - auto& networks = networksByCur_[currency]; for (const auto& network : coin["networks"]) { - networks.append(QString::fromStdString(network.get())); + currencies.append({ + QString::fromStdString(coin["name"]), + QString::fromStdString(coin["coin"]), + QString::fromStdString(network.get()) + }); } - inputCurrencies_.append(QString::fromStdString(currency)); } + + inputListModel_->reset(currencies); + outputListModel_->reset({ {tr("Bitcoin"), tr("BTC"), tr("")} }); + emit inited(); - logger_->debug("[SideshiftPlugin::init] {} input currencies" - , inputCurrencies_.size()); + logger_->debug("[SideshiftPlugin::init] {} input currencies", currencies.size()); } catch (const json::exception&) { logger_->error("[SideshiftPlugin::init] failed to parse {}", response); @@ -203,9 +297,6 @@ void SideshiftPlugin::init() void SideshiftPlugin::deinit() { cancel(); - networksByCur_.clear(); - inputCurrencies_.clear(); - inputNetworks_.clear(); inputNetwork_.clear(); inputCurrency_.clear(); convRate_.clear(); @@ -319,12 +410,6 @@ void SideshiftPlugin::inputCurrencySelected(const QString& cur) return; } inputCurrency_ = cur; - try { - inputNetworks_ = networksByCur_.at(cur.toStdString()); - } - catch (const std::exception&) { - inputNetworks_.clear(); - } emit inputCurSelected(); } diff --git a/GUI/QtQuick/SideshiftPlugin.h b/GUI/QtQuick/SideshiftPlugin.h index 455ee574d..62b5b88cd 100644 --- a/GUI/QtQuick/SideshiftPlugin.h +++ b/GUI/QtQuick/SideshiftPlugin.h @@ -13,6 +13,8 @@ #include "Plugin.h" #include #include +#include +#include #include "Message/Worker.h" namespace spdlog { @@ -20,6 +22,58 @@ namespace spdlog { } class CoinImageProvider; +struct Currency +{ + QString name; + QString coin; + QString network; +}; + +class CurrencyListModel : public QAbstractListModel +{ + Q_OBJECT +public: + enum CurrencyRoles { + NameRole = Qt::UserRole + 1, + CoinRole, + NetworkRole + }; + + CurrencyListModel(QObject* parent = nullptr); + + int rowCount(const QModelIndex & = QModelIndex()) const override; + QVariant data(const QModelIndex& index, int role) const override; + QHash roleNames() const override; + + void reset(const QList& currencies); + +private: + QList currencies_; +}; + +class CurrencyFilterModel : public QSortFilterProxyModel +{ + Q_OBJECT + Q_PROPERTY(QString filter READ filter WRITE setFilter NOTIFY changed) + +public: + CurrencyFilterModel(QObject* parent = nullptr); + + const QString& filter() const; + void setFilter(const QString& filter); + +protected: + bool filterAcceptsRow(int source_row, + const QModelIndex& source_parent) const override; + bool lessThan(const QModelIndex& left, const QModelIndex& right) const override; + +signals: + void changed(); + +private: + QString filter_; +}; + class SideshiftPlugin: public Plugin, protected bs::WorkerPool { class GetHandler; @@ -39,12 +93,10 @@ class SideshiftPlugin: public Plugin, protected bs::WorkerPool QString icon() const override { return QLatin1Literal("qrc:/images/sideshift_plugin.png"); } QString path() const override { return QLatin1Literal("qrc:/qml/Plugins/SideShift/SideShiftPopup.qml"); } - Q_PROPERTY(QStringList inputCurrencies READ inputCurrencies NOTIFY inited) - QStringList inputCurrencies() const { return inputCurrencies_; } - Q_PROPERTY(QStringList outputCurrencies READ outputCurrencies NOTIFY inited) - QStringList outputCurrencies() const { return outputCurrencies_; } - Q_PROPERTY(QStringList inputNetworks READ inputNetworks NOTIFY inputCurSelected) - QStringList inputNetworks() const { return inputNetworks_; } + Q_PROPERTY(QAbstractItemModel* inputCurrenciesModel READ inputCurrenciesModel NOTIFY inited) + QAbstractItemModel* inputCurrenciesModel() { return inputFilterModel_; } + Q_PROPERTY(QAbstractItemModel* outputCurrenciesModel READ outputCurrenciesModel NOTIFY inited) + QAbstractItemModel* outputCurrenciesModel() { return outputFilterModel_; } Q_PROPERTY(QString conversionRate READ conversionRate NOTIFY pairUpdated) QString conversionRate() const { return convRate_; } @@ -96,9 +148,6 @@ class SideshiftPlugin: public Plugin, protected bs::WorkerPool void* curl_{ nullptr }; std::mutex curlMtx_; - QStringList inputCurrencies_, outputCurrencies_; - std::unordered_map networksByCur_; - QStringList inputNetworks_; QString inputNetwork_; QString inputCurrency_; QString convRate_; @@ -108,4 +157,9 @@ class SideshiftPlugin: public Plugin, protected bs::WorkerPool QString creationDate_, expireDate_; QString orderId_; QString shiftStatus_; + + CurrencyListModel* inputListModel_; + CurrencyFilterModel* inputFilterModel_; + CurrencyListModel* outputListModel_; + CurrencyFilterModel* outputFilterModel_; }; diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index ef1437dd6..5fe2620e4 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -374,6 +374,18 @@ QUTXOList* TxInputsModel::getSelection() return new QUTXOList(result, (QObject*)this); } +void TxInputsModel::updateAutoselection() +{ + const double amount = outsModel_ ? outsModel_->totalAmount() : 0; + auto result = collectUTXOsFor(amount); + for (const auto& utxo: result) { + selectionUtxos_.insert({utxo->utxo().getTxHash(), utxo->utxo().getTxOutIndex()}); + } + emit selectionChanged(); + emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), {SelectedRole}); +} + + QUTXOList* TxInputsModel::zcInputs() const { QList result; diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index 4e090e79c..eb3c76e3a 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -108,6 +108,7 @@ class TxInputsModel : public QAbstractTableModel Q_INVOKABLE void toggleSelection(int row); Q_INVOKABLE QUTXOList* getSelection(); Q_INVOKABLE QUTXOList* zcInputs() const; + Q_INVOKABLE void updateAutoselection(); signals: void selectionChanged() const; diff --git a/GUI/QtQuick/TxOutputsModel.h b/GUI/QtQuick/TxOutputsModel.h index 4ca955a03..e2153b1fe 100644 --- a/GUI/QtQuick/TxOutputsModel.h +++ b/GUI/QtQuick/TxOutputsModel.h @@ -30,6 +30,7 @@ class TxOutputsModel : public QAbstractTableModel { Q_OBJECT Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) + Q_PROPERTY(double totalAmount READ totalAmount NOTIFY rowCountChanged) public: enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, WidthRole diff --git a/GUI/QtQuick/images/sideshift_right_arrow.png b/GUI/QtQuick/images/sideshift_right_arrow.png deleted file mode 100644 index 59d011d37d97698245d0dbb1c756d2b45b16d47c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3676 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 c`@ + + + \ No newline at end of file diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml index 759c916a5..3600d9f99 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml @@ -158,13 +158,13 @@ ColumnLayout { Layout.leftMargin: 25 Layout.topMargin: 32 width: 530 - enabled: layout.chosenFilename.length > 0 + // enabled: layout.chosenFilename.length > 0 preferred: true function click_enter() { if (!import_but.enabled) return console.log("import: ", layout.chosenFilename) - bsApp.importWOWallet(layout.chosenFilename) + bsApp.importWOWallet("/home/yauhen/Documents/BlockSettle_Testnet_AdHEAbug_watchonly.lmdb") layout.sig_import() } } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml index 1d18ea644..0fe59a482 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml @@ -62,8 +62,10 @@ Item { Image { id: arrowImage width: 20 - height: 20 - source: "qrc:/sideshift_right_arrow.png" + height: 12 + sourceSize.width: 20 + sourceSize.height: 12 + source: "qrc:/images/sideshift_right_arrow.svg" anchors.verticalCenter: parent.verticalCenter } @@ -87,8 +89,10 @@ Item { Text { color: "lightgray" - text: controller.orderId + linkColor: "lightgray" font.weight: Font.Bold + text: "%1".arg(controller.orderId) + onLinkActivated: Qt.openUrlExternally("https://sideshift.ai/orders/%1".arg(controller.orderId)) } } } @@ -187,7 +191,7 @@ Item { border.color: "white" anchors.horizontalCenter: parent.horizontalCenter - Text { + TextInput { id: toAddress anchors.fill: parent text: controller.depositAddress @@ -197,13 +201,25 @@ Item { verticalAlignment: Text.AlignVCenter anchors.leftMargin: 20 anchors.rightMargin: 20 + enabled: false } } SideShiftCopyButton { - text: qsTr("COPY ADDRESS") + text: timer.running ? qsTr("COPIED") : qsTr("COPY ADDRESS") anchors.horizontalCenter: parent.horizontalCenter - onClicked: bsApp.copyAddressToClipboard(toAddress.text) + onClicked: { + toAddress.selectAll() + bsApp.copyAddressToClipboard(toAddress.text) + timer.start() + } + + Timer { + id: timer + repeat: false + interval: 5000 + onTriggered: toAddress.select(0, 0) + } } } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml index e73673c0c..7bb5add22 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml @@ -20,9 +20,11 @@ ComboBox { width: 200 height: 200 - property string controlHint - property int popupWidth - property var networkControl: null + property string controlHint: "123" + property int popupWidth: 400 + + textRole: "coin" + valueRole: "network" activeFocusOnTab: true @@ -40,8 +42,7 @@ ComboBox { height: 80 sourceSize.width: 80 sourceSize.height: 80 - source: (networkControl === null) ? "qrc:/images/sideshift_btc.png" - : "image://coin/" + control.currentText + "-" + networkControl.currentText + source: "image://coin/" + control.model[control.currentIndex].coin + "-" + control.model[control.currentIndex].network anchors.horizontalCenter: parent.horizontalCenter } @@ -89,29 +90,74 @@ ComboBox { id: menuItem width: control.popupWidth - 12 - height: 50 + height: 80 leftPadding: 6 topPadding: 4 bottomPadding: 4 - contentItem: Text { - text: control.textRole - ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) - : modelData - color: "white" - font.pixelSize: 14 - font.family: "Roboto" - font.weight: Font.Normal - - elide: Text.ElideNone - verticalAlignment: Text.AlignVCenter + contentItem: Rectangle { + anchors.fill: parent + anchors.leftMargin: 10 + anchors.rightMargin: 10 + color: "transparent" + + Row { + spacing: 10 + anchors.fill: parent + + Image { + width: 40 + height: 40 + sourceSize.width: 40 + sourceSize.height: 40 + source: "image://coin/" + model["coin"] + "-" + model["network"] + anchors.verticalCenter: parent.verticalCenter + } + + Column { + spacing: 10 + width: parent.width - 50 + anchors.verticalCenter: parent.verticalCenter + + Text { + text: model["name"] + color: "white" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.SemiBold + } + + Row { + spacing: 10 + + Text { + text: model["coin"] + color: "white" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + + Text { + text: model["network"] + color: "white" + font.pixelSize: 14 + font.family: "Roboto" + font.weight: Font.Normal + } + } + } + } } highlighted: control.highlightedIndex === index property bool currented: control.currentIndex === index background: Rectangle { + anchors.fill: parent + anchors.leftMargin: 10 + anchors.rightMargin: 10 color: menuItem.highlighted ? "white" : "transparent" opacity: menuItem.highlighted ? 0.2 : 1 radius: 4 @@ -121,21 +167,54 @@ ComboBox { popup: Popup { id: _popup - y: control.height - 1 + y: 0 width: control.popupWidth + height: 400 padding: 6 - contentItem: ListView { - id: popup_item - - clip: true - implicitHeight: contentHeight - model: control.popup.visible ? control.delegateModel : null - //model: control.delegateModel - currentIndex: control.highlightedIndex - - ScrollIndicator.vertical: ScrollIndicator { } - } + contentItem: Rectangle { + color: "transparent" + anchors.fill: parent + + Column { + anchors.fill: parent + + Rectangle { + width: parent.width + height: 80 + color: "transparent" + + Rectangle { + anchors.fill: parent + anchors.margins: 10 + color: "transparent" + border.color: "white" + radius: 10 + } + + TextInput { + anchors.fill: parent + color: "white" + leftPadding: 20 + verticalAlignment: Text.AlignVCenter + + onTextEdited: control.model.filter = text + } + } + + ListView { + id: popup_item + width: parent.width + height: parent.height - 80 + + clip: true + model: control.popup.visible ? control.delegateModel : null + currentIndex: control.highlightedIndex + + ScrollIndicator.vertical: ScrollIndicator { } + } + } + } background: Rectangle { color: "black" diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml index 21e447c59..a07735df4 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml @@ -21,8 +21,8 @@ Item { property var controller property bool receive: true - property var receiveModel: controller.inputCurrencies - property var sendModel: controller.outputCurrencies + property var receiveModel: controller.inputCurrenciesModel + property var sendModel: controller.outputCurrenciesModel property alias inputCurrency: inputCombobox.currentText property alias outputCurrency: receivingCombobox.currentText @@ -48,16 +48,18 @@ Item { SideShiftComboboxWithIcon { id: inputCombobox - networkControl: networksController - popupWidth: 200 + popupWidth: 400 controlHint: qsTr("YOU SEND") model: root.receive ? root.receiveModel : root.sendModel + enabled: root.receive onCurrentValueChanged: { root.controller.inputCurrencySelected(currentText) + root.controller.inputNetwork = currentValue } onActivated: { root.controller.inputCurrencySelected(currentText) + root.controller.inputNetwork = currentValue } } @@ -68,21 +70,10 @@ Item { SideShiftComboboxWithIcon { id: receivingCombobox - popupWidth: 200 + popupWidth: 400 controlHint: qsTr("YOU RECEIVE") model: root.receive ? root.sendModel : root.receiveModel - } - } - - SideShiftCombobox { - id: networksController - model: controller.inputNetworks - anchors.horizontalCenter: parent.horizontalCenter - onCurrentValueChanged: { - root.controller.inputNetwork = currentText - } - onActivated: { - root.controller.inputNetwork = currentText + enabled: !root.receive } } diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 7b602ad7d..bd6004b61 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -450,6 +450,8 @@ ColumnLayout { comment_input.setActiveFocus() } } + + balanceSubstractor: txOutputsModel.totalAmount } CustomTextEdit { @@ -500,6 +502,8 @@ ColumnLayout { rec_addr_input.input_text = "" amount_input.input_text = "" + + table_sel_inputs.model.updateAutoselection() } } diff --git a/GUI/QtQuick/qml/Send/AmountInput.qml b/GUI/QtQuick/qml/Send/AmountInput.qml index 2648db37d..c64770f03 100644 --- a/GUI/QtQuick/qml/Send/AmountInput.qml +++ b/GUI/QtQuick/qml/Send/AmountInput.qml @@ -18,6 +18,8 @@ CustomTextInput { id: amount_input + property var balanceSubstractor: null + //aliases title_text: qsTr("Amount") @@ -85,7 +87,7 @@ CustomTextInput { function click_enter() { if (tempRequest != null) { - amount_input.input_text = tempRequest.maxAmount + amount_input.input_text = (parseFloat(tempRequest.maxAmount) - (balanceSubstractor !== null ? balanceSubstractor : 0.0)).toFixed(8) } } } diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 1f7ed3eca..def094c4b 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -205,7 +205,7 @@ qml/Plugins/SideShift/SideShiftMainPage.qml qml/Plugins/SideShift/SideShiftBuyPage.qml qml/Plugins/SideShift/SideShiftCopyButton.qml - images/sideshift_right_arrow.png + images/sideshift_right_arrow.svg images/sideswap_plugin.png images/leverex_plugin.png qml/Plugins/SideSwap/SideSwapPopup.qml From 716e3245f930a796cbe63c908eb9cab8a8f00920 Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 5 Apr 2023 10:30:31 +0200 Subject: [PATCH 338/436] Combobox initialization --- GUI/QtQuick/SideshiftPlugin.cpp | 16 ++++++---------- GUI/QtQuick/SideshiftPlugin.h | 1 - .../SideShift/SideShiftComboboxWithIcon.qml | 2 +- .../qml/Plugins/SideShift/SideShiftMainPage.qml | 3 +++ 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/GUI/QtQuick/SideshiftPlugin.cpp b/GUI/QtQuick/SideshiftPlugin.cpp index 2616d3269..a32d33d1c 100644 --- a/GUI/QtQuick/SideshiftPlugin.cpp +++ b/GUI/QtQuick/SideshiftPlugin.cpp @@ -76,6 +76,8 @@ void CurrencyListModel::reset(const QList& currencies) CurrencyFilterModel::CurrencyFilterModel(QObject* parent) : QSortFilterProxyModel(parent) { + setDynamicSortFilter(true); + sort(0, Qt::AscendingOrder); connect(this, &CurrencyFilterModel::changed, this, &CurrencyFilterModel::invalidate); } @@ -99,15 +101,9 @@ bool CurrencyFilterModel::filterAcceptsRow(int source_row, return true; } - return (sourceModel()->data(index(source_row, 0), CurrencyListModel::CurrencyRoles::NameRole).toString().contains(filter_) - || sourceModel()->data(index(source_row, 0), CurrencyListModel::CurrencyRoles::CoinRole).toString().contains(filter_) - || sourceModel()->data(index(source_row, 0), CurrencyListModel::CurrencyRoles::NetworkRole).toString().contains(filter_)); -} - -bool CurrencyFilterModel::lessThan(const QModelIndex& left, const QModelIndex& right) const -{ - return sourceModel()->data(index(left.row(), 0), CurrencyListModel::CurrencyRoles::NameRole) < - sourceModel()->data(index(right.row(), 0), CurrencyListModel::CurrencyRoles::NameRole); + return (sourceModel()->data(sourceModel()->index(source_row, 0), CurrencyListModel::CurrencyRoles::NameRole).toString().contains(filter_) + || sourceModel()->data(sourceModel()->index(source_row, 0), CurrencyListModel::CurrencyRoles::CoinRole).toString().contains(filter_) + || sourceModel()->data(sourceModel()->index(source_row, 0), CurrencyListModel::CurrencyRoles::NetworkRole).toString().contains(filter_)); } struct PostIn : public bs::InData @@ -282,7 +278,7 @@ void SideshiftPlugin::init() } inputListModel_->reset(currencies); - outputListModel_->reset({ {tr("Bitcoin"), tr("BTC"), tr("")} }); + outputListModel_->reset({ {tr("Bitcoin"), tr("BTC"), tr("bitcoin")} }); emit inited(); logger_->debug("[SideshiftPlugin::init] {} input currencies", currencies.size()); diff --git a/GUI/QtQuick/SideshiftPlugin.h b/GUI/QtQuick/SideshiftPlugin.h index 62b5b88cd..9ffad5d4c 100644 --- a/GUI/QtQuick/SideshiftPlugin.h +++ b/GUI/QtQuick/SideshiftPlugin.h @@ -65,7 +65,6 @@ class CurrencyFilterModel : public QSortFilterProxyModel protected: bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; - bool lessThan(const QModelIndex& left, const QModelIndex& right) const override; signals: void changed(); diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml index 7bb5add22..fab712d6d 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml @@ -42,7 +42,7 @@ ComboBox { height: 80 sourceSize.width: 80 sourceSize.height: 80 - source: "image://coin/" + control.model[control.currentIndex].coin + "-" + control.model[control.currentIndex].network + source: "image://coin/" + control.currentText + "-" + control.currentValue anchors.horizontalCenter: parent.horizontalCenter } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml index a07735df4..3843fee94 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml @@ -61,6 +61,8 @@ Item { root.controller.inputCurrencySelected(currentText) root.controller.inputNetwork = currentValue } + + onModelChanged: inputCombobox.currentIndex = 0 } SideShiftIconButton { @@ -74,6 +76,7 @@ Item { controlHint: qsTr("YOU RECEIVE") model: root.receive ? root.sendModel : root.receiveModel enabled: !root.receive + onModelChanged: receivingCombobox.currentIndex = 0 } } From 23bb229e02c8f38d9907e8bfca0600074938d533 Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 5 Apr 2023 10:38:13 +0200 Subject: [PATCH 339/436] Removed debug changes --- GUI/QtQuick/TxInputsModel.cpp | 12 ------------ GUI/QtQuick/TxInputsModel.h | 1 - .../qml/CreateWallet/ImportWatchingWallet.qml | 4 ++-- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 -- 4 files changed, 2 insertions(+), 17 deletions(-) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 5fe2620e4..ef1437dd6 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -374,18 +374,6 @@ QUTXOList* TxInputsModel::getSelection() return new QUTXOList(result, (QObject*)this); } -void TxInputsModel::updateAutoselection() -{ - const double amount = outsModel_ ? outsModel_->totalAmount() : 0; - auto result = collectUTXOsFor(amount); - for (const auto& utxo: result) { - selectionUtxos_.insert({utxo->utxo().getTxHash(), utxo->utxo().getTxOutIndex()}); - } - emit selectionChanged(); - emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), {SelectedRole}); -} - - QUTXOList* TxInputsModel::zcInputs() const { QList result; diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index eb3c76e3a..4e090e79c 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -108,7 +108,6 @@ class TxInputsModel : public QAbstractTableModel Q_INVOKABLE void toggleSelection(int row); Q_INVOKABLE QUTXOList* getSelection(); Q_INVOKABLE QUTXOList* zcInputs() const; - Q_INVOKABLE void updateAutoselection(); signals: void selectionChanged() const; diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml index 3600d9f99..759c916a5 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml @@ -158,13 +158,13 @@ ColumnLayout { Layout.leftMargin: 25 Layout.topMargin: 32 width: 530 - // enabled: layout.chosenFilename.length > 0 + enabled: layout.chosenFilename.length > 0 preferred: true function click_enter() { if (!import_but.enabled) return console.log("import: ", layout.chosenFilename) - bsApp.importWOWallet("/home/yauhen/Documents/BlockSettle_Testnet_AdHEAbug_watchonly.lmdb") + bsApp.importWOWallet(layout.chosenFilename) layout.sig_import() } } diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index bd6004b61..3521333d5 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -502,8 +502,6 @@ ColumnLayout { rec_addr_input.input_text = "" amount_input.input_text = "" - - table_sel_inputs.model.updateAutoselection() } } From 55f837a26059f214900bbf8370c31bdab91525cf Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 5 Apr 2023 10:40:42 +0200 Subject: [PATCH 340/436] Removed unused changes --- GUI/QtQuick/images/sideshift_btc.png | Bin 3074 -> 0 bytes GUI/QtQuick/qtquick.qrc | 1 - 2 files changed, 1 deletion(-) delete mode 100644 GUI/QtQuick/images/sideshift_btc.png diff --git a/GUI/QtQuick/images/sideshift_btc.png b/GUI/QtQuick/images/sideshift_btc.png deleted file mode 100644 index 2d3a8b7d8f5b53741775d3ce64eeb67c81729344..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3074 zcmV+d4E^(oP)ZgXgFbngSdJ^%mji)h5>(sGbr>PCGA$Cw4h(NLt0we@TutF;Y?gJyN)k>>f z_N>4eesAoq&N=+&T)yu+-#GeYNx&gO3O9Dz{NkEA#2`G^z0VSeb=mw-> zs40fdpn^tQ1P!HtrnCqE5Sy4njGjhpds%0nJv7m>`H)>eb%_F7?ykoAJtmYd)5uxX9HIV6eDeMvK6yWYcx+nMx?~fuw4w;x z_AST8y;V?Y6mnFNlh{N8m);vh+X+8n6A4-BATFS)xDa3YW(}PC%up09jzvB`IfL_W z_o3~b0VLuxM9U^B;JV!=>^istR2kX%jTGS^gHx|~(A_pdtV|*TDpiHJ_lbI}*g z;MQg{_B^t3UKK7@-hQ?VUFSohe<#|`SiP;{OD7%x-1mceEVGr0{+%cRm)R)X|KkSH zmD~y_iVAVyX*={Lao&<(0V#bE_8(pgg;M@G&t`DKQMFt4deSM;72&{PJBrl87eztQ zn1Vv!TR*ph(#vNc>og`bSsy~3VH*H|NziZ&otCY>Y#3^a(foKFjz8Na=zBpu@XqgA zVO}kMe&C}<@0b${m=!GbZ?%$wMc+uYPNA&XVZf%n%LIL!vj;A3&|>So)shA7*&JPJRc710BdM=G-eVChJ42RZ}QTA_{k?6~U+%!3ht-%E z<)oTGq_J)+;|R#=YlVse)HX^NurJ&RCLu0Nu2xcWy^W7{e+zHfOhUe_gca+!+OPyP z*OwC81ox$^hC$j3U)YsX)YM=?Hkbs>Yp$ewIwYxCqlHq%p5ItQxVoNP#HHQe0{2K8 z+@aRFUZGY}IJoKgti!BE=MWUaQYlL^K2Oe{a#5%#fN2E<{}(rhF-uO8es5p66Rx4t ztRa;v##fhPfdFQG=WHwbSHJGGMHHFqrfM(ndcnekmD z7JyD&iOuF_S)(}V8nK3OdA0o6QvuooCJ}`?%P_PVoSc>3$$nO!VT;`0>)DE?hg2R;A zu1pe)dWANNmry^uld%Q#=eGwY&6#Y}RpbsXsFf5RSoaKX4`dQiVu?zles(8gt-^!u z2_ltY&JKGDlftWakBdb;+yQf9bwKhj(}aQAtd6q zyag5jKr@f+&rC#^AkJSuDobW-j834pgPR}25ik*-L3is2)_%=Myb-CWmDFsOYK1fB zUT-d3Lub(8Z;>@q>*`0Lj7P&VMq^wb24xk{QMDU;>kkntuV1%Q#MZ z+s67MQa>NFC7V~%tx6Qgk`RfVwFb)?!R7!zehMaj*R0`$}vyrUfefRV|51Zgi$^}LKLgC{XC z-c7Xb(|_`!w>|e6VnOc4f8Mypi9+Oq)Ls>&y`0cjYT^<}x-N|1;}Zjdz7>4nnkp;8 zBfsC6*Bd!>8WSw~M%jeQ#OPoQe|+LHrWj!t_J}&MzRXsNgTHRftDl@tVsrwp{p1Qp z2ZTEjqLdiynZWVq$j&v3h3Ui%9DU|9QQ`sfIP&klID%70+Z7bQ_?6li|D9u32YhCL=(&K(PZ4o~6Idjq)m?jRWY7P-MP9Zjhcx7|~X4SP(`8P#%D zHOF8NjZe=6aPeJX{;U-8dW)}RtqvRRG@)*5Iq`XNY=}YE`C(l7ASmfNJF(^R}B%nl=1eD1C0oo>PMKE=i QS^xk507*qoM6N<$f~`==XaE2J diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index def094c4b..72ad8239e 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -201,7 +201,6 @@ qml/Plugins/SideShift/SideShiftPopup.qml qml/Plugins/SideShift/SideShiftTextInput.qml images/transfer_icon.png - images/sideshift_btc.png qml/Plugins/SideShift/SideShiftMainPage.qml qml/Plugins/SideShift/SideShiftBuyPage.qml qml/Plugins/SideShift/SideShiftCopyButton.qml From ab70a79e450dbee1112087b2e23aa30984fbbd58 Mon Sep 17 00:00:00 2001 From: YZ Date: Wed, 5 Apr 2023 14:29:16 +0200 Subject: [PATCH 341/436] Review fixes --- GUI/QtQuick/SideshiftPlugin.cpp | 15 ++++++++++----- .../SideShift/SideShiftComboboxWithIcon.qml | 1 + GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 +- GUI/QtQuick/qml/Send/AmountInput.qml | 4 ++-- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/GUI/QtQuick/SideshiftPlugin.cpp b/GUI/QtQuick/SideshiftPlugin.cpp index a32d33d1c..b3ffacdbc 100644 --- a/GUI/QtQuick/SideshiftPlugin.cpp +++ b/GUI/QtQuick/SideshiftPlugin.cpp @@ -101,9 +101,12 @@ bool CurrencyFilterModel::filterAcceptsRow(int source_row, return true; } - return (sourceModel()->data(sourceModel()->index(source_row, 0), CurrencyListModel::CurrencyRoles::NameRole).toString().contains(filter_) - || sourceModel()->data(sourceModel()->index(source_row, 0), CurrencyListModel::CurrencyRoles::CoinRole).toString().contains(filter_) - || sourceModel()->data(sourceModel()->index(source_row, 0), CurrencyListModel::CurrencyRoles::NetworkRole).toString().contains(filter_)); + return (sourceModel()->data(sourceModel()->index(source_row, 0), + CurrencyListModel::CurrencyRoles::NameRole).toString().toLower().contains(filter_.toLower()) + || sourceModel()->data(sourceModel()->index(source_row, 0), + CurrencyListModel::CurrencyRoles::CoinRole).toString().toLower().contains(filter_.toLower()) + || sourceModel()->data(sourceModel()->index(source_row, 0), + CurrencyListModel::CurrencyRoles::NetworkRole).toString().toLower().contains(filter_.toLower())); } struct PostIn : public bs::InData @@ -277,8 +280,10 @@ void SideshiftPlugin::init() } } - inputListModel_->reset(currencies); - outputListModel_->reset({ {tr("Bitcoin"), tr("BTC"), tr("bitcoin")} }); + QMetaObject::invokeMethod(this, [this, currencies] { + inputListModel_->reset(currencies); + outputListModel_->reset({ {tr("Bitcoin"), tr("BTC"), tr("bitcoin")} }); + }); emit inited(); logger_->debug("[SideshiftPlugin::init] {} input currencies", currencies.size()); diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml index fab712d6d..5b11f81b4 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml @@ -105,6 +105,7 @@ ComboBox { Row { spacing: 10 anchors.fill: parent + anchors.leftMargin: 10 Image { width: 40 diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 3521333d5..df713f14a 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -451,7 +451,7 @@ ColumnLayout { } } - balanceSubstractor: txOutputsModel.totalAmount + balanceSubtractor: txOutputsModel.totalAmount } CustomTextEdit { diff --git a/GUI/QtQuick/qml/Send/AmountInput.qml b/GUI/QtQuick/qml/Send/AmountInput.qml index c64770f03..1760f9fec 100644 --- a/GUI/QtQuick/qml/Send/AmountInput.qml +++ b/GUI/QtQuick/qml/Send/AmountInput.qml @@ -18,7 +18,7 @@ CustomTextInput { id: amount_input - property var balanceSubstractor: null + property var balanceSubtractor: null //aliases title_text: qsTr("Amount") @@ -87,7 +87,7 @@ CustomTextInput { function click_enter() { if (tempRequest != null) { - amount_input.input_text = (parseFloat(tempRequest.maxAmount) - (balanceSubstractor !== null ? balanceSubstractor : 0.0)).toFixed(8) + amount_input.input_text = (parseFloat(tempRequest.maxAmount) - (balanceSubtractor !== null ? balanceSubtractor : 0.0)).toFixed(8) } } } From 3726a5ecd8134de5ae07fa2687df61715a73aa0e Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 6 Apr 2023 13:04:28 +0300 Subject: [PATCH 342/436] address ledger fixes --- GUI/QtQuick/QtQuickAdapter.cpp | 14 +++++++++----- common | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 021734c11..3b0635d62 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -688,7 +688,9 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) { WalletsMessage msg; if (!msg.ParseFromString(env.message)) { - logger_->error("[{}] failed to parse msg #{}\n{}", __func__, env.foreignId(), bs::toHex(env.message)); + logger_->error("[{}] failed to parse msg #{} (response#: {}, to {})\n{}", __func__ + , env.foreignId(), env.responseId(), (env.receiver ? env.receiver->name() : "") + , bs::toHex(env.message)); return ProcessingResult::Error; } switch (msg.data_case()) { @@ -1791,8 +1793,9 @@ ProcessingResult QtQuickAdapter::processAddressHist(const ArmoryMessage_AddressH } expTxByAddrModel_->addRows(entries); const auto msgId = pushRequest(user_, userBlockchain_, msg.SerializeAsString() - , {}, 10, std::chrono::milliseconds{230} ); + , {}, 3, std::chrono::milliseconds{2300} ); expTxAddrReqs_.insert(msgId); + logger_->debug("[{}] response handling done", __func__); return ProcessingResult::Success; } @@ -1956,7 +1959,7 @@ bs::message::ProcessingResult QtQuickAdapter::processTransactions(bs::message::S expTxAddrReqs_.erase(itExpTxAddr); expTxByAddrModel_->setDetails(result); const auto msgIdReq = pushRequest(user_, userBlockchain_, msg.SerializeAsString() - , {}, 10, std::chrono::milliseconds{ 230 }); + , {}, 3, std::chrono::milliseconds{ 2300 }); expTxAddrInReqs_.insert(msgIdReq); } const auto& itExpTxAddrIn = expTxAddrInReqs_.find(msgId); @@ -2273,8 +2276,9 @@ void QtQuickAdapter::startAddressSearch(const QString& s) expTxByAddrModel_->clear(); ArmoryMessage msg; msg.set_get_address_history(s.trimmed().toStdString()); - pushRequest(user_, userBlockchain_, msg.SerializeAsString() - , {}, 10, std::chrono::milliseconds{ 230 }); + const auto msgId = pushRequest(user_, userBlockchain_, msg.SerializeAsString() + , {}, 1, std::chrono::seconds{ 15 }); + logger_->debug("[{}] #{}", __func__, msgId); } qtquick_gui::WalletPropertiesVM* QtQuickAdapter::walletProperitesVM() const diff --git a/common b/common index 5725e095d..fb26d0f01 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 5725e095db99e7b90f381d7932a005e6863212a1 +Subproject commit fb26d0f0112617eadbaa7bd9fbf91386fbf4e92a From cd677b1fac37a1f08b6f1f9a415fd046b2f931ba Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 6 Apr 2023 23:46:49 +0300 Subject: [PATCH 343/436] various fixes --- Core/ApiAdapter.cpp | 13 +++++++++++++ Core/ApiAdapter.h | 5 +++-- Core/SignerAdapter.cpp | 3 ++- GUI/QtQuick/SideshiftPlugin.cpp | 10 ++++------ GUI/QtQuick/SideshiftPlugin.h | 13 ++++++------- common | 2 +- 6 files changed, 29 insertions(+), 17 deletions(-) diff --git a/Core/ApiAdapter.cpp b/Core/ApiAdapter.cpp index ca8004736..e2dae354e 100644 --- a/Core/ApiAdapter.cpp +++ b/Core/ApiAdapter.cpp @@ -10,8 +10,10 @@ */ #include "ApiAdapter.h" #include +#include "common.pb.h" using namespace bs::message; +using namespace BlockSettle::Common; class ApiRouter : public bs::message::Router { @@ -209,6 +211,9 @@ void ApiAdapter::add(const std::shared_ptr &adapter) ProcessingResult ApiAdapter::process(const bs::message::Envelope &env) { + if (env.message.empty()) { + return ProcessingResult::Success; + } const auto rc = RelayAdapter::process(env); if (env.receiver->value() == user_->value()) { return gwAdapter_->pushToApiBus(env); @@ -225,6 +230,14 @@ bool ApiAdapter::processBroadcast(const bs::message::Envelope& env) return false; } +bool ApiAdapter::processTimeout(const bs::message::Envelope& env) +{ + if (!env.receiver) { + return false; + } + return true; +} + bool ApiBusAdapter::pushFill(bs::message::Envelope& env) { if (!queue_) { diff --git a/Core/ApiAdapter.h b/Core/ApiAdapter.h index 96dd14b3d..a2a6ae888 100644 --- a/Core/ApiAdapter.h +++ b/Core/ApiAdapter.h @@ -87,8 +87,9 @@ class ApiAdapter : public bs::message::RelayAdapter, public bs::MainLoopRuner ApiAdapter(const std::shared_ptr &); ~ApiAdapter() override = default; - bs::message::ProcessingResult process(const bs::message::Envelope &) override; - bool processBroadcast(const bs::message::Envelope& env) override; + bs::message::ProcessingResult process(const bs::message::Envelope&) override; + bool processBroadcast(const bs::message::Envelope&) override; + bool processTimeout(const bs::message::Envelope&) override; Users supportedReceivers() const override { return { user_, fallbackUser_ }; } std::string name() const override { return "API"; } diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 07ca16e6a..afa0d9825 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -822,7 +822,6 @@ bs::message::ProcessingResult SignerAdapter::processGetWalletSeed(const bs::mess if (seed.hasPrivateKey()) { const auto& privKey = seed.privateKey(); - logger_->debug("[{}] priv key size: {}", __func__, privKey.getSize()); std::vector privData; for (int i = 0; i < (int)privKey.getSize(); ++i) { privData.push_back(privKey.getPtr()[i]); @@ -834,6 +833,8 @@ bs::message::ProcessingResult SignerAdapter::processGetWalletSeed(const bs::mess } bip39Seed.pop_back(); msgResp->set_bip39_seed(bip39Seed); + logger_->debug("[{}] bip39 seed: {} [{}] from [{}]", __func__ + , bip39Seed, words.size(), privData.size()); } } catch (const Armory::Wallets::WalletException& e) { diff --git a/GUI/QtQuick/SideshiftPlugin.cpp b/GUI/QtQuick/SideshiftPlugin.cpp index b3ffacdbc..8f8b22187 100644 --- a/GUI/QtQuick/SideshiftPlugin.cpp +++ b/GUI/QtQuick/SideshiftPlugin.cpp @@ -267,25 +267,23 @@ void SideshiftPlugin::init() return; } const auto& response = reply->response; + QList currencies; try { const auto& msg = json::parse(response); - QList currencies; for (const auto& coin : msg) { for (const auto& network : coin["networks"]) { currencies.append({ - QString::fromStdString(coin["name"]), - QString::fromStdString(coin["coin"]), + QString::fromStdString(coin["name"].get()), + QString::fromStdString(coin["coin"].get()), QString::fromStdString(network.get()) }); } } - QMetaObject::invokeMethod(this, [this, currencies] { inputListModel_->reset(currencies); outputListModel_->reset({ {tr("Bitcoin"), tr("BTC"), tr("bitcoin")} }); + emit inited(); }); - - emit inited(); logger_->debug("[SideshiftPlugin::init] {} input currencies", currencies.size()); } catch (const json::exception&) { diff --git a/GUI/QtQuick/SideshiftPlugin.h b/GUI/QtQuick/SideshiftPlugin.h index 9ffad5d4c..9ad722bf0 100644 --- a/GUI/QtQuick/SideshiftPlugin.h +++ b/GUI/QtQuick/SideshiftPlugin.h @@ -22,13 +22,6 @@ namespace spdlog { } class CoinImageProvider; -struct Currency -{ - QString name; - QString coin; - QString network; -}; - class CurrencyListModel : public QAbstractListModel { Q_OBJECT @@ -38,6 +31,12 @@ class CurrencyListModel : public QAbstractListModel CoinRole, NetworkRole }; + struct Currency + { + QString name; + QString coin; + QString network; + }; CurrencyListModel(QObject* parent = nullptr); diff --git a/common b/common index fb26d0f01..add0ad461 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit fb26d0f0112617eadbaa7bd9fbf91386fbf4e92a +Subproject commit add0ad46133a3e2189c682fcd334ffbcacaf49dc From 11cee9beb8b6bf2795bc8d37c417f0bddc2cd272 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 6 Apr 2023 23:47:09 +0300 Subject: [PATCH 344/436] added tx_details deser test --- UnitTests/TestCommon.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/UnitTests/TestCommon.cpp b/UnitTests/TestCommon.cpp index ac29cbc1e..3ef7198fa 100644 --- a/UnitTests/TestCommon.cpp +++ b/UnitTests/TestCommon.cpp @@ -567,3 +567,16 @@ TEST(TestCommon, Workers) std::this_thread::sleep_for(std::chrono::milliseconds{ 1 }); } } + +#include "common.pb.h" +using namespace BlockSettle::Common; +TEST(TestCommon, unparsable_proto) +{ + const auto& data = "fa01f0060aed060a200a95d6ee27cdb6c5cf56e052cfb826d5a383f64bea54f5adef4f20c45f700443300140014a0a302e3030303031353030521433dd7099a58f7730c4c57eda6cb30c0c4ec27e1b5a8505010000000001011a50e276d80729cf66f5ba49e3d0d1319e84073efef579995b3bdd45edc27da70000000000fdffffff01dc050000000000002251206059a08c63741bce44793c30d941723a7157c19b97681d531f6af35f5de4a16f03403dfec38046483d2c520754c4e61124463ab58d701a85ecd21083aefd93a4dac9434414cd0a197b52d3531e55e1956a6492f2fbfb297b08d06dcf3061424ffaa6fdbe012082c9e496d987a3a64d948cd10bc083472d6b8edf609863251c4d463511942388ac0063036f7264010109696d6167652f706e67004d850189504e470d0a1a0a0000000d4948445200000018000000180806000000e0773df8000000017352474200aece1ce90000000467414d410000b18f0bfc6105000000097048597300000ec300000ec301c76fa8640000011a49444154484be591b10dc2301045b3040b50b205d414f4cc1010743474200a2a6acac018f4acc00ad4144848c63fe2c371b9d804990a4b4f8e63df7f17279b1557f74bfe44b0c8327730b0ce6aa282ba7062d54882825838b16a4963c171973fe13bab9654040825323884ce9004bf20f3c5b18133562d890a701518addeb9a41c103fe4c904e3cded25184dd20bea46124188a402ac491201d012492c1c4405404ad6d37ec927e1207a454476be5f0ddff6ac5a620a50d4f1e49eb9c79daa12acf17ee9e790a422c0e1ae67e0d93e80cc5d5e9232dcafb98fb375125380ae59887006a1630463d6fb5f0950acbfa46ebf91809de119c5ba535ca15c63bf91401663d69db6d5bab18057c0623c0306c97f8435cfeaac59717577f032db66d32fac780000000049454e44ae4260826821c182c9e496d987a3a64d948cd10bc083472d6b8edf609863251c4d4635119423880000000060a1ee2f6a4a0a14fd9208e542e2001907786b18c232c15f18cacd8518cc16220b2d302e3030303032383932280532201a50e276d80729cf66f5ba49e3d0d1319e84073efef579995b3bdd45edc27da7724b0a1433dd7099a58f7730c4c57eda6cb30c0c4ec27e1b18dc0b220a302e30303030313530302805322251206059a08c63741bce44793c30d941723a7157c19b97681d531f6af35f5de4a16f"; + const auto binData = BinaryData::CreateFromHex(data); + ASSERT_FALSE(binData.empty()); + WalletsMessage msg; + EXPECT_TRUE(msg.ParseFromString(binData.toBinStr())); + StaticLogger::loggerPtr->debug("[{}] data case: {}\n{}", __func__ + , msg.data_case(), msg.DebugString()); +} \ No newline at end of file From 74c308a02f80c74c7df1f2f6e2d373a34873ffd6 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 7 Apr 2023 13:40:17 +0300 Subject: [PATCH 345/436] update common --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index add0ad461..c586a34f3 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit add0ad46133a3e2189c682fcd334ffbcacaf49dc +Subproject commit c586a34f39273b8c992158f5f308f390a9a0970c From f7a72c0b9d3d7d5d24c73175e8f7dccc2eb9af61 Mon Sep 17 00:00:00 2001 From: YZ Date: Fri, 7 Apr 2023 14:14:49 +0200 Subject: [PATCH 346/436] UI bugs; qml warnings --- GUI/QtQuick/qml/ExplorerAddress.qml | 2 +- GUI/QtQuick/qml/ExplorerPage.qml | 4 ++ GUI/QtQuick/qml/ExplorerTX.qml | 2 +- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 8 ++++ .../qml/Plugins/Common/PluginsPage.qml | 20 +++++----- .../Plugins/SideShift/SideShiftBuyPage.qml | 29 +++++++-------- .../SideShift/SideShiftComboboxWithIcon.qml | 3 +- .../Plugins/SideShift/SideShiftMainPage.qml | 6 +-- GUI/QtQuick/qml/Send/AmountInput.qml | 3 +- GUI/QtQuick/qml/Send/SendPopup.qml | 4 +- .../qml/Settings/DeleteArmoryServer.qml | 2 +- .../qml/StyledControls/CustomTextEdit.qml | 1 + .../WalletPropertiesPopup.qml | 37 +++++++++---------- 13 files changed, 65 insertions(+), 56 deletions(-) diff --git a/GUI/QtQuick/qml/ExplorerAddress.qml b/GUI/QtQuick/qml/ExplorerAddress.qml index b0e6fc043..62903aa00 100644 --- a/GUI/QtQuick/qml/ExplorerAddress.qml +++ b/GUI/QtQuick/qml/ExplorerAddress.qml @@ -140,7 +140,7 @@ Item { CustomTableView { width: parent.width - height: 500 + height: parent.height - 150 model: txListByAddrModel copy_button_column_index: 1 diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml index 42d8778a8..4987982f3 100644 --- a/GUI/QtQuick/qml/ExplorerPage.qml +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -140,6 +140,10 @@ Item { } function openSearchResult() { + if (expSearchBox.text.length === 0) { + return; + } + var rc = bsApp.getSearchInputType(expSearchBox.text) if (rc === 0) { ibFailure.displayMessage(qsTr("Unknown type of search key")) diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index db67cf337..13e754acb 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -192,7 +192,7 @@ Item { Row { spacing: 24 width: parent.width - height: 450 + height: parent.height - 120 Rectangle { height: parent.height diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index 8342481ef..ca410d5ac 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -146,6 +146,14 @@ Rectangle { openAddressDetails(address, transactions, balance, comment, asset_type, type, overview_panel.currentWallet) } + + Connections { + target: addressFilterModel + function onModelReset() + { + tablewView.update() + } + } } } } diff --git a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml index 7dee5e784..b2cd3f926 100644 --- a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml +++ b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml @@ -79,8 +79,6 @@ Rectangle { description: description_role icon_source: icon_role onCardClicked: { - console.log("onCardClicked") - //plugin_popup = component.createObject(plugin_item) plugin_popup.reset() plugin_popup.controller = pluginsListModel.getPlugin(index) plugin_popup.controller.init() @@ -94,14 +92,16 @@ Rectangle { Component.onCompleted: { component = Qt.createComponent(path_role); - if (component.status === Component.Ready) { - finishCreation(); - } - else if (component.status === Component.Error) { - console.log(component.errorString()) - } - else { - component.statusChanged.connect(finishCreation); + if (component !== null) { + if (component.status === Component.Ready) { + finishCreation(); + } + else if (component.status === Component.Error) { + console.log(component.errorString()) + } + else { + component.statusChanged.connect(finishCreation); + } } } } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml index 0fe59a482..49e027ab4 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml @@ -21,13 +21,8 @@ Item { property var controller property string inputCurrency - property string outputCurrency: "BTC" -// property string orderId: "253380c874f87a7a4f70" - //property string conversionRate: "1 ETH = 0.06177451 BTC" - //property string toAddress: "0x514cD3B3a164A78BA93b881C7b567d19CC6a1843" - //property string networkFee: "1.97 USD" + property string outputCurrency property string receivingAddress - //property string creationDate: "2023-03-21 07:48" Rectangle { anchors.fill: parent @@ -91,24 +86,26 @@ Item { color: "lightgray" linkColor: "lightgray" font.weight: Font.Bold - text: "%1".arg(controller.orderId) - onLinkActivated: Qt.openUrlExternally("https://sideshift.ai/orders/%1".arg(controller.orderId)) + text: "%1".arg(controller !== null ? controller.orderId : "") + onLinkActivated: Qt.openUrlExternally("https://sideshift.ai/orders/%1".arg(controller !== null ? controller.orderId : "")) } } } Text { color: "white" - text: controller.status + text: controller !== null ? controller.status : "" topPadding: 40 + wrapMode: Text.Wrap font.pixelSize: 24 anchors.horizontalCenter: parent.horizontalCenter + width: parent.width } Text { topPadding: 15 color: "lightgray" - text: controller.conversionRate + text: controller !== null ? controller.conversionRate : "" anchors.horizontalCenter: parent.horizontalCenter } @@ -139,7 +136,7 @@ Item { anchors.verticalCenter: parent.verticalCenter } Text { - text: controller.minAmount + text: controller !== null ? controller.minAmount : "" color: "white" font.weight: Font.Bold font.pixelSize: 18 @@ -161,7 +158,7 @@ Item { anchors.verticalCenter: parent.verticalCenter } Text { - text: controller.maxAmount + text: controller !== null ? controller.maxAmount : "" color: "white" font.weight: Font.Bold font.pixelSize: 18 @@ -194,7 +191,7 @@ Item { TextInput { id: toAddress anchors.fill: parent - text: controller.depositAddress + text: controller !== null ? controller.depositAddress : "" color: "white" clip: true font.weight: Font.Bold @@ -235,7 +232,7 @@ Item { anchors.horizontalCenter: parent.horizontalCenter Image { - source: "image://QR/" + controller.depositAddress + source: controller !== null ? ( "image://QR/" + controller.depositAddress) : "" sourceSize.width: 180 sourceSize.height: 180 width: 180 @@ -252,7 +249,7 @@ Item { } Text { - text: qsTr("ESTIMATED NETWORK FEES: ") + controller.networkFee + text: qsTr("ESTIMATED NETWORK FEES: ") + (controller !== null ? controller.networkFee : "") color: "white" anchors.horizontalCenter: parent.horizontalCenter } @@ -297,7 +294,7 @@ Item { Text { color: "lightgray" - text: controller.creationDate + text: controller !== null ? controller.creationDate : "" font.weight: Font.Bold anchors.right: parent.right } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml index 5b11f81b4..26bb76e8b 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml @@ -213,6 +213,8 @@ ComboBox { currentIndex: control.highlightedIndex ScrollIndicator.vertical: ScrollIndicator { } + + maximumFlickVelocity: 1000 } } } @@ -226,4 +228,3 @@ ComboBox { } } } - diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml index 3843fee94..0ec59b27a 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml @@ -21,8 +21,8 @@ Item { property var controller property bool receive: true - property var receiveModel: controller.inputCurrenciesModel - property var sendModel: controller.outputCurrenciesModel + property var receiveModel: controller !== null ? controller.inputCurrenciesModel : null + property var sendModel: controller !== null ? controller.outputCurrenciesModel : null property alias inputCurrency: inputCombobox.currentText property alias outputCurrency: receivingCombobox.currentText @@ -35,7 +35,7 @@ Item { spacing: 20 Text { - text: controller.conversionRate + text: controller !== null ? controller.conversionRate : "" color: "gray" font.pixelSize: 14 font.family: "Roboto" diff --git a/GUI/QtQuick/qml/Send/AmountInput.qml b/GUI/QtQuick/qml/Send/AmountInput.qml index 1760f9fec..b264d4322 100644 --- a/GUI/QtQuick/qml/Send/AmountInput.qml +++ b/GUI/QtQuick/qml/Send/AmountInput.qml @@ -33,7 +33,6 @@ CustomTextInput { amount_input.input_text = "0" } - amount_input.input_text = amount_input.input_text.replace(",", ".") var indexOfDot = amount_input.input_text.indexOf(".") @@ -86,7 +85,7 @@ CustomTextInput { enabled: (tempRequest != null) function click_enter() { - if (tempRequest != null) { + if (tempRequest != null && tempRequest.maxAmount.length > 0) { amount_input.input_text = (parseFloat(tempRequest.maxAmount) - (balanceSubtractor !== null ? balanceSubtractor : 0.0)).toFixed(8) } } diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index b747817f9..3d006813e 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -111,14 +111,14 @@ CustomPopup { Connections { target: bsApp - onTransactionExported: (text) => { + function onTransactionExported(text) { exportTransactionSuccessDailog.details_text = qsTr("Transaction successfully exported to %1").arg(text) exportTransactionSuccessDailog.show() exportTransactionSuccessDailog.raise() exportTransactionSuccessDailog.requestActivate() } - onTransactionExportFailed: (text) => { + function onTransactionExportFailed(text) { exportTransactionFailDialog.header = qsTr("Export transaction failed") exportTransactionFailDialog.fail = text diff --git a/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml b/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml index 20e36091c..d1e924793 100644 --- a/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml @@ -49,7 +49,7 @@ ColumnLayout { Layout.topMargin: 16 Layout.preferredHeight : 16 - text: qsTr("Are you sure you want to delete the \"%1\" server?") + text: qsTr("Are you sure you want to delete the \"%1\" server?").arg(server_index) .arg(armoryServersModel.data(armoryServersModel.index(server_index, 0), ArmoryServersModel.NameRole)) color: BSStyle.titanWhiteColor diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml b/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml index 0b3f1e6fa..27f5356e3 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml @@ -25,6 +25,7 @@ Rectangle { property alias input_text: input.text property alias horizontalAlignment: input.horizontalAlignment property alias input_topMargin: input.anchors.topMargin + property alias inputHints: input.inputMethodHints signal textChanged() signal tabNavigated() diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 8a3c12e0f..7e3452fed 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -174,25 +174,24 @@ CustomPopup { font.pixelSize: 14 width: parent.width / 2 horizontalAlignment: Text.AlignRight - } - - Image { - id: rename_button - - x: parent.horizontalCenter - 10 - y: wallet_name.top - - source: "qrc:/images/edit_wallet_name.png" - width: 32 - height: 16 - - horizontalAlignment: Image.AlignHCenter - fillMode: Image.PreserveAspectFit; - MouseArea { - anchors.fill: parent - onClicked: { - _stack_view.push(rename_wallet) - rename_wallet.init() + + Image { + id: rename_button + + anchors.left: parent.right + + source: "qrc:/images/edit_wallet_name.png" + width: 32 + height: 16 + + horizontalAlignment: Image.AlignHCenter + fillMode: Image.PreserveAspectFit; + MouseArea { + anchors.fill: parent + onClicked: { + _stack_view.push(rename_wallet) + rename_wallet.init() + } } } } From aed0a4ab70349c19e06ba91958fdb21056afdb9e Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 7 Apr 2023 17:31:08 +0300 Subject: [PATCH 347/436] signed TX export/import --- GUI/QtQuick/QtQuickAdapter.cpp | 106 +++++++++++++++++++++++++++++---- GUI/QtQuick/QtQuickAdapter.h | 9 ++- 2 files changed, 102 insertions(+), 13 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 3b0635d62..3faad87d9 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -639,7 +639,7 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) createWallet(true); break; case SignerMessage::kSignTxResponse: - return processSignTX(msg.sign_tx_response()); + return processSignTX(env.responseId(), msg.sign_tx_response()); case SignerMessage::kWalletDeleted: return processWalletDeleted(msg.wallet_deleted()); case SignerMessage::kCreatedWallet: @@ -1862,9 +1862,34 @@ ProcessingResult QtQuickAdapter::processUTXOs(const WalletsMessage_UtxoListRespo return ProcessingResult::Success; } -ProcessingResult QtQuickAdapter::processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse& response) +static bool save(const BlockSettle::Common::SignerMessage_SignTxResponse& tx, const std::string& pathName) +{ + auto f = fopen(pathName.c_str(), "wb"); + if (!f) { + return false; + } + const auto& txSer = tx.SerializeAsString(); + if (fwrite(txSer.data(), 1, txSer.size(), f) != txSer.size()) { + fclose(f); + SystemFileUtils::rmFile(pathName); + return false; + } + fclose(f); + return true; +} + +ProcessingResult QtQuickAdapter::processSignTX(bs::message::SeqId msgId, const BlockSettle::Common::SignerMessage_SignTxResponse& response) { if (!response.signed_tx().empty()) { + const auto& itExport = exportTxReqs_.find(msgId); + if (itExport != exportTxReqs_.end()) { + if (!save(response, itExport->second)) { + logger_->error("[{}] failed to save to {}", __func__, itExport->second); + emit failedTx(tr("Signed TX exporting to %1 failed").arg(QString::fromStdString(itExport->second))); + } + exportTxReqs_.erase(itExport); + return ProcessingResult::Success; + } const auto& signedTX = BinaryData::fromString(response.signed_tx()); logger_->debug("[{}] signed TX size: {}", __func__, signedTX.getSize()); ArmoryMessage msg; @@ -2407,14 +2432,9 @@ void QtQuickAdapter::saveTransaction(const bs::core::wallet::TXSignRequest& txRe return; } const auto& timestamp = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); - auto walletId = *txReq.walletIds.cbegin(); - for (const auto& hdWallet : hdWallets_) { - for (const auto& leaf : hdWallet.second.leaves) { - if (leaf.first == walletId) { - walletId = hdWallet.first; - break; - } - } + auto walletId = hdWalletIdByLeafId(*txReq.walletIds.cbegin()); + if (walletId.empty()) { + walletId = *txReq.walletIds.cbegin(); } const std::string filename = "BlockSettle_" + walletId + "_" + std::to_string(timestamp) + "_unsigned.bin"; const auto& pathName = exportPath + "/" + filename; @@ -2473,3 +2493,69 @@ QTXSignRequest* QtQuickAdapter::importTransaction(const QUrl& path) txSignRequest->setTxSignReq(txReq); return txSignRequest; } + +void QtQuickAdapter::exportSignedTX(const QUrl& path, QTXSignRequest* request + , const QString& password) +{ + const auto& txSignReq = request->txReq(); + const auto& timestamp = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + auto walletId = hdWalletIdByLeafId(*txSignReq.walletIds.cbegin()); + if (walletId.empty()) { + walletId = *txSignReq.walletIds.cbegin(); + } + const std::string filename = "BlockSettle_" + walletId + "_" + std::to_string(timestamp) + "_signed.bin"; + std::string pathName = path.toLocalFile().toStdString() + "/" + filename; + + SignerMessage msg; + auto msgReq = msg.mutable_sign_tx_request(); + //msgReq->set_id(id); + *msgReq->mutable_tx_request() = bs::signer::coreTxRequestToPb(txSignReq); + msgReq->set_sign_mode((int)SignContainer::TXSignMode::Full); + //msgReq->set_keep_dup_recips(keepDupRecips); + msgReq->set_passphrase(password.toStdString()); + const auto msgId = pushRequest(user_, userSigner_, msg.SerializeAsString()); + exportTxReqs_[msgId] = pathName; +} + +bool QtQuickAdapter::broadcastSignedTX(const QUrl& path) +{ + const auto& pathName = path.toLocalFile().toStdString(); + auto f = fopen(pathName.c_str(), "rb"); + if (!f) { + emit transactionImportFailed(tr("Failed to open %1 for reading") + .arg(QString::fromStdString(pathName))); + return false; + } + std::string txSer; + char buf[512]; + size_t rc = 0; + while ((rc = fread(buf, 1, sizeof(buf), f)) > 0) { + txSer.append(std::string(buf, rc)); + } + if (txSer.empty()) { + emit transactionImportFailed(tr("Failed to read from %1") + .arg(QString::fromStdString(pathName))); + return false; + } + BlockSettle::Common::SignerMessage_SignTxResponse msgF; + if (!msgF.ParseFromString(txSer)) { + emit transactionImportFailed(tr("Failed to parse %1 bytes from %2") + .arg(txSer.size()).arg(QString::fromStdString(pathName))); + return false; + } + const auto& signedTX = BinaryData::fromString(msgF.signed_tx()); + logger_->debug("[{}] signed TX size: {}", __func__, signedTX.getSize()); + if (signedTX.empty()) { + emit transactionImportFailed(tr("Invalid TX data from %1") + .arg(QString::fromStdString(pathName))); + return false; + } + ArmoryMessage msg; + auto msgReq = msg.mutable_tx_push(); + //msgReq->set_push_id(id); + auto msgTx = msgReq->add_txs_to_push(); + msgTx->set_tx(signedTX.toBinStr()); + //not adding TX hashes atm + pushRequest(user_, userBlockchain_, msg.SerializeAsString()); + return true; +} diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index b5825ccd5..54a89f962 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -180,7 +180,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); Q_INVOKABLE int changePassword(const QString& walletId, const QString& oldPassword, const QString& newPassword); Q_INVOKABLE bool isWalletNameExist(const QString& walletName); - Q_INVOKABLE bool isWalletPasswordValid(const QString& walletId, const QString& Password); + Q_INVOKABLE bool isWalletPasswordValid(const QString& walletId, const QString& password); Q_INVOKABLE bool verifyPasswordIntegrity(const QString& password); Q_INVOKABLE int exportWallet(const QString& walletId, const QString & exportDir); Q_INVOKABLE int viewWalletSeedAuth(const QString& walletId, const QString& password); @@ -190,7 +190,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void walletSelected(int); Q_INVOKABLE void exportTransaction(const QUrl& path, QTXSignRequest* request); Q_INVOKABLE QTXSignRequest* importTransaction(const QUrl& path); - void notifyNewTransaction(const bs::TXEntry& tx); + Q_INVOKABLE void exportSignedTX(const QUrl& path, QTXSignRequest* request, const QString& password); + Q_INVOKABLE bool broadcastSignedTX(const QUrl& path); signals: void walletsListChanged(); @@ -245,6 +246,7 @@ private slots: void setTopBlock(uint32_t); void loadPlugins(QQmlApplicationEngine&); void saveTransaction(const bs::core::wallet::TXSignRequest&, const std::string& pathName); + void notifyNewTransaction(const bs::TXEntry& tx); void createWallet(bool primary); std::string hdWalletIdByIndex(int); @@ -263,7 +265,7 @@ private slots: bs::message::ProcessingResult processWalletDeleted(const std::string& walletId); bs::message::ProcessingResult processWalletSeed(const BlockSettle::Common::SignerMessage_WalletSeed&); bs::message::ProcessingResult processUTXOs(const BlockSettle::Common::WalletsMessage_UtxoListResponse&); - bs::message::ProcessingResult processSignTX(const BlockSettle::Common::SignerMessage_SignTxResponse&); + bs::message::ProcessingResult processSignTX(bs::message::SeqId, const BlockSettle::Common::SignerMessage_SignTxResponse&); bs::message::ProcessingResult processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived&); bs::message::ProcessingResult processZCInvalidated(const BlockSettle::Common::ArmoryMessage_ZCInvalidated&); bs::message::ProcessingResult processTransactions(bs::message::SeqId, const BlockSettle::Common::ArmoryMessage_Transactions&); @@ -331,6 +333,7 @@ private slots: }; std::map txReqs_; std::vector txSaveReqs_; + std::map exportTxReqs_; std::unordered_map hwwReady_; std::map txDetailReqs_; std::map settingsCache_; From 581ab18056bf3a546b3ef22ee39a1e83999f1f0c Mon Sep 17 00:00:00 2001 From: yz Date: Wed, 12 Apr 2023 11:47:30 +0300 Subject: [PATCH 348/436] Scaling support --- GUI/QtQuick/QtQuickAdapter.cpp | 6 +- GUI/QtQuick/QtQuickAdapter.h | 2 + GUI/QtQuick/ScaleController.cpp | 28 + GUI/QtQuick/ScaleController.h | 30 ++ GUI/QtQuick/qml/AddressDetails.qml | 106 ++-- GUI/QtQuick/qml/BsStyles/BSSizes.qml | 27 + GUI/QtQuick/qml/BsStyles/qmldir | 1 + .../qml/CreateWallet/ConfirmPassword.qml | 32 +- .../qml/CreateWallet/ImportHardware.qml | 38 +- GUI/QtQuick/qml/CreateWallet/ImportWallet.qml | 56 +- .../qml/CreateWallet/ImportWatchingWallet.qml | 46 +- .../qml/CreateWallet/StartCreateWallet.qml | 28 +- .../qml/CreateWallet/TermsAndConditions.qml | 28 +- GUI/QtQuick/qml/CreateWallet/WalletName.qml | 20 +- GUI/QtQuick/qml/CreateWallet/WalletSeed.qml | 26 +- .../qml/CreateWallet/WalletSeedSkipAccept.qml | 28 +- .../qml/CreateWallet/WalletSeedVerify.qml | 30 +- GUI/QtQuick/qml/ExplorerAddress.qml | 54 +- GUI/QtQuick/qml/ExplorerEmpty.qml | 10 +- GUI/QtQuick/qml/ExplorerPage.qml | 44 +- GUI/QtQuick/qml/ExplorerTX.qml | 110 ++-- GUI/QtQuick/qml/ImportSeedPhrase.qml | 477 ------------------ GUI/QtQuick/qml/InfoBannerComponent.qml | 12 +- GUI/QtQuick/qml/InfoBar.qml | 12 +- GUI/QtQuick/qml/Overview/BalanceBar.qml | 14 +- GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml | 10 +- GUI/QtQuick/qml/Overview/OverviewPanel.qml | 45 +- .../qml/Overview/OverviewWalletBar.qml | 14 +- GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml | 52 +- GUI/QtQuick/qml/Pin/PinEntriesPopup.qml | 68 +-- GUI/QtQuick/qml/Receive/ReceiveQrCode.qml | 42 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 150 +++--- GUI/QtQuick/qml/Send/AmountInput.qml | 15 +- GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 2 +- GUI/QtQuick/qml/Send/PasswordWithTimer.qml | 14 +- GUI/QtQuick/qml/Send/RecvAddrTextInput.qml | 11 +- GUI/QtQuick/qml/Send/SelectInputs.qml | 72 +-- GUI/QtQuick/qml/Send/SendPopup.qml | 2 +- GUI/QtQuick/qml/Send/SignTransaction.qml | 110 ++-- .../qml/Send/SignTransactionAdvanced.qml | 129 +++-- GUI/QtQuick/qml/Send/SimpleDetails.qml | 62 +-- GUI/QtQuick/qml/Send/WalletsComboBox.qml | 2 +- GUI/QtQuick/qml/Settings/AddArmoryServer.qml | 56 +- .../qml/Settings/DeleteArmoryServer.qml | 28 +- .../qml/Settings/ModifyArmoryServer.qml | 50 +- GUI/QtQuick/qml/Settings/SettingsAbout.qml | 12 +- GUI/QtQuick/qml/Settings/SettingsGeneral.qml | 36 +- GUI/QtQuick/qml/Settings/SettingsMenu.qml | 10 +- GUI/QtQuick/qml/Settings/SettingsNetwork.qml | 16 +- .../qml/StyledControls/CloseIconButton.qml | 4 +- .../qml/StyledControls/CopyIconButton.qml | 10 +- .../qml/StyledControls/CustomButton.qml | 10 +- .../qml/StyledControls/CustomButtonBar.qml | 2 +- .../StyledControls/CustomButtonLeftIcon.qml | 8 +- .../StyledControls/CustomButtonRightIcon.qml | 2 +- .../qml/StyledControls/CustomCheckBox.qml | 14 +- .../qml/StyledControls/CustomComboBox.qml | 46 +- .../StyledControls/CustomCompleterPopup.qml | 16 +- .../qml/StyledControls/CustomContextMenu.qml | 28 +- .../qml/StyledControls/CustomDialog.qml | 4 +- .../CustomExportSuccessDialog.qml | 48 +- .../qml/StyledControls/CustomFailDialog.qml | 36 +- .../qml/StyledControls/CustomHeader.qml | 2 +- .../qml/StyledControls/CustomHeaderPanel.qml | 8 +- .../CustomHorizontalHeaderView.qml | 8 +- .../qml/StyledControls/CustomLabel.qml | 6 +- .../CustomLabelCopyableValue.qml | 4 +- .../qml/StyledControls/CustomLabelValue.qml | 6 +- .../qml/StyledControls/CustomListItem.qml | 32 +- .../StyledControls/CustomListRadioButton.qml | 6 +- .../qml/StyledControls/CustomMediumButton.qml | 8 +- .../StyledControls/CustomMessageDialog.qml | 36 +- .../CustomPasswordTextInput.qml | 12 +- .../qml/StyledControls/CustomPopup.qml | 36 +- .../qml/StyledControls/CustomProgressBar.qml | 14 +- .../qml/StyledControls/CustomRadioButton.qml | 16 +- .../qml/StyledControls/CustomSeedLabel.qml | 14 +- .../StyledControls/CustomSeedTextInput.qml | 10 +- .../qml/StyledControls/CustomSmallButton.qml | 8 +- .../StyledControls/CustomSmallComboBox.qml | 12 +- .../StyledControls/CustomSuccessDialog.qml | 12 +- .../StyledControls/CustomSuccessWidget.qml | 26 +- .../qml/StyledControls/CustomSwitch.qml | 16 +- .../qml/StyledControls/CustomTabButton.qml | 10 +- .../qml/StyledControls/CustomTableView.qml | 16 +- .../qml/StyledControls/CustomTextArea.qml | 6 +- .../qml/StyledControls/CustomTextEdit.qml | 16 +- .../qml/StyledControls/CustomTextInput.qml | 40 +- .../qml/StyledControls/CustomTextSwitch.qml | 40 +- .../CustomTitleDialogWindowWithExpander.qml | 16 +- .../qml/StyledControls/CustomTitleLabel.qml | 4 +- .../StyledControls/CustomTitleToolButton.qml | 10 +- .../qml/StyledControls/DeleteIconButton.qml | 8 +- .../StyledControls/InputOutputTableView.qml | 28 +- GUI/QtQuick/qml/TransactionDetails.qml | 116 ++--- GUI/QtQuick/qml/TransactionsPage.qml | 36 +- GUI/QtQuick/qml/VerifyTX.qml | 42 +- .../qml/WalletProperties/ChangePassword.qml | 44 +- .../qml/WalletProperties/DeleteWallet.qml | 24 +- .../qml/WalletProperties/DeleteWalletWarn.qml | 26 +- .../qml/WalletProperties/ExportWOWallet.qml | 72 +-- .../qml/WalletProperties/RenameWallet.qml | 24 +- .../WalletPropertiesPopup.qml | 58 +-- .../qml/WalletProperties/WalletSeed.qml | 16 +- .../qml/WalletProperties/WalletSeedAuth.qml | 20 +- GUI/QtQuick/qml/main.qml | 40 +- GUI/QtQuick/qtquick.qrc | 2 +- 107 files changed, 1557 insertions(+), 1950 deletions(-) create mode 100644 GUI/QtQuick/ScaleController.cpp create mode 100644 GUI/QtQuick/ScaleController.h create mode 100644 GUI/QtQuick/qml/BsStyles/BSSizes.qml delete mode 100644 GUI/QtQuick/qml/ImportSeedPhrase.qml diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 3faad87d9..fb000e2ea 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include "ArmoryServersModel.h" #include "bip39/bip39.h" @@ -204,13 +205,15 @@ void QtQuickAdapter::run(int &argc, char **argv) Q_INIT_RESOURCE(armory); Q_INIT_RESOURCE(qtquick); -// QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QGuiApplication::setAttribute(Qt::AA_DisableHighDpiScaling); QApplication app(argc, argv); QApplication::setOrganizationDomain(QLatin1String("blocksettle.com")); QApplication::setWindowIcon(QIcon(QStringLiteral(":/images/terminal.ico"))); + scaleController_ = std::make_unique(); + const QFileInfo localStyleSheetFile(QLatin1String("stylesheet.css")); QFile stylesheetFile(localStyleSheetFile.exists() ? localStyleSheetFile.fileName() : QLatin1String(":/STYLESHEET")); @@ -307,6 +310,7 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("addressFilterModel"), addressFilterModel_.get()); rootCtxt_->setContextProperty(QLatin1Literal("transactionFilterModel"), transactionFilterModel_.get()); rootCtxt_->setContextProperty(QLatin1Literal("pluginsListModel"), pluginsListModel_.get()); + rootCtxt_->setContextProperty(QLatin1Literal("scaleController"), scaleController_.get()); engine.addImageProvider(QLatin1Literal("QR"), new QRImageProvider); connect(&engine, &QQmlApplicationEngine::objectCreated, diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 54a89f962..d56081338 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -28,6 +28,7 @@ #include "Wallets/SignContainer.h" #include "viewmodels/WalletPropertiesVM.h" #include "SettingsController.h" +#include "ScaleController.h" #include "common.pb.h" @@ -347,6 +348,7 @@ private slots: std::unique_ptr addressFilterModel_; std::unique_ptr transactionFilterModel_; std::unique_ptr pluginsListModel_; + std::unique_ptr scaleController_; }; #endif // QT_QUICK_ADAPTER_H diff --git a/GUI/QtQuick/ScaleController.cpp b/GUI/QtQuick/ScaleController.cpp new file mode 100644 index 000000000..50813f272 --- /dev/null +++ b/GUI/QtQuick/ScaleController.cpp @@ -0,0 +1,28 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +#include "ScaleController.h" +#include +#include + +namespace { + const qreal defaultDpi = 96; +} + +ScaleController::ScaleController(QObject* parent) + : QObject(parent) +{ + qreal dpi = QGuiApplication::primaryScreen()->logicalDotsPerInch(); + scaleRatio_ = dpi / defaultDpi; + + QRect rect = QGuiApplication::primaryScreen()->geometry(); + screenWidth_ = rect.width(); + screenHeight_ = rect.height(); +} diff --git a/GUI/QtQuick/ScaleController.h b/GUI/QtQuick/ScaleController.h new file mode 100644 index 000000000..07d0ac709 --- /dev/null +++ b/GUI/QtQuick/ScaleController.h @@ -0,0 +1,30 @@ +/* +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** +*/ +#pragma once + +#include + +class ScaleController : public QObject +{ + Q_OBJECT + Q_PROPERTY(qreal scaleRatio READ scaleRatio CONSTANT) + Q_PROPERTY(int screenWidth READ screenWidth CONSTANT) + Q_PROPERTY(int screenHeight READ screenHeight CONSTANT) +public: + ScaleController(QObject* parent = nullptr); + + qreal scaleRatio() const { return scaleRatio_; } + int screenWidth() const { return screenWidth_; } + int screenHeight() const { return screenHeight_; } + +private: + int screenWidth_; + int screenHeight_; + qreal scaleRatio_{ 1.0 }; +}; diff --git a/GUI/QtQuick/qml/AddressDetails.qml b/GUI/QtQuick/qml/AddressDetails.qml index 7ff35d1c6..74b7b47a1 100644 --- a/GUI/QtQuick/qml/AddressDetails.qml +++ b/GUI/QtQuick/qml/AddressDetails.qml @@ -27,8 +27,8 @@ Popup { property string type: "" property string wallet: "" - width: 916 - height: 718 + width: BSSizes.applyWindowWidthScale(916) + height: BSSizes.applyWindowHeightScale(718) anchors.centerIn: Overlay.overlay modal: true @@ -37,9 +37,9 @@ Popup { background: Rectangle { color: BSStyle.popupBackgroundColor - border.width: 1 + border.width: BSSizes.applyScale(1) border.color: BSStyle.popupBorderColor - radius: 14 + radius: BSSizes.applyScale(14) } contentItem: Rectangle { @@ -47,29 +47,29 @@ Popup { Column { anchors.fill: parent - anchors.topMargin: 12 - anchors.leftMargin: 12 - anchors.rightMargin: 12 - anchors.bottomMargin: 12 - spacing: 20 + anchors.topMargin: BSSizes.applyScale(12) + anchors.leftMargin: BSSizes.applyScale(12) + anchors.rightMargin: BSSizes.applyScale(12) + anchors.bottomMargin: BSSizes.applyScale(12) + spacing: BSSizes.applyScale(20) Text { text: qsTr("Address") color: BSStyle.textColor - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Bold font.letterSpacing: 0.35 } Row { - spacing: 20 + spacing: BSSizes.applyScale(20) Rectangle { - width: 128 - height: 128 + width: BSSizes.applyScale(128) + height: BSSizes.applyScale(128) color: "white" - radius: 10 + radius: BSSizes.applyScale(10) anchors.verticalCenter: parent.verticalCenter Image { @@ -88,43 +88,43 @@ Popup { text: qsTr("Transactions") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 140 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(140) } Text { text: address_details.transactions !== '' ? address_details.transactions : '-' color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } Text { text: qsTr("Wallet") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 140 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(140) } Text { text: address_details.wallet color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } Text { text: qsTr("Address") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 140 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(140) } Row { Text { text: address_details.address color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) anchors.verticalCenter: parent.verticalCenter } CopyIconButton { @@ -137,22 +137,22 @@ Popup { text: qsTr("Address Type/ID") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 140 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(140) } Row { - spacing: 14 + spacing: BSSizes.applyScale(14) Text { text: address_details.asset_type color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } Text { text: address_details.type color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } } @@ -160,62 +160,62 @@ Popup { text: qsTr("Comment") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 140 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(140) } Text { text: address_details.comment !== '' ? address_details.comment : '-' color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } Text { text: qsTr("Balance") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 140 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(140) } Label { text: address_details.balance !== '' ? address_details.balance : '-' color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } } } Row { - spacing: 8 + spacing: BSSizes.applyScale(8) Label { text: qsTr("Incoming transactions") color: BSStyle.textColor - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.weight: Font.DemiBold font.family: "Roboto" } Image { - width: 9 - height: 12 + width: BSSizes.applyScale(9) + height: BSSizes.applyScale(12) source: "qrc:/images/down_arrow.svg" - anchors.leftMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) anchors.verticalCenter: parent.verticalCenter } } Rectangle { width: parent.width - height: 170 + height: BSSizes.applyScale(170) color: "transparent" - radius: 14 + radius: BSSizes.applyScale(14) border.color: BSStyle.popupBorderColor - border.width: 1 + border.width: BSSizes.applyScale(1) CustomTableView { - width: parent.width - 20 + width: parent.width - BSSizes.applyScale(20) height: parent.height anchors.centerIn: parent @@ -231,35 +231,35 @@ Popup { } Row { - spacing: 8 + spacing: BSSizes.applyScale(8) Label { text: qsTr("Outgoing transactions") color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.weight: Font.DemiBold } Image { - width: 9 - height: 12 + width: BSSizes.applyScale(9) + height: BSSizes.applyScale(12) source: "qrc:/images/up_arrow.svg" - anchors.leftMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) anchors.verticalCenter: parent.verticalCenter } } Rectangle { width: parent.width - height: 170 + height: BSSizes.applyScale(170) color: "transparent" - radius: 14 + radius: BSSizes.applyScale(14) border.color: BSStyle.popupBorderColor - border.width: 1 + border.width: BSSizes.applyScale(1) CustomTableView { - width: parent.width - 20 + width: parent.width - BSSizes.applyScale(20) height: parent.height anchors.centerIn: parent @@ -278,6 +278,8 @@ Popup { } CloseIconButton { + anchors.topMargin: BSSizes.applyScale(5) + anchors.rightMargin: BSSizes.applyScale(5) anchors.right: parent.right anchors.top: parent.top diff --git a/GUI/QtQuick/qml/BsStyles/BSSizes.qml b/GUI/QtQuick/qml/BsStyles/BSSizes.qml new file mode 100644 index 000000000..f0d8c94f7 --- /dev/null +++ b/GUI/QtQuick/qml/BsStyles/BSSizes.qml @@ -0,0 +1,27 @@ +/* + +*********************************************************************************** +* Copyright (C) 2023, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ +pragma Singleton +import QtQuick 2.0 + + +Item { + function applyScale(size) { + return size * scaleController.scaleRatio; + } + + function applyWindowWidthScale(size) { + return Math.min(applyScale(size), scaleController.screenWidth) + } + + function applyWindowHeightScale(size) { + return Math.min(applyScale(size), (scaleController.screenHeight - applyScale(100))) + } +} diff --git a/GUI/QtQuick/qml/BsStyles/qmldir b/GUI/QtQuick/qml/BsStyles/qmldir index ad71c3261..b4aea31a3 100644 --- a/GUI/QtQuick/qml/BsStyles/qmldir +++ b/GUI/QtQuick/qml/BsStyles/qmldir @@ -1,3 +1,4 @@ module BlockSettleStyle singleton BSStyle 1.0 BSStyle.qml +singleton BSSizes 1.0 BSSizes.qml diff --git a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml index 63079a2c9..7bd75f551 100644 --- a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml @@ -13,8 +13,8 @@ ColumnLayout { property string wallet_name signal sig_confirm() - height: 485 - width: 580 + height: BSSizes.applyScale(485) + width: BSSizes.applyScale(580) spacing: 0 @@ -35,13 +35,13 @@ ColumnLayout { id: password Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + input_topMargin: BSSizes.applyScale(35) + title_leftMargin: BSSizes.applyScale(16) + title_topMargin: BSSizes.applyScale(16) activeFocusOnTab: true isPassword: true @@ -97,13 +97,13 @@ ColumnLayout { id: confirm_password Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + input_topMargin: BSSizes.applyScale(35) + title_leftMargin: BSSizes.applyScale(16) + title_topMargin: BSSizes.applyScale(16) isPassword: true isHiddenText: true @@ -140,10 +140,10 @@ ColumnLayout { id: confirm_but text: qsTr("Confirm") - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - width: 530 + width: BSSizes.applyScale(530) enabled: (password.input_text !== "") && (confirm_password.input_text !== "") && (password.input_text === confirm_password.input_text) diff --git a/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml index 2a5bbdef6..e074bb443 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportHardware.qml @@ -14,8 +14,8 @@ ColumnLayout { signal sig_import() - height: 485 - width: 580 + height: BSSizes.applyScale(485) + width: BSSizes.applyScale(580) spacing: 0 @@ -30,12 +30,12 @@ ColumnLayout { id: usb_icon Layout.alignment: Qt.AlignCenter - Layout.topMargin: 24 - Layout.preferredHeight : 44 - Layout.preferredWidth : 44 + Layout.topMargin: BSSizes.applyScale(24) + Layout.preferredHeight : BSSizes.applyScale(44) + Layout.preferredWidth : BSSizes.applyScale(44) - width: 44 - height: 44 + width: BSSizes.applyScale(44) + height: BSSizes.applyScale(44) source: layout.isConnected ? "qrc:/images/USB_icon_conn.png" : "qrc:/images/USB_icon_disconn.png" } @@ -45,34 +45,34 @@ ColumnLayout { id: subtitle visible: hwDeviceModel.empty Layout.alignment: Qt.AlignCenter - Layout.topMargin: 16 - Layout.preferredHeight : 16 + Layout.topMargin: BSSizes.applyScale(16) + Layout.preferredHeight : BSSizes.applyScale(16) text: qsTr("Connect your wallet") color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } TableView { visible: !hwDeviceModel.empty - width: 800 - height: 200 - columnSpacing: 1 - rowSpacing: 1 + width: BSSizes.applyScale(800) + height: BSSizes.applyScale(200) + columnSpacing: BSSizes.applyScale(1) + rowSpacing: BSSizes.applyScale(1) clip: true ScrollIndicator.horizontal: ScrollIndicator { } ScrollIndicator.vertical: ScrollIndicator { } model: hwDeviceModel delegate: Rectangle { - implicitWidth: 750 - implicitHeight: 20 + implicitWidth: BSSizes.applyScale(750) + implicitHeight: BSSizes.applyScale(20) border.color: "black" border.width: 1 color: 'darkslategrey' Text { text: label - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) color: 'lightgrey' anchors.centerIn: parent } @@ -95,10 +95,10 @@ ColumnLayout { id: confirm_but text: qsTr("Import") - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - width: 530 + width: BSSizes.applyScale(530) enabled: /*layout.isConnected &&*/ (hwDeviceModel.selDevice >= 0) preferred: true diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml index b40116758..f65be0c5e 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWallet.qml @@ -27,8 +27,8 @@ ColumnLayout { "17", "18", "19", "20", "21", "22", "23", "24"] - height: radbut_12.checked ? 555 : 670 - width: radbut_12.checked? 580: 760 + height: BSSizes.applyScale(radbut_12.checked ? 555 : 670) + width: BSSizes.applyScale(radbut_12.checked? 580: 760) spacing: 0 @@ -43,7 +43,7 @@ ColumnLayout { id: type_switch Layout.alignment: Qt.AlignCenter - Layout.topMargin: 24 + Layout.topMargin: BSSizes.applyScale(24) isFullChoosed: true @@ -58,11 +58,11 @@ ColumnLayout { RowLayout { id: row - spacing: 12 + spacing: BSSizes.applyScale(12) Layout.alignment: Qt.AlignCenter - Layout.topMargin: 32 - Layout.preferredHeight: 19 + Layout.topMargin: BSSizes.applyScale(32) + Layout.preferredHeight: BSSizes.applyScale(19) Label { Layout.fillWidth: true @@ -73,13 +73,13 @@ ColumnLayout { text: qsTr("Seed phrase type:") - Layout.leftMargin: 25 + Layout.leftMargin: BSSizes.applyScale(25) - width: 126 - height: 19 + width: BSSizes.applyScale(126) + height: BSSizes.applyScale(19) color: "#E2E7FF" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Normal } @@ -89,8 +89,8 @@ ColumnLayout { text: "12 words" - spacing: 6 - font.pixelSize: 13 + spacing: BSSizes.applyScale(6) + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal @@ -102,8 +102,8 @@ ColumnLayout { text: "24 words" - spacing: 6 - font.pixelSize: 13 + spacing: BSSizes.applyScale(6) + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal @@ -118,7 +118,7 @@ ColumnLayout { Rectangle { id: hor_line - Layout.topMargin: 16 + Layout.topMargin: BSSizes.applyScale(16) Layout.fillWidth: true height: 1 @@ -131,11 +131,11 @@ ColumnLayout { Layout.fillHeight: true Layout.fillWidth: true - Layout.leftMargin: 25 - Layout.topMargin: 24 + Layout.leftMargin: BSSizes.applyScale(25) + Layout.topMargin: BSSizes.applyScale(24) - cellHeight : 56 - cellWidth : 180 + cellHeight : BSSizes.applyScale(56) + cellWidth : BSSizes.applyScale(180) property bool isValid: true property bool isEmpty: true @@ -147,7 +147,7 @@ ColumnLayout { property bool isAccepted: false - width: 170 + width: BSSizes.applyScale(170) title_text: modelData onTextEdited : { show_fill_in_completer() @@ -320,15 +320,15 @@ ColumnLayout { text: qsTr("Invalid seed") - Layout.bottomMargin: 24 + Layout.bottomMargin: BSSizes.applyScale(24) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - Layout.preferredHeight : 16 + Layout.preferredHeight : BSSizes.applyScale(16) - height: 16 - width: 136 + height: BSSizes.applyScale(16) + width: BSSizes.applyScale(136) color: "#EB6060" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -336,10 +336,10 @@ ColumnLayout { CustomButton { id: import_but text: qsTr("Import") - Layout.leftMargin: 25 - Layout.bottomMargin: 40 + Layout.leftMargin: BSSizes.applyScale(25) + Layout.bottomMargin: BSSizes.applyScale(40) - width: 530 + width: BSSizes.applyScale(530) enabled: !grid.hasEmptyWords preferred: true Layout.alignment: Qt.AlignCenter diff --git a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml index 759c916a5..b4be3a370 100644 --- a/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/ImportWatchingWallet.qml @@ -17,8 +17,8 @@ ColumnLayout { property string chosenFilename: "" - height: 515 - width: 580 + height: BSSizes.applyScale(515) + width: BSSizes.applyScale(580) spacing: 0 @@ -33,7 +33,7 @@ ColumnLayout { id: type_switch Layout.alignment: Qt.AlignCenter - Layout.topMargin: 24 + Layout.topMargin: BSSizes.applyScale(24) isFullChoosed: false onSig_full_changed: (isFull) => { @@ -49,11 +49,11 @@ ColumnLayout { id: dashed_border Layout.alignment: Qt.AlignCenter - Layout.topMargin: 24 - Layout.leftMargin: 25 - Layout.rightMargin: 25 - Layout.preferredHeight: 282 - height: 282 + Layout.topMargin: BSSizes.applyScale(24) + Layout.leftMargin: BSSizes.applyScale(25) + Layout.rightMargin: BSSizes.applyScale(25) + Layout.preferredHeight: BSSizes.applyScale(282) + height: BSSizes.applyScale(282) source: "qrc:/images/file_drop.png" @@ -62,11 +62,11 @@ ColumnLayout { visible: layout.chosenFilename.length > 0 - width:12 - height: 16 + width: BSSizes.applyScale(12) + height: BSSizes.applyScale(16) anchors.left: parent.left - anchors.leftMargin: 203 + anchors.leftMargin: BSSizes.applyScale(203) anchors.verticalCenter: parent.verticalCenter source: "qrc:/images/File.png" @@ -77,11 +77,11 @@ ColumnLayout { visible: layout.chosenFilename === "" - width: 20 - height: 16 + width: BSSizes.applyScale(20) + height: BSSizes.applyScale(16) anchors.left: parent.left - anchors.leftMargin: 200 + anchors.leftMargin: BSSizes.applyScale(200) anchors.verticalCenter: parent.verticalCenter source: "qrc:/images/folder_icon.png" @@ -93,10 +93,10 @@ ColumnLayout { visible: layout.chosenFilename.length > 0 anchors.left: parent.left - anchors.leftMargin: 230 + anchors.leftMargin: BSSizes.applyScale(230) anchors.verticalCenter: parent.verticalCenter color: "#E2E7FF" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Normal } @@ -107,11 +107,11 @@ ColumnLayout { visible: layout.chosenFilename === "" anchors.left: parent.left - anchors.leftMargin: 225 + anchors.leftMargin: BSSizes.applyScale(225) anchors.verticalCenter: parent.verticalCenter text: qsTr("Select the file") color: "#E2E7FF" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Normal } @@ -123,8 +123,8 @@ ColumnLayout { AnchorChanges { target: label_file; anchors { left: undefined; horizontalCenter: parent.horizontalCenter} } PropertyChanges { target: file_icon; anchors.leftMargin: 0; x: 0; } - PropertyChanges { target: label_file; anchors.horizontalCenterMargin: 13 } - PropertyChanges { target: file_icon; x: label_file.x - 27; } + PropertyChanges { target: label_file; anchors.horizontalCenterMargin: BSSizes.applyScale(13) } + PropertyChanges { target: file_icon; x: label_file.x - BSSizes.applyScale(27); } } ] @@ -155,9 +155,9 @@ ColumnLayout { CustomButton { id: import_but text: qsTr("Import") - Layout.leftMargin: 25 - Layout.topMargin: 32 - width: 530 + Layout.leftMargin:BSSizes.applyScale( 25) + Layout.topMargin: BSSizes.applyScale(32) + width: BSSizes.applyScale(530) enabled: layout.chosenFilename.length > 0 preferred: true diff --git a/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml b/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml index cb455f274..b948c7106 100644 --- a/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml +++ b/GUI/QtQuick/qml/CreateWallet/StartCreateWallet.qml @@ -15,8 +15,8 @@ ColumnLayout { signal sig_import_wallet() signal sig_hardware_wallet() - height: 485 - width: 580 + height: BSSizes.applyScale(485) + width: BSSizes.applyScale(580) spacing: 0 CustomTitleLabel { @@ -28,29 +28,29 @@ ColumnLayout { Label { Layout.fillWidth: true - height: 24 + height: BSSizes.applyScale(24) } Image { id: wallet_icon Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 120 - Layout.preferredWidth : 120 + Layout.preferredHeight : BSSizes.applyScale(120) + Layout.preferredWidth : BSSizes.applyScale(120) source: "qrc:/images/wallet icon.png" - width: 120 - height: 120 + width: BSSizes.applyScale(120) + height: BSSizes.applyScale(120) } Label { Layout.fillWidth: true - height: 16 + height: BSSizes.applyScale(16) } Text { Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 16 + Layout.preferredHeight : BSSizes.applyScale(16) text: "

Need help? Please consult our Getting Started Guides

" color: "#7A88B0" onLinkActivated: Qt.openUrlExternally(link) @@ -63,15 +63,15 @@ ColumnLayout { RowLayout { id: row - spacing: 10 + spacing: BSSizes.applyScale(10) - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter CustomButton { id: hardware_but text: qsTr("Hardware Wallet") - width: 170 + width: BSSizes.applyScale(170) preferred: false @@ -83,7 +83,7 @@ ColumnLayout { CustomButton { id: import_but text: qsTr("Import Wallet") - width: 170 + width: BSSizes.applyScale(170) preferred: false @@ -95,7 +95,7 @@ ColumnLayout { CustomButton { id: create_but text: qsTr("Create new") - width: 170 + width: BSSizes.applyScale(170) preferred: true diff --git a/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml b/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml index 25d58a73d..878f5d2c8 100644 --- a/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml +++ b/GUI/QtQuick/qml/CreateWallet/TermsAndConditions.qml @@ -12,8 +12,8 @@ ColumnLayout { signal sig_continue() - height: 485 - width: 580 + height: BSSizes.applyScale(485) + width: BSSizes.applyScale(580) spacing: 0 @@ -31,22 +31,22 @@ ColumnLayout { CustomTitleLabel { id: title Layout.alignment: Qt.AlignLeft - Layout.leftMargin: 24 + Layout.leftMargin: BSSizes.applyScale(24) Layout.preferredHeight : title.height text: qsTr("Terms and conditions") } Label { Layout.fillWidth: true - height: 24 + height: BSSizes.applyScale(24) } ScrollView { id: scroll Layout.alignment: Qt.AlignLeft - Layout.leftMargin: 24 - implicitWidth: 532 - implicitHeight: 340 + Layout.leftMargin: BSSizes.applyScale(24) + implicitWidth: BSSizes.applyScale(532) + implicitHeight: BSSizes.applyScale(340) ScrollBar.vertical.policy: ScrollBar.AlwaysOn @@ -57,11 +57,11 @@ ColumnLayout { width: parent.width height: parent.height - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal leftPadding: 0 - rightPadding: 10 + rightPadding: BSSizes.applyScale(10) color: BSStyle.titanWhiteColor selectByMouse: true wrapMode: TextEdit.WordWrap @@ -69,7 +69,7 @@ ColumnLayout { background: Rectangle { color: "transparent" - radius: 4 + radius: BSSizes.applyScale(4) } } @@ -83,14 +83,14 @@ ColumnLayout { Label { Layout.fillWidth: true - height: 24 + height: BSSizes.applyScale(24) } CustomButton { id: continue_but text: qsTr("Continue") - Layout.leftMargin: 24 - width: 532 + Layout.leftMargin: BSSizes.applyScale(24) + width: BSSizes.applyScale(532) preferred: true function click_enter() { @@ -101,7 +101,7 @@ ColumnLayout { Label { Layout.fillWidth: true - height: 24 + height: BSSizes.applyScale(24) } diff --git a/GUI/QtQuick/qml/CreateWallet/WalletName.qml b/GUI/QtQuick/qml/CreateWallet/WalletName.qml index 57a2700e8..f6e20a08e 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletName.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletName.qml @@ -14,8 +14,8 @@ ColumnLayout { signal sig_confirm() - height: 485 - width: 580 + height: BSSizes.applyScale(485) + width: BSSizes.applyScale(580) spacing: 0 @@ -36,13 +36,13 @@ ColumnLayout { id: input Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + input_topMargin: BSSizes.applyScale(35) + title_leftMargin: BSSizes.applyScale(16) + title_topMargin: BSSizes.applyScale(16) activeFocusOnTab: true hide_placeholder_when_activefocus: false @@ -67,10 +67,10 @@ ColumnLayout { id: confirm_but text: qsTr("Confirm") - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - width: 530 + width: BSSizes.applyScale(530) enabled: (input.input_text !== "") preferred: true diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml index 987b29dea..9b401b4d0 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml @@ -14,8 +14,8 @@ ColumnLayout { property var phrase - height: 485 - width: 580 + height: BSSizes.applyScale(485) + width: BSSizes.applyScale(580) spacing: 0 CustomTitleLabel { @@ -28,11 +28,11 @@ ColumnLayout { Label { id: subtitle Layout.alignment: Qt.AlignCenter - Layout.topMargin: 16 - Layout.preferredHeight : 16 + Layout.topMargin: BSSizes.applyScale(16) + Layout.preferredHeight : BSSizes.applyScale(16) text: qsTr("Write down and store your 12 word seed someplace safe and offline") color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -42,11 +42,11 @@ ColumnLayout { Layout.fillHeight: true Layout.fillWidth: true - Layout.leftMargin: 25 - Layout.topMargin: 32 + Layout.leftMargin: BSSizes.applyScale(25) + Layout.topMargin: BSSizes.applyScale(32) - cellHeight : 56 - cellWidth : 180 + cellHeight : BSSizes.applyScale(56) + cellWidth : BSSizes.applyScale(180) model: phrase delegate: CustomSeedLabel { @@ -57,16 +57,16 @@ ColumnLayout { RowLayout { id: row - spacing: 10 + spacing: BSSizes.applyScale(10) //Layout.leftMargin: 24 - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter CustomButton { id: copy_seed_but text: qsTr("Copy Seed") - width: 261 + width: BSSizes.applyScale(261) preferred: false @@ -78,7 +78,7 @@ ColumnLayout { CustomButton { id: continue_but text: qsTr("Continue") - width: 261 + width: BSSizes.applyScale(261) preferred: true diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml index 6d3c9f352..9ed039652 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeedSkipAccept.qml @@ -13,8 +13,8 @@ ColumnLayout { signal sig_skip() signal sig_not_skip() - height: 485 - width: 580 + height: BSSizes.applyScale(485) + width: BSSizes.applyScale(580) spacing: 0 @@ -29,13 +29,13 @@ ColumnLayout { id: warning_icon Layout.alignment: Qt.AlignHCenter | Qt.AlignTop - Layout.topMargin: 24 - Layout.preferredHeight : 44 - Layout.preferredWidth : 44 + Layout.topMargin: BSSizes.applyScale(24) + Layout.preferredHeight : BSSizes.applyScale(44) + Layout.preferredWidth : BSSizes.applyScale(44) source: "qrc:/images/warning_icon.png" - width: 44 - height: 44 + width: BSSizes.applyScale(44) + height: BSSizes.applyScale(44) } Label { @@ -45,11 +45,11 @@ ColumnLayout { Layout.alignment: Qt.AlignHCenter | Qt.AlignTop - Layout.topMargin: 16 - Layout.preferredHeight : 16 + Layout.topMargin: BSSizes.applyScale(16) + Layout.preferredHeight : BSSizes.applyScale(16) color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -62,16 +62,16 @@ ColumnLayout { RowLayout { id: row - spacing: 10 + spacing: BSSizes.applyScale(10) //Layout.leftMargin: 24 - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter CustomButton { id: no_but text: qsTr("No") - width: 261 + width: BSSizes.applyScale(261) preferred: false @@ -84,7 +84,7 @@ ColumnLayout { CustomButton { id: skip_but text: qsTr("Yes, Skip") - width: 261 + width: BSSizes.applyScale(261) preferred: true diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml index 61d7d8852..2bacf4f95 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml @@ -15,8 +15,8 @@ ColumnLayout { property var indexes: [] - height: 485 - width: 580 + height: BSSizes.applyScale(485) + width: BSSizes.applyScale(580) spacing: 0 @@ -32,10 +32,10 @@ ColumnLayout { Layout.fillHeight: true Layout.fillWidth: true - Layout.leftMargin: 25 - Layout.topMargin: 32 + Layout.leftMargin: BSSizes.applyScale(25) + Layout.topMargin: BSSizes.applyScale(32) - spacing : 10 + spacing: BSSizes.applyScale(10) property var isValid: true property var isComplete: false @@ -73,31 +73,31 @@ ColumnLayout { text: qsTr("Your words are wrong") - Layout.leftMargin: 222 - Layout.bottomMargin: 114 - Layout.preferredHeight : 16 + Layout.leftMargin: BSSizes.applyScale(222) + Layout.bottomMargin: BSSizes.applyScale(114) + Layout.preferredHeight: BSSizes.applyScale(16) - height: 16 - width: 136 + height: BSSizes.applyScale(16) + width: BSSizes.applyScale(136) color: "#EB6060" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } RowLayout { id: row - spacing: 10 + spacing: BSSizes.applyScale(10) //Layout.leftMargin: 24 - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter CustomButton { id: skip_but text: qsTr("Skip") - width: 261 + width: BSSizes.applyScale(261) preferred: false @@ -109,7 +109,7 @@ ColumnLayout { CustomButton { id: continue_but text: qsTr("Continue") - width: 261 + width: BSSizes.applyScale(261) enabled: list.isComplete diff --git a/GUI/QtQuick/qml/ExplorerAddress.qml b/GUI/QtQuick/qml/ExplorerAddress.qml index 62903aa00..aade6bf40 100644 --- a/GUI/QtQuick/qml/ExplorerAddress.qml +++ b/GUI/QtQuick/qml/ExplorerAddress.qml @@ -26,20 +26,20 @@ Item { signal requestPageChange(var text) Column { - spacing: 20 - anchors.leftMargin: 18 - anchors.rightMargin: 18 - anchors.bottomMargin: 18 + spacing: BSSizes.applyScale(20) + anchors.leftMargin: BSSizes.applyScale(18) + anchors.rightMargin: BSSizes.applyScale(18) + anchors.bottomMargin: BSSizes.applyScale(18) anchors.fill: parent Row { - spacing: 16 - height: 20 + spacing: BSSizes.applyScale(16) + height: BSSizes.applyScale(20) Label { text: qsTr("Address") color: BSStyle.textColor - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Bold font.letterSpacing: 0.35 @@ -50,7 +50,7 @@ Item { id: address_label text: address !== null ? address : "" color: BSStyle.textColor - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) height: parent.height verticalAlignment: Text.AlignBottom @@ -63,16 +63,16 @@ Item { Rectangle { width: parent.width - height: 60 - anchors.bottomMargin: 24 - anchors.topMargin: 18 - anchors.leftMargin: 18 - anchors.rightMargin: 18 + height: BSSizes.applyScale(60) + anchors.bottomMargin: BSSizes.applyScale(24) + anchors.topMargin: BSSizes.applyScale(18) + anchors.leftMargin: BSSizes.applyScale(18) + anchors.rightMargin: BSSizes.applyScale(18) - radius: 14 + radius: BSSizes.applyScale(14) color: BSStyle.addressesPanelBackgroundColor - border.width: 1 + border.width: BSSizes.applyScale(1) border.color: BSStyle.comboBoxBorderColor Row { @@ -80,49 +80,49 @@ Item { anchors.verticalCenter: parent.verticalCenter BaseBalanceLabel { - width: 130 + width: BSSizes.applyScale(130) label_text: qsTr("Transaction count") label_value: txListByAddrModel.nbTx anchors.verticalCenter: parent.verticalCenter } Rectangle { - width: 1 - height: 36 + width: BSSizes.applyScale(1) + height: BSSizes.applyScale(36) color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } BaseBalanceLabel { - width: 130 + width: BSSizes.applyScale(130) label_text: qsTr("Balance (BTC)") label_value: txListByAddrModel.balance anchors.verticalCenter: parent.verticalCenter } Rectangle { - width: 1 - height: 36 + width: BSSizes.applyScale(1) + height: BSSizes.applyScale(36) color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } BaseBalanceLabel { - width: 150 + width: BSSizes.applyScale(150) label_text: qsTr("Total Received (BTC)") label_value: txListByAddrModel.totalReceived anchors.verticalCenter: parent.verticalCenter } Rectangle { - width: 1 - height: 36 + width: BSSizes.applyScale(1) + height: BSSizes.applyScale(36) color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } BaseBalanceLabel { - width: 130 + width: BSSizes.applyScale(130) label_text: qsTr("Total Sent (BTC)") label_value: txListByAddrModel.totalSent anchors.verticalCenter: parent.verticalCenter @@ -133,14 +133,14 @@ Item { Label { text: qsTr("Transactions") color: BSStyle.textColor - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Bold } CustomTableView { width: parent.width - height: parent.height - 150 + height: parent.height - BSSizes.applyScale(150) model: txListByAddrModel copy_button_column_index: 1 diff --git a/GUI/QtQuick/qml/ExplorerEmpty.qml b/GUI/QtQuick/qml/ExplorerEmpty.qml index 817853631..a94757d67 100644 --- a/GUI/QtQuick/qml/ExplorerEmpty.qml +++ b/GUI/QtQuick/qml/ExplorerEmpty.qml @@ -17,21 +17,21 @@ import "BsStyles" Item { anchors.fill: parent - anchors.topMargin: 226 + anchors.topMargin: BSSizes.applyScale(226) Column { - spacing: 24 + spacing: BSSizes.applyScale(24) anchors.horizontalCenter: parent.horizontalCenter Image { - width: 57 - height: 72 + width: BSSizes.applyScale(57) + height: BSSizes.applyScale(72) source: "qrc:/images/logo_no_text.svg" anchors.horizontalCenter: parent.horizontalCenter } Label { text: qsTr("Provides you with a convenient, powerful, yet simple tool to read\n transaction and address data from the bitcoin network") - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) color: BSStyle.titleTextColor horizontalAlignment: Text.AlignHCenter } diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml index 4987982f3..6f0660e0e 100644 --- a/GUI/QtQuick/qml/ExplorerPage.qml +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -56,16 +56,16 @@ Item { Rectangle { id: explorer_menu_row - height: 100 + height: BSSizes.applyScale(100) width: parent.width color: "transparent" Rectangle { - anchors.bottomMargin: 24 - anchors.topMargin: 24 - anchors.leftMargin: 18 - anchors.rightMargin: 18 + anchors.bottomMargin: BSSizes.applyScale(24) + anchors.topMargin: BSSizes.applyScale(24) + anchors.leftMargin: BSSizes.applyScale(18) + anchors.rightMargin: BSSizes.applyScale(18) anchors.fill: parent anchors.centerIn: parent @@ -76,14 +76,14 @@ Item { border.color: BSStyle.comboBoxBorderColor Row { - spacing: 20 + spacing: BSSizes.applyScale(20) anchors.fill: parent - anchors.leftMargin: 18 + anchors.leftMargin: BSSizes.applyScale(18) Image { id: search_icon - width: 24 - height: 24 + width: BSSizes.applyScale(24) + height: BSSizes.applyScale(24) source: "qrc:/images/search_icon.svg" anchors.verticalCenter: parent.verticalCenter } @@ -91,10 +91,10 @@ Item { TextInput { id: expSearchBox anchors.verticalCenter: parent.verticalCenter - width: 900 + width: BSSizes.applyScale(900) clip: true color: 'lightgrey' - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) focus: true function resetSearch() { @@ -170,7 +170,7 @@ Item { Text { text: qsTr("Search for transaction or address") - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) color: BSStyle.titleTextColor anchors.fill: parent visible: !expSearchBox.text @@ -181,14 +181,14 @@ Item { Row { id: right_buttons_menu - spacing: 8 - anchors.rightMargin: 11 + spacing: BSSizes.applyScale(8) + anchors.rightMargin: BSSizes.applyScale(11) anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter Image { - width: 24 - height: 24 + width: BSSizes.applyScale(24) + height: BSSizes.applyScale(24) source: "qrc:/images/paste_icon.png" anchors.verticalCenter: parent.verticalCenter @@ -204,24 +204,24 @@ Item { CustomSmallButton { text: qsTr("<") - width: 29 - height: 29 + width: BSSizes.applyScale(29) + height: BSSizes.applyScale(29) enabled: historyIndex >= 0 onClicked: expSearchBox.prev() } CustomSmallButton { text: qsTr(">") - width: 29 - height: 29 + width: BSSizes.applyScale(29) + height: BSSizes.applyScale(29) enabled: historyIndex < (searchHist.length - 1) onClicked: expSearchBox.next() } CustomSmallButton { text: qsTr("Reset") - width: 68 - height: 29 + width: BSSizes.applyScale(68) + height: BSSizes.applyScale(29) onClicked: expSearchBox.resetSearch() } } diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index 13e754acb..6370e6f71 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -26,22 +26,22 @@ Item { signal requestPageChange(var text) Column { - spacing: 23 - anchors.leftMargin: 18 - anchors.rightMargin: 18 - anchors.bottomMargin: 18 + spacing: BSSizes.applyScale(23) + anchors.leftMargin: BSSizes.applyScale(18) + anchors.rightMargin: BSSizes.applyScale(18) + anchors.bottomMargin: BSSizes.applyScale(18) anchors.fill: parent Row { - spacing: 16 - height: 20 + spacing: BSSizes.applyScale(16) + height: BSSizes.applyScale(20) width: parent.width Label { text: qsTr("Transaction ID") height: parent.height color: BSStyle.textColor - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Bold font.letterSpacing: 0.35 @@ -52,7 +52,7 @@ Item { height: parent.height text: tx ? tx.txId : qsTr("Unknown") color: BSStyle.textColor - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" verticalAlignment: Text.AlignBottom @@ -65,13 +65,13 @@ Item { Rectangle { width: parent.width - height: 60 - anchors.bottomMargin: 24 - anchors.topMargin: 24 - anchors.leftMargin: 18 - anchors.rightMargin: 18 + height: BSSizes.applyScale(60) + anchors.bottomMargin: BSSizes.applyScale(24) + anchors.topMargin: BSSizes.applyScale(24) + anchors.leftMargin: BSSizes.applyScale(18) + anchors.rightMargin: BSSizes.applyScale(18) - radius: 14 + radius: BSSizes.applyScale(14) color: BSStyle.addressesPanelBackgroundColor border.width: 1 @@ -82,7 +82,7 @@ Item { anchors.verticalCenter: parent.verticalCenter BaseBalanceLabel { - width: 110 + width: BSSizes.applyScale(110) label_text: qsTr("Confirmations") label_value: tx !== null ? tx.nbConf : "" anchors.verticalCenter: parent.verticalCenter @@ -91,97 +91,97 @@ Item { Rectangle { width: 1 - height: 36 + height: BSSizes.applyScale(36) color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } BaseBalanceLabel { - width: 80 + width: BSSizes.applyScale(80) label_text: qsTr("Inputs") label_value: tx !== null ? tx.nbInputs : "" anchors.verticalCenter: parent.verticalCenter } Rectangle { - width: 1 - height: 36 + width: BSSizes.applyScale(1) + height: BSSizes.applyScale(36) color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } BaseBalanceLabel { - width: 90 + width: BSSizes.applyScale(90) label_text: qsTr("Outputs") label_value: tx !== null ? tx.nbOutputs : "" anchors.verticalCenter: parent.verticalCenter } Rectangle { - width: 1 - height: 36 + width: BSSizes.applyScale(1) + height: BSSizes.applyScale(36) color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } BaseBalanceLabel { - width: 150 + width: BSSizes.applyScale(150) label_text: qsTr("Input Amount (BTC)") label_value: tx !== null ? tx.inputAmount : "" anchors.verticalCenter: parent.verticalCenter } Rectangle { - width: 1 - height: 36 + width: BSSizes.applyScale(1) + height: BSSizes.applyScale(36) color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } BaseBalanceLabel { - width: 150 + width: BSSizes.applyScale(150) label_text: qsTr("Output Amount (BTC)") label_value: tx !== null ? tx.outputAmount : "" anchors.verticalCenter: parent.verticalCenter } Rectangle { - width: 1 - height: 36 + width: BSSizes.applyScale(1) + height: BSSizes.applyScale(36) color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } BaseBalanceLabel { - width: 130 + width: BSSizes.applyScale(130) label_text: qsTr("Fees (BTC)") label_value: tx !== null ? tx.fee : "" anchors.verticalCenter: parent.verticalCenter } Rectangle { - width: 1 - height: 36 + width: BSSizes.applyScale(1) + height: BSSizes.applyScale(36) color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } BaseBalanceLabel { - width: 150 + width: BSSizes.applyScale(150) label_text: qsTr("Fee per byte (s/b)") label_value: tx !== null ? tx.feePerByte : "" anchors.verticalCenter: parent.verticalCenter } Rectangle { - width: 1 - height: 36 + width: BSSizes.applyScale(1) + height: BSSizes.applyScale(36) color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } BaseBalanceLabel { - width: 150 + width: BSSizes.applyScale(150) label_text: qsTr("Size (virtual bytes)") label_value: tx !== null ? tx.virtSize : "" anchors.verticalCenter: parent.verticalCenter @@ -190,45 +190,45 @@ Item { } Row { - spacing: 24 + spacing: BSSizes.applyScale(24) width: parent.width - height: parent.height - 120 + height: parent.height - BSSizes.applyScale(120) Rectangle { height: parent.height - width: parent.width / 2 - 12 + width: parent.width / 2 - BSSizes.applyScale(12) color: "transparent" - radius: 14 + radius: BSSizes.applyScale(14) border.width: 1 border.color: BSStyle.tableSeparatorColor Column { anchors.fill: parent - anchors.margins: 20 + anchors.margins: BSSizes.applyScale(20) Row { - spacing: 11 + spacing: BSSizes.applyScale(11) Label { text: qsTr("Input") color: BSStyle.textColor - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Bold } Image { - width: 9 - height: 12 + width: BSSizes.applyScale(9) + height: BSSizes.applyScale(12) source: "qrc:/images/down_arrow.svg" - anchors.leftMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) anchors.verticalCenter: parent.verticalCenter } } InputOutputTableView { width: parent.width - height: parent.height - 20 + height: parent.height - BSSizes.applyScale(20) model: tx !== null ? tx.inputs : [] copy_button_column_index: -1 columnWidths: [0.0, 0.7, 0.2, 0.1] @@ -245,30 +245,30 @@ Item { Rectangle { height: parent.height - width: parent.width / 2 - 12 + width: parent.width / 2 - BSSizes.applyScale(12) color: "transparent" - radius: 14 + radius: BSSizes.applyScale(14) - border.width: 1 + border.width: BSSizes.applyScale(1) border.color: BSStyle.tableSeparatorColor Column { anchors.fill: parent - anchors.margins: 20 + anchors.margins: BSSizes.applyScale(20) Row { - spacing: 11 + spacing: BSSizes.applyScale(11) Label { text: qsTr("Output") color: BSStyle.textColor - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Bold } Image { - width: 9 - height: 12 + width: BSSizes.applyScale(9) + height: BSSizes.applyScale(12) source: "qrc:/images/up_arrow.svg" anchors.verticalCenter: parent.verticalCenter } @@ -276,7 +276,7 @@ Item { InputOutputTableView { width: parent.width - height: parent.height - 20 + height: parent.height - BSSizes.applyScale(20) model: tx !== null ? tx.outputs : [] copy_button_column_index: -1 columnWidths: [0.0, 0.7, 0.2, 0.1] diff --git a/GUI/QtQuick/qml/ImportSeedPhrase.qml b/GUI/QtQuick/qml/ImportSeedPhrase.qml deleted file mode 100644 index 6f9033323..000000000 --- a/GUI/QtQuick/qml/ImportSeedPhrase.qml +++ /dev/null @@ -1,477 +0,0 @@ -/* - -*********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB -* Distributed under the GNU Affero General Public License (AGPL v3) -* See LICENSE or http://www.gnu.org/licenses/agpl.html -* -********************************************************************************** - -*/ -import QtQuick 2 -import QtQuick.Controls 2.9 -import QtQuick.Layouts 1.3 -import QtQml.Models 2 - -import "StyledControls" -import "BsStyles" -//import "BsControls" -//import "BsDialogs" -//import "js/helper.js" as JsHelper - -Item { - property var phrase - - WalletNamePass { - id: walletNamePassPage - visible: false - } - - Column { - spacing: 23 - anchors.fill: parent - - Button { - icon.source: "qrc:/images/send_icon.png" - onClicked: { - stack.pop() - } - } - Label { - text: qsTr("Import wallet") - font.pointSize: 14 - } - - Row { - spacing: 16 - Label { - text: qsTr("Seed phrase type") - font.pointSize: 10 - } - RadioButton { - id: rb12Words - checked: true - text: qsTr("12 words") - font.pointSize: 10 - } - RadioButton { - id: rb24Words - checked: false - text: qsTr("24 words") - font.pointSize: 10 - } - } - - Row { - spacing: 23 - - TextInput { - id: word1 - width: 250 - height: 23 - color: 'lightgrey' - font.pointSize: 12 - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "1" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word2 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "2" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word3 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "3" - font.pointSize: 6 - color: 'darkgrey' - } - } - } - Row { - spacing: 23 - - TextInput { - id: word4 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "4" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word5 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "5" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word6 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "6" - font.pointSize: 6 - color: 'darkgrey' - } - } - } - Row { - spacing: 23 - - TextInput { - id: word7 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "7" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word8 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "8" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word9 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "9" - font.pointSize: 6 - color: 'darkgrey' - } - } - } - Row { - spacing: 23 - - TextInput { - id: word10 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "10" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word11 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "11" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word12 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "12" - font.pointSize: 6 - color: 'darkgrey' - } - } - } - Row { - spacing: 23 - visible: rb24Words.checked - - TextInput { - id: word13 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "13" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word14 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "14" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word15 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "15" - font.pointSize: 6 - color: 'darkgrey' - } - } - } - Row { - spacing: 23 - visible: rb24Words.checked - - TextInput { - id: word16 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "16" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word17 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "17" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word18 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "18" - font.pointSize: 6 - color: 'darkgrey' - } - } - } - Row { - spacing: 23 - visible: rb24Words.checked - - TextInput { - id: word19 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "19" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word20 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "20" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word21 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "21" - font.pointSize: 6 - color: 'darkgrey' - } - } - } - Row { - spacing: 23 - visible: rb24Words.checked - - TextInput { - id: word22 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "22" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word23 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "23" - font.pointSize: 6 - color: 'darkgrey' - } - } - TextInput { - id: word24 - width: 250 - height: 23 - font.pointSize: 12 - color: 'lightgrey' - horizontalAlignment: TextEdit.AlignHCenter - verticalAlignment: TextEdit.AlignVCenter - Text { - text: "24" - font.pointSize: 6 - color: 'darkgrey' - } - } - } - - Button { - width: 900 - text: qsTr("Import") - font.pointSize: 14 - enabled: word1.text.length && word2.text.length && word3.text.length - && word4.text.length && word5.text.length && word6.text.length - && word7.text.length && word8.text.length && word9.text.length - && word10.text.length && word11.text.length && word12.text.length - && (rb24Words.checked ? (word13.text.length && word14.text.length - && word15.text.length && word16.text.length && word17.text.length - && word18.text.length && word19.text.length && word20.text.length - && word21.text.length && word22.text.length && word23.text.length - && word24.text.length) : true) - - onClicked: { - phrase = [ word1.text, word2.text, word3.text, word4.text, - word5.text, word6.text, word7.text, word8.text, word9.text, - word10.text, word11.text, word12.text] - if (rb24Words.checked) { - phrase.append(word13.text) - phrase.append(word14.text) - phrase.append(word15.text) - phrase.append(word16.text) - phrase.append(word17.text) - phrase.append(word18.text) - phrase.append(word19.text) - phrase.append(word20.text) - phrase.append(word21.text) - phrase.append(word22.text) - phrase.append(word23.text) - phrase.append(word24.text) - - } - walletNamePassPage.phrase = phrase - walletNamePassPage.isImport = true - stack.push(walletNamePassPage) - } - } - } -} diff --git a/GUI/QtQuick/qml/InfoBannerComponent.qml b/GUI/QtQuick/qml/InfoBannerComponent.qml index b43bad00d..63832c537 100644 --- a/GUI/QtQuick/qml/InfoBannerComponent.qml +++ b/GUI/QtQuick/qml/InfoBannerComponent.qml @@ -10,13 +10,15 @@ */ import QtQuick 2.9 +import "BsStyles" + Item { id: banner property alias message: messageText.text property alias bgColor: background.color - height: 70 + height: BSSizes.applyScale(70) Rectangle { id: background @@ -27,10 +29,10 @@ Item { } Text { - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) renderType: Text.QtRendering - width: 150 - height: 40 + width: BSSizes.applyScale(150) + height: BSSizes.applyScale(40) id: messageText @@ -43,7 +45,7 @@ Item { states: State { name: "portrait" - PropertyChanges { target: banner; height: 100 } + PropertyChanges { target: banner; height: BSSizes.applyScale(100) } } MouseArea { diff --git a/GUI/QtQuick/qml/InfoBar.qml b/GUI/QtQuick/qml/InfoBar.qml index 1a96c8cfe..f09a989a7 100644 --- a/GUI/QtQuick/qml/InfoBar.qml +++ b/GUI/QtQuick/qml/InfoBar.qml @@ -15,13 +15,13 @@ import "BsStyles" Item { id: infoBarRoot - height: 30 + height: BSSizes.applyScale(30) property bool showChangeApplyMessage: false RowLayout { anchors.fill: parent - spacing: 10 + spacing: BSSizes.applyScale(10) Item { Layout.fillWidth: true @@ -31,7 +31,7 @@ Item { visible: infoBarRoot.showChangeApplyMessage anchors { fill: parent - leftMargin: 10 + leftMargin: BSSizes.applyScale(10) } horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter @@ -45,10 +45,10 @@ Item { id: netLabel property bool bInitAsTestNet: signerSettings.testNet - radius: 5 + radius: BSSizes.applyScale(5) color: bInitAsTestNet ? BSStyle.testnetColor : BSStyle.mainnetColor - width: 100 - height: 20 + width: BSSizes.applyScale(100) + height: BSSizes.applyScale(20) Layout.alignment: Qt.AlignVCenter Text { diff --git a/GUI/QtQuick/qml/Overview/BalanceBar.qml b/GUI/QtQuick/qml/Overview/BalanceBar.qml index 1d927a1ca..66c35f308 100644 --- a/GUI/QtQuick/qml/Overview/BalanceBar.qml +++ b/GUI/QtQuick/qml/Overview/BalanceBar.qml @@ -16,8 +16,8 @@ import "." as OverviewControls Rectangle { id: control - width: 520 - height: 100 + width: BSSizes.applyScale(520) + height: BSSizes.applyScale(100) color: "transparent" property alias confirmed_balance_value: confirmed_balance.label_value @@ -25,15 +25,15 @@ Rectangle { property alias total_balance_value: total_balance.label_value property alias used_addresses_value: used_addresses.label_value - property int spacer_height: 36 + property int spacer_height: BSSizes.applyScale(36) Row { anchors.fill: parent - spacing: 10 + spacing: BSSizes.applyScale(10) OverviewControls.BaseBalanceLabel { id: confirmed_balance - width: 130 + width: BSSizes.applyScale(130) label_text: qsTr("Confirmed balance") value_suffix: qsTr('BTC') anchors.verticalCenter: parent.verticalCenter @@ -48,7 +48,7 @@ Rectangle { OverviewControls.BaseBalanceLabel { id: unconfirmed_balance - width: 130 + width: BSSizes.applyScale(130) label_text: qsTr("Unconfirmed balance") value_suffix: qsTr('BTC') anchors.verticalCenter: parent.verticalCenter @@ -63,7 +63,7 @@ Rectangle { OverviewControls.BaseBalanceLabel { id: total_balance - width: 130 + width: BSSizes.applyScale(130) label_text: qsTr("Total balance") value_suffix: qsTr('BTC') anchors.verticalCenter: parent.verticalCenter diff --git a/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml b/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml index 3fdecfa24..c13f32b3d 100644 --- a/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml +++ b/GUI/QtQuick/qml/Overview/BaseBalanceLabel.qml @@ -20,10 +20,10 @@ Rectangle { property color label_value_color: BSStyle.balanceValueTextColor property string value_suffix - property int left_text_padding: 10 + property int left_text_padding: BSSizes.applyScale(10) - width: 120 - height: 53 + width: BSSizes.applyScale(120) + height: BSSizes.applyScale(53) color: "transparent" Column { @@ -36,7 +36,7 @@ Rectangle { color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 12 + font.pixelSize: BSSizes.applyScale(12) font.letterSpacing: -0.2 } @@ -47,7 +47,7 @@ Rectangle { color: control.label_value_color font.family: "Roboto" font.weight: Font.Bold - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) //font.letterSpacing: 0.2 } } diff --git a/GUI/QtQuick/qml/Overview/OverviewPanel.qml b/GUI/QtQuick/qml/Overview/OverviewPanel.qml index ca410d5ac..31a3f073a 100644 --- a/GUI/QtQuick/qml/Overview/OverviewPanel.qml +++ b/GUI/QtQuick/qml/Overview/OverviewPanel.qml @@ -22,9 +22,6 @@ Rectangle { signal openSend (string txId, bool isRBF, bool isCPFP) signal openExplorer (string txId) - - width: 1200 - height: 788 color: "transparent" signal requestWalletProperties() @@ -33,15 +30,15 @@ Rectangle { signal openAddressDetails(var address, var transactions, var balance, var comment, var asset_type, var type, var wallet) Column { - anchors.leftMargin: 18 - anchors.rightMargin: 18 + anchors.leftMargin: BSSizes.applyScale(18) + anchors.rightMargin: BSSizes.applyScale(18) anchors.fill: parent spacing: 0 OverviewControls.OverviewWalletBar { id: overview_panel width: parent.width - height: 100 + height: BSSizes.applyScale(100) onRequestWalletProperties: control.requestWalletProperties() onCreateNewWallet: control.createNewWallet() @@ -49,33 +46,33 @@ Rectangle { } Rectangle { - height: (parent.height - overview_panel.height) * 0.65 + height: (parent.height - overview_panel.height) * 0.6 width: parent.width anchors.horizontalCenter: parent.horizontalCenter - radius: 16 + radius: BSSizes.applyScale(16) color: BSStyle.addressesPanelBackgroundColor border.width: 1 border.color: BSStyle.tableSeparatorColor Column { anchors.fill: parent - anchors.margins: 20 - spacing: 10 + anchors.margins: BSSizes.applyScale(20) + spacing: BSSizes.applyScale(10) Rectangle { id: tableMenu color: "transparent" width: parent.width - height: 30 + height: BSSizes.applyScale(30) Text { text: qsTr("Addresses") color: BSStyle.textColor - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Bold - font.letterSpacing: 0.35 + font.letterSpacing: BSSizes.applyScale(0.35) } Row { @@ -83,7 +80,7 @@ Rectangle { spacing: 6 CustomSmallButton { - width: 85 + width: BSSizes.applyScale(85) text: qsTr("Hide used") onClicked: { addressFilterModel.hideUsed = !addressFilterModel.hideUsed @@ -93,7 +90,7 @@ Rectangle { } CustomSmallButton { - width: 90 + width: BSSizes.applyScale(90) text: qsTr("Hide internal") onClicked: { addressFilterModel.hideInternal = !addressFilterModel.hideInternal @@ -103,7 +100,7 @@ Rectangle { } CustomSmallButton { - width: 90 + width: BSSizes.applyScale(90) text: qsTr("Hide external") onClicked: { addressFilterModel.hideExternal = !addressFilterModel.hideExternal @@ -113,7 +110,7 @@ Rectangle { } CustomSmallButton { - width: 85 + width: BSSizes.applyScale(85) text: qsTr("Hide empty") onClicked: { addressFilterModel.hideEmpty = !addressFilterModel.hideEmpty @@ -131,8 +128,8 @@ Rectangle { model: addressFilterModel copy_button_column_index: 0 - text_header_size: 12 - cell_text_size: 13 + text_header_size: BSSizes.applyScale(12) + cell_text_size: BSSizes.applyScale(13) columnWidths: [0.35, 0.15, 0.1, 0.4] onCopyRequested: bsApp.copyAddressToClipboard(id) @@ -161,17 +158,17 @@ Rectangle { Rectangle { color: "transparent" width: parent.width - height: (parent.height - overview_panel.height) * 0.35 + height: (parent.height - overview_panel.height) * 0.4 Column { anchors.fill: parent - anchors.topMargin: 20 - spacing: 10 + anchors.topMargin: BSSizes.applyScale(20) + spacing: BSSizes.applyScale(10) Text { text: qsTr("Non-settled Transactions") color: BSStyle.textColor - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Bold font.letterSpacing: 0.35 @@ -179,7 +176,7 @@ Rectangle { CustomTransactionsTableView { width: parent.width - height: parent.height - 40 + height: parent.height - BSSizes.applyScale(40) model: PendingTransactionFilterModel { id: pendingTransactionModel diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index 1ab4566e5..a4eec2157 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -11,14 +11,12 @@ import QtQuick 2.15 import wallet.balance 1.0 +import "../BsStyles" import "." as OverviewControls import "../StyledControls" as Controls Rectangle { id: control - - width: 1200 - height: 100 color: "transparent" property alias currentWallet: wallet_selection_combobox.currentValue @@ -29,21 +27,21 @@ Rectangle { Row { anchors.fill:parent - spacing: 20 + spacing: BSSizes.applyScale(20) Controls.CustomComboBox { id: wallet_selection_combobox anchors.verticalCenter: parent.verticalCenter objectName: "walletsComboBox" - width: 263 - height: 53 + width: BSSizes.applyScale(263) + height: BSSizes.applyScale(53) model: walletBalances.rowCount > 0 ? walletBalances : [{ "name": qsTr("Create wallet")}] textRole: "name" valueRole: "name" - fontSize: 16 + fontSize: BSSizes.applyScale(16) onCurrentIndexChanged: { if (walletBalances.rowCount !== 0) { @@ -92,7 +90,7 @@ Rectangle { } Row { - spacing: 10 + spacing: BSSizes.applyScale(10) anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right diff --git a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml index 9a54da870..1cb6e61af 100644 --- a/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml +++ b/GUI/QtQuick/qml/Pin/PasswordEntryPopup.qml @@ -24,7 +24,7 @@ Window { color: "transparent" - x: mainWindow.x + (mainWindow.width - width)/2 + x: mainWindow.x + (mainWindow.width - width) / 2 y: mainWindow.y + 28 property string device_name @@ -35,23 +35,23 @@ Window { color: "#191E2A" opacity: 1 - radius: 16 - height: 510 - width: 430 + radius: BSSizes.applyScale(16) + height: BSSizes.applyScale(510) + width: BSSizes.applyScale(430) border.color : BSStyle.defaultBorderColor - border.width : 1 + border.width : BSSizes.applyScale(1) Image { id: close_button anchors.top: parent.top - anchors.topMargin: 24 + anchors.topMargin: BSSizes.applyScale(24) anchors.right: parent.right - anchors.rightMargin: 24 + anchors.rightMargin: BSSizes.applyScale(24) source: "qrc:/images/close_button.svg" - width: 16 - height: 16 + width: BSSizes.applyScale(16) + height: BSSizes.applyScale(16) MouseArea { anchors.fill: parent onClicked: { @@ -66,7 +66,7 @@ Window { anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top - anchors.topMargin: 36 + anchors.topMargin: BSSizes.applyScale(36) text: qsTr("Enter Password") } @@ -76,15 +76,15 @@ Window { id: device_name_title_lbl anchors.top: title.bottom - anchors.topMargin: 48 + anchors.topMargin: BSSizes.applyScale(48) anchors.left: parent.left - anchors.leftMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) text: qsTr("Device name:") color: "#45A6FF" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Normal } @@ -94,9 +94,9 @@ Window { id: device_name_lbl anchors.top: title.bottom - anchors.topMargin: 48 + anchors.topMargin: BSSizes.applyScale(48) anchors.right: parent.right - anchors.rightMargin: 20 + anchors.rightMargin: BSSizes.applyScale(20) horizontalAlignment: Text.AlignRight @@ -104,7 +104,7 @@ Window { color: "#E2E7FF" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Normal } @@ -113,17 +113,17 @@ Window { id: password anchors.top: device_name_lbl.bottom - anchors.topMargin: 48 + anchors.topMargin: BSSizes.applyScale(48) anchors.horizontalCenter: parent.horizontalCenter //visible: !root.accept_on_device //always visible now - password can be empty in all cases - height : 70 - width: 390 + height : BSSizes.applyScale(70) + width: BSSizes.applyScale(390) - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + input_topMargin: BSSizes.applyScale(35) + title_leftMargin: BSSizes.applyScale(16) + title_topMargin: BSSizes.applyScale(16) title_text: qsTr("Password") @@ -133,16 +133,16 @@ Window { RowLayout { id: row - spacing: 10 + spacing: BSSizes.applyScale(10) anchors.bottom: parent.bottom - anchors.bottomMargin: 40 + anchors.bottomMargin: BSSizes.applyScale(40) anchors.horizontalCenter: parent.horizontalCenter CustomButton { id: cancel_but text: qsTr("Cancel") - width: 190 + width: BSSizes.applyScale(190) preferred: false function click_enter() { @@ -154,7 +154,7 @@ Window { CustomButton { id: accept_but text: qsTr("Accept") - width: 190 + width: BSSizes.applyScale(190) //enabled: accept_on_device || password.input_text.length //always accept now diff --git a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml index 90e11da2e..dc5e4e695 100644 --- a/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml +++ b/GUI/QtQuick/qml/Pin/PinEntriesPopup.qml @@ -25,7 +25,7 @@ Window { color: "transparent" x: mainWindow.x + (mainWindow.width - width)/2 - y: mainWindow.y + 28 + y: mainWindow.y + BSSizes.applyScale(28) property var numbers: [ "7", "8", "9", "4", "5", "6", @@ -37,9 +37,9 @@ Window { color: "#191E2A" opacity: 1 - radius: 16 - height: 610 - width: 430 + radius: BSSizes.applyScale(16) + height: BSSizes.applyScale(610) + width: BSSizes.applyScale(430) border.color : BSStyle.defaultBorderColor border.width : 1 @@ -47,13 +47,13 @@ Window { id: close_button anchors.top: parent.top - anchors.topMargin: 24 + anchors.topMargin: BSSizes.applyScale(24) anchors.right: parent.right - anchors.rightMargin: 24 + anchors.rightMargin: BSSizes.applyScale(24) source: "qrc:/images/close_button.svg" - width: 16 - height: 16 + width: BSSizes.applyScale(16) + height: BSSizes.applyScale(16) MouseArea { anchors.fill: parent onClicked: { @@ -68,7 +68,7 @@ Window { anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top - anchors.topMargin: 36 + anchors.topMargin: BSSizes.applyScale(36) text: qsTr("Enter PIN") } @@ -76,13 +76,13 @@ Window { Item { id: grid_item - width: 390 - height: 330 + width: BSSizes.applyScale(390) + height: BSSizes.applyScale(330) anchors.left: parent.left - anchors.leftMargin: 25 + anchors.leftMargin: BSSizes.applyScale(25) anchors.top: title.bottom - anchors.topMargin: 24 + anchors.topMargin: BSSizes.applyScale(24) GridView { id: grid @@ -91,8 +91,8 @@ Window { anchors.fill: parent - cellHeight : 110 - cellWidth : 130 + cellHeight : BSSizes.applyScale(110) + cellWidth : BSSizes.applyScale(130) model: numbers @@ -101,10 +101,10 @@ Window { delegate: Button { id: input - height: 100 - width: 120 + height: BSSizes.applyScale(100) + width: BSSizes.applyScale(120) - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Normal palette.buttonText: BSStyle.buttonsTextColor @@ -112,13 +112,13 @@ Window { text: String.fromCodePoint(0x2022) background: Rectangle { - implicitWidth: 100 - implicitHeight: 120 + implicitWidth: BSSizes.applyScale(100) + implicitHeight: BSSizes.applyScale(120) color: input.down ? BSStyle.buttonsStandardPressedColor : (input.hovered ? BSStyle.buttonsStandardHoveredColor : BSStyle.buttonsStandardColor) - radius: 14 + radius: BSSizes.applyScale(14) border.color: BSStyle.buttonsStandardBorderColor border.width: input.down? 1 : 0 @@ -138,25 +138,25 @@ Window { id: pin_field anchors.left: parent.left - anchors.leftMargin: 25 + anchors.leftMargin: BSSizes.applyScale(25) anchors.top: grid_item.bottom - anchors.topMargin: 24 + anchors.topMargin: BSSizes.applyScale(24) - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Normal color: BSStyle.buttonsTextColor - leftPadding: 14 - rightPadding: 14 + leftPadding: BSSizes.applyScale(14) + rightPadding: BSSizes.applyScale(14) readOnly: true background: Rectangle { - implicitWidth: 380 - implicitHeight: 46 + implicitWidth: BSSizes.applyScale(380) + implicitHeight: BSSizes.applyScale(46) color: "#020817" - radius: 14 + radius: BSSizes.applyScale(14) } Image { @@ -164,11 +164,11 @@ Window { anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: 24 + anchors.rightMargin: BSSizes.applyScale(24) source: "qrc:/images/close_button.svg" - width: 16 - height: 16 + width: BSSizes.applyScale(16) + height: BSSizes.applyScale(16) MouseArea { anchors.fill: parent onClicked: clean() @@ -182,9 +182,9 @@ Window { anchors.horizontalCenter: parent.horizontalCenter anchors.bottom: parent.bottom - anchors.bottomMargin: 40 + anchors.bottomMargin: BSSizes.applyScale(40) - width: 380 + width: BSSizes.applyScale(380) preferred: true diff --git a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml index 72fb07e93..70a876ece 100644 --- a/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml +++ b/GUI/QtQuick/qml/Receive/ReceiveQrCode.qml @@ -14,8 +14,8 @@ ColumnLayout { signal sig_finish() - height: 549 - width: 580 + height: BSSizes.applyWindowHeightScale(549) + width: BSSizes.applyWindowWidthScale(580) spacing: 0 CustomTitleLabel { @@ -29,11 +29,11 @@ ColumnLayout { Label { id: subtitle Layout.alignment: Qt.AlignCenter - Layout.topMargin: 16 - Layout.preferredHeight : 16 + Layout.topMargin: BSSizes.applyScale(16) + Layout.preferredHeight : BSSizes.applyScale(16) text: qsTr("Bitcoins sent to this address will appear in:") color: "#7A88B0" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -42,11 +42,11 @@ ColumnLayout { Label { id: wallet_name Layout.alignment: Qt.AlignCenter - Layout.topMargin: 6 - Layout.preferredHeight : 16 + Layout.topMargin: BSSizes.applyScale(6) + Layout.preferredHeight : BSSizes.applyScale(16) text: qsTr("%1 / Native SegWit").arg(getWalletData(walletBalances.selectedWallet, WalletBalance.NameRole)) color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -55,23 +55,23 @@ ColumnLayout { Image { id: wallet_icon - Layout.topMargin: 48 + Layout.topMargin: BSSizes.applyScale(48) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.preferredHeight : 214 - Layout.preferredWidth : 214 + Layout.preferredHeight : BSSizes.applyScale(214) + Layout.preferredWidth : BSSizes.applyScale(214) source: bsApp.generatedAddress !== "" ? ("image://QR/" + bsApp.generatedAddress) : "" - sourceSize.width: 214 - sourceSize.height: 214 - width: 214 - height: 214 + sourceSize.width: BSSizes.applyScale(214) + sourceSize.height: BSSizes.applyScale(214) + width: BSSizes.applyScale(214) + height: BSSizes.applyScale(214) } Label { - Layout.topMargin: 30 + Layout.topMargin: BSSizes.applyScale(30) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter text: bsApp.generatedAddress - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Medium color: "#E2E7FF" @@ -85,16 +85,16 @@ ColumnLayout { CustomButton { id: copy_but - width: 530 + width: BSSizes.applyScale(530) - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter text: qsTr("Copy to clipboard") icon.source: "qrc:/images/copy_icon.svg" - icon.width: 24 - icon.height: 24 + icon.width: BSSizes.applyScale(24) + icon.height: BSSizes.applyScale(24) icon.color: "#FFFFFF" preferred: true diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index df713f14a..327e63421 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -17,8 +17,8 @@ ColumnLayout { signal sig_simple() signal sig_select_inputs() - height: 723 - width: 1132 + height: BSSizes.applyWindowHeightScale(723) + width: BSSizes.applyWindowWidthScale(1132) spacing: 0 property var tempRequest: null @@ -43,17 +43,17 @@ ColumnLayout { RowLayout { Layout.fillWidth: true - Layout.preferredHeight : 34 + Layout.preferredHeight : BSSizes.applyScale(34) Label { Layout.fillWidth: true - Layout.preferredHeight : 34 + Layout.preferredHeight : BSSizes.applyScale(34) } CustomTitleLabel { id: title - Layout.rightMargin: 378 + Layout.rightMargin: BSSizes.applyScale(378) Layout.alignment: Qt.AlignRight | Qt.AlingVCenter text: (!isRBF && !isCPFP) ? qsTr("Send Bitcoin") @@ -63,12 +63,12 @@ ColumnLayout { Button { id: simple_but - Layout.rightMargin: 60 + Layout.rightMargin: BSSizes.applyScale(60) Layout.alignment: Qt.AlignRight | Qt.AlingVCenter activeFocusOnTab: false - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal palette.buttonText: BSStyle.buttonsHeaderTextColor @@ -77,15 +77,15 @@ ColumnLayout { icon.color: "transparent" icon.source: "qrc:/images/advanced_icon.png" - icon.width: 16 - icon.height: 16 + icon.width: BSSizes.applyScale(16) + icon.height: BSSizes.applyScale(16) background: Rectangle { - implicitWidth: 100 - implicitHeight: 34 + implicitWidth: BSSizes.applyScale(100) + implicitHeight: BSSizes.applyScale(34) color: "transparent" - radius: 14 + radius: BSSizes.applyScale(14) border.color: BSStyle.defaultBorderColor border.width: 1 @@ -103,22 +103,22 @@ ColumnLayout { id: rects_row Layout.fillWidth: true - Layout.preferredHeight : 580 - Layout.topMargin: 15 + Layout.preferredHeight : BSSizes.applyScale(580) + Layout.topMargin: BSSizes.applyScale(15) - spacing: 12 + spacing: BSSizes.applyScale(12) Rectangle { id: inputs_rect - Layout.leftMargin: 24 + Layout.leftMargin: BSSizes.applyScale(24) Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter - width: 536 - height: 565 + width: BSSizes.applyScale(536) + height: BSSizes.applyScale(565) color: "transparent" - radius: 16 + radius: BSSizes.applyScale(16) border.color: BSStyle.defaultBorderColor border.width: 1 @@ -133,22 +133,22 @@ ColumnLayout { RowLayout { Layout.fillWidth: true - Layout.topMargin: 16 - Layout.preferredHeight: 19 + Layout.topMargin: BSSizes.applyScale(16) + Layout.preferredHeight: BSSizes.applyScale(19) Layout.alignment: Qt.AlignTop Label { id: inputs_title - Layout.leftMargin: 16 + Layout.leftMargin: BSSizes.applyScale(16) Layout.fillHeight: true Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter text: qsTr("Inputs") - height : 19 + height : BSSizes.applyScale(19) color: "#E2E7FF" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Medium } @@ -162,17 +162,17 @@ ColumnLayout { activeFocusOnTab: false - implicitHeight: 18 + implicitHeight: BSSizes.applyScale(18) Layout.alignment: Qt.AlignRight | Qt.AlignTop - Layout.rightMargin: 16 - Layout.topMargin: 0 + Layout.rightMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(0) text: qsTr("RBF") enabled: !isRBF - spacing: 6 - font.pixelSize: 13 + spacing: BSSizes.applyScale(6) + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal } @@ -183,13 +183,13 @@ ColumnLayout { id: from_wallet_combo - Layout.leftMargin: 16 - Layout.topMargin: 8 + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(8) Layout.alignment: Qt.AlignLeft | Qt.AlingTop visible: !isRBF && !isCPFP - width: 504 - height: 70 + width: BSSizes.applyScale(504) + height: BSSizes.applyScale(70) onActivated: { walletBalances.selectedWallet = currentIndex @@ -227,12 +227,12 @@ ColumnLayout { id: fee_suggest_combo - Layout.leftMargin: 16 - Layout.topMargin: 10 + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(10) Layout.alignment: Qt.AlignLeft | Qt.AlingTop - width: 504 - height: 70 + width: BSSizes.applyScale(504) + height: BSSizes.applyScale(70) function change_index_handler() { @@ -253,7 +253,7 @@ ColumnLayout { height: 1 Layout.fillWidth: true - Layout.topMargin: (!isRBF && !isCPFP) ? 196 : 274 + Layout.topMargin: BSSizes.applyScale((!isRBF && !isCPFP) ? 196 : 274) Layout.alignment: Qt.AlignLeft | Qt.AlingTop color: BSStyle.defaultGreyColor @@ -265,8 +265,8 @@ ColumnLayout { Layout.fillWidth: true Layout.fillHeight : true - Layout.leftMargin: 16 - Layout.rightMargin: 16 + Layout.leftMargin: BSSizes.applyScale(16) + Layout.rightMargin: BSSizes.applyScale(16) model: isRBF ? tx.ownInputs : isCPFP ? tx.ownOutputs : txInputsSelectedModel columnWidths: [0.7, 0.1, 0, 0.2] @@ -281,7 +281,7 @@ ColumnLayout { Row { id: cmpnt_sel_inputs_row - spacing: 12 + spacing: BSSizes.applyScale(12) Text { id: internal_text @@ -312,7 +312,7 @@ ColumnLayout { font.family: "Roboto" font.weight: Font.DemiBold - font.pixelSize: 12 + font.pixelSize: BSSizes.applyScale(12) anchors.verticalCenter: parent.verticalCenter @@ -326,12 +326,12 @@ ColumnLayout { } background: Rectangle { - implicitWidth: 84 - implicitHeight: 25 + implicitWidth: BSSizes.applyScale(84) + implicitHeight: BSSizes.applyScale(25) color: "transparent" border.color: "#45A6FF" - border.width: 1 - radius: 8 + border.width: BSSizes.applyScale(1) + radius: BSSizes.applyScale(8) } onClicked: layout.sig_select_inputs() @@ -363,17 +363,17 @@ ColumnLayout { Rectangle { id: outputs_rect - Layout.rightMargin: 24 + Layout.rightMargin: BSSizes.applyScale(24) Layout.alignment: Qt.AlignRight | Qt.AlingVCenter - width: 536 - height: 565 + width: BSSizes.applyScale(536) + height: BSSizes.applyScale(565) color: "transparent" - radius: 16 + radius: BSSizes.applyScale(16) border.color: BSStyle.defaultBorderColor - border.width: 1 + border.width: BSSizes.applyScale(1) ColumnLayout { id: outputs_layout @@ -385,15 +385,15 @@ ColumnLayout { Label { id: outputs_title - Layout.leftMargin: 16 - Layout.topMargin: 16 + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(16) Layout.alignment: Qt.AlignLeft | Qt.AlingTop text: qsTr("Outputs") - height : 19 + height : BSSizes.applyScale(19) color: "#E2E7FF" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Medium } @@ -402,12 +402,12 @@ ColumnLayout { id: rec_addr_input - Layout.leftMargin: 16 - Layout.topMargin: 16 + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(16) Layout.alignment: Qt.AlignLeft | Qt.AlingTop - width: 504 - height: 70 + width: BSSizes.applyScale(504) + height: BSSizes.applyScale(70) wallets_current_index: from_wallet_combo.currentIndex @@ -432,12 +432,12 @@ ColumnLayout { id: amount_input - Layout.leftMargin: 16 - Layout.topMargin: 10 + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(10) Layout.alignment: Qt.AlignLeft | Qt.AlingTop - width: 504 - height: 70 + width: BSSizes.applyScale(504) + height: BSSizes.applyScale(70) onEnterPressed: { if (!processEnterKey()) { @@ -458,12 +458,12 @@ ColumnLayout { id: comment_input - Layout.leftMargin: 16 - Layout.topMargin: 10 + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(10) Layout.alignment: Qt.AlignLeft | Qt.AlingTop - Layout.preferredHeight : 90 - Layout.preferredWidth: 504 + Layout.preferredHeight : BSSizes.applyScale(90) + Layout.preferredWidth: BSSizes.applyScale(504) //aliases title_text: qsTr("Comment") @@ -476,8 +476,8 @@ ColumnLayout { id: include_output_but text: qsTr("Include Output") - Layout.leftMargin: 16 - Layout.topMargin: 16 + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(16) Layout.alignment: Qt.AlignLeft | Qt.AlingTop activeFocusOnTab: include_output_but.enabled @@ -488,7 +488,7 @@ ColumnLayout { icon.source: "qrc:/images/plus.svg" icon.color: include_output_but.enabled ? "#45A6FF" : BSStyle.buttonsDisabledTextColor - width: 504 + width: BSSizes.applyScale(504) function click_enter() { if (!include_output_but.enabled) return @@ -510,7 +510,7 @@ ColumnLayout { height: 1 Layout.fillWidth: true - Layout.topMargin: 30 + Layout.topMargin: BSSizes.applyScale(30) Layout.alignment: Qt.AlignLeft | Qt.AlingTop color: BSStyle.defaultGreyColor @@ -521,8 +521,8 @@ ColumnLayout { Layout.fillWidth: true Layout.fillHeight : true - Layout.leftMargin: 16 - Layout.rightMargin: 16 + Layout.leftMargin: BSSizes.applyScale(16) + Layout.rightMargin: BSSizes.applyScale(16) model: txOutputsModel columnWidths: [0.744, 0.20, 0.056] @@ -569,9 +569,9 @@ ColumnLayout { enabled: (txOutputsModel.rowCount > 1) preferred: isRBF || is_ready_broadcast - width: 1084 + width: BSSizes.applyScale(1084) - Layout.bottomMargin: 30 + Layout.bottomMargin: BSSizes.applyScale(30) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter text: bsApp.walletProperitesVM.isWatchingOnly ? qsTr("Export transaction") : qsTr("Continue") diff --git a/GUI/QtQuick/qml/Send/AmountInput.qml b/GUI/QtQuick/qml/Send/AmountInput.qml index b264d4322..cad604c25 100644 --- a/GUI/QtQuick/qml/Send/AmountInput.qml +++ b/GUI/QtQuick/qml/Send/AmountInput.qml @@ -72,19 +72,20 @@ CustomTextInput { z: 1 - width: 55 - height: 28 - back_radius: 37 + width: BSSizes.applyScale(55) + height: BSSizes.applyScale(28) + back_radius: BSSizes.applyScale(37) anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: 23 + anchors.rightMargin: BSSizes.applyScale(23) text: qsTr("MAX") - font.pixelSize: 12 + font.pixelSize: BSSizes.applyScale(12) enabled: (tempRequest != null) function click_enter() { + console.log(tempRequest, tempRequest.maxAmount) if (tempRequest != null && tempRequest.maxAmount.length > 0) { amount_input.input_text = (parseFloat(tempRequest.maxAmount) - (balanceSubtractor !== null ? balanceSubtractor : 0.0)).toFixed(8) } @@ -97,10 +98,10 @@ CustomTextInput { anchors.verticalCenter: parent.verticalCenter anchors.right: max_but.left - anchors.rightMargin: 16 + anchors.rightMargin: BSSizes.applyScale(16) text: "BTC" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal color: "#7A88B0" diff --git a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml index c6ecb5ec0..2159057c1 100644 --- a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml +++ b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml @@ -24,7 +24,7 @@ CustomComboBox { //aliases title_text: qsTr("Fee Suggestions") - height: 70 + height: BSSizes.applyScale(70) textRole: "text" valueRole: "value" diff --git a/GUI/QtQuick/qml/Send/PasswordWithTimer.qml b/GUI/QtQuick/qml/Send/PasswordWithTimer.qml index a55a2c2f0..452d70335 100644 --- a/GUI/QtQuick/qml/Send/PasswordWithTimer.qml +++ b/GUI/QtQuick/qml/Send/PasswordWithTimer.qml @@ -32,11 +32,11 @@ Item { anchors.topMargin: 0 width: root.width - height: 70 + height: BSSizes.applyScale(70) - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + input_topMargin: BSSizes.applyScale(35) + title_leftMargin: BSSizes.applyScale(16) + title_topMargin: BSSizes.applyScale(16) visible: txSignRequest !== null ? !txSignRequest.isHWW : false title_text: qsTr("Password") @@ -57,7 +57,7 @@ Item { anchors.horizontalCenter: parent.horizontalCenter anchors.top: password.bottom - anchors.topMargin: 16 + anchors.topMargin: BSSizes.applyScale(16) width: root.width @@ -72,13 +72,13 @@ Item { anchors.horizontalCenter: parent.horizontalCenter anchors.top: progress_bar.bottom - anchors.topMargin: 8 + anchors.topMargin: BSSizes.applyScale(8) text: qsTr("%1 seconds left").arg (Number(root.time_progress).toLocaleString()) color: "#45A6FF" - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal } diff --git a/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml b/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml index be5b5de9d..4477d0ed2 100644 --- a/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml +++ b/GUI/QtQuick/qml/Send/RecvAddrTextInput.qml @@ -23,8 +23,7 @@ CustomTextInput { signal focus_next() - input_right_margin: paste_but.anchors.rightMargin + - paste_but.width + 16 + input_right_margin: BSSizes.applyScale(paste_but.anchors.rightMargin + paste_but.width + 16) //aliases title_text: qsTr("Receiver address") @@ -35,13 +34,13 @@ CustomTextInput { z: 1 anchors.top: rec_addr_input.top - anchors.topMargin: 23 + anchors.topMargin: BSSizes.applyScale(23) anchors.right: rec_addr_input.right - anchors.rightMargin: 23 + anchors.rightMargin: BSSizes.applyScale(23) source: "qrc:/images/paste_icon.png" - width: 24 - height: 24 + width: BSSizes.applyScale(24) + height: BSSizes.applyScale(24) MouseArea { anchors.fill: parent diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml index 12a824665..a06563b6f 100644 --- a/GUI/QtQuick/qml/Send/SelectInputs.qml +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -20,11 +20,11 @@ ColumnLayout { id: layout - property int text_header_size: 11 - property int cell_text_size: 12 + property int text_header_size: BSSizes.applyScale(11) + property int cell_text_size: BSSizes.applyScale(12) - height: 662 - width: 1132 + height: BSSizes.applyScale(662) + width: BSSizes.applyScale(1132) spacing: 0 CustomTitleLabel { @@ -37,14 +37,14 @@ ColumnLayout { Rectangle { id: addresses_rect - Layout.topMargin: 24 + Layout.topMargin: BSSizes.applyScale(24) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - width: 1084 - height: 434 + width: BSSizes.applyScale(1084) + height: BSSizes.applyScale(434) color: "transparent" - radius: 16 + radius: BSSizes.applyScale(16) border.color: BSStyle.defaultBorderColor border.width: 1 @@ -52,8 +52,8 @@ ColumnLayout { CustomTableView { id: inputs_table - width: parent.width - 32 - height: parent.height - 12 + width: parent.width - BSSizes.applyScale(32) + height: parent.height - BSSizes.applyScale(12) anchors.centerIn: parent model: txInputsModel @@ -88,7 +88,7 @@ ColumnLayout { id: internal_text anchors.left: checkbox_address.right - anchors.leftMargin: 8 + anchors.leftMargin: BSSizes.applyScale(8) anchors.verticalCenter: parent.verticalCenter visible: model_column !== delete_button_column_index @@ -119,13 +119,13 @@ ColumnLayout { visible: model_is_expandable anchors.left: internal_text.left - anchors.leftMargin: 10 + internal_text.contentWidth + anchors.leftMargin: BSSizes.applyScale(10) + internal_text.contentWidth anchors.verticalCenter: parent.verticalCenter - width: 9 - height: 6 - sourceSize.width: 9 - sourceSize.height: 6 + width: BSSizes.applyScale(9) + height: BSSizes.applyScale(6) + sourceSize.width: BSSizes.applyScale(9) + sourceSize.height: BSSizes.applyScale(6) source: model_expanded? "qrc:/images/expanded.svg" : "qrc:/images/collapsed.svg" @@ -165,15 +165,15 @@ ColumnLayout { Label { id: inputs_details_title - Layout.leftMargin: 26 - Layout.topMargin: 24 + Layout.leftMargin: BSSizes.applyScale(26) + Layout.topMargin: BSSizes.applyScale(24) Layout.alignment: Qt.AlignLeft | Qt.AlingTop text: qsTr("Inputs details") - height : 19 + height : BSSizes.applyScale(19) color: "#E2E7FF" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Medium } @@ -181,29 +181,29 @@ ColumnLayout { Rectangle { id: total_rect - Layout.topMargin: 16 + Layout.topMargin: BSSizes.applyScale(16) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - width: 1084 - height: 82 + width: BSSizes.applyScale(1084) + height: BSSizes.applyScale(82) color: "#32394F" - radius: 14 + radius: BSSizes.applyScale(14) Label { id: trans_inputs_title anchors.top: parent.top - anchors.topMargin: 18 + anchors.topMargin: BSSizes.applyScale(18) anchors.left: parent.left - anchors.leftMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) text: qsTr("Transaction Inputs:") color: "#45A6FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -213,15 +213,15 @@ ColumnLayout { id: total_amount_title anchors.top: trans_inputs_title.bottom - anchors.topMargin: 14 + anchors.topMargin: BSSizes.applyScale(14) anchors.left: parent.left - anchors.leftMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) text: qsTr("Total Amount:") color: "#45A6FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -231,15 +231,15 @@ ColumnLayout { id: trans_inputs anchors.top: parent.top - anchors.topMargin: 18 + anchors.topMargin: BSSizes.applyScale(18) anchors.right: parent.right - anchors.rightMargin: 20 + anchors.rightMargin: BSSizes.applyScale(20) text: txInputsModel.nbTx color: "#FFFFFF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -249,15 +249,15 @@ ColumnLayout { id: total_amount anchors.top: trans_inputs.bottom - anchors.topMargin: 18 + anchors.topMargin: BSSizes.applyScale(18) anchors.right: parent.right - anchors.rightMargin: 20 + anchors.rightMargin: BSSizes.applyScale(20) text: txInputsModel.balance color: "#FFFFFF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 3d006813e..83f4a3c44 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -11,7 +11,7 @@ CustomPopup { objectName: "send_popup" - navig_bar_width: 30 + navig_bar_width: BSSizes.applyScale(30) _stack_view.initialItem: simple_details _arrow_but_visibility: !simple_details.visible && !advanced_details.visible diff --git a/GUI/QtQuick/qml/Send/SignTransaction.qml b/GUI/QtQuick/qml/Send/SignTransaction.qml index c8e2726a1..5241369fb 100644 --- a/GUI/QtQuick/qml/Send/SignTransaction.qml +++ b/GUI/QtQuick/qml/Send/SignTransaction.qml @@ -17,8 +17,8 @@ ColumnLayout { signal sig_broadcast() signal sig_time_finished() - height: 554 - width: 580 + height: BSSizes.applyWindowHeightScale(554) + width: BSSizes.applyWindowWidthScale(580) spacing: 0 property int k: 0 @@ -54,7 +54,7 @@ ColumnLayout { CustomTitleLabel { id: title - Layout.topMargin: 6 + Layout.topMargin: BSSizes.applyScale(6) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter Layout.preferredHeight : title.height text: qsTr("Sign Transaction") @@ -62,19 +62,19 @@ ColumnLayout { Label { Layout.fillWidth: true - height: 24 + height: BSSizes.applyScale(24) } Rectangle { id: output_rect - width: 532 - height: 82 + width: BSSizes.applyScale(532) + height: BSSizes.applyScale(82) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - radius: 14 + radius: BSSizes.applyScale(14) color: "#32394F" @@ -83,15 +83,15 @@ ColumnLayout { id: out_addr_title anchors.top: parent.top - anchors.topMargin: 18 + anchors.topMargin: BSSizes.applyScale(18) anchors.left: parent.left - anchors.leftMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) text: qsTr("Output address:") color: "#45A6FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -101,15 +101,15 @@ ColumnLayout { id: out_amount_title anchors.top: out_addr_title.bottom - anchors.topMargin: 14 + anchors.topMargin: BSSizes.applyScale(14) anchors.left: parent.left - anchors.leftMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) text: qsTr("Output amount:") color: "#45A6FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -119,15 +119,15 @@ ColumnLayout { id: out_addr anchors.top: parent.top - anchors.topMargin: 18 + anchors.topMargin: BSSizes.applyScale(18) anchors.right: parent.right - anchors.rightMargin: 20 + anchors.rightMargin: BSSizes.applyScale(20) text: txSignRequest !== null ? txSignRequest.outputAddresses[0] : "" color: "#FFFFFF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -137,15 +137,15 @@ ColumnLayout { id: out_amount anchors.top: out_addr.bottom - anchors.topMargin: 14 + anchors.topMargin: BSSizes.applyScale(14) anchors.right: parent.right - anchors.rightMargin: 20 + anchors.rightMargin: BSSizes.applyScale(20) text: txSignRequest !== null ? txSignRequest.outputAmount : "" color: "#FFFFFF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -156,8 +156,8 @@ ColumnLayout { id: input_rect - width: 532 - height: 188 + width: BSSizes.applyScale(532) + height: BSSizes.applyScale(188) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter @@ -168,15 +168,15 @@ ColumnLayout { id: in_amount_title anchors.top: parent.top - anchors.topMargin: 18 + anchors.topMargin: BSSizes.applyScale(18) anchors.left: parent.left - anchors.leftMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) text: qsTr("Input amount:") color: "#7A88B0" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -186,15 +186,15 @@ ColumnLayout { id: in_amount anchors.top: parent.top - anchors.topMargin: 18 + anchors.topMargin: BSSizes.applyScale(18) anchors.right: parent.right - anchors.rightMargin: 20 + anchors.rightMargin: BSSizes.applyScale(20) text: txSignRequest !== null ? txSignRequest.inputAmount : "" color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -204,15 +204,15 @@ ColumnLayout { id: return_amount_title anchors.top: in_amount_title.bottom - anchors.topMargin: 15 + anchors.topMargin: BSSizes.applyScale(15) anchors.left: parent.left - anchors.leftMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) text: qsTr("Return amount:") color: "#7A88B0" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -222,15 +222,15 @@ ColumnLayout { id: return_amount anchors.top: in_amount.bottom - anchors.topMargin: 15 + anchors.topMargin: BSSizes.applyScale(15) anchors.right: parent.right - anchors.rightMargin: 20 + anchors.rightMargin: BSSizes.applyScale(20) text: txSignRequest !== null ? txSignRequest.returnAmount : "" color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -240,15 +240,15 @@ ColumnLayout { id: transaction_fee_title anchors.top: return_amount_title.bottom - anchors.topMargin: 15 + anchors.topMargin: BSSizes.applyScale(15) anchors.left: parent.left - anchors.leftMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) text: qsTr("Transaction fee:") color: "#7A88B0" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -258,15 +258,15 @@ ColumnLayout { id: transaction_fee anchors.top: return_amount.bottom - anchors.topMargin: 15 + anchors.topMargin: BSSizes.applyScale(15) anchors.right: parent.right - anchors.rightMargin: 20 + anchors.rightMargin: BSSizes.applyScale(20) text: txSignRequest !== null ? txSignRequest.fee : "" color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -276,15 +276,15 @@ ColumnLayout { id: transaction_size_title anchors.top: transaction_fee_title.bottom - anchors.topMargin: 15 + anchors.topMargin: BSSizes.applyScale(15) anchors.left: parent.left - anchors.leftMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) text: qsTr("Transaction size:") color: "#7A88B0" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -294,15 +294,15 @@ ColumnLayout { id: transaction_size anchors.top: transaction_fee.bottom - anchors.topMargin: 15 + anchors.topMargin: BSSizes.applyScale(15) anchors.right: parent.right - anchors.rightMargin: 20 + anchors.rightMargin: BSSizes.applyScale(20) text: txSignRequest !== null ? txSignRequest.txSize : "" color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -312,15 +312,15 @@ ColumnLayout { id: fee_per_byte_title anchors.top: transaction_size_title.bottom - anchors.topMargin: 15 + anchors.topMargin: BSSizes.applyScale(15) anchors.left: parent.left - anchors.leftMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) text: qsTr("Fee-per-byte:") color: "#7A88B0" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -330,15 +330,15 @@ ColumnLayout { id: fee_per_byte anchors.top: transaction_size.bottom - anchors.topMargin: 15 + anchors.topMargin: BSSizes.applyScale(15) anchors.right: parent.right - anchors.rightMargin: 20 + anchors.rightMargin: BSSizes.applyScale(20) text: txSignRequest !== null ? txSignRequest.feePerByte : "" color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -349,9 +349,9 @@ ColumnLayout { id: password Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.topMargin: 10 + Layout.topMargin: BSSizes.applyScale(10) - width: 532 + width: BSSizes.applyScale(532) time_progress: layout.time_progress @@ -371,9 +371,9 @@ ColumnLayout { CustomButton { id: broadcast_but text: txSignRequest !== null ? (txSignRequest.hasError ? txSignRequest.errorText : qsTr("Broadcast")) : "" - width: 532 + width: BSSizes.applyScale(532) - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter enabled: txSignRequest !== null ? diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml index fb0cadb4d..069669eba 100644 --- a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -19,8 +19,8 @@ ColumnLayout { signal sig_broadcast() signal sig_time_finished() - height: 748 - width: 1132 + height: BSSizes.applyWindowHeightScale(748) + width: BSSizes.applyWindowWidthScale(1132) spacing: 0 Connections @@ -63,35 +63,34 @@ ColumnLayout { RowLayout { - id: rects_row Layout.fillWidth: true - Layout.preferredHeight : 312 - Layout.topMargin: 24 + Layout.preferredHeight : BSSizes.applyScale(312) + Layout.topMargin: BSSizes.applyScale(24) - spacing: 20 + spacing: BSSizes.applyScale(20) Rectangle { id: inputs_rect - Layout.leftMargin: 22 + Layout.leftMargin: BSSizes.applyScale(22) Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter - width: 532 - height: 312 + width: BSSizes.applyScale(532) + height: BSSizes.applyScale(312) color: "transparent" - radius: 14 + radius: BSSizes.applyScale(14) border.color: BSStyle.defaultBorderColor - border.width: 1 + border.width: BSSizes.applyScale(1) CustomTableView { id: table_sel_inputs - width: parent.width - 28 - height: parent.height - 24 + width: parent.width - BSSizes.applyScale(28) + height: parent.height - BSSizes.applyScale(24) anchors.centerIn: parent model: txSignRequest !== null ? txSignRequest.inputs : [] @@ -115,20 +114,20 @@ ColumnLayout { Rectangle { id: outputs_rect - Layout.rightMargin: 22 + Layout.rightMargin: BSSizes.applyScale(22) Layout.alignment: Qt.AlignRight | Qt.AlingVCenter - width: 532 - height: 312 + width: BSSizes.applyScale(532) + height: BSSizes.applyScale(312) color: "#32394F" - radius: 14 + radius: BSSizes.applyScale(14) CustomTableView { id: table_outputs - width: parent.width - 28 - height: parent.height - 24 + width: parent.width - BSSizes.applyScale(28) + height: parent.height - BSSizes.applyScale(24) anchors.centerIn: parent model: txOutputsModel @@ -160,32 +159,32 @@ ColumnLayout { id: details_rect Layout.alignment: Qt.AlignHCenter | Qt.AlingTop - Layout.preferredHeight : 100 - Layout.topMargin: 20 + Layout.preferredHeight : BSSizes.applyScale(100) + Layout.topMargin: BSSizes.applyScale(20) - width: 1084 - height: 100 + width: BSSizes.applyScale(1084) + height: BSSizes.applyScale(100) color: "transparent" - radius: 14 + radius: BSSizes.applyScale(14) border.color: BSStyle.defaultBorderColor - border.width: 1 + border.width: BSSizes.applyScale(1) Label { id: in_amount_title anchors.top: parent.top - anchors.topMargin: 16 + anchors.topMargin: BSSizes.applyScale(16) anchors.left: parent.left - anchors.leftMargin: 16 + anchors.leftMargin: BSSizes.applyScale(16) text: qsTr("Input amount:") color: "#7A88B0" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -195,15 +194,15 @@ ColumnLayout { id: in_amount anchors.top: parent.top - anchors.topMargin: 16 + anchors.topMargin: BSSizes.applyScale(16) anchors.right: parent.horizontalCenter - anchors.rightMargin: 24 + anchors.rightMargin: BSSizes.applyScale(24) text: txSignRequest !== null ? txSignRequest.inputAmount : "" color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -213,15 +212,15 @@ ColumnLayout { id: return_amount_title anchors.top: in_amount_title.bottom - anchors.topMargin: 10 + anchors.topMargin: BSSizes.applyScale(10) anchors.left: parent.left - anchors.leftMargin: 16 + anchors.leftMargin: BSSizes.applyScale(16) text: qsTr("Return amount:") color: "#7A88B0" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -231,15 +230,15 @@ ColumnLayout { id: return_amount anchors.top: in_amount.bottom - anchors.topMargin: 16 + anchors.topMargin: BSSizes.applyScale(16) anchors.right: parent.horizontalCenter - anchors.rightMargin: 24 + anchors.rightMargin: BSSizes.applyScale(24) text: txSignRequest !== null ? txSignRequest.returnAmount : "" color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -249,15 +248,15 @@ ColumnLayout { id: transaction_fee_title anchors.top: return_amount_title.bottom - anchors.topMargin: 10 + anchors.topMargin: BSSizes.applyScale(10) anchors.left: parent.left - anchors.leftMargin: 16 + anchors.leftMargin: BSSizes.applyScale(16) text: qsTr("Transaction fee:") color: "#7A88B0" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -267,15 +266,15 @@ ColumnLayout { id: transaction_fee anchors.top: return_amount.bottom - anchors.topMargin: 16 + anchors.topMargin: BSSizes.applyScale(16) anchors.right: parent.horizontalCenter - anchors.rightMargin: 24 + anchors.rightMargin: BSSizes.applyScale(24) text: txSignRequest !== null ? txSignRequest.fee : "" color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -285,15 +284,15 @@ ColumnLayout { id: transaction_size_title anchors.top: parent.top - anchors.topMargin: 16 + anchors.topMargin: BSSizes.applyScale(16) anchors.left: parent.horizontalCenter - anchors.leftMargin: 24 + anchors.leftMargin: BSSizes.applyScale(24) text: qsTr("Transaction size:") color: "#7A88B0" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -303,15 +302,15 @@ ColumnLayout { id: transaction_size anchors.top: parent.top - anchors.topMargin: 16 + anchors.topMargin: BSSizes.applyScale(16) anchors.right: parent.right - anchors.rightMargin: 16 + anchors.rightMargin: BSSizes.applyScale(16) text: txSignRequest !== null ? txSignRequest.txSize : "" color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -321,15 +320,15 @@ ColumnLayout { id: fee_per_byte_title anchors.top: transaction_size_title.bottom - anchors.topMargin: 10 + anchors.topMargin: BSSizes.applyScale(10) anchors.left: parent.horizontalCenter - anchors.leftMargin: 24 + anchors.leftMargin: BSSizes.applyScale(24) text: qsTr("Fee-per-byte:") color: "#7A88B0" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -339,15 +338,15 @@ ColumnLayout { id: fee_per_byte anchors.top: transaction_size.bottom - anchors.topMargin: 10 + anchors.topMargin: BSSizes.applyScale(10) anchors.right: parent.right - anchors.rightMargin: 16 + anchors.rightMargin: BSSizes.applyScale(16) text: txSignRequest !== null ? txSignRequest.feePerByte : "" color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -357,15 +356,15 @@ ColumnLayout { id: total_spent_title anchors.top: fee_per_byte_title.bottom - anchors.topMargin: 10 + anchors.topMargin: BSSizes.applyScale(10) anchors.left: parent.horizontalCenter - anchors.leftMargin: 24 + anchors.leftMargin: BSSizes.applyScale(24) text: qsTr("Total spent:") color: "#7A88B0" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -375,15 +374,15 @@ ColumnLayout { id: total_spent anchors.top: fee_per_byte.bottom - anchors.topMargin: 10 + anchors.topMargin: BSSizes.applyScale(10) anchors.right: parent.right - anchors.rightMargin: 16 + anchors.rightMargin: BSSizes.applyScale(16) text: txSignRequest !== null ? txSignRequest.outputAmount : "" color: "#E2E7FF" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -393,9 +392,9 @@ ColumnLayout { id: password Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.topMargin: 10 + Layout.topMargin: BSSizes.applyScale(10) - width: 530 + width: BSSizes.applyScale(530) time_progress: layout.time_progress @@ -415,9 +414,9 @@ ColumnLayout { CustomButton { id: broadcast_but text: txSignRequest !== null ? (txSignRequest.hasError ? txSignRequest.errorText : qsTr("Broadcast")) : "" - width: 1084 + width: BSSizes.applyScale(1084) - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter enabled: txSignRequest !== null ? diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index a70a63ff1..43e14b400 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -16,8 +16,8 @@ ColumnLayout { signal sig_continue(signature: var) signal sig_advanced() - height: 554 - width: 600 + height: BSSizes.applyWindowHeightScale(554) + width: BSSizes.applyWindowWidthScale(600) spacing: 0 property var tempRequest: null @@ -25,17 +25,17 @@ ColumnLayout { RowLayout { Layout.fillWidth: true - Layout.preferredHeight : 34 + Layout.preferredHeight : BSSizes.applyScale(34) Label { Layout.fillWidth: true - Layout.preferredHeight : 34 + Layout.preferredHeight : BSSizes.applyScale(34) } CustomTitleLabel { id: title - Layout.rightMargin: 104 + Layout.rightMargin: BSSizes.applyScale(104) Layout.alignment: Qt.AlignRight | Qt.AlingVCenter text: qsTr("Send Bitcoin") @@ -44,12 +44,12 @@ ColumnLayout { Button { id: advanced_but - Layout.rightMargin: 60 + Layout.rightMargin: BSSizes.applyScale(60) Layout.alignment: Qt.AlignRight | Qt.AlingVCenter activeFocusOnTab: false - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal palette.buttonText: "#7A88B0" @@ -59,18 +59,18 @@ ColumnLayout { icon.color: "transparent" icon.source: "qrc:/images/advanced_icon.png" - icon.width: 16 - icon.height: 16 + icon.width: BSSizes.applyScale(16) + icon.height: BSSizes.applyScale(16) background: Rectangle { - implicitWidth: 116 - implicitHeight: 34 + implicitWidth: BSSizes.applyScale(116) + implicitHeight: BSSizes.applyScale(34) color: "transparent" - radius: 14 + radius: BSSizes.applyScale(14) border.color: BSStyle.defaultBorderColor - border.width: 1 + border.width: BSSizes.applyScale(1) } @@ -85,9 +85,9 @@ ColumnLayout { id: rec_addr_input Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 552 - Layout.topMargin: 23 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(552) + Layout.topMargin: BSSizes.applyScale(23) wallets_current_index: from_wallet_combo.currentIndex @@ -106,9 +106,9 @@ ColumnLayout { id: amount_input Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 552 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(552) + Layout.topMargin: BSSizes.applyScale(10) onEnterPressed: { continue_but.click_enter() @@ -121,17 +121,17 @@ ColumnLayout { RowLayout { Layout.fillWidth: true - Layout.preferredHeight : 70 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.topMargin: BSSizes.applyScale(10) WalletsComboBox { id: from_wallet_combo - Layout.leftMargin: 24 + Layout.leftMargin: BSSizes.applyScale(24) Layout.alignment: Qt.AlignLeft | Qt.AlingVCenter - width: 271 + width: BSSizes.applyScale(271) onActivated: (index_act) => { walletBalances.selectedWallet = currentIndex @@ -150,17 +150,17 @@ ColumnLayout { Label { Layout.fillWidth: true - Layout.preferredHeight: 70 + Layout.preferredHeight: BSSizes.applyScale(70) } FeeSuggestComboBox { id: fee_suggest_combo - Layout.rightMargin: 24 + Layout.rightMargin: BSSizes.applyScale(24) Layout.alignment: Qt.AlignRight | Qt.AlingVCenter - width: 271 + width: BSSizes.applyScale(271) } } @@ -169,9 +169,9 @@ ColumnLayout { id: comment_input Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 90 - Layout.preferredWidth: 552 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(90) + Layout.preferredWidth: BSSizes.applyScale(552) + Layout.topMargin: BSSizes.applyScale(10) //aliases title_text: qsTr("Comment") @@ -209,9 +209,9 @@ ColumnLayout { activeFocusOnTab: continue_but.enabled - width: 552 + width: BSSizes.applyScale(552) - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter text: bsApp.walletProperitesVM.isWatchingOnly ? qsTr("Export transaction") : qsTr("Continue") diff --git a/GUI/QtQuick/qml/Send/WalletsComboBox.qml b/GUI/QtQuick/qml/Send/WalletsComboBox.qml index c956f075f..85558710d 100644 --- a/GUI/QtQuick/qml/Send/WalletsComboBox.qml +++ b/GUI/QtQuick/qml/Send/WalletsComboBox.qml @@ -20,7 +20,7 @@ CustomComboBox { id: from_wallet_combo - height: 70 + height: BSSizes.applyScale(70) model: walletBalances currentIndex: walletBalances.selectedWallet diff --git a/GUI/QtQuick/qml/Settings/AddArmoryServer.qml b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml index 86d2f1e04..275cefe39 100644 --- a/GUI/QtQuick/qml/Settings/AddArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml @@ -13,8 +13,8 @@ ColumnLayout { property var armoryServersModel: ({}) signal sig_added() - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) spacing: 0 @@ -27,11 +27,11 @@ ColumnLayout { RowLayout { id: row - spacing: 12 + spacing: BSSizes.applyScale(12) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.topMargin: 24 - Layout.preferredHeight: 19 + Layout.topMargin: BSSizes.applyScale(24) + Layout.preferredHeight: BSSizes.applyScale(19) Label { Layout.fillWidth: true @@ -42,14 +42,14 @@ ColumnLayout { text: qsTr("Network type:") - Layout.leftMargin: 25 + Layout.leftMargin: BSSizes.applyScale(25) Layout.alignment: Qt.AlignVCenter - width: 126 - height: 19 + width: BSSizes.applyScale(126) + height: BSSizes.applyScale(19) color: "#E2E7FF" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Normal } @@ -61,8 +61,8 @@ ColumnLayout { text: "MainNet" - spacing: 6 - font.pixelSize: 13 + spacing: BSSizes.applyScale(6) + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal @@ -76,8 +76,8 @@ ColumnLayout { text: "TestNet" - spacing: 6 - font.pixelSize: 13 + spacing: BSSizes.applyScale(6) + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal @@ -93,9 +93,9 @@ ColumnLayout { id: name_text_input Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) title_text: qsTr("Name") @@ -106,9 +106,9 @@ ColumnLayout { id: ip_dns_text_input Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) title_text: qsTr("IP/DNS") @@ -119,9 +119,9 @@ ColumnLayout { id: port_text_input Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) title_text: qsTr("Port") @@ -134,9 +134,9 @@ ColumnLayout { id: db_key_text_input Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) title_text: qsTr("DB Key (optional)") @@ -148,9 +148,9 @@ ColumnLayout { text: qsTr("Save") Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - height : 70 - width: 532 - Layout.topMargin: 10 + height : BSSizes.applyScale(70) + width: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) enabled: (name_text_input.input_text !== "") && (ip_dns_text_input.input_text !== "") diff --git a/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml b/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml index d1e924793..d20e4483f 100644 --- a/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml @@ -18,8 +18,8 @@ ColumnLayout { signal sig_back() signal sig_delete() - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) spacing: 0 CustomTitleLabel { @@ -33,27 +33,27 @@ ColumnLayout { id: wallet_icon Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.topMargin: 24 - Layout.preferredHeight : 120 - Layout.preferredWidth : 120 + Layout.topMargin: BSSizes.applyScale(24) + Layout.preferredHeight : BSSizes.applyScale(120) + Layout.preferredWidth : BSSizes.applyScale(120) source: "qrc:/images/delete_custom_server.svg" - width: 120 - height: 120 + width: BSSizes.applyScale(120) + height: BSSizes.applyScale(120) } Label { id: description Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.topMargin: 16 - Layout.preferredHeight : 16 + Layout.topMargin: BSSizes.applyScale(16) + Layout.preferredHeight : BSSizes.applyScale(16) text: qsTr("Are you sure you want to delete the \"%1\" server?").arg(server_index) .arg(armoryServersModel.data(armoryServersModel.index(server_index, 0), ArmoryServersModel.NameRole)) color: BSStyle.titanWhiteColor - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -65,15 +65,15 @@ ColumnLayout { RowLayout { id: row - spacing: 11 + spacing: BSSizes.applyScale(11) - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter CustomButton { id: back_but text: qsTr("No, back") - width: 262 + width: BSSizes.applyScale(262) preferred: false function click_enter() { @@ -84,7 +84,7 @@ ColumnLayout { CustomButton { id: delete_but text: qsTr("Yes, delete") - width: 262 + width: BSSizes.applyScale(262) preferred: true function click_enter() { diff --git a/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml b/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml index 52b50c077..9f801feb4 100644 --- a/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml @@ -15,8 +15,8 @@ ColumnLayout { property var armoryServersModel: ({}) property int server_index - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) spacing: 0 @@ -29,11 +29,11 @@ ColumnLayout { RowLayout { id: row - spacing: 12 + spacing: BSSizes.applyScale(12) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.topMargin: 24 - Layout.preferredHeight: 19 + Layout.topMargin: BSSizes.applyScale(24) + Layout.preferredHeight: BSSizes.applyScale(19) Label { Layout.fillWidth: true @@ -44,14 +44,14 @@ ColumnLayout { text: qsTr("Network type:") - Layout.leftMargin: 25 + Layout.leftMargin: BSSizes.applyScale(25) Layout.alignment: Qt.AlignVCenter - width: 126 - height: 19 + width: BSSizes.applyScale(126) + height: BSSizes.applyScale(19) color: "#E2E7FF" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Normal } @@ -63,8 +63,8 @@ ColumnLayout { text: "MainNet" - spacing: 6 - font.pixelSize: 13 + spacing: BSSizes.applyScale(6) + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal @@ -84,8 +84,8 @@ ColumnLayout { text: "TestNet" - spacing: 6 - font.pixelSize: 13 + spacing: BSSizes.applyScale(6) + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal @@ -107,9 +107,9 @@ ColumnLayout { id: name_text_input Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) title_text: qsTr("Name") @@ -123,9 +123,9 @@ ColumnLayout { id: ip_dns_text_input Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) title_text: qsTr("IP/DNS") @@ -139,9 +139,9 @@ ColumnLayout { id: port_text_input Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) title_text: qsTr("Port") @@ -157,9 +157,9 @@ ColumnLayout { id: db_key_text_input Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) title_text: qsTr("DB Key (optional)") diff --git a/GUI/QtQuick/qml/Settings/SettingsAbout.qml b/GUI/QtQuick/qml/Settings/SettingsAbout.qml index cf1bc2b84..3b7b0c8c9 100644 --- a/GUI/QtQuick/qml/Settings/SettingsAbout.qml +++ b/GUI/QtQuick/qml/Settings/SettingsAbout.qml @@ -22,7 +22,7 @@ ColumnLayout { id: about_terminal Layout.alignment: Qt.AlignCenter - Layout.topMargin: 10 + Layout.topMargin: BSSizes.applyScale(10) //aliases icon_source: "qrc:/images/about_terminal.svg" @@ -37,7 +37,7 @@ ColumnLayout { id: about_hello Layout.alignment: Qt.AlignCenter - Layout.topMargin: 10 + Layout.topMargin: BSSizes.applyScale(10) //aliases icon_source: "qrc:/images/about_hello.svg" @@ -52,7 +52,7 @@ ColumnLayout { id: about_twitter Layout.alignment: Qt.AlignCenter - Layout.topMargin: 10 + Layout.topMargin: BSSizes.applyScale(10) //aliases icon_source: "qrc:/images/about_twitter.svg" @@ -67,7 +67,7 @@ ColumnLayout { id: about_telegram Layout.alignment: Qt.AlignCenter - Layout.topMargin: 10 + Layout.topMargin: BSSizes.applyScale(10) //aliases icon_source: "qrc:/images/about_telegram.svg" @@ -82,7 +82,7 @@ ColumnLayout { id: add_github Layout.alignment: Qt.AlignCenter - Layout.topMargin: 10 + Layout.topMargin: BSSizes.applyScale(10) //aliases icon_source: "qrc:/images/about_github.svg" @@ -101,7 +101,7 @@ ColumnLayout { CustomLabel { id: version - Layout.bottomMargin: 20 + Layout.bottomMargin: BSSizes.applyScale(20) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter text: qsTr("version 1.000.244.999") diff --git a/GUI/QtQuick/qml/Settings/SettingsGeneral.qml b/GUI/QtQuick/qml/Settings/SettingsGeneral.qml index 8cbe1d15a..d03ef8a6e 100644 --- a/GUI/QtQuick/qml/Settings/SettingsGeneral.qml +++ b/GUI/QtQuick/qml/Settings/SettingsGeneral.qml @@ -10,8 +10,8 @@ ColumnLayout { id: layout - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) spacing: 0 @@ -28,13 +28,13 @@ ColumnLayout { id: log_file Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 24 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(24) - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + input_topMargin: BSSizes.applyScale(35) + title_leftMargin: BSSizes.applyScale(16) + title_topMargin: BSSizes.applyScale(16) title_text: qsTr("Log file") @@ -47,13 +47,13 @@ ColumnLayout { id: messages_log_file Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + input_topMargin: BSSizes.applyScale(35) + title_leftMargin: BSSizes.applyScale(16) + title_topMargin: BSSizes.applyScale(16) title_text: qsTr("Messages log file") @@ -66,13 +66,13 @@ ColumnLayout { id: checkbox_advanced_tx Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft - Layout.topMargin: 24 - Layout.leftMargin: 24 + Layout.topMargin: BSSizes.applyScale(24) + Layout.leftMargin: BSSizes.applyScale(24) text: qsTr("Advanced TX dialog by default") - spacing: 6 - font.pixelSize: 13 + spacing: BSSizes.applyScale(6) + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal diff --git a/GUI/QtQuick/qml/Settings/SettingsMenu.qml b/GUI/QtQuick/qml/Settings/SettingsMenu.qml index c5c4dda14..1df3e9113 100644 --- a/GUI/QtQuick/qml/Settings/SettingsMenu.qml +++ b/GUI/QtQuick/qml/Settings/SettingsMenu.qml @@ -14,8 +14,8 @@ ColumnLayout { signal sig_network() signal sig_about() - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) spacing: 0 @@ -32,7 +32,7 @@ ColumnLayout { id: general_item Layout.alignment: Qt.AlignCenter - Layout.topMargin: 24 + Layout.topMargin: BSSizes.applyScale(24) //aliases icon_source: "qrc:/images/general.png" @@ -46,7 +46,7 @@ ColumnLayout { id: network_item Layout.alignment: Qt.AlignCenter - Layout.topMargin: 10 + Layout.topMargin: BSSizes.applyScale(10) //aliases icon_source: "qrc:/images/network.png" @@ -60,7 +60,7 @@ ColumnLayout { id: about_item Layout.alignment: Qt.AlignCenter - Layout.topMargin: 10 + Layout.topMargin: BSSizes.applyScale(10) //aliases icon_source: "qrc:/images/about.png" diff --git a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml index 2eb09a39f..c055f8d09 100644 --- a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml +++ b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml @@ -17,8 +17,8 @@ ColumnLayout { signal sig_modify_custom(int ind) signal request_close() - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) spacing: 0 @@ -35,10 +35,11 @@ ColumnLayout { id: list Layout.fillWidth: true - Layout.leftMargin: 24 - Layout.topMargin: 24 + Layout.minimumHeight: BSSizes.applyScale(50) * armoryServersModel.rowCount + BSSizes.applyScale(10) * (armoryServersModel.rowCount - 1) + Layout.leftMargin: BSSizes.applyScale(24) + Layout.topMargin: BSSizes.applyScale(24) - spacing: 10 + spacing: BSSizes.applyScale(10) clip: true boundsBehavior: Flickable.StopAtBounds @@ -89,8 +90,7 @@ ColumnLayout { target:armoryServersModel function onRowCountChanged () { - var new_height = Math.min(armoryServersModel.rowCount * 50 + (armoryServersModel.rowCount - 1) * 10, - 425) + var new_height = Math.min(armoryServersModel.rowCount * 50 + (armoryServersModel.rowCount - 1) * 10, 425) list.implicitHeight = new_height } } @@ -100,7 +100,7 @@ ColumnLayout { id: add_custom_server Layout.alignment: Qt.AlignCenter - Layout.topMargin: 10 + Layout.topMargin: BSSizes.applyScale(10) //aliases icon_source: "qrc:/images/plus.svg" diff --git a/GUI/QtQuick/qml/StyledControls/CloseIconButton.qml b/GUI/QtQuick/qml/StyledControls/CloseIconButton.qml index cd8a20435..d1c757a37 100644 --- a/GUI/QtQuick/qml/StyledControls/CloseIconButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CloseIconButton.qml @@ -9,8 +9,8 @@ Image { signal close(); - width: 16 - height: 16 + width: BSSizes.applyScale(16) + height: BSSizes.applyScale(16) source: "qrc:/images/close_button.svg" MouseArea { diff --git a/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml b/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml index 0c098a66a..ed64c092b 100644 --- a/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CopyIconButton.qml @@ -9,8 +9,8 @@ Image { signal copy(); - width: 24 - height: 24 + width: BSSizes.applyScale(24) + height: BSSizes.applyScale(24) anchors.verticalCenter: parent.verticalCenter source: "qrc:/images/copy_icon.svg" MouseArea { @@ -19,7 +19,7 @@ Image { id: tool_tip timeout: 1000 text: qsTr("Copied") - font.pixelSize: 10 + font.pixelSize: BSSizes.applyScale(10) font.family: "Roboto" font.weight: Font.Normal contentItem: Text { @@ -30,8 +30,8 @@ Image { background: Rectangle { color: BSStyle.buttonsStandardColor border.color: BSStyle.buttonsStandardColor - border.width: 1 - radius: 14 + border.width: BSSizes.applyScale(1) + radius: BSSizes.applyScale(14) } } onClicked: { diff --git a/GUI/QtQuick/qml/StyledControls/CustomButton.qml b/GUI/QtQuick/qml/StyledControls/CustomButton.qml index 28dc20881..fa5a33c85 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButton.qml @@ -16,7 +16,7 @@ Button { id: control - height: 50 + height: BSSizes.applyScale(50) property bool preferred: false @@ -25,7 +25,7 @@ Button { activeFocusOnTab: control.enabled - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Bold palette.buttonText: enabled ? BSStyle.buttonsTextColor : BSStyle.buttonsDisabledTextColor @@ -33,8 +33,8 @@ Button { icon.color: "transparent" - icon.width: 24 - icon.height: 24 + icon.width: BSSizes.applyScale(24) + icon.height: BSSizes.applyScale(24) background: Rectangle { @@ -50,7 +50,7 @@ Button { (control.down ? BSStyle.buttonsStandardPressedColor : (control.hovered ? BSStyle.buttonsStandardHoveredColor : BSStyle.buttonsStandardColor))) - radius: 14 + radius: BSSizes.applyScale(14) border.color: preferred ? BSStyle.buttonsPreferredBorderColor : BSStyle.buttonsStandardBorderColor border.width: control.activeFocus? 1 : 0 diff --git a/GUI/QtQuick/qml/StyledControls/CustomButtonBar.qml b/GUI/QtQuick/qml/StyledControls/CustomButtonBar.qml index 763b98c91..f51f6dc72 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButtonBar.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButtonBar.qml @@ -16,5 +16,5 @@ import "../BsStyles" Rectangle { width: parent.width color:"#55000000" - height: 45 + height: BSSizes.applyScale(45) } diff --git a/GUI/QtQuick/qml/StyledControls/CustomButtonLeftIcon.qml b/GUI/QtQuick/qml/StyledControls/CustomButtonLeftIcon.qml index d46cf7d6c..46f5c7303 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButtonLeftIcon.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButtonLeftIcon.qml @@ -20,10 +20,10 @@ CustomSmallButton { Image { id: icon_item - width: 10 - height: 10 + width: BSSizes.applyScale(10) + height: BSSizes.applyScale(10) anchors.left: parent.left - anchors.leftMargin: 14 + anchors.leftMargin: BSSizes.applyScale(14) anchors.verticalCenter: parent.verticalCenter } @@ -33,6 +33,6 @@ CustomSmallButton { color: BSStyle.titleTextColor verticalAlignment: Text.AlignVCenter - leftPadding: icon_item.width + 10 + leftPadding: icon_item.width + BSSizes.applyScale(10) } } \ No newline at end of file diff --git a/GUI/QtQuick/qml/StyledControls/CustomButtonRightIcon.qml b/GUI/QtQuick/qml/StyledControls/CustomButtonRightIcon.qml index 08cb7e9e2..a091e94a8 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomButtonRightIcon.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomButtonRightIcon.qml @@ -19,7 +19,7 @@ CustomSmallButton { Image { id: icon_item anchors.right: parent.right - anchors.rightMargin: 14 + anchors.rightMargin: BSSizes.applyScale(14) anchors.verticalCenter: parent.verticalCenter } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomCheckBox.qml b/GUI/QtQuick/qml/StyledControls/CustomCheckBox.qml index 4e65ba731..cc9d20c6b 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomCheckBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomCheckBox.qml @@ -20,11 +20,11 @@ CheckBox { spacing: 0 indicator: Rectangle { - implicitWidth: 18 - implicitHeight: 18 + implicitWidth: BSSizes.applyScale(18) + implicitHeight: BSSizes.applyScale(18) x: control.leftPadding y: parent.height / 2 - height / 2 - radius: 6 + radius: BSSizes.applyScale(6) border.color: "#416485" color: "transparent" @@ -33,10 +33,10 @@ CheckBox { anchors.centerIn: parent - width: 10 - height: 7 - sourceSize.width: 10 - sourceSize.height: 7 + width: BSSizes.applyScale(10) + height: BSSizes.applyScale(7) + sourceSize.width: BSSizes.applyScale(10) + sourceSize.height: BSSizes.applyScale(7) visible: control.checked source: "qrc:/images/check.svg" diff --git a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml index 8de36902f..1e7a3052c 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml @@ -19,7 +19,7 @@ ComboBox { property alias title_text: title.text property alias details_text: details.text - property int fontSize: 16 + property int fontSize: BSSizes.applyScale(16) property color fontColor: "#FFFFFF" property alias input_accept_input: input.acceptableInput @@ -31,10 +31,10 @@ ComboBox { activeFocusOnTab: true focusPolicy: Qt.TabFocus - leftPadding: 16 - rightPadding: 36 - topPadding: 16 - bottomPadding: 16 + leftPadding: BSSizes.applyScale(16) + rightPadding: BSSizes.applyScale(36) + topPadding: BSSizes.applyScale(16) + bottomPadding: BSSizes.applyScale(16) contentItem: Rectangle { @@ -51,7 +51,7 @@ ComboBox { anchors.left: parent.left anchors.leftMargin: 0 - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal @@ -62,11 +62,11 @@ ComboBox { id: details anchors.bottom: parent.bottom - anchors.bottomMargin: 1 + anchors.bottomMargin: BSSizes.applyScale(1) anchors.right: parent.right anchors.rightMargin: 0 - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal @@ -83,8 +83,8 @@ ComboBox { anchors.left: parent.left anchors.leftMargin: 0 - width: details.text.length ? parent.width - details.width - 16 : parent.width - height: 19 + width: details.text.length ? parent.width - details.width - BSSizes.applyScale(16) : parent.width + height: BSSizes.applyScale(19) font.pixelSize: control.fontSize font.family: "Roboto" @@ -112,10 +112,10 @@ ComboBox { id: canvas - x: control.width - width - 17 + x: control.width - width - BSSizes.applyScale(17) y: control.topPadding + (control.availableHeight - height) / 2 - width: 9 - height: 6 + width: BSSizes.applyScale(9) + height: BSSizes.applyScale(6) contextType: "2d" @@ -144,7 +144,7 @@ ComboBox { color: "#020817" opacity: 1 - radius: 14 + radius: BSSizes.applyScale(14) border.color: control.popup.visible ? BSStyle.comboBoxPopupedBorderColor : (control.hovered ? BSStyle.comboBoxHoveredBorderColor : @@ -159,12 +159,12 @@ ComboBox { id: menuItem - width: control.width - 12 - height: 27 + width: control.width - BSSizes.applyScale(12) + height: BSSizes.applyScale(27) - leftPadding: 6 - topPadding: 4 - bottomPadding: 4 + leftPadding: BSSizes.applyScale(6) + topPadding: BSSizes.applyScale(4) + bottomPadding: BSSizes.applyScale(4) contentItem: Text { @@ -186,16 +186,16 @@ ComboBox { background: Rectangle { color: menuItem.highlighted ? BSStyle.comboBoxItemHighlightedColor : "transparent" opacity: menuItem.highlighted ? 0.2 : 1 - radius: 14 + radius: BSSizes.applyScale(14) } } popup: Popup { id: _popup - y: control.height - 1 + y: control.height - BSSizes.applyScale(1) width: control.width - padding: 6 + padding: BSSizes.applyScale(6) contentItem: ListView { id: popup_item @@ -211,7 +211,7 @@ ComboBox { background: Rectangle { color: "#FFFFFF" - radius: 14 + radius: BSSizes.applyScale(14) } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomCompleterPopup.qml b/GUI/QtQuick/qml/StyledControls/CustomCompleterPopup.qml index 1fd440e4a..ba7979147 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomCompleterPopup.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomCompleterPopup.qml @@ -40,19 +40,19 @@ Popup { id: delega - width: _popup.width - 12 - height: 27 + width: _popup.width - BSSizes.applyScale(12) + height: BSSizes.applyScale(27) - leftPadding: 6 - topPadding: 4 - bottomPadding: 4 + leftPadding: BSSizes.applyScale(6) + topPadding: BSSizes.applyScale(4) + bottomPadding: BSSizes.applyScale(4) contentItem: Text { text: comp_vars[index] color: delega.highlighted ? BSStyle.comboBoxItemTextHighlightedColor : BSStyle.comboBoxItemTextColor - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Normal @@ -65,7 +65,7 @@ Popup { background: Rectangle { color: delega.highlighted ? BSStyle.comboBoxItemHighlightedColor : "transparent" opacity: delega.highlighted ? 0.2 : 1 - radius: 14 + radius: BSSizes.applyScale(14) } MouseArea { @@ -85,7 +85,7 @@ Popup { background: Rectangle { color: "#FFFFFF" - radius: 14 + radius: BSSizes.applyScale(14) } function current_increment () diff --git a/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml b/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml index af7785c3f..e966694c0 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml @@ -16,15 +16,15 @@ import "../BsStyles" Menu { id: menu - leftPadding: 6 - topPadding: 4 - bottomPadding: 4 - rightPadding: 6 + leftPadding: BSSizes.applyScale(6) + topPadding: BSSizes.applyScale(4) + bottomPadding: BSSizes.applyScale(4) + rightPadding: BSSizes.applyScale(6) delegate: MenuItem { id: menuItem - implicitWidth: 200 - implicitHeight: 40 + implicitWidth: BSSizes.applyScale(200) + implicitHeight: BSSizes.applyScale(40) contentItem: Text { leftPadding: menuItem.indicator.width @@ -32,7 +32,7 @@ Menu { text: menuItem.text - font.pixelSize: 12 + font.pixelSize: BSSizes.applyScale(12) font.family: "Roboto" font.weight: Font.Normal @@ -44,22 +44,22 @@ Menu { } background: Rectangle { - implicitWidth: 200 - implicitHeight: 40 + implicitWidth: BSSizes.applyScale(200) + implicitHeight: BSSizes.applyScale(40) - radius: 14 + radius: BSSizes.applyScale(14) color: menuItem.highlighted ? BSStyle.menuItemHoveredColor : BSStyle.menuItemColor } } background: Rectangle { - implicitWidth: 200 - implicitHeight: 40 + implicitWidth: BSSizes.applyScale(200) + implicitHeight: BSSizes.applyScale(40) color: BSStyle.popupBackgroundColor opacity: 1 - radius: 14 + radius: BSSizes.applyScale(14) border.color : BSStyle.defaultBorderColor - border.width : 1 + border.width : BSSizes.applyScale(1) } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomDialog.qml index 9995b302e..d938f82e6 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomDialog.qml @@ -273,8 +273,8 @@ CustomDialogWindow { anchors.centerIn: parent running: false - height: 50 - width: 50 + height: BSSizes.applyScale(50) + width: BSSizes.applyScale(50) } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomExportSuccessDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomExportSuccessDialog.qml index 80b0ac441..60444abd3 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomExportSuccessDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomExportSuccessDialog.qml @@ -16,25 +16,25 @@ Window { flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog modality: Qt.WindowModal - height: 400 - width: 580 + height: BSSizes.applyScale(400) + width: BSSizes.applyScale(580) color: "transparent" - x: mainWindow.x + (mainWindow.width - width)/2 - y: mainWindow.y + (mainWindow.height - height)/2 + x: mainWindow.x + (mainWindow.width - width) / 2 + y: mainWindow.y + (mainWindow.height - height) / 2 Rectangle { id: rect color: "#191E2A" opacity: 1 - radius: 16 + radius: BSSizes.applyScale(16) anchors.fill: parent border.color : BSStyle.defaultBorderColor - border.width : 1 + border.width : BSSizes.applyScale(1) ColumnLayout { id: layout @@ -43,7 +43,7 @@ Window { CustomTitleLabel { id: title - Layout.topMargin: 36 + Layout.topMargin: BSSizes.applyScale(36) Layout.alignment: Qt.AlignCenter Layout.preferredHeight : title.height text: qsTr("Success") @@ -53,28 +53,28 @@ Window { Image { id: wallet_icon - Layout.topMargin: 5 + Layout.topMargin: BSSizes.applyScale(5) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.preferredHeight : 120 - Layout.preferredWidth : 120 + Layout.preferredHeight : BSSizes.applyScale(120) + Layout.preferredWidth : BSSizes.applyScale(120) source: "qrc:/images/success.png" - width: 120 - height: 120 + width: BSSizes.applyScale(120) + height: BSSizes.applyScale(120) } Label { id: export_type - Layout.leftMargin: 24 - Layout.rightMargin: 24 - Layout.topMargin: 8 - Layout.preferredHeight: 16 + Layout.leftMargin: BSSizes.applyScale(24) + Layout.rightMargin: BSSizes.applyScale(24) + Layout.topMargin: BSSizes.applyScale(8) + Layout.preferredHeight: BSSizes.applyScale(16) Layout.fillWidth: true Layout.alignment: Qt.AlignLeft | Qt.AlingTop - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal @@ -86,14 +86,14 @@ Window { id: file_path - Layout.leftMargin: 24 - Layout.rightMargin: 24 - Layout.topMargin: 4 - Layout.preferredHeight: 16 + Layout.leftMargin: BSSizes.applyScale(24) + Layout.rightMargin: BSSizes.applyScale(24) + Layout.topMargin: BSSizes.applyScale(4) + Layout.preferredHeight: BSSizes.applyScale(16) Layout.fillWidth: true Layout.alignment: Qt.AlignHCenter | Qt.AlingTop - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal @@ -104,9 +104,9 @@ Window { CustomButton { id: finish_but - width: 532 + width: BSSizes.applyScale(532) - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter text: qsTr("Finish") diff --git a/GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml index c827a6fea..a0a15df36 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomFailDialog.qml @@ -15,8 +15,8 @@ Window { flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog modality: Qt.WindowModal - height: 375 - width: 380 + height: BSSizes.applyScale(375) + width: BSSizes.applyScale(380) color: "transparent" @@ -28,24 +28,24 @@ Window { color: "#191E2A" opacity: 1 - radius: 16 + radius: BSSizes.applyScale(16) anchors.fill: parent border.color : BSStyle.defaultBorderColor - border.width : 1 + border.width : BSSizes.applyScale(1) Image { id: close_button anchors.top: parent.top - anchors.topMargin: 20 + anchors.topMargin: BSSizes.applyScale(20) anchors.right: parent.right - anchors.rightMargin: 22 + anchors.rightMargin: BSSizes.applyScale(22) source: "qrc:/images/close_button.svg" - width: 16 - height: 16 + width: BSSizes.applyScale(16) + height: BSSizes.applyScale(16) MouseArea { anchors.fill: parent onClicked: { @@ -60,7 +60,7 @@ Window { anchors.fill: parent CustomTitleLabel { - Layout.topMargin: 36 + Layout.topMargin: BSSizes.applyScale(36) id: title Layout.alignment: Qt.AlignCenter Layout.preferredHeight : title.height @@ -69,24 +69,24 @@ Window { Image { - Layout.topMargin: 24 + Layout.topMargin: BSSizes.applyScale(24) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.preferredHeight : 120 - Layout.preferredWidth : 120 + Layout.preferredHeight : BSSizes.applyScale(120) + Layout.preferredWidth : BSSizes.applyScale(120) source: "qrc:/images/try_icon.png" - width: 120 - height: 120 + width: BSSizes.applyScale(120) + height: BSSizes.applyScale(120) } Label { id: details - Layout.topMargin: 16 + Layout.topMargin: BSSizes.applyScale(16) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter text: qsTr("The password you entered is incorrect") - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal color: "#E2E7FF" @@ -101,9 +101,9 @@ Window { id: finish_but text: qsTr("Try again") - width: 186 + width: BSSizes.applyScale(186) - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter preferred: true diff --git a/GUI/QtQuick/qml/StyledControls/CustomHeader.qml b/GUI/QtQuick/qml/StyledControls/CustomHeader.qml index c4550677c..5279b1146 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomHeader.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomHeader.qml @@ -26,7 +26,7 @@ Button { font.family: "Roboto" font.capitalization: Font.AllUppercase color: { parent.enabled ? textColor : BSStyle.disabledHeaderColor } - font.pixelSize: 11 + font.pixelSize: BSSizes.applyScale(11) } Rectangle { diff --git a/GUI/QtQuick/qml/StyledControls/CustomHeaderPanel.qml b/GUI/QtQuick/qml/StyledControls/CustomHeaderPanel.qml index 21c9b1b98..0c0d02927 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomHeaderPanel.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomHeaderPanel.qml @@ -17,7 +17,7 @@ Rectangle { property string text clip: true color: "transparent" - height: 40 + height: BSSizes.applyScale(40) Rectangle { // visible: qmlTitleVisible @@ -30,13 +30,13 @@ Rectangle { // visible: qmlTitleVisible // height: qmlTitleVisible ? 40 : 0 anchors.fill: parent - leftPadding: 10 - rightPadding: 10 + leftPadding: BSSizes.applyScale(10) + rightPadding: BSSizes.applyScale(10) text: parent.text font.capitalization: Font.AllUppercase color: BSStyle.textColor - font.pixelSize: 11 + font.pixelSize: BSSizes.applyScale(11) font.family: "Roboto" verticalAlignment: Text.AlignVCenter } diff --git a/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml b/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml index 7de7addd6..afe8e4634 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomHorizontalHeaderView.qml @@ -9,8 +9,8 @@ HorizontalHeaderView { delegate: Rectangle { - implicitHeight: 34 - implicitWidth: 100 + implicitHeight: BSSizes.applyScale(34) + implicitWidth: BSSizes.applyScale(100) color: BSStyle.tableCellBackgroundColor Text { @@ -22,11 +22,11 @@ HorizontalHeaderView { font.family: "Roboto" font.pixelSize: root.text_size font.letterSpacing: -0.2 - leftPadding: 10 + leftPadding: BSSizes.applyScale(10) } Rectangle { - height: 1 + height: BSSizes.applyScale(1) width: parent.width color: BSStyle.tableSeparatorColor diff --git a/GUI/QtQuick/qml/StyledControls/CustomLabel.qml b/GUI/QtQuick/qml/StyledControls/CustomLabel.qml index 1e18f5dd9..07c26f3db 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomLabel.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomLabel.qml @@ -14,11 +14,11 @@ import "../BsStyles" Label { horizontalAlignment: Text.AlignHLeft - font.pixelSize: 11 + font.pixelSize: BSSizes.applyScale(11) font.family: "Roboto" color: { enabled ? BSStyle.labelsTextColor : BSStyle.disabledColor } wrapMode: Text.WordWrap - topPadding: 5 - bottomPadding: 5 + topPadding: BSSizes.applyScale(5) + bottomPadding: BSSizes.applyScale(5) } diff --git a/GUI/QtQuick/qml/StyledControls/CustomLabelCopyableValue.qml b/GUI/QtQuick/qml/StyledControls/CustomLabelCopyableValue.qml index 5d2b80773..1784bc0cc 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomLabelCopyableValue.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomLabelCopyableValue.qml @@ -21,11 +21,11 @@ Label { property alias mouseArea: mouseArea property string textForCopy - font.pixelSize: 11 + font.pixelSize: BSSizes.applyScale(11) font.family: "Roboto" color: "white" wrapMode: Text.WordWrap - padding: 5 + padding: BSSizes.applyScale(5) onLinkActivated: Qt.openUrlExternally(link) MouseArea { diff --git a/GUI/QtQuick/qml/StyledControls/CustomLabelValue.qml b/GUI/QtQuick/qml/StyledControls/CustomLabelValue.qml index 1f3984d66..e7aa9634c 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomLabelValue.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomLabelValue.qml @@ -13,11 +13,11 @@ import QtQuick.Controls 2.3 import "../BsStyles" Label { - font.pixelSize: 11 + font.pixelSize: BSSizes.applyScale(11) font.family: "Roboto" color: "white" wrapMode: Text.WordWrap - topPadding: 5 - bottomPadding: 5 + topPadding: BSSizes.applyScale(5) + bottomPadding: BSSizes.applyScale(5) onLinkActivated: Qt.openUrlExternally(link) } diff --git a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml index 17b1d27b9..f7bd13a09 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml @@ -28,27 +28,27 @@ Rectangle { signal clicked_add() signal clicked() - width: 532 - height: 50 + width: BSSizes.applyScale(532) + height: BSSizes.applyScale(50) color: "transparent" opacity: 1 - radius: 14 + radius: BSSizes.applyScale(14) border.color: mouseArea.containsMouse ? BSStyle.listItemHoveredBorderColor : BSStyle.listItemBorderColor - border.width: 1 + border.width: BSSizes.applyScale(1) Image { id: icon anchors.verticalCenter: parent.verticalCenter anchors.left: rect.left - anchors.leftMargin: 16 + anchors.leftMargin: BSSizes.applyScale(16) - width: 24 - height: 24 - sourceSize.width: 24 - sourceSize.height: 24 + width: BSSizes.applyScale(24) + height: BSSizes.applyScale(24) + sourceSize.width: BSSizes.applyScale(24) + sourceSize.height: BSSizes.applyScale(24) } Label { @@ -56,11 +56,11 @@ Rectangle { anchors.verticalCenter: parent.verticalCenter anchors.left: icon.right - anchors.leftMargin: 8 + anchors.leftMargin: BSSizes.applyScale(8) horizontalAlignment : Text.AlignLeft - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Normal @@ -74,13 +74,13 @@ Rectangle { anchors.verticalCenter: parent.verticalCenter anchors.right: rect.right - anchors.rightMargin: 13 + anchors.rightMargin: BSSizes.applyScale(13) z: 0 - width: 24 - height: 24 - sourceSize.width: 24 - sourceSize.height: 24 + width: BSSizes.applyScale(24) + height: BSSizes.applyScale(24) + sourceSize.width: BSSizes.applyScale(24) + sourceSize.height: BSSizes.applyScale(24) MouseArea { anchors.fill: parent diff --git a/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml b/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml index d0ca71863..4a3a77055 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListRadioButton.qml @@ -31,13 +31,13 @@ CustomListItem { anchors.verticalCenter: root.verticalCenter anchors.left: root.left - anchors.leftMargin: 21 + anchors.leftMargin: BSSizes.applyScale(21) leftPadding: 0 spacing: 0 - width: 15 - height: 15 + width: BSSizes.applyScale(15) + height: BSSizes.applyScale(15) onClicked : root.sig_radio_clicked() } diff --git a/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml b/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml index 32595c756..985ca5041 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMediumButton.qml @@ -17,14 +17,14 @@ Button { id: control property color background_color: BSStyle.buttonsDisabledColor - property int background_radius: 14 + property int background_radius: BSSizes.applyScale(14) - width: 136 - height: 36 + width: BSSizes.applyScale(136) + height: BSSizes.applyScale(36) hoverEnabled: true focusPolicy: Qt.TabFocus - font.pixelSize: 12 + font.pixelSize: BSSizes.applyScale(12) font.family: "Roboto" font.weight: Font.Normal font.letterSpacing: 0.3 diff --git a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml index 43d8ccfbf..99c1a21aa 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml @@ -14,41 +14,41 @@ Window { flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog modality: Qt.WindowModal - maximumHeight: 200 - maximumWidth: 300 + maximumHeight: BSSizes.applyScale(200) + maximumWidth: BSSizes.applyScale(300) - minimumHeight: 200 - minimumWidth: 300 + minimumHeight: BSSizes.applyScale(200) + minimumWidth: BSSizes.applyScale(300) - height: 250 - width: 300 + height: BSSizes.applyScale(250) + width: BSSizes.applyScale(300) color: "transparent" - x: mainWindow.x + (mainWindow.width - width)/2 - y: mainWindow.y + (mainWindow.height - height)/2 + x: mainWindow.x + (mainWindow.width - width) / 2 + y: mainWindow.y + (mainWindow.height - height) / 2 Rectangle { id: rect color: "#191E2A" opacity: 1 - radius: 16 + radius: BSSizes.applyScale(16) anchors.fill: parent border.color : BSStyle.defaultBorderColor - border.width : 1 + border.width : BSSizes.applyScale(1) Label { id: tytleLabel anchors.top: rect.top - anchors.topMargin: 16 + anchors.topMargin: BSSizes.applyScale(16) anchors.horizontalCenter: rect.horizontalCenter color: "#E2E7FF" - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Medium @@ -61,18 +61,18 @@ Window { id: errorLabel anchors.top: tytleLabel.bottom - anchors.topMargin: 20 + anchors.topMargin: BSSizes.applyScale(20) anchors.horizontalCenter: rect.horizontalCenter color: "#E2E7FF" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Medium text: "Test Description" horizontalAlignment: Text.AlignHCenter - width: ApplicationWindow.width - 10; + width: ApplicationWindow.width - BSSizes.applyScale(10); wrapMode: Label.WordWrap } @@ -81,11 +81,11 @@ Window { text: qsTr("Ok") anchors.bottom: rect.bottom - anchors.bottomMargin: 24 + anchors.bottomMargin: BSSizes.applyScale(24) anchors.horizontalCenter: rect.horizontalCenter - width: 250 - height: 40 + width: BSSizes.applyScale(250) + height: BSSizes.applyScale(40) preferred: true focus:true diff --git a/GUI/QtQuick/qml/StyledControls/CustomPasswordTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomPasswordTextInput.qml index ef0f05b1e..ecb394e14 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomPasswordTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomPasswordTextInput.qml @@ -17,15 +17,15 @@ TextField { property bool allowShowPass: true horizontalAlignment: Text.AlignHLeft - font.pixelSize: 11 + font.pixelSize: BSSizes.applyScale(11) color: BSStyle.inputsFontColor padding: 0 echoMode: button.pressed ? TextInput.Normal : TextInput.Password selectByMouse: false background: Rectangle { - implicitWidth: 200 - implicitHeight: 25 + implicitWidth: BSSizes.applyScale(200) + implicitHeight: BSSizes.applyScale(25) color:"transparent" border.color: BSStyle.inputsBorderColor @@ -40,11 +40,11 @@ TextField { source: "qrc:/resources/eye.png" } } - padding: 2 - (button.pressed ? 1 : 0) + padding: (button.pressed ? 1 : 0) - BSSizes.applyScale(2) background: Rectangle {color: "transparent"} anchors.right: parent.right - width: 23 - height: 23 + width: BSSizes.applyScale(23) + height: BSSizes.applyScale(23) } } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml index 4c3e917da..b08c3def4 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomPopup.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomPopup.qml @@ -8,7 +8,7 @@ import "../BsStyles" Window { id: root - property int navig_bar_width: 36 + property int navig_bar_width: BSSizes.applyScale(36) property alias _stack_view: stack_popup property alias _arrow_but_visibility: back_arrow_button.visible @@ -27,8 +27,8 @@ Window { color: "transparent" - x: mainWindow.x + (mainWindow.width - width)/2 - y: mainWindow.y + 28 + x: mainWindow.x + (mainWindow.width - width) / 2 + y: mainWindow.y + (mainWindow.height - height) / 2 signal sig_close_click() signal sig_back_arrow_click() @@ -38,37 +38,37 @@ Window { color: BSStyle.popupBackgroundColor opacity: 1 - radius: 16 + radius: BSSizes.applyScale(16) height: stack_popup.height + navig_bar_width width: stack_popup.width border.color : BSStyle.defaultBorderColor - border.width : 1 + border.width : BSSizes.applyScale(1) Rectangle { id: close_rect anchors.top: parent.top - anchors.topMargin: 1 + anchors.topMargin: BSSizes.applyScale(1) anchors.right: parent.right - anchors.rightMargin: 1 - radius: 16 + anchors.rightMargin: BSSizes.applyScale(1) + radius: BSSizes.applyScale(16) color: BSStyle.popupBackgroundColor - height: 39 - width: 110 + height: BSSizes.applyScale(39) + width: BSSizes.applyScale(110) Image { id: close_button anchors.top: parent.top - anchors.topMargin: 23 + anchors.topMargin: BSSizes.applyScale(23) anchors.right: parent.right - anchors.rightMargin: 23 + anchors.rightMargin: BSSizes.applyScale(23) source: "qrc:/images/close_button.svg" - width: 16 - height: 16 + width: BSSizes.applyScale(16) + height: BSSizes.applyScale(16) } MouseArea { anchors.fill: parent @@ -82,13 +82,13 @@ Window { id: back_arrow_button anchors.top: parent.top - anchors.topMargin: 24 + anchors.topMargin: BSSizes.applyScale(24) anchors.left: parent.left - anchors.leftMargin: 24 + anchors.leftMargin: BSSizes.applyScale(24) source: "qrc:/images/back_arrow.png" - width: 20 - height: 16 + width: BSSizes.applyScale(20) + height: BSSizes.applyScale(16) MouseArea { anchors.fill: parent onClicked: { diff --git a/GUI/QtQuick/qml/StyledControls/CustomProgressBar.qml b/GUI/QtQuick/qml/StyledControls/CustomProgressBar.qml index 18101abe7..f95efd5d6 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomProgressBar.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomProgressBar.qml @@ -17,23 +17,23 @@ ProgressBar { padding: 0 background: Rectangle { - implicitWidth: 532 - implicitHeight: 8 + implicitWidth: BSSizes.applyScale(532) + implicitHeight: BSSizes.applyScale(8) color: "transparent" - radius: 32 + radius: BSSizes.applyScale(32) - border.width: 1 + border.width: BSSizes.applyScale(1) border.color: "#3C435A" } contentItem: Item { - implicitWidth: 532 - implicitHeight: 8 + implicitWidth: BSSizes.applyScale(532) + implicitHeight: BSSizes.applyScale(8) Rectangle { width: control.visualPosition * parent.width height: parent.height - radius: 32 + radius: BSSizes.applyScale(32) color: "#45A6FF" } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml b/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml index b56754fa8..294f036d7 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomRadioButton.qml @@ -20,20 +20,20 @@ RadioButton { activeFocusOnTab: false indicator: Rectangle { - implicitWidth: 16 - implicitHeight: 16 + implicitWidth: BSSizes.applyScale(16) + implicitHeight: BSSizes.applyScale(16) x: control.leftPadding y: parent.height / 2 - height / 2 - radius: 8 + radius: BSSizes.applyScale(8) border.color: "#45A6FF" color: "transparent" Rectangle { - width: 8 - height: 8 - x: 4 - y: 4 - radius: 4 + width: BSSizes.applyScale(8) + height: BSSizes.applyScale(8) + x: BSSizes.applyScale(4) + y: BSSizes.applyScale(4) + radius: BSSizes.applyScale(4) color: "#45A6FF" visible: control.checked } diff --git a/GUI/QtQuick/qml/StyledControls/CustomSeedLabel.qml b/GUI/QtQuick/qml/StyledControls/CustomSeedLabel.qml index 1fbf432bc..b920ad481 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSeedLabel.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSeedLabel.qml @@ -18,22 +18,22 @@ Rectangle { property alias serial_num: serial_number.text property alias seed_text: seed.text - width: 170 - height: 46 + width: BSSizes.applyScale(170) + height: BSSizes.applyScale(46) color: "#020817" opacity: 1 - radius: 14 + radius: BSSizes.applyScale(14) Label { id: serial_number anchors.top: rect.top - anchors.topMargin: 8 + anchors.topMargin: BSSizes.applyScale(8) anchors.left: rect.left - anchors.leftMargin: 10 + anchors.leftMargin: BSSizes.applyScale(10) - font.pixelSize: 12 + font.pixelSize: BSSizes.applyScale(12) font.family: "Roboto" font.weight: Font.Normal @@ -45,7 +45,7 @@ Rectangle { anchors.centerIn : rect - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Normal diff --git a/GUI/QtQuick/qml/StyledControls/CustomSeedTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomSeedTextInput.qml index 738bc3f78..0800a8b06 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSeedTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSeedTextInput.qml @@ -13,10 +13,10 @@ import QtQuick.Controls 2.3 import "../BsStyles" CustomTextInput { - height: 46 + height: BSSizes.applyScale(46) horizontalAlignment : TextInput.AlignHCenter - input_topMargin: 13 - title_leftMargin: 10 - title_topMargin: 8 - title_font_size: 12 + input_topMargin: BSSizes.applyScale(13) + title_leftMargin: BSSizes.applyScale(10) + title_topMargin: BSSizes.applyScale(8) + title_font_size: BSSizes.applyScale(12) } diff --git a/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml index 8c8860459..3fca5b9f5 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSmallButton.qml @@ -16,11 +16,11 @@ import "../BsStyles" Button { id: control - width: 134 - height: 29 + width: BSSizes.applyScale(134) + height: BSSizes.applyScale(29) focusPolicy: Qt.TabFocus - font.pixelSize: 12 + font.pixelSize: BSSizes.applyScale(12) font.family: "Roboto" font.letterSpacing: 0.3 @@ -31,7 +31,7 @@ Button { background: Rectangle { id: backgroundItem color: "#020817" - radius: 14 + radius: BSSizes.applyScale(14) border.color: (control.hovered ? BSStyle.comboBoxHoveredBorderColor : diff --git a/GUI/QtQuick/qml/StyledControls/CustomSmallComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomSmallComboBox.qml index 1b0a0eca0..cd459ce60 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSmallComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSmallComboBox.qml @@ -19,22 +19,22 @@ CustomComboBox { font.family: "Roboto" font.letterSpacing: 0.3 - fontSize: 12 + fontSize: BSSizes.applyScale(12) fontColor: BSStyle.titleTextColor - leftPadding: 10 + leftPadding: BSSizes.applyScale(10) rightPadding: 0 topPadding: 0 - bottomPadding: 2 + bottomPadding: BSSizes.applyScale(2) indicator: Image { - width: 6 - height: 3 + width: BSSizes.applyScale(6) + height: BSSizes.applyScale(3) anchors.verticalCenter: parent.verticalCenter source: "qrc:/images/combobox_open_button.svg" anchors.right: parent.right - anchors.rightMargin: 14 + anchors.rightMargin: BSSizes.applyScale(14) } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomSuccessDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomSuccessDialog.qml index 652cddd70..82314960c 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSuccessDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSuccessDialog.qml @@ -16,8 +16,8 @@ Window { flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog modality: Qt.WindowModal - height: 430 - width: 580 + height: BSSizes.applyScale(430) + width: BSSizes.applyScale(580) color: "transparent" @@ -30,19 +30,19 @@ Window { color: "#191E2A" opacity: 1 - radius: 16 + radius: BSSizes.applyScale(16) anchors.fill: parent border.color : BSStyle.defaultBorderColor - border.width : 1 + border.width : BSSizes.applyScale(1) CustomSuccessWidget { id: success - anchors.topMargin: 24 + anchors.topMargin: BSSizes.applyScale(24) anchors.fill: parent - details_font_size: 16 + details_font_size: BSSizes.applyScale(16) details_font_weight: Font.Medium onSig_finish: { diff --git a/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml index b51e57a97..fd97c69c8 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSuccessWidget.qml @@ -16,8 +16,8 @@ ColumnLayout { signal sig_finish() - height: 485 - width: 580 + height: BSSizes.applyScale(485) + width: BSSizes.applyScale(580) spacing: 0 CustomTitleLabel { @@ -31,31 +31,31 @@ ColumnLayout { Image { id: wallet_icon - Layout.topMargin: 34 + Layout.topMargin: BSSizes.applyScale(34) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter - Layout.preferredHeight : 120 - Layout.preferredWidth : 120 + Layout.preferredHeight : BSSizes.applyScale(120) + Layout.preferredWidth : BSSizes.applyScale(120) source: "qrc:/images/success.png" - width: 120 - height: 120 + width: BSSizes.applyScale(120) + height: BSSizes.applyScale(120) } Label { id: details - Layout.topMargin: 26 + Layout.topMargin: BSSizes.applyScale(26) Layout.alignment: Qt.AlignTop | Qt.AlignHCenter text: qsTr("Your wallet has successfully been created") - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal color: "#E2E7FF" wrapMode: Text.Wrap Layout.maximumWidth: parent.width - Layout.leftMargin: 10 - Layout.rightMargin: 10 + Layout.leftMargin: BSSizes.applyScale(10) + Layout.rightMargin: BSSizes.applyScale(10) } Label { @@ -66,9 +66,9 @@ ColumnLayout { CustomButton { id: finish_but - width: 530 + width: BSSizes.applyScale(530) - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter text: qsTr("Finish") diff --git a/GUI/QtQuick/qml/StyledControls/CustomSwitch.qml b/GUI/QtQuick/qml/StyledControls/CustomSwitch.qml index df19894c7..739d603cd 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomSwitch.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomSwitch.qml @@ -29,11 +29,11 @@ Switch { indicator: Rectangle { id: border_ - implicitWidth: 40 - implicitHeight: 20 + implicitWidth: BSSizes.applyScale(40) + implicitHeight: BSSizes.applyScale(20) x: control.width - width - control.rightPadding y: parent.height / 2 - height / 2 - radius: 10 + radius: BSSizes.applyScale(10) color: { if (control.enabled) { if (control.checked) { @@ -64,9 +64,9 @@ Switch { Rectangle { id: circle_ x: control.checked ? parent.width - width : 0 - width: 20 - height: 20 - radius: 10 + width: BSSizes.applyScale(20) + height: BSSizes.applyScale(20) + radius: BSSizes.applyScale(10) color: { if (control.enabled) { @@ -100,8 +100,8 @@ Switch { } background: Rectangle { - implicitWidth: 80 - implicitHeight: 20 + implicitWidth: BSSizes.applyScale(80) + implicitHeight: BSSizes.applyScale(20) visible: control.down color: BSStyle.switchBgColor } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml b/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml index f71f2726a..c0316f756 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTabButton.qml @@ -16,12 +16,12 @@ import "../BsStyles" TabButton { id: control - width: 94 + width: BSSizes.applyScale(94) height: parent.height focusPolicy: Qt.NoFocus - font.pixelSize: 10 + font.pixelSize: BSSizes.applyScale(10) font.family: "Roboto" font.weight: Font.Medium font.letterSpacing: 0.2 @@ -32,13 +32,13 @@ TabButton { contentItem: ColumnLayout { width: control.width height: control.height - spacing : 4 + spacing : BSSizes.applyScale(4) Image { id: image_ - width: 24 - height: 24 + width: BSSizes.applyScale(24) + height: BSSizes.applyScale(24) Layout.alignment : Qt.AlignTop | Qt.AlignHCenter source: control.checked? selectedIcon_ :nonSelectedIcon_ diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index ce6c51aad..060331223 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -16,9 +16,7 @@ import "../BsStyles" Column { id: root - width: 1200 - height: 200 - spacing: 2 + spacing: BSSizes.applyScale(2) property alias model: component.model property alias delegate: component.delegate @@ -27,10 +25,10 @@ Column { property var columnWidths property int copy_button_column_index: 0 property int delete_button_column_index: -1 - property int left_text_padding: 10 + property int left_text_padding: BSSizes.applyScale(10) property bool has_header: true - property int text_header_size: 12 - property int cell_text_size: 13 + property int text_header_size: BSSizes.applyScale(12) + property int cell_text_size: BSSizes.applyScale(13) signal copyRequested(var id) signal deleteRequested(int id) @@ -46,7 +44,7 @@ Column { id: tableHeader width: parent.width syncView: component - height: 32 + height: BSSizes.applyScale(32) visible: root.has_header text_size: root.text_header_size } @@ -82,8 +80,8 @@ Column { delegate: Rectangle { id: delega - implicitHeight: 34 - implicitWidth: 100 + implicitHeight: BSSizes.applyScale(34) + implicitWidth: BSSizes.applyScale(100) color: row === component.selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor MouseArea { diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextArea.qml b/GUI/QtQuick/qml/StyledControls/CustomTextArea.qml index e72e9f9c7..1ed296272 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextArea.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextArea.qml @@ -15,14 +15,14 @@ import "../BsStyles" TextArea { id: root horizontalAlignment: Text.AlignHLeft - font.pixelSize: 11 + font.pixelSize: BSSizes.applyScale(11) font.family: "Roboto" color: "white" wrapMode: TextEdit.WordWrap background: Rectangle { - implicitWidth: 200 - implicitHeight: 50 + implicitWidth: BSSizes.applyScale(200) + implicitHeight: BSSizes.applyScale(50) color:"transparent" border.color: BSStyle.inputsBorderColor } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml b/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml index 27f5356e3..674031334 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextEdit.qml @@ -34,7 +34,7 @@ Rectangle { color: "#020817" opacity: 1 - radius: 14 + radius: BSSizes.applyScale(14) border.color: input.activeFocus ? "#45A6FF" : BSStyle.defaultBorderColor border.width: 1 @@ -43,11 +43,11 @@ Rectangle { id: title anchors.top: rect.top - anchors.topMargin: 16 + anchors.topMargin: BSSizes.applyScale(16) anchors.left: rect.left - anchors.leftMargin: 16 + anchors.leftMargin: BSSizes.applyScale(16) - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal @@ -63,13 +63,13 @@ Rectangle { clip: true anchors.top: rect.top - anchors.topMargin: 35 + anchors.topMargin: BSSizes.applyScale(35) anchors.left: rect.left anchors.leftMargin: title.anchors.leftMargin - width: rect.width - 2*title.anchors.leftMargin - height: 39 + width: rect.width - 2 * title.anchors.leftMargin + height: BSSizes.applyScale(39) - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Normal diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index d4e3fb231..533a2c39d 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -19,21 +19,21 @@ Rectangle { property alias title_text: title.text property string placeholder_text property bool hide_placeholder_when_activefocus: true - property alias title_leftMargin: title.anchors.leftMargin - property alias title_topMargin: title.anchors.topMargin - property alias title_font_size: title.font.pixelSize + property int title_leftMargin: BSSizes.applyScale(16) + property int title_topMargin: BSSizes.applyScale(16) + property int title_font_size: BSSizes.applyScale(13) //aliases - input property alias input_text: input.text property alias horizontalAlignment: input.horizontalAlignment - property alias input_topMargin: input.anchors.topMargin + property int input_topMargin: BSSizes.applyScale(35) property alias input_validator: input.validator property bool isValid: true property bool isPassword: false property bool isHiddenText: false - property int input_right_margin: 16 + property int input_right_margin: BSSizes.applyScale(16) property var completer: null @@ -49,20 +49,20 @@ Rectangle { color: "#020817" opacity: 1 - radius: 14 + radius: BSSizes.applyScale(14) border.color: isValid ? (input.activeFocus ? "#45A6FF" : BSStyle.defaultBorderColor) : "#EB6060" - border.width: 1 + border.width: BSSizes.applyScale(1) Label { id: title anchors.top: rect.top - anchors.topMargin: 16 + anchors.topMargin: rect.title_topMargin anchors.left: rect.left - anchors.leftMargin: 16 + anchors.leftMargin: rect.title_leftMargin - font.pixelSize: 13 + font.pixelSize: rect.title_font_size font.family: "Roboto" font.weight: Font.Normal @@ -78,15 +78,15 @@ Rectangle { clip: true anchors.top: rect.top - anchors.topMargin: 35 + anchors.topMargin: rect.input_topMargin anchors.left: rect.left - anchors.leftMargin: 16 - width: rect.width - 16 - input_right_margin - height: 19 + anchors.leftMargin: rect.title_leftMargin + width: rect.width - rect.title_leftMargin - rect.input_right_margin + height: BSSizes.applyScale(19) echoMode: isHiddenText? TextInput.Password : TextInput.Normal - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Normal @@ -97,7 +97,7 @@ Rectangle { color: "#7A88B0" visible: !input.text && (!hide_placeholder_when_activefocus || !input.activeFocus) - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Normal } @@ -141,14 +141,14 @@ Rectangle { visible: isPassword anchors.top: rect.top - anchors.topMargin: 23 + anchors.topMargin: BSSizes.applyScale(23) anchors.right: rect.right - anchors.rightMargin: 23 + anchors.rightMargin: BSSizes.applyScale(23) source: isHiddenText? "qrc:/images/Eye_icon _unvisible.png" : "qrc:/images/Eye_icon _visible.png" z: 1 - width: 24 - height: 24 + width: BSSizes.applyScale(24) + height: BSSizes.applyScale(24) MouseArea { anchors.fill: parent diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml b/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml index 2abca6aa9..70a16365b 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextSwitch.qml @@ -18,33 +18,33 @@ Rectangle { property bool isFullChoosed: true signal sig_full_changed (bool isFull) - width: 530 - height: 40 + width: BSSizes.applyScale(530) + height: BSSizes.applyScale(40) color: "transparent" - radius: 37 + radius: BSSizes.applyScale(37) border.color : BSStyle.defaultBorderColor - border.width : 1 + border.width : BSSizes.applyScale(1) Rectangle { id: left_rect - width: 260 - height: 34 + width: BSSizes.applyScale(260) + height: BSSizes.applyScale(34) anchors.top: root.top - anchors.topMargin: 3 + anchors.topMargin: BSSizes.applyScale(3) anchors.left: root.left - anchors.leftMargin: 3 + anchors.leftMargin: BSSizes.applyScale(3) color: isFullChoosed? "#32394F": "transparent" - radius: 37 + radius: BSSizes.applyScale(37) Label { id: left_label - width: 260 - height: 15 + width: BSSizes.applyScale(260) + height: BSSizes.applyScale(15) anchors.centerIn : left_rect horizontalAlignment : Text.AlignHCenter @@ -53,7 +53,7 @@ Rectangle { color: isFullChoosed? "#E2E7FF": "#7A88B0" - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Medium } @@ -70,22 +70,22 @@ Rectangle { Rectangle { id: right_rect - width: 260 - height: 34 + width: BSSizes.applyScale(260) + height: BSSizes.applyScale(34) anchors.top: root.top - anchors.topMargin: 3 + anchors.topMargin: BSSizes.applyScale(3) anchors.right: root.right - anchors.rightMargin: 3 + anchors.rightMargin: BSSizes.applyScale(3) color: !isFullChoosed? "#32394F": "transparent" - radius: 37 + radius: BSSizes.applyScale(37) Label { id: right_label - width: 260 - height: 15 + width: BSSizes.applyScale(260) + height: BSSizes.applyScale(15) anchors.centerIn : right_rect horizontalAlignment : Text.AlignHCenter @@ -94,7 +94,7 @@ Rectangle { color: !isFullChoosed? "#E2E7FF": "#7A88B0" - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Medium } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTitleDialogWindowWithExpander.qml b/GUI/QtQuick/qml/StyledControls/CustomTitleDialogWindowWithExpander.qml index dc09e8ce5..99ac15865 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTitleDialogWindowWithExpander.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTitleDialogWindowWithExpander.qml @@ -32,7 +32,7 @@ BSWalletHandlerDialog { property string text : root.title clip: true color: "transparent" - height: 40 + height: BSSizes.applyScale(40) Layout.fillWidth: true @@ -43,19 +43,19 @@ BSWalletHandlerDialog { Text { anchors.fill: rect - leftPadding: 10 - rightPadding: 10 + leftPadding: BSSizes.applyScale(10) + rightPadding: BSSizes.applyScale(10) text: rect.text font.capitalization: Font.AllUppercase color: BSStyle.textColor - font.pixelSize: 11 + font.pixelSize: BSSizes.applyScale(11) verticalAlignment: Text.AlignVCenter } Button { id: btnExpand - width: 100 + width: BSSizes.applyScale(100) anchors.right: rect.right anchors.top: rect.top anchors.bottom: rect.bottom @@ -63,7 +63,7 @@ BSWalletHandlerDialog { contentItem: Text { text: headerButtonText color: BSStyle.textColor - font.pixelSize: 11 + font.pixelSize: BSSizes.applyScale(11) font.underline: true horizontalAlignment: Text.AlignRight verticalAlignment: Text.AlignVCenter @@ -71,8 +71,8 @@ BSWalletHandlerDialog { } background: Rectangle { - implicitWidth: 70 - implicitHeight: 35 + implicitWidth: BSSizes.applyScale(70) + implicitHeight: BSSizes.applyScale(35) color: "transparent" } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTitleLabel.qml b/GUI/QtQuick/qml/StyledControls/CustomTitleLabel.qml index 1d4513406..2113d3e49 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTitleLabel.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTitleLabel.qml @@ -14,9 +14,9 @@ import "../BsStyles" Label { id: title - height : 23 + height : BSSizes.applyScale(23) color: BSStyle.titanWhiteColor - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Medium } diff --git a/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml b/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml index bdc4ec2aa..e8187ac84 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTitleToolButton.qml @@ -20,11 +20,11 @@ ToolButton { property bool _isSelected: false Layout.fillHeight: true - implicitWidth: 110 + implicitWidth: BSSizes.applyScale(110) hoverEnabled: true - font.pixelSize: 12 + font.pixelSize: BSSizes.applyScale(12) font.family: "Roboto" font.weight: Font.Normal palette.buttonText: !enabled ? BSStyle.buttonsDisabledTextColor : @@ -32,8 +32,8 @@ ToolButton { (_isSelected ? BSStyle.selectedColor : BSStyle.titleTextColor)) icon.color: palette.buttonText - icon.width: 16 - icon.height: 16 + icon.width: BSSizes.applyScale(16) + icon.height: BSSizes.applyScale(16) background: Rectangle { anchors.fill: parent @@ -48,7 +48,7 @@ ToolButton { anchors.rightMargin: -border.width anchors.topMargin: -border.width anchors.bottomMargin: -border.width - border.width: 1 + border.width: BSSizes.applyScale(1) border.color: BSStyle.defaultBorderColor } } diff --git a/GUI/QtQuick/qml/StyledControls/DeleteIconButton.qml b/GUI/QtQuick/qml/StyledControls/DeleteIconButton.qml index 990b4d701..9cfda18fc 100644 --- a/GUI/QtQuick/qml/StyledControls/DeleteIconButton.qml +++ b/GUI/QtQuick/qml/StyledControls/DeleteIconButton.qml @@ -9,10 +9,10 @@ Image { signal deleteRequested() - width: 24 - height: 24 - sourceSize.width: 24 - sourceSize.height: 24 + width: BSSizes.applyScale(24) + height: BSSizes.applyScale(24) + sourceSize.width: BSSizes.applyScale(24) + sourceSize.height: BSSizes.applyScale(24) anchors.verticalCenter: parent.verticalCenter source: "qrc:/images/delete.png" diff --git a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml index db0899c38..d6d00cb45 100644 --- a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml @@ -18,13 +18,13 @@ CustomTableView { FontMetrics { id: fontMetrics - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal } delegate: Rectangle { - implicitHeight: 58 + implicitHeight: BSSizes.applyScale(58) color: (row === component.selected_row_index ? BSStyle.tableCellSelectedBackgroundColor : BSStyle.tableCellBackgroundColor) MouseArea { @@ -54,14 +54,14 @@ CustomTableView { color: dataColor font.family: "Roboto" font.weight: Font.Normal - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) - leftPadding: 10 - topPadding: 9 + leftPadding: BSSizes.applyScale(10) + topPadding: BSSizes.applyScale(9) } Column { - spacing: 8 + spacing: BSSizes.applyScale(8) visible: column === 1 width: parent.width anchors.centerIn: parent @@ -75,17 +75,17 @@ CustomTableView { color: BSStyle.titleTextColor font.family: "Roboto" font.weight: Font.Normal - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.letterSpacing: -0.2 - leftPadding: 10 + leftPadding: BSSizes.applyScale(10) } Text { text: tableData - width: parent.width - fontMetrics.advanceWidth(address_label_item.text) - 10 + width: parent.width - fontMetrics.advanceWidth(address_label_item.text) - BSSizes.applyScale(10) color: BSStyle.textColor font.family: "Roboto" font.weight: Font.Normal - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.letterSpacing: -0.2 clip: true } @@ -99,17 +99,17 @@ CustomTableView { color: BSStyle.titleTextColor font.family: "Roboto" font.weight: Font.Normal - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.letterSpacing: -0.2 - leftPadding: 10 + leftPadding: BSSizes.applyScale(10) } Text { text: txHash - width: parent.width - fontMetrics.advanceWidth(transaction_label_item.text) - 10 + width: parent.width - fontMetrics.advanceWidth(transaction_label_item.text) - BSSizes.applyScale(10) color: BSStyle.textColor font.family: "Roboto" font.weight: Font.Normal - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.letterSpacing: -0.2 clip: true } diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index 3e48f046d..26d7d2ec4 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -30,8 +30,8 @@ Popup { property string txComment: '' property color txConfirmationsColor - width: 916 - height: 718 + width: BSSizes.applyWindowWidthScale(916) + height: BSSizes.applyWindowHeightScale(718) anchors.centerIn: Overlay.overlay modal: true @@ -40,9 +40,9 @@ Popup { background: Rectangle { color: BSStyle.popupBackgroundColor - border.width: 1 + border.width: BSSizes.applyScale(1) border.color: BSStyle.popupBorderColor - radius: 14 + radius: BSSizes.applyScale(14) } contentItem: Rectangle { @@ -50,16 +50,16 @@ Popup { Column { anchors.fill: parent - anchors.topMargin: 12 - anchors.leftMargin: 12 - anchors.rightMargin: 12 - anchors.bottomMargin: 12 - spacing: 14 + anchors.topMargin: BSSizes.applyScale(12) + anchors.leftMargin: BSSizes.applyScale(12) + anchors.rightMargin: BSSizes.applyScale(12) + anchors.bottomMargin: BSSizes.applyScale(12) + spacing: BSSizes.applyScale(14) Label { text: qsTr("Transaction details") color: BSStyle.textColor - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Bold font.letterSpacing: 0.35 @@ -67,21 +67,21 @@ Popup { Grid { columns: 2 - rowSpacing: 8 + rowSpacing: BSSizes.applyScale(8) Text { text: qsTr("Hash (RPC byte order)") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 170 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(170) } Row { Text { text: tx !== null ? tx.txId : "" color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) anchors.verticalCenter: parent.verticalCenter } CopyIconButton { @@ -94,141 +94,141 @@ Popup { text: qsTr("Time") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 170 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(170) } Text { text: transaction_details.txDateTime color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } Text { text: qsTr("Height") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 170 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(170) } Text { text: tx !== null ? tx.height : "" color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } Text { text: qsTr("Amount") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 170 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(170) } Text { text: transaction_details.txAmount color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } Text { text: qsTr("Type") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 170 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(170) } Text { text: transaction_details.txType !== "" ? transaction_details.txType : "..." color: transaction_details.txTypeColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } Text { text: qsTr("Virtual size (Bytes)") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 170 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(170) } Label { text: tx !== null ? tx.virtSize : "" color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } Text { text: qsTr("sat / virtual byte") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 170 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(170) } Label { text: tx !== null ? tx.feePerByte : "" color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } Text { text: qsTr("Fee") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 170 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(170) } Label { text: tx !== null ? tx.fee : "" color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } Text { text: qsTr("Confirmations") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 170 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(170) } Label { text: tx !== null ? tx.nbConf : "" color: txConfirmationsColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } Text { text: qsTr("Wallet") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 170 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(170) } Label { text: transaction_details.walletName !== "" ? transaction_details.walletName : "..." color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } Text { text: qsTr("Address") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 170 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(170) } Row { Text { text: transaction_details.address color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) anchors.verticalCenter: parent.verticalCenter } CopyIconButton { @@ -241,35 +241,35 @@ Popup { text: qsTr("Comment") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 - width: 170 + font.pixelSize: BSSizes.applyScale(14) + width: BSSizes.applyScale(170) } Label { text: transaction_details.txComment === '' ? '-' : transaction_details.txComment color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) } } Label { text: qsTr("Input addresses") color: BSStyle.textColor - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.weight: Font.DemiBold font.family: "Roboto" } Rectangle { width: parent.width - height: 110 + height: BSSizes.applyScale(110) color: "transparent" - radius: 14 + radius: BSSizes.applyScale(14) border.color: BSStyle.popupBorderColor - border.width: 1 + border.width: BSSizes.applyScale(1) CustomTableView { - width: parent.width - 20 + width: parent.width - BSSizes.applyScale(20) height: parent.height anchors.centerIn: parent model: tx !== null ? tx.inputs : [] @@ -283,21 +283,21 @@ Popup { Text { text: qsTr("Output addresses") color: BSStyle.textColor - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.weight: Font.DemiBold font.family: "Roboto" } Rectangle { width: parent.width - height: 110 + height: BSSizes.applyScale(110) color: "transparent" - radius: 14 + radius: BSSizes.applyScale(14) border.color: BSStyle.popupBorderColor - border.width: 1 + border.width: BSSizes.applyScale(1) CustomTableView { - width: parent.width - 20 + width: parent.width - BSSizes.applyScale(20) height: parent.height anchors.centerIn: parent model: tx !== null ? tx.outputs : [] @@ -311,6 +311,8 @@ Popup { } CloseIconButton { + anchors.topMargin: BSSizes.applyScale(5) + anchors.rightMargin: BSSizes.applyScale(5) anchors.right: parent.right anchors.top: parent.top diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index ab22cadf6..712a18680 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -22,8 +22,8 @@ import terminal.models 1.0 Item { id: transactions - width: 1200 - height: 788 + width: BSSizes.applyScale(1200) + height: BSSizes.applyScale(788) signal openSend (string txId, bool isRBF, bool isCPFP) signal openExplorer (string txId) @@ -60,20 +60,20 @@ Item { Column { spacing: 18 anchors.fill: parent - anchors.topMargin: 14 - anchors.leftMargin: 18 - anchors.rightMargin: 18 + anchors.topMargin: BSSizes.applyScale(14) + anchors.leftMargin: BSSizes.applyScale(18) + anchors.rightMargin: BSSizes.applyScale(18) Row { id: transaction_header_menu width: parent.width - height: 45 - spacing: 15 + height: BSSizes.applyScale(45) + spacing: BSSizes.applyScale(15) Label { text: qsTr("Transactions list") color: BSStyle.textColor - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" font.weight: Font.Bold font.letterSpacing: 0.35 @@ -81,7 +81,7 @@ Item { Row { - spacing: 8 + spacing: BSSizes.applyScale(8) height: parent.height anchors.right: parent.right @@ -89,8 +89,8 @@ Item { id: txWalletsComboBox model: bsApp.txWalletsList - width: 124 - height: 29 + width: BSSizes.applyScale(124) + height: BSSizes.applyScale(29) anchors.verticalCenter: parent.verticalCenter @@ -117,8 +117,8 @@ Item { id: txTypesComboBox model: bsApp.txTypesList - width: 124 - height: 29 + width: BSSizes.applyScale(124) + height: BSSizes.applyScale(29) anchors.verticalCenter: parent.verticalCenter @@ -142,7 +142,7 @@ Item { } Row { - spacing: 4 + spacing: BSSizes.applyScale(4) anchors.verticalCenter: parent.verticalCenter CustomButtonLeftIcon { @@ -153,8 +153,8 @@ Item { } Rectangle { - height: 1 - width: 8 + height: BSSizes.applyScale(1) + width: BSSizes.applyScale(8) color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } @@ -170,8 +170,8 @@ Item { text: qsTr("CSV download") custom_icon.source: "qrc:/images/download_icon.svg" - custom_icon.width: 10 - custom_icon.height: 10 + custom_icon.width: BSSizes.applyScale(10) + custom_icon.height: BSSizes.applyScale(10) onClicked: { var csvFile = "%1/BlockSettle_%2_%3_%4.csv" diff --git a/GUI/QtQuick/qml/VerifyTX.qml b/GUI/QtQuick/qml/VerifyTX.qml index 5b5ac5606..aa0320d6b 100644 --- a/GUI/QtQuick/qml/VerifyTX.qml +++ b/GUI/QtQuick/qml/VerifyTX.qml @@ -23,7 +23,7 @@ Item { property var txSignRequest Column { - spacing: 23 + spacing: BSSizes.applyScale(23) anchors.fill: parent Button { @@ -36,83 +36,83 @@ Item { columns: 2 Label { text: qsTr("Output address:") - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(BSSizes.applyScale(12)) } Label { text: qsTr("%1").arg(txSignRequest.outputAddresses[0]) - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) } Label { text: qsTr("Output amount:") - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) } Label { text: qsTr("%1").arg(txSignRequest.outputAmount) - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) } Label { text: qsTr("Input amount:") - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) } Label { text: qsTr("%1").arg(txSignRequest.inputAmount) - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) } Label { text: qsTr("Return amount:") - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) } Label { text: qsTr("%1").arg(txSignRequest.returnAmount) - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) } Label { text: qsTr("Transaction fee:") - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) } Label { text: qsTr("%1").arg(txSignRequest.fee) - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) } Label { text: qsTr("Transaction size:") - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) } Label { text: qsTr("%1").arg(txSignRequest.txSize) - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) } Label { text: qsTr("Fee per byte:") - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) } Label { text: qsTr("%1").arg(txSignRequest.feePerByte) - font.pointSize: 12 + font.pointSize: BSSizes.applyScale(12) } } TextInput { id: password - width: 500 - height: 32 + width: BSSizes.applyScale(500) + height: BSSizes.applyScale(32) color: 'lightgrey' - font.pointSize: 14 + font.pointSize: BSSizes.applyScale(14) horizontalAlignment: TextEdit.AlignHCenter verticalAlignment: TextEdit.AlignVCenter echoMode: TextInput.Password passwordCharacter: '*' Text { text: qsTr("Password") - font.pointSize: 6 + font.pointSize: BSSizes.applyScale(6) color: 'darkgrey' anchors.left: parent anchors.top: parent } } Button { - width: 900 + width: BSSizes.applyScale(900) text: qsTr("Broadcast") - font.pointSize: 14 + font.pointSize: BSSizes.applyScale(14) enabled: txSignRequest.isValid && password.text.length onClicked: { diff --git a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml index 7a06b5f63..ca3dbe6cb 100644 --- a/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml +++ b/GUI/QtQuick/qml/WalletProperties/ChangePassword.qml @@ -11,8 +11,8 @@ ColumnLayout { signal sig_success() - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) spacing: 0 @@ -44,13 +44,13 @@ ColumnLayout { id: password Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + input_topMargin: BSSizes.applyScale(35) + title_leftMargin: BSSizes.applyScale(16) + title_topMargin: BSSizes.applyScale(16) activeFocusOnTab: true title_text: qsTr("Password") @@ -92,13 +92,13 @@ ColumnLayout { id: new_password Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + input_topMargin: BSSizes.applyScale(35) + title_leftMargin: BSSizes.applyScale(16) + title_topMargin: BSSizes.applyScale(16) activeFocusOnTab: true title_text: qsTr("New Password") @@ -150,13 +150,13 @@ ColumnLayout { id: confirm_password Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + input_topMargin: BSSizes.applyScale(35) + title_leftMargin: BSSizes.applyScale(16) + title_topMargin: BSSizes.applyScale(16) title_text: qsTr("Confirm Password") @@ -199,10 +199,10 @@ ColumnLayout { text: qsTr("Save") preferred: true - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - width: 530 + width: BSSizes.applyScale(530) enabled: (password.input_text !== "") && (new_password.input_text !== "") && (confirm_password.input_text !== "") diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml index 2485cfc49..354432396 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWallet.qml @@ -9,8 +9,8 @@ import "../StyledControls" ColumnLayout { id: layout - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) spacing: 0 @@ -60,13 +60,13 @@ ColumnLayout { visible: is_password_requried Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + input_topMargin: BSSizes.applyScale(35) + title_leftMargin: BSSizes.applyScale(16) + title_topMargin: BSSizes.applyScale(16) title_text: qsTr("Password") @@ -93,10 +93,10 @@ ColumnLayout { CustomButton { text: qsTr("Back") - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - width: 260 + width: BSSizes.applyScale(260) onClicked: back() } @@ -106,12 +106,12 @@ ColumnLayout { text: qsTr("Delete") preferred: true - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter enabled: (password.input_text !== "" || !is_password_requried) - width: 260 + width: BSSizes.applyScale(260) function click_enter() { const result = bsApp.deleteWallet( diff --git a/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml b/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml index e6cf9f17f..1a4364dd9 100644 --- a/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml +++ b/GUI/QtQuick/qml/WalletProperties/DeleteWalletWarn.qml @@ -9,8 +9,8 @@ import "../StyledControls" ColumnLayout { id: layout - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) spacing: 0 @@ -58,16 +58,16 @@ ColumnLayout { Image { Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 120 - Layout.preferredWidth : 120 + Layout.preferredHeight : BSSizes.applyScale(120) + Layout.preferredWidth : BSSizes.applyScale(120) source: "qrc:/images/wallet_icon_warn.svg" - width: 120 - height: 120 + width: BSSizes.applyScale(120) + height: BSSizes.applyScale(120) } CustomTitleLabel { - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) Layout.alignment: Qt.AlignCenter Layout.preferredHeight : title.height text: isHW() ? qsTr("Are you sure you want to delete this wallet?") : qsTr("Save the seed before deleting the wallet") @@ -86,10 +86,10 @@ ColumnLayout { text: qsTr("View wallet seed") visible: !isHW() - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom - width: 160 + width: BSSizes.applyScale(160) onClicked: viewWalletSeed() } @@ -98,10 +98,10 @@ ColumnLayout { text: qsTr("Export watching-only wallet") visible: !isHW() - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom - width: 180 + width: BSSizes.applyScale(180) onClicked: exportWOWallet() } @@ -110,10 +110,10 @@ ColumnLayout { text: isHW() ? qsTr("Delete") : qsTr("Continue") preferred: true - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom - width: isHW() ? 260 : 160 + width: BSSizes.applyScale(isHW() ? 260 : 160) onClicked: { if (isHW()) { diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml index 54a821f2d..398ba9294 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -15,8 +15,8 @@ ColumnLayout { property var wallet_properties_vm property bool isExitWhenSuccess - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) focus: true spacing: 0 @@ -39,17 +39,17 @@ ColumnLayout { } Rectangle { - width: 530 - height: 82 - radius: 14 + width: BSSizes.applyScale(530) + height: BSSizes.applyScale(82) + radius: BSSizes.applyScale(14) color: BSStyle.exportWalletLabelBackground - Layout.topMargin: 24 + Layout.topMargin: BSSizes.applyScale(24) Layout.alignment: Qt.AlignCenter Grid { columns: 2 - rowSpacing: 14 + rowSpacing: BSSizes.applyScale(14) width: parent.width anchors.centerIn: parent @@ -57,50 +57,50 @@ ColumnLayout { text: qsTr("Wallet name") color: BSStyle.exportWalletLabelNameColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 - leftPadding: 20 + leftPadding: BSSizes.applyScale(20) } Text { text: wallet_properties_vm.walletName color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 horizontalAlignment: Text.AlignRight - rightPadding: 20 + rightPadding: BSSizes.applyScale(20) } Text { text: qsTr("Wallet ID") color: BSStyle.exportWalletLabelNameColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 - leftPadding: 20 + leftPadding: BSSizes.applyScale(20) } Text { text: wallet_properties_vm.walletId color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 horizontalAlignment: Text.AlignRight - rightPadding: 20 + rightPadding: BSSizes.applyScale(20) } } } Label { - Layout.leftMargin: 24 - Layout.rightMargin: 24 - Layout.topMargin: 32 - Layout.preferredHeight: 16 + Layout.leftMargin: BSSizes.applyScale(24) + Layout.rightMargin: BSSizes.applyScale(24) + Layout.topMargin: BSSizes.applyScale(32) + Layout.preferredHeight: BSSizes.applyScale(160) Layout.fillWidth: true Layout.alignment: Qt.AlignLeft | Qt.AlingTop - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal @@ -110,14 +110,14 @@ ColumnLayout { Label { - Layout.leftMargin: 24 - Layout.rightMargin: 24 - Layout.topMargin: 8 - Layout.preferredHeight: 16 + Layout.leftMargin: BSSizes.applyScale(24) + Layout.rightMargin: BSSizes.applyScale(24) + Layout.topMargin: BSSizes.applyScale(8) + Layout.preferredHeight: BSSizes.applyScale(16) Layout.fillWidth: true Layout.alignment: Qt.AlignLeft | Qt.AlingTop - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal @@ -127,13 +127,13 @@ ColumnLayout { Button { - Layout.leftMargin: 24 - Layout.topMargin: 12 + Layout.leftMargin: BSSizes.applyScale(24) + Layout.topMargin: BSSizes.applyScale(12) Layout.alignment: Qt.AlignLeft | Qt.AlingTop activeFocusOnTab: false - font.pixelSize: 13 + font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal palette.buttonText: BSStyle.buttonsHeaderTextColor @@ -142,18 +142,18 @@ ColumnLayout { icon.color: BSStyle.wildBlueColor icon.source: "qrc:/images/folder_icon.png" - icon.width: 20 - icon.height: 16 + icon.width: BSSizes.applyScale(20) + icon.height: BSSizes.applyScale(16) background: Rectangle { - implicitWidth: 160 - implicitHeight: 34 + implicitWidth: BSSizes.applyScale(160) + implicitHeight: BSSizes.applyScale(34) color: "transparent" - radius: 14 + radius: BSSizes.applyScale(14) border.color: BSStyle.defaultBorderColor - border.width: 1 + border.width: BSSizes.applyScale(1) } @@ -176,10 +176,10 @@ ColumnLayout { focus: true text: qsTr("Export") - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - width: 530 + width: BSSizes.applyScale(530) function click_enter() { bsApp.exportWallet(wallet_properties_vm.walletId, bsApp.settingExportDir) diff --git a/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml b/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml index 2904fcfb9..ed06501eb 100644 --- a/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/RenameWallet.qml @@ -10,8 +10,8 @@ ColumnLayout { id: layout - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) anchors.fill: parent @@ -36,13 +36,13 @@ ColumnLayout { id: input Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + input_topMargin: BSSizes.applyScale(35) + title_leftMargin: BSSizes.applyScale(16) + title_topMargin: BSSizes.applyScale(16) activeFocusOnTab: true title_text: qsTr("Wallet Name") @@ -63,16 +63,16 @@ ColumnLayout { RowLayout { id: row - spacing: 10 + spacing: BSSizes.applyScale(10) anchors.bottom: parent.bottom - anchors.bottomMargin: 40 + anchors.bottomMargin: BSSizes.applyScale(40) anchors.horizontalCenter: parent.horizontalCenter CustomButton { id: cancel_but text: qsTr("Cancel") - width: 260 + width: BSSizes.applyScale(260) preferred: false function click_enter() { @@ -83,7 +83,7 @@ ColumnLayout { CustomButton { id: accept_but text: qsTr("Accept") - width: 260 + width: BSSizes.applyScale(260) preferred: true diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 7e3452fed..78f7329fa 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -18,8 +18,8 @@ CustomPopup { property var wallet_properties_vm property bool walletSeedRequested: false - x: mainWindow.x + (mainWindow.width - width)/2 - y: mainWindow.y + (mainWindow.height - height)/2 + x: mainWindow.x + (mainWindow.width - width) / 2 + y: mainWindow.y + (mainWindow.height - height) / 2 RenameWallet { id: rename_wallet @@ -128,14 +128,14 @@ CustomPopup { Rectangle { id: properties - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) color: "transparent" Column { - spacing: 40 - width: parent.width - 48 - height: parent.height - 48 + spacing: BSSizes.applyScale(40) + width: parent.width - BSSizes.applyScale(48) + height: parent.height - BSSizes.applyScale(48) anchors.centerIn: parent @@ -143,16 +143,16 @@ CustomPopup { text: qsTr("Wallet properties") color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) anchors.horizontalCenter: parent.horizontalCenter } Row { - width: parent.width - 75 - spacing: 37 + width: parent.width - BSSizes.applyScale(75) + spacing: BSSizes.applyScale(37) Column { - spacing: 8 + spacing: BSSizes.applyScale(8) width: parent.width / 2 height: parent.height @@ -163,7 +163,7 @@ CustomPopup { text: qsTr("Wallet name") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 } Text { @@ -171,7 +171,7 @@ CustomPopup { text: wallet_properties_vm.walletName color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 horizontalAlignment: Text.AlignRight @@ -181,8 +181,8 @@ CustomPopup { anchors.left: parent.right source: "qrc:/images/edit_wallet_name.png" - width: 32 - height: 16 + width: BSSizes.applyScale(32) + height: BSSizes.applyScale(16) horizontalAlignment: Image.AlignHCenter fillMode: Image.PreserveAspectFit; @@ -205,14 +205,14 @@ CustomPopup { text: qsTr("Wallet type") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 } Text { text: wallet_properties_vm.walletType color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 horizontalAlignment: Text.AlignRight } @@ -225,14 +225,14 @@ CustomPopup { text: qsTr("Wallet ID") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 } Text { text: wallet_properties_vm.walletId color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 horizontalAlignment: Text.AlignRight } @@ -260,14 +260,14 @@ CustomPopup { } Rectangle { - width: 1 - height: 80 + width: BSSizes.applyScale(1) + height: BSSizes.applyScale(80) color: BSStyle.tableSeparatorColor anchors.verticalCenter: parent.verticalCenter } Column { - spacing: 8 + spacing: BSSizes.applyScale(8) width: parent.width / 2 height: parent.height @@ -278,14 +278,14 @@ CustomPopup { text: qsTr("Generated addresses") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 } Text { text: wallet_properties_vm.walletGeneratedAddresses color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 horizontalAlignment: Text.AlignRight } @@ -298,14 +298,14 @@ CustomPopup { text: qsTr("Used addresses") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 } Text { text: wallet_properties_vm.walletUsedAddresses color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 horizontalAlignment: Text.AlignRight } @@ -318,14 +318,14 @@ CustomPopup { text: qsTr("Available UTXOs") color: BSStyle.titleTextColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 } Text { text: wallet_properties_vm.walletAvailableUtxo color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) width: parent.width / 2 horizontalAlignment: Text.AlignRight } @@ -337,7 +337,7 @@ CustomPopup { spacing: 10 width: parent.width height: parent.height * 0.6 - anchors.margins: 24 + anchors.margins: BSSizes.applyScale(24) CustomListItem { width: parent.width diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml index 072231db3..0473aec71 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml @@ -9,8 +9,8 @@ import "../StyledControls" ColumnLayout { id: layout - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) spacing: 0 @@ -28,11 +28,11 @@ ColumnLayout { Layout.fillHeight: true Layout.fillWidth: true - Layout.leftMargin: 25 - Layout.topMargin: 32 + Layout.leftMargin: BSSizes.applyScale(25) + Layout.topMargin: BSSizes.applyScale(32) - cellHeight : 56 - cellWidth : 180 + cellHeight : BSSizes.applyScale(56) + cellWidth : BSSizes.applyScale(180) model: wallet_properties_vm.seed delegate: CustomSeedLabel { @@ -52,10 +52,10 @@ ColumnLayout { text: qsTr("Copy seed") preferred: true - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - width: 530 + width: BSSizes.applyScale(530) onClicked: bsApp.copySeedToClipboard( wallet_properties_vm.seed diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml index 5d461055f..bb09882d0 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeedAuth.qml @@ -9,8 +9,8 @@ import "../StyledControls" ColumnLayout { id: layout - height: 548 - width: 580 + height: BSSizes.applyScale(548) + width: BSSizes.applyScale(580) spacing: 0 @@ -47,13 +47,13 @@ ColumnLayout { id: password Layout.alignment: Qt.AlignCenter - Layout.preferredHeight : 70 - Layout.preferredWidth: 532 - Layout.topMargin: 10 + Layout.preferredHeight : BSSizes.applyScale(70) + Layout.preferredWidth: BSSizes.applyScale(532) + Layout.topMargin: BSSizes.applyScale(10) - input_topMargin: 35 - title_leftMargin: 16 - title_topMargin: 16 + input_topMargin: BSSizes.applyScale(35) + title_leftMargin: BSSizes.applyScale(16) + title_topMargin: BSSizes.applyScale(16) title_text: qsTr("Password") @@ -79,10 +79,10 @@ ColumnLayout { text: qsTr("Continue") preferred: true - Layout.bottomMargin: 40 + Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - width: 530 + width: BSSizes.applyScale(530) enabled: (password.input_text !== "") function click_enter() { diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index c3b4094a8..7675e5542 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -8,6 +8,7 @@ ********************************************************************************** */ + import QtQuick 2 import QtQuick.Controls 2.9 import QtQuick.Layouts 1.3 @@ -26,8 +27,8 @@ import "Plugins/Common" 1 ApplicationWindow { id: mainWindow - minimumWidth: 1200 - minimumHeight: 800 + minimumWidth: BSSizes.applyWindowWidthScale(1200) + minimumHeight: BSSizes.applyWindowHeightScale(800) x: Screen.width / 2 - width / 2 y: Screen.height / 2 - height / 2 @@ -198,24 +199,20 @@ ApplicationWindow { } header: Column { - height: 57 + height: BSSizes.applyScale(57) width: parent.width spacing: 0 RowLayout { - height: 56 + height: BSSizes.applyScale(56) width: parent.width spacing: 0 Image { - width: 129 - height: 24 + width: BSSizes.applyScale(129) + height: BSSizes.applyScale(24) source: "qrc:/images/logo.png" - Layout.leftMargin : 18 - } - - Label { - width: 13 + Layout.leftMargin : BSSizes.applyScale(18) } Label { @@ -223,9 +220,9 @@ ApplicationWindow { } Label { - width: 35 + width: BSSizes.applyScale(35) text: qsTr("Connection: ") - font.pixelSize: 12 + font.pixelSize: BSSizes.applyScale(12) font.family: "Roboto" font.weight: Font.Normal color: BSStyle.titleTextColor @@ -233,13 +230,10 @@ ApplicationWindow { Image { id: imgEnvKind - width: 16 + width: BSSizes.applyScale(16) source: (bsApp.armoryState !== 7) ? "qrc:/images/bitcoin-disabled.png" : ((bsApp.networkType === 0) ? "qrc:/images/bitcoin-main-net.png" : "qrc:/images/bitcoin-test-net.png") - } - - Label { - width: 12 + Layout.rightMargin: BSSizes.applyScale(12) } CustomTitleToolButton { @@ -249,7 +243,7 @@ ApplicationWindow { text: qsTr("Send") icon.source: "qrc:/images/send_icon.png" - font.pixelSize: 12 + font.pixelSize: BSSizes.applyScale(12) font.letterSpacing: 0.3 Layout.fillHeight: true @@ -267,7 +261,7 @@ ApplicationWindow { text: qsTr("Receive") icon.source: "qrc:/images/receive_icon.png" - font.pixelSize: 12 + font.pixelSize: BSSizes.applyScale(12) font.letterSpacing: 0.3 Layout.fillHeight: true @@ -281,7 +275,7 @@ ApplicationWindow { CustomTitleToolButton { id: btnSettings text: qsTr("Settings") - font.pixelSize: 12 + font.pixelSize: BSSizes.applyScale(12) font.letterSpacing: 0.3 icon.source: "qrc:/images/settings_icon.png" onClicked: { @@ -293,7 +287,7 @@ ApplicationWindow { Rectangle { width: parent.width - height: 1 + height: BSSizes.applyScale(1) color: BSStyle.defaultGreyColor } } @@ -351,7 +345,7 @@ ApplicationWindow { } footer: Rectangle { - height: 56 + height: BSSizes.applyScale(56) width: parent.width color :"#191E2A" diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index 72ad8239e..e0ffe432b 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -19,7 +19,6 @@ qml/ExplorerEmpty.qml qml/ExplorerAddress.qml qml/ExplorerTX.qml - qml/ImportSeedPhrase.qml qml/VerifyTX.qml qml/InfoBanner.qml qml/InfoBannerComponent.qml @@ -43,6 +42,7 @@ qml/StyledControls/CustomTextInput.qml qml/StyledControls/qmldir qml/BsStyles/BSStyle.qml + qml/BsStyles/BSSizes.qml qml/BsStyles/qmldir qml/StyledControls/CustomTitleToolButton.qml images/logo.png From 920d902a39e537f4c5197e979aff926808589f02 Mon Sep 17 00:00:00 2001 From: yz Date: Wed, 12 Apr 2023 17:09:11 +0300 Subject: [PATCH 349/436] Plugin scaling --- GUI/QtQuick/qml/ExplorerEmpty.qml | 2 +- GUI/QtQuick/qml/Plugins/Common/Card.qml | 20 ++--- .../qml/Plugins/Common/PluginPopup.qml | 4 +- .../qml/Plugins/Common/PluginsPage.qml | 20 ++--- .../qml/Plugins/SideShift/SideShiftButton.qml | 10 ++- .../Plugins/SideShift/SideShiftBuyPage.qml | 75 +++++++++-------- .../Plugins/SideShift/SideShiftCombobox.qml | 24 +++--- .../SideShift/SideShiftComboboxWithIcon.qml | 84 +++++++++---------- .../Plugins/SideShift/SideShiftCopyButton.qml | 13 +-- .../Plugins/SideShift/SideShiftIconButton.qml | 5 +- .../Plugins/SideShift/SideShiftMainPage.qml | 23 +++-- .../qml/Plugins/SideShift/SideShiftPopup.qml | 9 +- .../Plugins/SideShift/SideShiftTextInput.qml | 8 +- .../SideSwap/Controls/CurrencyLabel.qml | 15 ++-- .../Controls/CustomBorderedButton.qml | 9 +- .../SideSwap/Controls/CustomButton.qml | 9 +- .../SideSwap/Controls/CustomCombobox.qml | 34 ++++---- .../SideSwap/Controls/CustomSwitch.qml | 1 + .../SideSwap/Controls/CustomTextEdit.qml | 23 ++--- .../Plugins/SideSwap/Controls/IconButton.qml | 5 +- .../qml/Plugins/SideSwap/SideSwapMainPage.qml | 59 ++++++------- .../qml/Plugins/SideSwap/SideSwapPegIn.qml | 7 +- .../qml/Plugins/SideSwap/SideSwapPegOut.qml | 53 ++++++------ .../qml/Plugins/SideSwap/SideSwapPopup.qml | 6 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 11 +-- .../qml/Send/SignTransactionAdvanced.qml | 4 +- .../qml/StyledControls/CustomListItem.qml | 2 +- .../qml/StyledControls/CustomTextInput.qml | 2 +- 28 files changed, 286 insertions(+), 251 deletions(-) diff --git a/GUI/QtQuick/qml/ExplorerEmpty.qml b/GUI/QtQuick/qml/ExplorerEmpty.qml index a94757d67..9dbf8ce3b 100644 --- a/GUI/QtQuick/qml/ExplorerEmpty.qml +++ b/GUI/QtQuick/qml/ExplorerEmpty.qml @@ -17,11 +17,11 @@ import "BsStyles" Item { anchors.fill: parent - anchors.topMargin: BSSizes.applyScale(226) Column { spacing: BSSizes.applyScale(24) anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter Image { width: BSSizes.applyScale(57) diff --git a/GUI/QtQuick/qml/Plugins/Common/Card.qml b/GUI/QtQuick/qml/Plugins/Common/Card.qml index a067b1977..f884ca18f 100644 --- a/GUI/QtQuick/qml/Plugins/Common/Card.qml +++ b/GUI/QtQuick/qml/Plugins/Common/Card.qml @@ -14,10 +14,10 @@ import "../../BsStyles" Rectangle { id: control - width: 217 - height: 292 + width: BSSizes.applyScale(217) + height: BSSizes.applyScale(292) color: "transparent" - radius: 14 + radius: BSSizes.applyScale(14) border.width: 1 border.color: BSStyle.defaultGreyColor @@ -28,21 +28,21 @@ Rectangle { signal cardClicked() Column { - spacing: 8 + spacing: BSSizes.applyScale(8) anchors.fill: parent - anchors.margins: 12 + anchors.margins: BSSizes.applyScale(12) Image { id: card_icon - width: 193 - height: 122 + width: BSSizes.applyScale(193) + height: BSSizes.applyScale(122) } Text { id: title_item - topPadding: 10 + topPadding: BSSizes.applyScale(10) font.family: "Roboto" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.weight: Font.DemiBold font.letterSpacing: 0.3 color: BSStyle.titanWhiteColor @@ -52,7 +52,7 @@ Rectangle { Text { id: description_item font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.letterSpacing: 0.3 color: BSStyle.titleTextColor width: parent.width diff --git a/GUI/QtQuick/qml/Plugins/Common/PluginPopup.qml b/GUI/QtQuick/qml/Plugins/Common/PluginPopup.qml index ddbe98fb9..58c28e139 100644 --- a/GUI/QtQuick/qml/Plugins/Common/PluginPopup.qml +++ b/GUI/QtQuick/qml/Plugins/Common/PluginPopup.qml @@ -16,8 +16,8 @@ import "../../StyledControls" Popup { id: plugin_popup - width: 580 - height: 720 + width: BSSizes.applyWindowWidthScale(580) + height: BSSizes.applyWindowHeightScale(720) anchors.centerIn: Overlay.overlay property var controller: null diff --git a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml index b2cd3f926..4d6a573bd 100644 --- a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml +++ b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml @@ -18,31 +18,29 @@ import "../../StyledControls" Rectangle { id: root - width: 1200 - height: 768 color: "transparent" Column { anchors.fill: parent - anchors.leftMargin: 14 + anchors.leftMargin: BSSizes.applyScale(14) Rectangle { id: header width: parent.width - height: 76 + height: BSSizes.applyScale(76) color: "transparent" Row { - spacing: 6 + spacing: BSSizes.applyScale(6) anchors.fill: parent Text { height: parent.height - width: 110 + width: BSSizes.applyScale(110) text: qsTr("Apps") color: BSStyle.textColor font.family: "Roboto" - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.weight: Font.Bold font.letterSpacing: 0.35 horizontalAlignment: Text.AlignHCenter @@ -54,8 +52,8 @@ Rectangle { GridView { width: parent.width height: parent.height - header.height - cellWidth: 237 - cellHeight: 302 + cellWidth: BSSizes.applyScale(237) + cellHeight: BSSizes.applyScale(302) model: pluginsListModel clip: true @@ -67,8 +65,8 @@ Rectangle { delegate: Rectangle { id: plugin_item color: "transparent" - width: 237 - height: 302 + width: BSSizes.applyScale(237) + height: BSSizes.applyScale(302) property var component property var plugin_popup diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml index 43f5c946c..23ffdfcc9 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftButton.qml @@ -11,14 +11,16 @@ import QtQuick 2.15 import QtQuick.Controls 2.3 +import "../../BsStyles" + Button { id: control - width: 150 - height: 50 + width: BSSizes.applyScale(150) + height: BSSizes.applyScale(50) - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.letterSpacing: 0.5 @@ -28,7 +30,7 @@ Button { background: Rectangle { id: backgroundItem color: control.enabled ? "#f05c44" : "black" - radius: 4 + radius: BSSizes.applyScale(4) border.color: (enabled ? "transparent" : diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml index 49e027ab4..0f09c6160 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftBuyPage.qml @@ -14,10 +14,13 @@ import QtQuick.Controls 2.12 import "." import "../../" +import "../../BsStyles" Item { id: root + width: BSSizes.applyWindowWidthScale(620) + height: BSSizes.applyWindowHeightScale(720) property var controller property string inputCurrency @@ -26,24 +29,25 @@ Item { Rectangle { anchors.fill: parent + radius: BSSizes.applyScale(14) color: "black" } Column { anchors.fill: parent - anchors.leftMargin: 60 - anchors.rightMargin: 60 - anchors.topMargin: 25 - anchors.bottomMargin: 25 + anchors.leftMargin: BSSizes.applyScale(60) + anchors.rightMargin: BSSizes.applyScale(60) + anchors.topMargin: BSSizes.applyScale(25) + anchors.bottomMargin: BSSizes.applyScale(25) spacing: 0 Rectangle { color: "transparent" - height: 40 + height: BSSizes.applyScale(40) width: parent.width Row { - spacing: 10 + spacing: BSSizes.applyScale(10) anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter @@ -56,10 +60,10 @@ Item { Image { id: arrowImage - width: 20 - height: 12 - sourceSize.width: 20 - sourceSize.height: 12 + width: BSSizes.applyScale(20) + height: BSSizes.applyScale(12) + sourceSize.width: BSSizes.applyScale(20) + sourceSize.height: BSSizes.applyScale(12) source: "qrc:/images/sideshift_right_arrow.svg" anchors.verticalCenter: parent.verticalCenter } @@ -95,15 +99,16 @@ Item { Text { color: "white" text: controller !== null ? controller.status : "" - topPadding: 40 + topPadding: BSSizes.applyScale(40) wrapMode: Text.Wrap - font.pixelSize: 24 + font.pixelSize: BSSizes.applyScale(24) anchors.horizontalCenter: parent.horizontalCenter width: parent.width + horizontalAlignment: Text.AlignHCenter } Text { - topPadding: 15 + topPadding: BSSizes.applyScale(15) color: "lightgray" text: controller !== null ? controller.conversionRate : "" anchors.horizontalCenter: parent.horizontalCenter @@ -111,11 +116,11 @@ Item { Rectangle { width: parent.width - height: 300 + height: BSSizes.applyScale(300) color: "transparent" Column { - spacing: 10 + spacing: BSSizes.applyScale(10) width: parent.width / 2 anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter @@ -123,12 +128,12 @@ Item { Text { text: qsTr("PLEASE SEND") color: "lightgray" - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) anchors.horizontalCenter: parent.horizontalCenter } Row { - spacing: 10 + spacing: BSSizes.applyScale(10) anchors.horizontalCenter: parent.horizontalCenter Text { text: qsTr("Min") @@ -139,18 +144,18 @@ Item { text: controller !== null ? controller.minAmount : "" color: "white" font.weight: Font.Bold - font.pixelSize: 18 + font.pixelSize: BSSizes.applyScale(18) } Text { text: root.inputCurrency color: "white" font.weight: Font.Bold - font.pixelSize: 18 + font.pixelSize: BSSizes.applyScale(18) } } Row { - spacing: 10 + spacing: BSSizes.applyScale(10) anchors.horizontalCenter: parent.horizontalCenter Text { text: qsTr("Max") @@ -161,29 +166,29 @@ Item { text: controller !== null ? controller.maxAmount : "" color: "white" font.weight: Font.Bold - font.pixelSize: 18 + font.pixelSize: BSSizes.applyScale(18) } Text { text: root.inputCurrency color: "white" font.weight: Font.Bold - font.pixelSize: 18 + font.pixelSize: BSSizes.applyScale(18) } } Text { - topPadding: 20 + topPadding: BSSizes.applyScale(20) text: qsTr("TO ADDRESS") color: "lightgray" - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) anchors.horizontalCenter: parent.horizontalCenter } Rectangle { - height: 40 - width: 200 + height: BSSizes.applyScale(40) + width: BSSizes.applyScale(200) color: "transparent" - radius: 4 + radius: BSSizes.applyScale(4) border.width: 1 border.color: "white" anchors.horizontalCenter: parent.horizontalCenter @@ -196,8 +201,8 @@ Item { clip: true font.weight: Font.Bold verticalAlignment: Text.AlignVCenter - anchors.leftMargin: 20 - anchors.rightMargin: 20 + anchors.leftMargin: BSSizes.applyScale(20) + anchors.rightMargin: BSSizes.applyScale(20) enabled: false } } @@ -226,17 +231,17 @@ Item { anchors.verticalCenter: parent.verticalCenter Rectangle { - width: 200 - height: 200 + width: BSSizes.applyScale(200) + height: BSSizes.applyScale(200) color: "gray" anchors.horizontalCenter: parent.horizontalCenter Image { source: controller !== null ? ( "image://QR/" + controller.depositAddress) : "" - sourceSize.width: 180 - sourceSize.height: 180 - width: 180 - height: 180 + sourceSize.width: BSSizes.applyScale(180) + sourceSize.height: BSSizes.applyScale(180) + width: BSSizes.applyScale(180) + height: BSSizes.applyScale(180) anchors.centerIn: parent } } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml index 79efc915f..d8a7b9978 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCombobox.qml @@ -17,8 +17,8 @@ import "../../BsStyles" ComboBox { id: control - width: 400 - height: 50 + width: BSSizes.applyScale(400) + height: BSSizes.applyScale(50) activeFocusOnTab: true @@ -29,7 +29,7 @@ ComboBox { Text { anchors.fill: parent text: control.currentText - font.pixelSize: 18 + font.pixelSize: BSSizes.applyScale(18) font.family: "Roboto" font.weight: Font.Bold color: "white" @@ -45,7 +45,7 @@ ComboBox { color: "#181414" opacity: 1 - radius: 4 + radius: BSSizes.applyScale(4) border.color: control.popup.visible ? "white" : (control.hovered ? "white" : @@ -60,12 +60,12 @@ ComboBox { id: menuItem - width: control.width - 12 - height: 50 + width: control.width - BSSizes.applyScale(12) + height: BSSizes.applyScale(50) - leftPadding: 6 - topPadding: 4 - bottomPadding: 4 + leftPadding: BSSizes.applyScale(6) + topPadding: BSSizes.applyScale(4) + bottomPadding: BSSizes.applyScale(4) contentItem: Text { @@ -73,7 +73,7 @@ ComboBox { ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData color: "white" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal @@ -96,7 +96,7 @@ ComboBox { y: control.height - 1 width: control.width - padding: 6 + padding: BSSizes.applyScale(6) contentItem: ListView { id: popup_item @@ -112,7 +112,7 @@ ComboBox { background: Rectangle { color: "black" - radius: 4 + radius: BSSizes.applyScale(4) border.width: 1 border.color: "white" diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml index 26bb76e8b..f2f02dbae 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml @@ -17,11 +17,11 @@ import "../../BsStyles" ComboBox { id: control - width: 200 - height: 200 + width: BSSizes.applyScale(200) + height: BSSizes.applyScale(200) property string controlHint: "123" - property int popupWidth: 400 + property int popupWidth: BSSizes.applyScale(400) textRole: "coin" valueRole: "network" @@ -34,31 +34,31 @@ ComboBox { color: "transparent" Column { - spacing: 8 + spacing: BSSizes.applyScale(8) anchors.centerIn: parent Image { - width: 80 - height: 80 - sourceSize.width: 80 - sourceSize.height: 80 + width: BSSizes.applyScale(80) + height: BSSizes.applyScale(80) + sourceSize.width: BSSizes.applyScale(80) + sourceSize.height: BSSizes.applyScale(80) source: "image://coin/" + control.currentText + "-" + control.currentValue anchors.horizontalCenter: parent.horizontalCenter } Text { text: control.controlHint - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal color: "white" - topPadding: 15 + topPadding: BSSizes.applyScale(15) anchors.horizontalCenter: parent.horizontalCenter } Text { text: control.currentText - font.pixelSize: 18 + font.pixelSize: BSSizes.applyScale(18) font.family: "Roboto" font.weight: Font.Bold color: "white" @@ -74,7 +74,7 @@ ComboBox { color: "#181414" opacity: 1 - radius: 14 + radius: BSSizes.applyScale(14) border.color: control.popup.visible ? "white" : (control.hovered ? "white" : @@ -89,53 +89,53 @@ ComboBox { id: menuItem - width: control.popupWidth - 12 - height: 80 + width: control.popupWidth - BSSizes.applyScale(12) + height: BSSizes.applyScale(80) - leftPadding: 6 - topPadding: 4 - bottomPadding: 4 + leftPadding: BSSizes.applyScale(6) + topPadding: BSSizes.applyScale(4) + bottomPadding: BSSizes.applyScale(4) contentItem: Rectangle { anchors.fill: parent - anchors.leftMargin: 10 - anchors.rightMargin: 10 + anchors.leftMargin: BSSizes.applyScale(10) + anchors.rightMargin: BSSizes.applyScale(10) color: "transparent" Row { - spacing: 10 + spacing: BSSizes.applyScale(10) anchors.fill: parent - anchors.leftMargin: 10 + anchors.leftMargin: BSSizes.applyScale(10) Image { - width: 40 - height: 40 - sourceSize.width: 40 - sourceSize.height: 40 + width: BSSizes.applyScale(40) + height: BSSizes.applyScale(40) + sourceSize.width: BSSizes.applyScale(40) + sourceSize.height: BSSizes.applyScale(40) source: "image://coin/" + model["coin"] + "-" + model["network"] anchors.verticalCenter: parent.verticalCenter } Column { - spacing: 10 - width: parent.width - 50 + spacing: BSSizes.applyScale(10) + width: parent.width - BSSizes.applyScale(50) anchors.verticalCenter: parent.verticalCenter Text { text: model["name"] color: "white" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.SemiBold } Row { - spacing: 10 + spacing: BSSizes.applyScale(10) Text { text: model["coin"] color: "white" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -143,7 +143,7 @@ ComboBox { Text { text: model["network"] color: "white" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal } @@ -157,11 +157,11 @@ ComboBox { background: Rectangle { anchors.fill: parent - anchors.leftMargin: 10 - anchors.rightMargin: 10 + anchors.leftMargin: BSSizes.applyScale(10) + anchors.rightMargin: BSSizes.applyScale(10) color: menuItem.highlighted ? "white" : "transparent" opacity: menuItem.highlighted ? 0.2 : 1 - radius: 4 + radius: BSSizes.applyScale(4) } } @@ -170,8 +170,8 @@ ComboBox { y: 0 width: control.popupWidth - height: 400 - padding: 6 + height: BSSizes.applyScale(400) + padding: BSSizes.applyScale(6) contentItem: Rectangle { color: "transparent" @@ -182,21 +182,21 @@ ComboBox { Rectangle { width: parent.width - height: 80 + height: BSSizes.applyScale(80) color: "transparent" Rectangle { anchors.fill: parent - anchors.margins: 10 + anchors.margins: BSSizes.applyScale(10) color: "transparent" border.color: "white" - radius: 10 + radius: BSSizes.applyScale(10) } TextInput { anchors.fill: parent color: "white" - leftPadding: 20 + leftPadding: BSSizes.applyScale(20) verticalAlignment: Text.AlignVCenter onTextEdited: control.model.filter = text @@ -206,7 +206,7 @@ ComboBox { ListView { id: popup_item width: parent.width - height: parent.height - 80 + height: parent.height - BSSizes.applyScale(80) clip: true model: control.popup.visible ? control.delegateModel : null @@ -221,7 +221,7 @@ ComboBox { background: Rectangle { color: "black" - radius: 14 + radius: BSSizes.applyScale(14) border.width: 1 border.color: "white" diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCopyButton.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCopyButton.qml index 093afd5f8..3723cab5a 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCopyButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftCopyButton.qml @@ -10,15 +10,16 @@ */ import QtQuick 2.15 import QtQuick.Controls 2.3 +import "../../BsStyles" Button { id: control - width: 150 - height: 50 + width: BSSizes.applyScale(150) + height: BSSizes.applyScale(50) - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Bold @@ -30,12 +31,12 @@ Button { } contentItem: Row { - spacing: 5 + spacing: BSSizes.applyScale(5) anchors.fill: parent Image { - width: 20 - height: 20 + width: BSSizes.applyScale(20) + height: BSSizes.applyScale(20) source: "qrc:/images/copy_icon.svg" } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftIconButton.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftIconButton.qml index 3d43497ac..341432982 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftIconButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftIconButton.qml @@ -11,11 +11,12 @@ import QtQuick 2.15 import QtQuick.Window 2.2 import QtQuick.Controls 2.12 +import "../../BsStyles" Rectangle { id: control - width: 40 - height: 40 + width: BSSizes.applyScale(40) + height: BSSizes.applyScale(40) color: "transparent" activeFocusOnTab: true diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml index 0ec59b27a..3c0baba33 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftMainPage.qml @@ -14,10 +14,13 @@ import QtQuick.Controls 2.12 import "." import "../../" +import "../../BsStyles" Item { id: root + width: BSSizes.applyWindowWidthScale(620) + height: BSSizes.applyWindowHeightScale(720) property var controller property bool receive: true @@ -30,25 +33,31 @@ Item { signal shift() + Rectangle { + anchors.fill: parent + radius: BSSizes.applyScale(14) + color: "black" + } + Column { anchors.centerIn: parent - spacing: 20 + spacing: BSSizes.applyScale(20) Text { text: controller !== null ? controller.conversionRate : "" color: "gray" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" anchors.horizontalCenter: parent.horizontalCenter } Row { - spacing: 20 + spacing: BSSizes.applyScale(20) anchors.horizontalCenter: parent.horizontalCenter SideShiftComboboxWithIcon { id: inputCombobox - popupWidth: 400 + popupWidth: BSSizes.applyScale(400) controlHint: qsTr("YOU SEND") model: root.receive ? root.receiveModel : root.sendModel enabled: root.receive @@ -72,7 +81,7 @@ Item { SideShiftComboboxWithIcon { id: receivingCombobox - popupWidth: 400 + popupWidth: BSSizes.applyScale(400) controlHint: qsTr("YOU RECEIVE") model: root.receive ? root.sendModel : root.receiveModel enabled: !root.receive @@ -82,13 +91,13 @@ Item { Item { width: 1 - height: 20 + height: BSSizes.applyScale(20) } Text { text: qsTr("RECEIVING ADDRESS") color: "white" - font.pixelSize: 20 + font.pixelSize: BSSizes.applyScale(20) font.family: "Roboto" anchors.horizontalCenter: parent.horizontalCenter } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml index 3344edf93..a8b7c6bec 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml @@ -15,15 +15,16 @@ import QtQuick.Controls 2.12 import "." import "../Common" import "../../" +import "../../BsStyles" PluginPopup { id: root property var controller: null background: Rectangle { - anchors.fill: parent - color: "black" - radius: 14 + width: root.width + height: root.height + color: "transparent" } contentItem: StackView { @@ -41,6 +42,7 @@ PluginPopup { } controller: root.controller visible: false + anchors.centerIn: parent } SideShiftBuyPage { @@ -51,6 +53,7 @@ PluginPopup { inputCurrency: mainPage.inputCurrency outputCurrency: mainPage.outputCurrency receivingAddress: mainPage.receivingAddress + anchors.centerIn: parent } } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml index a77d552a9..6e19ed7ac 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftTextInput.qml @@ -12,11 +12,13 @@ import QtQuick 2.15 import QtQuick.Window 2.2 import QtQuick.Controls 2.12 +import "../../BsStyles" + Rectangle { id: control - width: 400 - height: 50 - radius: 4 + width: BSSizes.applyScale(400) + height: BSSizes.applyScale(50) + radius: BSSizes.applyScale(4) color: "#181414" border.width: 1 border.color: (mouseArea.containsMouse || control.activeFocus) ? "white" : "gray" diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CurrencyLabel.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CurrencyLabel.qml index d2239aa01..dcfa07ec5 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CurrencyLabel.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CurrencyLabel.qml @@ -11,6 +11,7 @@ import QtQuick 2.15 import "../Styles" +import "../../../BsStyles" Column { property string header_text @@ -18,28 +19,28 @@ Column { property string currency_icon property string comment - spacing: 10 + spacing: BSSizes.applyScale(10) Text { text: header_text font.family: "Roboto" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) color: SideSwapStyles.secondaryTextColor } Row { - spacing: 10 + spacing: BSSizes.applyScale(10) Image { source: currency_icon - width: 24 - height: 24 + width: BSSizes.applyScale(24) + height: BSSizes.applyScale(24) } Text { text: currency font.family: "Roboto" - font.pixelSize: 18 + font.pixelSize: BSSizes.applyScale(18) color: SideSwapStyles.primaryTextColor } } @@ -48,7 +49,7 @@ Column { Text { text: comment font.family: "Roboto" - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) color: SideSwapStyles.paragraphTextColor } } diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml index db1fc2c9f..92387be0e 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml @@ -12,15 +12,16 @@ import QtQuick 2.15 import QtQuick.Controls 2.3 import "../Styles" +import "../../../BsStyles" Button { id: control - width: 150 - height: 50 + width: BSSizes.applyScale(150) + height: BSSizes.applyScale(50) focusPolicy: Qt.NoFocus - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.weight: Font.Bold font.letterSpacing: 0.5 @@ -31,7 +32,7 @@ Button { background: Rectangle { id: backgroundItem color: "transparent" - radius: 8 + radius: BSSizes.applyScale(8) border.width: 1 border.color: SideSwapStyles.buttonBackground } diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml index 6b16b1010..2230069f2 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomButton.qml @@ -12,17 +12,18 @@ import QtQuick 2.15 import QtQuick.Controls 2.3 import "../Styles" +import "../../../BsStyles" Button { id: control - width: 150 - height: 50 + width: BSSizes.applyScale(150) + height: BSSizes.applyScale(50) focusPolicy: Qt.NoFocus property bool active: true - font.pixelSize: 16 + font.pixelSize: BSSizes.applyScale(16) font.family: "Roboto" font.letterSpacing: 0.5 @@ -32,7 +33,7 @@ Button { background: Rectangle { id: backgroundItem color: control.active ? SideSwapStyles.buttonBackground : SideSwapStyles.buttonSecondaryBackground - radius: 8 + radius: BSSizes.applyScale(8) } contentItem: Text { diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml index 054dfa586..0d196d32c 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml @@ -18,8 +18,8 @@ import "../../../BsStyles" ComboBox { id: control - width: 400 - height: 50 + width: BSSizes.applyScale(400) + height: BSSizes.applyScale(50) activeFocusOnTab: true @@ -31,24 +31,24 @@ ComboBox { color: "transparent" Column { - spacing: 4 + spacing: BSSizes.applyScale(4) anchors.verticalCenter: parent.verticalCenter Text { text: control.comboboxHint - font.pixelSize: 12 + font.pixelSize: BSSizes.applyScale(12) font.family: "Roboto" font.weight: Font.Bold color: SideSwapStyles.secondaryTextColor - leftPadding: 10 + leftPadding: BSSizes.applyScale(10) } Text { text: control.currentText - font.pixelSize: 18 + font.pixelSize: BSSizes.applyScale(18) font.family: "Roboto" color: "white" - leftPadding: 10 + leftPadding: BSSizes.applyScale(10) } } } @@ -59,7 +59,7 @@ ComboBox { color: SideSwapStyles.buttonSecondaryBackground opacity: 1 - radius: 4 + radius: BSSizes.applyScale(4) border.color: control.popup.visible ? SideSwapStyles.buttonBackground : (control.hovered ? SideSwapStyles.buttonBackground : @@ -74,12 +74,12 @@ ComboBox { id: menuItem - width: control.width - 12 - height: 50 + width: control.width - BSSizes.applyScale(12) + height: BSSizes.applyScale(50) - leftPadding: 6 - topPadding: 4 - bottomPadding: 4 + leftPadding: BSSizes.applyScale(6) + topPadding: BSSizes.applyScale(4) + bottomPadding: BSSizes.applyScale(4) contentItem: Text { @@ -87,7 +87,7 @@ ComboBox { ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData color: "white" - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" font.weight: Font.Normal @@ -101,7 +101,7 @@ ComboBox { background: Rectangle { color: menuItem.highlighted ? "white" : "transparent" opacity: menuItem.highlighted ? 0.2 : 1 - radius: 4 + radius: BSSizes.applyScale(4) } } @@ -110,7 +110,7 @@ ComboBox { y: control.height - 1 width: control.width - padding: 6 + padding: BSSizes.applyScale(6) contentItem: ListView { id: popup_item @@ -126,7 +126,7 @@ ComboBox { background: Rectangle { color: SideSwapStyles.buttonSecondaryBackground - radius: 4 + radius: BSSizes.applyScale(4) border.width: 1 border.color: SideSwapStyles.spacerColor diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml index ebc6ce13c..f5dccddbe 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomSwitch.qml @@ -12,6 +12,7 @@ import QtQuick 2.15 import QtQuick.Controls 2.3 import "../Styles" +import "../../../BsStyles" Rectangle { id: root diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml index cf389c177..cb200e254 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml @@ -13,12 +13,13 @@ import QtQuick.Window 2.2 import QtQuick.Controls 2.12 import "../Styles" +import "../../../BsStyles" Rectangle { id: control - width: 400 - height: 50 - radius: 12 + width: BSSizes.applyScale(400) + height: BSSizes.applyScale(50) + radius: BSSizes.applyScale(12) color: SideSwapStyles.darkBlueBackground border.width: 1 border.color: textEdit.activeFocus ? SideSwapStyles.buttonBackground : SideSwapStyles.spacerColor @@ -32,22 +33,22 @@ Rectangle { TextInput { id: textEdit color: "white" - leftPadding: 10 - topPadding: 32 - rightPadding: 10 - bottomPadding: 10 + leftPadding: BSSizes.applyScale(10) + topPadding: BSSizes.applyScale(32) + rightPadding: BSSizes.applyScale(10) + bottomPadding: BSSizes.applyScale(10) clip: true anchors.fill: parent - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) font.family: control.fontFamily Text { text: control.textHint color: SideSwapStyles.secondaryTextColor font.family: control.fontFamily - font.pixelSize: 12 - leftPadding: 10 - topPadding: 10 + font.pixelSize: BSSizes.applyScale(12) + leftPadding: BSSizes.applyScale(10) + topPadding: BSSizes.applyScale(10) } } diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml index 09a861e1e..22d47af86 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/IconButton.qml @@ -13,11 +13,12 @@ import QtQuick.Window 2.2 import QtQuick.Controls 2.12 import "../Styles" +import "../../../BsStyles" Rectangle { id: control - width: 50 - height: 50 + width: BSSizes.applyScale(50) + height: BSSizes.applyScale(50) color: SideSwapStyles.buttonBackground activeFocusOnTab: true diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml index 688712556..decf52e42 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml @@ -16,12 +16,13 @@ import "." import "Styles" import "Controls" import "../../" +import "../../BsStyles" Item { id: root - width: 620 - height: 720 + width: BSSizes.applyWindowWidthScale(620) + height: BSSizes.applyWindowHeightScale(720) property bool peg_in: true @@ -35,7 +36,7 @@ Item { Rectangle { id: topPanel width: parent.width - height: 290 + height: BSSizes.applyScale(290) anchors.top: parent.top color: SideSwapStyles.darkBlueBackground } @@ -48,15 +49,15 @@ Item { } Column { - spacing: 20 + spacing: BSSizes.applyScale(20) anchors.fill: parent - anchors.topMargin: 40 - anchors.rightMargin: 20 - anchors.leftMargin: 20 + anchors.topMargin: BSSizes.applyScale(40) + anchors.rightMargin: BSSizes.applyScale(20) + anchors.leftMargin: BSSizes.applyScale(20) CustomSwitch { width: parent.width - height: 30 + height: BSSizes.applyScale(30) anchors.horizontalCenter: parent.horizontalCenter checked: root.peg_in @@ -73,42 +74,42 @@ Item { } Rectangle { - height: 2 + height: BSSizes.applyScale(2) width: parent.width color: SideSwapStyles.spacerColor } Text { text: qsTr("SideSwap will generate a Peg-In address for you to deliver BTC into. Each peg-in/out URL is unique and can be re-entered to view your progress. A peg-in/out address may be re-used.") - width: parent.width - 20 + width: parent.width - BSSizes.applyScale(20) color: SideSwapStyles.paragraphTextColor clip: true wrapMode: Text.Wrap } Row { - spacing: 20 + spacing: BSSizes.applyScale(20) width: parent.width - height: 50 + height: BSSizes.applyScale(50) IconButton { - width: 50 - height: 50 - radius: 25 + width: BSSizes.applyScale(50) + height: BSSizes.applyScale(50) + radius: BSSizes.applyScale(25) onButtonClicked: root.peg_in = !root.peg_in } Rectangle { - width: 200 - height: 30 - radius: 15 + width: BSSizes.applyScale(200) + height: BSSizes.applyScale(30) + radius: BSSizes.applyScale(15) color: "lightblue" anchors.verticalCenter: parent.verticalCenter Rectangle { - width: 15 - height: 15 + width: BSSizes.applyScale(15) + height: BSSizes.applyScale(15) anchors.left: parent.left anchors.top: parent.top color: "lightblue" @@ -123,8 +124,8 @@ Item { } Row { - spacing: 20 - height: 60 + spacing: BSSizes.applyScale(20) + height: BSSizes.applyScale(60) width: parent.width CurrencyLabel { @@ -140,8 +141,8 @@ Item { CustomCombobox { model: ['A', 'B', 'C'] - height: 60 - width: parent.width - receiveLabel.width - 20 + height: BSSizes.applyScale(60) + width: parent.width - receiveLabel.width - BSSizes.applyScale(20) anchors.verticalCenter: parent.verticalCenter visible: !root.peg_in comboboxHint: qsTr("Fee suggestion") @@ -149,17 +150,17 @@ Item { } Rectangle { - height: 2 + height: BSSizes.applyScale(2) width: parent.width color: SideSwapStyles.spacerColor } Column { width: parent.width - spacing: 5 + spacing: BSSizes.applyScale(5) CustomCombobox { - height: 60 + height: BSSizes.applyScale(60) width: parent.width model: walletBalances textRole: "name" @@ -170,7 +171,7 @@ Item { CustomTextEdit { id: amountInput width: parent.width - height: 60 + height: BSSizes.applyScale(60) textHint: qsTr("Amount") visible: root.peg_in inputHints: Text.ImhDigitsOnly @@ -179,7 +180,7 @@ Item { CustomTextEdit { id: addressInput width: parent.width - height: 60 + height: BSSizes.applyScale(60) textHint: qsTr("Your Liquid Address") visible: root.peg_in } diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml index 0d8002eab..726b823ef 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml @@ -16,12 +16,13 @@ import "." import "Styles" import "Controls" import "../../" +import "../../BsStyles" Item { id: root - width: 620 - height: 720 + width: BSSizes.applyWindowWidthScale(620) + height: BSSizes.applyWindowHeightScale(720) signal back() @@ -32,7 +33,7 @@ Item { Column { anchors.fill: parent - anchors.margins: 20 + anchors.margins: BSSizes.applyScale(20) CustomBorderedButton { width: parent.width diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml index 5fb6bc9ca..6b3c32b75 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegOut.qml @@ -16,12 +16,13 @@ import "." import "Styles" import "Controls" import "../../" +import "../../BsStyles" Item { id: root - width: 620 - height: 720 + width: BSSizes.applyWindowWidthScale(620) + height: BSSizes.applyWindowHeightScale(720) property string minTransferAmount: qsTr("0.001") property string toAddress: "bc1qvrl85pygns90xut25qu0tpmawm9h03j3d9w94a" @@ -35,22 +36,22 @@ Item { } Column { - spacing: 30 + spacing: BSSizes.applyScale(30) anchors.fill: parent - anchors.margins: 20 + anchors.margins: BSSizes.applyScale(20) Text { text: qsTr("Send L-BTC to the following address:") color: SideSwapStyles.primaryTextColor - font.pixelSize: 24 + font.pixelSize: BSSizes.applyScale(24) anchors.horizontalCenter: parent.horizontalCenter - topPadding: 20 + topPadding: BSSizes.applyScale(20) } Text { text: qsTr("Min amount: ") + minTransferAmount color: SideSwapStyles.primaryTextColor - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) anchors.horizontalCenter: parent.horizontalCenter } @@ -61,33 +62,33 @@ Item { } Row { - spacing: 20 + spacing: BSSizes.applyScale(20) width: parent.width - height: 300 + height: BSSizes.applyScale(300) Item { width: parent.width / 2 - parent.spacing height: parent.height Rectangle { - width: 240 - height: 240 - radius: 20 + width: BSSizes.applyScale(240) + height: BSSizes.applyScale(240) + radius: BSSizes.applyScale(20) color: SideSwapStyles.buttonBackground anchors.centerIn: parent Rectangle { - width: 226 - height: 226 - radius: 16 + width: BSSizes.applyScale(226) + height: BSSizes.applyScale(226) + radius: BSSizes.applyScale(16) anchors.centerIn: parent Image { source: "image://QR/" + root.toAddress - sourceSize.width: 220 - sourceSize.height: 220 - width: 220 - height: 220 + sourceSize.width: BSSizes.applyScale(220) + sourceSize.height: BSSizes.applyScale(220) + width: BSSizes.applyScale(220) + height: BSSizes.applyScale(220) anchors.centerIn: parent } } @@ -99,14 +100,14 @@ Item { height: parent.height Column { - spacing: 20 + spacing: BSSizes.applyScale(20) anchors.fill: parent - anchors.margins: 20 + anchors.margins: BSSizes.applyScale(20) Text { text: root.toAddress color: SideSwapStyles.primaryTextColor - font.pixelSize: 18 + font.pixelSize: BSSizes.applyScale(18) width: parent.width clip: true wrapMode: Text.Wrap @@ -115,7 +116,7 @@ Item { CustomButton { text: qsTr("Copy Address") width: parent.width - height: 50 + height: BSSizes.applyScale(50) anchors.horizontalCenter: parent.horizontalCenter onClicked: bsApp.copyAddressToClipboard(root.toAddress) } @@ -132,13 +133,13 @@ Item { Column { Text { text: qsTr("BTC payment address") - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) color: SideSwapStyles.paragraphTextColor } Text { text: root.fromAddress - font.pixelSize: 14 + font.pixelSize: BSSizes.applyScale(14) color: SideSwapStyles.paragraphTextColor } } @@ -146,7 +147,7 @@ Item { CustomBorderedButton { text: qsTr("BACK") width: parent.width - height: 60 + height: BSSizes.applyScale(60) anchors.horizontalCenter: parent.horizontalCenter onClicked: root.back() } diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml index 9733c7e3b..23b8f4339 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml @@ -15,6 +15,7 @@ import QtQuick.Controls 2.12 import "." import "../Common" import "../../" +import "../../BsStyles" PluginPopup { id: root @@ -22,7 +23,7 @@ PluginPopup { background: Rectangle { anchors.fill: parent color: "black" - radius: 14 + radius: BSSizes.applyScale(14) } contentItem: StackView { @@ -33,6 +34,7 @@ PluginPopup { SideSwapMainPage { id: mainPage visible: false + anchors.centerIn: parent onContinueClicked: { if (mainPage.peg_in) { @@ -48,12 +50,14 @@ PluginPopup { id: pegOutPage visible: false onBack: root.reset() + anchors.centerIn: parent } SideSwapPegIn { id: pegInPage visible: false onBack: root.reset() + anchors.centerIn: parent } } diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 327e63421..87814aa54 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -131,7 +131,7 @@ ColumnLayout { spacing: 0 RowLayout { - + id: input_header_layout Layout.fillWidth: true Layout.topMargin: BSSizes.applyScale(16) Layout.preferredHeight: BSSizes.applyScale(19) @@ -184,7 +184,7 @@ ColumnLayout { id: from_wallet_combo Layout.leftMargin: BSSizes.applyScale(16) - Layout.topMargin: BSSizes.applyScale(8) + Layout.topMargin: BSSizes.applyScale(16) Layout.alignment: Qt.AlignLeft | Qt.AlingTop visible: !isRBF && !isCPFP @@ -249,8 +249,8 @@ ColumnLayout { } Rectangle { - - height: 1 + id: divider + height: BSSizes.applyScale(1) Layout.fillWidth: true Layout.topMargin: BSSizes.applyScale((!isRBF && !isCPFP) ? 196 : 274) @@ -264,9 +264,10 @@ ColumnLayout { id: table_sel_inputs Layout.fillWidth: true - Layout.fillHeight : true + Layout.fillHeight: true Layout.leftMargin: BSSizes.applyScale(16) Layout.rightMargin: BSSizes.applyScale(16) + Layout.preferredHeight: BSSizes.applyScale(300) model: isRBF ? tx.ownInputs : isCPFP ? tx.ownOutputs : txInputsSelectedModel columnWidths: [0.7, 0.1, 0, 0.2] diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml index 069669eba..7b6a2eada 100644 --- a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -230,7 +230,7 @@ ColumnLayout { id: return_amount anchors.top: in_amount.bottom - anchors.topMargin: BSSizes.applyScale(16) + anchors.topMargin: BSSizes.applyScale(10) anchors.right: parent.horizontalCenter anchors.rightMargin: BSSizes.applyScale(24) @@ -266,7 +266,7 @@ ColumnLayout { id: transaction_fee anchors.top: return_amount.bottom - anchors.topMargin: BSSizes.applyScale(16) + anchors.topMargin: BSSizes.applyScale(10) anchors.right: parent.horizontalCenter anchors.rightMargin: BSSizes.applyScale(24) diff --git a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml index f7bd13a09..88c365054 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomListItem.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomListItem.qml @@ -36,7 +36,7 @@ Rectangle { radius: BSSizes.applyScale(14) border.color: mouseArea.containsMouse ? BSStyle.listItemHoveredBorderColor : BSStyle.listItemBorderColor - border.width: BSSizes.applyScale(1) + border.width: 1 Image { id: icon diff --git a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml index 533a2c39d..d15a87268 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTextInput.qml @@ -52,7 +52,7 @@ Rectangle { radius: BSSizes.applyScale(14) border.color: isValid ? (input.activeFocus ? "#45A6FF" : BSStyle.defaultBorderColor) : "#EB6060" - border.width: BSSizes.applyScale(1) + border.width: 1 Label { id: title From 80db20927c230afe70beceb2aa461f5b68142741 Mon Sep 17 00:00:00 2001 From: yz Date: Thu, 13 Apr 2023 10:41:18 +0300 Subject: [PATCH 350/436] Fixing new sizes --- GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml | 3 +-- GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml index decf52e42..540f44e2a 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapMainPage.qml @@ -22,7 +22,7 @@ import "../../BsStyles" Item { id: root width: BSSizes.applyWindowWidthScale(620) - height: BSSizes.applyWindowHeightScale(720) + height: BSSizes.applyWindowHeightScale(740) property bool peg_in: true @@ -32,7 +32,6 @@ Item { anchors.fill: parent color: "transparent" - Rectangle { id: topPanel width: parent.width diff --git a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml index 398ba9294..24fb54d7c 100644 --- a/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml +++ b/GUI/QtQuick/qml/WalletProperties/ExportWOWallet.qml @@ -96,7 +96,7 @@ ColumnLayout { Layout.leftMargin: BSSizes.applyScale(24) Layout.rightMargin: BSSizes.applyScale(24) Layout.topMargin: BSSizes.applyScale(32) - Layout.preferredHeight: BSSizes.applyScale(160) + Layout.preferredHeight: BSSizes.applyScale(16) Layout.fillWidth: true Layout.alignment: Qt.AlignLeft | Qt.AlingTop From 69339bc0cd000411b8132bfd70dc047ea2cd5639 Mon Sep 17 00:00:00 2001 From: yz Date: Thu, 13 Apr 2023 15:11:03 +0300 Subject: [PATCH 351/436] Use current screen instead of primary --- GUI/QtQuick/ScaleController.cpp | 6 ++++-- GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/GUI/QtQuick/ScaleController.cpp b/GUI/QtQuick/ScaleController.cpp index 50813f272..ba63a542b 100644 --- a/GUI/QtQuick/ScaleController.cpp +++ b/GUI/QtQuick/ScaleController.cpp @@ -11,6 +11,7 @@ #include "ScaleController.h" #include #include +#include namespace { const qreal defaultDpi = 96; @@ -19,10 +20,11 @@ namespace { ScaleController::ScaleController(QObject* parent) : QObject(parent) { - qreal dpi = QGuiApplication::primaryScreen()->logicalDotsPerInch(); + const auto screen = QGuiApplication::screens()[QApplication::desktop()->screenNumber(QApplication::activeWindow())]; + qreal dpi = screen->logicalDotsPerInch(); scaleRatio_ = dpi / defaultDpi; - QRect rect = QGuiApplication::primaryScreen()->geometry(); + QRect rect = screen->geometry(); screenWidth_ = rect.width(); screenHeight_ = rect.height(); } diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml index 2bacf4f95..890c0f692 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeedVerify.qml @@ -5,6 +5,7 @@ import QtQuick.Layouts 1.15 import "../BsStyles" import "../StyledControls" + ColumnLayout { id: layout @@ -33,6 +34,7 @@ ColumnLayout { Layout.fillHeight: true Layout.fillWidth: true Layout.leftMargin: BSSizes.applyScale(25) + Layout.rightMargin: BSSizes.applyScale(25) Layout.topMargin: BSSizes.applyScale(32) spacing: BSSizes.applyScale(10) @@ -42,7 +44,7 @@ ColumnLayout { delegate: CustomSeedTextInput { id: _delegate - width: 530 + width: parent.width title_text: layout.indexes[index] isValid: list.isValid onTextEdited : { From bbe78111afcc839aede58df8525550d67c2e6173 Mon Sep 17 00:00:00 2001 From: yz Date: Thu, 13 Apr 2023 15:55:14 +0300 Subject: [PATCH 352/436] FeeCombobox fix --- GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 21 ++++++++----------- .../qml/StyledControls/CustomComboBox.qml | 5 +++++ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml index 2159057c1..4c49d349b 100644 --- a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml +++ b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml @@ -19,7 +19,7 @@ CustomComboBox { id: fee_suggest_combo model: feeSuggestions - //editable: true + editable: true //aliases title_text: qsTr("Fee Suggestions") @@ -43,7 +43,6 @@ CustomComboBox { } validator.regExp = new RegExp(create_regexp()) - prev_text = fee_suggest_combo.currentText } } @@ -53,7 +52,6 @@ CustomComboBox { change_index_handler() } validator.regExp = new RegExp(create_regexp()) - prev_text = fee_suggest_combo.currentText } function create_regexp() @@ -75,15 +73,14 @@ CustomComboBox { return res } - property string prev_text : fee_suggest_combo.currentText - onTextEdited : { - if (!fee_suggest_combo.input_accept_input) - { - fee_suggest_combo.input_text = prev_text - } - - prev_text = fee_suggest_combo.input_text - } + // property string prev_text : fee_suggest_combo.currentText + // onTextEdited : { + // if (!fee_suggest_combo.input_accept_input) + // { + // fee_suggest_combo.input_text = prev_text + // } + // prev_text = fee_suggest_combo.input_text + // } onEditingFinished : { if (!edit_value()) diff --git a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml index 1e7a3052c..a254b8494 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml @@ -105,6 +105,11 @@ ComboBox { onEditingFinished : { control.editingFinished() } + + Connections { + target: control + onCurrentTextChanged: input.text = control.currentText + } } } From abd94539fabec3e4196e9b1afcb49ead59e5e1eb Mon Sep 17 00:00:00 2001 From: yz Date: Thu, 13 Apr 2023 18:05:20 +0300 Subject: [PATCH 353/436] Property binging for all sizes & rescale on screen change --- GUI/QtQuick/ScaleController.cpp | 13 +++++++++- GUI/QtQuick/ScaleController.h | 12 ++++++--- GUI/QtQuick/qml/BsStyles/BSSizes.qml | 27 +++++++++++++++----- GUI/QtQuick/qml/Settings/SettingsMenu.qml | 9 +++++++ GUI/QtQuick/qml/Settings/SettingsNetwork.qml | 3 +++ GUI/QtQuick/qml/main.qml | 2 ++ 6 files changed, 55 insertions(+), 11 deletions(-) diff --git a/GUI/QtQuick/ScaleController.cpp b/GUI/QtQuick/ScaleController.cpp index ba63a542b..928c72544 100644 --- a/GUI/QtQuick/ScaleController.cpp +++ b/GUI/QtQuick/ScaleController.cpp @@ -20,11 +20,22 @@ namespace { ScaleController::ScaleController(QObject* parent) : QObject(parent) { + update(); +} + +void ScaleController::update() +{ + disconnect(this); + const auto screen = QGuiApplication::screens()[QApplication::desktop()->screenNumber(QApplication::activeWindow())]; + connect(screen, &QScreen::logicalDotsPerInchChanged, this, &ScaleController::update); + qreal dpi = screen->logicalDotsPerInch(); scaleRatio_ = dpi / defaultDpi; QRect rect = screen->geometry(); screenWidth_ = rect.width(); screenHeight_ = rect.height(); -} + + emit changed(); +} \ No newline at end of file diff --git a/GUI/QtQuick/ScaleController.h b/GUI/QtQuick/ScaleController.h index 07d0ac709..6d0a95844 100644 --- a/GUI/QtQuick/ScaleController.h +++ b/GUI/QtQuick/ScaleController.h @@ -13,9 +13,9 @@ class ScaleController : public QObject { Q_OBJECT - Q_PROPERTY(qreal scaleRatio READ scaleRatio CONSTANT) - Q_PROPERTY(int screenWidth READ screenWidth CONSTANT) - Q_PROPERTY(int screenHeight READ screenHeight CONSTANT) + Q_PROPERTY(qreal scaleRatio READ scaleRatio NOTIFY changed) + Q_PROPERTY(int screenWidth READ screenWidth NOTIFY changed) + Q_PROPERTY(int screenHeight READ screenHeight NOTIFY changed) public: ScaleController(QObject* parent = nullptr); @@ -23,6 +23,12 @@ class ScaleController : public QObject int screenWidth() const { return screenWidth_; } int screenHeight() const { return screenHeight_; } +private slots: + void update(); + +signals: + void changed(); + private: int screenWidth_; int screenHeight_; diff --git a/GUI/QtQuick/qml/BsStyles/BSSizes.qml b/GUI/QtQuick/qml/BsStyles/BSSizes.qml index f0d8c94f7..d848e9612 100644 --- a/GUI/QtQuick/qml/BsStyles/BSSizes.qml +++ b/GUI/QtQuick/qml/BsStyles/BSSizes.qml @@ -13,15 +13,28 @@ import QtQuick 2.0 Item { - function applyScale(size) { - return size * scaleController.scaleRatio; - } + property var applyScale + property var applyWindowWidthScale + property var applyWindowHeightScale - function applyWindowWidthScale(size) { - return Math.min(applyScale(size), scaleController.screenWidth) + function setupScaleFunctions() { + applyScale = function (size) { + return size * scaleController.scaleRatio; + } + applyWindowWidthScale = function (size) { + return Math.min(applyScale(size), scaleController.screenWidth) + } + applyWindowHeightScale = function (size) { + return Math.min(applyScale(size), (scaleController.screenHeight - applyScale(100))) + } } - function applyWindowHeightScale(size) { - return Math.min(applyScale(size), (scaleController.screenHeight - applyScale(100))) + Connections { + target: scaleController + function onChanged() { + setupScaleFunctions() + } } + + Component.onCompleted: setupScaleFunctions() } diff --git a/GUI/QtQuick/qml/Settings/SettingsMenu.qml b/GUI/QtQuick/qml/Settings/SettingsMenu.qml index 1df3e9113..d270fe9ba 100644 --- a/GUI/QtQuick/qml/Settings/SettingsMenu.qml +++ b/GUI/QtQuick/qml/Settings/SettingsMenu.qml @@ -33,6 +33,9 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: BSSizes.applyScale(24) + Layout.leftMargin: BSSizes.applyScale(24) + Layout.rightMargin: BSSizes.applyScale(24) + Layout.fillWidth: true //aliases icon_source: "qrc:/images/general.png" @@ -47,6 +50,9 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: BSSizes.applyScale(10) + Layout.leftMargin: BSSizes.applyScale(24) + Layout.rightMargin: BSSizes.applyScale(24) + Layout.fillWidth: true //aliases icon_source: "qrc:/images/network.png" @@ -61,6 +67,9 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: BSSizes.applyScale(10) + Layout.leftMargin: BSSizes.applyScale(24) + Layout.rightMargin: BSSizes.applyScale(24) + Layout.fillWidth: true //aliases icon_source: "qrc:/images/about.png" diff --git a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml index c055f8d09..a565ae9fa 100644 --- a/GUI/QtQuick/qml/Settings/SettingsNetwork.qml +++ b/GUI/QtQuick/qml/Settings/SettingsNetwork.qml @@ -101,6 +101,9 @@ ColumnLayout { Layout.alignment: Qt.AlignCenter Layout.topMargin: BSSizes.applyScale(10) + Layout.leftMargin: BSSizes.applyScale(24) + Layout.rightMargin: BSSizes.applyScale(24) + Layout.fillWidth: true //aliases icon_source: "qrc:/images/plus.svg" diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 7675e5542..033b97c88 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -39,6 +39,8 @@ ApplicationWindow { property bool isNoWalletsWizard: false readonly property int resizeAnimationDuration: 25 + onScreenChanged: scaleController.update() + FontLoader { source: "qrc:/fonts/Roboto-Regular.ttf" } From 5a381a5204b80b92e38bd7dfcbbce1d4d2b1decd Mon Sep 17 00:00:00 2001 From: yz Date: Thu, 13 Apr 2023 23:44:07 +0300 Subject: [PATCH 354/436] Removing unused code --- GUI/QtQuick/ScaleController.cpp | 2 +- GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/GUI/QtQuick/ScaleController.cpp b/GUI/QtQuick/ScaleController.cpp index 928c72544..bf5a94e76 100644 --- a/GUI/QtQuick/ScaleController.cpp +++ b/GUI/QtQuick/ScaleController.cpp @@ -38,4 +38,4 @@ void ScaleController::update() screenHeight_ = rect.height(); emit changed(); -} \ No newline at end of file +} diff --git a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml index 4c49d349b..bda1c3d03 100644 --- a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml +++ b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml @@ -73,15 +73,6 @@ CustomComboBox { return res } - // property string prev_text : fee_suggest_combo.currentText - // onTextEdited : { - // if (!fee_suggest_combo.input_accept_input) - // { - // fee_suggest_combo.input_text = prev_text - // } - // prev_text = fee_suggest_combo.input_text - // } - onEditingFinished : { if (!edit_value()) { From c6af902bd0682df1433b152f751314d5e8ab3f2d Mon Sep 17 00:00:00 2001 From: yz Date: Fri, 14 Apr 2023 13:13:40 +0300 Subject: [PATCH 355/436] Scaling splashscreen; trying to fix swipeview layout --- BlockSettleUILib/BSTerminalSplashScreen.cpp | 2 +- GUI/QtQuick/QtQuickAdapter.cpp | 2 +- GUI/QtQuick/qml/ExplorerPage.qml | 4 ++-- GUI/QtQuick/qml/OverviewPage.qml | 3 ++- GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml | 2 +- GUI/QtQuick/qml/TransactionsPage.qml | 3 ++- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/BlockSettleUILib/BSTerminalSplashScreen.cpp b/BlockSettleUILib/BSTerminalSplashScreen.cpp index 6d2107e53..d768e5e5a 100644 --- a/BlockSettleUILib/BSTerminalSplashScreen.cpp +++ b/BlockSettleUILib/BSTerminalSplashScreen.cpp @@ -25,7 +25,7 @@ BSTerminalSplashScreen::BSTerminalSplashScreen(const QPixmap& splash_image) progress_->setValue(0); progress_->setMinimumWidth(this->width() - 10); progress_->setMaximumHeight(8); - progress_->move(5, 289); + progress_->move(5, this->height() - 10); //blockSettleLabel_ = new QLabel(this); //blockSettleLabel_->setText(QLatin1String("BLOCKSETTLE TERMINAL")); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index fb000e2ea..9eb4e88ce 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -252,7 +252,7 @@ void QtQuickAdapter::run(int &argc, char **argv) logoIcon = QLatin1String(":/FULL_BS_LOGO"); QPixmap splashLogo(logoIcon); - const int splashScreenWidth = 400; + const int splashScreenWidth = scaleController_->scaleRatio() * 400; { std::lock_guard lock(mutex_); splashScreen_ = new BSTerminalSplashScreen(splashLogo.scaledToWidth(splashScreenWidth diff --git a/GUI/QtQuick/qml/ExplorerPage.qml b/GUI/QtQuick/qml/ExplorerPage.qml index 6f0660e0e..9acf4a77a 100644 --- a/GUI/QtQuick/qml/ExplorerPage.qml +++ b/GUI/QtQuick/qml/ExplorerPage.qml @@ -19,8 +19,8 @@ import "BsStyles" //import "BsDialogs" //import "js/helper.js" as JsHelper -Item { - +Rectangle { + color: BSStyle.backgroundColor property int historyIndex: -1 property var searchHist: [] diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index b8003a227..a386b3de2 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -22,9 +22,10 @@ import "WalletProperties" //import "js/helper.js" as JsHelper import wallet.balance 1.0 -Item { +Rectangle { id: overview property int walletIndex: 0 + color: BSStyle.backgroundColor signal newWalletClicked(); signal curWalletIndexChanged(index : int) diff --git a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml index 4d6a573bd..5848b4548 100644 --- a/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml +++ b/GUI/QtQuick/qml/Plugins/Common/PluginsPage.qml @@ -18,7 +18,7 @@ import "../../StyledControls" Rectangle { id: root - color: "transparent" + color: BSStyle.backgroundColor Column { anchors.fill: parent diff --git a/GUI/QtQuick/qml/TransactionsPage.qml b/GUI/QtQuick/qml/TransactionsPage.qml index 712a18680..07c328110 100644 --- a/GUI/QtQuick/qml/TransactionsPage.qml +++ b/GUI/QtQuick/qml/TransactionsPage.qml @@ -19,8 +19,9 @@ import "BsStyles" import terminal.models 1.0 -Item { +Rectangle { id: transactions + color: BSStyle.backgroundColor width: BSSizes.applyScale(1200) height: BSSizes.applyScale(788) From ffa2574bd100c66bf2c4317982372c5794ac0f0a Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 14 Apr 2023 21:00:27 +0300 Subject: [PATCH 356/436] [QT-106, 109] fixes --- BlockSettleHW/CMakeLists.txt | 1 + BlockSettleHW/jade/jadeDevice.cpp | 183 ++++++++++++++++++++++++++++-- BlockSettleHW/jade/jadeDevice.h | 48 +++++++- CMakeLists.txt | 1 + common | 2 +- 5 files changed, 224 insertions(+), 11 deletions(-) diff --git a/BlockSettleHW/CMakeLists.txt b/BlockSettleHW/CMakeLists.txt index 3a754455a..bc6515cf5 100644 --- a/BlockSettleHW/CMakeLists.txt +++ b/BlockSettleHW/CMakeLists.txt @@ -83,5 +83,6 @@ TARGET_LINK_LIBRARIES(${BLOCKSETTLE_HW_LIBRARY_NAME} ${PROTO_LIB} Qt5::Core Qt5::Network + Qt5::SerialPort ${OS_SPECIFIC_LIBS} ) diff --git a/BlockSettleHW/jade/jadeDevice.cpp b/BlockSettleHW/jade/jadeDevice.cpp index 0609d287e..cbe3630e5 100644 --- a/BlockSettleHW/jade/jadeDevice.cpp +++ b/BlockSettleHW/jade/jadeDevice.cpp @@ -8,6 +8,10 @@ ********************************************************************************** */ +#include +#include +#include +#include #include #include #include "hwdevicemanager.h" @@ -19,21 +23,21 @@ using namespace bs::hww; JadeDevice::JadeDevice(const std::shared_ptr &logger - , bool testNet, DeviceCallbacks* cb, const std::string& endpoint) + , bool testNet, DeviceCallbacks* cb, const QSerialPortInfo& endpoint) : bs::WorkerPool(1, 1) , logger_(logger), testNet_(testNet), cb_(cb), endpoint_(endpoint) -{} +{ + QMetaObject::invokeMethod(qApp, [this] { + handlers_.push_back(std::make_shared(logger_, endpoint_)); + }); +} JadeDevice::~JadeDevice() = default; -#if 0 std::shared_ptr JadeDevice::worker(const std::shared_ptr&) { - const std::vector> handlers{ std::make_shared - (logger_, endpoint_) }; - return std::make_shared(handlers); + return std::make_shared(handlers_); } -#endif void bs::hww::JadeDevice::operationFailed(const std::string& reason) { @@ -118,3 +122,168 @@ void JadeDevice::reset() awaitingSignedTX_.clear(); awaitingWalletInfo_ = {}; } + + +// Helpers to build basic jade cbor request object +static inline QCborMap getRequest(const int id, const QString& method) +{ + QCborMap req; + req.insert(QCborValue(QLatin1Literal("id")), QString::number(id)); + req.insert(QCborValue(QLatin1Literal("method")), method); + return req; +} + +static inline QCborMap getRequest(const int id, const QString& method + , const QCborValue& params) +{ + QCborMap req(getRequest(id, method)); + req.insert(QCborValue(QLatin1Literal("params")), params); + return req; +} + + +JadeSerialHandler::JadeSerialHandler(const std::shared_ptr& logger + , const QSerialPortInfo& spi) + : QObject(nullptr), logger_(logger), serial_(new QSerialPort(spi, this)) +{ + serial_->setBaudRate(QSerialPort::Baud115200); + serial_->setDataBits(QSerialPort::Data8); + serial_->setParity(QSerialPort::NoParity); + serial_->setStopBits(QSerialPort::OneStop); + + if (!Connect()) { + throw std::runtime_error("failed to open port " + spi.portName().toStdString()); + } +} + +JadeSerialHandler::~JadeSerialHandler() +{ + Disconnect(); +} + +std::shared_ptr JadeSerialHandler::processData(const std::shared_ptr& in) +{ + auto out = std::make_shared(); + auto prom = std::make_shared>(); + out->futResponse = prom->get_future(); + requests_.push_back(prom); + write(in->data); + return out; +} + +bool bs::hww::JadeSerialHandler::Connect() +{ + if (serial_->isOpen()) { + return true; // already connected + } + if (serial_->open(QIODevice::ReadWrite)) { + // Connect 'data received' slot + connect(serial_, &QSerialPort::readyRead, this + , &JadeSerialHandler::onSerialDataReady); + return true; + } + Disconnect(); + return false; +} + +void bs::hww::JadeSerialHandler::Disconnect() +{ + disconnect(serial_, nullptr, this, nullptr); + if (serial_->isOpen()) { + serial_->close(); + } +} + +int bs::hww::JadeSerialHandler::write(const QByteArray& data) +{ + assert(serial_); + assert(serial_->isOpen()); + + int written = 0; + while (written != data.length()) { + const auto wrote = serial_->write(data.data() + written, qMin(256, data.length() - written)); + if (wrote < 0) { + Disconnect(); + return written; + } + else { + serial_->waitForBytesWritten(100); + written += wrote; + } + //std::this_thread::sleep_for(std::chrono::milliseconds{ 100 }); + } + return written; +} + +void bs::hww::JadeSerialHandler::parsePortion(const QByteArray& data) +{ + try { + // Collect data + unparsed_.append(data); + + // Try to parse cbor objects from byte buffer until it has no more complete objects + for (bool readNextObj = true; readNextObj; /*nothing - set in loop*/) { + QCborParserError err; + const QCborValue cbor = QCborValue::fromCbor(unparsed_, &err); + // qDebug() << "Read Type:" << cbor.type() << "and error: " << err.error; + readNextObj = false; // In most cases we don't read another object + + if (err.error == QCborError::NoError && cbor.isMap()) { + const QCborMap msg = cbor.toMap(); + if (msg.contains(QCborValue(QLatin1Literal("log")))) { + // Print Jade log line immediately + logger_->info("[{}] {}", __func__, msg[QLatin1Literal("log")] + .toByteArray().toStdString()); + } + else { + requests_.front()->set_value(msg); + requests_.pop_front(); + } + + // Remove read object from m_data buffer + if (err.offset == unparsed_.length()) { + unparsed_.clear(); + } + else { + // We successfully read an object and there are still bytes left in the buffer - this + // is the one case where we loop and read again - make sure to preserve the remaining bytes. + unparsed_ = unparsed_.right(static_cast(unparsed_.length() - err.offset)); + readNextObj = true; + } + } + else if (err.error == QCborError::EndOfFile) { + // partial object - stop trying to read objects for now, await more data + if (unparsed_.length() > 0) { + logger_->debug("[{}] CBOR incomplete ({} bytes present) - awaiting more data" + , __func__, unparsed_.size()); + } + } + else { + // Unexpected parse error + logger_->warn("[{}] unexpected type {} and/or error: {}", __func__ + , (int)cbor.type(), err.error.toString().toStdString()); + Disconnect(); + } + } + } + catch (const std::exception& e) { + logger_->error("[{}] exception: {}", __func__, e.what()); + Disconnect(); + } + catch (...) { + logger_->error("[{}] exception", __func__); + Disconnect(); + } +} + +void JadeSerialHandler::onSerialDataReady() +{ + assert(serial_); + const auto& data = serial_->readAll(); + + if (requests_.empty()) { + logger_->error("[{}] dropped {} bytes of serial data", __func__, data.size()); + return; + } + parsePortion(data); +} diff --git a/BlockSettleHW/jade/jadeDevice.h b/BlockSettleHW/jade/jadeDevice.h index 1c5c6dc57..4e4f1b09f 100644 --- a/BlockSettleHW/jade/jadeDevice.h +++ b/BlockSettleHW/jade/jadeDevice.h @@ -11,6 +11,8 @@ #ifndef JADE_DEVICE_H #define JADE_DEVICE_H +#include +#include #include "Message/Worker.h" #include "hwdeviceinterface.h" #include "jadeClient.h" @@ -29,11 +31,50 @@ namespace bs { namespace bs { namespace hww { + struct JadeSerialIn : public bs::InData + { + ~JadeSerialIn() override = default; + QByteArray data; + }; + struct JadeSerialOut : public bs::OutData + { + ~JadeSerialOut() override = default; + std::future futResponse; + }; + + class JadeSerialHandler : public QObject + , public bs::HandlerImpl + { + Q_OBJECT + public: + JadeSerialHandler(const std::shared_ptr& + , const QSerialPortInfo& spi); + ~JadeSerialHandler() override; + + protected: + std::shared_ptr processData(const std::shared_ptr&) override; + + private slots: + void onSerialDataReady(); // Invoked when new serial data arrived + + private: + bool Connect(); + void Disconnect(); + int write(const QByteArray&); + void parsePortion(const QByteArray&); + + private: + std::shared_ptr logger_; + QSerialPort* serial_{ nullptr }; + std::deque>> requests_; + QByteArray unparsed_; + }; + class JadeDevice : public DeviceInterface, protected WorkerPool { public: JadeDevice(const std::shared_ptr& - , bool testNet, DeviceCallbacks*, const std::string& endpoint); + , bool testNet, DeviceCallbacks*, const QSerialPortInfo&); ~JadeDevice() override; DeviceKey key() const override; @@ -61,7 +102,7 @@ namespace bs { } protected: - //std::shared_ptr worker(const std::shared_ptr&) override final; + std::shared_ptr worker(const std::shared_ptr&) override final; // operation result informing void publicKeyReady() override {} //TODO: implement @@ -80,7 +121,8 @@ namespace bs { std::shared_ptr logger_; const bool testNet_; DeviceCallbacks* cb_{ nullptr }; - const std::string endpoint_; + const QSerialPortInfo endpoint_; + std::vector> handlers_; bs::core::HwWalletInfo awaitingWalletInfo_; std::string awaitingSignedTX_; }; diff --git a/CMakeLists.txt b/CMakeLists.txt index 30a93f8a0..6023e0605 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,6 +174,7 @@ FIND_PACKAGE(Qt5QuickControls2 REQUIRED) FIND_PACKAGE(Qt5Charts REQUIRED) FIND_PACKAGE(Qt5Sql REQUIRED) FIND_PACKAGE(Qt5Svg REQUIRED) +FIND_PACKAGE(Qt5SerialPort REQUIRED) INCLUDE_DIRECTORIES(${Qt5Core_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${Qt5Gui_INCLUDE_DIRS}) diff --git a/common b/common index c586a34f3..840129c65 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit c586a34f39273b8c992158f5f308f390a9a0970c +Subproject commit 840129c65d757b90f4bffa248abbb50b2a06877f From 4446e3fbe28d26d042d0df6fd383fef5eebc49fe Mon Sep 17 00:00:00 2001 From: yz Date: Sun, 16 Apr 2023 18:17:39 +0300 Subject: [PATCH 357/436] Advanced send selection; plugin bugfix --- GUI/QtQuick/QtQuickAdapter.cpp | 2 ++ GUI/QtQuick/TxInputsModel.cpp | 33 +++++++++++++++++-- GUI/QtQuick/TxInputsModel.h | 3 +- .../qml/Overview/OverviewWalletBar.qml | 4 +++ .../qml/Plugins/Common/PluginPopup.qml | 8 +---- .../SideShift/SideShiftComboboxWithIcon.qml | 3 ++ .../qml/Plugins/SideShift/SideShiftPopup.qml | 17 ++++++++++ .../SideSwap/Controls/CustomCombobox.qml | 2 +- .../SideSwap/Controls/CustomTextEdit.qml | 5 +-- .../qml/Plugins/SideSwap/SideSwapPegIn.qml | 2 +- .../qml/Plugins/SideSwap/SideSwapPopup.qml | 25 ++++++++++++++ GUI/QtQuick/qml/Send/AdvancedDetails.qml | 4 ++- 12 files changed, 93 insertions(+), 15 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 9eb4e88ce..fe7dcbace 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1439,6 +1439,8 @@ bool QtQuickAdapter::validateAddress(const QString& addr) const auto& addrStr = addr.toStdString(); try { bs::Address::fromAddressString(addrStr); + return QRegularExpression(QString::fromLatin1("^(?:[13]{1}[a-km-zA-HJ-NP-Z1-9]{26,33}|bc1[a-z0-9]{39,59}|tb1[a-z0-9]{39,59})$") + ).match(addr).hasMatch(); } catch (const std::exception& e) { logger_->warn("[{}] invalid address {}: {}", __func__, addrStr, e.what()); diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index ef1437dd6..83195dbb7 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -121,7 +121,7 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) for (const auto& utxo : utxos) { try { const auto& addr = bs::Address::fromUTXO(utxo); - utxos_[addr].push_back(utxo); + utxos_[addr].insert(utxo); int addrIndex = -1; for (int i = 0; i < data_.size(); ++i) { if (data_.at(i).address == addr) { @@ -329,7 +329,7 @@ QUTXOList* TxInputsModel::getSelection() QList result; const double amount = outsModel_ ? outsModel_->totalAmount() : 0; logger_->debug("[{}] total amount: {}", __func__, amount); - if (amount > 0) { // auto selection + if (static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider)) > selectedBalance_) { // auto selection const auto& it = preSelected_.find((int)std::floor(amount * BTCNumericTypes::BalanceDivider)); if (it != preSelected_.end()) { return new QUTXOList(it->second, (QObject*)this); @@ -374,6 +374,35 @@ QUTXOList* TxInputsModel::getSelection() return new QUTXOList(result, (QObject*)this); } +void TxInputsModel::updateAutoselection() +{ + const double amount = outsModel_ ? outsModel_->totalAmount() : 0; + + for (int i = data_.size() - 1; i >= 0; --i) { + const auto& entry = data_[i]; + if (!entry.expanded) { + toggle(i + 1); + } + } + + if (utxos_.empty()) { + collectUTXOsForAmount_ = amount; + return; + } + auto result = collectUTXOsFor(amount); + selectionUtxos_.clear(); + selectedBalance_ = 0; + nbTx_ = 0; + for (const auto utxo : result) { + selectionUtxos_.insert({ utxo->utxo().getTxHash(), utxo->utxo().getTxOutIndex() }); + selectedBalance_ += utxo->utxo().getValue(); + nbTx_++; + } + + emit selectionChanged(); + emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); +} + QUTXOList* TxInputsModel::zcInputs() const { QList result; diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index 4e090e79c..02fbd8e9a 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -108,6 +108,7 @@ class TxInputsModel : public QAbstractTableModel Q_INVOKABLE void toggleSelection(int row); Q_INVOKABLE QUTXOList* getSelection(); Q_INVOKABLE QUTXOList* zcInputs() const; + Q_INVOKABLE void updateAutoselection(); signals: void selectionChanged() const; @@ -125,7 +126,7 @@ class TxInputsModel : public QAbstractTableModel std::shared_ptr logger_; TxOutputsModel* outsModel_{ nullptr }; const QMap header_; - std::map> utxos_; + std::map> utxos_; std::vector data_; std::set> selectionUtxos_; diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index a4eec2157..966565d03 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -66,6 +66,9 @@ Rectangle { if (model === walletBalances) { wallet_selection_combobox.currentIndex = walletBalances.selectedWallet } + else { + walletBalances.selectedWallet = -1 + } } Connections { @@ -95,6 +98,7 @@ Rectangle { anchors.right: parent.right Controls.CustomMediumButton { + enabled: walletBalances.selectedWallet >= 0 text: qsTr("Wallet Properties") onClicked: control.requestWalletProperties() } diff --git a/GUI/QtQuick/qml/Plugins/Common/PluginPopup.qml b/GUI/QtQuick/qml/Plugins/Common/PluginPopup.qml index 58c28e139..2d0f7be56 100644 --- a/GUI/QtQuick/qml/Plugins/Common/PluginPopup.qml +++ b/GUI/QtQuick/qml/Plugins/Common/PluginPopup.qml @@ -24,11 +24,5 @@ Popup { modal: true focus: true - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - - CloseIconButton { - anchors.right: parent.right - anchors.top: parent.top - onClose: plugin_popup.close() - } + closePolicy: Popup.CloseOnEscape } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml index f2f02dbae..944c0d29c 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftComboboxWithIcon.qml @@ -194,6 +194,7 @@ ComboBox { } TextInput { + id: search_input anchors.fill: parent color: "white" leftPadding: BSSizes.applyScale(20) @@ -226,5 +227,7 @@ ComboBox { border.width: 1 border.color: "white" } + + onOpened: search_input.forceActiveFocus() } } diff --git a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml index a8b7c6bec..f4105b326 100644 --- a/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml +++ b/GUI/QtQuick/qml/Plugins/SideShift/SideShiftPopup.qml @@ -16,6 +16,7 @@ import "." import "../Common" import "../../" import "../../BsStyles" +import "../../StyledControls" PluginPopup { id: root @@ -43,6 +44,14 @@ PluginPopup { controller: root.controller visible: false anchors.centerIn: parent + + CloseIconButton { + anchors.right: parent.right + anchors.top: parent.top + anchors.rightMargin: BSSizes.applyScale(10) + anchors.topMargin: BSSizes.applyScale(10) + onClose: root.close() + } } SideShiftBuyPage { @@ -54,6 +63,14 @@ PluginPopup { outputCurrency: mainPage.outputCurrency receivingAddress: mainPage.receivingAddress anchors.centerIn: parent + + CloseIconButton { + anchors.right: parent.right + anchors.top: parent.top + anchors.rightMargin: BSSizes.applyScale(10) + anchors.topMargin: BSSizes.applyScale(10) + onClose: root.close() + } } } diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml index 0d196d32c..46d3b0c57 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomCombobox.qml @@ -45,7 +45,7 @@ ComboBox { Text { text: control.currentText - font.pixelSize: BSSizes.applyScale(18) + font.pixelSize: BSSizes.applyScale(14) font.family: "Roboto" color: "white" leftPadding: BSSizes.applyScale(10) diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml index cb200e254..4c6bb1a38 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/Controls/CustomTextEdit.qml @@ -40,12 +40,13 @@ Rectangle { clip: true anchors.fill: parent font.pixelSize: BSSizes.applyScale(14) - font.family: control.fontFamily + font.family: "Roboto" Text { text: control.textHint color: SideSwapStyles.secondaryTextColor - font.family: control.fontFamily + font.family: "Roboto" + font.weight: Font.Bold font.pixelSize: BSSizes.applyScale(12) leftPadding: BSSizes.applyScale(10) topPadding: BSSizes.applyScale(10) diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml index 726b823ef..5e3e138df 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPegIn.qml @@ -33,7 +33,7 @@ Item { Column { anchors.fill: parent - anchors.margins: BSSizes.applyScale(20) + anchors.margins: BSSizes.applyScale(100) CustomBorderedButton { width: parent.width diff --git a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml index 23b8f4339..4c79e998b 100644 --- a/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml +++ b/GUI/QtQuick/qml/Plugins/SideSwap/SideSwapPopup.qml @@ -16,6 +16,7 @@ import "." import "../Common" import "../../" import "../../BsStyles" +import "../../StyledControls" PluginPopup { id: root @@ -44,6 +45,14 @@ PluginPopup { stackView.replace(pegOutPage) } } + + CloseIconButton { + anchors.right: parent.right + anchors.top: parent.top + anchors.rightMargin: BSSizes.applyScale(10) + anchors.topMargin: BSSizes.applyScale(10) + onClose: root.close() + } } SideSwapPegOut { @@ -51,6 +60,14 @@ PluginPopup { visible: false onBack: root.reset() anchors.centerIn: parent + + CloseIconButton { + anchors.right: parent.right + anchors.top: parent.top + anchors.rightMargin: BSSizes.applyScale(10) + anchors.topMargin: BSSizes.applyScale(10) + onClose: root.close() + } } SideSwapPegIn { @@ -58,6 +75,14 @@ PluginPopup { visible: false onBack: root.reset() anchors.centerIn: parent + + CloseIconButton { + anchors.right: parent.right + anchors.top: parent.top + anchors.rightMargin: BSSizes.applyScale(10) + anchors.topMargin: BSSizes.applyScale(10) + onClose: root.close() + } } } diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 87814aa54..ec00950b3 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -503,6 +503,8 @@ ColumnLayout { rec_addr_input.input_text = "" amount_input.input_text = "" + + txInputsModel.updateAutoselection() } } @@ -591,7 +593,7 @@ ColumnLayout { , checkbox_rbf.checked, tx.ownOutputs.zcInputs()) } else { // normal operation - if (table_sel_inputs.rowCount) { + if (table_sel_inputs.model.rowCount) { return bsApp.createTXSignRequest(from_wallet_combo.currentIndex , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text From d951f59592570aff5738037a4e21136e83c7bc8e Mon Sep 17 00:00:00 2001 From: yz Date: Sun, 16 Apr 2023 22:26:07 +0300 Subject: [PATCH 358/436] Additional check for autoselection --- GUI/QtQuick/TxInputsModel.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 83195dbb7..8b9b69ee6 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -378,6 +378,10 @@ void TxInputsModel::updateAutoselection() { const double amount = outsModel_ ? outsModel_->totalAmount() : 0; + if (static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider)) <= selectedBalance_) { + return; + } + for (int i = data_.size() - 1; i >= 0; --i) { const auto& entry = data_[i]; if (!entry.expanded) { From 48593f167666da411c42b0401542a45a0b821892 Mon Sep 17 00:00:00 2001 From: yz Date: Mon, 17 Apr 2023 10:51:29 +0300 Subject: [PATCH 359/436] Updated casts; returned back set to vector + check for uniqueness --- GUI/QtQuick/TxInputsModel.cpp | 15 ++++++++++----- GUI/QtQuick/TxInputsModel.h | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 8b9b69ee6..83e4c806d 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -121,7 +121,12 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) for (const auto& utxo : utxos) { try { const auto& addr = bs::Address::fromUTXO(utxo); - utxos_[addr].insert(utxo); + + if (std::find(utxos_[addr].begin(), utxos_[addr].end(), utxo) != utxos_[addr].end()) { + continue; + } + + utxos_[addr].push_back(utxo); int addrIndex = -1; for (int i = 0; i < data_.size(); ++i) { if (data_.at(i).address == addr) { @@ -329,8 +334,8 @@ QUTXOList* TxInputsModel::getSelection() QList result; const double amount = outsModel_ ? outsModel_->totalAmount() : 0; logger_->debug("[{}] total amount: {}", __func__, amount); - if (static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider)) > selectedBalance_) { // auto selection - const auto& it = preSelected_.find((int)std::floor(amount * BTCNumericTypes::BalanceDivider)); + if (static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider)) > selectedBalance_) { // auto selection + const auto& it = preSelected_.find(static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider))); if (it != preSelected_.end()) { return new QUTXOList(it->second, (QObject*)this); } @@ -339,7 +344,7 @@ QUTXOList* TxInputsModel::getSelection() return nullptr; } result = collectUTXOsFor(amount); - preSelected_[(int)std::floor(amount * BTCNumericTypes::BalanceDivider)] = result; + preSelected_[static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider))] = result; } else { for (auto sel_utxo : selectionUtxos_) { @@ -378,7 +383,7 @@ void TxInputsModel::updateAutoselection() { const double amount = outsModel_ ? outsModel_->totalAmount() : 0; - if (static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider)) <= selectedBalance_) { + if (static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider)) <= selectedBalance_) { return; } diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index 02fbd8e9a..eb3c76e3a 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -126,7 +126,7 @@ class TxInputsModel : public QAbstractTableModel std::shared_ptr logger_; TxOutputsModel* outsModel_{ nullptr }; const QMap header_; - std::map> utxos_; + std::map> utxos_; std::vector data_; std::set> selectionUtxos_; From 3ffe58695ffa82be86907796e432b7dcded5efe1 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 17 Apr 2023 16:09:18 +0300 Subject: [PATCH 360/436] [QT-110] workaround for Armory issue --- GUI/QtQuick/QtQuickAdapter.cpp | 27 ++++++++++++++++++++++++--- GUI/QtQuick/qml/AddressDetails.qml | 2 +- common | 2 +- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index fe7dcbace..d6b5eccca 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1161,13 +1161,15 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId ProcessingResult QtQuickAdapter::processWalletBalances(bs::message::SeqId responseId , const WalletsMessage_WalletBalances &response) { - //logger_->debug("[{}] {}", __func__, response.DebugString()); - const WalletBalancesModel::Balance bal{ response.spendable_balance(), response.unconfirmed_balance() + logger_->debug("[{}] {}", __func__, response.DebugString()); + const WalletBalancesModel::Balance bal{ response.spendable_balance() + , response.unconfirmed_balance() , response.total_balance(), response.nb_addresses() }; walletBalances_->setWalletBalance(response.wallet_id(), bal); for (const auto& addrBal : response.address_balances()) { - addrModel_->updateRow(BinaryData::fromString(addrBal.address()), addrBal.total_balance(), addrBal.tx_count()); + addrModel_->updateRow(BinaryData::fromString(addrBal.address()) + , addrBal.total_balance(), addrBal.tx_count()); } emit walletBalanceChanged(); return ProcessingResult::Success; @@ -1918,12 +1920,26 @@ ProcessingResult QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMess { logger_->debug("[{}] {}", __func__, zcs.DebugString()); WalletsMessage msg; + std::unordered_set impactedWalletIds; auto msgReq = msg.mutable_tx_details_request(); for (const auto& zcEntry : zcs.tx_entries()) { auto txReq = msgReq->add_requests(); txReq->set_tx_hash(zcEntry.tx_hash()); for (const auto& walletId : zcEntry.wallet_ids()) { txReq->add_wallet_ids(walletId); + if (hdWallets_.find(walletId) != hdWallets_.end()) { + impactedWalletIds.insert(walletId); + } + else { + for (const auto& hdWallet : hdWallets_) { + for (const auto& leaf : hdWallet.second.leaves) { + if (leaf.first == walletId) { + impactedWalletIds.insert(hdWallet.first); + break; + } + } + } + } } txReq->set_value(zcEntry.value()); @@ -1949,6 +1965,11 @@ ProcessingResult QtQuickAdapter::processZC(const BlockSettle::Common::ArmoryMess } pushRequest(user_, userWallets_, msg.SerializeAsString()); + + for (const auto& walletId : impactedWalletIds) { + msg.set_get_wallet_balances(walletId); + pushRequest(user_, userWallets_, msg.SerializeAsString()); + } return ProcessingResult::Success; } diff --git a/GUI/QtQuick/qml/AddressDetails.qml b/GUI/QtQuick/qml/AddressDetails.qml index 74b7b47a1..a97327687 100644 --- a/GUI/QtQuick/qml/AddressDetails.qml +++ b/GUI/QtQuick/qml/AddressDetails.qml @@ -92,7 +92,7 @@ Popup { width: BSSizes.applyScale(140) } Text { - text: address_details.transactions !== '' ? address_details.transactions : '-' + text: txListByAddrModel.nbTx > 0 ? txListByAddrModel.nbTx : '-' color: BSStyle.textColor font.family: "Roboto" font.pixelSize: BSSizes.applyScale(14) diff --git a/common b/common index 840129c65..758ca44f0 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 840129c65d757b90f4bffa248abbb50b2a06877f +Subproject commit 758ca44f0dc47568bbe7940085508bc5b68fdcb1 From 37e70b5d8c7b08780f2a5ec29e43fbd3ba83ba49 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 17 Apr 2023 22:14:42 +0300 Subject: [PATCH 361/436] Initial QSerialPort implementation for Jade --- BlockSettleHW/hwdevicemanager.h | 2 +- BlockSettleHW/jade/jadeClient.cpp | 165 ++++------------------------ BlockSettleHW/jade/jadeClient.h | 42 +------ BlockSettleHW/jade/jadeDevice.cpp | 71 ++++++++---- BlockSettleHW/jade/jadeDevice.h | 4 +- BlockSettleHW/ledger/ledgerDevice.h | 82 -------------- GUI/QtQuick/QtQuickAdapter.cpp | 2 +- 7 files changed, 76 insertions(+), 292 deletions(-) diff --git a/BlockSettleHW/hwdevicemanager.h b/BlockSettleHW/hwdevicemanager.h index b531dbc93..4cda374ee 100644 --- a/BlockSettleHW/hwdevicemanager.h +++ b/BlockSettleHW/hwdevicemanager.h @@ -148,7 +148,7 @@ namespace bs { std::vector devices_; bool testNet_{false}; - int nbScanning_{0}; + int nbScanning_{0}; bool isSigning_{}; std::string lastOperationError_; std::string lastUsedTrezorWallet_; diff --git a/BlockSettleHW/jade/jadeClient.cpp b/BlockSettleHW/jade/jadeClient.cpp index a33aa5f11..74354cc16 100644 --- a/BlockSettleHW/jade/jadeClient.cpp +++ b/BlockSettleHW/jade/jadeClient.cpp @@ -15,25 +15,13 @@ #include "Wallets/SyncWalletsManager.h" #include "Wallets/SyncHDWallet.h" -namespace { -#ifdef Q_OS_WINDOWS - const std::vector kSerialPorts {"COM1", "COM2", "COM3", "COM4" - , "COM5", "COM6", "COM7", "COM8", "COM9", "COM10", "COM11", "COM12"}; -#elif Q_OS_MACOS - const std::vector kSerialPorts{ "/dev/tty.usbserial*" - , "/dev/cu.usbserial", "/dev/cu.Bluetooth-Modem"}; -#else - const std::vector kSerialPorts{ "/dev/ttyS*", "/dev/ttyACM*" - , "/dev/ttyUSB*"}; -#endif -} using namespace bs::hww; using json = nlohmann::json; JadeClient::JadeClient(const std::shared_ptr& logger , bool testNet, DeviceCallbacks* cb) - : bs::WorkerPool(1, 1), logger_(logger), cb_(cb), testNet_(testNet) + : logger_(logger), cb_(cb), testNet_(testNet) {} void JadeClient::initConnection() @@ -44,151 +32,38 @@ void JadeClient::initConnection() std::vector JadeClient::deviceKeys() const { std::vector result; + for (const auto& device : devices_) { + result.push_back(device->key()); + } return result; } std::shared_ptr JadeClient::getDevice(const std::string& deviceId) { + for (const auto& device : devices_) { + if (device->key().id == deviceId) { + return device; + } + } return nullptr; } -std::shared_ptr JadeClient::worker(const std::shared_ptr&) -{ - const std::vector> handlers{std::make_shared(logger_) }; - return std::make_shared(handlers); -} - void JadeClient::scanDevices() { logger_->info("[JadeClient::scanDevices]"); std::vector serialPorts; - for (const auto& fn : kSerialPorts) { - if (fn.find('*') == std::string::npos) { -#ifdef Q_OS_WINDOWS - serialPorts.push_back(fn); -#else - if (SystemFileUtils::deviceExist(fn)) { - serialPorts.push_back(fn); - } -#endif + for (const auto& serial : QSerialPortInfo::availablePorts()) { + logger_->debug("[JadeClient::scanDevices] probing {}/{}", serial.portName().toStdString() + , serial.manufacturer().toStdString()); + try { + const auto& device = std::make_shared(logger_, testNet_ + , cb_, serial); + devices_.push_back(device); } - else { - const auto& files = SystemFileUtils::readDir("/", fn); - for (const auto& f : files) { - if (SystemFileUtils::deviceExist(f)) { - serialPorts.push_back(f); - } - } + catch (const std::exception& e) { + logger_->error("[JadeClient::scanDevices] {}", e.what()); } } - if (serialPorts.empty()) { - cb_->scanningDone(); - return; - } - auto nbCalls = std::make_shared((int)serialPorts.size()); - for (const auto& serial : serialPorts) { - const auto& cb = [this, nbCalls](const std::shared_ptr& out) - { - const auto& cbScanned = [this, nbCalls] - { - (*nbCalls)--; - if (*nbCalls <= 0) { - logger_->debug("[JadeClient::scanDevices] all devices scanned"); - cb_->scanningDone(); - } - }; - - const auto& data = std::dynamic_pointer_cast(out); - if (!data) { - logger_->error("[JadeClient::scanDevices] invalid callback data"); - cbScanned(); - return; - } - if (!data->response.empty()) { - logger_->debug("[JadeClient::scanDevices] response: {}", data->response.dump()); - } - cbScanned(); - }; - const auto request = std::make_shared(serial, json{ {"method", "get_version_info"}}); - processQueued(request, cb); - } -} - -bs::hww::JadeHandler::JadeHandler(const std::shared_ptr& logger) - : logger_(logger) -{} - -#ifdef Q_OS_WINDOWS -static std::string lastErrorAsString() -{ - DWORD errorMessageID = ::GetLastError(); - if (errorMessageID == 0) { - return {}; - } - LPSTR messageBuffer = nullptr; - - //Ask Win32 to give us the string version of that message ID. - //The parameters we pass in, tell Win32 to create the buffer that holds the message for us (because we don't yet know how long the message string will be). - size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL); - - const std::string message(messageBuffer, size); - //Free the Win32's string's buffer. - LocalFree(messageBuffer); - return message; -} -#endif - -std::shared_ptr bs::hww::JadeHandler::processData(const std::shared_ptr& in) -{ - auto out = std::make_shared(in->serial); -#ifdef Q_OS_WINDOWS - HANDLE hComm; - - hComm = CreateFileA(("\\\\.\\" + in->serial).c_str(), - GENERIC_READ | GENERIC_WRITE, 0, // No Sharing - NULL, // No Security - OPEN_EXISTING,// Open existing port only - 0, // Non Overlapped I/O - NULL); // Null for Comm Devices - - logger_->debug("[{}] {} handle = {:x}", __func__, in->serial, hComm); - if (hComm == INVALID_HANDLE_VALUE) { - out->error = "failed to open serial port " + in->serial + ": " + lastErrorAsString(); - logger_->debug("[{}] {}", __func__, out->error); - return out; - } - json reqCopy = in->request; - reqCopy["id"] = ++seqNo_; - logger_->debug("[{}] writing {} to {}", __func__, reqCopy.dump(), in->serial); - const auto& reqBytes = json::to_cbor(reqCopy); - const std::string reqBuf(reqBytes.cbegin(), reqBytes.cend()); - - DWORD nbWritten = 0; - const bool rc = WriteFile(hComm, reqBuf.data(), reqBuf.size(), &nbWritten, NULL); - if (!rc || (nbWritten != reqBuf.size())) { - out->error = "failed to write " + std::to_string(reqBuf.size() - nbWritten) - + " out of " + std::to_string(reqBuf.size()) + " bytes: " + lastErrorAsString(); - logger_->error("[{}] {}", __func__, out->error); - CloseHandle(hComm); - return out; - } - std::string readBuf; - char buf[64]; - DWORD nbRead = 0; - while (ReadFile(hComm, &buf, sizeof(buf), &nbRead, NULL)) { - if (nbRead <= 0) { - break; - } - logger_->debug("[{}] read {} bytes from {}", __func__, nbRead, in->serial); - readBuf.append(std::string(buf, nbRead)); - } - logger_->debug("[{}] {} bytes read from {}", __func__, readBuf.size(), in->serial); - if (!readBuf.empty()) { - out->response = json::from_cbor(readBuf.cbegin(), readBuf.cend()); - } - CloseHandle(hComm); -#else -#endif - return out; + logger_->debug("[JadeClient::scanDevices] {} devices scanned", devices_.size()); + cb_->scanningDone(); } diff --git a/BlockSettleHW/jade/jadeClient.h b/BlockSettleHW/jade/jadeClient.h index c248a6f60..2a6db004e 100644 --- a/BlockSettleHW/jade/jadeClient.h +++ b/BlockSettleHW/jade/jadeClient.h @@ -26,13 +26,13 @@ namespace bs { class JadeDevice; class DeviceCallbacks; - class JadeClient : protected bs::WorkerPool + class JadeClient { - friend class JadeDevice; + //friend class JadeDevice; public: JadeClient(const std::shared_ptr& , bool testNet, DeviceCallbacks*); - ~JadeClient() override = default; + ~JadeClient() = default; void initConnection(); void scanDevices(); @@ -40,45 +40,11 @@ namespace bs { std::vector deviceKeys() const; std::shared_ptr getDevice(const std::string& deviceId); - protected: - std::shared_ptr worker(const std::shared_ptr&) override final; - private: std::shared_ptr logger_; DeviceCallbacks* cb_{ nullptr }; const bool testNet_; - }; - - - struct JadeIn : public bs::InData - { - JadeIn(const std::string& s, const nlohmann::json& req) - : serial(s), request(req) {} - ~JadeIn() override = default; - const std::string serial; - const nlohmann::json request; - }; - struct JadeOut : public bs::OutData - { - JadeOut(const std::string& s) : serial(s) {} - ~JadeOut() override = default; - const std::string serial; - nlohmann::json response; - std::string error; - }; - - class JadeHandler : public bs::HandlerImpl - { - public: - JadeHandler(const std::shared_ptr&); - ~JadeHandler() override = default; - - protected: - std::shared_ptr processData(const std::shared_ptr&) override; - - private: - std::shared_ptr logger_; - uint32_t seqNo_{ 0 }; + std::vector> devices_; }; } //hw diff --git a/BlockSettleHW/jade/jadeDevice.cpp b/BlockSettleHW/jade/jadeDevice.cpp index cbe3630e5..defa2b1d9 100644 --- a/BlockSettleHW/jade/jadeDevice.cpp +++ b/BlockSettleHW/jade/jadeDevice.cpp @@ -9,7 +9,6 @@ */ #include -#include #include #include #include @@ -22,14 +21,32 @@ using namespace bs::hww; +// Helpers to build basic jade cbor request object +static inline QCborMap getRequest(const int id, const QString& method) +{ + QCborMap req; + req.insert(QCborValue(QLatin1Literal("id")), QString::number(id)); + req.insert(QCborValue(QLatin1Literal("method")), method); + return req; +} + +static inline QCborMap getRequest(const int id, const QString& method + , const QCborValue& params) +{ + QCborMap req(getRequest(id, method)); + req.insert(QCborValue(QLatin1Literal("params")), params); + return req; +} + + JadeDevice::JadeDevice(const std::shared_ptr &logger , bool testNet, DeviceCallbacks* cb, const QSerialPortInfo& endpoint) : bs::WorkerPool(1, 1) , logger_(logger), testNet_(testNet), cb_(cb), endpoint_(endpoint) { - QMetaObject::invokeMethod(qApp, [this] { +// QMetaObject::invokeMethod(qApp, [this] { handlers_.push_back(std::make_shared(logger_, endpoint_)); - }); +// }); } JadeDevice::~JadeDevice() = default; @@ -59,8 +76,10 @@ DeviceKey JadeDevice::key() const else { status = "not inited"; } -/* return {features_->label(), features_->device_id(), features_->vendor() - , walletId, status, type() };*/ + return { endpoint_.portName().toStdString() + , endpoint_.hasProductIdentifier() ? std::to_string(endpoint_.productIdentifier()) : endpoint_.portName().toStdString() + , endpoint_.hasVendorIdentifier() ? std::to_string(endpoint_.vendorIdentifier()) : endpoint_.manufacturer().toStdString() + , walletId, type() }; return {}; } @@ -72,6 +91,24 @@ DeviceType JadeDevice::type() const void JadeDevice::init() { logger_->debug("[JadeDevice::init] start"); + auto in = std::make_shared(); + in->request = getRequest(++seqId_, QLatin1Literal("get_version_info")); + + const auto& cbVersion = [this](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data) { + logger_->error("[JadeDevice::init] invalid data"); + return; + } + if (data->futResponse.wait_for(std::chrono::milliseconds{ 500 }) != std::future_status::ready) { + logger_->error("[JadeDevice::init] data timeout"); + return; + } + const auto& msg = data->futResponse.get(); + logger_->debug("[JadeDevice::init] response: {}", msg.toCborValue().toString().toStdString()); + }; + processQueued(in, cbVersion); } void JadeDevice::getPublicKeys() @@ -124,24 +161,6 @@ void JadeDevice::reset() } -// Helpers to build basic jade cbor request object -static inline QCborMap getRequest(const int id, const QString& method) -{ - QCborMap req; - req.insert(QCborValue(QLatin1Literal("id")), QString::number(id)); - req.insert(QCborValue(QLatin1Literal("method")), method); - return req; -} - -static inline QCborMap getRequest(const int id, const QString& method - , const QCborValue& params) -{ - QCborMap req(getRequest(id, method)); - req.insert(QCborValue(QLatin1Literal("params")), params); - return req; -} - - JadeSerialHandler::JadeSerialHandler(const std::shared_ptr& logger , const QSerialPortInfo& spi) : QObject(nullptr), logger_(logger), serial_(new QSerialPort(spi, this)) @@ -163,11 +182,15 @@ JadeSerialHandler::~JadeSerialHandler() std::shared_ptr JadeSerialHandler::processData(const std::shared_ptr& in) { + if (!serial_->isOpen()) { + return nullptr; + } auto out = std::make_shared(); auto prom = std::make_shared>(); out->futResponse = prom->get_future(); requests_.push_back(prom); - write(in->data); + const auto bytes = in->request.toCborValue().toCbor(); + write(bytes); return out; } diff --git a/BlockSettleHW/jade/jadeDevice.h b/BlockSettleHW/jade/jadeDevice.h index 4e4f1b09f..9c11f30cb 100644 --- a/BlockSettleHW/jade/jadeDevice.h +++ b/BlockSettleHW/jade/jadeDevice.h @@ -11,6 +11,7 @@ #ifndef JADE_DEVICE_H #define JADE_DEVICE_H +#include #include #include #include "Message/Worker.h" @@ -34,7 +35,7 @@ namespace bs { struct JadeSerialIn : public bs::InData { ~JadeSerialIn() override = default; - QByteArray data; + QCborMap request; }; struct JadeSerialOut : public bs::OutData { @@ -122,6 +123,7 @@ namespace bs { const bool testNet_; DeviceCallbacks* cb_{ nullptr }; const QSerialPortInfo endpoint_; + int seqId_{ 0 }; std::vector> handlers_; bs::core::HwWalletInfo awaitingWalletInfo_; std::string awaitingSignedTX_; diff --git a/BlockSettleHW/ledger/ledgerDevice.h b/BlockSettleHW/ledger/ledgerDevice.h index 279a6c631..ee8697612 100644 --- a/BlockSettleHW/ledger/ledgerDevice.h +++ b/BlockSettleHW/ledger/ledgerDevice.h @@ -179,86 +179,4 @@ namespace bs { } //hw } //bs -#if 0 -class LedgerCommandThread : public QThread -{ - Q_OBJECT -public: - LedgerCommandThread(const HidDeviceInfo &hidDeviceInfo, bool testNet, - const std::shared_ptr &logger, QObject *parent, const std::shared_ptr& hidLock); - ~LedgerCommandThread() override; - - void run() override; - - void prepareGetPublicKey(const DeviceKey &deviceKey); - void prepareSignTx( - const DeviceKey &deviceKey, - bs::core::wallet::TXSignRequest coreReq, - std::vector&& paths, bs::hd::Path&& changePath); - void getRootKey(); - -signals: - // Done with success - void resultReady(QVariant const &result); - - // Done with error - void error(qint32 erroCode); - - // Intermediate state - void info(QString message); - -protected: - // Device management - bool initDevice(); - void releaseDevice(); - - // APDU commands processing - bool exchangeData(const QByteArray& input, QByteArray& output, std::string&& logHeader); - // Do not use those functions straight away, use exchangeData instead - bool writeData(const QByteArray& input, const std::string& logHeader); - bool readData(QByteArray& output, const std::string& logHeader); - - // Sign tx processing - QByteArray getTrustedInput(const BinaryData&, unsigned); - QByteArray getTrustedInputSegWit_outdated(const UTXO&); - - void startUntrustedTransaction( - const std::vector&, const std::vector&, - unsigned, bool, bool, bool); - void finalizeInputFull(); - void processTXLegacy(); - void processTXSegwit(); - - // Getter - SegwitInputData getSegwitData(); - - // Tx result - void sendTxSigningResult(const QVector& responseSigned, const std::vector& inputNodes); - - -private: - void debugPrintLegacyResult(const QByteArray& responseSigned, const BIP32_Node& node); - -private: - HidDeviceInfo hidDeviceInfo_; - bool testNet_{}; - std::shared_ptr logger_; - hid_device* dongle_ = nullptr; - - enum class HardwareCommand { - None, - GetPublicKey, - SignTX, - GetRootPublicKey - }; - - // Thread purpose data - HardwareCommand threadPurpose_; - DeviceKey deviceKey_; - std::unique_ptr coreReq_{}; - std::vector inputPaths_; - bs::hd::Path changePath_; -}; -#endif - #endif // LEDGERDEVICE_H diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index d6b5eccca..4f811649e 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1161,7 +1161,7 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId ProcessingResult QtQuickAdapter::processWalletBalances(bs::message::SeqId responseId , const WalletsMessage_WalletBalances &response) { - logger_->debug("[{}] {}", __func__, response.DebugString()); + //logger_->debug("[{}] {}", __func__, response.DebugString()); const WalletBalancesModel::Balance bal{ response.spendable_balance() , response.unconfirmed_balance() , response.total_balance(), response.nb_addresses() }; From c077f402aca8268ecf01e030b43a6f8078f59e1c Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 17 Apr 2023 22:20:20 +0300 Subject: [PATCH 362/436] init jade device --- BlockSettleHW/hwdevicemanager.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index 9a9ad9e3c..5456e7819 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -10,8 +10,9 @@ */ #include "hwdevicemanager.h" #include -#include "trezor/trezorDevice.h" +#include "jade/jadeDevice.h" #include "ledger/ledgerDevice.h" +#include "trezor/trezorDevice.h" #include "TerminalMessage.h" #include "Wallets/SyncWalletsManager.h" #include "Wallets/SyncHDWallet.h" @@ -511,6 +512,8 @@ void DeviceManager::scanningDone(bool initDevices) devices_ = ledgerKeys; const auto trezorKeys = trezorClient_->deviceKeys(); devices_.insert(devices_.end(), trezorKeys.cbegin(), trezorKeys.cend()); + const auto& jadeKeys = jadeClient_->deviceKeys(); + devices_.insert(devices_.end(), jadeKeys.cbegin(), jadeKeys.cend()); for (const auto& device : devices_) { logger_->debug("[{}] found: {} {} {}", __func__, device.id, device.label, device.vendor); @@ -536,6 +539,12 @@ void DeviceManager::scanningDone(bool initDevices) device->init(); } } + for (const auto& key : jadeKeys) { + auto device = jadeClient_->getDevice(key.id); + if (!device->inited()) { + device->init(); + } + } } std::shared_ptr DeviceManager::getDevice(const DeviceKey& key) const From d02bd0f8e6f5162f6a16ec0496dcff5ff6b9c05d Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 19 Apr 2023 13:43:52 +0300 Subject: [PATCH 363/436] [QT-119] added change output in advanced TX --- GUI/QtQuick/QTXSignRequest.cpp | 20 +++++++++ GUI/QtQuick/QTXSignRequest.h | 4 ++ GUI/QtQuick/TxOutputsModel.cpp | 45 ++++++++++--------- GUI/QtQuick/TxOutputsModel.h | 9 ++-- .../qml/Send/SignTransactionAdvanced.qml | 11 ++--- 5 files changed, 57 insertions(+), 32 deletions(-) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index 9390a71ef..aab25eaf0 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -21,6 +21,26 @@ QTXSignRequest::QTXSignRequest(const std::shared_ptr& logger, QO void QTXSignRequest::setTxSignReq(const bs::core::wallet::TXSignRequest& txReq) { txReq_ = txReq; + + QMetaObject::invokeMethod(this, [this] { + if (outputsModel_) { + outputsModel_->clearOutputs(); + } + else { + outputsModel_ = new TxOutputsModel(logger_, this, true); + } + for (const auto& recip : txReq_.getRecipients([](const bs::Address&) { return true; })) { + try { + const auto& addr = bs::Address::fromRecipient(recip); + outputsModel_->addOutput(QString::fromStdString(addr.display()) + , recip->getValue() / BTCNumericTypes::BalanceDivider + , addr == txReq_.change.address); + } + catch (const std::exception& ) {} + } + emit txSignReqChanged(); + }); + std::vector inputs; inputs.reserve(txReq.armorySigner_.getTxInCount()); for (unsigned int i = 0; i < txReq.armorySigner_.getTxInCount(); ++i) { diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h index ebea9901c..15daf94ab 100644 --- a/GUI/QtQuick/QTXSignRequest.h +++ b/GUI/QtQuick/QTXSignRequest.h @@ -17,6 +17,7 @@ #include "BinaryData.h" #include "CoreWallet.h" #include "TxInputsModel.h" +#include "TxOutputsModel.h" namespace spdlog { class logger; @@ -79,6 +80,8 @@ class QTXSignRequest : public QObject bool hasError() const { return !error_.isEmpty(); } Q_PROPERTY(TxInputsModel* inputs READ inputsModel NOTIFY txSignReqChanged) TxInputsModel* inputsModel() const { return inputsModel_; } + Q_PROPERTY(TxOutputsModel* outputs READ outputsModel NOTIFY txSignReqChanged) + TxOutputsModel* outputsModel() const { return outputsModel_; } Q_PROPERTY(bool isWatchingOnly READ isWatchingOnly NOTIFY txSignReqChanged) bool isWatchingOnly() const; void setWatchingOnly(bool watchingOnly); @@ -95,6 +98,7 @@ class QTXSignRequest : public QObject QString error_; std::vector inputs_; TxInputsModel* inputsModel_{ nullptr }; + TxOutputsModel* outputsModel_{ nullptr }; bool isHWW_{ false }; bool isHWWready_{ false }; bool isWatchingOnly_ { false }; diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index bb7eb2aa3..833b4a40f 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -24,9 +24,10 @@ namespace { }; } -TxOutputsModel::TxOutputsModel(const std::shared_ptr& logger, QObject* parent) - : QAbstractTableModel(parent), logger_(logger) - , header_{ tr("Output Address"), tr("Amount (BTC)"), {} } +TxOutputsModel::TxOutputsModel(const std::shared_ptr& logger + , QObject* parent, bool readOnly) + : QAbstractTableModel(parent), logger_(logger), readOnly_(readOnly) + , header_{ tr("Output Address"), {}, tr("Amount (BTC)"), {} } { connect(this, &TxOutputsModel::modelReset, this, &TxOutputsModel::rowCountChanged); @@ -43,7 +44,7 @@ int TxOutputsModel::rowCount(const QModelIndex &) const int TxOutputsModel::columnCount(const QModelIndex &) const { - return header_.size(); + return readOnly_ ? header_.size() - 1 : header_.size(); } QVariant TxOutputsModel::data(const QModelIndex& index, int role) const @@ -54,7 +55,7 @@ QVariant TxOutputsModel::data(const QModelIndex& index, int role) const case HeadingRole: return (index.row() == 0); case ColorRole: - return dataColor(index.row(), index.column()); + return dataColor(index.row()); default: break; } return QVariant(); @@ -101,19 +102,19 @@ void TxOutputsModel::clearOutputs() QStringList TxOutputsModel::getOutputAddresses() const { QStringList res; - for(int row=1; row TxOutputsModel::getOutputAmounts() const { QList res; - for(int row=1; rowdebug("[{}] {} entries", __func__, data_.size()); } -void TxOutputsModel::addOutput(const QString& address, double amount) +void TxOutputsModel::addOutput(const QString& address, double amount, bool isChange) { bs::Address addr; try { @@ -136,8 +137,8 @@ void TxOutputsModel::addOutput(const QString& address, double amount) catch (const std::exception&) { return; } - QMetaObject::invokeMethod(this, [this, addr, amount] { - Entry entry{ addr, amount }; + QMetaObject::invokeMethod(this, [this, addr, amount, isChange] { + Entry entry{ addr, amount, isChange }; beginInsertRows(QModelIndex(), rowCount(), rowCount()); data_.emplace_back(std::move(entry)); endInsertRows(); @@ -146,7 +147,7 @@ void TxOutputsModel::addOutput(const QString& address, double amount) void TxOutputsModel::delOutput(int row) { - if (row == 0) { + if (readOnly_ || (row == 0)) { return; } beginRemoveRows(QModelIndex(), row, row); @@ -164,16 +165,18 @@ QVariant TxOutputsModel::getData(int row, int col) const case 0: return QString::fromStdString(entry.address.display()); case 1: + return entry.isChange ? tr("(change)") : QString{}; + case 2: return gui_utils::xbtToQString(entry.amount); default: break; } return {}; } -QColor TxOutputsModel::dataColor(int row, int col) const +QColor TxOutputsModel::dataColor(int row) const { - if (row == 0) { - return ColorScheme::tableHeaderColor; - } - return ColorScheme::tableTextColor; + if (row == 0) { + return ColorScheme::tableHeaderColor; + } + return ColorScheme::tableTextColor; } diff --git a/GUI/QtQuick/TxOutputsModel.h b/GUI/QtQuick/TxOutputsModel.h index e2153b1fe..26a97802d 100644 --- a/GUI/QtQuick/TxOutputsModel.h +++ b/GUI/QtQuick/TxOutputsModel.h @@ -35,7 +35,8 @@ class TxOutputsModel : public QAbstractTableModel public: enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, WidthRole , ColorRole }; - TxOutputsModel(const std::shared_ptr&, QObject* parent = nullptr); + TxOutputsModel(const std::shared_ptr&, QObject* parent = nullptr + , bool readOnly = false); int rowCount(const QModelIndex & = QModelIndex()) const override; int columnCount(const QModelIndex & = QModelIndex()) const override; @@ -46,7 +47,7 @@ class TxOutputsModel : public QAbstractTableModel double totalAmount() const; std::vector> recipients() const; - Q_INVOKABLE void addOutput(const QString& address, double amount); + Q_INVOKABLE void addOutput(const QString& address, double amount, bool isChange = false); Q_INVOKABLE void delOutput(int row); Q_INVOKABLE void clearOutputs(); Q_INVOKABLE QStringList getOutputAddresses() const; @@ -59,15 +60,17 @@ class TxOutputsModel : public QAbstractTableModel private: QVariant getData(int row, int col) const; - QColor dataColor(int row, int col) const; + QColor dataColor(int row) const; private: std::shared_ptr logger_; + const bool readOnly_; const QStringList header_; struct Entry { bs::Address address; double amount; + bool isChange{ false }; }; std::vector data_; }; diff --git a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml index 7b6a2eada..e582890d6 100644 --- a/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml +++ b/GUI/QtQuick/qml/Send/SignTransactionAdvanced.qml @@ -130,18 +130,13 @@ ColumnLayout { height: parent.height - BSSizes.applyScale(24) anchors.centerIn: parent - model: txOutputsModel - columnWidths: [0.744, 0.20, 0.056] + model: txSignRequest !== null ? txSignRequest.outputs : [] + columnWidths: [0.7, 0.1, 0.20] copy_button_column_index: -1 - delete_button_column_index: 2 + delete_button_column_index: -1 has_header: false - onDeleteRequested: (row) => - { - txOutputsModel.delOutput(row) - } - function get_text_left_padding(row, column) { return (row === 0 && column === 0) ? 0 : left_text_padding From 530c4b992c0e619ef743867d4dbee13d2e21f823 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 19 Apr 2023 14:54:22 +0300 Subject: [PATCH 364/436] fix jade detection --- BlockSettleHW/hwdevicemanager.cpp | 28 +++++++++++++++++++++++----- BlockSettleHW/jade/jadeDevice.cpp | 2 ++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index 5456e7819..6f6ce6837 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -499,6 +499,9 @@ void DeviceManager::devicesResponse() HW::DeviceMgrMessage msg; auto msgResp = msg.mutable_available_devices(); for (const auto& key : devices_) { + if (key.walletId.empty()) { + continue; + } deviceKeyToMsg(key, msgResp->add_device_keys()); } logger_->debug("[{}] {}", __func__, msg.DebugString()); @@ -573,19 +576,34 @@ void DeviceManager::publicKeyReady(const DeviceKey& devKey) } size_t nbCompleted = 0; bool foundDevice = false; + bool delDevice = false; for (auto& device : devices_) { if (device.id == devKey.id) { - device.walletId = devKey.walletId; - nbCompleted++; - foundDevice = true; + if (devKey.walletId.empty()) { + delDevice = true; + } + else { + device.walletId = devKey.walletId; + nbCompleted++; + foundDevice = true; + } } else if (!device.walletId.empty()) { nbCompleted++; } } if (!foundDevice) { - devices_.push_back(devKey); - nbCompleted++; + if (delDevice) { + const auto& it = std::find_if(devices_.cbegin(), devices_.cend() + , [devKey](const DeviceKey& key) {return (key.id == devKey.id); }); + if (it != devices_.end()) { + devices_.erase(it); + } + } + else { + devices_.push_back(devKey); + nbCompleted++; + } } if (nbCompleted >= devices_.size()) { logger_->debug("[{}] all public keys retrieved", __func__); diff --git a/BlockSettleHW/jade/jadeDevice.cpp b/BlockSettleHW/jade/jadeDevice.cpp index defa2b1d9..3149e48c8 100644 --- a/BlockSettleHW/jade/jadeDevice.cpp +++ b/BlockSettleHW/jade/jadeDevice.cpp @@ -99,10 +99,12 @@ void JadeDevice::init() const auto& data = std::static_pointer_cast(out); if (!data) { logger_->error("[JadeDevice::init] invalid data"); + cb_->publicKeyReady(key()); return; } if (data->futResponse.wait_for(std::chrono::milliseconds{ 500 }) != std::future_status::ready) { logger_->error("[JadeDevice::init] data timeout"); + cb_->publicKeyReady(key()); return; } const auto& msg = data->futResponse.get(); From 60d6c3dbb5a24a38e03fe03f41b0391ce7f037a1 Mon Sep 17 00:00:00 2001 From: yz Date: Tue, 18 Apr 2023 16:45:23 +0300 Subject: [PATCH 365/436] Advanced tranasctions max; wallet selection fix --- GUI/QtQuick/qml/Overview/OverviewWalletBar.qml | 16 +++++++++------- GUI/QtQuick/qml/OverviewPage.qml | 4 ++++ GUI/QtQuick/qml/Send/AdvancedDetails.qml | 11 +++++++++-- GUI/QtQuick/qml/Send/AmountInput.qml | 13 +++++++------ 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index 966565d03..778086db1 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -66,17 +66,19 @@ Rectangle { if (model === walletBalances) { wallet_selection_combobox.currentIndex = walletBalances.selectedWallet } - else { - walletBalances.selectedWallet = -1 - } } Connections { target: bsApp function onRequestWalletSelection(index) { - bsApp.walletSelected(index) - control.walletIndexChanged(index) - wallet_selection_combobox.currentIndex = index + var modelSize = (wallet_selection_combobox.model === walletBalances) + ? wallet_selection_combobox.model.rowCount + : wallet_selection_combobox.length + if (index >= 0 && index < modelSize) { + bsApp.walletSelected(index) + control.walletIndexChanged(index) + wallet_selection_combobox.currentIndex = index + } } } } @@ -98,7 +100,7 @@ Rectangle { anchors.right: parent.right Controls.CustomMediumButton { - enabled: walletBalances.selectedWallet >= 0 + enabled: wallet_selection_combobox.model == walletBalances && walletBalances.selectedWallet >= 0 text: qsTr("Wallet Properties") onClicked: control.requestWalletProperties() } diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index a386b3de2..f8b389d82 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -32,6 +32,10 @@ Rectangle { signal openSend (string txId, bool isRBF, bool isCPFP) signal openExplorer (string txId) + MouseArea { + anchors.fill: parent + } + AddressDetails { id: addressDetails visible: false diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index ec00950b3..5f415fb3b 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -440,6 +440,15 @@ ColumnLayout { width: BSSizes.applyScale(504) height: BSSizes.applyScale(70) + function getMax() { + console.log(txInputsSelectedModel.rowCount) + if (!isRBF && !isCPFP && txInputsSelectedModel.rowCount > 1) { + return (txInputsSelectedModel.sourceModel.balance - txOutputsModel.totalAmount).toFixed(8) + } + return tempRequest.maxAmount + + } + onEnterPressed: { if (!processEnterKey()) { comment_input.setActiveFocus() @@ -451,8 +460,6 @@ ColumnLayout { comment_input.setActiveFocus() } } - - balanceSubtractor: txOutputsModel.totalAmount } CustomTextEdit { diff --git a/GUI/QtQuick/qml/Send/AmountInput.qml b/GUI/QtQuick/qml/Send/AmountInput.qml index cad604c25..5dfc616bf 100644 --- a/GUI/QtQuick/qml/Send/AmountInput.qml +++ b/GUI/QtQuick/qml/Send/AmountInput.qml @@ -18,11 +18,13 @@ CustomTextInput { id: amount_input - property var balanceSubtractor: null - //aliases title_text: qsTr("Amount") + function getMax() { + return tempRequest.maxAmount + } + //app (if was launched from visual studio) crashes when there is input_validator //and we change text inside of onTextEdited //it is why I have realized my validator inside of onTextEdited @@ -57,7 +59,7 @@ CustomTextInput { return } - if (input_number < 0 || (input_number > tempRequest.maxAmount)) + if (input_number < 0 || (input_number > amount_input.getMax())) { amount_input.input_text = prev_text return @@ -85,9 +87,8 @@ CustomTextInput { enabled: (tempRequest != null) function click_enter() { - console.log(tempRequest, tempRequest.maxAmount) - if (tempRequest != null && tempRequest.maxAmount.length > 0) { - amount_input.input_text = (parseFloat(tempRequest.maxAmount) - (balanceSubtractor !== null ? balanceSubtractor : 0.0)).toFixed(8) + if (tempRequest != null && amount_input.getMax().length > 0) { + amount_input.input_text = amount_input.getMax() } } } From 17ccd4e423ac7d3f6d37395b31b9ca9d68e53e17 Mon Sep 17 00:00:00 2001 From: yz Date: Tue, 18 Apr 2023 17:14:40 +0300 Subject: [PATCH 366/436] Removed debug logs --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 5f415fb3b..c57ce81ac 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -441,7 +441,6 @@ ColumnLayout { height: BSSizes.applyScale(70) function getMax() { - console.log(txInputsSelectedModel.rowCount) if (!isRBF && !isCPFP && txInputsSelectedModel.rowCount > 1) { return (txInputsSelectedModel.sourceModel.balance - txOutputsModel.totalAmount).toFixed(8) } From 0f413dadbd9bf9c723936b0486ca1e906c8802fc Mon Sep 17 00:00:00 2001 From: yz Date: Wed, 19 Apr 2023 13:47:29 +0300 Subject: [PATCH 367/436] Max transaction on multiple outputs --- GUI/QtQuick/TxInputsModel.cpp | 9 +++++++++ GUI/QtQuick/TxInputsModel.h | 1 + GUI/QtQuick/qml/Send/AdvancedDetails.qml | 23 ++++++++++++++++++++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 83e4c806d..2713b8153 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -505,3 +505,12 @@ QVariant TxInputsModel::getData(int row, int col) const } return {}; } + +void TxInputsModel::clearSelection() +{ + selectionUtxos_.clear(); + selectionAddresses_.clear(); + selectedBalance_ = 0.0f; + emit selectionChanged(); + emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); +} \ No newline at end of file diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index eb3c76e3a..e804d1354 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -109,6 +109,7 @@ class TxInputsModel : public QAbstractTableModel Q_INVOKABLE QUTXOList* getSelection(); Q_INVOKABLE QUTXOList* zcInputs() const; Q_INVOKABLE void updateAutoselection(); + Q_INVOKABLE void clearSelection(); signals: void selectionChanged() const; diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index c57ce81ac..6e424cb6d 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -442,7 +442,8 @@ ColumnLayout { function getMax() { if (!isRBF && !isCPFP && txInputsSelectedModel.rowCount > 1) { - return (txInputsSelectedModel.sourceModel.balance - txOutputsModel.totalAmount).toFixed(8) + var maxValue = parseFloat(tempRequest.maxAmount) - txInputsSelectedModel.sourceModel.balance + return (maxValue >= 0 ? maxValue : 0).toFixed(8) } return tempRequest.maxAmount @@ -543,6 +544,12 @@ ColumnLayout { onDeleteRequested: (row) => { txOutputsModel.delOutput(row) + if (txOutputsModel.rowCount <= 1 && !isRBF && !isCPFP) { + txInputsModel.clearSelection() + } + else if (txOutputsModel.rowCount > 1 && !isRBF && !isCPFP) { + txInputsModel.updateAutoselection() + } } function get_text_left_padding(row, column) @@ -659,8 +666,18 @@ ColumnLayout { { if (rec_addr_input.isValid && rec_addr_input.input_text.length) { var fpb = parseFloat(fee_suggest_combo.edit_value()) - tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) + if (!isRBF && !isCPFP && txInputsSelectedModel.rowCount > 1) { + var outputAddresses = txOutputsModel.getOutputAddresses() + outputAddresses.push(rec_addr_input.input_text) + var outputAmounts = txOutputsModel.getOutputAmounts() + tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , outputAddresses, outputAmounts, + (fpb > 0) ? fpb : 1.0) + } + else { + tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) + } } } From 598f07650a124e98c4f6f568dbaed258d6338441 Mon Sep 17 00:00:00 2001 From: yz Date: Fri, 21 Apr 2023 14:10:36 +0300 Subject: [PATCH 368/436] Transactions fix; export fix; import transaction --- GUI/QtQuick/AddressFilterModel.cpp | 27 +++---- GUI/QtQuick/QTXSignRequest.cpp | 34 ++++++++ GUI/QtQuick/QTXSignRequest.h | 4 + GUI/QtQuick/QtQuickAdapter.cpp | 6 ++ GUI/QtQuick/images/import_icon.svg | 4 + GUI/QtQuick/qml/Send/AdvancedDetails.qml | 79 ++++++++++++++++--- GUI/QtQuick/qml/Send/SendPopup.qml | 5 ++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 76 +++++++++++++++--- .../qml/WalletProperties/WalletSeed.qml | 10 +-- GUI/QtQuick/qtquick.qrc | 1 + 10 files changed, 203 insertions(+), 43 deletions(-) create mode 100644 GUI/QtQuick/images/import_icon.svg diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp index f36199f5e..0da5610ae 100644 --- a/GUI/QtQuick/AddressFilterModel.cpp +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -82,21 +82,18 @@ bool AddressFilterModel::filterAcceptsRow(int source_row, const QModelIndex& sou bool AddressFilterModel::lessThan(const QModelIndex& left, const QModelIndex& right) const { try { - if (!qFuzzyIsNull(sourceModel()->data(sourceModel()->index(left.row(), 2) - , QmlAddressListModel::TableRoles::TableDataRole).toDouble()) && - qFuzzyIsNull(sourceModel()->data(sourceModel()->index(right.row(), 2) - , QmlAddressListModel::TableRoles::TableDataRole).toDouble())) { - return true; - } - else if (qFuzzyIsNull(sourceModel()->data(sourceModel()->index(left.row(), 2) - , QmlAddressListModel::TableRoles::TableDataRole).toDouble()) == - qFuzzyIsNull(sourceModel()->data(sourceModel()->index(right.row(), 2) - , QmlAddressListModel::TableRoles::TableDataRole).toDouble())) { - return (sourceModel()->data(sourceModel()->index(left.row(), 0) - , QmlAddressListModel::TableRoles::AddressTypeRole).toString().remove(0, 2).toInt() < - sourceModel()->data(sourceModel()->index(right.row(), 0) - , QmlAddressListModel::TableRoles::AddressTypeRole).toString().remove(0, 2).toInt()); - } + const auto leftAmount = sourceModel()->data(sourceModel()->index(left.row(), 2) + , QmlAddressListModel::TableRoles::TableDataRole).toDouble(); + const auto leftIndex = sourceModel()->data(sourceModel()->index(left.row(), 0) + , QmlAddressListModel::TableRoles::AddressTypeRole).toString().remove(0, 2).toInt(); + const auto rightAmount = sourceModel()->data(sourceModel()->index(right.row(), 2) + , QmlAddressListModel::TableRoles::TableDataRole).toDouble(); + const auto rightIndex = sourceModel()->data(sourceModel()->index(right.row(), 0) + , QmlAddressListModel::TableRoles::AddressTypeRole).toString().remove(0, 2).toInt(); + if (qFuzzyIsNull(leftAmount) ^ qFuzzyIsNull(rightAmount)) { + return qFuzzyIsNull(rightAmount); + } + return leftIndex < rightIndex; } catch (...) {} return false; diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index aab25eaf0..d16927f80 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -81,6 +81,9 @@ QStringList QTXSignRequest::outputAddresses() const for (const auto& recip : txReq_.getRecipients([](const bs::Address&) { return true; })) { try { const auto& addr = bs::Address::fromRecipient(recip); + if (addr == txReq_.change.address) { + continue; + } result.append(QString::fromStdString(addr.display())); } catch (const std::exception& e) { @@ -100,6 +103,29 @@ QString QTXSignRequest::outputAmount() const , 'f', 8); } +QStringList QTXSignRequest::outputAmounts() const +{ + if (!txReq_.isValid()) { + return {}; + } + QStringList result; + for (const auto& recip : txReq_.getRecipients([](const bs::Address&) { return true; })) { + try { + const auto& recipAddr = bs::Address::fromRecipient(recip); + if (recipAddr == txReq_.change.address) { + continue; + } + result.append( + QString::number(txReq_.amountReceived([recipAddr] + (const bs::Address& addr) { return (addr == recipAddr); }) / BTCNumericTypes::BalanceDivider, 'f', 8)); + } + catch (const std::exception& e) { + result.append(QLatin1String("error: ") + QLatin1String(e.what())); + } + } + return result; +} + QString QTXSignRequest::inputAmount() const { if (!txReq_.isValid()) { @@ -153,3 +179,11 @@ void QTXSignRequest::setWatchingOnly(bool watchingOnly) isWatchingOnly_ = watchingOnly; emit txSignReqChanged(); } + +QString QTXSignRequest::comment() const +{ + if (!txReq_.isValid()) { + return {}; + } + return QString::fromStdString(txReq_.comment); +} \ No newline at end of file diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h index 15daf94ab..9d01d3fe6 100644 --- a/GUI/QtQuick/QTXSignRequest.h +++ b/GUI/QtQuick/QTXSignRequest.h @@ -57,6 +57,8 @@ class QTXSignRequest : public QObject QStringList outputAddresses() const; Q_PROPERTY(QString outputAmount READ outputAmount NOTIFY txSignReqChanged) QString outputAmount() const; + Q_PROPERTY(QStringList outputAmounts READ outputAmounts NOTIFY txSignReqChanged) + QStringList outputAmounts() const; Q_PROPERTY(QString inputAmount READ inputAmount NOTIFY txSignReqChanged) QString inputAmount() const; Q_PROPERTY(QString returnAmount READ returnAmount NOTIFY txSignReqChanged) @@ -85,6 +87,8 @@ class QTXSignRequest : public QObject Q_PROPERTY(bool isWatchingOnly READ isWatchingOnly NOTIFY txSignReqChanged) bool isWatchingOnly() const; void setWatchingOnly(bool watchingOnly); + Q_PROPERTY(QString comment READ comment NOTIFY txSignReqChanged) + QString comment() const; signals: void txSignReqChanged(); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 4f811649e..fc78c1102 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1840,6 +1840,12 @@ bs::message::ProcessingResult QtQuickAdapter::processWalletDeleted(const std::st logger_->debug("[{}] {}", __func__, walletId); walletBalances_->deleteWallet(walletId); + txModel_->clear(); + + WalletsMessage msg; + msg.set_get_ledger_entries({}); + pushRequest(user_, userWallets_, msg.SerializeAsString()); + emit successDeleteWallet(); return bs::message::ProcessingResult::Success; } diff --git a/GUI/QtQuick/images/import_icon.svg b/GUI/QtQuick/images/import_icon.svg new file mode 100644 index 000000000..5d1edbff7 --- /dev/null +++ b/GUI/QtQuick/images/import_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 6e424cb6d..865d07ee7 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -44,27 +44,84 @@ ColumnLayout { Layout.fillWidth: true Layout.preferredHeight : BSSizes.applyScale(34) - - Label { - Layout.fillWidth: true - Layout.preferredHeight : BSSizes.applyScale(34) - } + Layout.leftMargin: BSSizes.applyScale(20) + Layout.topMargin: BSSizes.applyScale(10) CustomTitleLabel { id: title - Layout.rightMargin: BSSizes.applyScale(378) - Layout.alignment: Qt.AlignRight | Qt.AlingVCenter + Layout.alignment: Qt.AlingVCenter text: (!isRBF && !isCPFP) ? qsTr("Send Bitcoin") : (isRBF ? qsTr("Send Bitcoin (RBF)") : qsTr("Send Bitcoin (CPFP)")) } + Label { + Layout.fillWidth: true + Layout.preferredHeight : BSSizes.applyScale(34) + } + + Button { + id: import_transaction_button + + // Layout.rightMargin: BSSizes.applyScale(60) + Layout.alignment: Qt.AlingVCenter + + activeFocusOnTab: false + + font.pixelSize: BSSizes.applyScale(13) + font.family: "Roboto" + font.weight: Font.Normal + palette.buttonText: BSStyle.titleTextColor + + text: qsTr("Import transaction") + + + icon.color: "transparent" + icon.source: "qrc:/images/import_icon.svg" + icon.width: BSSizes.applyScale(16) + icon.height: BSSizes.applyScale(16) + + background: Rectangle { + implicitWidth: BSSizes.applyScale(156) + implicitHeight: BSSizes.applyScale(34) + color: "transparent" + + radius: BSSizes.applyScale(14) + + border.color: BSStyle.defaultBorderColor + border.width: BSSizes.applyScale(1) + + } + + onClicked: { + importTransactionFileDialog.open() + } + + FileDialog { + id: importTransactionFileDialog + title: qsTr("Please choose transaction to import") + folder: shortcuts.documents + selectFolder: false + selectExisting: true + onAccepted: { + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) + tempRequest = bsApp.importTransaction(importTransactionFileDialog.fileUrl) + for (var i = 0; i < tempRequest.outputAddresses.length; ++i) { + txOutputsModel.addOutput(tempRequest.outputAddresses[i], tempRequest.outputAmounts[i]) + } + comment_input.input_text = tempRequest.comment + txInputsModel.updateAutoselection() + } + } + } + Button { id: simple_but + Layout.leftMargin: BSSizes.applyScale(20) Layout.rightMargin: BSSizes.applyScale(60) - Layout.alignment: Qt.AlignRight | Qt.AlingVCenter + Layout.alignment: Qt.AlingVCenter activeFocusOnTab: false @@ -442,7 +499,7 @@ ColumnLayout { function getMax() { if (!isRBF && !isCPFP && txInputsSelectedModel.rowCount > 1) { - var maxValue = parseFloat(tempRequest.maxAmount) - txInputsSelectedModel.sourceModel.balance + var maxValue = parseFloat(tempRequest.maxAmount) - txOutputsModel.totalAmount return (maxValue >= 0 ? maxValue : 0).toFixed(8) } return tempRequest.maxAmount @@ -590,7 +647,7 @@ ColumnLayout { Layout.bottomMargin: BSSizes.applyScale(30) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - text: bsApp.walletProperitesVM.isWatchingOnly ? qsTr("Export transaction") : qsTr("Continue") + text: (tempRequest !== null && tempRequest.isWatchingOnly) ? qsTr("Export transaction") : qsTr("Continue") function prepare_transaction() { if (isRBF) { @@ -629,7 +686,7 @@ ColumnLayout { fee_suggest_combo.input_text = fee_suggest_combo.currentText } - if (bsApp.walletProperitesVM.isWatchingOnly) + if (tempRequest.isWatchingOnly) { exportFileDialog.open() } diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 83f4a3c44..153c8f04b 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -102,6 +102,11 @@ CustomPopup { CustomSuccessDialog { id: exportTransactionSuccessDailog visible: false + + onSig_finish: { + root.close() + _stack_view.pop(null) + } } CustomFailDialog { diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 43e14b400..db774d679 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -26,33 +26,88 @@ ColumnLayout { Layout.fillWidth: true Layout.preferredHeight : BSSizes.applyScale(34) + Layout.leftMargin: BSSizes.applyScale(20) + Layout.topMargin: BSSizes.applyScale(10) + + CustomTitleLabel { + id: title + + Layout.alignment: Qt.AlingVCenter + text: qsTr("Send Bitcoin") + } Label { Layout.fillWidth: true Layout.preferredHeight : BSSizes.applyScale(34) } - CustomTitleLabel { - id: title + Button { + id: import_transaction_button - Layout.rightMargin: BSSizes.applyScale(104) - Layout.alignment: Qt.AlignRight | Qt.AlingVCenter + // Layout.rightMargin: BSSizes.applyScale(60) + Layout.alignment: Qt.AlingVCenter - text: qsTr("Send Bitcoin") + activeFocusOnTab: false + + font.pixelSize: BSSizes.applyScale(13) + font.family: "Roboto" + font.weight: Font.Normal + palette.buttonText: BSStyle.titleTextColor + + text: qsTr("Import transaction") + + + icon.color: "transparent" + icon.source: "qrc:/images/import_icon.svg" + icon.width: BSSizes.applyScale(16) + icon.height: BSSizes.applyScale(16) + + background: Rectangle { + implicitWidth: BSSizes.applyScale(156) + implicitHeight: BSSizes.applyScale(34) + color: "transparent" + + radius: BSSizes.applyScale(14) + + border.color: BSStyle.defaultBorderColor + border.width: BSSizes.applyScale(1) + + } + + onClicked: { + importTransactionFileDialog.open() + } + + FileDialog { + id: importTransactionFileDialog + title: qsTr("Please choose transaction to import") + folder: shortcuts.documents + selectFolder: false + selectExisting: true + onAccepted: { + tempRequest = bsApp.importTransaction(importTransactionFileDialog.fileUrl) + + rec_addr_input.input_text = tempRequest.outputAddresses[0] + amount_input.input_text = tempRequest.outputAmounts[0] + comment_input.input_text = tempRequest.comment + create_temp_request() + } + } } Button { id: advanced_but - Layout.rightMargin: BSSizes.applyScale(60) - Layout.alignment: Qt.AlignRight | Qt.AlingVCenter + Layout.leftMargin: BSSizes.applyScale(20) + Layout.rightMargin: BSSizes.applyScale(40) + Layout.alignment: Qt.AlingVCenter activeFocusOnTab: false font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" font.weight: Font.Normal - palette.buttonText: "#7A88B0" + palette.buttonText: BSStyle.titleTextColor text: qsTr("Advanced") @@ -95,7 +150,6 @@ ColumnLayout { amount_input.setActiveFocus() } - function createTempRequest() { create_temp_request() } @@ -214,7 +268,7 @@ ColumnLayout { Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - text: bsApp.walletProperitesVM.isWatchingOnly ? qsTr("Export transaction") : qsTr("Continue") + text: (tempRequest !== null && tempRequest.isWatchingOnly) ? qsTr("Export transaction") : qsTr("Continue") preferred: true @@ -230,7 +284,7 @@ ColumnLayout { fee_suggest_combo.input_text = fee_suggest_combo.currentText } - if (bsApp.walletProperitesVM.isWatchingOnly) + if (tempRequest.isWatchingOnly) { exportFileDialog.open() } diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml index 0473aec71..ea9da56de 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml @@ -31,6 +31,10 @@ ColumnLayout { Layout.leftMargin: BSSizes.applyScale(25) Layout.topMargin: BSSizes.applyScale(32) + ScrollBar.vertical: ScrollBar { + policy: ScrollBar.AlwaysOn + } + cellHeight : BSSizes.applyScale(56) cellWidth : BSSizes.applyScale(180) @@ -41,12 +45,6 @@ ColumnLayout { } } - Label { - id: spacer - Layout.fillWidth: true - Layout.fillHeight: true - } - CustomButton { id: confirm_but text: qsTr("Copy seed") diff --git a/GUI/QtQuick/qtquick.qrc b/GUI/QtQuick/qtquick.qrc index e0ffe432b..b9b8825dc 100644 --- a/GUI/QtQuick/qtquick.qrc +++ b/GUI/QtQuick/qtquick.qrc @@ -222,5 +222,6 @@ qml/Plugins/SideSwap/Controls/CustomBorderedButton.qml qml/Plugins/SideSwap/SideSwapPegOut.qml qml/Plugins/SideSwap/SideSwapPegIn.qml + images/import_icon.svg From 0896bc194f035cc37aa2d287113e0b58fef5feef Mon Sep 17 00:00:00 2001 From: yz Date: Fri, 21 Apr 2023 14:11:56 +0300 Subject: [PATCH 369/436] additional new line --- GUI/QtQuick/QTXSignRequest.cpp | 2 +- GUI/QtQuick/TxInputsModel.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index d16927f80..ec4a55b67 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -186,4 +186,4 @@ QString QTXSignRequest::comment() const return {}; } return QString::fromStdString(txReq_.comment); -} \ No newline at end of file +} diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 2713b8153..30d29eb44 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -513,4 +513,4 @@ void TxInputsModel::clearSelection() selectedBalance_ = 0.0f; emit selectionChanged(); emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); -} \ No newline at end of file +} From 4c11f31c4e3ef16a732e2bef333847224abf919c Mon Sep 17 00:00:00 2001 From: yz Date: Fri, 21 Apr 2023 15:07:06 +0300 Subject: [PATCH 370/436] Import transaction in wo wallet --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 865d07ee7..5c3e8c884 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -112,6 +112,10 @@ ColumnLayout { } comment_input.input_text = tempRequest.comment txInputsModel.updateAutoselection() + tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() + , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text + , checkbox_rbf.checked, txInputsModel.getSelection()) } } } From 8f5ebc58c302a2a5482f96ca8027b953c25e0118 Mon Sep 17 00:00:00 2001 From: yz Date: Fri, 21 Apr 2023 17:44:51 +0300 Subject: [PATCH 371/436] Review fixes --- GUI/QtQuick/AddressFilterModel.cpp | 2 +- GUI/QtQuick/QTXSignRequest.cpp | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp index 0da5610ae..3a200e301 100644 --- a/GUI/QtQuick/AddressFilterModel.cpp +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -90,7 +90,7 @@ bool AddressFilterModel::lessThan(const QModelIndex& left, const QModelIndex& ri , QmlAddressListModel::TableRoles::TableDataRole).toDouble(); const auto rightIndex = sourceModel()->data(sourceModel()->index(right.row(), 0) , QmlAddressListModel::TableRoles::AddressTypeRole).toString().remove(0, 2).toInt(); - if (qFuzzyIsNull(leftAmount) ^ qFuzzyIsNull(rightAmount)) { + if (qFuzzyIsNull(leftAmount) != qFuzzyIsNull(rightAmount)) { return qFuzzyIsNull(rightAmount); } return leftIndex < rightIndex; diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index ec4a55b67..c130d1624 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -78,12 +78,10 @@ QStringList QTXSignRequest::outputAddresses() const return {}; } QStringList result; - for (const auto& recip : txReq_.getRecipients([](const bs::Address&) { return true; })) { + for (const auto& recip : txReq_.getRecipients([changeAddr = txReq_.change.address](const bs::Address& addr) + { return addr != changeAddr; })) { try { const auto& addr = bs::Address::fromRecipient(recip); - if (addr == txReq_.change.address) { - continue; - } result.append(QString::fromStdString(addr.display())); } catch (const std::exception& e) { @@ -109,12 +107,9 @@ QStringList QTXSignRequest::outputAmounts() const return {}; } QStringList result; - for (const auto& recip : txReq_.getRecipients([](const bs::Address&) { return true; })) { + for (const auto& recip : txReq_.getRecipients([changeAddr = txReq_.change.address](const bs::Address& addr) { return addr != changeAddr; })) { try { const auto& recipAddr = bs::Address::fromRecipient(recip); - if (recipAddr == txReq_.change.address) { - continue; - } result.append( QString::number(txReq_.amountReceived([recipAddr] (const bs::Address& addr) { return (addr == recipAddr); }) / BTCNumericTypes::BalanceDivider, 'f', 8)); From 5200714af6cdea7b666658456027572c59ae9deb Mon Sep 17 00:00:00 2001 From: yz Date: Sun, 23 Apr 2023 09:20:54 +0300 Subject: [PATCH 372/436] Export wallet as pdf; rbf & cpfp fix --- GUI/QtQuick/PaperBackupWriter.cpp | 166 ++++++++++++++++++ GUI/QtQuick/PaperBackupWriter.h | 59 +++++++ GUI/QtQuick/QtQuickAdapter.cpp | 34 ++++ GUI/QtQuick/QtQuickAdapter.h | 2 + GUI/QtQuick/TxListModel.cpp | 31 ++-- GUI/QtQuick/TxListModel.h | 4 +- GUI/QtQuick/images/RPK_template.png | Bin 0 -> 271241 bytes GUI/QtQuick/qml/Send/AdvancedDetails.qml | 15 +- GUI/QtQuick/qml/Send/SendPopup.qml | 19 ++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 12 +- .../qml/StyledControls/CustomRbfCpfpMenu.qml | 15 +- .../qml/WalletProperties/WalletSeed.qml | 18 +- GUI/QtQuick/qtquick.qrc | 1 + 13 files changed, 335 insertions(+), 41 deletions(-) create mode 100644 GUI/QtQuick/PaperBackupWriter.cpp create mode 100644 GUI/QtQuick/PaperBackupWriter.h create mode 100644 GUI/QtQuick/images/RPK_template.png diff --git a/GUI/QtQuick/PaperBackupWriter.cpp b/GUI/QtQuick/PaperBackupWriter.cpp new file mode 100644 index 000000000..cb9833f92 --- /dev/null +++ b/GUI/QtQuick/PaperBackupWriter.cpp @@ -0,0 +1,166 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ + +#include "PaperBackupWriter.h" + +#include +#include +#include +#include +#include +#include + +// +// WalletBackupPdfWriter +// + +WalletBackupPdfWriter::WalletBackupPdfWriter(const QString &walletId + , const QString &keyLine1, const QString &keyLine2 + , const QPixmap &qr) + : walletId_(walletId) + , keyLine1_(keyLine1) + , keyLine2_(keyLine2) + , qr_(qr) +{ +} + +bool WalletBackupPdfWriter::write(const QString &fileName) +{ + QFile f(fileName); + bool success = f.open(QIODevice::WriteOnly); + + if (!success) + return false; + + QPdfWriter pdf(fileName); + + pdf.setPageSize(QPagedPaintDevice::A4); + pdf.setResolution(kResolution); + + qreal width = (kTotalWidthInches - kMarginInches * 2.0) * kResolution; + qreal height = (kTotalHeightInches - kMarginInches * 2.0) * kResolution; + + QPageLayout layout = pdf.pageLayout(); + layout.setUnits(QPageLayout::Inch); + layout.setMargins(QMarginsF(kMarginInches, kMarginInches, kMarginInches, kMarginInches)); + pdf.setPageLayout(layout); + + QPainter p(&pdf); + draw(p, width, height); + p.end(); + + f.close(); + success = (f.error() == QFileDevice::NoError && f.size() > 0); + + return success; +} + +QPixmap WalletBackupPdfWriter::getPreview(int width, double marginScale) +{ + int viewportWidth = width; + int viewportHeight = qRound(viewportWidth * kTotalHeightInches / kTotalWidthInches); + + int windowWidth = qRound((kTotalWidthInches - kMarginInches * 2.0) * kResolution); + int windowHeight = qRound((kTotalHeightInches - kMarginInches * 2.0) * kResolution); + + int viewportMargin = qRound(kMarginInches / kTotalWidthInches * viewportWidth * marginScale); + + QPixmap image(viewportWidth, viewportHeight); + image.fill(Qt::white); + + QPainter painter(&image); + + painter.setRenderHint(QPainter::SmoothPixmapTransform); + + painter.setViewport(viewportMargin, viewportMargin + , viewportWidth - 2 * viewportMargin + , viewportHeight - 2 * viewportMargin); + + painter.setWindow(0, 0, windowWidth, windowHeight); + + // The code in draw does not work correctly with other sizes than A4 and 1200 DPI. + // So we keep logical sizes and use viewport an window instead. + draw(painter, windowWidth, windowHeight); + + painter.end(); + + return image; +} + +void WalletBackupPdfWriter::print(QPrinter *printer) +{ + int printerResolution = printer->resolution(); + + int viewportWidth = qRound((kTotalWidthInches - kMarginInches * 2.0) * printerResolution); + int viewportHeight = qRound((kTotalHeightInches - kMarginInches * 2.0) * printerResolution); + + printer->setPageMargins(QMarginsF(kMarginInches, kMarginInches, kMarginInches, kMarginInches), QPageLayout::Inch); + + int windowWidth = qRound((kTotalWidthInches - kMarginInches * 2.0) * kResolution); + int windowHeight = qRound((kTotalHeightInches - kMarginInches * 2.0) * kResolution); + + QPainter painter(printer); + + painter.setRenderHint(QPainter::SmoothPixmapTransform); + painter.setViewport(0, 0, viewportWidth, viewportHeight); + painter.setWindow(0, 0, windowWidth, windowHeight); + + // The code in draw does not work correctly with sizes other than A4/Letter and 1200 DPI. + // So we keep logical sizes and use viewport an window instead. + draw(painter, windowWidth, windowHeight); +} + +void WalletBackupPdfWriter::draw(QPainter &p, qreal width, qreal height) +{ + QFont font = p.font(); + font.setPixelSize(125); + + QPixmap logo = QPixmap(QString::fromUtf8(":/images/RPK_template.png")); + p.drawPixmap(QRect(0, 0, width, height), logo); + + qreal relWidth = width / logo.width(); + qreal relHeight = height / logo.height(); + + QFont italic = font; + italic.setItalic(true); + + QFont bold = font; + bold.setBold(true); + + QStaticText wIdDesc(QLatin1String("Wallet ID")); + QStaticText keyLine1Desc(QLatin1String("Line 1")); + QStaticText keyLine2Desc(QLatin1String("Line 2")); + + QStaticText wId(walletId_); + QStaticText keyLine1(keyLine1_); + QStaticText keyLine2(keyLine2_); + + wIdDesc.prepare(QTransform(), italic); + keyLine1Desc.prepare(QTransform(), italic); + keyLine2Desc.prepare(QTransform(), italic); + + wId.prepare(QTransform(), bold); + keyLine1.prepare(QTransform(), bold); + keyLine2.prepare(QTransform(), bold); + + p.setFont(bold); + + QTextOption option; + option.setWrapMode(QTextOption::WordWrap); + + // Magic numbers is pixel positions of given controls on RPK_template.png + p.drawStaticText(QPointF(700 * relWidth, 2035 * relHeight), wId); + p.drawText(QRectF(150 * relWidth, 2580 * relHeight, 1200 * relWidth, 150 * relHeight), keyLine1_, option); + p.drawText(QRectF(150 * relWidth, 2790 * relHeight, 1200 * relWidth, 150 * relHeight), keyLine2_, option); + + p.drawPixmap(QRectF(1640 * relWidth, 2155 * relHeight, 740 * relWidth, 740 * relHeight), + qr_, qr_.rect()); +} diff --git a/GUI/QtQuick/PaperBackupWriter.h b/GUI/QtQuick/PaperBackupWriter.h new file mode 100644 index 000000000..4b95598bf --- /dev/null +++ b/GUI/QtQuick/PaperBackupWriter.h @@ -0,0 +1,59 @@ +/* + +*********************************************************************************** +* Copyright (C) 2018 - 2020, BlockSettle AB +* Distributed under the GNU Affero General Public License (AGPL v3) +* See LICENSE or http://www.gnu.org/licenses/agpl.html +* +********************************************************************************** + +*/ + +#ifndef PAPERBACKUPWRITER_H_INCLUDED +#define PAPERBACKUPWRITER_H_INCLUDED + +#include +#include + +QT_BEGIN_NAMESPACE +class QPrinter; +QT_END_NAMESPACE + +// +// WalletBackupPdfWriter +// + +//! Writer of PDF backup of wallet. +class WalletBackupPdfWriter final +{ +public: + static constexpr int kResolution = 1200; + static constexpr double kTotalWidthInches = 8.27; + static constexpr double kTotalHeightInches = 11.69; + static constexpr double kMarginInches = 0.0; + +public: + WalletBackupPdfWriter(const QString &walletId + , const QString &keyLine1, const QString &keyLine2 + , const QPixmap &qr); + + //! Write backup to PDF. + bool write(const QString &fileName); + + //! Generate resulted PDF preview pixmap. Height will be calculated using page aspect ratio. + // Use marginScale to lower visible margins (valid range 0..1). + QPixmap getPreview(int width, double marginScale); + + //! Print on selected printer using printer's page size (A4 and letter only supported at the moment). + void print(QPrinter *printer); + //! Draw backup. + void draw(QPainter &p, qreal width, qreal height); + +private: + QString walletId_; + QString keyLine1_; + QString keyLine2_; + QPixmap qr_; +}; // class WalletBackupPdfWriter + +#endif // PAPERBACKUPWRITER_H_INCLUDED diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index fc78c1102..d50d2dfcb 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -52,6 +52,7 @@ #include "LeverexPlugin.h" #include "SideshiftPlugin.h" #include "SideswapPlugin.h" +#include "PaperBackupWriter.h" #include "hardware_wallet.pb.h" #include "terminal.pb.h" @@ -2592,3 +2593,36 @@ bool QtQuickAdapter::broadcastSignedTX(const QUrl& path) pushRequest(user_, userBlockchain_, msg.SerializeAsString()); return true; } + +bool QtQuickAdapter::isRequestReadyToSend(QTXSignRequest* request) +{ + const auto& walletIds = request->txReq().walletIds; + for (const auto& id : walletIds) { + bool isInWallets = false; + for (const auto [walletId, wallet] : hdWallets_) { + if (wallet.hasLeaf(id) && !wallet.watchOnly) { + isInWallets = true; + break; + } + } + if (!isInWallets) { + return false; + } + } + return true; +} + +QString QtQuickAdapter::exportPRK() +{ + const auto& path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + + QString::fromLatin1("/") + + walletPropertiesModel_->walletName() + QString::fromLatin1(".pdf"); + const auto& seed = walletPropertiesModel_->seed(); + WalletBackupPdfWriter writer( + walletPropertiesModel_->walletId(), + QStringList(seed.begin(), seed.begin() + seed.length() / 2).join(QChar::fromLatin1(' ')), + QStringList(seed.begin() + seed.length() / 2, seed.end()).join(QChar::fromLatin1(' ')), + QRImageProvider().requestPixmap(walletPropertiesModel_->walletId(), nullptr, QSize(200, 200))); + writer.write(path); + return path; +} diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index d56081338..9139bad65 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -193,6 +193,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE QTXSignRequest* importTransaction(const QUrl& path); Q_INVOKABLE void exportSignedTX(const QUrl& path, QTXSignRequest* request, const QString& password); Q_INVOKABLE bool broadcastSignedTX(const QUrl& path); + Q_INVOKABLE bool isRequestReadyToSend(QTXSignRequest* request); + Q_INVOKABLE QString exportPRK(); signals: void walletsListChanged(); diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 2b7848f4c..565099e13 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -115,11 +115,16 @@ QColor TxListModel::dataColor(int row, int col) const QString TxListModel::walletName(int row) const { - const auto& itTxDet = txDetails_.find(row); - if (itTxDet != txDetails_.end()) { - return QString::fromStdString(itTxDet->second.walletName); - } - return {}; + return gui_utils::directionToQString(txDirection(row)); +} + +bs::sync::Transaction::Direction TxListModel::txDirection(int row) const +{ + const auto& itTxDet = txDetails_.find(row); + if (itTxDet != txDetails_.end()) { + return itTxDet->second.direction; + } + return bs::sync::Transaction::Unknown; } QString TxListModel::txType(int row) const @@ -166,18 +171,6 @@ bool TxListModel::isRBF(int row) const return false; } -quint32 TxListModel::nbConf(int row) const -{ - const auto& itTxDet = txDetails_.find(row); - if (itTxDet != txDetails_.end()) { - if (itTxDet->second.tx.getTxHeight() == UINT32_MAX) { - return 0; - } - return curBlock_ - itTxDet->second.tx.getTxHeight() + 1; - } - return UINT32_MAX; -} - QVariant TxListModel::data(const QModelIndex& index, int role) const { if (index.column() >= header_.size()) { @@ -193,7 +186,9 @@ QVariant TxListModel::data(const QModelIndex& index, int role) const case RBFRole: return isRBF(index.row()); case NbConfRole: - return nbConf(index.row()); + return data_.at(index.row()).nbConf; + case DirectionRole: + return txDirection(index.row()); default: break; } return QVariant(); diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 694ec4abe..f30c0e4fa 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -30,7 +30,7 @@ class TxListModel : public QAbstractTableModel Q_OBJECT public: enum TableRoles { TableDataRole = Qt::UserRole + 1, ColorRole, TxIdRole - , RBFRole, NbConfRole }; + , RBFRole, NbConfRole, DirectionRole }; Q_ENUM(TableRoles) TxListModel(const std::shared_ptr&, QObject* parent = nullptr); @@ -67,7 +67,7 @@ class TxListModel : public QAbstractTableModel QString txId(int row) const; QString txComment(int row) const; bool isRBF(int row) const; - quint32 nbConf(int row) const; + bs::sync::Transaction::Direction txDirection(int row) const; private: std::shared_ptr logger_; diff --git a/GUI/QtQuick/images/RPK_template.png b/GUI/QtQuick/images/RPK_template.png new file mode 100644 index 0000000000000000000000000000000000000000..6ccd22350d1f4a58fc2be6cccd4b25fc0442e1a0 GIT binary patch literal 271241 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

1XQZ}0lT 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≦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%0Ay))o;JCD2S5Xq!56~sathSifw>m< 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/Plugins/SideSwap/SideSwapPegOut.qml qml/Plugins/SideSwap/SideSwapPegIn.qml images/import_icon.svg + images/RPK_template.png From e759e9fd3f5a42cf11888a89e22d01d0d11cde95 Mon Sep 17 00:00:00 2001 From: yz Date: Mon, 24 Apr 2023 11:45:59 +0300 Subject: [PATCH 373/436] Fix review comments --- GUI/QtQuick/PaperBackupWriter.cpp | 17 +++++++---------- GUI/QtQuick/PaperBackupWriter.h | 14 ++------------ GUI/QtQuick/QtQuickAdapter.cpp | 2 +- GUI/QtQuick/TxListModel.cpp | 12 ++++++------ GUI/QtQuick/qml/WalletProperties/WalletSeed.qml | 2 +- 5 files changed, 17 insertions(+), 30 deletions(-) diff --git a/GUI/QtQuick/PaperBackupWriter.cpp b/GUI/QtQuick/PaperBackupWriter.cpp index cb9833f92..e1ee65030 100644 --- a/GUI/QtQuick/PaperBackupWriter.cpp +++ b/GUI/QtQuick/PaperBackupWriter.cpp @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * @@ -18,10 +18,6 @@ #include #include -// -// WalletBackupPdfWriter -// - WalletBackupPdfWriter::WalletBackupPdfWriter(const QString &walletId , const QString &keyLine1, const QString &keyLine2 , const QPixmap &qr) @@ -37,8 +33,9 @@ bool WalletBackupPdfWriter::write(const QString &fileName) QFile f(fileName); bool success = f.open(QIODevice::WriteOnly); - if (!success) - return false; + if (!success) { + return false; + } QPdfWriter pdf(fileName); @@ -135,9 +132,9 @@ void WalletBackupPdfWriter::draw(QPainter &p, qreal width, qreal height) QFont bold = font; bold.setBold(true); - QStaticText wIdDesc(QLatin1String("Wallet ID")); - QStaticText keyLine1Desc(QLatin1String("Line 1")); - QStaticText keyLine2Desc(QLatin1String("Line 2")); + QStaticText wIdDesc(QObject::tr("Wallet ID")); + QStaticText keyLine1Desc(QObject::tr("Line 1")); + QStaticText keyLine2Desc(QObject::tr("Line 2")); QStaticText wId(walletId_); QStaticText keyLine1(keyLine1_); diff --git a/GUI/QtQuick/PaperBackupWriter.h b/GUI/QtQuick/PaperBackupWriter.h index 4b95598bf..57ffa6478 100644 --- a/GUI/QtQuick/PaperBackupWriter.h +++ b/GUI/QtQuick/PaperBackupWriter.h @@ -1,7 +1,7 @@ /* *********************************************************************************** -* Copyright (C) 2018 - 2020, BlockSettle AB +* Copyright (C) 2023, BlockSettle AB * Distributed under the GNU Affero General Public License (AGPL v3) * See LICENSE or http://www.gnu.org/licenses/agpl.html * @@ -19,11 +19,6 @@ QT_BEGIN_NAMESPACE class QPrinter; QT_END_NAMESPACE -// -// WalletBackupPdfWriter -// - -//! Writer of PDF backup of wallet. class WalletBackupPdfWriter final { public: @@ -37,16 +32,11 @@ class WalletBackupPdfWriter final , const QString &keyLine1, const QString &keyLine2 , const QPixmap &qr); - //! Write backup to PDF. bool write(const QString &fileName); - //! Generate resulted PDF preview pixmap. Height will be calculated using page aspect ratio. - // Use marginScale to lower visible margins (valid range 0..1). QPixmap getPreview(int width, double marginScale); - //! Print on selected printer using printer's page size (A4 and letter only supported at the moment). void print(QPrinter *printer); - //! Draw backup. void draw(QPainter &p, qreal width, qreal height); private: @@ -54,6 +44,6 @@ class WalletBackupPdfWriter final QString keyLine1_; QString keyLine2_; QPixmap qr_; -}; // class WalletBackupPdfWriter +}; #endif // PAPERBACKUPWRITER_H_INCLUDED diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index d50d2dfcb..dae4708c7 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2600,7 +2600,7 @@ bool QtQuickAdapter::isRequestReadyToSend(QTXSignRequest* request) for (const auto& id : walletIds) { bool isInWallets = false; for (const auto [walletId, wallet] : hdWallets_) { - if (wallet.hasLeaf(id) && !wallet.watchOnly) { + if ((id == walletId || wallet.hasLeaf(id)) && !wallet.watchOnly) { isInWallets = true; break; } diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 565099e13..b3aec82b9 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -115,7 +115,11 @@ QColor TxListModel::dataColor(int row, int col) const QString TxListModel::walletName(int row) const { - return gui_utils::directionToQString(txDirection(row)); + const auto& itTxDet = txDetails_.find(row); + if (itTxDet != txDetails_.end()) { + return QString::fromStdString(itTxDet->second.walletName); + } + return {}; } bs::sync::Transaction::Direction TxListModel::txDirection(int row) const @@ -129,11 +133,7 @@ bs::sync::Transaction::Direction TxListModel::txDirection(int row) const QString TxListModel::txType(int row) const { - const auto& itTxDet = txDetails_.find(row); - if (itTxDet != txDetails_.end()) { - return gui_utils::directionToQString(itTxDet->second.direction); - } - return {}; + return gui_utils::directionToQString(txDirection(row)); } QString TxListModel::txComment(int row) const diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml index 2781601ae..fa745130f 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml @@ -47,7 +47,7 @@ ColumnLayout { CustomButton { id: confirm_but - text: qsTr("Print PDF") + text: qsTr("Save PDF") preferred: true Layout.bottomMargin: BSSizes.applyScale(40) From 540a4ca88e391b9aadf636346477d7dd83141b61 Mon Sep 17 00:00:00 2001 From: yz Date: Tue, 25 Apr 2023 00:26:42 +0300 Subject: [PATCH 374/436] RBF fix; wallet seed increased size --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 9 +++------ GUI/QtQuick/qml/WalletProperties/WalletSeed.qml | 6 ++++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 659ec8830..d9f10a6e0 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -559,17 +559,14 @@ ColumnLayout { function click_enter() { if (!include_output_but.enabled) return - if (isRBF) { - txOutputsModel.setOutputsFrom(tx) - return - } - txOutputsModel.addOutput(rec_addr_input.input_text, amount_input.input_text) rec_addr_input.input_text = "" amount_input.input_text = "" - txInputsModel.updateAutoselection() + if (!isRBF && !isCPFP) { + txInputsModel.updateAutoselection() + } } } diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml index fa745130f..35d382e82 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml @@ -9,7 +9,7 @@ import "../StyledControls" ColumnLayout { id: layout - height: BSSizes.applyScale(548) + height: BSSizes.applyScale(608) width: BSSizes.applyScale(580) spacing: 0 @@ -26,13 +26,15 @@ ColumnLayout { GridView { id: grid + clip: true Layout.fillHeight: true Layout.fillWidth: true Layout.leftMargin: BSSizes.applyScale(25) + Layout.rightMargin: BSSizes.applyScale(15) Layout.topMargin: BSSizes.applyScale(32) ScrollBar.vertical: ScrollBar { - policy: ScrollBar.AlwaysOn + policy: grid.height > grid.contentHeight ? ScrollBar.AlwaysOff : ScrollBar.AlwaysOn } cellHeight : BSSizes.applyScale(56) From b8513d5240f4c62fc8c5b99a2e40bfa06f7bfb94 Mon Sep 17 00:00:00 2001 From: yz Date: Tue, 25 Apr 2023 14:52:53 +0300 Subject: [PATCH 375/436] Formatting --- GUI/QtQuick/QtQuickAdapter.cpp | 28 ++++++++++++++-------------- GUI/QtQuick/TxListModel.cpp | 22 +++++++++++----------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index dae4708c7..fb93bffa1 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2596,20 +2596,20 @@ bool QtQuickAdapter::broadcastSignedTX(const QUrl& path) bool QtQuickAdapter::isRequestReadyToSend(QTXSignRequest* request) { - const auto& walletIds = request->txReq().walletIds; - for (const auto& id : walletIds) { - bool isInWallets = false; - for (const auto [walletId, wallet] : hdWallets_) { - if ((id == walletId || wallet.hasLeaf(id)) && !wallet.watchOnly) { - isInWallets = true; - break; - } - } - if (!isInWallets) { - return false; - } - } - return true; + const auto& walletIds = request->txReq().walletIds; + for (const auto& id : walletIds) { + bool isInWallets = false; + for (const auto [walletId, wallet] : hdWallets_) { + if ((id == walletId || wallet.hasLeaf(id)) && !wallet.watchOnly) { + isInWallets = true; + break; + } + } + if (!isInWallets) { + return false; + } + } + return true; } QString QtQuickAdapter::exportPRK() diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index b3aec82b9..97aca6ba8 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -115,25 +115,25 @@ QColor TxListModel::dataColor(int row, int col) const QString TxListModel::walletName(int row) const { - const auto& itTxDet = txDetails_.find(row); - if (itTxDet != txDetails_.end()) { - return QString::fromStdString(itTxDet->second.walletName); - } - return {}; + const auto& itTxDet = txDetails_.find(row); + if (itTxDet != txDetails_.end()) { + return QString::fromStdString(itTxDet->second.walletName); + } + return {}; } bs::sync::Transaction::Direction TxListModel::txDirection(int row) const { - const auto& itTxDet = txDetails_.find(row); - if (itTxDet != txDetails_.end()) { - return itTxDet->second.direction; - } - return bs::sync::Transaction::Unknown; + const auto& itTxDet = txDetails_.find(row); + if (itTxDet != txDetails_.end()) { + return itTxDet->second.direction; + } + return bs::sync::Transaction::Unknown; } QString TxListModel::txType(int row) const { - return gui_utils::directionToQString(txDirection(row)); + return gui_utils::directionToQString(txDirection(row)); } QString TxListModel::txComment(int row) const From 88dbc5388c5d93d46e7b2341084a28b6db648ce1 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 25 Apr 2023 15:12:50 +0300 Subject: [PATCH 376/436] Jade wallet import --- BlockSettleHW/hwdevicemanager.cpp | 14 +- BlockSettleHW/hwdevicemanager.h | 1 + BlockSettleHW/jade/jadeClient.cpp | 35 ++- BlockSettleHW/jade/jadeDevice.cpp | 431 ++++++++++++++++++++++++++---- BlockSettleHW/jade/jadeDevice.h | 42 ++- common | 2 +- ubuntu.Dockerfile | 2 +- 7 files changed, 455 insertions(+), 72 deletions(-) diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index 6f6ce6837..df354cfa3 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -558,7 +558,10 @@ std::shared_ptr DeviceManager::getDevice(const DeviceKey& key) return trezorClient_->getDevice(key.id); case DeviceType::HWLedger: return ledgerClient_->getDevice(key.id); + case DeviceType::HWJade: + return jadeClient_->getDevice(key.id); default: + logger_->error("[{}] unknown device type {}", __func__, (int)key.type); // Add new device type assert(false); break; @@ -569,7 +572,7 @@ std::shared_ptr DeviceManager::getDevice(const DeviceKey& key) void DeviceManager::publicKeyReady(const DeviceKey& devKey) { logger_->debug("[{}] walletId = {} for {}", __func__, devKey.walletId, devKey.id); - { + if (!devKey.walletId.empty()) { HW::DeviceMgrMessage msg; msg.set_device_ready(devKey.walletId); pushBroadcast(user_, msg.SerializeAsString()); @@ -586,6 +589,7 @@ void DeviceManager::publicKeyReady(const DeviceKey& devKey) device.walletId = devKey.walletId; nbCompleted++; foundDevice = true; + logger_->debug("[{}] device {}/{} found", __func__, devKey.id, devKey.walletId); } } else if (!device.walletId.empty()) { @@ -593,11 +597,16 @@ void DeviceManager::publicKeyReady(const DeviceKey& devKey) } } if (!foundDevice) { + std::lock_guard lock{ devMtx_ }; if (delDevice) { const auto& it = std::find_if(devices_.cbegin(), devices_.cend() , [devKey](const DeviceKey& key) {return (key.id == devKey.id); }); - if (it != devices_.end()) { + if (it == devices_.end()) { + logger_->warn("[{}] device {} not found at delete", __func__, devKey.id); + } + else { devices_.erase(it); + logger_->debug("[{}] # devices: {}", __func__, devices_.size()); } } else { @@ -605,6 +614,7 @@ void DeviceManager::publicKeyReady(const DeviceKey& devKey) nbCompleted++; } } + logger_->debug("[{}] nbCompleted: {}, nbDevices: {}", __func__, nbCompleted, devices_.size()); if (nbCompleted >= devices_.size()) { logger_->debug("[{}] all public keys retrieved", __func__); if (envReqScan_.sender) { diff --git a/BlockSettleHW/hwdevicemanager.h b/BlockSettleHW/hwdevicemanager.h index 4cda374ee..fe7c7f50c 100644 --- a/BlockSettleHW/hwdevicemanager.h +++ b/BlockSettleHW/hwdevicemanager.h @@ -146,6 +146,7 @@ namespace bs { std::unique_ptr jadeClient_; std::shared_ptr user_, userWallets_, userSigner_, userBlockchain_; std::vector devices_; + mutable std::mutex devMtx_; bool testNet_{false}; int nbScanning_{0}; diff --git a/BlockSettleHW/jade/jadeClient.cpp b/BlockSettleHW/jade/jadeClient.cpp index 74354cc16..baaa016df 100644 --- a/BlockSettleHW/jade/jadeClient.cpp +++ b/BlockSettleHW/jade/jadeClient.cpp @@ -51,19 +51,26 @@ std::shared_ptr JadeClient::getDevice(const std::string& deviceId) void JadeClient::scanDevices() { logger_->info("[JadeClient::scanDevices]"); - std::vector serialPorts; - for (const auto& serial : QSerialPortInfo::availablePorts()) { - logger_->debug("[JadeClient::scanDevices] probing {}/{}", serial.portName().toStdString() - , serial.manufacturer().toStdString()); - try { - const auto& device = std::make_shared(logger_, testNet_ - , cb_, serial); - devices_.push_back(device); + QMetaObject::invokeMethod(qApp, [this] { + for (const auto& serial : QSerialPortInfo::availablePorts()) { + const auto& it = std::find_if(devices_.cbegin(), devices_.cend() + , [serial](const std::shared_ptr& dev) { + return JadeDevice::idFromSerial(serial) == dev->key().id; }); + if (it != devices_.end()) { + continue; + } + logger_->debug("[JadeClient::scanDevices] probing {}/{}", serial.portName().toStdString() + , serial.manufacturer().toStdString()); + try { + const auto& device = std::make_shared(logger_, testNet_ + , cb_, serial); + devices_.push_back(device); + } + catch (const std::exception& e) { + logger_->error("[JadeClient::scanDevices] {}", e.what()); + } } - catch (const std::exception& e) { - logger_->error("[JadeClient::scanDevices] {}", e.what()); - } - } - logger_->debug("[JadeClient::scanDevices] {} devices scanned", devices_.size()); - cb_->scanningDone(); + logger_->debug("[JadeClient::scanDevices] {} devices scanned", devices_.size()); + cb_->scanningDone(); + }); } diff --git a/BlockSettleHW/jade/jadeDevice.cpp b/BlockSettleHW/jade/jadeDevice.cpp index 3149e48c8..f50f6ae0e 100644 --- a/BlockSettleHW/jade/jadeDevice.cpp +++ b/BlockSettleHW/jade/jadeDevice.cpp @@ -12,11 +12,13 @@ #include #include #include +#include #include #include "hwdevicemanager.h" #include "jadeDevice.h" #include "jadeClient.h" #include "CoreWallet.h" +#include "StringUtils.h" using namespace bs::hww; @@ -43,11 +45,9 @@ JadeDevice::JadeDevice(const std::shared_ptr &logger , bool testNet, DeviceCallbacks* cb, const QSerialPortInfo& endpoint) : bs::WorkerPool(1, 1) , logger_(logger), testNet_(testNet), cb_(cb), endpoint_(endpoint) -{ -// QMetaObject::invokeMethod(qApp, [this] { - handlers_.push_back(std::make_shared(logger_, endpoint_)); -// }); -} + , handlers_{ std::make_shared(logger_, endpoint_) + , std::make_shared(logger_) } +{} JadeDevice::~JadeDevice() = default; @@ -59,27 +59,42 @@ std::shared_ptr JadeDevice::worker(const std::shared_ptr&) void bs::hww::JadeDevice::operationFailed(const std::string& reason) { releaseConnection(); - //cb_->operationFailed(features_->device_id(), reason); + cb_->operationFailed(key().id, reason); } void JadeDevice::releaseConnection() { + WorkerPool::cancel(); +} + +std::string bs::hww::JadeDevice::idFromSerial(const QSerialPortInfo& serial) +{ + return serial.hasProductIdentifier() ? std::to_string(serial.productIdentifier()) + : serial.portName().toStdString(); } DeviceKey JadeDevice::key() const { - std::string walletId; std::string status; - if (!xpubRoot_.empty()) { - walletId = bs::core::wallet::computeID(xpubRoot_).toBinStr(); - } - else { - status = "not inited"; + if (walletId_.empty()) { + if (!xpubRoot_.empty()) { + try { + const auto& seed = bs::core::wallet::Seed::fromXpub(xpubRoot_ + , testNet_ ? NetworkType::TestNet : NetworkType::MainNet); + walletId_ = seed.getWalletId(); + } + catch (const std::exception& e) { + logger_->error("[{}] failed to get walletId from {}: {}", __func__, xpubRoot_.toBinStr(), e.what()); + } + } + else { + status = "not inited"; + } } - return { endpoint_.portName().toStdString() - , endpoint_.hasProductIdentifier() ? std::to_string(endpoint_.productIdentifier()) : endpoint_.portName().toStdString() + return { "Jade @" + endpoint_.portName().toStdString() + , idFromSerial(endpoint_) , endpoint_.hasVendorIdentifier() ? std::to_string(endpoint_.vendorIdentifier()) : endpoint_.manufacturer().toStdString() - , walletId, type() }; + , walletId_, type() }; return {}; } @@ -88,64 +103,327 @@ DeviceType JadeDevice::type() const return DeviceType::HWJade; } +static std::string dump(const QCborMap&); +static std::string dump(const QCborValueRef&); +static std::string dump(const QCborArray& ary) +{ + std::string result = "["; + for (const auto& it : ary) { + result += dump(it) + ", "; + } + if (result.size() > 3) { + result.pop_back(), result.pop_back(); + } + result += "]"; + return result; +} + +static std::string dump(const QCborMap& map) +{ + std::string result = "{"; + for (const auto& it : map) { + result += it.first.toString().toStdString() + "=" + dump(it.second) + ", "; + } + if (result.size() > 3) { + result.pop_back(), result.pop_back(); + } + result += "}"; + return result; +} + +static std::string dump(const QCborValueRef& val) +{ + if (val.isInvalid()) { + return ""; + } + if (val.isMap()) { + return dump(val.toMap()); + } + if (val.isArray()) { + return dump(val.toArray()); + } + if (val.isString()) { + return "\"" + val.toString().toStdString() + "\""; + } + if (val.isBool()) { + return val.toBool() ? "true" : "false"; + } + if (val.isDouble()) { + return std::to_string(val.toDouble()); + } + if (val.isInteger()) { + return std::to_string(val.toInteger()); + } + if (val.isByteArray()) { + return bs::toHex(val.toByteArray().toStdString()); + } + if (val.isDateTime()) { + return val.toDateTime().toString().toStdString(); + } + if (val.isUrl()) { + return val.toUrl().toString().toStdString(); + } + if (val.isUuid()) { + return val.toUuid().toString().toStdString(); + } + if (val.isRegularExpression()) { + return val.toRegularExpression().pattern().toStdString(); + } + return "???"; +} + +static QCborArray convertPath(const bs::hd::Path& path) +{ + QCborArray pathArray; + for (const auto val : path) { + pathArray.append((quint32)val); + } + return pathArray; +} + +static uint32_t epoch() +{ + return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); +} + void JadeDevice::init() { logger_->debug("[JadeDevice::init] start"); auto in = std::make_shared(); in->request = getRequest(++seqId_, QLatin1Literal("get_version_info")); - const auto& cbVersion = [this](const std::shared_ptr& out) + const auto& cbXPub = [this](const std::shared_ptr& out) { const auto& data = std::static_pointer_cast(out); if (!data) { - logger_->error("[JadeDevice::init] invalid data"); + logger_->error("[JadeDevice::init::xpub] invalid data"); cb_->publicKeyReady(key()); return; } - if (data->futResponse.wait_for(std::chrono::milliseconds{ 500 }) != std::future_status::ready) { - logger_->error("[JadeDevice::init] data timeout"); + if (data->futResponse.wait_for(std::chrono::milliseconds{ 1500 }) != std::future_status::ready) { + logger_->error("[JadeDevice::init::xpub] data timeout"); cb_->publicKeyReady(key()); return; } const auto& msg = data->futResponse.get(); - logger_->debug("[JadeDevice::init] response: {}", msg.toCborValue().toString().toStdString()); + logger_->debug("[JadeDevice::init] xpub response: {}", dump(msg)); + + xpubRoot_ = BinaryData::fromString(msg[QLatin1Literal("result")].toString().toStdString()); + cb_->publicKeyReady(key()); }; - processQueued(in, cbVersion); -} -void JadeDevice::getPublicKeys() -{ - awaitingWalletInfo_ = {}; - // General data - awaitingWalletInfo_.type = bs::wallet::HardwareEncKey::WalletType::Trezor; -/* awaitingWalletInfo_.label = features_->label(); - awaitingWalletInfo_.deviceId = features_->device_id(); - awaitingWalletInfo_.vendor = features_->vendor(); - awaitingWalletInfo_.xpubRoot = xpubRoot_.toBinStr();*/ + const auto& cbVersion = [this, cbXPub](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data) { + logger_->error("[JadeDevice::init::version] invalid data"); + cb_->publicKeyReady(key()); + return; + } + if (data->futResponse.wait_for(std::chrono::milliseconds{ 1500 }) != std::future_status::ready) { + logger_->error("[JadeDevice::init::version] data timeout"); + cb_->publicKeyReady(key()); + return; + } + const auto& msg = data->futResponse.get(); + logger_->debug("[JadeDevice::init] version response: {}", dump(msg)); -} + const auto& netType = msg[QLatin1Literal("result")][QLatin1Literal("JADE_NETWORKS")].toString().toStdString(); + if ((netType != "ALL") && (netType != (testNet_ ? "TEST" : "MAIN"))) { + logger_->error("[JadeDevice::init] network type mismatch: {}", netType); + cb_->publicKeyReady(key()); + return; + } -void JadeDevice::setMatrixPin(const SecureBinaryData& pin) -{ - logger_->debug("[JadeDevice::setMatrixPin]"); + auto inXpub = std::make_shared(); + bs::hd::Path path; + path.append(/*bs::hd::Purpose::Native +*/ bs::hd::hardFlag); + path.append(testNet_ ? bs::hd::CoinType::Bitcoin_test : bs::hd::CoinType::Bitcoin_main); + //path.append(bs::hd::hardFlag); + //path.append(0); + const QCborMap params = { {QLatin1Literal("network"), network()}, {QLatin1Literal("path"), convertPath(path)}}; + inXpub->request = getRequest(++seqId_, QLatin1Literal("get_xpub"), params); + + if (msg[QLatin1Literal("result")][QLatin1Literal("JADE_STATE")].toString().toStdString() == "LOCKED") { + const QCborMap authParams{ {QLatin1Literal("network"), network()}, {QLatin1Literal("epoch"), epoch()} }; + auto inAuth = std::make_shared(); + inAuth->request = getRequest(++seqId_, QLatin1Literal("auth_user"), authParams); + const auto& cbAuth = [this, cbXPub, inXpub](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data) { + logger_->error("[JadeDevice::init::auth] invalid data"); + cb_->publicKeyReady(key()); + return; + } + if (data->futResponse.wait_for(std::chrono::seconds{ 30 }) != std::future_status::ready) { + logger_->error("[JadeDevice::init::auth] data timeout"); + cb_->publicKeyReady(key()); + return; + } + const auto& msg = data->futResponse.get(); + logger_->debug("[JadeDevice::init] auth response: {}", dump(msg)); + + if (msg[QLatin1Literal("result")].isBool()) { + if (msg[QLatin1Literal("result")].isTrue()) { + processQueued(inXpub, cbXPub); + } + else { + logger_->error("[JadeDevice::init::auth] failed"); + cb_->publicKeyReady(key()); + return; + } + } + else { // forward request to PIN server + const auto& httpParams = msg[QLatin1Literal("result")][QLatin1Literal("http_request")][QLatin1Literal("params")]; + auto inHttp = std::make_shared(); + inHttp->url = httpParams[QLatin1Literal("urls")].toArray().at(0).toString().toStdString(); + inHttp->data = httpParams[QLatin1Literal("data")].toString().toStdString(); + const auto onReply = msg[QLatin1Literal("result")][QLatin1Literal("http_request")][QLatin1Literal("on-reply")].toString(); + + const auto& cbHttp = [this, onReply, cbXPub, inXpub](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data || data->response.empty()) { + logger_->error("[JadeDevice::init::http] invalid data"); + cb_->publicKeyReady(key()); + return; + } + QJsonDocument jsonDoc = QJsonDocument::fromJson(QByteArray::fromStdString(data->response)); + const auto& params = QCborMap::fromJsonObject(jsonDoc.object()); + auto inResp = std::make_shared(); + inResp->request = getRequest(++seqId_, onReply, params); + const auto& cbHandshake = [this, cbXPub, inXpub](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data) { + logger_->error("[JadeDevice::init::handshake] invalid data"); + cb_->publicKeyReady(key()); + return; + } + if (data->futResponse.wait_for(std::chrono::seconds{ 23 }) != std::future_status::ready) { + logger_->error("[JadeDevice::init::handshake] data timeout"); + cb_->publicKeyReady(key()); + return; + } + const auto& msg = data->futResponse.get(); + logger_->debug("[JadeDevice::init] handshake response: {}", dump(msg)); + + const auto& httpParams = msg[QLatin1Literal("result")][QLatin1Literal("http_request")][QLatin1Literal("params")]; + auto inHttp = std::make_shared(); + inHttp->url = httpParams[QLatin1Literal("urls")].toArray().at(0).toString().toStdString(); + const auto& jsonData = httpParams[QLatin1Literal("data")].toJsonValue().toObject(); + inHttp->data = QJsonDocument(jsonData).toJson().toStdString(); + const auto onReply = msg[QLatin1Literal("result")][QLatin1Literal("http_request")][QLatin1Literal("on-reply")].toString(); + + const auto& cbReply = [this, onReply, cbXPub, inXpub](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data || data->response.empty()) { + logger_->error("[JadeDevice::init::reply] invalid data"); + cb_->publicKeyReady(key()); + return; + } + QJsonDocument jsonDoc = QJsonDocument::fromJson(QByteArray::fromStdString(data->response)); + const auto& params = QCborMap::fromJsonObject(jsonDoc.object()); + auto inComplete = std::make_shared(); + inComplete->request = getRequest(++seqId_, onReply, params); + const auto& cbComplete = [this, cbXPub, inXpub](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data) { + logger_->error("[JadeDevice::init::complete] invalid data"); + cb_->publicKeyReady(key()); + return; + } + if (data->futResponse.wait_for(std::chrono::seconds{ 3 }) != std::future_status::ready) { + logger_->error("[JadeDevice::init::complete] data timeout"); + cb_->publicKeyReady(key()); + return; + } + const auto& msg = data->futResponse.get(); + logger_->debug("[JadeDevice::init] complete response: {}", dump(msg)); + if (msg[QLatin1Literal("result")].isBool() && msg[QLatin1Literal("result")].isTrue()) { + processQueued(inXpub, cbXPub); + } + else { + logger_->error("[JadeDevice::init::complete] handshake failed"); + cb_->publicKeyReady(key()); + } + }; + processQueued(inComplete, cbComplete); + }; + processQueued(inHttp, cbReply); + }; + processQueued(inResp, cbHandshake); + }; + processQueued(inHttp, cbHttp); + } + }; + processQueued(inAuth, cbAuth); + } + else { + processQueued(inXpub, cbXPub); + } + }; + processQueued(in, cbVersion); } -void JadeDevice::setPassword(const SecureBinaryData& password, bool enterOnDevice) +void JadeDevice::getPublicKeys() { - logger_->debug("[JadeDevice::setPassword]"); -} + awaitingWalletInfo_ = {}; + awaitingWalletInfo_.type = bs::wallet::HardwareEncKey::WalletType::Jade; + awaitingWalletInfo_.xpubRoot = xpubRoot_.toBinStr(); + awaitingWalletInfo_.label = key().label; + awaitingWalletInfo_.deviceId = key().id; + awaitingWalletInfo_.vendor = key().vendor; -void JadeDevice::cancel() -{ - logger_->debug("[JadeDevice] cancel previous operation"); -} + const auto& requestXPub = [this](bs::hd::Purpose purp)->std::pair, bs::WorkerPool::callback> + { + auto inXpub = std::make_shared(); + bs::hd::Path path; + path.append(purp + bs::hd::hardFlag); + path.append(testNet_ ? bs::hd::CoinType::Bitcoin_test : bs::hd::CoinType::Bitcoin_main); + path.append(bs::hd::hardFlag); + const QCborMap params = { {QLatin1Literal("network"), network()}, {QLatin1Literal("path"), convertPath(path)} }; + inXpub->request = getRequest(++seqId_, QLatin1Literal("get_xpub"), params); + + return {inXpub , [this, purp](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data) { + logger_->error("[JadeDevice::getPublicKeys::xpub] invalid data"); + cb_->publicKeyReady(key()); + return; + } + if (data->futResponse.wait_for(std::chrono::milliseconds{ 1500 }) != std::future_status::ready) { + logger_->error("[JadeDevice::getPublicKeys::xpub] data timeout"); + cb_->publicKeyReady(key()); + return; + } + const auto& msg = data->futResponse.get(); + logger_->debug("[JadeDevice::getPublicKeys] xpub response: {}", dump(msg)); -void JadeDevice::clearSession() -{ - logger_->debug("[JadeDevice] cancel session"); + if (purp == bs::hd::Purpose::Native) { + awaitingWalletInfo_.xpubNativeSegwit = msg[QLatin1Literal("result")].toString().toStdString(); + } + else if (purp == bs::hd::Purpose::Nested) { + awaitingWalletInfo_.xpubNestedSegwit = msg[QLatin1Literal("result")].toString().toStdString(); + } + else { + logger_->error("[JadeDevice::getPublicKeys::xpub] unsupported wallet type {}", purp); + } + if (!awaitingWalletInfo_.xpubNativeSegwit.empty() && !awaitingWalletInfo_.xpubNestedSegwit.empty()) { + cb_->walletInfoReady(key(), awaitingWalletInfo_); + } + } }; + }; + const auto& inXpubNative = requestXPub(bs::hd::Purpose::Native); + processQueued(inXpubNative.first, inXpubNative.second); + const auto& inXpubNested = requestXPub(bs::hd::Purpose::Nested); + processQueued(inXpubNested.first, inXpubNested.second); } - void JadeDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX) { logger_->debug("[JadeDevice::signTX]"); @@ -162,6 +440,11 @@ void JadeDevice::reset() awaitingWalletInfo_ = {}; } +QString bs::hww::JadeDevice::network() const +{ + return testNet_ ? QLatin1Literal("testnet") : QLatin1Literal("mainnet"); +} + JadeSerialHandler::JadeSerialHandler(const std::shared_ptr& logger , const QSerialPortInfo& spi) @@ -191,6 +474,7 @@ std::shared_ptr JadeSerialHandler::processData(const std::shared_ auto prom = std::make_shared>(); out->futResponse = prom->get_future(); requests_.push_back(prom); + logger_->debug("[JadeSerialHandler] sending: {}", dump(in->request)); const auto bytes = in->request.toCborValue().toCbor(); write(bytes); return out; @@ -228,6 +512,7 @@ int bs::hww::JadeSerialHandler::write(const QByteArray& data) while (written != data.length()) { const auto wrote = serial_->write(data.data() + written, qMin(256, data.length() - written)); if (wrote < 0) { + logger_->debug("[{}] write error: {}", __func__, wrote); Disconnect(); return written; } @@ -235,8 +520,9 @@ int bs::hww::JadeSerialHandler::write(const QByteArray& data) serial_->waitForBytesWritten(100); written += wrote; } - //std::this_thread::sleep_for(std::chrono::milliseconds{ 100 }); + std::this_thread::sleep_for(std::chrono::milliseconds{ 100 }); } + logger_->debug("[{}] {} bytes (of {}) written", __func__, written, data.size()); return written; } @@ -303,8 +589,10 @@ void bs::hww::JadeSerialHandler::parsePortion(const QByteArray& data) void JadeSerialHandler::onSerialDataReady() { + logger_->debug("[{}]", __func__); assert(serial_); const auto& data = serial_->readAll(); + logger_->debug("[{}] {} bytes", __func__, data.size()); if (requests_.empty()) { logger_->error("[{}] dropped {} bytes of serial data", __func__, data.size()); @@ -312,3 +600,52 @@ void JadeSerialHandler::onSerialDataReady() } parsePortion(data); } + +static size_t writeToString(void* ptr, size_t size, size_t count, std::string* stream) +{ + const size_t resSize = size * count; + stream->append((char*)ptr, resSize); + return resSize; +} + +JadeHttpHandler::JadeHttpHandler(const std::shared_ptr& logger) + : logger_(logger) +{ + curl_ = curl_easy_init(); + curl_easy_setopt(curl_, CURLOPT_WRITEFUNCTION, writeToString); + curl_easy_setopt(curl_, CURLOPT_SSL_VERIFYPEER, 0L); + curl_easy_setopt(curl_, CURLOPT_SSL_VERIFYHOST, 0L); + curl_easy_setopt(curl_, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl_, CURLOPT_POST, 1); + + curlHeaders_ = curl_slist_append(curlHeaders_, "Content-Type: application/json"); + curl_easy_setopt(curl_, CURLOPT_HTTPHEADER, curlHeaders_); +} + +JadeHttpHandler::~JadeHttpHandler() +{ + curl_slist_free_all(curlHeaders_); + curl_easy_cleanup(curl_); +} + +std::shared_ptr JadeHttpHandler::processData(const std::shared_ptr& in) +{ + auto result = std::make_shared(); + if (!curl_) { + return result; + } + logger_->debug("[JadeHttpHandler::processData] request: {} {}", in->url, in->data); + curl_easy_setopt(curl_, CURLOPT_URL, in->url.c_str()); + curl_easy_setopt(curl_, CURLOPT_POSTFIELDS, in->data.data()); + std::string response; + curl_easy_setopt(curl_, CURLOPT_WRITEDATA, &response); + + const auto res = curl_easy_perform(curl_); + if (res != CURLE_OK) { + logger_->error("[JadeHttpHandler::processData] failed to post to {}: {}", in->url, res); + return result; + } + result->response = response; + logger_->debug("[JadeHttpHandler::processData] response: {}", result->response); + return result; +} diff --git a/BlockSettleHW/jade/jadeDevice.h b/BlockSettleHW/jade/jadeDevice.h index 9c11f30cb..9f2421d40 100644 --- a/BlockSettleHW/jade/jadeDevice.h +++ b/BlockSettleHW/jade/jadeDevice.h @@ -28,6 +28,7 @@ namespace bs { } } } +struct curl_slist; namespace bs { namespace hww { @@ -71,6 +72,34 @@ namespace bs { QByteArray unparsed_; }; + struct JadeHttpIn : public bs::InData + { + ~JadeHttpIn() override = default; + std::string url; + std::string data; + }; + struct JadeHttpOut : public bs::OutData + { + ~JadeHttpOut() override = default; + std::string response; + }; + + class JadeHttpHandler : public bs::HandlerImpl + { + public: + JadeHttpHandler(const std::shared_ptr&); + ~JadeHttpHandler() override; + + protected: + std::shared_ptr processData(const std::shared_ptr&) override; + + private: + std::shared_ptr logger_; + struct curl_slist* curlHeaders_{ NULL }; + void* curl_{ nullptr }; + }; + + class JadeDevice : public DeviceInterface, protected WorkerPool { public: @@ -78,13 +107,14 @@ namespace bs { , bool testNet, DeviceCallbacks*, const QSerialPortInfo&); ~JadeDevice() override; + static std::string idFromSerial(const QSerialPortInfo&); DeviceKey key() const override; DeviceType type() const override; // lifecycle void init() override; - void cancel() override; - void clearSession() override; + void cancel() override { WorkerPool::cancel(); } + void clearSession() override {} void releaseConnection(); // operation @@ -92,10 +122,6 @@ namespace bs { void signTX(const bs::core::wallet::TXSignRequest& reqTX) override; void retrieveXPubRoot() override; - // Management - void setMatrixPin(const SecureBinaryData& pin) override; - void setPassword(const SecureBinaryData& password, bool enterOnDevice) override; - // State bool isBlocked() const override { // There is no blocking state for Trezor @@ -117,6 +143,7 @@ namespace bs { private: void reset(); + QString network() const; private: std::shared_ptr logger_; @@ -124,7 +151,8 @@ namespace bs { DeviceCallbacks* cb_{ nullptr }; const QSerialPortInfo endpoint_; int seqId_{ 0 }; - std::vector> handlers_; + mutable std::string walletId_; + const std::vector> handlers_; bs::core::HwWalletInfo awaitingWalletInfo_; std::string awaitingSignedTX_; }; diff --git a/common b/common index 758ca44f0..30d1d48d7 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 758ca44f0dc47568bbe7940085508bc5b68fdcb1 +Subproject commit 30d1d48d734dd7fc288268e07600573e5e9cf957 diff --git a/ubuntu.Dockerfile b/ubuntu.Dockerfile index b604e5e09..254206be5 100644 --- a/ubuntu.Dockerfile +++ b/ubuntu.Dockerfile @@ -9,7 +9,7 @@ RUN sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list \ && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ && echo $TZ > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata \ # main libs - && apt install -y \ + && apt install -y python3 \ python3-pip cmake libmysqlclient-dev autoconf libtool yasm nasm libgmp3-dev libdouble-conversion-dev \ qttools5-dev-tools libfreetype-dev libfontconfig-dev libcups2-dev xcb \ libx11-xcb-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-sync-dev libxcb-render-util0-dev libxcb-xfixes0-dev \ From 31f7d4c7883d0d451f8c0e385f5c8113041de90a Mon Sep 17 00:00:00 2001 From: yz Date: Thu, 27 Apr 2023 10:40:01 +0300 Subject: [PATCH 377/436] Transaction export dialog; wallet selection --- GUI/QtQuick/QtQuickAdapter.cpp | 96 +-- GUI/QtQuick/QtQuickAdapter.h | 1 + .../qml/Overview/OverviewWalletBar.qml | 2 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 661 +++++++++--------- GUI/QtQuick/qml/Send/SimpleDetails.qml | 17 +- 5 files changed, 412 insertions(+), 365 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index fb93bffa1..71e0d638d 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -721,6 +721,12 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) } } } + else { + auto index = walletBalances_->wallets().indexOf(QString::fromStdString(createdWalletId_)); + if (index != -1) { + emit requestWalletSelection(index); + } + } } break; @@ -1168,11 +1174,14 @@ ProcessingResult QtQuickAdapter::processWalletBalances(bs::message::SeqId respon , response.total_balance(), response.nb_addresses() }; walletBalances_->setWalletBalance(response.wallet_id(), bal); - for (const auto& addrBal : response.address_balances()) { - addrModel_->updateRow(BinaryData::fromString(addrBal.address()) - , addrBal.total_balance(), addrBal.tx_count()); - } - emit walletBalanceChanged(); + QMetaObject::invokeMethod(this, [this, response]() + { + for (const auto& addrBal : response.address_balances()) { + addrModel_->updateRow(BinaryData::fromString(addrBal.address()) + , addrBal.total_balance(), addrBal.tx_count()); + } + emit walletBalanceChanged(); + }); return ProcessingResult::Success; } @@ -1848,6 +1857,11 @@ bs::message::ProcessingResult QtQuickAdapter::processWalletDeleted(const std::st pushRequest(user_, userWallets_, msg.SerializeAsString()); emit successDeleteWallet(); + + if (walletBalances_->rowCount() > 0) { + emit requestWalletSelection(0); + } + return bs::message::ProcessingResult::Success; } @@ -2454,6 +2468,21 @@ void QtQuickAdapter::notifyNewTransaction(const bs::TXEntry& tx) }, Qt::QueuedConnection); } +QString QtQuickAdapter::makeExportTransactionFilename(QTXSignRequest* request) +{ + if (request->txReq().walletIds.empty()) { + emit transactionExportFailed(tr("TX request doesn't contain wallets")); + return QString(); + } + const auto& timestamp = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + auto walletId = hdWalletIdByLeafId(*request->txReq().walletIds.cbegin()); + if (walletId.empty()) { + walletId = *request->txReq().walletIds.cbegin(); + } + const std::string filename = "BlockSettle_" + walletId + "_" + std::to_string(timestamp) + "_unsigned.bin"; + return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + QString::fromLatin1("/") + QString::fromStdString(filename); +} + void QtQuickAdapter::exportTransaction(const QUrl& path, QTXSignRequest* request) { txSaveReqs_.push_back(path.toLocalFile().toStdString()); @@ -2461,34 +2490,21 @@ void QtQuickAdapter::exportTransaction(const QUrl& path, QTXSignRequest* request void QtQuickAdapter::saveTransaction(const bs::core::wallet::TXSignRequest& txReq, const std::string& exportPath) { - if (txReq.walletIds.empty()) { - emit transactionExportFailed(tr("TX request doesn't contain wallets")); - return; - } - const auto& timestamp = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); - auto walletId = hdWalletIdByLeafId(*txReq.walletIds.cbegin()); - if (walletId.empty()) { - walletId = *txReq.walletIds.cbegin(); - } - const std::string filename = "BlockSettle_" + walletId + "_" + std::to_string(timestamp) + "_unsigned.bin"; - const auto& pathName = exportPath + "/" + filename; - logger_->debug("[{}] exporting transaction to {}", __func__, pathName); const auto& txSer = bs::signer::coreTxRequestToPb(txReq, false).SerializeAsString(); - - auto f = fopen(pathName.c_str(), "wb"); + auto f = fopen(exportPath.c_str(), "wb"); if (!f) { - emit transactionExportFailed(tr("Failed to open %1 for writing").arg(QString::fromStdString(pathName))); + emit transactionExportFailed(tr("Failed to open %1 for writing").arg(QString::fromStdString(exportPath))); return; } if (fwrite(txSer.data(), 1, txSer.size(), f) != txSer.size()) { - logger_->error("[{}] failed to write {} bytes to {}", __func__, txSer.size(), pathName); + logger_->error("[{}] failed to write {} bytes to {}", __func__, txSer.size(), exportPath); emit transactionExportFailed(tr("Failed to write %1 bytes to %2. Disk full?") - .arg(txSer.size()).arg(QString::fromStdString(pathName))); + .arg(txSer.size()).arg(QString::fromStdString(exportPath))); return; } fclose(f); - logger_->debug("[{}] exporting {} done", __func__, pathName); - emit transactionExported(QString::fromStdString(pathName)); + logger_->debug("[{}] exporting {} done", __func__, exportPath); + emit transactionExported(QString::fromStdString(exportPath)); } QTXSignRequest* QtQuickAdapter::importTransaction(const QUrl& path) @@ -2599,30 +2615,30 @@ bool QtQuickAdapter::isRequestReadyToSend(QTXSignRequest* request) const auto& walletIds = request->txReq().walletIds; for (const auto& id : walletIds) { bool isInWallets = false; - for (const auto [walletId, wallet] : hdWallets_) { - if ((id == walletId || wallet.hasLeaf(id)) && !wallet.watchOnly) { - isInWallets = true; - break; - } - } - if (!isInWallets) { - return false; - } + for (const auto [walletId, wallet] : hdWallets_) { + if ((id == walletId || wallet.hasLeaf(id)) && !wallet.watchOnly) { + isInWallets = true; + break; + } + } + if (!isInWallets) { + return false; + } } return true; } QString QtQuickAdapter::exportPRK() { - const auto& path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) - + QString::fromLatin1("/") - + walletPropertiesModel_->walletName() + QString::fromLatin1(".pdf"); + const auto& path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + + QString::fromLatin1("/") + + QString::fromLatin1("BlockSettle_%1_%2.pdf").arg(walletPropertiesModel_->walletId()).arg(walletPropertiesModel_->walletName()); const auto& seed = walletPropertiesModel_->seed(); WalletBackupPdfWriter writer( - walletPropertiesModel_->walletId(), - QStringList(seed.begin(), seed.begin() + seed.length() / 2).join(QChar::fromLatin1(' ')), - QStringList(seed.begin() + seed.length() / 2, seed.end()).join(QChar::fromLatin1(' ')), - QRImageProvider().requestPixmap(walletPropertiesModel_->walletId(), nullptr, QSize(200, 200))); + walletPropertiesModel_->walletId(), + QStringList(seed.begin(), seed.begin() + seed.length() / 2).join(QChar::fromLatin1(' ')), + QStringList(seed.begin() + seed.length() / 2, seed.end()).join(QChar::fromLatin1(' ')), + QRImageProvider().requestPixmap(walletPropertiesModel_->walletId(), nullptr, QSize(200, 200))); writer.write(path); return path; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 9139bad65..9655c5f60 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -189,6 +189,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE int rescanWallet(const QString& walletId); Q_INVOKABLE int renameWallet(const QString& walletId, const QString& newName); Q_INVOKABLE void walletSelected(int); + Q_INVOKABLE QString makeExportTransactionFilename(QTXSignRequest* request); Q_INVOKABLE void exportTransaction(const QUrl& path, QTXSignRequest* request); Q_INVOKABLE QTXSignRequest* importTransaction(const QUrl& path); Q_INVOKABLE void exportSignedTX(const QUrl& path, QTXSignRequest* request, const QString& password); diff --git a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml index 778086db1..176bb85dd 100644 --- a/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml +++ b/GUI/QtQuick/qml/Overview/OverviewWalletBar.qml @@ -73,7 +73,7 @@ Rectangle { function onRequestWalletSelection(index) { var modelSize = (wallet_selection_combobox.model === walletBalances) ? wallet_selection_combobox.model.rowCount - : wallet_selection_combobox.length + : wallet_selection_combobox.model.length if (index >= 0 && index < modelSize) { bsApp.walletSelected(index) control.walletIndexChanged(index) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index d9f10a6e0..239b78717 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -3,6 +3,7 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 import QtQuick.Dialogs 1.3 +import Qt.labs.platform 1.1 as QLP import "../BsStyles" import "../StyledControls" @@ -69,6 +70,7 @@ ColumnLayout { Layout.alignment: Qt.AlingVCenter activeFocusOnTab: false + hoverEnabled: true font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" @@ -90,7 +92,7 @@ ColumnLayout { radius: BSSizes.applyScale(14) - border.color: BSStyle.defaultBorderColor + border.color: import_transaction_button.hovered ? BSStyle.comboBoxHoveredBorderColor : BSStyle.defaultBorderColor border.width: BSSizes.applyScale(1) } @@ -125,6 +127,7 @@ ColumnLayout { Layout.alignment: Qt.AlingVCenter activeFocusOnTab: false + hoverEnabled: true font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" @@ -145,7 +148,7 @@ ColumnLayout { radius: BSSizes.applyScale(14) - border.color: BSStyle.defaultBorderColor + border.color: simple_but.hovered ? BSStyle.comboBoxHoveredBorderColor : BSStyle.defaultBorderColor border.width: 1 } @@ -188,232 +191,244 @@ ColumnLayout { spacing: 0 - RowLayout { - id: input_header_layout - Layout.fillWidth: true - Layout.topMargin: BSSizes.applyScale(16) - Layout.preferredHeight: BSSizes.applyScale(19) - Layout.alignment: Qt.AlignTop + ColumnLayout { + width: parent.width + height: parent.height * 0.6 + spacing: 0 - Label { - id: inputs_title + RowLayout { + id: input_header_layout + Layout.fillWidth: true + Layout.topMargin: BSSizes.applyScale(16) + Layout.preferredHeight: BSSizes.applyScale(19) + Layout.alignment: Qt.AlignTop - Layout.leftMargin: BSSizes.applyScale(16) - Layout.fillHeight: true - Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter + Label { + id: inputs_title - text: qsTr("Inputs") + Layout.leftMargin: BSSizes.applyScale(16) + Layout.fillHeight: true + Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter - height : BSSizes.applyScale(19) - color: "#E2E7FF" - font.pixelSize: BSSizes.applyScale(16) - font.family: "Roboto" - font.weight: Font.Medium - } + text: qsTr("Inputs") - Label { - Layout.fillWidth: true - } + height : BSSizes.applyScale(19) + color: "#E2E7FF" + font.pixelSize: BSSizes.applyScale(16) + font.family: "Roboto" + font.weight: Font.Medium + } - CustomCheckBox { - id: checkbox_rbf + Label { + Layout.fillWidth: true + } - activeFocusOnTab: false + CustomCheckBox { + id: checkbox_rbf - implicitHeight: BSSizes.applyScale(18) + activeFocusOnTab: false - Layout.alignment: Qt.AlignRight | Qt.AlignTop - Layout.rightMargin: BSSizes.applyScale(16) - Layout.topMargin: BSSizes.applyScale(0) + implicitHeight: BSSizes.applyScale(18) - text: qsTr("RBF") - enabled: !isRBF + Layout.alignment: Qt.AlignRight | Qt.AlignTop + Layout.rightMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(0) - spacing: BSSizes.applyScale(6) - font.pixelSize: BSSizes.applyScale(13) - font.family: "Roboto" - font.weight: Font.Normal - } + text: qsTr("RBF") + enabled: !isRBF - } + spacing: BSSizes.applyScale(6) + font.pixelSize: BSSizes.applyScale(13) + font.family: "Roboto" + font.weight: Font.Normal + } - WalletsComboBox { + } - id: from_wallet_combo + WalletsComboBox { - Layout.leftMargin: BSSizes.applyScale(16) - Layout.topMargin: BSSizes.applyScale(16) - Layout.alignment: Qt.AlignLeft | Qt.AlingTop - visible: !isRBF && !isCPFP + id: from_wallet_combo - width: BSSizes.applyScale(504) - height: BSSizes.applyScale(70) + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(16) + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + visible: !isRBF && !isCPFP - onActivated: { - walletBalances.selectedWallet = currentIndex - prepareRequest() - } + width: BSSizes.applyScale(504) + height: BSSizes.applyScale(70) - function prepareRequest() { - if (rec_addr_input.isValid) { - create_temp_request() + onActivated: { + walletBalances.selectedWallet = currentIndex + prepareRequest() } - //I dont understand why but acceptableInput dont work... - var cur_value = parseFloat(amount_input.input_text) - var bottom = 0 - var top = tempRequest.maxAmount - if(cur_value < bottom || cur_value > top) - { - amount_input.input_text = tempRequest.maxAmount - } + function prepareRequest() { + if (rec_addr_input.isValid) { + create_temp_request() + } - bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) - } + //I dont understand why but acceptableInput dont work... + var cur_value = parseFloat(amount_input.input_text) + var bottom = 0 + var top = tempRequest.maxAmount + if(cur_value < bottom || cur_value > top) + { + amount_input.input_text = tempRequest.maxAmount + } - Connections { - target: walletBalances - function onChanged() { - if (layout.visible) { - prepareRequest() + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) + } + + Connections { + target: walletBalances + function onChanged() { + if (layout.visible) { + prepareRequest() + } } } } - } - FeeSuggestComboBox { + FeeSuggestComboBox { - id: fee_suggest_combo + id: fee_suggest_combo - Layout.leftMargin: BSSizes.applyScale(16) - Layout.topMargin: BSSizes.applyScale(10) - Layout.alignment: Qt.AlignLeft | Qt.AlingTop + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(10) + Layout.alignment: Qt.AlignLeft | Qt.AlingTop - width: BSSizes.applyScale(504) - height: BSSizes.applyScale(70) + width: BSSizes.applyScale(504) + height: BSSizes.applyScale(70) - function change_index_handler() - { - if (isRBF) { - } - else if (isCPFP) { - } - else { - txInputsModel.fee = parseFloat(fee_suggest_combo.edit_value()) - bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) - txOutputsModel.clearOutputs() + function change_index_handler() + { + if (isRBF) { + } + else if (isCPFP) { + } + else { + txInputsModel.fee = parseFloat(fee_suggest_combo.edit_value()) + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) + txOutputsModel.clearOutputs() + } } } } - Rectangle { - id: divider - height: BSSizes.applyScale(1) - - Layout.fillWidth: true - Layout.topMargin: BSSizes.applyScale((!isRBF && !isCPFP) ? 196 : 274) - Layout.alignment: Qt.AlignLeft | Qt.AlingTop - - color: BSStyle.defaultGreyColor - } - - - CustomTableView { - id: table_sel_inputs - - Layout.fillWidth: true - Layout.fillHeight: true - Layout.leftMargin: BSSizes.applyScale(16) - Layout.rightMargin: BSSizes.applyScale(16) - Layout.preferredHeight: BSSizes.applyScale(300) - - model: isRBF ? tx.ownInputs : isCPFP ? tx.ownOutputs : txInputsSelectedModel - columnWidths: [0.7, 0.1, 0, 0.2] - - copy_button_column_index: -1 - has_header: false - - Component - { - id: cmpnt_sel_inputs - - Row { - id: cmpnt_sel_inputs_row - - spacing: BSSizes.applyScale(12) - - Text { - id: internal_text - - visible: model_column !== delete_button_column_index - - text: model_tableData - height: parent.height - verticalAlignment: Text.AlignVCenter - clip: true - - color: get_data_color(model_row, model_column) - font.family: "Roboto" - font.weight: Font.Normal - font.pixelSize: model_row === 0 ? table_sel_inputs.text_header_size : table_sel_inputs.cell_text_size - - leftPadding: table_sel_inputs.get_text_left_padding(model_row, model_column) - } - - Button { - id: sel_inputs_button - - enabled: !isRBF && !isCPFP - - activeFocusOnTab: false - - text: qsTr("Select Inputs") - - font.family: "Roboto" - font.weight: Font.DemiBold - font.pixelSize: BSSizes.applyScale(12) - - anchors.verticalCenter: parent.verticalCenter - - contentItem: Text { - text: sel_inputs_button.text - font: sel_inputs_button.font - color: "#45A6FF" - horizontalAlignment: Text.AlignHCenter + ColumnLayout { + width: parent.width + height: parent.height * 0.4 + spacing: 0 + + Rectangle { + id: divider + height: BSSizes.applyScale(1) + + Layout.fillWidth: true + Layout.topMargin: BSSizes.applyScale((!isRBF && !isCPFP) ? 196 : 274) + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + color: BSStyle.defaultGreyColor + } + + + CustomTableView { + id: table_sel_inputs + + Layout.fillWidth: true + Layout.fillHeight: true + Layout.leftMargin: BSSizes.applyScale(16) + Layout.rightMargin: BSSizes.applyScale(16) + Layout.preferredHeight: BSSizes.applyScale(300) + + model: isRBF ? tx.ownInputs : isCPFP ? tx.ownOutputs : txInputsSelectedModel + columnWidths: [0.7, 0.1, 0, 0.2] + + copy_button_column_index: -1 + has_header: false + + Component + { + id: cmpnt_sel_inputs + + Row { + id: cmpnt_sel_inputs_row + + spacing: BSSizes.applyScale(12) + + Text { + id: internal_text + + visible: model_column !== delete_button_column_index + + text: model_tableData + height: parent.height verticalAlignment: Text.AlignVCenter - elide: Text.ElideRight + clip: true + + color: get_data_color(model_row, model_column) + font.family: "Roboto" + font.weight: Font.Normal + font.pixelSize: model_row === 0 ? table_sel_inputs.text_header_size : table_sel_inputs.cell_text_size + + leftPadding: table_sel_inputs.get_text_left_padding(model_row, model_column) } - - background: Rectangle { - implicitWidth: BSSizes.applyScale(84) - implicitHeight: BSSizes.applyScale(25) - color: "transparent" - border.color: "#45A6FF" - border.width: BSSizes.applyScale(1) - radius: BSSizes.applyScale(8) + + Button { + id: sel_inputs_button + + enabled: !isRBF && !isCPFP + + activeFocusOnTab: false + + text: qsTr("Select Inputs") + + font.family: "Roboto" + font.weight: Font.DemiBold + font.pixelSize: BSSizes.applyScale(12) + + anchors.verticalCenter: parent.verticalCenter + + contentItem: Text { + text: sel_inputs_button.text + font: sel_inputs_button.font + color: "#45A6FF" + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight + } + + background: Rectangle { + implicitWidth: BSSizes.applyScale(84) + implicitHeight: BSSizes.applyScale(25) + color: "transparent" + border.color: "#45A6FF" + border.width: BSSizes.applyScale(1) + radius: BSSizes.applyScale(8) + } + + onClicked: layout.sig_select_inputs() } - - onClicked: layout.sig_select_inputs() } } - } - - - CustomTableDelegateRow { - id: cmpnt_table_delegate - } - - function choose_row_source_component(row, column) - { - if(row === 0 && column === 0) - return cmpnt_sel_inputs - else - return cmpnt_table_delegate - } - - function get_text_left_padding(row, column) - { - return (row === 0 && column === 0) ? 0 : left_text_padding + + + CustomTableDelegateRow { + id: cmpnt_table_delegate + } + + function choose_row_source_component(row, column) + { + if(row === 0 && column === 0) + return cmpnt_sel_inputs + else + return cmpnt_table_delegate + } + + function get_text_left_padding(row, column) + { + return (row === 0 && column === 0) ? 0 : left_text_padding + } } } } @@ -440,177 +455,189 @@ ColumnLayout { anchors.fill: parent spacing: 0 + + ColumnLayout { + width: parent.width + height: parent.height * 0.6 + spacing: 0 - Label { - id: outputs_title + Label { + id: outputs_title - Layout.leftMargin: BSSizes.applyScale(16) - Layout.topMargin: BSSizes.applyScale(16) - Layout.alignment: Qt.AlignLeft | Qt.AlingTop + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(16) + Layout.alignment: Qt.AlignLeft | Qt.AlingTop - text: qsTr("Outputs") + text: qsTr("Outputs") - height : BSSizes.applyScale(19) - color: "#E2E7FF" - font.pixelSize: BSSizes.applyScale(16) - font.family: "Roboto" - font.weight: Font.Medium - } + height : BSSizes.applyScale(19) + color: "#E2E7FF" + font.pixelSize: BSSizes.applyScale(16) + font.family: "Roboto" + font.weight: Font.Medium + } - RecvAddrTextInput { + RecvAddrTextInput { - id: rec_addr_input + id: rec_addr_input - Layout.leftMargin: BSSizes.applyScale(16) - Layout.topMargin: BSSizes.applyScale(16) - Layout.alignment: Qt.AlignLeft | Qt.AlingTop + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(16) + Layout.alignment: Qt.AlignLeft | Qt.AlingTop - width: BSSizes.applyScale(504) - height: BSSizes.applyScale(70) + width: BSSizes.applyScale(504) + height: BSSizes.applyScale(70) - wallets_current_index: from_wallet_combo.currentIndex + wallets_current_index: from_wallet_combo.currentIndex - onEnterPressed: { - if (!processEnterKey()) { - amount_input.setActiveFocus() + onEnterPressed: { + if (!processEnterKey()) { + amount_input.setActiveFocus() + } } - } - - onReturnPressed: { - if (!processEnterKey()) { + + onReturnPressed: { + if (!processEnterKey()) { + amount_input.setActiveFocus() + } + } + + onFocus_next: { amount_input.setActiveFocus() } } - onFocus_next: { - amount_input.setActiveFocus() - } - } + AmountInput { - AmountInput { + id: amount_input - id: amount_input + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(10) + Layout.alignment: Qt.AlignLeft | Qt.AlingTop - Layout.leftMargin: BSSizes.applyScale(16) - Layout.topMargin: BSSizes.applyScale(10) - Layout.alignment: Qt.AlignLeft | Qt.AlingTop + width: BSSizes.applyScale(504) + height: BSSizes.applyScale(70) - width: BSSizes.applyScale(504) - height: BSSizes.applyScale(70) + function getMax() { + if (!isRBF && !isCPFP && txInputsSelectedModel.rowCount > 1) { + var maxValue = parseFloat(tempRequest.maxAmount) - txOutputsModel.totalAmount + return (maxValue >= 0 ? maxValue : 0).toFixed(8) + } + return tempRequest.maxAmount - function getMax() { - if (!isRBF && !isCPFP && txInputsSelectedModel.rowCount > 1) { - var maxValue = parseFloat(tempRequest.maxAmount) - txOutputsModel.totalAmount - return (maxValue >= 0 ? maxValue : 0).toFixed(8) } - return tempRequest.maxAmount - - } - onEnterPressed: { - if (!processEnterKey()) { - comment_input.setActiveFocus() + onEnterPressed: { + if (!processEnterKey()) { + comment_input.setActiveFocus() + } } - } - - onReturnPressed: { - if (!processEnterKey()) { - comment_input.setActiveFocus() + + onReturnPressed: { + if (!processEnterKey()) { + comment_input.setActiveFocus() + } } } - } - CustomTextEdit { + CustomTextEdit { - id: comment_input + id: comment_input - Layout.leftMargin: BSSizes.applyScale(16) - Layout.topMargin: BSSizes.applyScale(10) - Layout.alignment: Qt.AlignLeft | Qt.AlingTop + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(10) + Layout.alignment: Qt.AlignLeft | Qt.AlingTop - Layout.preferredHeight : BSSizes.applyScale(90) - Layout.preferredWidth: BSSizes.applyScale(504) + Layout.preferredHeight : BSSizes.applyScale(90) + Layout.preferredWidth: BSSizes.applyScale(504) - //aliases - title_text: qsTr("Comment") + //aliases + title_text: qsTr("Comment") - onTabNavigated: include_output_but.forceActiveFocus() - onBackTabNavigated: fee_suggest_combo.forceActiveFocus() - } + onTabNavigated: include_output_but.forceActiveFocus() + onBackTabNavigated: fee_suggest_combo.forceActiveFocus() + } - CustomButton { - id: include_output_but - text: qsTr("Include Output") + CustomButton { + id: include_output_but + text: qsTr("Include Output") - Layout.leftMargin: BSSizes.applyScale(16) - Layout.topMargin: BSSizes.applyScale(16) - Layout.alignment: Qt.AlignLeft | Qt.AlingTop + Layout.leftMargin: BSSizes.applyScale(16) + Layout.topMargin: BSSizes.applyScale(16) + Layout.alignment: Qt.AlignLeft | Qt.AlingTop - activeFocusOnTab: include_output_but.enabled + activeFocusOnTab: include_output_but.enabled - enabled: isRBF || is_ready_output - preferred: !isRBF && is_ready_output + enabled: isRBF || is_ready_output + preferred: !isRBF && is_ready_output - icon.source: "qrc:/images/plus.svg" - icon.color: include_output_but.enabled ? "#45A6FF" : BSStyle.buttonsDisabledTextColor + icon.source: "qrc:/images/plus.svg" + icon.color: include_output_but.enabled ? "#45A6FF" : BSStyle.buttonsDisabledTextColor - width: BSSizes.applyScale(504) + width: BSSizes.applyScale(504) - function click_enter() { - if (!include_output_but.enabled) return + function click_enter() { + if (!include_output_but.enabled) return - txOutputsModel.addOutput(rec_addr_input.input_text, amount_input.input_text) + txOutputsModel.addOutput(rec_addr_input.input_text, amount_input.input_text) - rec_addr_input.input_text = "" - amount_input.input_text = "" + rec_addr_input.input_text = "" + amount_input.input_text = "" - if (!isRBF && !isCPFP) { - txInputsModel.updateAutoselection() + if (!isRBF && !isCPFP) { + txInputsModel.updateAutoselection() + } } } } - Rectangle { - - height: 1 - - Layout.fillWidth: true - Layout.topMargin: BSSizes.applyScale(30) - Layout.alignment: Qt.AlignLeft | Qt.AlingTop - - color: BSStyle.defaultGreyColor - } - - CustomTableView { - id: table_outputs - - Layout.fillWidth: true - Layout.fillHeight : true - Layout.leftMargin: BSSizes.applyScale(16) - Layout.rightMargin: BSSizes.applyScale(16) - - model: txOutputsModel - columnWidths: [0.744, 0.20, 0.056] - - copy_button_column_index: -1 - delete_button_column_index: 2 - has_header: false - - onDeleteRequested: (row) => - { - txOutputsModel.delOutput(row) - if (txOutputsModel.rowCount <= 1 && !isRBF && !isCPFP) { - txInputsModel.clearSelection() + ColumnLayout { + width: parent.width + height: parent.height * 0.4 + spacing: 0 + + Rectangle { + + height: 1 + + Layout.fillWidth: true + Layout.topMargin: BSSizes.applyScale(30) + Layout.alignment: Qt.AlignLeft | Qt.AlingTop + + color: BSStyle.defaultGreyColor + } + + CustomTableView { + id: table_outputs + + Layout.fillWidth: true + Layout.fillHeight : true + Layout.leftMargin: BSSizes.applyScale(16) + Layout.rightMargin: BSSizes.applyScale(16) + + model: txOutputsModel + columnWidths: [0.544, 0.2, 0.20, 0.056] + + copy_button_column_index: -1 + delete_button_column_index: 3 + has_header: false + + onDeleteRequested: (row) => + { + txOutputsModel.delOutput(row) + if (txOutputsModel.rowCount <= 1 && !isRBF && !isCPFP) { + txInputsModel.clearSelection() + } + else if (txOutputsModel.rowCount > 1 && !isRBF && !isCPFP) { + txInputsModel.updateAutoselection() + } } - else if (txOutputsModel.rowCount > 1 && !isRBF && !isCPFP) { - txInputsModel.updateAutoselection() + + function get_text_left_padding(row, column) + { + return (row === 0 && column === 0) ? 0 : left_text_padding } } - - function get_text_left_padding(row, column) - { - return (row === 0 && column === 0) ? 0 : left_text_padding - } } } } @@ -621,14 +648,13 @@ ColumnLayout { Layout.fillHeight : true } - FileDialog { + QLP.FileDialog { id: exportFileDialog title: qsTr("Please choose folder to export transaction") - folder: shortcuts.documents - selectFolder: true - selectExisting: false + defaultSuffix: "bin" + fileMode: QLP.FileDialog.SaveFile onAccepted: { - bsApp.exportTransaction(exportFileDialog.fileUrl, continue_but.prepare_transaction()) + bsApp.exportTransaction(exportFileDialog.currentFile, continue_but.prepare_transaction()) } } @@ -686,6 +712,7 @@ ColumnLayout { if (tempRequest.isWatchingOnly) { + exportFileDialog.currentFile = "file:////" + bsApp.makeExportTransactionFilename(tempRequest) exportFileDialog.open() } else diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 94dd152f9..e3c9b9d3b 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -3,6 +3,7 @@ import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 import QtQuick.Dialogs 1.3 +import Qt.labs.platform 1.1 as QLP import "../BsStyles" import "../StyledControls" @@ -49,6 +50,7 @@ ColumnLayout { Layout.alignment: Qt.AlingVCenter activeFocusOnTab: false + hoverEnabled: true font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" @@ -70,7 +72,7 @@ ColumnLayout { radius: BSSizes.applyScale(14) - border.color: BSStyle.defaultBorderColor + border.color: import_transaction_button.hovered ? BSStyle.comboBoxHoveredBorderColor : BSStyle.defaultBorderColor border.width: BSSizes.applyScale(1) } @@ -105,6 +107,7 @@ ColumnLayout { Layout.alignment: Qt.AlingVCenter activeFocusOnTab: false + hoverEnabled: true font.pixelSize: BSSizes.applyScale(13) font.family: "Roboto" @@ -126,7 +129,7 @@ ColumnLayout { radius: BSSizes.applyScale(14) - border.color: BSStyle.defaultBorderColor + border.color: advanced_but.hovered ? BSStyle.comboBoxHoveredBorderColor : BSStyle.defaultBorderColor border.width: BSSizes.applyScale(1) } @@ -246,14 +249,13 @@ ColumnLayout { Layout.fillHeight: true } - FileDialog { + QLP.FileDialog { id: exportFileDialog title: qsTr("Please choose folder to export transaction") - folder: shortcuts.documents - selectFolder: true - selectExisting: false + defaultSuffix: "bin" + fileMode: QLP.FileDialog.SaveFile onAccepted: { - bsApp.exportTransaction(exportFileDialog.fileUrl, continue_but.prepare_transaction()) + bsApp.exportTransaction(exportFileDialog.currentFile, continue_but.prepare_transaction()) } } @@ -288,6 +290,7 @@ ColumnLayout { if (tempRequest.isWatchingOnly) { + exportFileDialog.currentFile = "file:////" + bsApp.makeExportTransactionFilename(tempRequest) exportFileDialog.open() } else From 6b39dbb93594259a98df16dbe3d74c3a7786b568 Mon Sep 17 00:00:00 2001 From: yz Date: Thu, 27 Apr 2023 16:50:25 +0300 Subject: [PATCH 378/436] Fixed indent; updated private root key template --- GUI/QtQuick/PaperBackupWriter.cpp | 54 +++++++++++----------------- GUI/QtQuick/PaperBackupWriter.h | 5 ++- GUI/QtQuick/QtQuickAdapter.cpp | 27 +++++++------- GUI/QtQuick/images/RPK12.png | Bin 0 -> 3820085 bytes GUI/QtQuick/images/RPK24.png | Bin 0 -> 3633796 bytes GUI/QtQuick/images/RPK_template.png | Bin 271241 -> 0 bytes GUI/QtQuick/qtquick.qrc | 3 +- 7 files changed, 37 insertions(+), 52 deletions(-) create mode 100644 GUI/QtQuick/images/RPK12.png create mode 100644 GUI/QtQuick/images/RPK24.png delete mode 100644 GUI/QtQuick/images/RPK_template.png diff --git a/GUI/QtQuick/PaperBackupWriter.cpp b/GUI/QtQuick/PaperBackupWriter.cpp index e1ee65030..7857db9c7 100644 --- a/GUI/QtQuick/PaperBackupWriter.cpp +++ b/GUI/QtQuick/PaperBackupWriter.cpp @@ -19,11 +19,10 @@ #include WalletBackupPdfWriter::WalletBackupPdfWriter(const QString &walletId - , const QString &keyLine1, const QString &keyLine2 + , const QStringList& seed , const QPixmap &qr) : walletId_(walletId) - , keyLine1_(keyLine1) - , keyLine2_(keyLine2) + , seed_(seed) , qr_(qr) { } @@ -117,47 +116,34 @@ void WalletBackupPdfWriter::print(QPrinter *printer) void WalletBackupPdfWriter::draw(QPainter &p, qreal width, qreal height) { + const auto longSeed = seed_.length() > 12; + QFont font = p.font(); - font.setPixelSize(125); + font.setPixelSize(150); + font.setBold(true); - QPixmap logo = QPixmap(QString::fromUtf8(":/images/RPK_template.png")); + QPixmap logo = QPixmap(QString::fromUtf8(longSeed ? ":/images/RPK24.png" : ":/images/RPK12.png")); p.drawPixmap(QRect(0, 0, width, height), logo); qreal relWidth = width / logo.width(); qreal relHeight = height / logo.height(); - QFont italic = font; - italic.setItalic(true); - - QFont bold = font; - bold.setBold(true); - - QStaticText wIdDesc(QObject::tr("Wallet ID")); - QStaticText keyLine1Desc(QObject::tr("Line 1")); - QStaticText keyLine2Desc(QObject::tr("Line 2")); - - QStaticText wId(walletId_); - QStaticText keyLine1(keyLine1_); - QStaticText keyLine2(keyLine2_); - wIdDesc.prepare(QTransform(), italic); - keyLine1Desc.prepare(QTransform(), italic); - keyLine2Desc.prepare(QTransform(), italic); - - wId.prepare(QTransform(), bold); - keyLine1.prepare(QTransform(), bold); - keyLine2.prepare(QTransform(), bold); - - p.setFont(bold); - - QTextOption option; - option.setWrapMode(QTextOption::WordWrap); + p.setFont(font); // Magic numbers is pixel positions of given controls on RPK_template.png - p.drawStaticText(QPointF(700 * relWidth, 2035 * relHeight), wId); - p.drawText(QRectF(150 * relWidth, 2580 * relHeight, 1200 * relWidth, 150 * relHeight), keyLine1_, option); - p.drawText(QRectF(150 * relWidth, 2790 * relHeight, 1200 * relWidth, 150 * relHeight), keyLine2_, option); + p.drawText(QPointF(140 * relWidth, 2020 * relHeight), walletId_); + + const auto topLeftX = 240; + const auto topLeftY = 2415; + const auto deltaX = 480; + const auto deltaY = 93; + for (auto i = 0; i < 3; ++i) { + for (auto j = 0; j < seed_.size() / 3; ++j) { + p.drawText(QPointF((topLeftX + i * deltaX) * relWidth, (topLeftY + j * deltaY) * relHeight), seed_.at(i * 3 + j)); + } + } - p.drawPixmap(QRectF(1640 * relWidth, 2155 * relHeight, 740 * relWidth, 740 * relHeight), + p.drawPixmap(QRectF(1775 * relWidth, 1970 * relHeight, 790 * relWidth, 790 * relHeight), qr_, qr_.rect()); } diff --git a/GUI/QtQuick/PaperBackupWriter.h b/GUI/QtQuick/PaperBackupWriter.h index 57ffa6478..e153a506c 100644 --- a/GUI/QtQuick/PaperBackupWriter.h +++ b/GUI/QtQuick/PaperBackupWriter.h @@ -29,7 +29,7 @@ class WalletBackupPdfWriter final public: WalletBackupPdfWriter(const QString &walletId - , const QString &keyLine1, const QString &keyLine2 + , const QStringList& seed , const QPixmap &qr); bool write(const QString &fileName); @@ -41,8 +41,7 @@ class WalletBackupPdfWriter final private: QString walletId_; - QString keyLine1_; - QString keyLine2_; + QStringList seed_; QPixmap qr_; }; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 71e0d638d..90af5b261 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1859,7 +1859,7 @@ bs::message::ProcessingResult QtQuickAdapter::processWalletDeleted(const std::st emit successDeleteWallet(); if (walletBalances_->rowCount() > 0) { - emit requestWalletSelection(0); + emit requestWalletSelection(0); } return bs::message::ProcessingResult::Success; @@ -2470,17 +2470,17 @@ void QtQuickAdapter::notifyNewTransaction(const bs::TXEntry& tx) QString QtQuickAdapter::makeExportTransactionFilename(QTXSignRequest* request) { - if (request->txReq().walletIds.empty()) { - emit transactionExportFailed(tr("TX request doesn't contain wallets")); - return QString(); - } - const auto& timestamp = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); - auto walletId = hdWalletIdByLeafId(*request->txReq().walletIds.cbegin()); - if (walletId.empty()) { - walletId = *request->txReq().walletIds.cbegin(); - } - const std::string filename = "BlockSettle_" + walletId + "_" + std::to_string(timestamp) + "_unsigned.bin"; - return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + QString::fromLatin1("/") + QString::fromStdString(filename); + if (request->txReq().walletIds.empty()) { + emit transactionExportFailed(tr("TX request doesn't contain wallets")); + return QString(); + } + const auto& timestamp = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + auto walletId = hdWalletIdByLeafId(*request->txReq().walletIds.cbegin()); + if (walletId.empty()) { + walletId = *request->txReq().walletIds.cbegin(); + } + const std::string filename = "BlockSettle_" + walletId + "_" + std::to_string(timestamp) + "_unsigned.bin"; + return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + QString::fromLatin1("/") + QString::fromStdString(filename); } void QtQuickAdapter::exportTransaction(const QUrl& path, QTXSignRequest* request) @@ -2636,8 +2636,7 @@ QString QtQuickAdapter::exportPRK() const auto& seed = walletPropertiesModel_->seed(); WalletBackupPdfWriter writer( walletPropertiesModel_->walletId(), - QStringList(seed.begin(), seed.begin() + seed.length() / 2).join(QChar::fromLatin1(' ')), - QStringList(seed.begin() + seed.length() / 2, seed.end()).join(QChar::fromLatin1(' ')), + seed, QRImageProvider().requestPixmap(walletPropertiesModel_->walletId(), nullptr, QSize(200, 200))); writer.write(path); return path; diff --git a/GUI/QtQuick/images/RPK12.png b/GUI/QtQuick/images/RPK12.png new file mode 100644 index 0000000000000000000000000000000000000000..2e2e725f9be3c3913a7ec8bfca82255375e3509f GIT binary patch literal 3820085 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]?j7SO1|C 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

ac@y?uH5X!KUkp1wao_KQ%Pb+NaeM+A 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

0I+Qd;_BsNDlqO~3fC zvIl+9u!_)ikH8t*gfUkJm@lKkkwKh7;`}Y3m#;I^KzQ6faT`4+SoLkiyh^nc)( z@pHt;De1>(AtPKqT25t`lg!4<8^AF9(%c<5Ue8>K9Y=30Lg6Gi(o)E8+?lNPX4v1i)EuheiK?1h~A; zPtGB>)udD{KcQT~pZ!qzV?*qH(dUcQsj23aZG;D#pQ`h-ZKhIw9x4RaF@7IwN*(IS z#~o~=BF3pa7HRf}vc2;a8sU?j+iZzIS#_e6NgN%8EhFXkRurI+(j`YZMK%Wc^TRUH z&_~|%pJod#njf1!Y#W9I63)?IQhuwpe?om{m(T7}0qWajI!YQEPWe7$=;yzNGARL( z%fMIj(aQp?%v1}-Pi?cnt%Mzdqw@)z*ARI!Z0TE#kRX#><95Y!4g93Lrf;VF7`i;V zbWpc=ua;M?{jsX`)6HUfp;8z%@)yy;$;+kASq|~=8=Y-A*2oU%z84PSx8o$MSp(#! zfM!5pRMM*KsEc!K;!yrj(~Ff(_{^Wn17K;sq_{NrTOB2OKqHQ#sz-SKAO)5xn%9NA zYz2Nx?VO79hP?+;+9RKu=W<-H0)>&#=g$nuG~J5|&!3 zL^SfY73QofZ}5|qM~rbY0Od5gShpQ+xv2c;Tb=}%?xjtbXOUlM~~kEIvZCnKDjdE}hBaYm)Pxqlv8? zKAyw#OQ;&NsR|ib33V`j2ee<+2jb6CO5DIelBjcg8Qf0%BFj0wYmB$XHrI41?s ztNSXt*etWPd}F0O>B-ci;Ol5~bikbE6je5EA-3bwPO}L{=?CTL2!uA0u9a z{KGXrFY)IWa3eA3{UV|=JvF=?es*$@z&sO$9LYWc+!O&G2&h0mvNm-9mw{)kuHxqpAM={kYX(wf+)dj+gqBej|BObv%Km8u&WH=n z0K9oGMwr(%yjLh0b_;GWZ?!1^8+4mKY5!DRI(muV*Ij&C*pwVfrYgTIx%wiMl$&g( zyY0GZTU3SeIEmp}o~4Qic)9pj5aBQL|9{pg7&`o%4=9g}iN(7Ys(PP>RxO8c!S&6m z+lO?X31|N3ey#hlB5Ut;1_tV)Uj|Os0i1GP%F)A>+nB6->B>Nj*~)7?9uXb#?4M7U zzH{IZB7fb$Yt5>#p@u;ywj@v=C$b{u&Z_QSIO5+ujx>G+DIhF- z(=tVEtHhlOVJII9dk_vJZD1Ye>i@Oy|M%;dD>Ey23>5}%XDlrSgvS~Y)z%Thsm<&3 zeP0-2lP@v_R@`mvW%i6>^KU~_>@h7|9sR6T5AbH#A?N0Do<(Lpk_q$ji(A33T*|hg z+5|5cGM2jMm%BaXd*T)&`&IWjp2ew$p0(dFy@u-3@Cf&!loX~%LB6v&k%hG;r5|Wr z(Bbl>26kZ+h80N3((FGt=l`wTBaUY{&j^QAVwvUswXcJh>q?WEWNYe&wcR4nDlGk| z??G%lx?Nz4#a+Soy>I(yMy8tUA0ycXI&OG*mj+aA%>|dC#L9b%r-vgf$;3BO3D0yT zM&cO;ggGV(C+7(jJkHqS-52Q9FVIi(zFJbpb4;>6&MrXuFgC%TQ0ZZ;{KXiN>iHUr zeIivoM2MGLGWnEXZvBF#BM~=k^EO5D{b>I=DsPoIavMdn=}rLKmF`lhVIHQc}RT|Om|v<`_@ezt5;)C z>00UMg`^f&gpSRxqb}n+<`=h*=`Qb?nTSoGqokn1l4#NpeJYPa!7_G@;5#qgc1ls^(BSN{9-{Y9KMw zTcgqy%g=;ELhL0=RkD`vbNq8u!A_Uy+!tMgLW+%si#3Mvj0z)B4AvOCf4nLEkhU=T z!qCUJ=f+4$SZNZcuu1nyz^r;7+8rG{sB0|b=OQ?2$k*Iei|>_w%l(-uqNI|z|GFam zYr2Ynxod;E6>u7;R5~@ZzZe}LexIs{)?T0< zz1(&l5^()3M34~9u*(B5kM4$XQCaviMgGjW8oqk5RWmAQ;^rfWV;IXzimw}!11__& ze0Aqv#QV#W_@Bg$L2m|2BZcF5FO?ABacMAn<|cQ)ETBK)=fJA+Y!qY7Wn}%pb25 zqQnOO6zuQZS{}!(=V73U`yS{IzhMif>rBZ58uvv}wo{UC+0M{12on43H?Ecu@xxGQ zD!@7e9OHtYh5VcVY>?b4oYD?= zBa5?w*>$E-ro#eVd;^ufmRdiR;^#BNw0}fB-3LFuirO7|ci#tYtDT>`NIBQH3g~J3 zveY~mv`-XMw(SBb<7{S-O5($n$eE(l#;qd=S{XLnCPD>x(t3D}=J0-?0Kuf{GxTc7 zAuVik(MhIN;#x`!<{0V0zIHx1BfxgU_*=(twhe=*I8kQZus1A7_bkJa7~Bb}h<#?- zLaTfv|4z4mi~y}Km_7eLizvG0x+os1%A=XqaX7&1@VJOiebKK|c6GdDVC2;?spKG_ z@*^& z&P&BV_-r3XfhUv9s+RGhO~Ctyh@`W^PdjIW4e4cR7?L~3t6tTP|MM|hh~&@}0+44D zSyK6ku1@AgXjBrq|3Ss?+vCm7cbErMpi?&06Y}2}UrrOU=8dT=_)rQT!cp}gds!Wc!_D5-2z=4GSwNrv_$nyG75;9nH zRL174$e|hd($?TfK=A>2OC)ZO$blqIPjsx~Ya~lSJmra|Y`+Ywf43CW2(xW#zGp$H z+DI2bG(rkGMRv+%0HS|O`iQI#PeD01-wTTgPbv@da)iQak@O3fzF2Z5(jju9(PnZRwGD8G?GX6(L=C$^PsqN~%I1{uB0 z@CQ$^ft~OWW8s9Y&=P&MKBKF`9Vmg8l1IjVv~YuMV1|~Mx3)~1mlEgOsC!=sev)YRSMsw|E8{^h2hTMe9?l95i*_`I3Ck)Q>Q$5BXc9G0ckjMj7b`C2n1dsrRtoW- zjJa+w!40(V8vdfh2wKLVTZGy)a97o*35>wO2e=8%WL%;RerYsq#dxPHvr>o-6B-Vu zm{;1Qw6}%mb`IK+Z;(r=6EdCi3vr?vT`?#m_wKU$fiR$)3HhuY*8k7vL>TX{=iVUp zw(;U-oMX!;Tm5N+K&I>tZ!(%aw)CgsKED!u%hz*xH@UqFMwnt$5+;yY)TYa9f>z0o_^D&4k=2m??N96ZuwN!fokv4801vF8$9N3eH3U$ z2IC9%b{3M&+uYI?R+34TN8AA(^*q(e>l&Fd%(X}6fW#xsLdi^GBL7cVh}FWLjS!8f zKEwX{=S$==GdAhdFTvo7DCSFy1M(fkt6L1z1AdPpXaVz8!HOs2&6mz!Uda$+e^_E< za2t6l8Qi|U(#h#y-aN8Wub9P8=b4n6!X&W^P5fy%9sXl|h83%e|J#-;Mt*G;Hdtgc z-(f`ddpuPtP*|X}jjb0bB4bz_z5>B6kd~(!A>)^Q+n( zuRXEK_akpz=>GcU-N)It<+88)^6sy5b~XY#9d&E{aO;S%j+!dy*T!wO){pl$H^*kk z7G6`Ugsrd3gh5rm@h>eA&_Df-W2L*`*xhdiJjkbZ-`;p|tz|iz&tDQ{+LcgDtB3Pmn9xIOZVJ;_*~UrY z0}ig@J1TDF`CX7q$U(x0dC4Q?xSUBBqqlcEeX%5)c1<%I}lk?tQ>32#8DZ zIIra~)tg*5G|>>_m-V*i0I5G_PvTM{S@Wo-Kioro?visGb2@%}gJM!>g`uVTx^`6M zO&>Tv_G8Z)`pxy8{Vw{hYBL%k*w7xDi6uHo6qHY+=EiQ7{4jLt4?gv86aIbkG0@bY zaQ8ge7+cMh$*!gi6l{10H313=sHfRz0D1T^&JUh$b@=JIK}N-kb+_YuD;`u2ECp2? zk8Aa3Ire8e-3^*d>L`u&Wu)Xw*sGH$#dUBQXVH)YmR@<*g$%11mZT*a! zCe(v#8J8CDk{8sh$bR?SAb+-jAK>C;cx%(6hYm??ijB6HtM%rLm8@Qk7xV8LiGp@C zKG;HE2Qun#IQLkGqQw@BPUNb%YXp=$hgg=u;1>mtfUv2j<&Y?>dBsg@)zuj#7{))( zN}t$TuU5+R;NbC?vy>`2oNekk`9fEEF|&Ey>Zf~lj6@kLHe%}1QJKG=RaQ`t3+xUZ zIFXaW*h*JqHTS7_vuOu4s;>8%ZXsAYn0K#hiipF2J%{1`i=ZUkjs(puaGI}woyvm_87;pO#bl<4+NRKF2UMLJGFeInAMkv}n@&_6{3spC2$ z=9gVcBHMj;(Mtb*@_##$0^Q@eLEm_4jqgxB~;xvqi&UT+KywQ9D69%CY7Mj zU&wiNBprcPmsu~}I{;lu`(*cXkyq*>b;d8ItxI;m?5D=*CZ_HAwMAL+!fBo{H#TBk z?4i;4Sc2LK3iTXk(t~7tmn8(!Gv5B=8xC#@fpAvaEMk3rQ#f+-rolC$tbwNKD6{%?xSKt8gqLC3`4G5Qn(!RG zF33`y$0^dMr*%P&eVrLyf!sPlfof??kEzb5X32{Eou|ze$`YCUh4-gXtnJLx-eUvT zer-Oy^V{cC$-R+_*B_qV;mvGmObh8&rs;!NZBIUO*); zhAT`WHP;zWIa!-yDaZkQxZcyYCwKmP2{F+0D?gnA;uH_IZOG1tRJ)8AFB8`b-!RIol%x!huZM`RdKB<(@rZVo5}P1kuRvP8JILOCvZ)`~DN&=?>8RJ=Qdj!U37=M0>?0w!s6B^lQ%oX5s z-+~uT1i5IpZq|=Oc&6{EZcs|!*^PLP5^gzm=7$A^h2?mVrYb=ZOW82c3z^9U_p18$ zA6Ke?IMHW0eRs`9dMh!1j7i0sXggTZi-iB){Mv%7s1O7h9+TR{x@{B|SCF+K)3x6^ zTzqkeCeaZV5EO8%SE%4i-wZ}Bl>Xqh{`#t&%-Rt3xv*;Xrs29EKbpojiA}4S?{fUE z_dLV`o{Uk_ZevG#4y)`0W7^mX`OFEoU7_{;Z!(CV*8MjFez@!e2>jSaujtc=T6*Zl z0C0Pq|F!`p=k#3_w`Q%)nOYM$x)i@^vjGJ{XM|Vw-m8k3{Ue9=h{DW_l0*$)ABy3~ z25ssF&k_pZ-Ry$GcWKEo;v7lUQPnZyeixn=7E5UL;oLYyeAfvbO0tlh*X*lS$PcCkl4bHWIPm4b)M) zN+pc;{#^wB#v3uv2boDPj#?@0!a-EvoF9O>EqSNS3K<~SuKb)Nh;B` zNlSU~-mJ0cCh{S-37eQAG3m{kmA-dS52#lhcwrIKYxv)bI5;!4=VU@bQ2j3;Ou`bP zc2x0kE-mPrhjjkJ>=cc?Wac3|O^N%6frwgb@p=~{RcXr1HIjxoTvCaS@R2=|uIR~V z9Z+cOZ5?DU8HErdO)yI56x8Q%Qz07F)LuBx!%br$5~#E!r4Wn{-wJ(=98O$GT6A4< z4daSID5}aHrNn|jA8@WKCSB{IZJx^{&U;K+09`TyIvg3)zMfdK{l+ToF}2yUvNBaa@YYc1^rV4iLej^=RkI6 zf$HD*;%^obP?`8aO}FzIZR%FcCi;TslnZ2!O5)3)qUUk`Sf-kSFTMh{aC*4o-lqE% z+Inb3t)d@~tzNink6oXs=gl|0XC^pI=nt=o3{&8cib!Ce=^l30Z2pGK^v3y2w9{|F zp=01AxL{biZH4oQfkuf!(6z0i5JX*Pwo%ySj35lT;I5Cyd`Oycjtv%7*YQX^yy?uw zj%oNd1Zan|(qY9102E=YXB9#bmVIo?gxY(r@_$QQx-i+r7EybnQ$!|MuVKt=zN&HK z8LvKOQaH@Vezdp3Vb7+OXz&AmNpoym4NI#%ZPu;s5^el6F@IOWF+E0tRAHP!!i{k3 z9%wb0|H}L0`lfVEJR;a9XiJ`2tO?}x=mj* zqhBmUct}pe*>&qPXg&L7iAzHEg|T0D0#>Z8z(V2SYGL)r4jo1>@x&Io@ypWcq#lgu&MS^zsY z(Vm*=)s2WWYt_mXaD+T94{^@eK(9mj_VDrC-2n+ehrRmRT|8ALT+8@YZ0n=&oTwl@ zECt)G$UgyY*Ro77>(|bL&UqH`UoG)E;eCZ zp=zAWYMYF@6L`3|EPg>?+$TOSNW0k6VM=*?I&)?WM9^?U#w#9bEr<-%G~bpH)4cxt z?W%PVx2|^>@F$%hb2~az-X)aK;cgnw6H2|z2lk5|TPgLnzUOMR!*Of-Q+vs!?y3G_ zw+s^jTVf}P!ss}^dFi?mX`Y`}>jJBtqN$Z{tyd@0-j}X<475D3RL|5j9vK6>7Vtk?Hl_Na4RV)@Zml3+Jox;=mNckrl9)1x*IP!KA$UJ4$j!_xulXAH$Dd9Uzkw?ebA;FCiNe5P@gM^ z!Xy|6h*vSRJWE2=c_=(JYm@FTMj_`l^&f3ngC7E8RuyF%J8ai)A70H>eFx2q4~ks8 zEDtrd4Cm_mf-tS9sh*}tAuWs*{jr@Nv~#a;OyO~%=73f4*&!p<2P-JD2j3vh7n?QR z<1)a;b$vQ-RX9e!tJaO{7)2zS#VvT0r-1ydhB1&3avq4QQI^lO4Sc(!2CL90TXnN) zf5{Ew17`QMGt?dvGB^sxV#_1?WRunY{VrgqHg-5#bFbvWkYtXa>jib1l_psbi1Act zrl$1vCDzIqG%gJ=Fqh+?O{h8*?YAnvn=Yjq&fN%23a>KgVn`09QggvOfeJke6ECjz zI>+oy!PwrfvP{D0`TjJh4Zir!?sJp%a)>=tPzlIuI<0GNlR8 zDsPbBQSt)`DoJvc;z-UE6=9$$!t>Tan$oQkO6J^X9lpET$;O=U?d7rIgmli_8aGh8wYp?Z1{^H~My5nm3^D;cFZ3)b z$hXj@s66FwqVIYl;{C9KOqm;Vy77R^&cYjz6U#gdwA?i~6^0x_hH)eyP}WC06#5c0 z8zieS!|X8Rxb~a;!{2@v-4rXY$<(~Hh zV*V-KyeV_1(ncqk6Ifi|mt6P5=90bGtAX3KL7Mx)jh|kr9$LO*wDaMk5&atQ(N)|O zPgbW%KH&aXssJz#Tz}afT~A0wM4}q!MtNaJ>7K1Y^vcQ}MV}~Hy2bhw&cQsrE&1UY zzM;!wZ$f!rE}bhmU7p`2e)TFZbo7o1pPuE*+LvE&$1(T6X=^|}8IDST!>N!ZGyffR zT`dh~mB+RbDzy9?a~^>S$6+7im|3uXt5!44=|w^~f=$O>HHf)i>-J#zj#zmP$I`LU z*sQOU5!Z|1&@YcQH7ok5`Dlal!iTBr@lZr2(hcVAg{^MF69tFMda_g|Zgc9TY8AT& zl5}rQ>25veen7e4;o#E!Q)k(`umz2z@Ux!Y^}iAbqi5E$HA8bw`33F0njVmFOkTzG z{AmT!8}HfCMr+CD5iSqWzB()Ibo7`%4Q3=8vlJ3;a(22X9d~6p4GX`7J=o3Z-h3la z?S$EBmB*?vwaWJJAC`hJI~TV1;cD)-lit%w{t2II%p?aK%*8yD!{Q=$4OKOscKE8TV?nv7&~a=keFn#JGwr%#;8*T!LDvnSgpL+N2f$5vVgsKhqW6Jnu+W8Kt ziChq-hb@xf2esVQ5rIZ3KuDt!_E?cUecD1`m&UPsqWbyM+y!Um;mqb(URjlGK9kd{ z1gJ%q{y*We!|6Yoj0w7j52ifUbxiG2Zih4#Jx@1IYK1h(?uHQ}&D>KFzSlo^e^AeO zzp*KE=*mEI8sp*<*PsSHq`AOjI4_{$vQK6-&d*Vkl z#C4p(7?Uh~q&kX~P9J)_rT@^-mE_Ij+aDR|39TYf93%u?Ku%gt7qjPNn@0MN;FSxu zUScdby#6iiWbRjEJHOg}_sOr&lRu^&`mSUDK1x=(Ah3ul^;p()v&eumzf36lG5=>4 zlPJ9CYTANx!k~m#Vh|OG2NojTI_+csEyqX!la$YNJz;h|SyBIPSi}o$5aX^VYgHo< zPXkOxi3A1IbwSY9zA#*Mq%iY%5=NKsvgeSrC<9kQX(vqtwpu2yE4auyh4m;T%Zh%t zw%OaTU47g8$uj0?>3q}Pn=5Fq4Ru}F2=@wY|Jsh{ad`LhL!Zs&jJatMYo(O1+rA32 zNa3S?ryfb{PE7^BLY5!W4#~_>S5v%q)p}jF%Ga*F>W<7I>`S$Y5fWL=m$*tjqnu~Yj=GDUq zb7F6B2(l@CwUnvg1-5pWf(&cVGhuGYowBNA){; z;rg@9B5@^(`6-JTrnCDK+RwLy?!P_t(`%p|`}rm#?XEeu*MaaSQ4ghT7s4a^JhXoK*K zoys*YkH&m44yaQDU=CEpA&~6Kq+R#0HQ$CMvE?dDb5Rst5AXDuao5@nptK@$NR#ns17^9 z0rShbn_oP>WV@FJ^DAjGgnl{_xesA-X~6|`p`|Zu$JYNerZE#Wy=Jf|u(nMelx1rG z8jmZ^in|e-J2>zjo^yt7DL{jb;!KUpJ`_ODX_S$=j? z0H=I|CnGkG3r4r#oGy_tdj=Gw2PSC>>YQE&ge7vp3Q9aiKY;k^o*II!mOS50C|D2e zz9~GQv8+c(I#jkX)_oC|UwVW{wD>Xb=X>mcKsqZQX|e)&4{`TgGHg+|0^`*=abG|? zLET-0wCM*GPf;VjF6JzeEXM}z0}@Pote=khSbwtzSn>Lo;@5VXie|zn#i?}AT-0+d zpZ!x7$f8hKwZx4~&)PjAmUFpYtD)Sf{~MJ)go7z-2Jnl|804p3ob6 zsWInH_J3D>>f}XpTFKd3=Np#JBZjw($CD(A zlqgD^Kl+}x2h=I0gziofA3$X6Pd;O#GS6D=&!q{Km(}iZY3vR^jK*BgH=Ij*0^OY* zq;o$sf8D8m(MXuu#XjuHx6*ov$WJk*o*?kHk2?e6U_l%SYgX~0QY$D!-wYI#OP^xnPw5ik_vPj%8j zU*1qo#THv;O_dzfS6cnfI1x(hA6U8xKnejMRH43~?gd|b7Q zvr%&eVUd8dj?RV7QM=6iv5UT%Fm_}Z!*p)(HZ`V7g&Y0;N#@=^6u>Pi`!_yzK?DFd zY0hnh;N0|=VYv<@^keCvunY?%Jj!s+*b+G&K>d6nn<}iKo?$vR)U-+z86<+@;;847 z#zD@;7fIp*+Ow}$+zHpl7H)Z6@M+!#4?nXK|6cg1j@ClkxvH+$Ihq&J%)c<}mR2`Z z5H~1^H1sTLDfBS+wfuuDKG@0&g+`j?ZvgJ4BaJsl#swAGNkaxEI(eFrR+!c7X}5W^ z#h{(xNOBk4J*@{cmFRB?Aexe>z!w&DzJ~$>Hs^cWgwwse;FQd|m7}rQ%{%~Y!i^r| z_iVB7EZZoe=T~&H08Q3cZ@Z(f(c{e_ZPF4xtuLK41}aoWm!3v7 zpNKhlDZ$)Oww1tm)_?Lu@IcFs1cdcy%YU*(%yG5J+aYE!Z1j@89(@yFJ1k%W6%O0> zK55KpGPWF|t-eKv;9`1&CW4j-X9}rpI<}-1OYQ-C^Km6zcLQn{vo}|MDj-`t?$ZH} zn!nO~7Y}-#LEbv7f;acKgmQaIJ5-+=`s*bmzKi!4-%2Nhq{1M+iiDRYg0#g^-^(?c z{(AIZ(sZAma7o>m&<9(t?ynL*`CUoLxFP68)$o-R?4|g^*4EYkxA>T^tK_RHc}Z42 zU9Phi(q?ZY4h90$ZjkqZ?c zP~#}2Jx>ab62#Ae`#;T))KZ~Tp>bUk{SGn{#bPKSHZLR}qyDP z(x7VPER~yak8b*Bo8^z;rXTrtr>Y(xVDe!gUxNI$uO?PAt#Hlbz2N5OHbYapV$P*H z>KuQEYt{^i>-&g1eF!?bcu^XbW;WX5?t8W6|DsL>&qlh4`i9&MaMjg4!0W5eLS4JV%3K4vp=oOS@WYpKiY^)nUap_-bw7_ENN2Rez z{EQ~RVyx$+x)H^CMGxLow3uC)LRBPo;rvS)=3I-{ zv*mvOUo>eBS~@kAOhYqf?rP+9_VjGpF;X}(qKx$hIffqD(Ljl)Q#V<7m~whe)p;k& zaQ+SrlaT(^4xNh?CV)>m zb1Gx z?1}60;DI;4sUHt1_#fZLWF$6jMi){}EcVv?T0Z+s66$a0yOz8wI@d z!|1Nz7aINf%oxXw>5DgKdsCWAbtwrwS?ew9Ogq>@9||fHIk$K;x2i&uR(ImHvTFRs_^RbE&nN^VrS*n)7UNCN4p(x0qtLP& z>o-F~rmTDgq~KDSZekG+g0EJhF8E$u6rR)2Pc*#QIFh;V7FX;T@zAdJiqkaCZ>=Qm ze}Ju5ZRnJ%ys)j9tJawnDQRvRa)6!Ow2#6DlqG9e0{Zg?4Y4^h9XCQdijZ#N!rrAbV+o5#mhHl}dLIG<70`cm z#PMwxTwK>DQ_r;WnG5syiH3>|cGAEfbk=O~!#=jb>4QS&G5wWs6PMJ^c?9*pt(v^Q zbIYpN9!(uKY0?S!$upl-YdH-KY6fNkhEQA+UV6bKuQD}S^FsHj!p6-GIX*q?ZY``A zn<{>Cbo`5#W$f+K_H=pJlfE`M zEAJ}pmQ;VnoDdCT{GwdYSW8s3SS+|?%J?ute(85U@WC;jj@dGY9jyt28C5!sMa2zG)rjIP@F4vP9&+ zZR}~|FMMCE`q&Z2PFke18pZVUn7OTaY{om7>0Kabndq(IR@S`35%YKpkQ;!3y!2mu z(0ZpdYs1b?-5lL)lnb%`$34FuXALjiJq8PiQ;#q<&U^5s{hCQsd|!Pj6-kV{zOIEV zw}`mmQ$F*4ifSnlvwb(}KSi;eQxE0ob&gPM=+IyrQ;?dZC2qJ*5`2H!f+I8k)Nmg-&Oi@W%De0a4+j@As`$dqb6j zOu~l4z5WG_W3u;B*;Er_$_ESpavXeu>!)m>SdfoY@(_@LHKc9_#D|n~W@BYe=FAYD!Ur~DrJX;<`q1Ppv9#H_aEKysae@nmb$)4eKfw5g70K$p@X5+(ZK zS>H1@FZ}wM)0_R2dy`K^8)l*ch`Sl&6cD}78ap%G782 z=QU}c(k-J^M+SDbHK{&+%_nFds7p8VaRgMC*Q{?OybFlp8tD}HRco5KwFWO?H59Q2 zSMP8{ex0fNw&nK64i)wvL3HOcZ%luca7xD`YknZzOk(+k+V9x3%dWTK{c&~o{Dvb3 zX97o%8I|ZS{V$OFo;(47Ro;%TVaQ#(6VERCO&HImK9pmA{3ozHZ5TIUm99A^SaMzM z!ERRq(goB2Q0_6)JL#EOZ}UgWBt|t918oOOGLeB#yAp8UBwzzwp{FIR=(%P{S-vC! zAv6B=V@Ew!o0nk)&sg2qnUIt6O*1w$J$~t`B2%41-c=pi7Ws4AvMgo*G zcT7DKEg%4HgRHnL#j)r`ez1x)&xV|hRST2pf-_v!uFjEx5k(oPbI zC(mjXx(^!;rF7gSX0dKN{}a{ZZCsl0kKB)_YcvW9K4)BoVUf_xCJ~Xw<>;b}zj>N4> z0S61Wb;T6+EQHy519zAoe}T5FA6B2QXvK&3ZyIq+TFZ{e6xb2z6nF`aNDr-ZQqF7jx%PQ!%C2nQlC$& zTCdoz9+Qni-tfA}o~sHr3qD$T>u)mO9p?Df^?lXqEx%&T08Bl(piUh70^LYVg=kP7WYvG}41Jbs zHFKx+aYpENxruqLm-9s1%7FQIRkWC@!x@+AyffWR(59z!vcVJA!D4Z(;#lNYV+wKf zyMr_b;(J{6-=T}zTTVjEm0Ebep;Vr^bCKxdW@Ce4?0?;G?}UD&cA!`RsMY0H2?@!q zdX_d?#CeDmbEcDkJ*Kp{iTyZt$A}Lma*dg>)`aNKHed=r1em7>lJ?5GftkxIp2bBC= zyD?dvo2b4OzumK5I?4jz>6Y@cxHG8MjZU|6NEJGj@Y>q{smVs-L_hC&HxogBGS z6>EL5SJ*}ovw)d(PEXSLuR`sRaVVnM(VMsHpD%tJo3tC0^PAb%dE~giCdj<}aaJej z))vo2Z`X2YK44?`e5g(K#`6{0hnM_1oX-Gd^1vibSkAxo$a-*ZP6g^wwr1*bH7oCX zwkt@9rFC%gL;B@W(wOj$=eI`9Ix>eD{@VV}?R=Y?WdBIJ;RlXgCC!vQGhx+RUoSls zfAhhZLR}QD>dS+)^QnaG{hbKHQC&Xym7P)rQWQ)ujek8j4CP-tT7y8C9&)pHU-Jb8 zT0Y2<29Y**_K;1v5>5MA9a70eIlL*HJ$A{s4JfKcZ+War#%Nvlcz9j~KFFQa!^VX# zcw7BNpN4iXCRW1D_k)@%A3xj{pE+yFlW&4uGMUKp;@`N(}ktwq-4hAh32DT zW5%JrJF4Hz+2?jrp5Lm5<+fZ>iH7 zrM98@(+nFoB97iwkf~x0c4#Ze%~h$Mv{4D{v$R;wi7F24gU|pmMK?u^nBjl;O|0&5sWg=#IWw=_G@B525ab2i& z0<=qx(mUlnC>p|M%OKe8hTR8+y!@8nW{d^nd2$sUGb^`opYaD|rn3Xzj#FYb*9MSG zL>PLnrK$MeGZS<-ej@wpS6fsoKNHSel&hWK&TUsxj!0s1z<(Bu28Tf+Mth2BfbuV4R zos%@B>SHY`LySFJ7foN(j#0?V#qMalT;y7L?IWpRRX6& zNZmo@!x~uZ>v_?_w^{}M`k{y;D$a6W8dy#dY9)-Dc589?Pi+Cp=o+}cH_7$sMBIM1 z0oJJOt!$kw&jkMpu%82eY0?N4T^H|vs$%sGKD$ExKy0J$=t&fWZE~o7=bpO_Q+uYb zgC>M06tf$qT$#YRPHmM6)W86~yqP$QuZg!Y*!2%RY&^Sq%~I@8R%Q1{-fVN0aMOBn zeAib@YcXLk*k`tpWCsAQIwlm}|3X&jk|4o3$mhtcG#BzkeD~=szT%x}kBwDet#;#N zn`AJTanQQQ;yJpH_oixdOyZ1oBdl#T9eKMX z^^h0Kmr!^#+59zzOzv1Vox0fdc^jo97FaoaJ9`Bv?!-2qrPyo`n7w{08P;eX49Fv= z&efl^J-jCt+-s!xNFkHp4?iqqIShJrN?XdLtzPnIqPFP$|GJ>dpL7Myc0YK~l~@iw zPP&{3-!BhD@`mP14GTYnu%QoCbYQQtYs&joD37*B#NWt(MSH}g!VPP85sN2!y1MmO z*d9!OK=6w87O~;7O%3;}_~N1-h#oAk9fn$*45`=VwBh^-ZA^sQF$MZ@!nJ+prH6?R zlzzTypl`@HH2is`K*N$PXiD(%-oxN)=8}gYM-eH86|GbpFy)QwLXT9DvQmSCZJLx% zF>R_FU7y~pner}g#HeMhZ9xgu_bTf0-hxY`K}_H}Xdah_wWUCbT3OHH7!{KQOlU9F-O3QbZ536Y_vN8lgRT<2izyHmi z@z(nwjwN$Q`UGD$lB8USFV`RIKHRYy3?unZ&=&#f5ynH^#8`+JNr*kyK5WN#KNB+t zq^0nQL*7)`^8MRqPu%fPMUu7LaXt`UlZ5?F1?R>0lj#GQF}|jR5YQ$MYH@Bp)-^kg zX+o0*96cb^o5-la^b8Z2IE%dfuT% zV_Ando?;>#rC=#MA${DgTEZ4WLiR@yCfpX;e&qnwUP0u;zViWz`4U++-0mTiecQ6G z4BJZ5a(Yln>ShY+bgM|^kym1(C1aN0!iEa_HI4`4u5uoGhU}#j(-6Rb6Voim`}HTd zIxNU3@D4>?0UQ%lGSz=1Y^GeqKji>QmJS;%PMkwXhOxu8o5(fuj6?oSjg8+Wi~qE2 zbqK=UgtjDhI(J)K*K)V8FWVq-x*Ls%KPMAz6s6O1;ji@=#Kcu@i!l z;cMYja#2ELzb-~WuojaxqugFw?V(@EVuCB2y6-k8Ew@|PJlCpAt>5g}|9PBQKiQ;C z&1$v{lWRM!Eo~Tl&=yP)xLd=8p0xG0Owt_jaQm%f0|T*6m;~2!8)^&`)HZqQ*F5}% zy4${CpS{&9v!IFM_#utL&PXOSdA%7c;G%$gfzv(hp_t8UFi4zoGW7klR|Bdv@iuT+ zJ{!<)eA*YKD~1>JnM@i*TA~hJG0SzR?H-c|N>H=Ak$sbKAjY#*D{=X@DX+MA7hSkjeBj=E*z7s0#84Z>^MzfT+WQMKU*25(>WLoPjRSKu ziwK@wIkkVb>n)0l3-1lwc&>6jo7O97k2MuJ&MYAACQlz^xLR<4uX8yTL@QJ)Xn#nQ z!MgT~b_rua%8fD%qAe41OG|GIN>}hlr+cjI!z+88(>qtsY^o>4E&e45Z5eErrRir2 zl2+SKC)U`X_v~AgbUm-VSo*MKO_wtOd&a8aG<|+@s$-Qx2rRB zWK+xBo%7C?A*xo%1(#nRyluI}e&gaLH*T_I1yXynJ^zg;v9L5r+Cn*-q3J#w?6`WT zz&bEa+WyizJKcL_gKznUZK;;Hs{B~ZDHX_KW(FeW4t>uQv)3VQzMm&wzG7^e!O^fL z-1-Z(z=Vl6cx z<1+%)NAILOR;&q%n2PBFFkY0cRA5J>JLY2ihgi^^tni}S+L(&YUs3clJJpcg(jV~D zA9W#>p3p&m56Vt^(eAc4$D`odtr|<$Cn9Vse-mYr{F(RR58ykt{?H*)YefXJ*Q1Z# znrz1Qz33CZZAfQ0Zp%T;d+!DRl@*0S_Yd7#@|w>FK+ut2lFa!EN9_QOq_Zxt zL#fQWJ38*rov3-H>k#E~5Ko;a@MrTEDY2h8`E@nRHB)kjC6kVxbbu&y09ou8XbY59 zEnU&0%dc7iVRdQ=bp)BAj><-^G6V{`AXuZ;Z$wMYH5bP<&n!JQKAT76Y|R zw{{sYbpp?-))NBQs&_Ip@fu#9(P}q%&U2LW0cLz>)h4m3chBt`N0F2LQQ-Gu z7w8avshNqQ`$DQ3jn$TiEu$u+&E%_Cah8v)lSJ38H) zXVRL0E$Vx3iY_KH^ag|PP2|H@Z1`^@61G_afY(Yh?^!P$#E8??10^!o68U=apVXlu z(p#_HVhcQd9U)7M6Zd?0pl5C_p>uNNk-f(L7-z&c?Td))N$KCCY0#fRw3}V^8n-MlV`{vO!nr`71DFRZLX5nF{>^c zs?F5{OyN6qecdpJ`-E@3!0Mf~OJ&^Bzm>E1oHChTR5`J%u$zIJVmCa|uynRki?qi6 z^wRD8bTyt1cRiinw|u)Vd)L#O`hR89O4G99Yp*X*WwKP$%b*kiGx0AJ0;6U^wfWWC zxt~AOcsBzB-L&oQycnp{*RpbNWX8fCig=g$E7Rg_(Mx)g4wZ05*m2#0$nn@F<;t3B zzv>AmPlxz%#_l5(;)<%g_CsOFc`L!Q=r)++&{{_&+%u7kRK?eEvByWaTX*#<#|J!b z+Ix%%Tl>CS)&IgSB`MzkXm=Gq@FIUPFyGobQ}^tLEG8l05+Yab~G*8kVgh>IC1yy zd>x2!blF&@&tX@m7CNRj`rrJj4n0Rqjs`1b(j2`P01Snb<%?R9M$P=$D`(GzUwVrp2F0{l z9(5pJ{ikT;@)PtXHDSyZUTg#)%EGv)&?7&=d80 zm2mWdmK8tzl585EWBZ0S4}Pz z%N3;yQ5Nl5o^+C`3blo^3qEhlJMQIvW|4;sA#GI_(~G?WB9Xma2|;r?mYjVJjm`?x z)Y7S~(WInFfvCg^GS%ok90^ZdOOii@OMgg^#HW zOatxkyN*w~*@xaPb+ZoPOQk&#xUryu)c}^I-)tKdeE-OB<$Ml&@QkDgWFhpkS=Z#L zS0TPZj80DhoRF{yBZ;;O)c(QqYc@%rRrx&}GwR5CdnK&gegys;Nur*z`&rd9Wq#Le zk3S8fMoJC__}zOM9bT$F1y++O%V{hnJQ1cwrLd;rt)o2ETWzu~d5V!H{H+f?zqw$h zp?^BA_PF|17pbVL@wUFEdbMQ zZhGZ^ZQF1%XQ}Mu?r1|Lv*ew@_%IrVS6AzuJWH-s;wWiPoA**prril5ZYC#j>vx}i zTK4L&8{9|L=93#;m*sptm~VhRr$Vfc-YQhiKd}Rzhg>*S2*dklIIZSPFGJDH_A!#? znRztTZL$QJF$bm|Vl%aAyoInMSicV=eN%PHG0Y5s5rYnHKju$QShZjIt#84wBc;q- z?QrEoWr3`-ftq5>@;*Z71+O~qHeBFbLS`wVUznWRTy^&Ua~a(vUz)7w->ZWSenw)-$5LavIuF2v zC_l6kIrIjTx}k8gCuDe6Oj@1H_8^Px!H?5U;q@MDW6l}%p9g}FL_P-zweS2(V??G| z;8!E^p#@nT$)Cg#=g5*TC+Pfn)tW6_JV3{K={c}|{qU?R--c`UtJLP>kiQ6#w8(%u zX9JUU!$q|FV(3z+&7%e3!&Vs82;O_e!MFwcDa+0DaScEyGC<%>fmyntFxZ$^Hv8+w zx5sKqf>CmztnQ5g+sglDkBV!kURlKT7Vg@+^YWDJ>?G-LqP!rc$~_v7I=RhH}r7q#Oz`DkylGMQ!1v=PXf1d`V;tGW03 zlG!=kK(CoytRtV(WK!LtYjO!Q=Q9q{o`%U~bD}hkhgFT_$=42=Qzc$}AXa(biVDmN zlW>q+Jida0T7kmwA8#jriLw!qtmz^nU5P=+c8_*1p5qf+zW)0Wjj^jj9j-SM>|HdP zLA2GG%Vlrd5L~krl zSYF#cjXfN2rTg>V-Cnj9Azvhm%0RJ^{byExr;}eNzkKkZ;sxtG+H~Ib`hR;!f8wGD zwmVu}j{CRyy6-W#1% zyA0$W`nvw((ipWamXHq}6ce2Ku*gnZqmm7~#0hV|&!r$$!L!)-37A~3U(gWM+9 zL_?m#)jk0L7@e<`d`xP}EOmd$nr(9|_SP4&Dc!kXDx@W=1nzT>chFp@?dxl=MuoyR z2!7kIuA4rc5x8C7%#g{3q6{qq2jA$dYci?B)5-PEbp`Zm!HJ|N(kJ~d_bgC0i$l{j zESHDciwO4ol@u*d3})7L{6FlY8bzB&rdy| zG95gR%j8e6HdO~K@=Ulqwki};wOD=ys{PJ1vvdurO?DyoCB(G$pNMHLzbusWduSz- z7Xh=!7i>;q`kB!e?zBfcszE<&%wiREHov+To$a~}9%`KcOm2QRnRO%^+PyR@oy|rB z|BcIQMb>|h;dOq$xal?KMYdk0>V5sKO! zfSl)H6&niu6j=PWXMyGix@WLGqHe8*3rW4j2-Q+P> zhpHZ~9ITn&nMqun=6SVr%u^J&$5||~Qo5PH;b{NwWQ0Rb#ccH41ogp;68;SW4>k;@ z?~%SC?Q9#`B@~%InJU4hZXf2qSt@*LLYb6G60^anK^po2SdDo|bj#jGR67OQYgEK| z#Bd{0fkOgTIIIZzF{!6+G=#AkBcaP}Wc96xa+flaCKCjowKx1QMSDZskBi2M9UDX5Rt@&3S2Npq6OApO z!f54}4W3h`QM`mK8@66yKDthBf*h*!zh|Kihu=<|v_nGC(X60f*T{EXiH+}gN6v`! zUFzB$*C#pM-ON3TR19@R#z0eO8&56^AZXl3`8;|^Cwp$h z$R|ka7oWfDToAhUU8Oz}p^JU_g?@l2hK@W^u#*wqx+Ey5LK-hM7m^N6d*)r^LBW#W z1JkjIB8_+Mx<$!DZXewg2hL1ppKT;`1FvAQx0=^^3|=<+6pO4QAQfRinh*g?xZXUlGip%Ynkmq z;V$y2LM+9^l4I3w6@GX5rF+(aO(DMCUfV~We+EA1eHclwV3>vA=IWzPSLm{5d}jaJ z!P52Ntu0AWEO=&7asA#`1{tOT*(#r)ECPxvysWPcTuNZh4yc|WmnUO(=;Z$BqdRiV zGuPk;R|*4pTmm}6OK+Pb)V+WMx6kToPYF{PRA-fAZ&XsnWtV1(ac0P(m}8E$Vrq6rL4+GUo_QI(gj$zmg6h`QaZBvTTN~oz zLOe_dAB;e$O>TT|noMDn`lCN-_{r7>*-oi`@O~6g{sD9Ft%8BFgH`ksZjhk9B zYLU)*_5;EZ&$`#CxaR%-bH&?3t2?pUP7rdv>9zGllP`!ksib!i+4sRpk+W|>)KA3O zUw6&G3&y226Gyl>pcq`gVVcX|s&d#HTDggyJ|+cyfzbW)$fE9ItdZ^BQ2%Q;Toz_Z zEjOno&*8JU77E`6{dJqltl=bTcmXr%+|Wu@$&@%S=^F&kckbBMKnyoIL=7 z6ihSY!fFG5!Vfvm&u1x zsOFb1GsAsEV0evxLMe&}VtJ$(`@pk(!>uOzX0vr$?fc~m_3X#MIP zR~OGcfTYv;3Bz?8F}$vGpUWor)gdo28C3D+!H!yP47|M?AUcRv&6;UttksihzUylp9jU`+ci*tn1n>FMe)Q@QYOyW_;r56xVq2T@I@{Fu{?L!s*)W#r!^5=+ z>4dWc_MCoo38sY^{fu92j%6zC9tYpwgC8AiO>x0}_T@zaDGxDC zz=?dG52HYTZzX+!?@zamFTVS+cZABQgWKEqwpna8c+KCiaPAQNUJ=mrn%M;3>{lv2 zN^f>LF)X9C&38AVAU);4=ajvP99!#;TkL&(-m&p5drk;g|f+aC+9QatyOJTHl=y(K<@MRhc@d8(AwK( z=f?11t0Fqn&v_)yShd$pP6)D^Il8zu9&a=_CZYc)Q%<}ZL_kN)XE=d`12OVsLkTOfNkl; zwK6w4OK8DCMQries6*}zIr3?{ViQSdbYisYFB1XTQ*V=k|L|o&-84Tyy^BG;YQhJ$(R^O zaP>Pru_9(u+Br4MrEN8-4fun*qe)65&DF)p%djVE&2>`wBa31@pJZhSFtw%7b|_gpEr z8cpEexU_a33lfs0lZH+|)BJZ&qRi$bn%2qs<}2mK*?Qa>g2Sq?RvjM3XBu3;k&4}G*wka&Ok>p#nI`_lZ^xfp$)t$aMYK54B4!3Rr z3XDwr7Lb>GdlIzX)QJ7(ru_8dCZ7!AJwq`k5Nh5-=Vx{i?K&?+KX zL>dEwQ_U79YU3gv$3)XF2-7qRW%=17_>dH36`zjwc*cnyg|l6;@O#~_0`6bz;ciW7 znqAl72ltYGng>$6AMno9ch7n*5lc7MbIlk?YDZ2`CjRV{s2lFjaDhA|BT?IFGevA) zr0d2E*S&6v%w^5eVj%5Cp$E7PF;(=E_m0KY^l;ksY=I|%B(0a z^$FPFa^Z3~+^zdjsi|!WcOY~}yZhS#vn0{H<#!l@iU+0xM{pr9I}&GCcTs3nkL);EnI?T20P`!r<**N>#^Z;TkiR~gseDnNV z4(tt2ue7ZR(OTLzNmCTn&8k^f_LY^*)!I&>T|`CEN18S)R^P+* zm|O|&tO~paTRy*z`B%2mpLKRGTliQRDIx0nmJ17yGiAWE#s?kC=2WP=}_yZ0?|`+=IQ1r3gC3M z+~K9W$=@UM;m?7#up`5$rW-}E8)8XtOnd0}(7A|RL}lLz-UXzpmPFK*^X)CUl0vWt zwOs7t)#nB0OmxI;g9G2%_&#BtB3h&PD<+tBtklp)7xi~6oA4HyM@-9)dGpd)ccyF4 z{^E7!+REI94f8b6i;$c_zH7zai9p6+5XvMP%m*I;g7Y!{k;UN>m)&t6v-LfqJ0}2r z95%Px#Gxwq%_Y{Z;DyiEIp=ieRJpk~^U6;OO^|_qrXelduyV1;mm`tDkY*mTak{F@*2cPWC-W=kD8ipwx zNciZip7Uhi!Ts?qbjtLq3Y>BjyEJ?5T?BQ0_HHQpmCBpL`HZTdU(9eqHN(gG2-2pp z&cUeu?TYXwG!+v*=$*oC`p!mc{q`lPWjI|jGfr)$-9qy3lRU3%&2F;+#uU~*ZnR69 zTzHZk;%4)b-hCsn%)5q84=S{S%U>=UMh=cu>l0JibfG_ocxB(TScl}RlR_ep)8{b67^KZBZ z)lG6KiXtI&P^a*jAWQ=;_t>d(TC`9+)XijF;<(=@-&UX`KQ5qA{2rhhjP-vWA@8*0 zEMH4nkpl{A-0?^yz~l=(2F6^0rjj`kLESrLe84*LoYD&ku}V6Of(VX$eTi$RZtjGP z<$bLIpS4_qIm1DU+yuI2#wuV|)doI?-#=t3R*pODFDViF+KPn-rz0B-KwBL4B?h3^Z{E<34z`~#o}|Oid#e+8^bgG+L-0DD=s^>^s9vjgFa?@dBEvJRBfgzdC$d6XeZ^=>^n!946&_8 zdH%7hOUW>+17#CXXtOcy$g2>!XnnM<2dL>qTEc(UIg)>Kb9FvP)*V>?H;{ojpJIl_%-n-39KTK)5nO-qke(HCz zShq|1xE~kcJ-TNhvO;IOruG&iV=7_eG5fsohQX;1YYnt*hcef7(4V)i&CvPe%HDfJ zuFD8uoO;ZhQ#nGr7%~1qp8?aZ-S@BIAOq>=LcXl_g4*t$dPgX(APS-d)>Mw$gk2(q zP9PM?6<)%u*p@%8T<>o@K96pIV;VkOI64kW(G(YDQos&HjSi!uIXpGO%z*Ju;BFU zm3OF9haMw$$umzz#B%x7rXKLqImNWD0}~}E&o*sqouJnu#{+sKbQ0y`HxKY z%$vv`@n15^>H3nX#^?2U|C~lWm~YUUVXO$5p0jaf#t8~(p}KAU%~PoA!wmYTrW4p9 z3l;J6m2BY;uNT8YF4SQ_B1!1Tnel`9=7zJ)7Bs)6YnB zR!q2jRMM|@jmMllgRFi8+3{VH2S^&lUzMr7=@HdWjurQ#uvhg}a(;+vgqm^ob8jFM zAwQlpyi8l5u5<0cV`%TPVol6Al?brrX_ZqiTI%n$fd2Bk%jI~F*6@fV(xO9tH`9tO zc4Z!2-HOp-4>1YleJ86mTN3`*+>ZM%Y5x9jE?AYGV@YT!x}}O-I3ImqC<;uOfO(9{O>-<|Nph-1NhfmnjO*QU4#X);177u(SS5jt!2bB_{g+lNq$-3VPFzwZ{_O2VJDcie0Cpg|{ z)SWvBg_*E2%)$8`N<(C9!$C5u&t>XCp^ft>fDyc&pY$W#x#;8c4nJuE&ak47Zp>$m z{cAE$?Tq+nJhA=a7|OKJ`fXQhWqm`wnDh5n?R7Z^^4OnjJ{{k%6b z3MM^t_Go+q&!5BPo16dVuM}{YcEVX71vlKuPEx$G!D{<}i7#%Hv*VTAtg;^@+}(Fz z&)2i;H76nGIMw<-v!SWw&(gJxLe%AO@;Tl$qh0B&z1XzvqTGaU|H#PyRCLCENtzbj z8D!ynXvYu1aekLu?lGb%g2&d`)ZUCJq)i*WT_R4cK!PQ7G+MOtqh^xZF;vBUHLK@a zR!_2+I(P6*+5#lzRcy8CCP{GGY4n=xL{SCBZrgN%@Y>SmsNl)vUM>xNlbZ-cie8G~ zcb@f5(_Wo)ql@K);*~gK%+cqS2r#Zt^A86Kc*4%__uLibeo(N=-aF5`eETM~y;tI; zL!oQ-c?in9Qx(#du2|^tRA_OtUgf5VCuo$YMQezD$`MTUD3))|pxdr2loJVU0-H?S#NL_|5fB-3MAV ztQ6PGNmL<1O$VO>$gSn9+E?^WNy-e)()_(iqavsA#FZ7*<7B^b|KWcv-OzP|T|{E- z4SOwP1ft@xn&-E`+Tuxo;WG{D6L;$n=W7D@52{qF+OaPyfFA?DkZtgH48L04Ax_(U zN!{m~9G2rgZJ{#Sl%3z8{?aR`VI<|YBTK*XsjXA!;6K@+r>;Zw@>q2+1ZG@^EUlSvb#+cpUA$y4RQ_x zf0e&?mp<8&Zmoe%6S#u2YTxHRc0GJi-{|ocPKEn=%V;^@X;k$YakCwI6^5@=p?=ZF ztg!J{-9o{T1JETY6Go@J$?BV_%)5y=`gzq0suxo{_@L*Zq+;)CX6Dg0>{Q_HzU?&N zMGT#);@N*QJ~w1GK!xe^K#wsW6Pa+*9n9W4{izjB%@!B_DV$3?QVTL=uLAC1Iut)} z29b6+CES#lX+d&RLjv;*n>}bl%HVTvsz?YQemqSDe|*{1OD_Ec`d=1F{M+4-ce#$d zS;=`!=35u$l7b6A&a@&Cny)Gxn;x#BBgVuM06$3QHjz`(j6^q)@-_PuH>RV&Gs1h{ z@6)PqXi-$L#}0t&70WXh&U~qrt$xh+#J{z}Sle@Gv%!Yjwjkn2U}?Lej>a2SB9qja zHvIOpjZuM~+F2cqIpya79e}g^{=VX*>7gwTtE~gVaep5!9QF85V2!AmEeAsMR~6HJ zB0E!5Oou4nKi?R1|2X9wzO&8B>xwu?yH5bv#TUs3{{L`&f1Q&7@ zJ6Y{0gbJJI32c{=d{s$qZmv!O7b_2HP2M!M8RjOLH)C)93xt>rO3tsxcroq!P3+>g zmX98D?EL zevy1{#;E*8xC%0h(n4PCb3@46A|!Vp!PXlQjZn=hsUj%^lE4`(mL`+RQLDGbeuqhq z+p2B0M!!nzyHc|FsYO0Awa(g5go8$#KrWrl{4>{(p|f-*aH8nty(xI_3HgVb_G8l9Mm84jZ}bnZ%PDeBKU-t~)oX^*QAG#R%8!3myNni4 zXD%1YW_4wQ7xL1^{aTRauQtO?Mhwb!3&ORkVgnkierfNUX9mx)d6KrhYw7uq3b&eS zjVFrZBc4xn`@%+1ECvo5Po;Eo7T;Ux=R^uVn7plYceWw6x{^{@7&I|rwm0XxR&wBT z$&qu*TW>zZ-PZr9W>$GRI7a7QW3IrQ>2!c;A@=zEF29otF6h%!iIAU9nYL0DF#Sk_ z_&2w(>4DD$6>ZZuQusuJr?c9XbC8!L&eKWxMuv&fC>2Ast6ScJCY=B?AHr$4vZ)6_ z?z@%}<|xc~2z0D!f5GnTk3Ch%XFU!F*7l|ARip`3>291@%oF!B zVN7%=fNW7rUyjUqZ*zkC6Qt;a4N-G8lBbPkGYVl}n{EgWCrz?&- zQ+v1L$>kSqr!!J}*YB5({3f645Cnx<$`V7Zf-s4x!4qZPuAQ9~;xC|xbz#e4YcR=y7?DfYHrPp=ccgdj*TCQ3zw(Y~rtmg&&5F>1CK~05; zVFa)Vcw@BRt8o~escI=k_i!PS>4z(J=eP8Q-w|i9G6%aewFa-{70= zeY{@(6WRAUEcFeulCV#(rda1EPwz8L-)63&Lnm)@en1_$rj4(Q9WpuBdjT7Hj_gQY zAJ4J*fRSu9rYY;g%DVV-VKu?c7EFLsR_HgaJ0q7a(0)=>?wO;{5F=`tz*w9q8je!q zjt=x75Ak=;Z%U$HpppfjbyYB@`J5qf{9fI}#>UnkVETl29J;^zwq*`X6!*QxM3kK@ zgf-kOJQpR{WO60=m0Cig`Qjp=c4Eupnn3m&LQh_)ORA({g*#ue*;SZ~rH=C>gk6BB z>(r(R^Clw@m2HY#{b z?&havS6oGBf)9pwU$#FER(Zd2vh@L%ozn4{7A9uu-@p|SK(*Ke6XGTq%(f1bvXcU| zgX~P+a(lzA8*O=J#WBCN``^F1z1^BHK%zvkKO^|cTUJ*dr0qbrkJK=RRiSr{Yy7)~ z$^8xli4gj}#}YG$8L@gCJB@F!q!M89D8!{_;E(%}z^QzEO=h)ReNT-hllJju)h-}V zPoE#2T&qJk56y)T}UHpQabUtvh!AAQj@$o~i1eO- zBz34mM!thupj+;nwC{nYOCo2~LJco#1@q~Q#udpR$V4t!yMZ?2$$#M4_7uj^o~g=x06j<6P~Dsv8j~Q zZgt7?ORMLz>pBT1J`n?M-x1R!oYNYo$4YhvJ!& zX|&Kz&`3gHD|c=pD6GxG)K((9b+4&GbfULK#>Sb(pf=a^fpLy(j3cVJ$vOdRq4)8uiLVigN`Hj#xSxSXq)|lKswmXTk-b-26$W9y%3@cqZeo%c zZ~yyN?=aM_MjySENrdS#F_S%zeu>2|*IkPwHuJR~VOW}@@@xv=!mGkYB240r4K;U$ zN}6m@*U8XH54{nhxS_au_X8X5!3vVwL8>pj7dc@24|-*@=Z2$U$VNOHdp_jU5|-00 zLnR-w!4rVJNE!&;=u1v!0&lf1>J1`qIL=~n2FTqtMPlVqqsOE0{z2`AA<7y?y*BM$O0L z1~3+)fn0XzmBb z4@DgP-G1Nx{hm@Wsl$9k*PYN_eUGi&9#DDt2lWcWq|ndZq-3Xm*U(1baRP*-G{N`~ z>m)H4HHW9f0zFi;v1gV97{O9MclQS?Tf4QpLe*rHvM)C!D96J)yBiADu>VKbdq*|7 zt!unADN+>`5CSMFsAvQgsR@XPic$qZq)3$#P$2XWnxayI(xn6`0@8aAAiZ}&2c;*3 z&_V(saKCl-+2`K1?%ocDW8}Y?`OVC4&i8$u-!nglq%h`8;D0Gte0pxM37SUk7#kj^ z3tQ9Fg^Kmh%i<(*2|nFV_5M*x+TX<2QIa1&qWGbtyy>JxRQVRJ-w#Y8-5I+%Y76>= zh`d;@D6-Bwe@S;PLgwJ+c9476-O(%|WswXlQzW0sb(aIxZHSJoCTOo&M*7~4o4;ay zmbLr?f#`{1RWO-AC+`>ehQ&^yWB5DN%vPZBob{Z#@GKuy<26tQmv?bSC0TCmoY1!M ziEiImo@$L?b6VJaSBPf{t)bSNtl~?@tm7tnxRLQ}+X;Y2(O}uC&H6O@6Q`gfEv}zm|^iUYxl@jOVX6+}N6o72$r%dvhAH#YNZ^ z$M?S?__VmA-Wz@DA2``$w9zmOf~~Hm!zd=il0l+x`-fSdv~p*7E+sEEc~b~WrBppb zuBS^GzKYgspn*;zxge)!;l0-j40+1Jd=_~(y(XErtwgmR0_|v{6|2L*MrzdtK>lh% zA%6X2;oL91x%F|tdizLwZ(9)v%o_o=<5M@v)j!+hp|GbYDyPU5HcZ zF-a7H=|>oG|n2HoBpDckWwK- zPCmWq+7Qazl-em=?LR>Ld2~t1PuP3H4V`%L8}!&~rEHerE%IAsmDa^-|fl zdL>(H1qfv6+=h5J6SQ`KJ$KlLC5%oyeous=EO^`^?nnU?fVzco%;6UeG22;Cqa~b! zbW=okmr~O{2hk(3PwR*;?>j}{c8@JJZF6?2?M{O*L@YM>4~jgV?+l|+XXJTzA07t9 zE-BuoNY1pfK%BKqT^<7!OIF!`98bqjZ56vc$`d>1eAE3VBOJG-pw+ScXO9kuGjLWP z8dr|};;Wd(A}=I16?#Zl7$ohYd^|uZijc{8&b@S|!c}NJv?ytB=~Mc)rg@7$&j=#1 z|FM0$icWtw{nR+u_y(*V1i#wv0RG81d6B*_@kNL*jI}EVI&WQ;#X%b3#`h#_=6l1# z(L)?z?834~@Kl25(BQoPGmu|ZZyf$)dZ1lz@8aA4=R7c?Y$K}-6}mg_1G`BZREMZ_@4R0 zskx(AqsK+E3<=E6Uft8mXpG62(f_#k203@m``&9fTzXpMc|Nhy5I^a_u4T>0dPcbF zm{vMD_WYFNWb;AsEr&e5mN?Q8QQfwR%1Ll5Ke0wl7R=$|fXs z)%I=C&V=QO?68}+JM3c;2vV$$S6>X=ZRCIr7+oqqnhpHbrO6+Dy(o^VTOx9%slVDf zb>(H#%1fq;7FpMy$kMw>W%;MYVOSso2bxsfm5jkad<1c5V2na=mhOzu;P!Agdj8km zQ6MoTz8ST9+f4pOE=*yvfeI6sE&W*JK?c2BObfD~qHq-V^xuk6n7PWFckcAwEa0t7 z&_Bl=nD&nwr~3oXk7=l0Re?FBZH22XL-ZX34^0*awxqnvvbb@ggWQ{#?OnqkLeea2>u{g6{m!AWHvtTzMj9a}k)`kxpt@mc!l0HVKKN2#Sa9V|N?R1^-M zJUyqWu)H26kEzerJoK#ZA30a_R4^hW1LiMHWRb(=+_Y*$U4`)~Tp0#11~RwxC_8Oa z?7qLvCS0`=m1u5>-hhjH*-oo`0&q9{b%{G6{@dEYJ)ej1Ood}bjz@!d)W?*)4^PIs zy$yY~f(P?nJ@jFNrcd+Iay<_=o+RD+%sX82$KuWL+_4cm)Y^V=j@bxRZ*9HT{iV?Jc5|e^y!m69-0#WYFQAbQHAXl)=E-;YkkU7 zaGv}ApQ~Tgf@wduLZDVLvrUje&YmZO@R0_JTB7Vc9ZopD>XH2d`Rngt6@#T=6 zwNcvsHt3`2i!SkNL8twE0*M;S7E26}wutJuQzLfW#2OtG0!Q%d<$$@^xEtAJKx^BCr<7;}syJTGsNjh+*#oLw}#4cO_SA+4;YiQ`&GMDD4%w z55ng`Qb1G%ucm~O(JfRbAEw9`brK8Xjgr}>v|9)Iz8shmc4Lohns%J{s_%Wt=LMhi zE%Q?7;cJ7n@PoV9@%6{z@Z(Oe!nEgwv5lm z*&s5&Da-$6PyzMQvbEf(L}R30=?2) zvq8`##B(UFs%&wGcWLJ22j3lGB{oiw8=z5=DG45!VH=>+;NW{OEVF|lTMzjbrCpl| zY;2yLkv�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±^f8& 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䎠A>sSJ}cY~8w*z7Gp0ufp#1nF!A2CLxZ9)Tva& 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

xf%U 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 &=LJPW>M$yqYPR>zg1NpJdJS`^>xP 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�K2r>~5U$ykF1Mz{wBx9>3A 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%0AJiL=sPoV>}(X>A=EDR;4LIfALutN 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

f=*bwd4+`PLFKS_QL$YHr<XN?8{pPxj z5061kki&lrd{wL5(pYaTY6_bV0%Pw3}pjxK(iAc&rguYHpyc#wLZW&cZ4SI0UDlL|0FM(uLV zi<{5v*ir~Sy9!dJ6tLKgsSkeg(qLW)gSY~N&2QC^dTi|WDxB9uXT8uz?8c4rwEm9( zhskqjAn{JJ*5P_>*x;0jYM?N(l9I?dUDX`+^dXJ9 zT6Cdwzv}J&Y1@&z$fe(u6Y}b$d8}5q{T-?de^`404(h~X0kl|-+XI+_Y3E5ZEGv7tLJOXR6-nB|nvHSkYvxiyNTL0Sp0>5s7dv0|Py>eX zhWG41_>IH2zu6K2_}`(-ElLw+B6F#5W|F8fzn#hnDG~aEM!3h$-8|3UE0TXu>c53w zj(lFc5wdI6>mvtl${dv;#>eYiJ49{WM!T%V4arR??&*Y^;pQVE(VGe424}__7F3j2 zsCZ_m*a@MoOv*dzZ{}CmLBuMS_7&uuI%wLT18m6q(4Re?PEB+X8`sIK9+xMIFVW`leE2)0?bGq}Pi^D)dWw9|a>*(Ndte;rS60vjNc;59S z58i$1s^B#2Q=0hoS&pTXsZ$UEnZR-5^%^9dp1++nvpV@($-ma6^kXP3)tGNy#xuNg z`PmO>ru#CcNLz>C1CGttoi&Os@Ng~A^1iYkK~mQ)m{BQD89olE0XmnUIm*5#r}y?B zhOkNxkm0!xIq7$+gdkGt#B$R>g)XH8-*zUmfyNbO>T>GIVKb9ync4I*H?4ha)qgwQ0u8^YjM~C?OY^k@zNej-p*|KfazO^X?`j{SL?E{|Y|t<5^2F#Gx@lc~l$;cmj#i!&eeEEl zUCG36VU%~JHxgN|D#EWFHe zcGw-Rz*XE*5NGR?BI2|TYqYu(Lui^QdJbgtUyZaQTxTmxa~1y@3qUD&O(f^4gm$04 z$5B)!7vyw@#!6$Pq{!p&o7!&9J1g^%wBplGOKloMO379=nh!&BLY^kfQ;#)(c*gei8Ub2aV@6 zj%ynLg1A|TEM2*GHabMg4wc{NzZy0aNc3o~B5&_aeR^thakOG|3ll2LvYA>qPp)a~ zro=fi7q7E+5fRgDvFkMXVOk!^uJJ|1DUGX%xOjhJ=cLeNJ&;3d>A5fQbcV|bSGwx+ z$0$z4w~gFTo4J&eao)NkpUoni0CWtj6RfweOB{a7`S&1gDvRhLG$miHv`prjOObY# zxJWLYi~cN349zS+I$Wn=qrrTGt0GBt^_T3$XOQQ|L;7`RR#B7^@E>=KKj*yto~H5s z!=x|R7?~A?yZt(Dy1~AbXa=aG5TJ}#ShFYehB#aZs|KNclFX@ z1VDw@Oy$olcZj=D#j~f3tD+})qD|m-OyTh70!Mu6HBWYy%~}_)i~W%bD+sq!cR>sa zNbD0`dL4gYgL)#gT(-PjqX#)^8ia;w;%9p025!nzcnzK4q-ZzdjaRr^@QmD&*HK{n zMcw)!SGc{>9(Z(6MvIa144lAm4}@k*n8I9@)yA%YZa9iYaAcyu3-*Yt`oK8cNTaa*$#h}7q1WC_$aQX4!7q{2Mra@Hhs9q_xM%y z=9v*P>#RFZPO$gUJaiQB_lXfAz=@A;acavWK*O^m7mpFDI||WDdrhHcjPls4{>g>& z`ieea(0RUsp~t3urm69oSt%Aq&d;I8jtdJD{K+nec*!&QF0GwsZmadN10JMD7n?GA z(FHDAS1XN533~1=rn}MiRI{5fV6o8(m;n+^u7V6x6-DMs;`N3FMy6yu184`VqmPi= zJkAZ&A(U2iK}|F~vlE`ins})y9V-65WtdyoubmFs0yL<^Dl!&UvYHXeynqe&t|ZN5 zS%2_!cQV;nY%(ad^u^@*2)=CM0~}ph4Qc8&e?>Pm2r`7uygNdBK(pAezyIw%I1rnE z_@!A(RG0>Kw9hAF~j7W}Y9bP@ZJJ%wJLL;PFxqalCy+*uIdZzc9eVux-;O8Q} zXudER&X)q)_$1<+LBp`7-PCvRW9(gz<@N`uw#@o3)|Ef=drGe~w8{C1ziEEvcE+uaEVc4s2~5GN@qm4MMA1DY(R10xK&-zw7h>0gtt_-lRRILV@%o*%K5_o3O4?U8W3`%7_Zv}dA)*Wj=w#3S{Dr?T-Z`NNVw zR|`msy>yh6QdY!=J&NVhrzAfQh=TiV$wAOM7-nDYDl(nq*bMJPsd2^d9!%Tq?AM1MA z$A=B4Sord3yFxY$N@6a^QfYOXhi*3&9t*E|1VvM{pXomT-gJ+W=jh`-*z-%Dhxe~A z8jj!!ug*oEoEs@0HLF5%(LsIE*Qh1D?2XtDHqNA&GOxhmYp$)X)hA72T?NISuTVTi zgPCCOtexreJ>&=r+lyC6&nt*{jG1za$a~vCD+#0FhRJ16@_SH&Y?!wD^6AOMeC9Ya?gYQhTDvPqbDh3&G+HYYAx|~7fY0s zOQiIB{kbY?q9%1-(Ti>POF!H6;0zK{BRT652jF$Fq^MsA}f! zw_9e9o@PI{TwG>Ae?wd9I_v>;4st4I-kNNb&R={c(lfqmpZ0#4q4y5z9!5HnqqU4l zM)LCm>09^o0-Ss%=d)$Zwa=>6;kD{d)_c=Jnr*v6Ri(h^)k_{58mCn#!lG`e$Vr_dHev1#^nAJJCiPLoUcQbu!h3gOw z5#yZzyI*K6t5+4Kqs0g4mnWOKAiM@a+NGgT+iUj(7Eu>^(iz0aY$YPCj9;n~mOv*F z;6d(O&V1p%Xf;u)Z+yTyVvLquh<48UAn$$InJ=7=-ADox*IHI2btM9Sy zvLQFgI%1Q9P)*XM1EY|K07)T%mR`UIs-<_d4B9(K!C*hNCxaAN8@1`vfL300b$} zrJ6i7E6-1GK4~_M>9ThZP}D5Wju4;E{>@btX#ct4=x>6=4b4MjRiH#s+zQ* zo4csyIQPICJWpL=!)qvJ%?iPQPJOcR+tIugb#`64MH9Im>4xc!)zbi4cPf)|lW#5E zFQVZ!q8l0Hx=eU8&LO-uac^u_k@?Z)9 z(=Je%ezSFWY#wEtKOr!%^x+Wp>f2RZitA~RSvfP=RVS%PwX~Y^0h&7T8%+Ynu16*s z@0n&lq)b}C%K7>Eu>EoVn(hujK51!aEe3b*GP8z4fN1L}nD?!*4J?Eke#Y&+<|3I+ zL6;RD$ktx@u1%BNP4BuG!tgiC+C!1T(jd=^1p55D^5I0=N5#^a!%4g^PdPpi_fi%& z%VywHy$z60>#P|fXZ@+|G|8K46OGvGjqAVs@c@A)k^;)TNpHY(EAn($kPf{>D5kYx zi8t&ybv+u=9Fwcu;j0lvhi&Q>5t#9O`YNu)(@B;HB-+U?rD+JIs|(HCSI;a=VuWlv z&dtO9o&GSAzy@p3RHgYXCVh5aT?uz6O-7Fh{ETSBAGQfaL=ES+=Mxtv!K_>?NH75e zh~I&wLHx-N1-iqdcI@dqjDv%F*5_#;7GT#+GuY9q3C&?DiAM;5Q$ZR!tc)EwMb@vQ zzX6)}3JKtb9~6LQ0W1ITN{^j)cSJ5bz1W!@`qZ)ILf!XdKH()1&)kzPr-`{|f)@1Q zT`M0?fA_iVJWrPfojZ|g0;USWb?x7$FVSHX58;dr>!uHrt0alS_4lxi|9s`!PEaqG z*W%tE($e;E6=6*^4&gcP&i#<6tEo|;W+P^}=dVcZeETR;aeXDbH%6U0OiApvCv>Jf z;7YZF*i4ui2id82tZCKJIR zu2rAF5lermTt?Olw7W1(LbwIGMYeqL7qf^uL;Po16o28nxOVzLHdW@TrjB{AHv$w?&NLrE zdPXDeg$h(#%!zX}9O+FAX1=XBdm84n2#WzRptL*v$G^MSKWBLCc)mv$vnLn&_SjSK z`|Hpv-x3>JmMagWI>8G52|g`;8y;SW=|uj|@}!3rb2ULsU5NsBf~L>GVOLLt7`-jJ zL4r2i#YZ9Fh!z&=aa!7)Av^W&^(0O6qilo4Z2@4^@FooKyUD*Qy-C+u7~ghnGZT8x zbb^0_z6r_oAH|2r<5j3XaT7wxL5&^6ux#|$EN~$cpO?<`Dl~Tsuoh(#kIR-LmbSYn ztyW(z|E?A^)5@3D>{f7>c7Ky*djh`?YNfBt4I=(66=OLeFR|e>c%0Zfe_0(4hy6g} zxI#5@XK*;oTF7|AIm?ZKT2Xx&1NZm!K{hcc(A6BTDfJsEgTxIpOEa`nbXw-~2Ws6Y z=aXJ((~G0xizIIk{Oz`P3bC|fA>5KzqqI6y-))%1ezl^UZ&8qYRwS5)vZQ$#p6PvN zIv-WNLfcDkgKi0RR|xJ6;BrQ!ANNzyNc0W*m+lsF$?2zjc*5|VVsu1K?L8e6UaI827)O6$*c17(_i?7?cx>z|t@!d#~la1MJd#`HfL)d438 zCq;mKQe?VQ)2QA20V;b7l*<5AGo%DjlB@f@u_2?*Z7kClBV64Zg0f6shi4=`VcHmq z;n+R{&5jx?JFT2_P-|rnMeHGDI)h2^)!++>VC44UTKIW}ekZTdl-EOmE8+WR`x z32QXBQBTWCq6}w%J|k|bG;4gZwMA}NH?8OMPr1w(J;0a0o1DvG@l~7h5v5*InW0w9 zawwG$_j3QTqco(O!C@MB)_Ke<38oeCuQ4i^x1d} zrw9-82{lp)Ix}w{xE?6|3)MK!d!L7dUHqgm?u!-Lo~_!CzD3zZ?Xrjg5&3@hDub-e zZP3!z;Yi-|;;1~(V2d}KqXY1`&6yOsPae)Ov-= zs5;dcm1y8X!JI;x)lgEFk8In3rDLO&9o{Jy&$uwM(UlF_*0x_iBs_Xz-A8E~s&AWg zWxxBUnqhyYe%K-IHBfmrW`8r%3=mln8yJ)hd`}yJD^I;McV3nKXYQi_KM?Sr$NWll zAUR(n^1q0nMMmZgCRe|w;JKol`s|j1a5448@qwZKJdAVl7 z_An4XwyZpN>(%bSK0O5WZwHI-mpg^A!#lw63V3!x&PO_r&S~9G3IJ3ALV`+~Xp)eo z;Q;mYMH?-rwFvHh1C-^&mI(2Za#3MN43m`@k5vx=1p>rcs!qLlx&2pFTaM*h-yCe{ zN0{IZ-TDZtW{ve2*!H$pQimo$uV@2&k6sKoJMU~8E2ImrnFmG0^6eNCR9VhN*{6^% zt@ot~yv&2E-xIp>V^c3@aM+uEX$qt0uFe90DZ{{0{Ju{ogg3b93p3@$JTT2Rk#Smu z*B&Skd_q=kJiKC`h1W+0YK`PYrm|3%nO@gvC56ScT9$*HMWv*Z7_($YJQ}e9kIZ7C zyA01;%qd<59?vA|;D~Ja`DJTY{_@cZy@*jsyX#d!g{X!PKwTv;#IdP!7XbP2e1gaI zV0DqqEFj-0j)8$|KNWB~(9DGjpW>cUI^er23~AQJSk~66j@6w~YN{6Kk1TUU_o?O+ zxX?Ud`P8%TnkK~DCB^=#hSRibV5SHM`g6UGUT`Q11o9w1hnVcVSvF?~sAI(c$q{v!QR^sXNl-7sTl zoWUEfv4ASU;b6W~N5B>TqB-srHn=l#X7~y4}=p+bvwVzLg(0i z+C+plD&sMeBAFOuW941;N|``8Y%B&O+A{tvu;b5ri3)wyax6}9lmF!pR*H-muhk-m zZR-N=EJ|ArcZmi!AU~4<`N#&4lXcu-j_kqpf$aef7i0s2DTvxGDnw%5Y^Z-WOSB!( zTa9#czjql_!*4ReX*%ymt4T^0u(@HAzrInTt6j(VlAPPXgn6msHlAHWb9}nt?21xG zz1$EE&(b1ZIEvBa|Viq45_*5Lj&P6y8~Z*h`oZZH{W~V2Ir|qb>}rg zN!RxmHpMSGM-9@inW}xuv)8%i_w7Q&kh;z%-T@&j)N1x&e@$So!?z--G zg|yD=E7C&goH1o76oz;!m}W1jU)yt^KBw%~-of#hzq78hWm;G~9LfgCRrN)gJg}44 zCpKRzOiF?J8EB`H5>8J zpU!VZ4jUMYWMut4PoKgcPAVU_qb{epj8S~u13-*kk@HZPK7#87K3!jOAK>)Le$_j< zvLCC`ay^L2DI#I<6KjFdC}xN)R6b362~kk^r{sYR1i48;{dc9IMdz@SO(l^3R+KFY zJXA$v*h>y65o;RN$NKGEgEIdL1cw(R=YlthHv|3c!)@iiz9_iB7tXa*kG=Ud3LUA# ztHJpWyZCcr)4QGMLEs!$_yS4cGuuqQ53hx5Kfa{fXI?BlpLN(((Ad^LVH8NH7Vu1M z5|aA}HW1Nb7hA+rpLa~>v&p-Oho1x<7ZpnCA>#kY+*mfZ$J#kByx-xT^^XZ3ka^1b znR^4}y}N@fHRxTU!bbkH330EreFZNK*l~_(v}`;}`>?0*!o^RIEK40!>SXOG=!!Z}fgzjHuli^fhYF-K}c2iq*x#$m6Wx3d)0eUK^8<7_wz7?XhUx zs5^I6MLrMPzv|>krshHrhs6I*|5WhJH+v)wIj#KY8TKX}#ca?c(fm$%Nv`t!Y0HM^ z1fG)Y7vGucp%&**h=ps*E`Fe)>d~*pgCAH`=@yJD=*6>U+LGwn^{FB@v5uA+8#~N> z&6JupsJVGqMVb(kC%6jUz&xOi^$$zyp?jT8sUCpmo=SzO$Q{09_l9)J8UhqWb zg62{UKM_t*NwUDX(`=nPCAFw+qU~m1yDFQ2<(OYtr=ZPC8tY%%PD^1qX~I>Ager#M zgzR^4{_NGxwB58=9$L+q6TpH#KGmwZ_u4pI^HbJ4zNTLqBN& zsuOEK;a^dzd-E=t&zRp+IkeEv<{OS8aZ3W?Zb{I3nLr`!ipOHHAt{_jxG(Si#Bb%0 zA))R&iW$j&eugGSBBsYH9r2k`A>%^1&;(Z1uF5E~Th3FHnI$>XDNB_}qu=4W0TYJurd7d!+m=LSSOZzNzCX*rFGPMEd04diPscMNrDkOct zbri?0?VZdkHdPttc=S|IaeBJU0f+jvb4%!5ner{_a_jf6&jm#?!;sF4hma8KDc)*%$C83NvsRhN{QT(H7;$ViW%lBV5}Ldb4RKEfaO=& zWXvK*a;H%4nbt1Qu5;ixss4Fu9zmfp$@Ws|!wr*qg$Wlsv@FpP@$i!AGW+*OqbArH z=+h-Vaj-~(@|#afLhexINlts2doy+)VJb^NjV;m?v?{+j@{^wTyt=kxc4G9#$Sq1p z#RwYnN2~A*!ml`2X(uq4%$LG%x!A+>X661)Sx)~41R^Enau}jb%A^z&dDe)Ac88Ra z6#sOY^rc8moN15;C$H@x~s;ahEPpSBUyN9E7?!JL`VC-QuQQayXi7{*T`)U%t4 zDyoc1>GCx*_t&0l7SCGVZ$FJndP?Qp9( zfyL~r;bvtby-|OB7|W-8Nm8hNE2Ij~O9cgF;8tB{DT6O2YtQODZd}~jp$!9xmmx{z z#haBc=WD#Vv;eeg>o-fBCgq)nwbu1&r)N@=F;7NKVmne4AP@82g$;2TW`O6$CH1&h z$!(Q>@|yKi{u^9Me)+(qJl~xDFV?i)o*b}~gv~}4 zwY!dbLs#vzM%v-Y>hsBK-?>$Jz^C0(F8 zuW(DDaX03Hx!qQ89FkBVbQV2$zKY%j8qukc{b0tK-n5?7T=-(fWBSau2Xi!J6ASW? zHQBwG#-mDDIYg8Yv()!{2}mItDcUd8B9>BqBBdP5lb|Ga6ME2m2yG&|k3%5pviKJG z(;Ccxcq$Y8+}{Y0fqVqQ*ORA?H3$1+@d@M0-Wm0||M?~OJ!#R)y>i8rXTatxkhmA&`Q{F(T|{Hu9kH3>*GVKy6#$|-FP{6JbF>0(Hg zdmvOemfPjOU)-3D*5in7V`#(e)OCGJxenBT)QkRm#U0(!v>xwkZ8r@rSK0&qsk7Kr z!9e}rPf!;~^ac8soCbAdN6?zvb-E?V=O-KTFE;R+kDzb&(hvuw7*)*ICwq-fC*^=+ zb^6PqS<-TjuyUI82fpMIB`sQQz6Bw~>MI?#$Mqxc{dar8NdiMH!*~Rh3G4MNxY5sa zuwO}zm1Fp64p%vOa{5JCCB$qloZa~x~??)hPpP5t6)aohKhkN*~WmH%E31G7wCAb_u@ zml^eUnaS1k9RS6wwZhZ?UF{{u4=b;yQZgLiInV+r5|oERLT(oifHGo+4~&OUd&yZ( z@2wDJe&=J?osRiMr3cabmE{DG&PJU%;@S&LzI8`8N!$)dDU+jl<#e38SCs~cZzVBr zzCT@lPV7QhzbH8S+-sgv+lops;Kds>>^IM!g?EJSqp!E%wG0sy&*ITX)07N83)ar$ z_@~L6u>?}RGfC||^w9unf|u#5#rbsSI~c{y8-nVJo``?A97J>XYP%J7# zEw^G!_^S!s_Yd0Z)z`#y##tr!qt?YFevXWd3uSV zj@+TDE$K19j60s@gtYrNGDB?K2J&Jg(T(<1ff;+X zVUCn9ys0<^L$?cC2qG`JxtB@ex{7zvNtj7GO6-bu0ECH}tE->!HC?+Fk)h6_ruhA)fQ#p1bQRzQ^+fYxByCTK0epJ#0xL zUFmu8CpvhdGUXO{Uf3kxb<^@LBZf`e{ZC^Btf2f$m1d+1PItb@3;l?aum8RJ zW8+pIi0NUIs9(f)QZ}{sfb{xvqn{+jCJv!zywv1A@l#*g<#54Ci}e3{@2Ot=d+&`G zl5X_FL+=Ev7Uf;f_I~col-K_oqUSNOlDucvhXDE32K1SZ$s#Z!cOf@2D?G63vmVN| zUMD;3@_+EYcd4lg{-iMp3@7#{m5?1m?fqH*!>X_AP~kH%k!RmrX|-QK8eA`q5Qu)( zbG?9-Qroz&mS*cY~NFt;q=LT4-Z`zgGDofYa;1PeYe_-hu^;@{ULB4n_%x2w}xb3g} zpGRouMNwTY-wmg($VN|;Z<#@_c}Hq2uzB*g#}$D3Ult|~$^VUBkUTh*Z^bByZJMnf zaWlDAna6eps&Tw_K{6Wx(b{COHhlKW{~of9WoKA3ln~KFF>#%1 zbjkfn9Cwh0XxCbZ1%>DZRZ&LyzIQ~QxR^Nxtjr*R&=c~U)s~cpA41597;Py_aomq3 zkoT469O(kIE^zirI^-uZ18Da`W?AnMTKq7+#ukb!!7RlvC$xN_sRRE`T{T66WO!Uk zult_rtz#&0Y1V%h30uZUCMO!Oc_FwvS?{H+>sw!L^)+gU@irR1jr;rGdqmdWc4J8D zI}Yh4E%eA>Fh1{nO5Q$+%+Fo~zyCc-K>OuVlY~fy@UiV^qK*p5S9JRiT zVFoRVz_lu4m9*rB;QD!WJJINFUIqv$sU#Grs=e3=)*`<* z9d$lid3uDHCFS#?f)vw21vs%iRzjE|r8u?J;fdnNU+93mczZqLn+|f5(7%=X%KB?H z{P!x2A7SHD{kXY4M_`S%2jGtaytV0CSJ*_w%;i5_a$i*Y%+` z!EwLRUr^}HoDtYM8(_0sLF;{{(5`rPSesyw zhM+!bKq*~Bib;_wM{Dj&>3`oZ8yWwPus4r~`hDBRF=g_#jQD&kF~|}X*~&H;$`Z0y zl-(qhA^X-0QXy+)D{CZLEW;RNEz8*V7&D@fb;go07>4KF{r%j(*K>cLx_|$8G5@&c zy3Xrdj_W*+V}5&jVdP;Pug8xk*HTaW-+mW%-R(}WL--k|vJZDJ{o4t#eV%DIS*%}c zE>7#Q`Swikoh^o?+WYHcfNE;l*5beK54;D1z=uZLyh(U*%;(*6v)tFfsHxgxU~`yv zX5zn7@uJNm013leov8iM5*LZ((YMjRayh^G=fygn-7l0OYvu9PG5vSB$XXFP`^Wu- z;Ppc^mX1n!!p3G5Z{Oq!|N64N9|8~YTa1H|u2e7{3CBkGNuk;}3(-%xVGlCn>;Y=e z%K(N4x763gs8w354ol%*jRXt8+-`T&B z{?0MXUN9yeQ$_C@B|tF092YdE9=k>>o4zx3T``&%-b>DwuYl5e^a6 zv-4iVY`**s*26~SQdo85!U|}so10IjLRjFc3eooHK~PF-Q)heP>re53+5|Wy-bsi2 zMCO2H@wR%xJrV09{-l|O z`~*I<|InTa_#??uoRBk+^ReU9S0#ED5r+TkZYE0R{A*1;wb75}sA(B*ADP>@X5QNn z)UL@>Su?<8PGjuuO3icYQ@%V8VH*UyvbHtVVtxdDJVGknk*2lFe@l${w#6$>p77S~ zd<4+c9I2x)6@;*O?Ew<*geVa-`5Z#+yUyH<+31YwTmi&uXduT%4jp%_ZE~fYu&o?@ zBBXBv_&UHKJx+SHfsRv0JhU#;`kyEMKh0pbCK?s3LYq?GjU%dnr%(}&RfAKoXu?xQ z*bejYc6rOzrrPbt5@^DAqDvg=bsvsh3>>8C6%iTR!eu=yS+E#CDfF0PE@M`P+TbV9 zghe?j<~S{=QVOvF>BZK2QohRnhwB827oz@Ws7dc9f6y6Ni0(=n&I4PgXwP z5XaXubDUf2DLW44oHapM1z3)p=S@r6Km`m?#o6y6vz{?0TXJ4o?*EmKV^p+8)82-}oUIM7$2!IJ*tbbRl+*&kuG*v1XPXU;`+~i*SYb#XScEVZ1;m zc$j^US&lktVSK=n;uU@C(UU78aA(rr>ap{z;$-4&o+JYEU=^i>Gcp(IjsXqPF7>wA z??=jnJ)p$Y@`eK&U5boR>{q^-_>a&2omuEx9`q5yX$^bxx7M=B@2i0I({acA#e($D z1$k*%lKcShHok5#PJ70shcRiA?NyV)?pQNLjfW|MeDTtH^^?hohh7%GZ@V0Ss2hY?jl4wU^_kAYY%=ev7!Nqo+ zNnij0j@e4ERHIW+<%_*E;gve}F_Hz7$fbYCYKg0%=B*Xb$#V|oL$fvE-l zuBKA==-SV{Nj2lzy>s9;jyr^-K`-5=#kiaG|58WaJ9~$zZU>}Z@nr_gt=dI_g`EyI zI??8G9w4`>b6yGWqv*vp0XhUc+Isu@N>?UHv7$Jk^6+1EYwXSa$2WVuw8Ur<%zKyP zJM|w5*}-2wP9seGQ;Ywn7yh@s9Nw&O|Air-0%=XULovCHcr)tJ@PWMAv_^EL;Xg|T z4+Z&TeFyL9%t*kU>!a<-EVb2rZDqC9QQDKAuT1VvM88NR@DD+fqQ=Gb*p9%(LUg+FgYL&1#7}J zl|Y66f1H~{`0}lY9C8*fxiQG~T+l5bgTqv9e+y+CzW^Aq98l$SMwKA-AO+;5XjF6K zL)X>B=Zox9sA#4;04v5G1b{Arfqv3oCF6!+uh-tGtLZQeR$Csi44tEP-r*d2Sc!k> zd9Tb$18Nas#z&$SNdT+ZrB%r`%-K7g%C|W7P80mZ?$kb|G7ZH<=l~{7WlVON&%}xL z>I3=^PI~EChepN1&Hsy?{PklxDOg^VHrO=%@ZgH6Q09x$+@xz5TbC?`(iChu|DGoMw*f@B5XLwztgpF@4`eVw)0?r)Z6#;=U=O z4ya+5b+AeivQ<>-LK+AZJx=Pw8^rg5)$p0Ac|{+QfvPBEKc|drYT3 zr=%v#-g)n2LG5uZjQkxR&8Wp)7d&Uk$hmn}{Ml_{72`N+BHW{%cTa_EbspI>(~^`8 zu(+;ZI`yY%CZkM#$C0QF0D}6=ubOhnoExRPe*}Fn0p!#ntu2t)+{88`G!Nk9`*_|! zBZm0lC!Yw#q`I8`U))}I^D~a`jWGmy>Aj`M;6uQFfWB)5x;X#pN+x$jJFPoW_2s^^ z&48&$cw27c!hrch^>u%cv-$qt!7cA&^4g%{+_09U7(&(7^W#B$l?#DjrHjn?nW!8A z#Z3@>>KOB{m9rCQQKb+`P0LGMZ4t3JyA2b)4M;3%V}RB}lXw=+eB1ThDge^}Wlx+8 zeWvEM>F5lr&F~8P-=*R2?c_)EgW&B~!SI~M1z-SjtvNb(krck}%-Rs7FB+uJIdmOV zyI~!U`T8%QZxm1>Nj%a^*_$K3vlvs|Caad$j(HX!a8q6d#?%@C&U~EsJZmuz;#e*QX-OH zocjV$u3SJ@fG==wi$AFYax{XsS14h!uX(2Eu9_0REmOr2!v|1BUCkrtc}Fc6%S_F< znPfy;ljN~^oUl$}9@2)aUkTCUl#~VXeLs@c`sO7d>s$Z0?H}H~Zzc>kuE&+SYU!)< z-oP%(1C$Fsr|*uD->~cEXqo*|&8hQW@Iy+vlW-K^u8CUqXRDiPNo(BS;SOAzN;J+m z_k;N7%lo6*IG3g9w0pniD^!#i5v>6S%zQSDB)+~pL5pgXADXK1AZ>QHmpZShV*B)v zSs)Ckn(%2L2%u3;gxWa2NA5W`GmTbcNt>6gKOVB>@~T$72Y225Ud%f583Ra3M>HJh z``sl~wPGpZl-R?TG5o+vu`_8~dAnm^LLm$o(Y2!huca^W72hQmANP-2e|m7#lwn!` zKtsdC>Xnj^4cD^7x&7S**LT*%r%2%XAWFdt<%n0OOixt(gDU;zFjEiD0fPvyvH_$= zM59^je#`anA1ywRTpLc{9x7DzQ5a!B1&s!3993LyE${K$Gs%=ZBru@dGFHR*`55Gd z5+WsaBDIc%{+yH4j=##Xe)9pq0SCYx%uk@7R#*w>S#Un?t74L6r^x5ydpe`I7dwbO z`FWks>qMXsfsuSj@)-FbWDOckTs_kH3fyKtBYnqN9ROOM^}eXGm}=O)vhXzH=Z_x4 z(9OA5S6(R9y*b^LEv5XUJFTbIm%PxQlT~@EZ~5ha*XsXw#`f>ue>!!1J;6^@1`pNe z^}oj*S0-_BtJ5fP_WLo%_H<}laW8tgDH3NNdC7;RU776)ITltfBz9+l`(Kh*NDjlNrCoy5xL>)G zK(3I29f{iykn`@-2E7|qBWGwwNpN2TX@h<;)Olss6{~zA0zm0c724?+txCUIHGDVH zg7p-_JJf3Z*&Y9!K3XHdPJl^&jfAh%X+Psc$mK@)iJae4|Y{P|~q0>3Y^6Y0-P z$K^hhzY~jtWljXmEo|Y_;}-+jVGqV3o$a|ur@4a1GONhLBhuR(I0-R9AtNUiUa@U| zkY&qb3le9qSFp~gLep4uUJ?~`LiU0H$X3gwQd zc%ib~0n=9p=^P^8-K*_?{=i!3{zl%A#wC;&;az!2&e8R{5 zJrY$eq&tV376&VAEA!S-96wh?HRSv7X9D%_mNem0_!{hM%#0QHyNC;^*6=#tTa2qhc4q!26Tl z#z2QW0x2o`l)XY;&(D1&yp>NGW{NvOK*!pD{`-QS5ePs*fY5;?SF}U*+?^c!>Yw<% zLENc48-Il8S4+WAluKUbX`-`()`(`|+vI#ycyN`6XmsiCQ(EBQjBg%WYk!`YP#J7C zSGnEq<8)FFb5?wvE_LUV$~G}=9f&9Zpoa&Zv!?DHApv>x_mGWv<@GA|w%k~r;1Zxn zCbjgA%?jvV6897$(p9Efye_0X)cMQ59ID7)O*pQ%>OQ@~KZ+V7Jvu87MKWS@fVgdp(*|aJSVONKpj2^=D7)S6TqQ zp1tx_Mj3ZY{`_5De$z5ICtkBXt$Qwfac?$GTHRYh`QP zLqatWdf9on^q9hRCRu#l~r&G@lXU$GNy8 zq+E4A|E(1Vsi4F=1=;dEUW}Uz0v{*bQLOnIP63gGTY9g9NJ*58*cKXWZcMHd(gwk@thKUpl=$w0fLK(_evr3{z74Vvf`R3 zd8N{XRi-)M-w>C6Rzb8#lLHa4j%{UxPms$eE_x^6^1}7ipRd0!uqtM(E4RMQbr&BN z+4wWemWq|wi>ZhKj7uJ}j)ramS4RAaJvWLeqV39lWgh^ThP6zUOW&R`*ypP+fb3KC zyz7~9O|k2+m!dooM#&VuRdT=+I5&lQc|QtJ!A?y0@?ALaX=H=WfKW=J4JC%~RL@wg zV2zWsQvC3445V&Hnyq>(AE(^XF;+G5cUM#1VG4<`>T;X3#Um%HuP(6>!0F9C-;9op z!^#~W_zM_sS?&Hj*ZXuN?avwl-$*Zvh6lfYs22k8g(5y(dwMJM7)h zq~bR~-tUEK5&=1dY>m)o+K2bWeD3I719Bn-hk%WCKu|9fkV`a35;g^>tm63O=+9}C zua~4vwfbI4o&8(xW1Zawk zyIJjJP(Pxr5qTYiO8dk0XpJyt29fEOE6l zO!o`U&Te49=hNNkft*sXI@ey zQY7pCzjf&`ulVRMW)TC%Z8XK(l(`lUDlj!%ZZ`AQnE)#!e4 z5nwU)`227q6;Raz^x*`qeXxJQcd!w2_e2h6I=T3L`NszU4becBX-~Smc|5tq|MuU;oB@vth^QjMeLkyAtXI1!9RM2zX9X z7~iFkYDSW+-&hnr{-m0~bz=Xh7Ip9v)@RN8*PFGQ%F+X;Q|hOFz z0;Fh*^TN6VUu1uIKMtt+{VfBi9DOiAx5#_(9UX2alWLO9ay7fcoB=NUh8yE+=dJ!+ zW{5wpaTfeV%e=PDTxn=n@dZGTC!E~Zs-m?pkRcV&(CE-)haY%<(m=TiLupMa1?!25 zqje`q-UV?iuL%m>MNFWOJ9d#EHi6p@2)q!+Xp33G_}XRfd{%Uj{s0c5=S0=xY$jjf zsTQLhDMy{WWKhfvU`m>QrQZeLY1Ra}+E6L`E)j{ok2$)&%DA(B{kT2X_kiGGTYJxi zSc?WhVd&4m1jo9|rC)5)4KCQrPsOpW6H0)XeKT-`alEJeLhi+zCMKRxdGhf_z!=%- zZ3^bF{ae)4wpf65Pr{I^%n8tInB#n}CdHd|d2_Do643CRF9AGV0RlHV5G`u#ib=qg zYwi|#b^Y}}FK4FT?QNw9v{?_>IiQbjQT*B6`ctDe<=y+Uvsrhf4#X494)_XGr$eIO zU446d_+{n&3U#12x*2BW0(wC}$LS9; z<8vRLT;kU9nIg=mT$&~XjP6L}($$&7w~3qYq9|rmsn6^DfHFPJq*w3UDxfO5`uEWi z3bjSl`8`FUk@oez@#9RR`{END@&27o^7f~W_ohaq{!*iCjY+N${t>#rqxehT^*v&v zuV#9k)%2}9;q^}Y;46T__LNz6r_eP^cc97rVrg0J=L<$%y-w&?n^~$w_UistxecM} zAAY?M&R@-5y-|Lk{)+(^c%OQJJ#1mtaPIvkZzd{tqw=pt22F?x@H^Ev>9bz=3l00% zb@iXeGOyMvfot2Z{nRb7DQE5jSdpAwCHLj3{T;ZM1kIK%>PamE21qLJ1BFS0ARij> zoE!xTe|vLlxlG<=Fhi_cE$u4WV)neHXGTTzVvc6$6SHi!_5#F!qD|@{Voj6j$C+*# zT=fx^+iKCFDEgRj+SF@a9qy|-VZ3|Ad7PGBmw9)o;o`VcIQ^@t=>5Kko)4X|M)Q!ntAu(z7Wvmt}7HaPx!H) zn_X<(W2t1}lZxnk#;(&<>s2-7$ia=$5%%!{rFylNkG9v!GOvsx;%1Lx%)|;IW1tpD z+tw50Se0hY`vg44UkbN$G!(hFWM;d89{<>|bHc~c4HOC9bID_}R^ zDM0mD%d}Y0w&DCr*n$r+#COjN%e$$%@}a6sTGrL>q|wI5yX9}s_th<|hHI)nBSH6A zo*By5lPkLm)OXmZHjbfPd2ixSZUA44XN^Pfdo1#W3NnlsM4}AO#LKV7r7f}>rG`@& zKdAeg1I00-Xc-68m$b39cE^aNNBkq&d#FC7bNmJ;R6~}rZV11!)}UPWgm{E>t*-f} z{PtSMXmZTWiQLemWA1aE8H}!Xv2gT$Ew;C^r`XP??t<1HxoT;(e)Y=s*YM==wfZ$? zbFrNBp3m@jUPFANvI^zyiolKAFN%ikd>Ydn?{BpKBA&F}w;A><&RK=)ns+2Yv%DJ_ zK_iI)Fxl96F*%A8iB+d}eGr0DBd_RmbW4?Rj zvPi@7auTnBVRl5+;hZ`SR-=WU+6P*B%mA4pT97h8`qK1EihNoc(0obbyXo-?+i~Lk zH6l(pbZ*?b{Ak!1`W@6Lx%iN>wv;-Z=Y@_w^In4irkYC&AJ$XfI~|UB;cGdX8pF4Y z@r>2rDR0(b%Y>e78`wZ~&2;|@Yq-&HnH?Bzbhyx*o$lRC!JTgbct8_;fhm3C;3;3b zn|DhGu3itkZogrjtMhT}W}YeVIv*sMI~Vq8S7I0#ZlWNE-;cArbsrFEsz}URDOZ-> z!h|wmqZ9w%djVV%*C|gfV; z5au<+|4=|Ry(k-lNU&w08QNJTsnRcYWGbpGD~be)b)51xGBjg~l;w*39AKSJ0%pAe%j49aN%x9oufrzcDiI zdT^^aC-{o;?OrPK(Ofq`u5->bPx1Y*3M<@jK-yYqmltcB0Pu)SuJqN;zr4He`P!LI zUGl8z!>xz0b@=yH+w7V5%(_o(C{tTw*3z45!)J@18YF4XRA486=Kahg7z#_)&aYU-{E$d*x7$~BkUj-%DOic{JzA}I4mx_T9tsX1U ztGFEO%_BAN%y-b&u>n0Qt_O%me{27MC-)-(ckQcmuO|>)Qxw-k0LOMMcE06u;Bl zR{wgb4+nuo8EHIa4HlB}7L&PGP;2jAVW|L0w6vO&Ob}@JOD0AncO_DslgJ*Ey zbzLG{A(BNwAmKz86A2R?_Km}>h*Ot?U_D&|$Gs}l+S3tg@&aKeAhQLpeT;-5E*u2B zt(WzfjELJ%?#e~D6>(m+TJyGIMCEJ}Ed1vw9i^G-aeK;^LAL*t`rC+Rv}2xTsIdl( zkXP)M?l2bNC;~T$7*YxCKnd2LciUno;E3!yhsLIXn)BN*N_oWAEqg+LrlJJ$ zW7loZ^^{L(I0WtM_Ipnvc4;;FsDJQ)*7j9m(x)>MmX6iG^}5_^;LaZ|=Nu&G3GEG< z-2{UhJ=MyY^=&GzvO^=JQqp!K5^t4cAYx~|f1KNQz$y2A=Ard@gpYBpyS6kosKPb|Pt!xS>-W z?g;`JZby^={ONpU>Eo00){h~gtLAL&Du$mIDZ!JDp7ZnX-j~tx4DkbP@`rKeucJWp zVhZkSKd%`^)HG8;`|JG`WLlt|_s6AERb6|WXx50dFJmR=MUQOdaIK_e+}}U{V9x_} z*r(kW2_3C#!?=DPtJ_8?c>YYK0xGLv!)G#;+>D7n)2N228>|pV8M*pNzuZjrik#J^ z`c1Y%U+q8aR-%%5l6pw*HSr3BqX-Ej`$KZM5aPd8q35(L7O#!*Nx&rFpB>1!SQD*c zcyvTbMGg{9JhQyG)6rVD#ON95*XbvXS_O{ff0YqiCTIG|VjM2skS&zwqs3Hu@pdx1 zc}eg^C16ZoJftC!Hs7J)%w61e6{L8(;V|asaI6EIx6rEa@ z2u73EDlQdKH1lk|LnH2-(fPSFf|DZ_Yv=OW@xwm8PycOjnQ2rgu11zw^nL>6MqHgE zweNq*bO)cP7G&239NUNER?!}Ki+#d1>Fw+lDi5lFT!bbc z9VGVi8c9?m3N^fqbHizM#1VbnW;A1D`(Pnr_*D!vmrHwYFrf2Q%#WYk=`mq~frhBr ztR;Y(y{!Gy2CZYIJiJkTYimQ@ z=GAri5X#pRlAi_j{wPesnB1TO(PO0|QPCK-{Prxu(5aJY4)dB5ap6uYE`fAxE$VS( z4k$>VhagDwjXT?|aoP=&$g^Q#1uk)S!XzpVa_Ky7f7>>c{*iEQ3o!m!7bk3-UnkQo zHx6RdaLk6dzIAU5xem|Ia9`3bcWfL99CujT>U_j+zi8gwhI917w2yQHQwp9|L}bm^ z5nvX6f2r{DDHJf5dB&7=p%9R{oTO!}HYIZi)H(wvmUb42&sLrJj9q^B{!QSRgEWJ# z+6>4^`kTMh^t=dg|9!#^USz-aBOhy#rT|o=)7{FVLQvOJJ6&N!*I=K4y~jdG!&R!f7h_DBwx7tVAJrm?^?pv zu3L7O^_!4J3FmmlF+;iE?t6&*-2H5h6`7~+qxa8zRx!33P`$IlzhY^a*@F*}DU^>z zE1oi;GcV8X*cL-#HCizKr^g>jF^r*eLts7Vvb{5SMu2&1{yVbff$sTRFF2L6^*U{> z_+SzrGQzN!HWlMGL{>$gc8^LdjY&h6i80LQ=1z=MqT!{wO~j%_T382@v{N$%2V~z{ z^_G(>X3ae52`?PifMM{kZ=b*oW*y0SDYo0q!!YMBRg@M(r zqkOhv4gp>5j?$|35h%dUYu4h|r*E&6o-xILX#T{yloGvd4lqbx2ISgJ0St;dxzzPs zx>yl`f8#rg4}Z4Y7We#}U%}xm?d_HR5t=}@`*Lxb%9Y&n69@B|3Dfn#d86e{&7;NU zPUhZ}k>cbuk8LB=yC6G<>6?`@E!;p!f32EW++=3TD)amOwGoq#3H9qGfl>^i{voy< z!c9Dcwrsdgo)XteBDqlR+m6`T(+E8{iy+@TWLUe*WP;yWQ%9)7Ig9pTBp1WBCDvWl z=BzVjBrHqCUNX8t=5QmIj2f00b{(bEihC7$jV1-z5)8V~r`Nn--Av22-RKDeqZ_i! zNP#LZWiG$bms+8gy>Qv;Q6A3;w{$aLsGe5r(zM$lv^24BVC`xBk^b_o7yKoK6xf~G z<(aIt{qFpW3*-9%%Of?-Yj-c-)7+jso_5L~AjS{*EJI5K@VeJugT6KnV+SgGmeuW4nX*znduV&al2>A@Xmo+<_sCpowb?-2G32-)M=J3rcVE{wGNKbjf75x6b zt+}v%M9#^VZh2u3f+Q+WiCQz^G#!n1=Bx60FeR5v^waI(NEg+ zhOIHXYY=EO<-x|kew(&V!Q|wS{*O{b+cXV$;>DSPdCTwN$rVE3X8 z&4Knv1t}2!ks!^meK0H%D2q+j(1AL8EzX8HGs_~TOGda-n-UUL-Xb|qfKCjvNo6Q` zq=HhZV9Nm|q7olJwoaT$JHaLia__!mhb)QQEP+bJaJf3ARQ2&F;fzMpkm=a9>%zi7 zO|Vkh{LTCj+o-&?`t__sFeUJYOLpMcje}GZNjMINdu^&RRWUreJF{B<#&hK7z;N>h zy@W~^Dm-gyTr=rc1rPn}pmC3Cl!a`%QRLb07#^W+nydC{@90_rGz&-ab~iuKxc+%_ zBnk{o8FTXaN{us@&ERtg_m_l%Z0MQRjimMh4&Y*d9WK z5AvBn;*p!gA@HU!f3Kb6i5^S5we@KqWX|*4P`Xj_L^eHa*0wy)^tV>cy>@iI<0OAc z?+8M@xEdJnFm4@kdNiQG0RyF)a0Ztzc2r(Q9DZ` zX?^EqON3Fd2q|QbP4mZOxYl3a7QPIK`X-G_o8~?{*vwmCu)W$5+`4w%@xs>92r00y z#ri_|$C;m_sMA>EsEq8;j=nCzwG zO+0pKeLUI$dSjkv`9<4iIUS$?6IB{Q-zsq^zia}_v zX@Q6i1bRzRo3b=ei3OEJ1Nnd2M}XTXpHq}co#8nm!xdP>Ioon><)>P`A`@TBGXIrs&wm_-Q5*6`Mvvw%YG^ zbO=RgZ;>Z@YEC|b<%P_!WjF7-9#`zfH62(xPMQUXE3dFqm#>lJ>x0)`m@!({fJk>9?)uV#T)0^C_3N0% zH|_ps_{&{S&VEP*V22+;YHx~7vtH(g(&~)&zNg?zK$gF&oMN|y=6e*!*%WM!x!GqT z{@S9(`+BtURF)JcrD`Xby6*FIIzzgBQ)wx_P&Opn>=3`yEDOEL{IeQW-i-{S=@Si< zJdPN)1aa`JxH*?G-4eDaRN>PJt>S3`BgdEnu<-~TLF8bP2KTHrAD*qmUACKzSX4%3 z9^z_KL0ZoDHUeXRyBVA+gq8?;gI!JfdC%dtUl7sjo^$oRygC@T_|t%TWKHRZh1)%) zxSy{rG!v;);cGz?%?DfMH-Ad=m<3O`@n_WFTOsf{MW$zRaLm4+_M86C90&b8rKskk zl(v?S&L>M|-xekkJZ2N`n=!d=lP8oN0)gzVRFqYF>fIk8C!bNjganmcKi17BDLzN@ z3uV)LArD1OmM_a0%1a)$9k^;f(AYD`(V(}hYzecc3y4;TxMAZ1iID_&Pl+L{4DME9 z2+bD_^m0dCFgSDKXe@GB_XCKPwFp(E^6i@~%knYQ2>_~iYdF!#s>9_PA=dFIn=X?a zmTn0yfV_gnQ3Uv5%h_Y}%(nf$_3!m>mPU$6w6=laZDSkz&_F;AFCqjr-}}O|w0g`8 zAa*DLc4!(!GXk(48snAEbkowA&E|#GdaE_Zi3mVc$)rcN@v7U`Y(SQ;K8WlBzw;vI zmgV4`Jz)k66l6*LhMIV=G4R5Ay4j@i-0JvspUOOlkcOmO&7|}&Ff-Md7^=R}#@le< zG8_`{|DdP8;zMlcqunc=$}H9Q)uW|!pc(`W7Z4~LwC7<%tP1D+)(JKV(HhRM`C}?9 zL5gM{Ky;N8m#VZ~1sP0%is!l)&5i9+ea#9)i6vPXD_`H;i1f<*;idX+gf;b`j~MA@ zzpM6b@zRY^j0n;w)g?+!r%PLBwD5I;6orYH*l}bg#5L>uotiiw@6DHFX>E-l5~>EU zB*|$sK+RzyoflAmY`rnInhtoaXH7r9pw9Gkc;P1Acmfh!SXBOnt+jD^#!N=D(SJc0 zAA`-6-d9UwzrX!8qL21;kT*zAOun3ka=sc_d5c%6Ycp z!J2mBcQqOH#e5LTQ8zd%{;lHIydW5iAR=(XR*Q$55E zxBi@}qD|7SS+9_+|5D~iYc>pb0}yl)Q2m@4i5fbGn~*miLx_mZR?Jy-;4j)1=eh~2 z#-c8~j3+==@}J6$7gGxpLXMp2X7c9Nc%>Z3M3a4m$f7BVkP?jSn4o-voiS)?R8k-!Ao`j$Kx1z zfU;i^fWZzIC`kn8=mERK=hn$0T4#+O?|Den#(eJBc6jgaM4DnPOE8lQ(VFK z6d;v;m&pq8*j#8 zJwS8RaINp`AL`5kgXmi)=YKHIQQERKQ~UgWmblj+p)ax*I29@-6&ZN=c`1rG*B?*7 z^PmQk8Dqz;(Jo~XScl4=%E>T@RJR?ng(YijQYtT&*=@9N?sZ`wTOz%dM^>T;GW!Wq z!RbMYH8@Cpl|Xq`BELcfr#@Gs86d|dq?fg|&kL15&NLU)z8?aViJ`5p+6KDHvBSom z>)&+G-A!(!5tU7|RQed1UQg%%J;CtpEN?QfS9i-BN9InC+}S&sdy_trcc7Li;H&GV zsCq~r@AKR>zb~$JxbOcqcugDGk&N=)f4Ki};PKTx8Ly!{N*84nH|R3Hpe?%1xSbug z{MNHKQ}No_qLY^%zoy_A7wIcb=H-%o>g4tEVu@r;O}VC>85Mreh#AZ)OXU9gD`S`{ zyZpxr>9}V=qgyeYu`7S=JtAp$7vuRhqws^UJdr8T zV)+Ib>r$UE(`0 zy_ru{rfxld_eC+!7CnKb@Z(Au2{4+XWFoK!QJ$0mv^ft+J>&y7%X84cMfI|?ZnBOT(im|YpG2DC*Xie`AZhFpl zBLEYyp)WBE@WV~|kO`QjlES7JV>efnr@Y&SP2|$(TcY30pB&A69xpHals4&Ke%`fh zcL`9DG&#cDn2zMe zLlJ{2v_2k{63{Ypz~v(E9OZ3$ARE{kbCL&=_+}i`QrsnAt+8p2(q93{Y0|BY>(*K# z#=qBJC-(a;74a80q4tV_3Ui!R{pwQ8o0_Tn%8VZa5ytR?uH=z{15LgJC0(X-A`?Zxh zr?=vlw#J>x8MlBL^=N=CW-a8|{Ct*o>UAe%8ui5m8xueQ%tQlt0kd9nWPc5C?bCf( zn^D_)H|dNu^LOGZ3wLj;`p&eyOB-&90*#c`Ol2pj&8!D>>VjWSLxb&KDoIJR8hSS^ zO#^jw0&5BWev^`j z@t|dvwk+a`1+j20%<_5%lgtuWeYVn}BSESAG-ycF1p5dYNRC%ZZ;{Y*$4wj$d@2yB z^Y~G80jFEy{bTf&i!fQYX6gdLqesP<`v=u9ONsajir3d7Vf7Pa;t@{{ihRg0VpNIG zO2&d&095;Mmy_ZC1EaMOFldgt(~bqE8?O;$kjYkVJbat2~vEZ$e4Z`Q6gSFfWaSV%HejN zc>+dKjW`ZBO_r`cceOoN>+T!iLYFle0At}+eeSr#@^O~NUiXxmN588yc6?&$F7!UX z#C3dgsUo#5Fwu{G;>WZutBm{pa2~}fImokBrQ@=3MEZW38*sa-;-zLff+U2-CX#gc zdOUg#-p*<$oB~gtx}>O)o-_1RMJz~Xuh!~ePHXZ<1K$EDLofq*(T+vStLMPd9e$ix znN*~8BJnis(Ib^aGSl8GwD-%d_Wf@D=GuDc1lQ*?Mz3J2SnHxC;qcYEV(FLS8$5em zuJLkD`RwjL1&-ol@LeN7S1v;1$0)og3b5G$Ofw(>>bbw;o9h)PX{l-Xmr>XBZvWwH zKqj$hYupZxvaxk}bn~Kg?z7Ne^5qT3Cxb2XlNfaj>4eYPYny0c=R-Wg7}nLahyIe6 z8a6kcY}^>OZG`AZ_?1xMwl2CZ9+98M1U_moOwL`3m1xQZq}jIu2BY?Dj%(m&leN-S zChzekN7wbl74r_;-rejfl_L3UKf?B@kakCaL9xqT4AOLe$sfGd9GAZ4bV+wT0;+&d zMlR~et##&ex>dM1Lb{byVuLIp1srXft;5X^8R@gxV*&dJ0U+T+v&fY85yVqPoorwPJCS^i-PH$SJ@Bs?rTbyN&DpG>4k8Zkl7Bh6T{> zB)V&TBf0=G7jkE|S8!w)=F_~WbaINlyg})V*3Muw;5nwRRNd~sa_O-w;4n~ucGus_ zzKniormYl;o=vkccvGAkb|z7H>)qk~h&9K?;m`3LCU?s)w{PB_C_4K-cmQ}X&+)FO z;HUum?Hli}^~F-@wwkE0#0$epJ?E1da72t}c%h zH!pNv=qUzy6&@K%*UR#V*GSJy1{XL8%6BtSPE1&H6_~ySS#r5T+kz(G9&_Vf*YmsP`q?!MHz8+KxIjNMz}_n5}T05>}1rV>D3*s{6q+Hc=G6wPt|*`@1ap1eq1 z>`6tHElXAb>19NArRZR(H6(jyF$TYdt#+gA^D18+sNgVe1?oOQNM7Z!`vJ;A90?$@BRj4pvo z3L#sHXsU~S=dookWmaclT%m9(Zs^=Hcl2y>UQ| zmYc2$Z!T0Qh$hzs4Mq{(a0W&y+JX}dLleGUHfR>ep!0Ni&-3ox7R2j|&4yUG!!E*; z9wFSatsn(RvQXQ{?KWp}CM#KHZ1$TjHU6w|_%hQn)m@gZ=UR`|HF7#PieUE5PV~|h z=10C=iLDip@|DGijMtph?n^}c9vXbe?U0-uA>hA|X?HBsiGOn$s03BgmH4@lvI&M- zZd85QPQsf6B)31yjdVrk<;43;D?{3!71L(F+m^WJ*{ktWUx^GpZX+n>-U$0D#nI7{ z+8#v4$`(R(aw?S!Ry84yfwv&j@b1AR6)#Y_6rddi4e+%e;zKE*$RoxJI45f6~>lv`29ErEVLd!slnsF&15`3t`BReO#r(lIg+Ds)%J}*eJY)z zl%CRB^H7@%&VQYt?d5+ZGK`)U#*KLOPzyjz+7vrN6mR#5v(D&A_MhojRCO zTojo6aF!h!COgrD+fE7b8Wf=5aFFe(jYOw{I>1z^isVWIlr!^>k4&@$l~b!@rA;n> zUZ-e5Y(rfp48Q*|GlJiLTMXPwL1g*f2@U>Rkv|z@nZ8k|*k_-QHLPRc0`|a156m@ok@tB(88*Bs4{y{iG6yjy2Rms&l13 zL_PNaziihRWXQ-Pm=`_F1@n=q`UH2`)7#Ps*O9+1T_186yl>UioL@d^cy1nOec%df znbhpO;a-0{)^dIZ17%nw59a2ZI^lGM!ETtoS}cOigLga!$%7J*$612=?i1d~>*Pr7 z;nI8VSh{j+v@r$ZC*L?Mfz&!LkAgaws0*Ld3Pm;+ooGi3AbXFY45KBX*=NJjG!n6a7*b339mMc*_W;$&>3F1$p!8oTOR$AJ z%A&)T>Qa9b4i55Fa%pX1LIB{j7x&8GkVxuB0{<({ZY3OO)9Tb8PBq}#JI#*OBym#L&kqo zY~gbzQ{WtjRnjwz(P;qE*TP>Z(DEWm5MARC&Rqh7%pX93V#FbM5>zkTqPq|&Ts6R# zhLKd5f9z_cPFDNQ^b28xX7~~ys6m4qBzGXDT+Oj1B*C-*zMK%HlCMqIHAH1YQpx2H zKYGN64CSKm+EII%B}GL|=s&Df&xX|~`(dcR%!_ioX1!8Ga$QKSox9$&L68^Tc8Gtg za=;`0ncqQ@Hc^q4uX`q>Fv$X3f;e|_k0rI0)sK4|${v_tBszvkQ4`IdvY{cLzv_&7 z<#j%iz!qtG`chYzdWitojSQ(UCuXQ5(!m&0p(HJOp;!6ZZ5^_X77M~E`Dwk{+MZPGr!S3sncztgin&%WPgj$nqODsL;mViu>}ue`jsA_nF4GD z;(eLseuP+9v0Au00Wz{rhrv>)6Q9%~eOFe}0<~|RnH6J(d9nsjmY5MdV-pY(X23)A z^xm00cOesD*vu=Dp4+np*~ktZO&zVdq9n>~J*{PObkXlJSm3h_-$!-9A2LGkKhz); zNGdif(9_lL56RE-q$|;_&4KFkNSG{HHR-s5cDG-Ho6~D7!YK41kN!9)b#**S0t@M=fmKGbYfKVty7#*!#rU!8bFNhj+zx@4rB%&udYM_?_=*>>q0 z8>6fJ;W`7s#D6|Bp5J7y|J7^Rc_Q<20cUqfGTMum=z7|JH@}s|)qYGc2Av8ZqT^3} z*@(7_@y}5D>ZkW4QmhRRFHb-`Ms2)p!Vd51u;~jv^wZG-KME7(AU^aXDs%BO-57Ou zIp@JYYi%IPgSa^7~*>V zgo&_n9CECOfC18nBZ>5GU%&d?z#A>P7|=O#q=l#n2diHA@@f1<*s?k^R>Dn4FOSf{ zve=5A&D5E&5tcBTJ}<~is7beZ{M>iiW4xbpk5HB#MHMf|t& zFXe>I&ssjNtZGR{DVf>3Mqv7mwrPA)E67DW@jZqYrWE*)dBZwxYh4VtptTe7r|Ov{ zxWW2}P5~Jl+YcFa0YbhhJUwCH?>E^8*!bYPu=yio>i;!pc!lQi7@A z9&0MzwghpSQFmaOYa;)rvp#3uTYPqtmDw13!`(=IzhV%)K@*lr3z?F0AEhGvs8p5j(-csw)WetSA7=Z5Ara zDPbLwgCo+kA(0|;D#9xjBcF5}7fBb0M;K@&MN>TDA2F=@gV@mCxnVSBG5>HOE7kYx ze~8MW;CU>r@5?2@O>$>WkYhDnR*#p582?AG~wuwZ`F7XE@ z-uJ)<#;)*~0GCkIkB3x}F)K&H77J4AHLo* z9M0~G8YjfWgVCNS(US|61_wZ63mF+qKuX( zqt`(g?Y;BAuK$Pkx_;izKFsZ$efBwf?X}nH>V|lj7or0sHIs)}s_H%ctuEhUdS3#W z?@FQ@4iXy_CO#b_J^4K@eX_GMqIsNmP7-qBER3h@W)Uwny z$1viyp4_Q`Ck9(3-AYdY^_h2yW0>|dkNp6qQZAxu zI0ml4bNK3=Kf?i;2k^g+Rw^?ca8l%oZwNWf?c22qev0=XNkh)aHZeT8v^24y{!=>3 zVRV8M)V3;e`3@@GY_b7HwZGfbN4*&YVOjhe-S1iw`~*2VVL7=#Hi=z;u`g%@VVH8c z$2s`npW-X$*|>@y30#s^{QMgqLwzJsV1A$`k!IChNuP?5Bc8lpBC4{$?Rjd*5m(s{ z5c*AQ6cU;U_A_Vt`6GKSep`-QMB}xkB>=EU#09LzkgSy+Ph#t7ugw3GR$EEI0BcJP z?oi1(&qYiYA(C`0ZsQ{~y>A?oclFdSHTu|Bh8IzIhlB?(mdQA?6za_XZzSOwpAv-E z5KQB{0TdzAO~5@z+%R$q6da5-O}EIDlpkQcj-e%u6v|U+fcM5 z*^ov!=7^TWFobka<1=Xpcjvo*x0mR;~OEL;yqg+Vr zP2Uxj4Eb0&-(CBsPpFAR{Nl`G391Fi8U_D?Ni-xE?xJPxMbLuci$+?ELq^F@V$ZE7 zs1R4pwb)^iRpJcrS5_Ur?nNVfs1W@{zHNgTgVqVYT;RMi{e;3xbCq3?u!!GQ5Bl z>{Dky*w0fUoU5`BkDO7#$rL0C(t{@(6nn$v7U*mEg#Ahl&VD-FpdciV{zo>sAk3C3 z5ADw&uc1igl;wdBXRBjG0I4oPrC(OCC(ijchV$MHkcW<~8CHee(c1nZ7p;Z-M7L74 zX>`fKjTNJj-c2`*nU-T9lE{3wyPFl5HeE~}bx%AK!R9I-2nxZEbx@)hu%2N9e! zw$w&Wv?BY3oE3d?OZ$#qKa%ulTR{iZ8xGHPvE^=Ka|Dx(!YGK39ZPtRI(Q1US z3Wo}GfoW8iJrA6`5UCnnrNe1c(Bs`y3!6;Un6`%F%%P8 zAcCbVQ1(X{uF!P*JM=y~tDw8_rLwxV-=$goQs{_okv1aTP|L{arGeX2v*K9h5*1{a zPcyStG|Gpt@c@pXm;fDAii-doFe!YkQ~SF^Zv!ByaQG(=$&`WSBUf}^t_;>boTLh~ zCzEThpS0CkQRf0hzw;2N#|93Lr{4XPtb`T`2X?zrP>U;h0aTG^v)T?NbN2l@FS`nK znGABAY2+DtoOOeAb-#vPvY`3GCIbnX@?I!iO!HS~+`Hh^0&ubi;oP`?BI;lT*Q|7; z#^PU6O~)I5mN@(o@%kOyc&uofjl-W|Jd%Gu%73K@v_+@NP6ke(YL^3%0TW~@KLRX< zsep#Agh~Bvk|wWu$u-BNKqyrz{}L&`AQ>-XaEWZc`yD48EI*>Y#b?q;Us6oEXryRKY4J*6KQ|hXEx8nGfOO zffYcm1wOW5)Fhgz;)BScs0o zn5tKl0H8`+dx?I!R%D9a+O&FXw1bs3af2+u0nu`-UFO5!T@|5tIiONfu^N1cloA`n zENXPVmbzkf*i+9x1mefV%bl&#urIksR_WiZyet%#?A~zt5{zzoA)#@-d9W6~*dYHJ z)N#~M>(^7oWaH@90R@TxFVYB$RwY$%jg#vluKSAsFFy2&x_q~eAVzW1-dZHQicJ7@ zw@rnz-;Z*znt4nY3U^jF5;uFJ6t$~TlH|-0w|m3b;GUo(!uSdlc;wP{<;I`8r`>y_ z-+HPsiiNRWQe`%BClJpPV{jpIgeA!fu&!u%*>JT(*136lxz@#mr^c<9*t@Spkk@P7 z)7BZ*M>{1o;E49~Au4b8QFST+Wp$UK2(4HO*b$`dGU!HH3?L6)0WZ>p=XMF`f|Ga=94cNX}-ida$ey|9d0qs>_`_;-B&LYpc+?lQi zN)U6WSz8ygo?_{Aukn>2#J)%BfEKS4dRU2YO|wb1))^O&jOn8-+ROGQjzO*oEw$`^Ex7cl4Ysd#jvV+6lNii+dy)`SK09e22zyr3zm*K2C zK*;HbIncYA|0P6`VERw8PdEhbf`fPrQ4O(Fs&L8(E{#@hSJCleY!Gxh%3NH_c)zB2Eg*wadO@1FU*)W?Ps5? znh{n~ppl~{V_iVUF+-Y7XkoZEYOgA1m}d}zq|t5gqzvc_5sLKkG&?)CiPTKcp=$pg zK8lMYPtXDXliNrAL7!737Y!fE;XfFyObE9Atr;NLBWuhmF#h9?0lPSo73e8(g8WNH z%14h6RfH}LxY&k3&0d-PW`M;P&Mgr`FV~&u23n!Xe8jqtMiLbEu;*~B0Re=Kh7L*9 znAf`#GI3|N40JZG5)s=Q9_MxOj=!H&O<9CX zQOQ&q%JxaFpm3b?92cFEe70(mR7da+M^@-ti1efn)$PYOo+j-#cwMr3`Nfe6is9DK zw$tW^$&xY*xluOBDL|uES_ZY*KcP|NBxd_*nPkMRi;X|CRc-pP@01PO7x%~qcT8}4 zjaE}ySdnW5uuYYu`6OQhC`Tq(h%=<cT4?>SRwPMN`PX=if*is<@ZZ52He~W^_U_3Dj-H1? zm@rP0RT{3TBAmZ1b@#jfq%A-O{42R{IjejmihLOuyM$m_j>(Zeuk&dolwf24XFoRB zsCE*x&Oa)1gTglK?^j0DD>2rr#^ijsEDtMrN|=d#pKd5pj{`=MtiPrg;uI9{mHJbU zu;$qq*6{4yr-bv)0QTw{*xZK=8LZm}j0iSPNrc>e@J_-hAB-n)h_yc1z)^cp^%JP5 znpmYiDg;~Jr!eMzMQ6qU5yXg;Jp`J01+>YVY#@KNi(z^n5$`7e;jsoI4)pIDqianI zP?z0c0RHT=sM4Dm@A%0rxsdf0-R25~5vmGc-ryr9G`|{)*&@hw&Y_gjI69 z#08jtAs2C8Qvf_z9AfDN3q3MuV&(E^lLG|*wnZ`eE;y#ji7;u!6UrKO4oLVRFsf;2 z%|Qn<>RKRUqvYRY6CqUq)Y>?up^pGyKrhD0Ds)mnr_%;GU|dsa$QFdUn3FAzR_dQj zIPDjRktz&v9ilUMr0!)1-{;;86GL|g&nLZww@TFe(ee?H*y9(*s9<2YOuS7Bi-g4n zh2A~{<->2|J0^;5d2)gls=07+1*0-|UDR7;KMo^z;|3i5lX!S9KYPzSl_SQ#8|dr< zfJU+wyFgrRC4DLx1R#`$lIvg-YLh!B67O3Y8aN{o_-idt-sH>Ir5+uw`tw-MXkPM# zN3v}pP{LT}DO7~ghp=wk&k1n5VG@SoYuck2a3))(lnT^gh`vHxgiHw-P3f0YonFx$ zd^QL4@JTZ9`Y)Ma6(1CFwB`|b%M`Ht2&0Ec5zcm+Et#Tbq2rN(6~iWsmQ?k04K~NW zf3*Um+%w^XpkreN20X>P^F@Ev7h!DNDX{kPYvxy^nJ?LBB^C+gGK+Jx$>WSPGs0M& zi0=v8Ey5;wY9jd>hAubTo4h-nZq0l_&*+5c{>i8wIS}!DteWmRb8v@NstFHNtXL$wLKV^>FrA| zK%5&tT{A+hw?V?`ml(0%4_8cAF3mCB=rObn?i6Z7z<;BvN-xJja&7e9@1vXk!QXn7 zWHb<1pfBn*U`w6(hYkH(*(_JL)pNR7( z6VcvRwP=r?vYfcI$h>~X`DP(l;sqGsYxOq8LlPwiklIP3)lYlIX@1*t+emYeL4E0s z%O|g^P;upn#x6L9RX$1GSvZ=P{S*%&+r8!|skBjXFCx@_5>NScw`|#!@C@L>4MO7+OTsXYYH|C>2FM!c`grT~m3idR9x#r_oFH zTq7-}!TUqDu*?fEFAL!(&{vltOg>0%tnh7sx=qN{L z9xeYO&|gx)9wkPyDXaaJW8l@2aPCzpO5-B$nnWrUaMFNSK>s*%z{%Ih0*qNUSG2fJ zauNI+Yy#L=fW%@boe$rS^GMzhSR==K(^C3xkH;wf(fs$4Z&U(H!~nb(>n5o}2?8-i zu1!|*X%sM{+)aLx`$U?jd+^2nQo7Fk(L&&=ZtH}yW5T>izuW?*;}MgGQ90AU>(m&( z?(SMgPBL3ur3u~`Y+lIuoUA}JS3jz10u+0eUs7%k?=1jm@8pgpX-cChaK>)xwIP;d z{!N$2;qf1%zJx{p%g#)roT%u*2kphN%6jP z0yUlUL1CJ!?cPSHfKN`DkZ`GFb6E(f(tu+P1Jq_w`l(LxJnWQ9yh0e*Bzde9{z2!x*&Dlp%r@#(l46#E+zT8!vwkEEz$nU?q*TtdM-9dpFE#;{21_HcRoPa+fy^ z!M@vxw{XE3Zmh%=d(S8C6r(VC!kTLTQMhD9#kRR7mu+TfB|XD}9bcj}cP#w5YSXAp zJmZPW9So<2qQ5tn(5)8Jp;!-w$SYm!l#Zh~14f#TS5;5Hr=Z|CYE^lx2uuPZWXA1J z!qyMP45AMAowDS*F-myy8sMx?DzE3Vv`@3CUy>SE*8Gb1R>^#p{-Wj*17LpQ^81v1 zmqo*Ty4d5W$|&>!TV!Y=<3wi&5a)^2PY)e~CjYFD|}Hj|AoOgmX&aWxCm;=u*=K*nH1re+J5=Su z52XelGU8%hGe-nVv(a=MA+(^e9#|*$!>h8$8>U$!_z>Dl4zq??et}j0TUgl>j1*xj zFX3u(0}#*xq~RDTQiTD05(!hWIMi-3AI>(yO@w=Ee~Lfv%a*3TkX34v9a26tv?BdH z>4pSRl7sI?B(OwQwF8i_hq({ABm{2clQ@d|k)M6AqRt*pZ!6zz*P{er)Ak(x_y-(U zo`_ISC14-0pQyA{z-<;V)(o8CeS51*AAWK){Z!0?uENaB}e3j0hYP6~i= zf)y4b(qMROt!pvhTqIhxm(jf;TvkA^htt65(56hig!xbSO}UZuSH*>I$Iv|~R}xdW zD(F@~6RhwarrIJ{oG`i0R1t-`!Z1W4r&R)$cJaDT$>D_Hk|7K?LU6vMoeDXce6%Y6A z6!0TFZKzt{3*Vd##nb{kd@VNNRLVoiP-=&o3|-~AhD*L~h~Fjoao4FFVHRi{`Y`ws zZ!G#~B2Sq8UeD9X;I$ zTSqGdTpEdyA+1b{J$!}8AphQ(Tav8wj_&P{F?Ni*OguTf`W%3v@yR}IY=XBC?FF2- z))V%vC&X~Hg7G9Dy~I~+I88zo-Z>93NZpYeUYqDEK|5OnAgKNCs(gL{StYENOR6n} zDq)^ttmj>=Aba6ky0s;_RM-cFF;xJi6B`~L4p?Tq zrrOc_!sKvZVi=oC2XG%;Kt`HS$6gtSl3`X46-ED=_}~c>9uGl~h-!(JP9|GSV7cQj z=PtQiSj}q@u-qeTY-N#f+^#+KOEKe^*L$*_$p{cM7ZET70{Ry~qF!g45_B=NxdLD1 zIJtEYV0CHu`F|34Dm4y1K*mBt0bCjy6dv@#IV~ut#v{2&>*5-~a(fLZzX&s(kPm?d z=?BYdyc{Tk0LlUGAXhwAD%qR1L)0bwY6lp@e2{A$l-Zo=diVAWbjW22h%Kc zdSe{2&K_yXj{%Hk+yr90h>llX{?JB^2d|NVnzO!9e`$;4-QCCicC(zm8}{d1u~LKs zV^&{cg^>Y3yNl-L2RiAr05t(G$-*+mSIBi{5y3|B95E!W7B<*>r`9+|pOZ(0!+&id z-JWZ4_Mer9zbGv>Vks!S2cx(sCaMwMvTR*OKEDt>Y$AE_O6Dq)W28P=ZmHS3=b&G zo?HZz-S9GZh|OG03x1n$Zl{`cF6d&S#(|BrVHZYHXmAWVqj^b>`s+DOYWPIkS*$8s z9^k`Opbshg3ra*2&IngaBtSD3YYSE99$U*%T&0Yge#{Q5o&-_Da?JGiKiMY}2qZRRoa;;Q zTpt0Gp>SvnP%T@-=0>X~-U$zQJN`6|@9RR_+xqnfP+hU$imVp;d==?!u0mzi;a*7| z+`%tZ%We+dXku*hl&@fn0eqI!|`ucENENDb+zaNuS+f&mCV= zd0(Egtk1%Ez%wfgn2*lVY~4j?URoVwsH&&w0;ZB>XC#QvW}=LY**O<+_49NSB*3)s zv(A3W((dDeo<=_AdkTF2$`L&rXt>;UbKcL|&f2WbbvZqSrPa?8>FI=B5BXS@^E9us zR=qD)!r zsm>^-dattg`cKA-N_z1fkDLwh3GJTI10#}`!Z`x0nxBMhFEIV(O_)wf9ztL~)Gv?xl_ zlp+f|b$K@Tke(gzP0mLQLLT8$AcN{E7EUDczQw+x&T6^o!9$&O^gV|PCe2GwWk0wk zDr?cO%OUs)#=5D$`=RJXS%u4OFTv{9o(cPJqt9QLm_GAwsHVueQzq&vW$E5&J^l>&Hi|_NMW-xSF0_QTNymTC<+h2!q2k%Mt6T-|#|G zH$A3V+xbD-$b@}(kCv3AO8mm|!<6Z3@ZKkFq8>*I*BOS3D#|Xfs^oFW7OHi@WGHb6@0+A8dV(1>!%MMb1vS$ zX<$v?QFEb0#Z%mAcYbSeCsKJ`a$F+y;QVXR526CQQO!iKN{i#9J}klGR-XM@qpZ36>P&%uukSU z35x6qAoDR_8s7LET2W7DKMc~&j{f8HIn`Cos8Q>F282QUS4^lt)(a_X~r+fBZ24@;T?VE93U%sD44!QW1eP-0X$E ze&*!85;^RcVkl}ivbIB1P~%Xk{dBS@$@aMH78P~YGPPxO%>#=9m9d;>mVH{H^h3Gy zIuCtCgiCYYH@}g_ow9=h$QXU^6ld%h7n*x-PvDhS$M$;7*v#UP+*d4$%`L1>hf2-a znspZ4RijI^6{vseoN_k7yd^|GsHgHd^8wqWXt)F%#Ap#tRm^h@5nV|tj6IQyyS-)D?iN?2+BU53KYjF4 zhR^n!+c-xaJPzf>Vt?}@m8nPFLy8EI-+h_+DlV!$RQvfC(c&cnSUTo15bi$?tCVGD ztfv{C7wjDLvX^pXSwq_|;_Wd;ukVUxi@j=$@o(`f#|yf`4fNOWYlgk9S2x&fj(d14xmDB2OLtTdo(hbR+Ny(UvzvMyPMY&g(ZYS9#oo2_R zpYX*myy9dI7kI6P^WUYe?%!jp4Br@_wPDSK8zgq7S97Uh-b^IsYjBR{sn|^K#4dfE zY<#)eAC2qd?xpPCRV!Khl%KA9$&$=3Q2LxF-UB9!(CJQro?LgkntG03h=p_Q?J3NG z9s7R}7n?r!6(-$er3aiuM`V)VD>=SQzB!2*S}A6+mUk|y>g_aRzuVl<`cbQ_F>)?V z&78&iG3K+q+MA+=RNd_X%P$J5h^xWz+Bs-?m+Mxbfuws+!11k62(AO_J9n3!St(oB z#s6R4i~m~UKA%1qq?-wHO0RHLNtYdEyXKRlXSGxG6aSAHO270>biAJ3@>re9w-#CHtf+ROb@ag>R-#M}qVFEm<2gP0^WCzh`78_?=q6JUoG9e~0n zOkolKCS`;L%(3vi*kWd>_(N$?*Acy*I*z*|uPisVhNeKpeZRFNbZwnXbo@03%R#g6 zWe-FidLK{g6tXp_f8r~&+jwbrYb4lmpkjS&#&_LkiRSLeY;>6^0!`uUYS^Xm?@_SKy~=+=JXG#T+nC%G zXM{!25w3jvVy(l$6T+*-F^vA#b(GXYydqD~vG2Fd9Pb$$XSp3uGM~Av)k}=_ln`K- z{=sEsIM&;`P0z1GxnDAJqd}V9DJiq*{-4jiS-6hg56f54C>@G}2Q_HjE@&MhB>;r*Ugv#SZ*k-Y$H|)2Us5eUh3-fx6 zWUdC!mYdF&$jXer^K&0#%d2_yjC=!Aavk>~r=7T~FG=jX-Tw9MD43& zmx2SSPaKU%@s;`PTKXRH_@1mS)}BDO9HM7Tbk{fT#z-o&F&~FI=OcJg1HQ*b<*R#a zZ|T|WdU6b0=@u!kEV5i7n5%7kiZG{7vfF2CLQ&jd%lzRpFED;HO;71{|9E3JbU*0R z#@?Lu&1czMH9p)oRmE!Jvr@?(3Qavp1P+7X#U@g3hKfv$ru@z%jTXP?QeLi^fbD!kMz|1vLWLiD zEFylY%lA>8Ck9=7ve5PhOd1tgx`Gb_=rEq68DiJoy-QBwiLJ(qiP%eGm7s{i9+Q4%oE<@ zDN-!%$Me^8R7o3WCJ5yfr3nAYt0ABclFVo#!XPkCxXX=+ba+ycd;- zq$5gLdqc5MFET7P^GG@w_# z>1daip4$D|jTMAQrrihGt%jU{-Cp$Q-;()UQU3^WKhvsgJ zAJMxB_2oCS@4tL9M6|*i$h*gVV4pe_TEV+Oq;=hW{V&%T6{rAem$(vcQOw=DHc21- zFx25Ye@<5htXGr!_C6t5ATlm92vg6sf9Kmff$y$&A{7-Xqy*o#X}^4!NFIL|hvbIa zTgNLAH5~5GFKIuUIy1iSW(fX56(XsW4BfpBdn2#w*_?g}f2p9rsV8UrtqTEiX^bM|a(F|H4GGxBZz@ zV_>M~S+B81JCXaht3N8D&@cZHe?+kTo%y5IyQqPXYSHr=LSY&nn9y*~SZHuO_kwM0 zU0>9>GQhOYdjK-ZPiX!|B1z^{Wb;tFgxD^Lj8hPl2;MKz&}uhBv#TXHEs~+h++Vw0 zdZDT8Hhl`l2jH1Jsb?QuJi?W}qkC7QCwQ|ZX$lo`tshtyr{AbeyeY&4KYIQ-#a8Xk zcLtQ*#ctAWpoTCu*=*D`MY-Bl-@>?RSpFGW-~=@ zQBK+lWVrQ7(<7^0;N$FPv%v-+S&avIOtn<)N2U4InDtw?ZY< zcKUyg(a!h6pA7U)g&`P26ORr1tSA?6knBZkT$Z88MAFgTO5&|+tvZVfk=L=mf;l1t z`tf0S%!cu5297#JM2T(jhAB+O6`Gnp=Q-ocbob5xAU8y~cf&L?kD5+)X|7pjr+TZ! zzU(s{1OLt|Gdaq>$nWn2IzdZ#g}32xS(C#dddOgdy%JQUc3Qf_gcaGnkUV;aibHCE z;7jr1<{>?M5)_`L7w!IZj$v%xZ~*oQP^MOGm~Dw9FugSj%wdbs{d{igej)4zf|Kg4 z%?ve5EhY>!*;Pa~BrYurDHcz^1iyK*X@}74{iY7iQr;P&d`SD6HqhY1GCAQ?UWIGt zwt@I@p;+@}hG^(qz9OMZLof)U1PBrZlj(5TH8)Zh&%9f-J_Ke+^;xz$QH{OHpaE^D|#uqf88O;kpZ>$w(d0O` zF}ZrgY*0glyqmKcu5lR|VX<<53y61Sb*sgqQmY4`;$KN?MWbI|(!Uf%XHn7JK!c%2 z;X1+^gg3%vdWK2||E&SqxbGF40Kv)`c`pCaw<*9Fn}#$N5hQT7iz@uc;dSa1Oe~cd zP8KpTL2b>LT#%oQ2q;ym0kW35cYEkjT0AeO2i9fN7W!Wdf6!hPP(HU?8^UNo81iYJ zZw1{N?s|I*-r9Mh_E)A(i`(100LV1Eb8U-1Ooq3S%1Q^@b8}NBg$DY7(2&(%edA_P zg7{PT!GRxswQ$NUz{U&qk}G78+y(H)ISBXx2=xsQgzXmN53`iu!FbOpj}gEOV)gIP ze!lQ?VxLT*{8qF4!P=Mb<(s^PznkWcP5=HNpOW0{4aILs{8^uSkNqF}e0U`yM<7aG z3_R_14T{)N%lKsf_{PysAIgj#vrl%vkHZn+7awB`H(Q3p(dRRW)g|(JM za#zlNud@9#JdzO8>^?YtCQ#Q(9=DSy4ootuZs5u-?I^_T+ zVXP-0d1|lDf0uYDb~|(%1ZWSTlc{Lg5`z!cQW{@ud;Y=9Y_!ze?|Xk= z`e0jG5HM3QNjZqYWjJMJfhR89{^}F%ua8K=ut%W7dKN%sp#o53{s<_;{8doJmFYkG z@PNfiO7Ubr>2F|mgi(0490yqX4ZYqx_lpgSmh_yKcj-80{h-)#)Y+}pYd9TtL9yza zbK>stGJ#8e%n^{8Gj$wFbs711ysof`Lvf^?&*faa2P-_k=>D6+(=U#H7>2$_%5T-3 zU%l4M^H&&pAFz>qYzc(aJZ52Yh}p#8M^BJnS9;H6AoL|NDEc6{e+kAx-zcKnJobAv zEBm=qTkSdX#$%go9%s>Q1!Xd(hN$eEYcGlOY(9qoo=H>cabA=;)~nun=T+|asqA*= z(N3{)hT<+C-3!nXlv`tdx&6Zt=KnJsI@-rO))*u&rPL0NB^H3cj$O1~iCk3>>I zl}vU{7>d!54(Ri*sp~se^{N&ZlknXZaoQL|?nemI1GQ=8No+ zm52K~fjrk+W!Ign44vmc*ddC3j`f{Dw9`XQ9j%Wv8|uEgD7E}%``I)Q>?UOA2WV8o zLf<~?McYlW6h?t7;21y{A5i^b(bE-aakljCOc`EtD|xyJQVV$wNbcPd1w49O$fquL z^6%MwkJ_)!xwr{Gi)|OC;Zw2ejF?Ch+4RLErHW2V>Jt*^^vqs1?5!m9SqZB8r;uFqp&>Ud+^CAb+jsh{GtD~taB92QW$%NwOTvAnEWohg8jvX+tZ+d661J{FCC zW}8Mv43(3xD2|1k2lKv8A#X#MQp^lE-0SmZ(n2KR&-(7)E$=6uU7Xpixvcm7p}}`5 z&uwHx({ZJ;*o5o?ijKks*UhZ+9=+)T^qO4DMeB~>^8=xW#Qn4Fu=3#$ztg=5*od}3 z&PKUQAOi)H<^eC&Zs>DD#`1@Du=41ZmO$Y^$(Mk}vsx=RL!S#TSk+9DSH-vG5e!Np zopi9CW^mT3{PFB?rf~QlzW2KTjuikmxlc=Ayy+x1ma(oiDCWzc>Y|m%6MOs7ijM)e zG*RX2EWr-76&W>bn&z$0%cwzZ?&Lo44Yd&YuiTx8Mt%NBQR1~@BORmo*R2nomk!>i zWZ!b(x5t?$NG2Tn&MdI4aqk!&2q2!>VdW*_{&?|=c|zI#mGG?2yZbfm5JjC;Q_Me> zF&(LH$4^@EYE(${^r6jrskawdbBY4*@z#wuIb8 z_2N6-kATwOa*n}bi@oD!cN>xwTu&0O@po-`K zhAuJ~vUTYj_0G}x-6%w@a0Wgx*yo?n|$l z2!~WvG0e9wM==}fD4zi$hk#P@#&%lEImvBRJPfM1*|cpY9A7rDQiuBhn9JbD8Glh@ z!cI;yT#m#Nm^I749yZnhT5tGcH*K#4p>-|peLUYwsi5^rM7@)$P)8mao_Um>4|TjXn}LJR$-N@aew>?0`^Z=+wN zwxR=qNk7F=`Y=tD0pK}sc;bLgvN|Ph()QcM#uGU)%?$rZ%oDP@)nY7@cA(-pvNZi#Nry?jaLGQepN`; z6W>77>?hl!#Eo2X)8ajK8u%VW%o3fLD{eSte4;5IJ4_Dt(?K|{^K8MkgRZ}t z#8Y0aeN#LfpZ`eDgTyzzr#$M8723FIW;t5=2ri-I<8got_YUz|+dw5MWQo5#3>{cE zo_#)u+6w;43IOfdQMiFUqr=j&!daS!dz=zvIiRt$eu?v}-E)WK?a&jePyUDQVK=0d zOg1K&ZA#pCZSJeQTLIqmr`1lk-`zZ{$WuSf4m;Y(8u4t}{#_}j9%eNjdbZb?mg7=| zlnTYhiNnF%3LUB6&TqW3F`oczIe>b{GYfEoHhpluz4Q&V{U_+Vo5I%PotEB^U0d1# z`N0#h`LiY9b+_;P#2}&@%KT#5J8k@eBWUkOp{t=;=Pv5F9-oB+` z*Z}DuoFV4i!zIbd8Gdv^7T70~m1#vA`+1b};WYQM_98=m|AaYeBgT84$SCuoO8==0 zs(t)tQymR&N*xKSaf9U$pqRfx>cd*;7pzC+rw*#JRWSPZfuob0z zAwTI}On6n5n(^iWLXmyVh5ru4p&q`2((;!0EVhl725cqWKT7I&vos;-vVHcA8~$I* z)*HD~z3n7>4)}Tb?yecC-}>9|8-jcAOGvIg6&FDX%4obTySh|Cjg2GYufuNZWT@4JhmVQ%z% zbDn-D;zmE2oKgo8nUn75AJU(WTfCUTSH4^Y1#Xnp%)j~ngp_g3zouIOKfT~4cFa@w zPh2OFCUk87W9Ggt{rnj$<)`VNoclPXxU1XnvPRNcN-fl_^lY-GUvB*ywr8$?iZ+|?{HpIT`AIx>GkCAysPorssme!*Y?(adIChHGkWJOzNb7Vjt#!|r zyLQq^`AJy5iN=H)NmZ-ShmeadFBx-VykFb+WopS@AeE z^CHXC@>5c|aA(_J`vk-Hgyqa55$VucYWD06l+y0L0)o-d_=(@pgAqWm6rE}nnsG05 z`sl9Z_)?7WsW)lAaD0EfW&rM)RWqc?@%TORc(l;8;$_mO^WezMm}B7Y%1>OB(w)*ZDb{ay1Z*PEk>)c~kB{T^#FpH6SdLVq&AZH^uF(w$*EFULW=@>k<9pik zb{)hX&T04o=X|vDaFHf>E0-f^$8swdSGuHN`sveSck{(l^(0c@pyoxa2l8lJ(k>Hs zRU#CHyr?}Q@m>t#Y;Rl>R{x_4{?LhGgOBNbZZ&7c{`uL7zWJOxu%Kd?`Th)_)298B zvHd$A4)tne<#plHq5V5okK2nv-cnlhn|}#yHnR%x7?iQk4RbiPmr&~MZq4SW$xybu zu5>sq(66$(P!w=&i;YtmN6UlAh^rWTo;8qoeB}H&i|)X3zWBhx1+KTVTlu&wc4MJB za5iSjg4TrKP2iH)c7P(wt53{VRoxk%T-mCtSG9Eb{org$8ZbOtuGw%mywbSk4Q2uB2MJeySNzdRdt1HO8?&e@3y)g03SwyuVQ`tNZ2;)ht`k z@lx7wF(8!-$mLp|Ip)|%ZrhH9w3ZO)mreNa?d55oiGV*zZ0)q4@A;~Ha~VN~tg#^H zY-2@7J}kV+M%-U)o53BI_B42?T*iCmxLa7fP{`ztnWf}K_@9?G%3i+LyKd1{8wJzw2~gL%fJal~jW)67=xSrqlVi2N=-i#Sp6Bv&qGu+PJdnz9U9~ z2xd+kXBYB$2=XNA)89}%Jg$}GGZsrOabG9}AGfUK$v&Tq^H#-PmBkz0DS8`z&nK5u zAc=+xZ=1;+zyZYzxJrDz0S<}q;TjrA!G1x})#?g}Ak_I5gK*oZ*>}VN&p7pWlj;^@ zs4R8ywDm`z6)-I&Ozu!GvJe?WbK0JhPN%y+8V#i|BmP(pHg7hnd?Q`p(6gOJ8Ep{B zQ^sK)&WG`4m? zX4aL0fPOPT%@NDsRHlW&Q$WLc-GVuGgu!{`W&?^|*9YFgj-}Oo87b~j?5;844qWrv ztt>+~2R|igz?4h=&$g=f4e2IEXCXHFTKmGk@CGkxt1YjVory`+0#@!~&Me{Jnx%7` zBQ>rB5p@G`Jzvb$|M=37b6|pmW7!6h%~sd{xq1DqFs`<%M!HaqAvtf5{H{#Gy%68+ z*5&Sh?oF-<3pNv?OKe>IrhBe8D3<8ihFCtbckJ_i3PxuWXI`lr(a*fk$;%9h`?trt z{XH9-PyEOGhjzST=9w?4CO;0$8-C*X<$heZZa?WLh&rcvE>Pdgc+TGZQkBci>-CjL zPnXfC_9FB_@yD&blX8st`R_$J^Y~xgZz5IezV=*PNw@x3h3H-JjrMp9+f&L#pLE#y z&DvgPXx0mUFTNgVNxi}&PlRBdl|SfLq>c9d;tl@mr=mxhP4deqB~~1GN_`jdvwUGI z5AR`S4Xjljd{SKc-q0B}@v7&QivQd2iLmt0bqCb@6(CM|9S|9WDgxkD37zr)xdGXm zgTP|yxq#!7ib0S1eA=6FpSx;dTn{C7mEQHul_9@p)iF9V6Vvblf;w&J99I72!r|N> zfVR3Hh|+Wgblo^Y*^JF$AczWCkcs+r1Too)yEWCALdIA$a=)DS!hdQ^J_J%nnQw4` z0D(o{?%vVGuUeoDtR#n!K?8%{c&8DeOp5`<7$E7~*n+!U1*B};lZ1W&iFt9Ug=)*! z_IP)W1Ys_kNZdhE~n0738iK#yL51M+FZjlrCiiKd~l+s)Mh z#^C2B#2sr~>}tavOH@`IpX9LjkB{MH#P}4yRq`?QB}+y+US|q{jVl;0OkEK-QwIC7 zt8KA=JGupgp~e>8S*c=P?YZ}*(!Zy&M>iKKNx&9V~u|!QVxiHaKo- ztsKLf`MX;rm8{dh#g*-X46Z#V*I-f$y#cAjo2!W~%B*@+lxg6TPnAkKZ*YFMlOX4E zDS9s#_DF@XQuYhZV)z8GuU@aPOX+_8!1^-@^FO#IC6%Nlmq>)dL{kX5j`i7FJJ4>>9KdTv+FaLL5(r~`j_-BHX~H^1Tsx8TxfRZ&B5{BW##G-bx*?QrKzhZW{n zCB&{Zj8pN@M~Ds44PYWvO@a+l$j6C2_+dHB<*cCKb0f1euvYJTc+uU2Oof|g|cY)6|m_>3j2 z!+S11wzrI6`vE$_d61zzQ?J4pRW3tx7S~lgzpJUI83#}&#P?b{#DK*|T4PUcnH%mg zciD_PU9`2H&c35`;Ia;-=(nBMB8}NQ zcdcPJmECrm-;8i~ewcb_@E{tTmUiz^q%`2ECO{|!_vz5yUB~~?=uSSu;Ldmqmt^`@bSZHg7X-812dk1; zcUig?qG{wpNo|jn>?AH5+}64Vf89!TDqRAdoM<9-ylAZ+gGM5M2cDT%Ttm8|Kz@?# zLT`sx}LM16Sr-xfuzQv+jd6(B=rmp`1VF)mS67USRh|2k+!os^f5TW)12h~ zBe1RFQ|Yd=4m-L`c0)u*s(($blTe~OK#$lSwPB04*nHfcj^g#W$?Mj8m`=Z-`C;D~ zZDTO6s%zk<^!5B3x*jcpj3yTxj5i?T)yB@~L3?m%-qHxvc6cRPc|U%#Fa*a?;R4k!H&BzlYe(&BLP@4SFQ%?H#@RdP6Tubf5_&~)s7^X+A z>2ClCxSL46fxGOOYAO1A*AVKRnyFOQI@Q6~E>VvE8bft14H-J+_=oZ<@?6R3V-cY5 zI)N8dwL`i%3haMx_z9ac_OP7j8&~7Q%8!6@`Z?~oVlLHh(DIAg zsmJ+f7kBAyl>Jf1;g)8)`IqIFE`gU;4(6y}9>kvm_a7Q^<*ul~$e@WOQ`?NuxuoP> z?c1KtCH*wfT0ic-A{(9|Y=k5)?!|ejt-acT`QPpaoyhma`p4458yn#_(}Yoc-lt1e zhSz%IovL&U6NN7ENwMtLWpUW^OJCfjoL@UJ=cX?BEVE&x`{J=8Qwz`*_SfTD8B1F&=mcmX zPB$9F3SJFe0sNT)1CnXeK))R&tSg2d%_O_SOaFUY@f~LJAm+ze@2u3nR=Z*OoTHM7 z*nkgCi?kZ|&wlT?SD3Le4l0S9PYwH}NwCXBOo0jbSDDo}n*$`d>X02bW*24ZeCG~c zVXV2_DoUN7iGOd~*n6B43ktFHz@yQGZQCqP=>M*id>}2;PNy{#M?oyzN2XCoE1mSh zE7C6wNs4U;!8bYZ8@xN-T+t=+EIV&5jTftGTXn@!V-~OA9$poEmyzBvi@0(JF;S^T z<9{zfb*_g!>*Sm{zTj?MKIyoTc#E-5*85zZ;y%YsxlE?B@@UVJy?l}FRZzA z?~Gnj&e=?whNj3ZP&^<1<=#A@(CUNgpx_xU)%nMninJdH-;{lClG3$yMa$UY;k@pP z6ffsP0`rR1uiOM@e4caa(-NTO_3sswJ)CSO5n~%Jy5a=RuCDxGE!oJVZwGDDgqHPtm~ZJnJ3ADzemvTg>r1phB97>SJX9Ni~iaTtnvl1ePtr zI|uX$AKmVKSYJ%QekYmjV5zXHSe%2=QQWemq;+N?;47~`S$g3*@Qhv{yPzVt#SUlAKdXiBvr3>MmPEi3SV zSbM|4l5bnUj9OpS@}~!+gUKubjuEW*pe%MD=#Yi7^T+W1?cd{h(Cu^^jG0(MOye`7 zWsh4vUQ0cIyYzG~aoZEylMnkp^#n^6(m)>ZIbhVis;-n9eZvPW_it;6a}Tb$+QWZi zlJ-MK;pyhb4fCtjeKGNAwvG?`Pa-mL8D?9CYPNn;>L4yRKFQg3B1OYqlW|z_DN7-s zinHIv+{o&dR${T-<9W#$Zxc|;?R(rMw_W*4aUAA zd`HHf%d*8_|Ama1=c7g|xqtHDr0UN1Hu*KfE@nXZ zl)W#f&#<(_Y#vaNZaBGzg)I%rfliF{Ev+y5O2q_6UjurQG1v{x3=5a#JveIcsM^}a zUp?&x);*-J8hFDMCRq|L8Tz-MN_S5yYY=3uf6qhb|AwMB#VDZru`9;aJ{fxikORsQ z)Y3`>bR5Ac4G%&1Mom4F8!W~pS9+IU*sE@CT-x~aZ{MmuBL^X3quBS^c2nt&bv_;9 z!Lb-5T^S5;H=KAdSS?!XxjXh@1uw(^!ijQ`5L6FtFuF_8lBgyai>bw&47YU!f^QZZ{czz&+*2O)=cFbJCxVR=g!;?0ija;;_z-b$ zzk@kDv=Qh{2i&;hx$elthgj^SA-LyE)g9m|Pbzc^A3X)UZW{qkfCS|AzSC`9Xb&yQ z&Bh=Fi|hUM70AHDhM~?bo?VCjO9%ERF0c4bzl?KK&-EtehFdFI2I16VTm0313g^J= zub~Vbqq}3hz{kXtHEd@6A)a|+Zqf!|e47F3YCe7-ujvaaA+TT1`9xAA&7 z?`@kOXS=eyKXEg65lpi12}xuZRCgY*;f)7045fu*B2n`zh1r4j>F(k808u2alu8~b z$ut;f-7Z()FcLk2=>BJq1pLe{Ve&S8nTN)v@cGt$j(rLF!bN*4zdS}&%<+XCyG92Dps)|9TM5qe_@b$G_TGLd?s^P z)ax^lY_^oE~d!T>WPjwTW^e$Y&GU%K^w3 zU$V#ofss37d^Vb8My;Vme}h60$C*`FH!UV0`~DZnH~Pcf>MXj6*_f@yimfb>T_H%@ z&bOBptJkwI>p#E0lWhB+$aWG4mj3``0BST%jy4TeZ0Y}6uQb;}Qh_#4_~Hz1wRML-21 z2;qnsS3Es^v(oQ1Nf^B|<4I)zVRgHioX!d}xs{~u{=mCsTEG|>47W%U8YdniON+~% za6Rusy@gXNUyG8w-CIqTUa4>{7}PS(G=V4JxE7H>-Zes;w3t&xx}j(x`Vznj4hL7k zOxZ7J%#BhpXIIAAU@uc{PRJlw!gpwrgLQM2msM=^TJ8wO>BH=h9#cly?Ry0HN-eo- zzec|ecM^`9Fv2h4unA`>ue*2yQB*78km~<}!qa#jq2y4qTLeFwUtjACXk+56+G2K0 zE+@#Y<|1kPvU-H0pi?W2D^6(kCu;y@D6ny(_Wl6y$KDs(Vm=5q8BlI5wvyabI)D#{ zngv~?Q=6jZN2Mb*qXCvseoMKMnI^aY1`S9!w4dCTI9Sg5D!;kWYT9QyEBD zpKK<~snWRyMJdV<+W`vWy``@=w6hq8Pb(v|ZQ50lq6^nkafnfyryQNS0(re^PR>LJ z4RaWhMq~*7-fT=}j0ev#_7l>okz`ORbdFoJc0^H5&g# z>f1u(8s3L8aR#hZAZCrcVuV@iG##($= zWD^s>aqwIQ`(3zt6Yw<{4eGLdT@*SkdJRXXG9>}tW{_#o$Zy0H-NV654E--oZw2kQ z3|!ov{!_(1vG!}jl)S;aPVS4WOIyst_K-CabZWoUnQaxW50PDcxE<&s{msS~vX87O zI46jAU-d*SB|mpLN*cS3d|N7_6P8DMKvDJ;(aSw>)M(i*1~~_~%6GHQT2gUSh#2x) zXf#I!sp<*oVz-Pw$}VzaswUEQPGwDnFiO116U8v0cnA205V#l z07n-no0DG$`uj}i$>juoio!UYW?tV<9|leom_&FR*fN(k7B?EbtRCI@djDcFh0~x$ zzHe-a;uk|k`ThN;4E5@jTN%9=_{y|p?sOv~upGY17z8q>bFL+;&e2abL#q=fNHg_R zU!vObIN|2Q2@~~Ncy^NE*x9`*wdHlh#3Lzz6&z`nU)ePCKq81!^QBK`)5@O;=u?Wm z*l7H%d$R$&h$f_p@kavmcCY?q$fT!``FBEpFxoBFd}BSu zEIo&@jir~$?hnM1sqQ82)QSl}fzGT}nv5Nfq*qTi!4%g3)6W4)v5Y6H^ir3KO9QzY z8)BcO>LcN9!S;=ln?H({&CNX9VU##QB!PjeLkgBGg}jy(E16BP3RA%QO~hXJCML6K zyXn0bmU9}!3Y1a5zS`8eIC*!RL!IBJY^EiRuMAluGqx9Vx7Ch5QXwdHF!mk^mb?rP zFda-$3Z~WxS0L5!_s>$pC7+mnD+ZfcX8rjg18>`|&=)UoTPnqyW+M&L$H6GiNdSsW z2mZl}H-sxAVRaS*ZV{7?O?vGWG2HQ^!Bdyw3X5?+SrIcL{(Lr65Du^Nub-wfk&C|I z^r@%^GG=8~Nr-}h+K1CGm1~f}x+J;~pgp?W>&&FLdE0PSa%!P(sZ`l!VlZH-7LriN zD^S$G<6+#E#ixjQ?v(7}p(dZUif5d|D-B?=Z`1H-V3PuFI#|6CsA+vr88Fw&OeALc zj99cqTgHtbElSMUFH)A9&3^}!=dO;`2?LuPZ!VdOzI!hMXwR3HI(;BhGW2_!96Z_` z)|R|squ1uMyRL{X;eeVPvtoMc|7+SP`mz`MDWfECXDsyPP`{Mx}it`VPPVDxZ4k`nxdNF znNlyIFOnLDZl0KzL98J8hnxh;^w!zaDS(NjIz@-Cva$m!;UogZ5b+lPxc=@3Um1j= zIE?DMFwn=U=1oEN;+WqmKMKE+`-EJWpl=ZkpU(xHM3~*a1bH@ z+&Q5)JXhYK@Z;wjAab?C<4M>(W z;_k|qtC?)_GXD5e01R?yd3*9nn5%Zn#_+;A$2)nGVW*lsq7VlP&S%oKg^@=*s7LTU ztBT86|Gq|N)mc#(+AHAuYYp{7{fDmm_ks_iNvYrB?u<1YN9ya(%cV6uU-f=|^8HzH zh|F!;$gDDa=f-Msu*XY7$<{v>R8m%X+rry>uY<~4;lbaJ`6I6}!)B~Lt|KZ|9zyvAAWm4Ust-JSP zWO+kK#=Pf@-R(VZM-1DksspndpXL=G?334O$dYsHcly|5=EF6=nb`>T>Z{aW|Du_i zvfXW^%2MXAwwLgi#~sjTuB=SNU)2=~haoHE^-&AxgAdLTBN-5Pt-t);5xtrf`gOV4 ziQtw$qJ6PJRxvoO{SA=lwLEZ}{>K-;`Pp0p&-E-noDF0WuII2@2G+6kt+>oSJM^5) zoC=laXv!!tKoI`fs^0x#J5hZz#Py432~gr}2vYHB-=f^`FXq`HLS_UnE+Tfv-nHn6 z9Ji9=>bxNwD%;*zVoX@CMk(zd(_UY)Q9q;O5!>z@dg6jOX&Y%@uJH z1(Wri_lu~FWg38?dm436*2oc7wGXrmU_wq7H$w@yXq^_*C;2#KT^J{OvH`r_p(4S8 z;Qppd-!)q7)uY$hp{+8)A}wsx0Jyqsd-OUsKr&e9zzt@dLy$u^@A)*ASrj^8-vMAi zLv>8jc1}V9kcPfSUJPow1W-Jm;?!JD1j<6QuxU7rkDF_x8D0o%bNB#weCIzcg@({QiwDv%5?Uv=+U-Kj=F_X zxi_7;4tyC#R(54Wo9B&gT71jC*F62SBS~tT9e553{Ywh;E$fPL!Dl=I%XP{XnlnG| z0l5kpZ)z&+ufLCElp0MGTCCL5%0lxeJiy%Xs`K4{BW?=9|3^o&EZ2sVT`(hnI z95CjMo^a!O#ysfJARzAma35T>7uozQ4Sg?BkEQK=*7D?E(3YWLiRWzVv)raJCd6W0>GClBYZ|44E8ZKk3c2sYs}Ck;E1S& zKc-KXj7HL@!#Ri+kcKg&q+#C2T&CJW9kx2XzJWtoSO|7b2Du)C-lotwd@V?ohg)!2 zXJtpSS>(A8>QZd$f#%bdtL+_67-+>lOJPG8{YD9M=W@2Odr*$I+uPR&0NQdKYl!51 zvKqV;o@lW#oAT9YxI;^c^cV3rK3M=^ z)#CLLZ#2*Hb+ikYs7;IdQ;7VMDA_>D>>mV0WFXEFsYgjn3+b1RA3aY z02RJ`r??xDIaS_)w&hNS6cHZLnqxS7=Vds_%s8V}eMM(ODk8*;nv=Ohv7hV!I*&_K zO;xBS8z4U3G=n(NuPkds-XFEp56hZR4&$E0fkxH>c|ZdF`(*K)o=7&-wc{h`%oZ^( zlDyfn7_M-SHt1IfWXJcF)j2+m_E{jKVpvxW3(Z)GHhSjL=McS|h?UptEi4qNY_H~U z+1|6#En+V$G202&!Gxl~8Uf`^%c~U!8q8cr@qTkrZJ6m8vN#1obYAWk7FfOsCNZ?j6@R8ep ze2Vjy;uUd47SZkqX$AkPQ?p^$hW`6cz;m-F6d2X0HG_;Ou1+88?qj~-m@m1$b$yn9 zGRE>)hn%r-Tp2z}7_TiAaQha&;6Rz~Nd74>8u;AlvOyCpVN;T_@K|>XB@lR*vZ>mn z%|+Yxzb2>L9;T-H;i8Snfh`+`fLW=_4flZ&%Ps*uK0xw*2fekgiuM60gzEs0T2V(; z3}S|icv|Hr=&AyZ%$VQHK7%@K(lo3OVE6Y9P)WuHIt~BOI`@tDY`C4@z3=t_x2li;lKmZl{JZ$5w%69?+P>qst%eh{R2xlY-r{c<7U zzkr6TN4KdHZIc5JR_xZN9d3>81jd}0&DEi%VrWs(UL$8}7^gjiBqkC%Im=ZJ6cZ!# zZ&reBIxb>O%=BndlJ;Pwv!H%jLKtsmOY*}+@9C>bHGX5lr>(l34oE>2VC<@8@7SZd zK=B7Wa}VO^!*E-BdpPPLE0jZ!EDCp%?q$I73T^5e(Oj{M>D-5u;@3yGLpsHgqkoRvu>au-7U3Nd|7aH-IJpMjEt*#HJ3$|GocsIlkDej7&YUzmX# zIXmP){?&4JQjLi5Zf4HenMeu*m=Tz-Ij5V{JLOvIv0Z{Tb_W|Tt1B8 zLlAFnz{VeCXfLOaI2^xX5^-A#FN5fGV(h-!<0cIeDIwp379l0nz6u7 zBAe&D6}VOW=t$KN*q06*ibGlNnlQtDs0KKM0$|9mgBxd^qB-U#*}tfW`cB?Sm9{Ak zVx?59zb;3p%{EV9zM;u;YJn**zVdbO8DJ>kunLV8O_=lBTWi#Pgr0|MNtQ@vZ!c%D zJA__L89DV2y2erj#l9XjE7UMfuM@!Z%kEXV^sTgpu32l#-pjndD0}F8j2F^w5~>wZhIy-~@;&+k`(h0ohKyUHMS4pTNCE zm``8E&$R$UMsV0?ke8RV8=o{QzJ{PvsI`od5RvI#p_(ND#;h?~u34RkHWU%Sq6!q- z6pIeBUrEz#o)X=lq+MOE*~;R6hPZkkyUE2$Gq^8)hgcsPXf!e3iAP)?fdy(-S%r2 zLM*YeA7B;_)GCzkBjR5Pf9N6E#i70W;L-`XslyL)`eXk2E#`thZkp`qw}$PVZFo

Z5gE`?*thewmoMVW2eR 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
JbD*RNp-moq+g> zd)FcR%WSQCHq!FAjn&d2%jD zmB4lpE*M49e|GL2LL+P~Im)W(!1-f4}RoC{KT!qy6J8Am{facF`Z`r#LVJYsT zjtcv|v}3E(Ylz6mZT$WG_+bqjRN5M5@_Z)GeuLP%qr2P3pnuM4{XS@_$F!W8O+B&p zCGB8_K6>}o@oP%sM>8gBi*4)eEICzcOEc#@cK9FX53y>rvffd7z`aJR?PsT-^hwL3 zfzR-(WS;|JEUeF->HsuFbI0UHO77hPy&N?jBl znXW3z*Akh+8=f9iaMq@NUz3S^k84k4$G=K1;0#0NnuJf| z!D}Y)VMNj9>K}mmi^E{Y5|6N9C-nFX-dgNDH-z~JD|C&x^MLJOJEoIp>J=#pDaJTC zIb3rHFWY>ft?f^`?7bx7X=LJxfzyUdP|iPp9eXERM>IJWD>wZw^2uvqa$Y9DuG*;x z)XvT|AlsJo|16bFemlxIz5n0>rkhkA{7 z0t36uUF*G`7GmS$5eI&Qpl6~iRY`zXFP|RA@V)s@X9k-id-@-wPR$O?%=Q^Yb$gk?wz#JL68YlxspiZ$MeQjZ`?C=xmo@jvVqVV_ zOLIo318+&4`am?8+t^KH3^c+bYIaH2AZuRC~Y1_$!8{=mhm(5}7LhR$YJu^)mEcrzI-<7BB zu-^;NSLo%=*<3pR<7T!t-r@U@t9@wtCw>I&sFt&{#oGf2TEM^RyXe1uzThO_v`R;| zJ!S%1hO@qDe1D1*mN|B9kMJDOYI5FZ*?xM(5!535p@R{x04vdc);5LN`v07Ie)S#i zs^CNEow##sIvl&G`z?#wABG3mIUw$R$SZVfJ(w{fTPV$_hgHWBI(mLVu1d4aR606H6zuNZI5HSfI_mnFXz{LcbRc)YZZGbRIW|d- z*|RL6hmaIsaO?F=TJzg&=QX~bt%l79*7L-{H8gLy8#x0Bh-=eou4p6J(gh{!#yM3= zo^dOo_+(+-;=cWzwk@0gTJ~CkW}!gKb2TY_&K-g)t)hP00Z96C%Q7cvKL{~ z{q}qsWmc#;^ta#mb_I5bnYt0nwsbQibKt)Y1LmnFT@4Y*a{w2RPV>MjfN52Q<~;#l z`u!ltc~pijutGRcmaw^vpSkhxf_!Uz36uQu`A~gaj3fYZ{MJ#eD&4Uer97RI zX*t%$?(wvE!Cus(qxlkKVq11{-%U`|b4}sJ(DFZd>QX5JPefNGwA`o#%;xBEm3Hz_ z?k%^lVt<6i%_@dN#XbQEvB-3}Ey{S^KRsF9W;U5W+jWg_A-k`n5|sE^=@NTOrNg$@ z6m670FFdcQJ>XZ&QaTHl_B*An4b`TK%atBJXN3Tz^HRtGPndT8x`-qpn${-@q)cgl zT$z3zY0%8!pG5f($uP?`eyy_Fm)+&V@njY|%UwU3;mkH$Aj4j%g3yGSA3GFw02!@u z*SL4{wyqu{ZK?9W%_qjN+d7V^`t&Iv>F-e;Ng*qe?n6OoH0Ru5wMW-pv{KA9O`TLY zYF|MIv$@(})O@z;f#H7b$R^?DdSmCB$1_LS@CVCU(5cjp0F9HT!bF_}UHKRQ0lzeSynv;wm)`f`Y0 ze1A)9yzy6 zg%{#=cXFze6H_nzFyjxzt;lE3qGA0VbPOfR&(B7n19sPLKVvCX zSrsoT@si$_A0Ij%Tkc*<`Mcz{3*OpfdB8qV*_{Ozm%ud@dLRzLJ5T51m4ZaSgG0<*X6p~4 zgW&(t3>qpq83<+A^`B0*>kBM^IKPjA)QWNz+*iivv+#Fp}{q*tjO~?>fz0 zV4^Z+_mn8-7^@cVO! zvyDqXH|}0RCA3Tfq~Z`8CUS9f6v&^`WPjfSMwfH$YBuaTOw&4be{XQKtr`uw|6(`N z`M~vbjkmQYJT_d!1)q0*sOs)6kEeaS90vN({&seLq@KscAJ;C($ZXw?cPB0o$t#Xv8+xX{4Utmb?wQE@;et+msk~e; zH3*`GOUTrs)>NR(<7TX^bMw)O)pN>KnDNax0M8L=oZHUbIKL||ObQ3$*Fo1(6kwg_ zn-_;w(!p+~5$kOvWy^qH2ZHG8;{d0;sfahHQTl(;noo1F(ClQdO?p&6`Smv&xuhCu z)H)%-%rRS-q^;_`_#8m|2)~YAlm0(tW7r2pcJ|``7$okjKmhkvM}j_$-j3iK8qbcw zScFP3@wTWux2&-;Dg21`y;~?22TXtHn#|;9pc)a%>$5$jRuN;d$?yxF!7RtDd^H=c z6diQApYmCg=Py#sY$|Cza3w&o_5;)69u~TY1p$+%-m?xQKu`DwLTY}Y_ zMy|K^Nb4QWf9%Pq@UfR6*{?Zj1%3b*;vPBt_9xVWFVTPj0Wh6uC63CU;0lr0*x~iS{ghN?R;VOnJ4#ly212N~YlTi)XAlg2&aPSsbG%{2~pTyhk1n`kssETyXbGdBM-S)$-_{4JHPscY(=R$ zu*q4gEt#z5(YK?K%nhH5r_&p_DtfLPn9c!`QuwCmLo7p#FAI=H^+=UAb;GiX?#)JH3_sNJItTx2LuHel z=5KeW2u7&J+D^;4xwkyeF`t7)=qE|xcr)W&jsc!l&Z7Ip65d}QMrAfH?VaR&-6HAI zX&l6c*f|wY*#_){L{3j5O6#k1J`Uw38STSv@)O)ef8bt}|{4{_}b~0aLz3SpTY;@$meako#jK3=4 zz9>9q)y0vYv+3@{xE%ZUFmQNAkNXCY4(r`6pWtArxl|wSg%7;+uSOb zv6ymQuf&HzJ;zhU&(xD3YkoThoZtHp*w)ihnpf*6U-bEF%Ew3c@~-e7ArG#Pn7_c2 z|C92I%2HkU=Pr=s$jBCm?(n?zR<3i^$TQTDFZxS0O70IO^Wt(UWv=75`ZYye?}o3? z3uXE7W1nXPW&lF9%SEh;Z2ToCf1d47C4Y}{5*!;s&NDn$EpA!RU+z{H^|I3#68JT# zhs6sZnOP_sFv@zmYHVctn!Lpi?bv$#ZX#{h94279t8%?UZ4k}*Qq0p2=1zfNf6K<6 zk(sEGdP-pMeXhVCo?>Ml!2Yglm&F{%1u2*m&*|~I6*I=FF#Wn=aL@5}*4P=k*KG;C z%k{~0{;>9NVQsUM`7Hv0wqNy4>&r?b97b^p^f{nn&T+C&?{-_39qfNjqKxs+1x1P6 zwG@lxbaZOWw{7q}jY4;JzLm$1%$%FCXY}tPHZET+`gdwkooIy-VlMYffs|h|vq85V z13rysvM?|VnN#)76XS5k0X8~ACATKB4IGE$@@+Ic(<1;KK5(}TZeFQJZ3&_$w$k;7 zCZ4$7fc+<(H8M|nW~6%7cp9c$82xtfLGKeWI9eBX9wu_^njbJpnNVHP)3f%Bs@G4$ z>S?Sqq=)8n1Q+hGl`@lX88&EhXw<@da)XkzfC*7t`m_f{`{Z)CR$$3x!&g3hUPcZz zqX?!EDV33u6Y?x;sNIn91FBErv8H>oc5PWc zE=MTzq<)F_zZyT!T}?d5m#{J@#%CoOtU)zG82Sk}pR5g^uFTt?Q#2Ja0q zyofnGAl^QX;syR=b{g4MNWi=`RZLBg$G>b;ZLE*F!2u}# zPw;4MbO|=Sh$)w*5+8~_mRAdl=^(Z=Zy9bkdSWHK&XtDW=ucJdR#AdlV=ER3wOmpm zS()!b=Si{!yT3!e|8ulvXt%w<;MG@^$>2jNqBBT7^Qb7yN!rP>pD=MMQPOv!#qSL5 zc0IZ{SX&d5jlVqG70}#qJh2xk^;hurjft=NFSLqTKge@Mu>E>3BeL^!tQm3qG?-SS z;ee9qGst&FKXu}XxUXLCQFB5rh&_8--~K`_C~gKz6)h-W*DF;o3yj3b2x}gwkIJ3~ zT5&1duKj$}x!1o)??98SV7dz;9 zr|pRN?)7{Pl;S~e_tYOzT9aok#wWR$Ff9LkoXS>h)BTZH=p8kA${vW$S`~t^+y zIYIseyi)2Q?6%ZTLa-0aQDJe^@*@9QR7D!ACaZ<9uH|F_;}CS4uHs&&GKhhF`# zScS4^>y0US+|%$(jd(9{rJdfDz}ehl^dOn`wYNmX48)S$fyP2*bvD88X@~Vgk7}eB z4-)k9o2_Umn=n@U-iB_reQ+g~YG^$vZEEHQ1A;Bgwf{)j%(Ce)ng5}=*YgklfY+)7 z`VZT zkrq7XXRe( zlAjnY`3l%krBgZYk~Ul|v1&^}pV+f%@xasX0Pc}dWMB<|!3}TrY_axo1$8rAB8G~r zf5(vY;bBv}GIb{uuZ8t1*gX5r6_;{^Zu>6Y($QOa=zaaAvTHB0&dkij1v!lUY1CGH zGwj&|^~#)HPA(2zaSERc|4hHNFgBV26zq|>qM)~M;xF`@zp(oZpI&M1m&V#& z$^GbxxidG&rYS=>%^N$f6`xM zE*5NL8V@}(s@;sp|3m!4ets`jQPbzY6fj4WFzG<|(TDnG#R_6(_ z!nVxvoo+n2T2^j>l>F6$ zqD9!HzIHuo8ey}_$Sk@ql=08AFJ*wikhZ_F3rioYZm5!oyE?=55x+Nf>%Las;C;km zZ>Ow(l&K)gyUNZiFR^w!#V))tMK6L$JD=LmU_KM@7QuNAM^yaOErSH$$t1AgKAHQU z9WRg~zwBw7>Y%@=+nuVq^=#1-EhMrWg_-I#E9-3{_lt^BjYkKH_}af+=-Tzhy@#x^ zx%>f9lOz}I;9mX`t!k(Ei-G2{vp~a^LcbFyRCeL>m(lZw%u${xfyS<>k@0i4yk?g0)6c1P$txz zgFw-2{4qo5cPD0`6!#(67;6|y&fz-LuR)cdRj!wyyJ;E82DQnj*_CUIqRUwTW$wT` zbaF=iaIu$oFQQx>=_VN{$-Vcak)iopL$qTY#%YJua=^}GuiNm)^z*a2pXlX}TBqkD zN~5j{cb;+N@*FBCOp!D$2$Ay4!nn-Z&lO+)kT3l#C@$UTXXkMXp9QVX6cv><>+0e3 zt7*dV%=5z`Mf7RS!3mc)6FFA?Exi8KP%R{_FoU-WATaCgEHE|IJW)NU9b^C?77o); zi8>6=-3VJ4`4e3Ojv2oGdhzH-S+_g4BI4j{v7yFJY(d5i<6j9sbmP_~m>g)1 zB{o#^zTW&0?!@OE-zEEf{}-2A&&*_ZA2qe#hB}P5FHl0j(?6`k11ViJWCP&(2-{4Q zQ>C_~r*yo)ZA4Q(@=|hKEu&W-NB**77G=us{cciFeDVHh{SH?+Qbe2RRG}PQsPH<< z;3T?U-MeK2se9Sk$M)Wq-Tr_qeJX?gN1#&d2=Ep8@Ze^*x=dfa=N_{Teua>lyTaG? zpyo&VK7?vZ`4rrI-;KZJQ+(1RuK;vpf=wf=V_S0-$I&=>c5!$=y|`naIdwPY6Gbr} zsi`zqESCOH8tT6Ljha_w8aZ>Fuzj8v*(dRgPch!Y!Ug0hFOB`(|H+@o*Q12f?vdIA zi=K0A8-Ie^M49+!T;6fcU8&*>`a=D(*+fq+Ua}Jjq*Bt{Yp!%*C^lFwUx|r zvN;h&|meq&+YePs(%f4B zBz3#5d`VZkJ6x`9dy17T5k$>2@B3%Z&^Tueief5Em&UqhrKHiq^WYyId&-l(M_2a} zcFMa1(UWcIoYF7f>N!`Mzpq5p?0KN_TG}oC!ggw>r#1at;ka}E$Jgp)3#jP7w$s_2 zox*FIG7R4K1wUn9S($b{Ki)k(eT6nfwEd5Yu8P3A+1s5e(shzJ(DRE$Oh?VK-|eTY z8$fNR9|Om+>^ABGwB}PimP5w^R)*}Cmr6A2^1L5h9*T^Gq#S777kcIg9;_`ZMsTY{ zoPl}qXD- z-KEq@doTW6n-zPA!Fr~By(v^Z(0fP%7`}?qEKi+>{^LbicP2orJr*VNU9K=q zPbw_|85MqSecMovO)2?`H)@^@36yq!Y{i2D8CaU6Og%5cn7u~ZH`2*FobcyjkT$P_=b^rJ zwCfYTr*|&1-E)qDO|ElwDpUS&HQn%vI38TvsMX1uFg*g;vG+1Kd=s;9>H~~Q|Y|8uY10nO^X{^ zc)v6dF9BN9qCST!d3{p-lDPLcQ6*+BlK2 z$4$?4J8{NTSxm3%D@lyif1O_{d2`@x;J#mnm&lT@Y7)3{k#g-j#mvU88OQfHQAfAN zG$3W~&N})y=1UGQz;Sa`e6#&7g}iky+W%1C_Y^NH+Gb=yW zG9x2`9NTUSmUTO6=aAbJYPT;LMkjZ*V>p6dg&Ag(;2-`|$l#(6`j@>Rl4lN}`K*vA zVp48w-IK^RYN{2I0sfCau=Bl6{0;Vv`yZRp`V2na z60O|-H#VCxC#IA+@T+MeW1*DZ2@4ixS@f}NqAUT{WZA50LaS2WdQv}mFdIAxE1Oj7 zjaNC16OL^1`NJAnGCT3iPE|Ed$Go7(4einP=Vk4!2_whebOmjxIC9gY1qA=x6`h%9 zrvQzquG9G_S1>R2JZ&4O#pe{I&~;>3-{tR{?2eNP z9u+3zkkv&tZ3`jY;+3SCS6OG&+Rb^aMc7xx7n z{f8kSXX?|R(JnPs_*~XxWBE@=8z;qq5=Ar&KViD~X0pEuaaz2(mB^`3Ug&=@amEjo zlzU+G9=(*{cEC(tPi}W?k7j^^$3#g`#`QMdL@$wMLsqTHRk~x*@vN5X7&&$sy)&Bk zHr7KsVe=iwx@<@+&?>1mj>~>Bf3*589|hZqs$FNEP88%y^ZYgDlTk9M=&_<_@T`;P zaubWm+4D%(`;aCyHLcva2$SPo9(RJihQYFbz}SCNsa-ZPPHbPQoPMS`OV&f~Ts-e| zyQ3Dc6grZUy@Xb!giG%c!qZcN++gal-Af$mM zE%T9Wcc6nBekGP+HX9N!^b1z_bSBH~!7p9IeIWoRQ&DR^+VIu+yZ454 zu9*!tjz_Z6N5Y^_Tk_huD!5*l!%MCWmpt1Am-$l0E8th!t!b}%r=E%_PzPH7u|JM= zeS}^cZ>q5d+){V3TM3b-uO?B_ko1)2wMFP2HtKv>r>pmIt(u|*((yi-Nw2fays)vq zJ^xo!9tVB7`R%KJ{qR3VUReRkx9f=tjt53Q0V6?WuwyI-=TNy~tLi%*Ffs2A4$k{? zFs)P8FGk1pld}6dsQEo7_&a^j*}P0YKd=$5p{YRl$c@isT4)C?!E+%Es(t~{D?{){cH7Yu~$gyHoe{<2N z5w#|AV=r*x&$7~_2O1%5!Wq-X*KUn!+Lf`EQpMpaU|f<(FKD5)HJ9+I48ASzU9zd7 zwR!IP=N@zHt1&j(iN&8YNM`&;Ve^ztjB-zFQjh0}YX!!FyF!gnVk}+n#xYK7W$$Xl zOM9{a(5KhKXRxIAh)YJQoZpPy*C?%499D5Wfunrjb@v~^0^c=3-{pY+yJ7ykHS^(2 z+6MQ()(?+cOg_Ei>?nQ$UP8V5X?V_2KR0h}bR--I8>!DAwwhnNLM}q0{nFAg7RQ`WdI-(%Hu;$gPys_6Zo zK{ZN1xi&av(8N7FAibiDnBxEN&$MWeR$DLFD;uwQK;|D+0Avu7iNCgN8}1e=_=0_s zvCQUd9`L=!Wa*cacP#vc{LZ*sayWN}H3Ntm@a6rsK9+kHQD>}a?R~da|tS=F>A^=)}e$h?=}bgoGHjFu} z>4oqN+n4h*-&Hq1hsA3Yblul!7i}imzdsAV&?J-p6zG;fbNC4;t)M4c>0XBL~_vp9G4?qe{|f2<4(8O^HJGLwI$;>wX?E z3o~$7nzS~U;D@vc7&2y(^Ge8fbmXK?e$^4r=X1m^f3loo(#1616lw3Zo?^Jqs8!X1 z)ibRuj1@i#m`*z=hF>Pes3pt~+b>1S+U&Me7ZtIgAR>IGBtkbj(JyyPZ3^}P@`~P; z__Y3+M0)Af#s6aMJinT3qINGLVkI=`ML+=`5JY-QC`yqoN^b@f1f=(nAcFKFBGMBO zrAQ5k6zPOsB0cmfp@$GiAc1f==P!8IyUv&U!_1obbg$Wa&s_U=Rfn%O9gCju{i{FF zySK;Qw-RmK{>%l1uiLjE~YTn&tbYCiU!DQ^H+sNi!(FY>Ut11nZM-@*+6);c6(JxIg)m72H#Mv z{(pSP*$gTZx}^u$%OwJzW9fPa>x>74PH5a~pj>-NL1e`}@7XlnDxgCI_jhWO6p%$C zi687&G!0g#efMrlc{gEwlUJWP^$9gI@axXqlk;oyxyBeCYvY-S!Nht6?AqKA>3@tA z3IxTZ*~k!#b`lHH{GHs)Kg)Y!^SlKE^{Gt`3*$-lRtT=Dz*>VYaF2{?cbMR&+uH-I za_NKrq(%-JSd!fSYeDK5A3aS|XvWri&6Ri%ZwGQsBPMkqw-x1Jk2%JarSZ`pp8#v$ znCbhu(cZUzDEm$KR+RjkL!M~Z^CHaB$#{%PY+Ki-ZwH!dHIAP?;hdKgUlrG{eaFP> z@+R2Y`lNf7Zw7(|bIE^jGz9onqp5C@{3#nNey_2*mHa$Tj*-=8z!mH7M>!>j58iKx z1g`x1XB9Vqq4dP6k8}NT?lUpH(2#(80A57NudFMQ4HmxOw_)mivCSzAst;sC^25Gz zD^NPmGw5y>7E^M$Pyn~q!t+p^mhIz7Oc3i$GCujDA1i8@sofa-j`_xw*>7qMNz$7s z4s9rws#mt}PXlVRJ>&Xh+aHM9wmK*Wd5L~ge5ORK^&YD(cfC>WhK^V;9_ZAEv<%j=v9!vOhC6_|w^pK@YHmsmXl33B&)<>wMV=Q3td z8&Ne+p?w+s()Z#08(Z6zzkeTR0$QLsDyQVDFK9*n)&U-xc! zWa49h>hI+8r;B6gB*4RoM(66IfT0)s+R}+8UyiSNjt#vGSUemmvW1#SCZ6(h8AFp84$ajW)NfOBUveXy_6t2*85lI52NMNzBq)~ z@4R_E-~Jy{GzXGNU>Xu@@H*Sd@eqG~59vL(&rzZiayCw;;qj~Pj(gN>$XAHp%GcP_cw-KYQe>)U8S5&lw&XEdHKvAmgK1je zfII6~XKb>C-NAxRvR~hA-frSS(zfp5!Y;vx_tZpN3h-u?Dosw1R;}8L9e;t}Ti5`u zG4`4%m1U!)e{ZaXOfk;A0Og>O2Y#D&LFa0$-?<(jr8sHG3*EsLLT5)95FB zThyWe()40>h3(cB+_L3vRmPt4%334Shz=+}b^9pM;6U8=WdF)nk)yvyx9N?J52f{n zQWGmq1%E@t&^p{H@5W2J@~MCSEJ_N5J=B9_WUCG>E<6W!#Q99e0i;cvV6 z+i?laQJ;l^3Z#Lg41?Rk*TDVgW^Ik7Q`ba$7gG1vG49=$6&1_d&F^uxhM<8#XJa9$ z4!X@b$X}*>!iM6%zQ7OvavKMEK!2P+DSa(j?n*%b{97nIJ}LyLI^k?iId(Zb_CY|k zNFmu{t`6pK->k)2zB&QDaC?0MAm`U#f|*9|7S$GmUMwCxm;gLJ&7lxBrWa9uWaui_ zvxDm!hoDga7VxtSs&i}i!A#ad^<66L{`uZ(@UK;wSTc5smXEb`VRrzt|6(JhUz14qIGZfGz~_%&+BURHOIq z>>U2Q?fAeXU&M2qjsY5z=zl-eGxW`3`<-FbYJK41H!=7kZJ*n+$2mTgG;ZpdNw#yo zVw;OjtUcUp>F9@m0&u?9j~2LXZM`;{ddhRy0o1z&^sM00_#m&mN9IyxO_oFWQA z(hu!k=+Q}QZlva0SF-e!ZJ#eG0`HM>=oBna}}2&@<+y=Uhe2G#?q@w-9}GJ^Jn3VM66?HQ+T zJ%jim9#nr zbg6$;A0K|aZd4UgA~j@mYa^o@7c69I(~?5-z#B^M%k|8SJ;tQ6rM)Xa&f}5jf30d0 z*+x{hODBQ}4+Zx})ilGtTQ*CP`y^wv=v7#EwS)HOa;kPkg!qbYBMWF1g)iJ;!P*D+ ze2^ec2S;U{-$k6kof^(Qy6=7}tcA7<@%z0-i+X_5Zp;3S`LXMqjC@)tKL=g?=rfj~ zQuPIhQj#isV+>)~lI$M2Oq~_~wDJMKD%btj0#{nJ-ZeAmneppPHMSJLV)_q)k@LFWCs~(>1126!z>* za&I<2-ng4h6Mk1OU0%9$hmq%Hij6v~yul~t8e{72n2jFGj4Oym& zNltkX$Ng!|72i)~e@8*T)tQzO_E(MR-yJizXIs!b9Z~+G zl%32&Wl1@U$1+iFuf)aN_ub&gsYPrg4V4V7=|1A&B0nMmKW}O?jQvWW6>(-t)2=_ewe!yG%nFM z!=hcbd&v=zF{*r>->!QL)w+@~r=nf&r9`gz2%~oMYe0S|Nl*g{UNtaC2yNf^Hxgw#c8VMsZ_=qfpEyTYa(H+P8>j@ z&kmD2Q%l?H{079wgAal3pGz@4&WH$br>~7KHuDylB_W}m!O&5&yGAo$ZLN*KYw&H# zzDg&Taol{ZG3Ikb6{>BrWk*xySrG%*cJheS1CPO-KE+Sw@a6E&k~4!}Y@Igto5V6$ zk}K?_hcE8yIc=1JC!a~gPNA7qQ$JMM`Wj`<&OL@%{(|XCe;bJBS{@UkR#h8bn9R2z zo!Z2ZDE8qQKoaDj6CU!3(zWkIeuSxrAl#Q6TxJv41Z@cj^JO{9JS8;!MW^1++q1iw zk2a5eSX+;5a~wI#6V*wnqt7goYbx_FEk=i)o%#$vKzV$vXx2e83N?)>n;H=>#d#2E zub*jE$KYwFKQ{&?_nKsUo=Sdr|E9*)2vn}oG0o{c^RYKj zbVHE)7BwwDDE^^n3ggD&y2_OvOygr=t@1lUEwZSY~-#p~I(>y>Q=?-%2a?W7#E0T$gK z&R27OMH;bB#a|sq3aC*7bzhXpFsVwo3Sq&bcUc0_eR<$gO*$cecs(gR30Of zBzoQ5q`afkAptvcv_Jax#0>91JIIXy3k=Zx{81T1? zA#YPWovF^WDmDvK@f?f~#HF~;xIu7d_f zOfQY^5jFQ{EuTgQGZsY+pOdSA&nmoEqDDxp5X6iE@UUwLD7E^`NT*|z{dSFHdA1uE zT5))1G27L^wpzW2ZStiG3O$F^sXaPq5P}N)tu-d+Du7o<_BO7chUbdjDpbr5L5qNj zgLBdU^>;pj!HuYoD~!5{50897+5FZN*49P3&ziV9IeB?haajxXP2!(BUysQriB4VlB(SJ$mbZ50jk7##s#q&JU*Pxf%{b81%_}#4 zBK^MwE|GHThnblwaE?pUSL5a~t@3{4obWw!*Z_E-FT)_7^RQ8zp!;=;lTYlCD5L_@ zpX7N?@!&2qE*$P6=V<@?o zK1s_{j69Jpn52ro()F(?8k#4GiX~CUA2wzg-NtB#-Zij8;#6NzPF6u@l(51;6zVR0 z31MbtlhKsczyW5eZf*!=SwW=!t9%lhbJquHqp~S2kGRd1bF88J)ZYi6IA@@7ON&*? zQk|DqpJ0wOuDVrg7`mD;+Qpo|a?Hbx7XwHQ*758Ff4VCy+asa{cjkK6L-)iroY!;d zZB(Ckg@YgM5Hjrec*P*&+F*c+z;5!+qnrK5Uy~NSWZQ3WUvZLJX>TYvvv!`$I@wnT z*Qb-EmgJfWx;oq@*98ynY~5D&L8+fUa3WZVMn= z-VF9FQfSeNLyIb$eDY8)sO6kt`V+{oHXbcrtB&fzSPL}J1 z#)*`zeFX9fjluu8Wu5Jog)w7kFsi>EGMZd8i~S<5##By z{!OYWR^jOxsoc;H{~d7`Ft?2rOiP~L5BnAK@e%UB_Vg%xZ**gx=SDv9GI6P>rR23+ zWaY{t)8gT+Nbly?T{AYXI_^&fBEF7}^)A&I;=1h2dva{v(XmPCfDSCG3qA3xp~CVM z5bz0V93FSV(%ItR`coFDa$vMM(1v4YxTm@OSUA7UW}4|S&BK=G{A(o!CyDKw!A^-U z*6bkhchAHVjp^2n>)T`&0u3#$aPz-9b|0cLh)E?GcKR@URv+2C zS8db+LxnT8e>+ajkLJw(=}FnJ`GLA!Q_T^6GvZ%9?Wg5HDf6RpT4>xfP zr!?@qcuuuJDc=+NjZ%*0EITSkGke(f)x)-HBCX9IS1gjnmnYK_w(Ed;_5Sx)$^X0Q zuu^iHf?WKkeA9WOh90{Mt~LS~F^je`ULJ65x%+N61>vkyP}G$lzx!G(2CWZo9wvyM z3=kxBf?j6oPVtqesO+TIA{OVcy-?x!Pgycr91dz_dG-^EGkt_~CDB+88&iV}Y(w!u z%JZ{>vOe@K$~Ur@L8drUHiUdq5YcrDP0IFD)j#C(^Z^`DTs210w#&4nC}$Sp$)gkj;-|`nPK2HIaON1zZA8T z0ykIrPc4jDPS-fkyB94)dOBHK)~ohv#y`F5insD{e;D$csS9#Z1raUDs(}2)j|7Yn zK~~xOzVz{@)v+A>q|`~)MNWfJnCyEX`rg6^EM!J>!97GDjW{v@l)aXwK?Ok7-?xw+UpiWJen+JqZTUvIJYbo8%kXjBL5)nCdI#fuF5h{ ztR42?zH1u(^0sGpKRhw%NfEHX!(J%*7R}7&b(im4Rz;TmFB)P+ET*pxINe=G&v=!4 z9Qd!9y}kl~uSQAkEsTvnK4Z5FT^Cn8sOgb=|CU~`v|pp~w`o%MXO%5cP4K7a5c$QF zcI<@JV$S2FM#tiF#MxI@F}gEm z4xL7OGcLMS{jlFg+vot=0Afhjb&Ypz=08+ANTj;Kq@fOf1IT$)f=oa}IA0BZ;OALf zP8Au#yIc@q;_A#>p$rt^_B5kI-9uP)f{rFIP#S=Z7a7j8dyFAPrg9Tk{44)@oX_A; z9IOo~WoHf=mwtb*bxeFXHa^3H9vkSeX5c@n4ygEbKehOolA`XsVvdDYz!r9HeDxFXo?goQHgCl}R^4ZG zbE*>h6WNNU9W3W3^zw{hq&?CTj3HC^uxVIkaN~IyX=l-*Ef^;~wWI%ESL-9C)<=z< zpJGb7Z^N?koL=^s3A~aTSkAroZ1wUKYpfa{{Vd^lq2*^XLt_;|oQMk8$1j=4|=3XeK^=_lQ<9ban@?m@N~6uw-r@u~N^soZ+a zf3=02&$A=Lq?EuxQfK|OIuA(TyZu44^J)R?wllBpuO}amXP1&KknSyyqT7B}uD6Hw zcwyzWHu$M(`==2a=U!9X941Hm95k74<_Wu49<@X4&`sNdLoI1o-XVT%^-?c;yvf0% zP)CtH<6~ucuYI~M87b>1RCpd+>sQ|2>-$$bm)ml=jWRc5Pv~U&kYZi&3N>K~<76OX zjRtE^HTEBzG9zOC0T-5$aoE=;QsXg9}v52WC3Sjm?Nrhut&DB&kUsG%9Rd;Q{6= zz;p{WoGXohzk4M78!djUjh;zaru2!T71x_E7sN)@6#U*>$8II6V=ClpMxytga(9$L zLdZyb_j@;6uQDkW@co|S*LyqVzBV?@o&ML0*+wV1nhyg{U-=Q6E@5KRbD1oecqaXQ zetH^0=nd>qzudH@Bx+ln#YoXx4wt?zy489l6h%#5QZhf+&jG-&HIiNGkq9F3zB@SH z)+Y$OylQ^fw+_;%g&>;ay-4qwf>%XxA!U0;GcecWdB{-Nsz|oc;qUD-Vm4_qn1$=8 z7W=om)W4^{<>+LxsD;Qg6I8orFMo7WL3AC9mZz40|%h=}#1JaJnl#NH;PYAaZ(YZpE z2tf*GB6RC0x_s~t8vBjY+Nm{2`0!?<(x4~2cD3I(AE@j%BwT_jJ9Ff`WPMuF6h!@k z)tgB>Yr5WYc>YpA_@~3+G#jgO+X_9e-y%L28|YQ|bufhxT4i4)9Hk<1v=CEAprL5| zYv96<8f|c~hk~q~X0Qb#vXhwiG;A4zygj|78r_hjdZ!=f-{zajG*$GU*3K&eS*z$j z#IG9d75=n(CQ-)*gKcM|+zo>_ALr(DJodMz={9hbld2l*s(t>7VVj%*1%J113a}{L zW0IPAU$T}#6pP$E5u^2by7in|WWm)DnxO7=F$Suwxt-Pxyeg~gyLb4m;9gE=+)2wa zOq;=DJ2hne4`S9lDkCIO*+ipkXfGP2$us=w(9&wa!c^#m_(uyrBOJ-6cazR(GQ3cG zwJ%{pa+x4`X+^o2S@NWXE&lih;pFTcT0Cg&Uvsuqm3-N3X&aDe@Ype2H(}J2V;y^I z|8seK-9hjtzbfCkI=&4!MRzyB)W&6%jy`Go(Mg_e!Wj^O@vuYN$;_xR8wIt~$z zfSWn&)}-6%H~%pL5k8l@pF)3|RP6mY_D;){ADA|+)wOb-6IDeskKZ zC3TN_L3VrA*0^jNpEGqdeW=cHK6L)A@nKulyPdHfQ&5FN=aej@ydkLjt8SUb#vGp> zAPB_$%V~)Ft8VJ#as$@4i~YCnqDSH$X?=eT-GX+xwXDfe%+3DJsr`+ggxjt_I)pDT zR`pB6t{IQizc`hd3`^_KLtWGS7hD(@lo`G#Ot#v_XA%>US}(PHBT2!rhwR`oT#J>l z7+-C{s?+<19>c`W=Cz0L8-hZ1K^qrvccS%RY;C|N5-rUWl^N5X%I(G41rk4M9j#J& zx3!*fcP)q)l9styn?Cb zcdGqp=V2nxyDUwi=)7o*uH~2R!$N6hUOw4sVNUncs~XGCOpv!!Z@mA(GJ3}@)aaIe z5Bn86s6dZ!SYBS9P5U4y(JdEm(1>z^SGe9rpB1D7D%q0QW3v;v;q}koLkNhu_kU%1 zd`%^X&Y~{MWj|mD;IRoBJc|MXDN(NX4m78@C7(lo0;V-G&S$!XMZ&FqTBM4U9p%%A zQR)@j{uNF^mm+SThF((FHoqQvDK@h(g^&KmRi#K)s*GT$Pr~wk)EflykGDzDI87|T z;;n~a)WP$wO1sFodqM6;f8$zV|7-@|@eYI$r-dy(w#pUyVR% zL^j_}+|872m+4;HJVMd}=0g=;?H2EfoLxnGyY(Lgrw*q{HO6&9GE{r1dOa9HqUL~O zsl~_-{+L~=`X2==$N1cav%hH#o)`UUXkx|Dp*()yH{>3w(N_y?3yC_+%UNG8B*hqQ`xOE$p4FN27V;*3MN!{KOnU@XgM+C02mF?3ioxA~< zN*@>i$nbps&~G%#jv?&d7!C!1qXT8pDb$**!+MdoTW42aNcQB_?>p-69L6miZ7O7J z^;-&6`>sdoc??b~Yb})*+zI~pV1ASS(@vdt3~dy}K=OK5AB0RZLXn{UX_Nn><4Dekm`wi2>^+7pGu z-6=0WYMYE#LUm{L0Nh%<*Q%zliVq4WSpIydC?$n0Q)-iP=|AsK=8+YRjY|KcNfVTZ1{2Te6{{oZiti%e*FGt<0xWc->5OKNH>3U#$NmnpuvB;CGZkv5sI;fr>pJWaZEa2 zS+tsOw3hLIlZ7?de{plO%CMqDQ9w(=Hi!$4#lCs79{g>)?0TzsoUJI3e46P37STnJ z9th)dT?Fxs&X*eyw9m$sh|~8h;C=E^nkc4RXCByf6uRdHKw;>P-4&H~$I);!h0j)N%Au5Z|%9tLl1vfC=kClmoJlIIi)u3o)p9(0JKtzVz#KhTi0 z_pqLLVmQc~Znv9Bj6f?qo(A}=JW7T{uXj{&pEx=!W{G4iXcL3|6jFO*6Gx8DRoCqv9iWD0u-lf4u?L44=){cixgbHUIc!4YXT&7WZgt-w|MNc#fj0wbXDVb8?T;mS>AQkK`8krgED$`iyR?N+L^VCNM?`#b*Mb^F>X zO$w>RB1NBdq7cP}PTqgQDm2;wwv|dr+3BfJnhra8`pn?T(he^B*(A%Nw-WGR6_zc! zVd@nsF(LwNtwR~%a3i_C*q1A)*O2U5lOn_^ktRuE?{-i0y)TreYls4oYrxmL#M_{yf*qbl>3NM~q~P7|m3MFT-=w;k^A!y*lSnY^l=z2p7+a z%x~{v&iJPDaQ~1y4@1-)aSs|qVpQ>r5>vjvbq&`jEBhhm`#`3MdW@iEB>^R*e1f+8 z446J_i7;CfyE}=Y9e}3=5?@Ra^=^n+QF-OfPkhBk1#qZ`Jeenf{D%kD*+y z8|CI+gQo>sJd90)RS=%Y)U3lSH>0MwDUR(n52*f?3LtRg>}e#Sa22QQa7uHFg7{(wgYrf}49qGur73 zKNxOK;nr#W6#z=K-Act|NwQIzBe^En8{i!CV%3={L+qU93RNdHrZF~;jrNe7Nl@mv z20(K{A}s>7T-=auskv6~%->bSI&5${_eb`rT&-bMmccnMh&*g(gjAkG!QVu-&{@?tEnM1Un-9neOP&5G$xW37<+ zms6~%+oDolIEdz$Z-VNG9)gp?7eI~=GaVy6!oZslwbjWqV7uzEqPBibPxHCMYK=bQ{JbIznT{F;(ev?ANeAo+r3Q`ozP?7H#orBTDYYQlpjA%# zrD|MRjGhnJ9k3LQ-|4b6^32L#|!hB}KV1Y$HXU%7`NiQ!m032pro@}i&UjA|HBhCt*oSe9G%ZW9XXKVJU z*XV(4D23%;Rt{1upqh_&w&?xQQ-RJ-a~PpX%6)J$MKL?a<<5sU{}gZjd)Bhx&?oz^ z|GvD0S%Lk3EuMak^!dvmHPIH-S0w&hgCn#@_slz0#lKe1@}g^7oxx%5?9NGEOl4Qa ztChXQdQLr@X91L)+*0++K4>Kh*FUR!?aL(K-1uBA|B?`QE>W{-Lh~A>|I^OgGLp#6 zO4xjgrq52Xn3dn9;eXt^S*)c7pR4rrq#m~HYEB); zK*7%qq^j>+QCs`>1q*oMYZs>ukG1`;ChQM?g9j*9a{Dky1%Z(Pf{(Zwfz4T`ZQ)Z{ zJJPxjArYk)3ThHvnDJ5I?q6B}FU9;aHGNizf(ILREmD0|CH zP)Gd85*Tun^3uKCb%)WW=QZW{evd0gO9~l{TDO_BqgQkSu(VFi8aC~Q;q=z`t~$=m z8x%AHm)y!d;w^tC>jONNzuQf{_g7117?k zE|P#>r3_ba)`%io|GPnpWR?HP(h6I1P;(^3JgBRfhy3Nw(fY|3M4}a&5<2wL$#m>m zIM+6|-too_wBvzFO^%A^3QbaIrE|m68FWE_T^@6onWc3%nikvbbC6aE3&SVjqxVvF zx1~WWfNxKz;5!e{KV_l^3VwjAg+)MP6Jb!`gmY#^sS~~V8W)GT6hN41#~BA@a|V!K z}RG4AFMU-vq@g$qjngp-WUX2`2V*%J_S5zM3YL;xnitEb-emP2H zim*}P-p(}Ca)VR3DWJ8u1X~iMt1ThLVvppyGO!MmZ=PCjYXVxT9u$y9@}eWBu+zfG zP%ha$-}g{bb3HzVKxcQxOz88SW>)rH1GCBtCX-qkfNadn6K8UlFm> zlrH#4+4J_|3z+{O5Hh6OU^wk%GLm$~PhG%lrA1WGfD-ygYSLNz+AUJ#qiMukf#8oT zjG@UPvcf(2QcT~qmWU8~SY~*Ox}$?i*pyqCJrXzH8*sacAJe~fII~X-tUVf`{3Tu- zcP~yC0#9#>TT$4R)-Tl5dF4j1J1z@&W3y4mRgw>)+K#%@iQjaKYa zrOD5?73{>|J6cW+k)MsoS8lI_oW~dJKln&6hW*apXc9lur^2<(iWLK1;VA0cfds*+ zX-e5nDJ1Gl8jTU2S~G?*N=pL%vn$Z@9B2n4^805FBkktP+2gc}fhy6UW=CEk7?`R6 z&`0T=t8;orvP*^`?~PiIVL8JMhX(uYkn9!O9bB{Pcf0!iyAsk#K{1>vRcCO)R=#AJ z1I(h`Lam{vK*LcK*G*Xk=h>!Xmm$2*T9RYpXAeZ+y`FKdy>0s*x#RvoMv|4Jj;ZR$da{168uIfo`~~wFh#!Ws;tp3*D1(Na#{Q+9@@&- zIU0V;ljyjr0ZCFaezBaBajNpDQJdRs+c;rC+Sgv_vDb!1Dh>yonZyb9%RjPRrD zw%LE+kU!w}Zbm34>e*>5uaw4-vnOAEnYF!T24PRP>eIvuORHj)20dqO$RbE!Ry3gZ zRibC5eG8|lbJgGYu=OKno4!7pi#GO?07>L5UW1!O6?c2vHFkba#Frr})Js0DZWOv)Q)Y|ClH3-QrR+(7@YWL!wLd(U4_mB19E?>LNV2+Jpmo6zU z1w?(bdz-}y{GPUdAn=^-ljKhRSu0(IP~6yxeEuw^y`O#q#`r7EZcr(zIt!zMj&ChV z`>dAfeN_10B@dW~+ykNQ8EUOCK<}zxb~(Uxg|r;i*PqGU2@{&5Ur1D2(TvRgQ6(;I zowcJ*dI0&`nwcKaw;d#(HpcbbdMg>=MQ*=*8NhK!0-2&`tUtec|Jc=8aI^7OOQWIC5WuaL6 zJX;#~gb3A3EC)N&s`9AtB}?s_A5u2g`tFm@{svwC^@OFoJ#KQ}B25a#>Q3p>a`W5n z!G2Mw^+?nhkeBfHH!*eRw&Ti5C7Tl>SR68=)K1g-w^f_?2Aw0M~ zaQhGcm7iAM^idd&n1))%B%`mC&{S>-qU9zvf{?JO{|03r|;WFbT(6VR4#d6Qg?Rfga6C+7YF#=rCkvl@l0iHVTS%r?3*0Tz9^=-)Yeb?t~(icMJ}4 zF04&(6A|V+O0IUOO&1$}l;Tr^BV0{Uk*BbTQ(p?xSNCG3kPf9V9b__UgS=G>8PPdr zG}{uj-Fnw>y8ZNl;kiS>25$737=PcbYrD+81gQaL6*BA>KZG>WxIcym?nAW zz2iNYNB*lPlk^$KO)VZOi{wizh^eVWtTn&G3W3~+58bBK z54E$GhkHWb$6m0&y9wohNBCgqd{D~~jWDpXlKVp4)`t2YZgSo_9zBA-S(UP|8keeo z&ilcUWs|*ZL0X@l14pPxeJdV8s~nuY7Z+#2_SEn_qKLbJ9BIasLJY2T|4tU?cMIKj zr+2434mjPx1sFnqZTSX~yDT`q$zI&8IPr;y{1=TLclK!?ZCst=C^1zMZcfE83KSTP zr0Ivkc{{?^0L2JST}g(VY)9UrWQDE{Dt>@ID`9Kn8=aJuPsQ)4m($sSEj%g#NPKPH zhU;+I2f{53Ywn&TdWO6+3aKnX{?aD8*@*jPHj4qOE0NPe;DgRUIHbCcqtGZPf~suH z0$Kf#tOdTtK%ff#xC35EdFw`ZUvl$pv+sNXT8(CdNvn&-=)c0@%3Pu9K{Tr9_aF05 z&*mMsXxN{rrpR8Mdg5d5xQ^84kzZGF^iv5kF`)2Xja&fMt#e7@y(jl?1|!N-L+1JP zJpaM(cg5a^GObqgN{ZP8-Sz+v{zvP4btkp5Oz`jf-0u25z9Mss{EIh|Je~)C4~faQ z=->H;+q5v=Ed|(Vdg{l2AIIfo2+c0y)D{TS^w;_-5O@vm2f zbGQ>xk*s_gRYhhE$=|2iH{dgs`0PsIs>?91js&|R)|GWX1fIPPXi7c8H7!;LH!$2^M1E;XT&T=cIweDj)#5E0gQNq9TFjW8t=A0{=v6n z26{>RMv5e;_CYr$#QtZQ6c)T7-63na=p1fUB0T!eJ|d#xtQySP9lI#&#A{yOD0G(SQ8bO z4E0=d<+bHt>0C+I+OrYiyh`pkdt5-`;8fEbT>2etG$>)GV&ZAmCr0Y~!(isd4q*9I zcy#6b6xQ{*#{jLjvH{`zhPunhIcwtGf0+AQw0DP6a<(L&fJq9ztDBNVDd z91CPa4~Lyq!GX6n-tdo#xxC7uoLVR@e3Fs%+$B=(_*P3JG9#`TuDF99{DgC6E{ztx zAH0M>k`C7zb*>KO>MfuZXlIlsO=9N=y+VBsSB52z_7%;<-DB@CO9GjBc*@Irve-8q z?t!+l<`}!AKf`H>UNUG{?Por?Fjy~>4vG|eaP(c#F4B&Y&JhBj`5q=5*%t0R|7Zn0_L^OG zfaRA^j@ZfqJvjP1*Xd!6vR7StRSd6+-<)!e!9)qhxH_?Q$MW0S+`8R>+o9~eoA@?v zd$u9IwU$ZH>LBFvj$z}P#4NQV`1$AkwMvD1kVR>6jR~&URHUl@PDLtyCHiEZA1~Z3 z8hcM;i^8G0%(U9T?mCTr2s;-r|2GFY?L*_42cZ1RA>iuLqt@?%`l^qvggZ9-^oq6s z$1U5EFHw)p7uSpfG)C#>Mdbs^aB;e`Z9A^Fy79>rSUyo}OW@DmCrNaLm_D`?2bBj7UR4O(wN23#B#459u|7LC9 zmnQf+>PUQYB3mz*q;cASzZHq^7yY%Nb`G0(^Kbfd$eozO>rcG!(G|7+xuogwTKV5iQm4B4edJ2aN@?ZWk zyeZOm?atY+^QKoxl|-&kao@EdXFpoV+Q!WOo-R%iXCnN-Hc~e4kW+nm%sRZGOs3 zTt;k1HW@Z!v)Vqv&s+yPX;>fQ_=vDsg%a9e_?Z-Ijj;poPzk-9Q{%R2(^&Rlm6n-K zhNfjF;?VgJhB5a$coh~@QET_JeSQEQL5}q6QoHw+^8OBn_*UoWW)L}FzHMFdt3~P& z22vvX+p=2c+|6uQK;@o&XGUAoX?7s-rP!;Ys1ktE1Z1=}&_M_-OPm$7)4*FUvS$Z> zM@E0LX&%({`W=l?M{bI<&RZwvH5vnj_s6{_6QQqC}jdH{?WUD;WS9cz&{ z&BPxY$ynEgq(v?HF?2D+893)}z_w|-3Tur0T93lPW0sDwq55LeK_a%^ubmIh&;aA1y!UIC}LJ%RW&GeIpIo>Nzr{B{Z zN%GAHJ;v4i*+2<5ipvm#6Y8N~j}p97*T7dq&`uWkjIObELJeck==NFp9 zr!wfw;ZRJa*ZO05Yh{}OXw+TQb(N`W>h!#t2uIQ7&wInWI|s zzTRv6gQJv@%mV?J{-$AK`7&$CsePgI;pZqW}1Jimz+$ z_C`{rkguqTw?iOG_1mQQJ!Q^%pq!C`=6Lv}Lo2E8EhAobT!|vQ2ybN#qbB{K2!l!S z6Nd57F!rnkDPi=%{rwux@>z5R8>nX;E>GKk+$7((w{H0Ik$$UFrRljTHh=Bgv5jeY ztSvqVr(%ZZ~`|f}Iy=1NRj97mkwfKx3YoVjJ6wg%Q;Nw!-UbCx_L48DTdYlxB9Z}gh@i`TGI zRWCnGD0Q)Lg_0iBJ_C-_DnIxU=+MRX*on0a=EH#q4to}w#4h~(`dMFf3tn9%5i#>E zr9Q3hi)#AlESn+*)zSOo%+t54OJ|o1k*WnScN}{82n}qg=Rzdc&f(gw#SM1lt=m`h ze9K~J7Y|E zAvUjhy_n_LVr{pp*TDNrKa5Juf6|7}+r@|{QT_-rF4i$8yGiD+COP>q@E4wKOaz5i zBm=~(&3L_LY4@&|H$Pt}XSx!_D-KSBIG)Z(x3pb~;qRmHy}PBU-!!i2cDKpAFejLW zLlEXDV!~oiJgTK~xrn)GDv zeo5X$bH(7jFeK~KG68%6@HJ2CgcF>LCAIG;o8TjQ6plRw7wVBaCjN3@z}_CHCGCuu ztODQ3n0o(>6TE78Z@K|GX=sGg+O9!caOnE@6q7}Y3CJPAlZamcp|beAE0?UvgY8R7)5p(jsIN_|+s0mI zs8%Y1(yHVILaP^q8p5Y2J0U?TYXm%(q%L#yI#cCj2^cGv=CD=K!P)vruf+k;98`)ZkJj+FcpDbjW$pto?Sm+bm2G<@GMh zp!fZZ_Qm0P?GLIas8UqXDfdf}(`v)_hCXF$Flfrhh1tq*TnP>vt2?+0K9`?(z!ztt zvhuA3vfKGMSYy1H@JYrQz?p5zn*qvD#(m8V$+NOKwmJSk?7de|Q(yT0E20!>A}YNj zsFct<2})C`!dK~`O7D>x2qGw*2q+yQARtl$(g`&*DFMOIdkGMFOCXfP@8VpYHgo1b z=jz<-*)w~sHEY()p0(EdzR&Zy`dqP_XYiYfTj%&;0v?%N(ZSQ!!m~syGRX z3GK+tSO%vMHr4RM1vOmOlOs#Vljk~5!oEuNauon;B3bkhNH)|7ZL5TS>0G#7PuFA) zSh(HSxj@2N@2@k3>7@E{w*7b8Xv$aTAn2@0fysVieY+}brXm(q(y*zUZ$Molvc6B^*)aZFtlCh`c8m9}yRdATK+GgZA7)k7T20 z_w?ualLe5;#^(W|VcRmiI8RqMaDU}%NX~Urdh%*T>u^B4CtYDJiFRZ>+kmt>wQlN zU~<`@!R#MxZdnbHGTrzdMI-J*!Cq{SgozL|XcH7(+&qk+8M3+;+;{|C%J7L@y* z-0EY^>5I1{O{|!)WsTU?gmj$V*E+t}k2$t_?d?i(%@n>6Mzq3tM|L@04WfSAK`Zdf z(GWWk)bX!(RF9!O%<=&-98@!JwO!ujCRX0FTT{kW z>Cj+9T6~uF4)c|FmlWXcM~W~lk2s`cRiUy{*pH-%`w$3jsTlF-5rz3ZDv{0i^%6D_ z3$-4f@2PAmXP}25KbL;MYNFn{I+Tn3TjrKJ{U6u8XQ1P0Tm~t9DG=;pdVTKu8%V~p zNuYt_68YV;n-DkerH0U7DThkg@R|p7-No+@JfPk5a26HRd_sVRagv`(`B~`?;Q|}- zq%Mi|0nIyLt*=t4le+@{IS6 zUHNwuJ8KxYqps-Gmdd( zt81-&7nL`X#Bhg2n;%knKI_D~Ozz_`%iYgn*fZmLX4$5w^cR1+LMe7dsWQ%D2CHht zzP}=#{<f)`XOERN62MPs;ExU>9VHjFdztN-~Az z{aY6q;XU{NJez?i;Jj?xwelijeoiW?4I(3Ix8Ka?#Gi#V`$OQ3zRy+C5*_uKN;GY1 zD65AE^xLV1uAk|tn!s!N*^TYV|6AzS8|f&Y0dVAKw8QuGkIn<&RHep@8YR0)3CqB};&H5yGwTw^Or;ibCg+kX)z zbIC)p7qggGv%h&K@HY@W9P;^$>!hWwv;QKxCI1#u=}OB~nnO5{F>}o)B*=jy4F`Lk z0@XZeCQ-m{YEXiQ)a<&&d`nc6Nh%>v*}d#X(;}=>d5IhLvSYG5&)R_ZXj6c-zRbIn~O! z{@q_p6()FIjGr~6tSN858f;PS)+VjvSMHsTu*=&T!u@&^CQy*HO_#h9eP?5iQqd!+)`R|{ zgqEJij@>7htJ+LLY6Cu?#N&;~SluaDE5A^1oO4RqRl$@mc7~nXVr^pEqLDJbOL;ta zNHL|lJRXT&G7+p;^Vf2khjU075DTeQqnj4e_4Q)jG$t$t&)qn@JdJS6A%rg79f#Gh zwOUVg*Yj3Z=z4{4b-n-gV;bc(BkcJTwy$7#SJ07Qo=(HY#7o}{*(BWd^{Eo9G1=@l*e-^ej5njV>T;=yUg)y0ZChZU+ zU+yvssJ0G(x{*@8jZcME;(eB9CxFH&*c)kE-12or!l`RB$(O=c9Y5)c`dE1J_^vg1 zRlLE>-qyXI{CQi|%Nyi<&kW-S^kjs{Zc>g$%gcQ@WUm##FTp`nma>WHM!o&Z9D7sv zmUWD{e!j-%w(>2ITLFr_`jLPT6@cJ(bT$|#8g?*S$AA|Ln%t_Vgqp|U*bP~rf z`-%YhWzCybg;x_W*%WtsrDIqEy}KA>ewa!umv;9?7;m5E6e$yByOaW zXww*#%0Zi0+POdT`%GwJ5k4I3Ft*RT*imnA*FFyFsOc$ zvTVlnBiw3SM}+84H}(Afi=STLmdGlCK7Wy!`Q`g`0y z%*#YMi|!e5R^}2DJVN+yR{MIQwjgc>E};>rT(9UPHFZydURO^^RZ(c=QR*Eq&C5?+ z<=ZV1ZQFl@CW{_FpCcWfyv|&EZ-`llH?5}jy3W2mu&1S>eE-Ha^~-Mcl(aa{9=m-bex<$U_e~UTgWlW z1YZx^GgIHVgWzvZ1eZHo9JblAS%eUvwZO`?Yc|8?h~a($qKj8e;RLBP<@aQv&Id1REJHQw1!o;U-O}^T0*VU&mzx&nb zPdY6xx5u=n^O7#lhC#Uk>{@;IE3AQQAudH3OItwT>w+7;#B8KtAy$(685%iHb<)2 zf}__zq1y{-MaVf7n2>H z?T*8V_VSA~!ub^FdQSrdp&zW9S7W0Y`$vWNJyoJ}Rjfl8g#-Q_PbSjR1ng+LNTwA% z9GC=Q?$PW%nFaJtNG^xO-6qKGxzRX#aC;f30|RBT*en@!F)cw|i?Du2`HFY&cqmuG zz7JdkYzr3PwBLpklP*^lkF#-QtO1_i1X!s1%U*RF={N z0j>@H;;iP0SI2K8P>xJY5!oOnYS60QJnv*sG3C5Jd1AqgyW<)Doh4NmW`>o3lYB;x4cfkqGuo(;M*a#e@hz{ zyAUJo+_WU_X|(iw!O~B_{;)G53BG*Gs8~?Uk;iJG@K#0!(O9X3K@-!oef%e@CE@n* zo}(D`Mj2js|DZoFZg~C;v)%eD6--MWD6KSb^`0fJ{hNgWw*QzNC?PHcM$azy<8=NE z$hHeOei$Z;&0vAr>r8_hQgg+2j&u(r5hiW=t@lS;G;+d0vhke+rFdfg=aXNbToXQ@ zv^LylFGY(TaD}quo^nkG*iPxypX$77VYC7^B*>6}MnLi}l%(>-fxZv#t#Pzp<#27g zQcFV$KTd~VS(+rNZ-x&2TATDtTq(1{?_RRakZ?t=TJghM4e#hL%bI?#L|PC6HIt29 z+f96e+4e1!5xo0t+Rd!7Z!%Bn?mv1&7)b0%I94`F^azd2{pzMpWa4>3Dvj3HOXwdr zSf-pleK~eWza7%ja${%)nqO>{4Ddm`8C;m4bQMR9BOm2#z4SW3sn~K@IwWbC6VGY# z>0i)z#<96y3C9bN&373t4slcTtjYi2ow9%N!UR9np^HphJUy#Mghu6Zd(ArO@g2%i z2Q3IlID|>ECbO`Yysz<-j~c|pk6bAh-x_Crg`92K!zy3&qr=~2aIE>9D?T6Jy&Tl; z@4~IADJMM3xS+$0d7WlA5}zS@&>lqz{3g-bnIIYTsB;{0WB$IA$b{;;tiQ-Ift3;( zRXBl#419~u5SGXj{)VSKG_sQ!+KJCa)pZ77!-Ar>iJGgFi(27!NlCumVi#i)gJ1#I zrw&(S+?-;|<2B^u(DCV~_b~IdY|XkbCSGsn94;2Fnebv`Xz^Hx7F^yIGbkhfI9X11 zHuI7~KHacrONy%fL!*8f%I>Y+M=w-3V~Cdy8wY<7TR%KO(<{xZkkzdXZFqq$dV^My zF+Y)ar|ZQvcx2sJFQ7rzfezaBz^g*1Nzh=P)`lT&D)lkun{_Y?NP2Y_(X)al&X510 zxf*h^=P1cbS*T?U8NvbOU06nHzV?=AtX&F3kE>LV(D|()AzKuqU4*ed=w%A|6sA>_ zk)$>e^T`2kz{QNHmT=aa{w%+41N7Qb9$CF;L(;WvSUQQD__6gL$EqFKFp~u|~AU z@(OKDsx9DsQcOz4iIAErJo`cy5Tut}df`o1oPHxn&#Wlm+BfkK_Gj)re-e0xa|amP zrHsrZ{jQ)zm{Z1RcKkaOo!B2zX$8Tn>CZCzlnas-<=(E(=oWs#<6~_M4o>K?cp@6gh6;J<=Jcf%oM_(UQ z%P;ol!t#r=rp2{6uBzdVT*v*rMT|qrkp8rp zYwFssVbHl7gFR`y3uCjm*ICV`nDM>CB0#AnZ+3scdE^>ape87?3k;M z0>|&DBRS$_@O_L5%H3L)C6AxIKU1!Z(&vlE7J8qi7xY@akD-JikldW{2|kVw%du-M6>-3VT6Vo738|awygxzkUq9BGdC6M@lK# ziTT|Oj>6b9Vr;h6*vLR(`{mb6{Ozye_loF5Ttg9!6U=`n!cJQV*Oxwui-z&lEb3{+ zBlY0U)ZF%Pz+AAuO~^;p#E`)b*#vmOpfN)pzGMwDk91Ven{EQno)7csiLm#6LH=Y2 zUzkqaOZM;Rzg&ZEM97k{=_`vDGM^BvhEk(j{eOvKGa6tkWO_a-Bsa|+VJgzBN=ls| zukH36ZmCqHNYMHr1HueEooKgn@i7ZO=3cpuITxE zAEKWsp5*WE!v?<}L5&YCrhrq?5_muWWi7za=Dzl!3sV znsL^_DsxP)%yN5ljOx@MT)TKX1_qO0!c99&e_>bSB+WA;l;lOk*Lz2YI`Q){-Lp?GI<;b0e7~;FJk5- zJ{1{3_OIsX^ zEgVBJDxFlOO!}A`gy+G{&}2;K3iiS;nQ?;XaV1lTol&eE3~W?MW>Mkbj=nHa$zef^`)}DtGa00>mYOK~*evBAi?*^%v;)AW-&Iar#4fYzMII*3 zOAWb}FbBGLBsmWm2K`jtG3Yze8z6>WIH4= zYLW64xzL)9htG-t6Ghhf(l;$xF8f0-09OY+p=X3E9oj+<)q6vkpH71&8^Ztf3ieKl zy`sVMssHo*(BtuYOIfg6g&lK~Usrh`>291eIYb4ZAKra`AB9ZW%kA`gatq?)Rl4N8 zw`9~H{z~dLhTZbYE83Wp=^FuIJs(csVcemB=-C!M866`Ce%IwFz2Hspb={W7(qWLU zJRKarqpukX5_UR+Ra)50nG&e2U7-C+w#gXlsw|#k!Zlw&M+}HQa&cGUe zj=qui-o9swqwj?Mk(z5zUq;a-$zUoqq^DVhQNR5_J@ts;-eaU}_YRXtr5U+qP(f%c zN5l@M&(4ce?r^z?-+QIoOTO`lmaRW&{kZV2^2>JE{Vex%cAmqdDj#cBI;O|bG65k* zsvqZ4x&U%3EBc%~&jo5rKyr3{qU;x?;orbfoa5?wrkE_##N*8~R{*iVd6&EGZ=j3H z;o_gm6`-c)$K{gMyB>Oao!aw%Vl8xTbaZL7% zc^a9SnDI6R2qh){vRkDsmc`FaT<|@_-$}Ue!ep4jr^2FQ2ND4;s`*~ zLPW%tHDv9w^K$*;wrSxBYc??!Y+t#D!ZU6y9D|2Zy(;|N3Hy^$j7jtFpiu!to~TY< z2cllWU6crj+612|+_FCoRkQu>(WHO;cdoBtt#pSna!OvS6EMq)cb#5HHHAENIH9KV zo=U|Ifq&zuX+j51zr45omvJ|y#{1doCM*-&1CJ-##ADW|vxvw4MkG;bExv6tDh|D8 z*G%R5D$nTUr8>#|_5$K$D;hiZ!QbaztG7jn52uI~VU8zxwRG9kNLr=gq${2SmGv&d zJQXSL1Prm{cx=+M6}C+F$ixEO@0c`(Y}B{1b5wpWMjvFc%stuN-f~2Jt%uh}c(oii z{J(#_GCwY6=sqt=xm!gFwzIQpjhDgv_Y=UkIf3?Xz|$PdZUJL1l1l7Ab6v6e>a%#7WCawqC5JR;CT-7Ps1 zTMqv^0~n}$Kw%>J$)*$=!PpQYb$Ba#nkkXMYKTXb+OEi-&2U_x={Ju)sCy&MRusmq zz5Wf$0|Qsy4%Ex^2O0ULjm29J<;~pSi(m5@IGvU*lO+DaIO0Y0JNLx;_rKdo&rdNN> zI)*d4+>l;QcCTu8($%)jD(_41kijoz^qJc7NaxsFi=KPO!|Q&bnS>1){2!lx$Fr0* zx!nxr_IG+4US#*0XYS~4`@H~LOHDk&sRS%QEfs2v;wIq=a`zg{^b}2q$E0xk1e!R7 z{6GgikGqQPwWoBQLpIw488mSt@G&f^Z;KuHbM zR!P{xhcimsjShYe3-)WjRO9&KyE?GbneozvOz%gY%z~7>O*d{#U1X{C?|=oQq94vB zKT*9~cEykQq$PGaW5=`Qag}{9OaZC3HX3TSEPUa;Z{q*^>E7}#ns*MiTTwB?URY?f zoCTHtpbi9euT(8tBZ6D(wJeJfGWP80Wp15uEC$HT2TbHrV{nV>xnBI{?&^Et5jTt!fj;HI)zm_6ta4+7FPB1a)f~K4ep*Y#ud9~@LxG}rCklpH>xNePeU%~H?T@#6S z`ty#Gq^Jr=g=xFA-e7afd;Htz=RgAGfG390e~k?`2Z+QqY!^}buByNj1ssd8%$bI zOrYWjq?ufrssp$EHP{i=e(v#5(@M&gjIA%+I0jyBv?VJP{C@jiixg<;Pj*L96m>^t z?A4ppXT2F6qxBs%j(zS?W#Sx}FdmAzh-TK(-Zyre#xYePRGEs4(G!abZo*8)wl<(I z$-=S`=$ZWm3U~SxVpp5c-F>SS<(Q=t-+!NbACTy^(Al5sF1nyI*uw>ErB2uw3=QgG zlN!&HtCjdCGRF2{n=&AO@k~dwO^+y_Wx=72wHV5o(0B3RE9|3=2_h`#6q^Xq69>mp z9|1|e0N4NAlbgU*J+;TzzP7K*;Isybo=b7IHER|Z_r%UNX178FiUWUZWU(s zY=zJY`UFIiXEkuE3J8^E6?M|R3`FpkPtt_vWK=!&+hk8izJKXatPrqbQ&(-Jp#OJq z@FlHFf_4#)#*u!@+qRe+Q&#I$#t@+BC`sCIgp!cDpVufvau(zvHF2wC0Mx|0G)?Jr_2#hj>h| zZ(0o15NC(|dDaLM83DndCys>P!ipvS<37_p!`LGmDBpM%%|T^xx$)HL;I}|LV^+6d z%jfmTk9{%+CZ6%VBRA$71%4R2*bMc?_-_Y%`=cdyV4{@|dxg}|Gqt+oa~O|vx^=pA z>)rI*iX>Zg!@0sd!sY!T^OB%zk`TW7)G?d!>4|>h^|cx}@+}m97+roHl-Ga1dM$L% z6TZUYm@H50fQa=!t;eV8#+PLnq5rF<+^s+);8AzzDk~WVrF_&dTGkW)=rAErkGDlE zq@{9OvI!u4*37bW`r`e_e>vnMjS4);J|%#%yoaVseTPDaB3ZbXdxM5Khv#=3{)IrAzigHu;pgh2T`$Y~@W57d#cYsYZ|^2PN_wP=XT_GzoaV zgoWGLODcB#plp;4^!%8b)js0%*&*9!nU?Bcb{dhX+r6?zU|z_X zrO0rlK4%uV0B@fIZvbE4d(%3<`?a|WrghHteg*PRU%nUDq~XoR$Xf(&elBdRwvoq8 zpakBHdi?t#cR$aWLenUYGdx98SO>}1$W6BX7CbrOlQqS)q-E_@jE^x0*gjf2(mE3k zt{<9k#XJf}941-xMKa@avR9H=kp6U0RxzjJl1w!CEV3K-i?BpKX3;J9)Y3G;)XO>! z+$TYfLuokP(h<^gi3q`v1qx6G7`dtnuFc3b=#OI7yXl=mxl6gnU&u~mdRjUZL|515VPc9ebC^e~9%qEU+19qQTXEmnT&XYLSK97A;{NjG_tI+A>&gWT0AkwPQ z(jVPT90kR9BEq}8RU{rt6eeUSrJOW+73@M*RG4$tY9L#q<9B`aq?wp5wbmd42RTt~ zp6BtSY&O|bM5t}WDEZ?b-IKckS>mW=3Yy0 zXVgtkx>3)6@o_biqx$8o6GKc2jn#F(qH8?W*$r-1^w7`9GmNx)_`A;x%pYWcM2T23vp%-N=Qxl)1Di>7yq<| z%DJGvm&&~J!-g$Yzsry$%;e-(v-#nPr%z^vi;MOu?z~2kK*tCP_?$d*A!YNLePX9) zKa70082>PvdKi|>RQIAqBJ~+tz2l}VB`91y{yX<8`=tuvgRF`URHph)*y=dK!AKqmUN8*5ih9>r1 ziT9N36vpIpOFDI3JUCijX$=uEo?q91)aJxF>&cG*LiY~$5ud)w%nfb0{oL^r83a>_ z9i!*iEK3X?nZse;bksR(x5df6ypqE4QSF7P+P4p!98@#Xd`Wk!&qOo{WG?hwOKT%$ z0(JYMpSa?}^W`l=_aReXR6DYKNrU{2XBDU>(N~#u&?6MwNrTy{G@2hZ#6I5|uP-qJ z+RKzvfQIf%BUJ}n!dsc@G=H0S>ei0Pu%XpTlMg-J*!rQZJi$4zk*ok&J-e{1Sd7-y z@VQZ|{pmy=g&~Fkx&xw(&-s%dxN>StZiwT@$#_?FctXiv&GO-=YW!zE-H3{MPy;08 zS=_oaj{EQP23coR&$&5T=mumqIx;G3J^v#)dvh0@0s=akrSkXmYjro|HjfBINmOrDv!D-G-A($hoq2 z@iSX%Wzxn+ZO5H-#3uXn7B#A)l^%x8pO@czqx7~2Ae~b!7JZl%Q~)HPs?oGrCzxq1 zzR)#FPJ}i?wuxlurs_9N?&QO-J-*Ldfy=vd5JeBf>!yRXhi<_7%Vy8qFy<|Rqh<*? z%JtDKWKHB#Kzm3JWd*Y4a`jkcC;Hw~>TetLVcYb$agXl!vH4J}m{F)a1DC$6Z@*9HpNm zZrBD-%Cy*Oa^Eh)LO27IM~g$xC+mJw{-m52PZ*b5*IubSps;BN}<9^E7JF(h4i5mCM+v ziSA6?8kQRPwv+_$Le9x-oyHE%hPr8^8=->F<{=L+frc zy=4l~FD-j_b0&v!Z698tf5ghXe>qU+@Wt-?YlGkLHzeNkyZR6(&f!jGJU8lbGb&Zc z(e=~#u6}Md4a-1f;=)!KoTkR-oEbw*ru>zoP1&NW$^2E-37A%}RFCa=#t^x_&*e0o zW4?U51od}H)hT?q(LJbtvrfX*7KZ;M!?#8xtOrORw!E}jE`MOsbS1)M(-a-VN9M45 z8(lhIcC|^W*Inm_1Ruc9vz2suT8L=tFe?11f{B7QUTJ%gJG+5d26(vNt^+c9vfycH zG3-j7JAQ4_RPFE93~KN^j-xzvCig@nZmKrSw}0!(>dH2{SoREMpxGup$M8Na0%$hi z5+x*yTy33{qaV#zZ*!ForA=6Ez2T2XHyuu06lw&Aevu*gXNSxk{d%+elBixpstMs% z>XSn-dW3|vv9%C9c3!H^UCl~K;96h=aX-^TPWywWBXwXhe4t1Nt;Ar?!lS^jMHHvV zN}1Ms4fM_oI+x1fou{5k%?@;gSGQ{rnq|LW56FYh4tjR+2YR=G0u}qtto*Q%wnoph zV|UX5oNFgck1!~udjWu+&niA!y&c{m$oAhs7XCV4d|&%9Xj#3~^VDLt+HPNSkum)p z+Q@CNJa^5>Q)n`9U)B?TV#3h%$a6c{(>C}3-43?9kX1rNul)nFoWfD*&^(j1*HP7l zkLlx>XNca}EH<>WQb*7!U)dJby?--$7H`!65M|lal`uD$kj|aj^nfbk{37Aw8B(O# zRUDR(7Q%3&?6+}tzV^JtJ*m~tZJpfUVfQ!_Uw!mZJz*lv&VQL|cZNV&;>ZNDt^saS z=gnN42uknuP-!l=)ygkeHGf%N2Dd-};ZF}W7f{oXNiRj#G(|CvvYool1 z!G70F&0qY2#QGD?>J$d0g_|PL{ymDtw=KrgGQWXew9zacHdqaY2c$Iu zd>1Lg%NQiycIYSvDLmxMp8qbVDM^?YbbQp(`R@_n`KwkLF1XIOWKZd{4K6SDop`BV zdwoV})u0^hGzQaRhUf{{5-z+ZUqH+OLc!6h=>v(2znw>sfi1-SP$>FrczF3zjo$}n zJw35J--mYQ*w53+OBme(8&3wXHNN=xvZP~Ih|1}`chs~RK9E)r<# zQ1BazR?5G}$9jF=gnX&S9Fcul`8bnSu4~J?wk_csD|oP@duG=7Av&t3vG=|2ZoH=! zxme>;VCyIH)*7F9ipb`eZ&1DNKd7Q={fYKiaqeNA1uaq7BRe`){n#T-k{oQ1bt~AK z?9P+ilJ128=(A#(7uyu6K?(4&l_mDFW5(m=DUXkCA?V+pA)d z%NvM9f&Z0ekCYf{xXeP&!%BxcF8f0%B|v`hl~Mf20Qr&&og-;UO1~81CO=l39Hda>R4eB=L{ltuhWz0qvfHQPr-o zx#D4UgY(C89^vRmryH$(?J8LLFSOhP-3AH-(a_$1m}rb-@SMu69*HSw?__`cD&ekm zfb&f`)W4deKzP#4KbP`eUF2vaQ9NEw%sLuF+UOxWZIEZejg_>F#ty` z@2%_|G_UMk0du#ym6j^Ecu+ux$J^b?!%G-1*(ZQb|mtdcq;F;+3pg z_{$a*rV;(-+Qb>mV!*@4VI80C*pn%^v@#q(<|Sj=^(*7mJ&H4r3-O7B?pf05nbWSfvtn!sG_CWJ# zlCl{s4y@;<#D%^xA$}6Qny=E>GFiIb(3g8bpWX4R81YtE8!J$!3)@!+UuXSC{lKm5 z0~_;KMc1+$CAfe%J=qwmgv3NOR|?H}P?^#M8t+W_e9>)v;B|iQ%k&&`lmb{kc+f7Y zeh=m{$N*5X7b}KJ5xkcB0J3G&^J+?5mYWz7Ig1 zNvMSHlN{gGPSTeA^XM?rcfqsb-L=hDH@@~$Jtaf@vy01H7T*m4&a5Wth>6V{A)jYk z7tSJEWkvf7Y+{)UG@s_iO@LrFZFim_+8X|xXtV@zE6T#yhaWu18s;pDN?pkf91_#4 z&8RPsQLJ%9clZoWknd!R-j+{*!^mG;jwnkEQayaiRYL)Q3UC!3SgP~}y3(iM>|)Ka zPBP`)cf4zYeZ+4{x@e^x*bSPFQz{4)u2683#uViPx$h2!+yMqQ0**Ry4LfwcOLMV+ zRx9z%7z7&8{5?5UY+GV&M`7?H(1;(f_hbcn#lmZ+8*H-z(LRw$D|>@s3M>Mxp*m-* z8R3K`$&Kza*yZ76+ykG5i_;b26TVYjI*p!+wLnB;p!YkE(P$>m$=2Sup{Zm2EH7_7 ziX$_4T(mG`hJ?5!B-^hsQP2$*1o#MX?{B#*^#Qv-r+drv%>3b6v8p&cwXoMI%WO(Y z%-LxQ$3uRO9BW0gtg_6PId7Y*bz=)j-aezfBB*q>)LjB~%8|rC@oVpD?xaf3JKs^A z9K@p+%R3>jf0zVe2EZ~8&mQ}InLSK`VMSOs$=bxNjQCxIuI1|1Zf;8pdH63?6k`rMB0Tk(NYO$4&g?Udi4{9UQ;(HdD!j&np4BPA?x zI=^iRPUq#;e#A}D%mZ@HOm$)tx;mGJWl#n;6Lh2G{bx%do3~z!+dAIybLI<65>a zNqfsOmrRhk75DHf^+&JDOce0G54)$(e`K;1(#}(-b?#2edi>f7pP%5-F&O`p7V=p@ zs@9%=s4G?vI9&OPj|F(ERH?>2U@e7S98CsU*~xEM?Efw%UeL|TdNmr>j#O1~t`A9tj$q_RD3>yNu^sd&Z|F5&eK`fAUGN^ZM%LGmncgA!Aogz32xdBoyiU*d`ej z2eWGkN)JCAWAZ<)@D-MRgFgZ9{~~sOf^9~^BAFTw5%v03(6}!4NIcg09poY#vx(Ij z7Mtt(AX%~H%v2gWhqIbSg?y{)F=_U$_sG^v$L|Ki5{{QFX&)c{$&qb8!-ZVd%uX8z z{_lf)ZMYo5;Yyi%!ISJb6!;an@0u zAWqKRt+Dn*)|Cgmh!^SvddhN1h->^l5<(qy?ZeGhkbg=KcZ{wL5401?>GD}j?oa)91QNBns$(O5SdfHD#JjFVK0?}A)UFO6fX#+8{7Tvda|ILDux)s7)~Rvd^2ODwIlLsrY% z$FGJlhx)qq{MTu>$;k3=P2&)XcK!zC&ej$QzqoLBd7o7`7PC}{!x3Z&nWxpFwQ8j} z>)Wd0!VjP8UzSrBK~J0!`3BhY8~DyYXwdf(SlNTeCFWVPfWJu(4!biIIp_IoVK7k4 z{FcksB>QTSGnD12a>?4&I_L?D`JKM)IgpL){2U^V-_+lu@NrRhhhc{*gR z#`||W)$MEoF8^3m%yNi{LOFcmL!^uV0+&Gg(O;t^YS3K$U#4`ex+1&FFpBA3vt0D2Gny zd_ASc6~5~m&)p60myO_peqyk#1L)hq5teF**OR9feEbG$6#r)ErNuXsf}A(&EswNx z4KzDZ3pFo%2;%wTGa$R3)Apeq9;H_UaP+lJE04fFIt&u&s6LrkPGCDf$9betUC$~I7n;P6Y z+b%OuBX9q!4*nL~L`o?v(Pq^u$}TQOVh|zIq|P8CtEs-{W2Fn=YVES&+roY+Ao=<* zfKN^n?Z_PJ36+_`D^d*Q*C*9>n6$ss_|$L%$1B80zwr#04I}rGv)--lk=0;-ZI4Q` z&ZrQwPJ#wREz5S7>(w9r$A)rmca!VDT#2KOD@6+XS#v5W?;|QoSGcj}!04 z((^$t(<3k&#Hcb%1M(<|i;!zxqMI}gBt)GJ-S(F&90j1oClY6ZtW&rU&@kUltw>^d z^1^PTfF^MIg(iSS2$gV99>2%_^wU?Ll zld;#CSZ2*bn(Lo8@?#J3m|9g+C4#BQ=>u_|>BhUceF>Tir$k!@ZC7!mM#F`xObo8 z#)dD-13d(ef@kkY)ZncekT%t+&rc(1dMxyEr0$(j(*E`w zq=?+$eb^3*>eer40Js!z<4q+Dv26rq!*Hg8KR+MHmZn#x8n}N%cioZFch_FIc6#J4 z{5ikfpfGy#W=ROmJ(C8Z-bS{qrB0_)r=ZsU}p zjF&;4t-syBuV~JoJQcW$zrRBaa<+!|+20aw_2{uE*%NPhpu)B&I-_TLqE760V zEeBdm?i3WjUUzsCGsKfIXX%y{K?}Sj zr3JJDs^@dtzMU~*(0PZsl&baYEe;whKxj8!+11X*i-9c?^Yb@YJ$3Z6m;M`fwdbqW z^xF!}?@XJ}vKG}>o^A1qukX0brng7sCoASOYIYs*W80y_+SkHC`$%w=X9%CtQPQ<& za56XbS~A#6kFvjxwD_$*x>g)ksR6F_hKZa(eJ#h)TmN@muI&B^HAtX5-T>YJb2huH!p8s>0H)_YSJqa=ni zoI-$TVzl3#F~4T^H1VJJlz zo79JDKIGTTnO;$-!3 z9+WB~Ao5pwjS#Bz5<-H2(mN`hC>^N*r3Xa10-=V`JE4bAl0Ybjb?@_8>zs4%TKDBX z@0r=N=3%edGr!;WQJ#7#R2^gHVl1?-%`pzu|3X4kiiMHT`ywzhTNEb)^@^3s4`g#^ ztp)8WC2V(G+`~vWX%(l2TgtQk4Xe0JJD%QnGa(I!i`JcyFy!H!+AK=Y*s}NH3BMNP zJc!R{f4Q%(taUJ@2ug% zf$LY|$(|oFfNwN@%~}7fv!IqJc{NEU0^2+WjOpFyS$Gv8d`Zjz*x5g_=PS|8;PLb{ z%Ss{*;xOH?8^OLW#%nDi#v75mi7_2kM=WoQ-`TFbTh~fmKU@bO#l=XN4b1K z!nCBdF`(uf4Fg8+31t1iretwW>6|jkZ zC^0}Dsn#vGook$^T#7|p?_EOlOzJ9kh*QV+1FkFgcF}wC@0?=l8+Tx3C}Hz{cgIRop$*1TLczV?0Lly(l9?|;gm z$)+ok^nQA>W&e5Qjgi_YIpkIEugAQZ9LeS)o+~-3Eh<`Cu}#?S_e@N6p4H1|ADBF& z;e>3NEGa}#Uu3z9{dEQ|POjXqhhebn8@H=%Z#hyz*+O6R9x@uP@13xn0+&Q1jg7ehf1fuGLEDlBuuZEpoPNg4gp+^S}U6?I>~EwLBE zo`W}S?zY^H@K;sMe;W&_)JpxbNy``8R>r$&sr}nKVLVHi+eg^j+R^pJGi~>cu14QC zr)2zln4*mK^xV>mmvP@A;;8}_@+2O2?2r|#SjM<(^eeH%`Yg)ag>>@{ZOi5j>@v&D z$J;HT)gbmGuns(HX{)HBcP{!h8+|sa4f{*sS5@Yyai0CKb~4rTAgWzjagDlV5@x&0 z_W3C6es#D;)F+uEZ@z|e-M|N2CVhQZU1wZN;pCKEx$5m)y3?m=xvo0lKeUu%owm3!;cSQ$m{ z5Hvh}lkXKb=S`bFoZ{1gFhgUzdvSSFWiDg3@brd=RBYPyv+(yQ}S{7l=~sX$@$Tgz3myDK&R$I~$jk9VOta^BA|UB~0&5RRfG8q-#rH-+u1yu^NH&2Dj-oK7+FnE^Gd-y6V^ z5It5sRxVb(D2dHJ9K?k$8wcrmZrT2{y8-3;ICQl^n=-!!g#WjZPWn$R`;h|qR8x1H zhNpa6TvcQi#wsD`|8n4oOp*ijkKb}>38p+!K9umq#oUs_WaS;}YL}gHI6Jb3^YEg% zps-%fI`0MB@ASsH?21bVYKUs0~FL@a}@|HX@4~jc<&QWgZVWR1utwqvtFY z^!&i7B)=wW{BAX2r?aGTBS5km7f=|IwZj|8@z8xs3wHuT%^+ ziWx4h=)RoIS|!N@V!MeoXKjB^8J8=z$JtxL`MexZJ!ug;8N3-*Cd-~jnmgt%?e8o; ztpokPF+5iU$^nSWpHos>*D-79hYeA7NBfw4Q99L5Ki)vof6>bSa`3Xj%TNi77%#?S zyhjN0`S`>^mHss?!YaSPs%uyX^CqC;>-p7(lRZ28-{)--K&U5s&DW!Jsu2rc@w-q5 zLu*{o+xd?x5XFqPvn4>MN?;-J6I@I0;doZT;V&UoyJ~Tki773PZwuo;NB}2kgTUWy zs7UU!pW9H`b^N0V!IPu(2eqP<-eD>&gGvu-ZADz2?dn?OUe>iOtidJtz>0E2d{$ue zHa_+qLBKVKULpm4$lYWz3%dvnD*2LX1V8rx5hr~-qRE5YD3~T`2IePny^9+}sykn3 z=R~S+yD!@QqFZPZV^$r-$AxDsTsFC#OrdfkDXgulizqP^9)2HNzwc_uh8`5Y z&ym*f(uR%xZH6EuxR+4)S*ly|D1V@j(G3l2`M&d@^HzC);0Ou^EeCfH``q$7HQi9qL(b#C!S?b+E?{qlEyH6sPIj*7k1Nt7 zB2Xubkoist&xH<1jt`=}tU}UvnP}UzQjoJ7DkZ9!(b1oMs|R++gSh+KLjoaA@f&)w(J4ZcH^NaG#gfQ$trtvYQ>x2BM!1ooK+wHUMwFr2A za1FV31;%*Y;?ZUyHrD1>co|CW7{@J|t>ojTd9y=R@vDm+?QS+T>vH!Cy;a_)6W;DVzawoqj@=>m9pWdcSTI+R&|xO*+J3Urv4ur{m{e?hKisDI{CLGQ<-t<9FO0I&y8LJMj357yr|h)p zUQxG~Y#F9uDBq-0=ChliF1%{rW^1-CO{y0E8tnA&>+*wJ)Z}a{t)hs2T}zzHHI>c3 z5mKm}Co%=$Jr>Lhg7kCBTmt_bGt9mP&y~tt5pym}9+<5f5D$(o2p;U^g{ZI_k^d;P zziK|bE^!QhN%6Dam_@bQy@)uCG7yJf9Rg|YD0nu@6|b{0Zg`z18+pHA9_0!;l6Xnt z;hbeu;eZi#W6BWRNtc4GArHK`*P^>&AM=3pB;8Sy#D>-CrSq=et@9#DOKrf7 zo6kO?2efb}Y`#$66wm1LLisI*SJJK3#GEnut7_w}*`Yzw-2b`$7&|Pk@V+O??G^Yx@KIaJdHnJJ z<`$^onT_I%NqD^GF8~NXjEcGv*BdDREKQT-sv!gJ+A%NSdT*I!=qmmd=bllNT zmhhzp+$*9BK{;rKv{+>*wpQR@)~CYJuZ5V4yiC1e+)=T!_d%J*Cu zvs^go5X%hOenY$&#+FhBdvE`@44|jVq`EQV6wF}*AfZg zUer&3@=>0A_e6eKoA$nGe&TfCQ1X6g@0wfi;KX@}_Nm<0y*3x5%^b`Q=8XS4cCJ4NokDh$ZViCG#%usXWAye6 zRNF=*HSTrD6S!a+=gTo0f8>7|imx;qc5}v+->&Yhk(i_&XsC;9E0eNtQ6XQJ1{pVT z5&yoVxh`0Z{-)=q0-2qZFlFBtKV_&>+8SRgZylBceZ1#x<9EHc!e&PTI?ti)OIp`s3f58jlAL-<)-oG9G`yY-o7F z?@cIUkwKsN@?+@H@D|^UH}zjm6yFvrT1M<_Y^aYLA8}Pmt{H<$*?JG7-tC(N?-?Qz z#dr@$M_8w~3vc%}O}=mV@HCc|0xYdp+?)S?vpy=*7a9j9_k&M+wU3@P1`JN&&5KMw znfF$LKm8c-U8|@7`M|%l5+8;kR%#TJERfG-6ApoV|JU8RBi*wdZoe09jlccl|G(M) z&z|gio>wmBWqZ0F?^jEfNSJHBR()?%txs`;x7gT6B|w z-rW$Q3USKLv$oF)+R?{B%Cs`kfduMB>r-CB=R?A26FvXZ#&NL}siT7oH>;WUrE5)F z)e*NYTaxfRP)6;fJkuAS3x*$yUB9P9P)&=V=A*m6<&HHU{mHQA|4_I8Y#`^)X3frV zyeJr4lEC&)bx-#$W#3=E4-3EKCG7&()|EHYl7+psvrar{%ItzIMV=|~BB1+oUEMSW zr5BT4TL}9_2EpC>aa1b}=4W0l*rr2AS2MHCBkpvGrkI>lZwwdTj@ZWI84@qz>wmAv zX8|=sL7nF2-DSS-+Sa)HzC|Q!JJ)({;_cQ7IHJ-CJX}a`ty%g$2{l$&dZVu!@U72!mi|I6|F6QYx8ahT=3G zH{zS~-wyfbuWQ>GZ(mcpIGwkmqAorQ{dTc997@X#hBfRRPwdB~w4~Gi)GCD$A6RSk zc=y8RN)?tZY%g$X0F#>F-6s?9s`0qW&BvR~kc!rKIb>c}wnx7xpVjwgeLv2n{iSMb zBMtVp>G!A!ixUcnYB^m&8CQ#g7%-2Ow^NooxAx9m*irFm=BqYtK!-7shdS$~X$V(q zf1&SpzeFqFHB4dm$if!7hN90%iNP~a+l<8;tR=i=A-A@({CENrCTq)0_a6ZkZ&U_E zp-7uGZ9M`$Yf8n`M(+;;vl7Nk52rjS7=;Qz<)ei60r4300}}LupYpc4 z{4W83^BWb4oNN~o{r%5#Z#!wLcTv3)yrTItTwC)u=}~L~`_H`4ffzA?Z3xryj8rjo ztHG1s?l$NXD`pKmEPvMpE^`H(i1~y5uSJX62*pXE7tNNv38KMURL7#0jHdAd?+wwH zK}q+K)=k#ibzuB&`TZSGWtNi?1YMFcy? z##PKRNW)0PBrDU#c}555t9vh|3l_hT5$AFMFVSbSzrX<0j55BQL!ctg9)GD4_U!Wo zR_Xj$^<4aX^IU%qQ6tCyN$-PnnLyjPMa#=eO|*U@*?Vq+Q7ECdfza5of0;#hhK*O% zI2tNczMiBB$>E}fQNmVLUYF>>p&H@Uy0Ktf*QKX?8dc=1Kf+gBVlaP6Yr3DV*zL&C zIJ)+P4$6zZPwdJ|`US_yLZLAWanrnPf1K!)rEA-t^|DrYKnl?J=+3q3P6G3M+YoXz z);x!M?t);+j;OiU8aM6E={ zuVcGpi9YzBm-?R^6DuS%xde zZL>lug}|bPrq%gBgMfhUqJZU4(ZD`pszvnDX^OSo2MbJ6n`A9FD!4 znA;oia(gqMb*F8pT7nJGVBb12B4Xn?Yt(c7QW@R~Kh0cMJNihFx^QfQoTU+$UkhjD z3*2#Exh!x93IBB4b;UKCLTX5gxAq`H_}UsI-e)eyiFwvD*GB5W$+7Q(yZsh!KB`8% zC7O1;^^%S%mTwYcD>*OKciHW-jfj(l*50WYpBMVEHhM-G4R%z+@^W7XSi#Z0tWspn zPWy?|SPiDSO8*^4xr<1&ue0*{bSazllF@n6cpblG3d&;O%a17+{BQH7u`Bnc4f6PJQGWchvNcm=hOKHkqd3Nf;_h6W8d@D|($gOx z*+@M9cXXvlChu!f)uJRqI#f3ZQDJB56G_kO8R5jRKPVMCv3E~aLjH`igx=F;1;U;& zmWmXJfjqb5J|_xeZPXE6`}mV;N1<9l(C+K(Vxu`ME3%^e%$q5xzvgx1q|;_RkIU5W zk3W?Uvt=6llhOpb1;Tw-2$Ww|8<#K&lEQbeY<1)rjHG5e85G*)Es}LP2JKVnc3kR- zWB1d4*mq#K%B*LEw+!lsDyXtZ5)wM%PDu`d&t36JYYSoDBj@{}ms@KGx(86098Pg; z%MMz*>je9Fh{YUh_T;ZV+XQRy;s?_e7sv>=^Injdo6CHl3Sj) z*QZG1eRUyG^5$RIV7S@0Ns5Qt#3Z9F%>24bV@TJCc!O=rC5bHnpth(cvJ$p$V3H@sn z#gl1mX>C_)5rZJMusN=B13%W)?)~5T193dSl$7nD`6tmJNv*1EslbEJtrk~Y_B6gI z+!*%FY3>6?tYtN7EC*bAzg0foujA4?s04RsdOnRf7gE6&u<*Fv70M5W`c5Mb zPixF@o=<8S6{)sx8Gp(^Zt~8XH6%~$2H7RkG9T}>w%z*SHiWX^K6g(M-oMiWYzTPF zv|00&$wjo;;w(G!>(NW$@U;XYzLinnzC2nkYd<2V%c!+YgZ|r=W^f(eOOb3qoJTBn%ZO zU;D4yCdvL_OFJYnj3$HEaqihb%=z*=X%bq{AONvXtII@{S-nt%tgZo>4v|0^zCW#c3D zZ1QD!pXnH|p8a7Y(BFg}@~$G@itfHnC7Kg=4YoV-Hq!F;mY0w&C*)Hgd$>es7xQ-b zqAjVk;ljcMhBX~-%^J3^Zo;1YsP;VTigKq)Sou&>*0nD-7C1?Pfs5xOuL!jpNL_RUj+7#&Y$JPZ-|5}#Yg#?O7U`|*Pb1~3m<2y z@-eich!ds3biNghgE99v=P`fbo6!l`ECvB{k-RAq3_Kf0aVLTE#t3HnPPvzD^>J641QwLCi+_$_%~>c>AvSh z7Zt$$qR^Y~*wZUB3Ejc|wpYQ=`5Ja@=|$jjin{a#fTqzNEKIaDRaj_GlVdxg#@z>lSDLKKT%&hC*J>@{rQ zpMCyuKr6LBJPLt)e%0}EH>!r)?`+%!Z48WCJa7CnpxD@XNnByD{jc@Oyjd^N#F)_} z9?&N84Q@C3qhY8WxKsRNHo8<-!_%E7ut&B%6$QJ|NXZ<;%-Lb)dJ;|+9ceB05gxjt zed_{ygUYI}b)URZL38{0RC!=Ts*iJMIrCsk!yPVD%=(EM`jW)tB4b-q_aEFDYT2{D zkx;?v8&E%h%wX$CFkFPA+OM#%V@fLSCp3{Q1JyIJ4jPfd3HcG1^9WZLdIF!UcBeJe zIc+08-@jt{8$Rmjk+zh~`4P0a18|{A+(cnodI8j1@)b)l!u!Mop;KRsRg{y#q0k_<$&|70GM{r#P6cF6e(W*5HH&Jh=8ITTz8Syg6Vs=*ko;&Dnj}f?=RZ> z>KV{hEE*}FkE6c#4Erri+^Tt}TKmY#ORZIYJ83a2G9GNN;yXUPxjL6IA;(R2U9>yp zZ6HnGq5++?IWe)RJ9!Pt$Y;)i5W}zpR(FZ-5mJWAD0bYIN`r*DoLJX}a56->v#EB_ z$h-3IBh-6kg9qM@-UP-S(ovVwi2?PMFSym$xz5SleFiBXys}?`RD>OlHi0fI&3iA( zS`Qmai)Igr<(L#>yVG)vrOIJN!iBN9nRU}0zOzx{4-eYhU;bheyyEdd!G$Oo43FxIH}T2p$g|!YCZ>)x-$fepQx&V2fA>_a}~0 zD%`IzSyZXrD^t~Cj)C0HAe$y3TTj~dKOX{Ez7Yd=SgmsOj-V05gGB`f%yP#B=IQRr zuP$Xm2L8Wgo~LYz(1ADB7ps^hSJ4OZQR;R93c3ExphDFp*xs})0S;G04&aXri$UNK zycC|ZoGn^dRSCH)5M6TZQ`ZQ@DD~C8R2i}JHsjY+KF+U2qUuCFw?A7g)mI`+Vm!U> zeYgePoi}7K`KzngMbvJX7Gav{5Civth zcKN7MiZsDloW-Ro*x3kTSsTWGhPl&-UhQ4K+_ehzYDcUo)6)U?UjLCxBP)osxbJj| z^BVaU<@1K!3jYWM+<_#Jo%&X+|N4&#yyVjel>zux zi(Ji4%OM(hSFlnXy!Pdqhe=mi8{axw`;Gs~+Uanl<1#vxBUvTUeJ5lcGy4x0{Ik;> zGW?O@5;9v z1MTr^b1FoFd8|`plwGduBVJr*J85`XLE}dpz2CT4n+HLKia*|&J2{KGcAeZp{nvZ9 z^OL&)+XqY@d1)fA)*o~L4BVnh5mu|<&kR%>kQ}sPXErX(ccIl?tW6{WI#nROtRM#M z?O7W735eD@#|DO`#3~n$b*Xyx<&1&eUc1)EVDLb9`xNr2^k^eB=leCLFxESizR|{j z7$$IkPXT%GKxZq$0Zo4Rf<=8xj=FmM;_16)f(=f&Y)55=AjA0>c)vFpI2n6^*pJ>M zMFyaarL^;4Lr{4Az*gAtA|bl1;l47NhM^lsx5N0r4lxHS0!cmx%*$|`+Ur`W0AKBG zm_}S;EF51hyX?F9$E)>K@A7A>7f5A{&`$4F0@3 zGpnibQshnLMoE(oeI3N^AAd!!cC@;RU_4W8hhx5$T^c=U>r+?PKaPCWvz6Af@$*1-dHgB#$)9f%@35>b)f2K9IRAlMZ_oS`vF6z{Mkd)9F+vhQ1cKGZuH17ht0XfCp zCM2eFvQ2Qy>T$v@MII)oCJP=*G;pbj4vcX$Hd4y+Hgik$r6ua)EjFh=t2M<(q?rlu zR^lNvTU=Mo(3~uHCZk99T1qTlY?UyumkE6Mtz0@4Yv%cw=a-R%(&4f67wJiMs>fz^J-)@zoiQM zTHS3>vm0_XeR~J~Kv8WtQuJ_xPXv!>c9xGUv`c@@Z-9nm1PY5%x%7fo%bb~XUujV$*ClRBBuqQ9qwLL z962PRhFm7lUlzaCvjuvnLV}-dkV~swYjbzjv53{dd}DCYYIqj9gwhT-)ujBLOK!PE z+*%)ca%PZpe?pnd6s%z(NBa5VXoAt!Ay25nUc>s#oa*IkZz0nfH`c2?^ z^g_iBzR?!SQBEJ>YUPRpN0Q&Dist5n)sUt0V>OFi3bajN9T`%8`J*#}|K_3as2-Ln|2fL| zp50F?`HrrPBN{=~S{0d^E9%GxI%01({E-As)?1`8szlmdvQ+M0OKXy@Ot1IShPq8y zy2LL5dS{O86j`4|Z8^-r{7+^mf*dsa6;TbI)&aJ-2CRuqQXv41k5@p-&eLaA0Vh|N z;W8^a;0Du$ExHj)VjJ*mJw0381N^nan73YGPa_^>%j84mB1@;gieDK-wB%ja#**? ztKGEM^b$2MeUayhciSD^ z^Bsn7W#S9~yjMyIa&>RxnbbJBsNul$T_ZgIr+=G!X{s2m`nz+W{6VQ%f}cTxt?O>O z{Lq2JasO(OG;hH;?=vh6a_bS~{HKlkgm%=o92M+xDy7qNJ~^b}xQ&@fxqdBA7mx)X zby?K8R1%e{4suz0k(hI&klR9FV$89PNtRLTc*+>m=Sy7VTfwgddhXR`q6K5W3utyfZuf$s&-*cL3(NG;X-eN z{;8eZP9LjbHHKv)m z^%(@$<+R_8-pmCxIehQ&13mQtuo^lKTDiOo(yxA5I}7}HZyKuTvJ@f(KiX2SGR1pu zZ=->2m)n1t?I&0U$CoEX0J^sYk+Co&`11*5kS$HS|Ae}=?uN(lVLKBx-)?a$a8e9eA& zS=Zt$%kI8~!-0@))$4?;%ma~|aChNCU0nP1cs#_ES0EpB(FjTa<{T97+uTE6@C9cT zb=qs51j0BoY@tjfzq2|LJMlLpng0j#Dp`@O4zx0-AqIVyelken~Y zNn8>msmmhRj_{FuJvw|U&lT}_mu@Op)H z>)#*>+;e1le-Ayt^fgV>Daj>sPaqzX)~gTpjNFO>K@T&%ZXt$S7t{zyiwS1iyRAsLKwIJ_Tod%?i89!Zz4kHP`V& z!cV*;!jlJ(MlovW!n)ths3S*)T{PEQ!0yi{6z)865VBs~0hg=yD9hJre5q$Mcaik& z?48}MljW{ldMW<2yiG-ys6M@nkvSDwU*oV21o36m=^y-X>v>Z~dc7rWCbz6|MLW<$ zP$I{bf4?3T$Mn1l65`HORsujx<{olzjgva%b`GLXowhPOD^Z(PIE2Tr(W{El!-K-^ zEgqAANaLY-Kh->M*oJ$uRQJwk1?rUu%TWz;MG&}@@9dHnEJ=4jNa8kzY$%G)kw%svA+KZZ)VRWKWzaW1A%QXm^Lzce1UxU4JZ(ue4Be*u2&*nYr> zh=!~tI`>HWCNq)!;+m&vGKPiAEf-(9|EkQS@d>zVt0XodNeT*>i_{jk%df?HT6py6 zU`Nx~p&tk*I!z6_)r8R5)$5hz%3DU<2&O8M;1Ppe9 z-{k1JP^&7%ed<9={Gi<>Hl7r`e;KCZX8CT;(Ube(2SUpAQ$Vn16=XK6{h_|EWW>0< ziF%nia*|z1_5wG#Iby-`sr~N7rrp3>^A@v9|5S%}oXs-+w z2uieH!Yit}pQ?MUQrl9Ga_T;? z@I~v9iox2VouO$$;RGK`u4iRc)@>D2c-HVIR0U zT-IK1qt|(BUWu+^Kn7GK6sTa-eXY%p`OnYz!`IfT{%oL=El7}Xa6cX2X+Q$P>#n6V zcV$6Q{KcGleDc<$n3iXg6ts99`?pn_^e2%+sMzV#KhC6Z8CJZ=UTVrB6hv%@DEN5a z|Yyw$MPSbV8UB>h6&FG&MW z*8TOv33|H))$#VfWKMgxr=Ic2(0KP4^VUTz48j;WS$Oul{ZbNa)@XWF&D!|}9g3Ln zh90+_9iCKZ#VR${+KZ)czIdIHH+dRy((*CmENmQhAKwE1C%jt5X7pTsd4AlZIOWck zf_xSe(oK2Z`dWv+Ym_i(r=_d)&_cOM6=W&JaUqv})Vn=t29`n)RdpWPWkVN^skBbn zHKGkJ*HbAnh4lGKE&X^IkSW*HyMGiGg*i)gl1A>k2jE z4gpkU3SXdwhQbsvle>w2!rIvft+CpWm85#S{5B3D7nLI=UUBk$s-=`!-pCmoK%fjU zG;Ou|&_|%it9GW^bfgF5wGbL5GV6pcTi=pybbK!(N%#s?lg=3Oi&7s-P}JWJvxFZN z({zT=Drt*A$LDWC0>0s+gI_%X-VzLrp|KoX^j2HE8iU&~m)-gIE!$%LIkTa25L@dh z?U3Tmb-On$Y026*bJj9Kc6H3`u*H<8lQLdL3?-=pwB33;g2kEYHal-4f2PNy#V`QRpK*d zI-A7l79R!puPr$9(X&haAVq9@YReHZB`|J_b;W-gAE^6 zSy>Nf;rN5^cr$4XFOf%r-X5w?SCnovz;6FNPquQHz&ceJdbMj|hUNGMY1x%}LgL@M zC2@1>l}WXo{AJ!DeF2QP2Kwk8p4R4ZD9y%CjNWqox6{?Zt~Yq{0yi8m;c*Hyv};PU zg841QlKMXB@D9LNd#XGhJBB6^>UnX&=dH`)a`!1%qbEH)DcBYXin{50+Cy6&^p?`! zJ#9hsvWL$aO1u?X3liQK4xZWPJf{S&7+&z>-&beh-r=qPF5bUnePukpw@hxxSfh77 zvfRVldB#6TmUA!eX-i~}9B)!y&Fg@;JADw$sICLr6Sp(-$Ps5u>cBsfFJUoc2?n=c z%Wl#>V!0uq5C8pM+{k>(99$*yFEg*oufGZTeYe33nZDd9ik-^oB2OGv?=SVYb z4^ZRm!)U%tdM%g1j2Zbtzb&~Xg|G|sO;mJ7gIsPm_x1Yq?`v+;SihTHaw;+$tG1c+ z&SP;0J}qieCF%o?}Q1Ps*>JoS#SmOM4D}`<#lka(`Op8XfPQ@i zk=;lI$nDKdN_Wi^C2k6KpIv%nb?Eom=ELE@C*ReXhS-Y&U6=TnF<%S(def+dv-#&P zMrKe3U~DEhjfJTY%9D|mc1Eg6eJ<^UhFm}Ak(3o*%}wW{jU z56khfqc1a+u838ho%qX>-W9*jmur0BpDR*dEn`gPh!ziLr+`aXP4GU#-XDH8xoVE2 z9DV7p0}=NhWxB%`@x~YL4IP+D*Ne&~(t6^8mZjQSeRT1e4Pk#l%sM&w`#(Lw4_>Q> z&vf3uUL)Cq$qV?JD>HH`x>N!b4-VaRv2MMm%Akmm$XCFa@w=XD;*{}}+gB3MqKEqz z1s(MJ$H$_OGG@>ycil@2{Y+QN>9#rhSugCrJiM7F|E=3`trYW1GBI{s<5@92d1j|b4?;C(qV^=#FaY%`L4-|imMVs`}tl~loJNQEx zIKmhk!Q3;bQTj;uHoh4$QH$Y1++v#~nCGp=&ytkz%iw17` z5o%n{Q;c$1T3lpWU*@5Hx$op8oYFv6UnSnx&wRev(u}@jJ0Z`Pw{@*{b{QvwgE6?Z z5;*$O_ca(jHWOf`ODI_v>80I48aBaz*UnknN9B;#oe&$t7d$r!wURV5w;V6G|Q`G}l+e^yxx zt6c&UPSD@GPqQaG%Xr>dA8a0oLgnc!qpmfiab&}72B<0cT*r-q80ct+@?LMB@xcA8 zCo255)6@+aqjlunjVqON<)*rO-2@<`ErF2GxexC|>2~8`v%t5^aqYg(tm{V^t?sqJ zlC3LP0c3DWjfAh&1<4{jduoTzksQ0ko3+hlH=9%1S`%UNur3FE9MReu<0HC=tT$tK zVRYIU8wDYX)6pii-tQS3AX~5^A7CNR{y=%-1#Q|5zRg0NO?AebXwECROXER^{TBe& zsjfRETkFF8xN(D{PqKCnaW0!lG%c*UcvQo2iBn`iPw+shLdgSYTG}Iduw$7$^*WRs zgZtifxYMaUlNbVPmur~Y*5>#(N4R$FK>uY<(ZGsZJ~n*_{}Zn-=-8pr{7d0@_k{D~ z;G-|q|>tOvdEo@vS9UoMus_#fhE}cr9 zr!GRo?vDd~L(fTJykD`%48O`uKwupG#eaql?dM|=v$F03QEafdfRe`tR(a#~0^=qw z^0R=>5flHDj%$CrO5N=itvOD|&)0*G=FZ4BZ1eav&bKdxx$H1ig+A>>ez6}h9!l3^ z=?UUsRC;*B0rc}AELYvZ=y4o#%M9)=jV_~OM_tT)Q|;)>b11sD&W-ZlUz5XZnI@)9 zI!6M|w7yfIPeN?Bo<7aiM4+yg4)HaeT>0|GTOm#{$a0IFnZhmIdxSZBs{D^94Ht-rrBAs!vb=ASLy8qcY0xBrrLlG@N4` z9dv^A_=Vpc$V|&U@34y%p`Mu)q#{q3yKCjB7bmKH=Zgim`^J1>?U~54IGW_+>k`)VfYNTyj3GOg?Fcny17n~&FMmSkGnKWw|xcIbT(ycDKmP!VpB3P^Hwy@*X z5dQi{tN}*!yL~)L%gxs%1t0BK@ld-oc^jNCR*^;w`208Lg?CJ@3twR3ma3)qCiAV= zSj2_?wV>X)wfIDJ!UkSoM;fPsOFtK8IXYokyI^qi%@vb_4DfsyBjQ7q_vz&;R~PHt z7E#)}P(G7pBk==!cNHqH_5SQivoP)OOh_#IX4I6-Et*(tG5Rg%o%yummST2RpRMj% z&TUUG&BxH$ns=}&QFQ=ui!X3>1~(0ePn5qmC9#80TTR8vb+3_BkiO0-`Gb#l_>!Fp zId)8G=ZI|y2RP}Ltd)*PZa2T{7aRrpxH{$rT}R8^+@$j~xt0zo!P;aauAg33teBEG zpHQ!TWls)mP#oKj%HwPCvp`oKZp<6LcMWw~b&Ac=HJdg25A7@6D<|-d@J&HI{6%1| z4s`hYxpdpnMTqZhgt6yEz^`#^;Z4>>`0u@Mz-|0Rj?bLOs`Gzw_>4Lh5x}bL3F_p| zI#Wy8RBPw_ng3J6>&Aq%TL?FZUEO?hJ|L(@+!K8OZM!>a3Vi$1 z9*?dqc%Jv46nm8Q45iI4P_&aN{Oq4U?^wzrQ71ZTpkaUd21*`rr`^mByBhYG@y^ko zM}bGiChwIKXVx^c=K~0bNUDLn9O=L@Q2j0&*WOkUR!3W~?OV;0s9xXK)=?4kQF`#z zmp;$O!0Vhi#gMvR#PfINO-5ZL_168mV-ub4o(v zJ4*lYSy4L^1JEBh=u#vYy)L;^Jlgmqwb=tE)bGrHMJl4Sw9TIDE0-($9lv;)CQ6wc z1n4pL*hV%2;(FloAj!{_wf_2tx8K8xT^=XXER9yc+(pZE5~$xsXh&S*hJo=o59AW` ziM$A__Q%3D2e=eVD)SVOUjYcEJA0o26yD&kgMA%g*T4 z8_apjQBX==Wx>s1@+#uC7D|S$@n_97)1?q3`W=Qf#Vv}#UW^Se(($g)&hTuBFzUWog&vo-?LnWE z7V>I2qD&%E_41TIVL$wT(DvR@O>SSisDM(WgPRTk0Z|bUkkAv9>ITHJxAb0>5_(Sp zq5{%E=_Du!x}_t%1f)v|2tuf#cL)$jfV9JR&e^|n?*0C~cZ@eSSr{S+6 z$IUJ@dBxVLKf->7y?OVW+-rX_7wB(hSH}oO8hv#^%Ygf26+Msr;XMo6LMt+AV*!AN8$)ggJ3(k5w2B_uLhs!W~dgk_!T99XHAmcy|Av*@8yvMeUs5#&~#1M{(8uz zWq+2&!LuA3ni}}^JtZvjvD zED@2%POKj}pBtk1UnDCsyq5npS&9qd%DxCo$Lb%#rGZIQ&H{{(air4Q#m_#cz498P z1J(+E>C_f$yxK%sugHdO%Dg?~VATG4HZ4gqqr}a>@c0h)>;@Zu=UraBUeIhJ;U;*LcrC`${1l$LVOtd&0ROJDr1wfcY(Jd#Og;b zf3vSeu{=dN%#~i0?M1xw#P|w~U0sa0=&Cw7`G<*99pK2Y5HQs#WJ84z7J@pHCDnhG zvFg-34E8L}A;LQfeqYqBwmkV#haS>a;xq!@l5=w}209lcGNTM#=nG>F*Oqcm1ep!B=9@I(C}sbGqU zM7lB4b*i(h-!A#?^|WiRuAe2RB$8li{&z=s-?NqPE$V60Qfk)lSu0e| zbgaR{$1hnf)1o|Y^j#SVQkjqn^&Ly=e7c;N${z_e!+wLDVLBhcJd<5ng@yQObb(L5 z)Crt}JlF)>)*9E@H+27^ptNz6fIE1)a8rsahL(Rd8>jxLPSVR+e>!(ymCw15Xe+s^>b6& zJg!fLVDud$`Ff9KG$lEf5gh}UT)f-I^_=20Oo;-ad7USJp({?VqbPOh?#k#%OHF8_ zD57s6#BqbCU?@n1XJ&|3F&vYyjqZONKG3~iL8871Mz9Zfr`HgiJTKVMKm@oS?nmRk3#1T2P(9Vbd?Btgyx1b?7|09oAg_c_p2al=i#;6UkxNIA`mAJdm74f&*R+-g_*K)?XSCc=_N2~ef>_KxB6kM1bQClIM?L(Rn&s2@SRRn|nKf&;52yq8rsNZ5?2-Li zBRd=4A6QS5gsA!V8pkWuZG*+2LC|JU%Kv9C6v7FMC^^4CQ=Xz3>lciFl~`>?v*IU| z_%9w=W$n6_ufN$lH+ln0GRx07zRz_Ws;q3_kYx+v{?t-&~C^g67q_z%VETxadetWxAdb`y%BQF#qzLt9ll)C;^_|A> z?uEv4($`ml&A13?Qv;qtRno6-0pfiAWoOkA5uO>LmD)ez0oa?Scg6+oQERWm5egLE zF0}`Imr;3 zGA?wDDG#h_zT7puGSh=@B1*C<8HSkMdD$MyCuz)S8yO?%Zf`9cCA%!Zu{RTOk&<#t z-MHiD`1|Geb1$~CUXTl7*oBLQ&FDTEaCqb}*pb+L3*bqQXPUQmT zpyhb%aYRj^^F5WQ^0YaXi6h8mBHxonJM+-AntT_s$rm^=Y+uy*ES}v$4c!z4jk$4e zcVF3Yh|Dl~UrAYEJ!uXqSD`Y2!6z)N2z^ZHb}r+ji51=vV)QbUJWu2FjFaJrqS?ld z%1I>-SKk-OVJaJ~F*pmjo!*>w=peFAllAB5Qo6pf?8rVe3skx!%QeX_r$wq-2LbRK ze#af>7&x}`goyr}^3yc~=F~Ll0nOEJbh6Ax;oh#po!8sBi;%Yt<5;!3y`E<6oJD_3 zq1dA*KM&0o{$`NW`qfSt`L{S@pQfTi=Y2O0PtOg%25u=v zHB#%V?sU8Lpcb=mA3_t_rYDE5eJUbQzOb=h`$1yFJ6kfh>VDdH7LaqwAxL2ZEeel~ z+o#z-XR@`DO|o?sD*m`Gwk8-4x$9XOJ@r=sMR_-fw_v0D#E3pBP+(NV#Zx7k=jc%c&E(oGOi}xn;OlPyET|gIREZIee1g zrwdLp z552AJu9t~r?GSg9GNUf*y^biF)}s4Hz302vt+#F@sAr$r?xMPg`LA{;VtX`Ai)a2+ z+D*3H2v(*zuH1{JdP0tgNb>Ja8^2djc_LOeO2LIlBjM1!KT7tgowglX(;vj$4r16B z?rv|r+;uSXSDZ=Ys`rBu;58wRqi-5eb%XQ+Vi5 zp}x}baqd8ajD`k&WGW7Dj{lrhjbqT*&(q@M;p_|YPy+4F!KwD+;ED`-iknMhfN1|Rs`J}u__l!O*w4%xK{PW~SUSn5Is1>iTk5leF9 zSPXk+ldM=>_{Y3f!uPV+jn5xx2;s9L&+2{>M2%JFz1(b?+0Gi8zn+|L{2H!CAtL15 z&tpnTipvGb zb{Epo$dtQNr`F%HLm@_n`&Dzj2!GfnsDMrsHj`(1SnuQ;@v;@2dk`f|^Kw3Tp?w z1v+QM$vB^{V?#R#Qycwqay9m+uYom03(34DL&j=jbg`g)z=M8pS6;NdEnt=F2z}sI zXnaBB|C+4aD!BRU~Vq@V*?I0^zMx zDE2|(E{joj1XsEn&B4p7Yyr(x)0Y7w7*|J)Bsl9YM6iE4hb2K=7zm{`wAZw5R@ebZ5n%863>rSEDD9A>cITadMjDTljC5tKX?9uI!%2xT z^PTKC$BEWpUDUO)K_t`UaLF0|FkkgnICQu+bFFcPh>3;GU-%tPgLA4kCST&zk!1B2 z5TQt35{%q5Vg!(NVq$Gm-CuzX@m{}bz-k)7Z{k4lDjM#ls}A07kg&+DW-5jFR-=Ry zVC$s@+^5q5L(IMEzkZ9&>_V)Pqon|u%a+3dn`31v=zmK4pq6>u$b{?F!|~iV8J!NB z*#_Q(o`kIvo2(;_E9-`k!sG~jmmh@R8wmBuu!SM_INaEw$Zw*JNMmn5rpeX<)L2g1 zboCD_*{n3PQtMvMJTqDd@=912)D7|erBUIx83FB$XBFS8VD5()Ge50)v}$_LfAwhi znksPe4?*ns;c&P!gw}q7EI2_c|H+Kbf)~{)nBseB)XP0IlTp14X&*`Gh%!k?RL;=di2gm|G zP*>y{p4bxPs`*bn{($(U3f^$K9k!IE-pv7Lj6XcBo1toI5k+r`p`+cS;&0!GG8=zW zhe9*@oq{kC6(lxgY)*}H5^_jp=Y#!XT%yZ`PJuj7U^Z!{PPcDgJWkMhdnP&3B$C+Z z<#}xS@QVdn>r^#-Jr^%L2B7DU--KoB%~cP!#rDRj#l6n1t#~C6`0Xz!ll)G5t|JY) zeDQ-1FaIj^hNX=29;Sran#|V0p?uh8c+F6V)D+!;yplLxu;D`yWz5}o7fp2isylS1 ztQKJKDAI{OtocNZ^vY#LiyVCnKX&zKr?^B8#;@mCqhpRpZGA{&cXB8tn8s zrR`*ZQry?3)bnbtbO`AhH%q1@4uRY)j&gGzMTTYWF=%$fTz>!HXAfI%po(O)=&6aM^yyORUG3Swv{mKee)dObf706ej_L;Hc9U+8W`#Bh${MR1Z<_$}MgTJb2c z5b~nZa(5NYG7@a-{217XqcR9Ooz9uxs{=lL9Z0p=el>rQC!(QA;e{IyO|T*ZtJE!J z&oFo<8@>`AKn`K8&iO}{_qd;It7@Kcmlww%huY{ zVjpV_&WL8Vn4Q?hO=E2P#QwRCj8Dmnmiil94Vz_MvyB7LaVzx^GML+WJ#!;Lf8EZ_;di!qFc{8);Xfj>^kXGtU|)_RBF0$p$y>yCeIo$vNYYw=O=sH!R4LeIJ2BXo;( z5wh_iLJ6qSC=D;|pFR=&t7j^12RZ?oHF2$RJdT11` zwg~?o3MAsvHLLpUUDFRjDOZGHY1cM*%FOpLrUj(9m{qrg z=zsfR>IZ&Y<`C?0`V1=$#Ou8jYuIo?qCLv?4Vbhwz^au-7d_nZ>uL&Om@~%e>dXr6 z3lT!=0^b03sTbfwuBLAr-!>X)V)A0nb)vSFPfkOu7yYgsxXaLDGQpKo_}X6~a+cbj zRB8F9H6eB zeznIPdwkM0=k%gUm7>fjxQ9<{pL-#~f&i}HDVgopL!2yNd(Q{3dB2Y5+zYa$&C03% zngM?b3s0d+Tb{pyj?9G5yVu5^qly@?Mn#$>tQ>T6_7g)4_Yyt5vCr+BkAs2ZRTfp+xdEkEy zkQJN;Qk9-lr8^lnr30)1`PC(#@NRAEryLS zF;*Nm^=Q}-Hmg}9_E=%z*IaD(mAo=Kz4^WmSd|s|jy1al=hoRP-M8Kxn2e}}aPwzf z(83Y2g%8W1f%yFUo%T{$At`I}33Eq$V;dUnfx{HmlWui?SnvrO*89?=H1UzxJ@EI` zLKKk01xw&L?VPVa%Y0_`DsBN88ykUVRisk@KVKKS6YNv}U?_kyv%NidZ@+P05HLN7 zK@ai=cUYo6Jek{+V4O!cTT!+WRlrhrrByu*6Awn3O%krGTCP~I#)4`cunUI~AJ00L z(6|%ggw}g!Z|_ockep=o4!>P^le~h4IVm7+AIc&2ZII`UKN2S@Tj{Q|6EM890ky4P zmerU-78$!qHmw8n-l8^Y>;KT(?n^c+WKSuYUEGmHdgyT7r2|tZUs}t&=f{t zW2vJJLbG!xdax`6Q9iUJ)=5Cwa8_O0ttv@lkqIzk(@9S}srn{3imKc=d0qLzcAOR5 zrl7h0b8~}>b4SLRw)ISg*6Sg9O~CVk7Kym<5*GhBn9{@sXBw?iK{W4sHu#~63G`N!y-?-xXS~`1&@ZC-lloI|LqOcxV%9p{Cc4(2 zVXzuLrB4{Kk7#+6#w>02aP_PVIe2wW>y7;kMOtfy4z`|6O02Yao;kK~r7B&RuG}T` zThWxUr1nOcbb3>W@GM3XE_10)DB>gIF);b0KJJZudebDH!(-@DQg^LT_w}tj+zuAA z8I5T%^go*yD4ds`cgkuKe0=KL7I@My;PHlE>-^lmZ4^bLEWu+=BOdyb+m`AKW63dR znwjx;SNZe?EB9=-`P3DT-{@t^Icw<-6FD~@X=<*1 z)lAiOJ1MAj%jr8)#Vy=@7V3&4icMNTp_u-_o(pjY5HKR8 z!*_lTxGl9r!f zGs&SF%(xh@?q991P+j;Mp zFI`PZx?XMCRLA+F`z=6?B275#V$wz_m|>y#rLB{{HLPOHFDHDu`R@OImQ|Pc_G*c} zH1bA6so6^`mAtiu_Ob%I!t=FvZ7vn;Zq%X*C|)k^$jEcqEKh?$`vOhvmFm5=;D_NU zw3kyi%G+)}$6*7wqSyn^8NBw)2^9*sGqWemZ4nX!KzA^FZB*ASK{vRA+WH>Gb~B(Hkwv{=(&LhR=RM;|7N;Auxv zZqMsiZ`GTn7P9bFOM_Z0&IRhqqGYvrbNHUuQ)H8ik2yJ%`$OJq_^s)E-ML?B*m)i1 z2OF^&?Hg}jdZ7ezvZEmy^`=Ghp=UScWtl%o+pTMqCiKiOEv@uTmEzhdr^kD$faNd$ zPauA}*{<}3g?wfPF@uvEz#z)u`1ttj?Cf}~`SzvhDYTuY^-K#+4&ix)^hepQy*pMo zXa3?URy{bMaxmstX(LD4a4LWXmW3jrF19jvp#H@hcK1f)6?gPA36XC+!@&hp3t7uTK+0rY;|c6*9Hl7+rjvQO#aQ46@a%XSURd z`N@dah;_wL;@I6NpYuoo<$DWA?ZmUkCi$S?L!1UPsJn}Am1Wp3Of+a1Izvj0ngaM# zWsx+9uB&%$>DG4!?GumEdT^6ZYV0&CTWn)pMJwD3>gvlp*YleSvzpN!7xeDqQs79cC&{e3@QxCdA%&?IpzvBPw?^Mnh z|19urIIR>;$v~ODCcEPWQaXK;4zYFL}Wr0Fj8c2-dTRMF8ZG0$^l2L|-VZxunx^};IBqkTfE zg8UFk%41FuXtC>vZ2IZBARRMjB?|?{pG6EKuuE=xo=_X$=;JR=+sPuxfwT~`L=6Bz zJuZdkF%+%1%u94TA=sk?c~5Wro;zqeA`Q@< z?nCHcS~ppWp#&2~r^h*^aN0+k-U;R9bXpVi6Q!W4p7Iq1aQ%s^$TYIlSGi?hlGmq7 z!`j$l{)4ezqHBy5GeO|V;-@dtgqZ+nXU6%1eQA3L3g)D2r3tC>?Dp93JTK?qN%BN= z2R5MUz0CbaLET>z<0=eJGuXG4z+-?H3$0F5&39;XW`ofuzJJsbsO3Yy_^na&Hd8-D zTS`tF*ei%mGlHd%k8eaFLANZ0lksk9XxjxLfQ0$Dl+C`k3M;)lC z&#tF`yHb@*R#>ag!>Tu+MDVw?;_4v{(xdJc1l9ke- z6pT=}vV&r|2Bs003HKMmwC284v&^ezDB`6&@Hax~YU{s(Ch<%+t1F;C=&~q-0CTMG zv;omLY&KXVKBMyF?641qXg@o3{6ALoFDz&x|sf$ehcJK zXQb{*Ssv{7O+Jfh3=R`&M$t(=++WTJP1e`)t<=91xTG*Ssm(EUGnhjac3hZ3u`~`X z9XWEPI3ELheFL@i+xv1EBRyJ5tS4%1d+s^f;@^L=zG~Z_a-l{SB~|YmuU)Bm821)% z9GBSDVC`WoRnwio_Dq=uG}}zG)&t!?NTXOP3~u!W)lOxV(g?9QB{; z){V{0a!~lGOLG6{gD%<oVr))$pYCUGaE*ZalZY!rDs#uEV`FR{_w`*}_uR0<7H9?OL~6`bJZ+HP zhV#$frWe(lr}su~`bjk(*D!ht|GI2!E{gR{Yc=`QBj#BrR8Lc>lRpY#>4?#JInm-=J065p$1I)lA zT8aZ23Y@mR_Rw$h@5E~#p39K-s*^aw51s~ooRql5ZO#Ewxiom+@QGw#VX1`*!9D+z zN$ary zYc%PqGfj0~lsHp=60kH7W&|syMFM>d?0FHoLQGkbi>3@ok(eh? zh>duZlotK>XVa-X(M^)}p(n*vw+dXt@Evv&N8&mg(N7pSHDGB+-TL@0ndwu5%X!ri zyI-<~qvl+~MU<{+8e%prMn3Th*H;g+Fx_l0-dzlY-9!>T>+d(SZO)%r4O2NQgjDOUn`x z>xM#5j(5`_+OPKf2yX?$m#6H!K?TAy0}t?c$m+xsWip z1KoWjE`L6>G$C-&s~f>u%AqqT6U5L1R&t;`QO2Cpfkt&Nn|hS4M|mfGj7YxT^|N!V zKdONE!}Fe!wazEgG0&CKtU4WRj{I}9=yQ~xqE%=)k)6|b(LSoJo^2!dd*%D{(GQvoxnn?JWw6Lv+4zt8ovR^Om) zOGBiQ6a7G~d#MtfE*#bDiecJ*>P*t+e{rx#rygzEpPlLi&gRBDbnSQDh1duVbOk)( zcEL(0dV^TOM9DMt0E|eEnG>rW*Q-ra_PUm6`r&um*Q;Z1t0TwKx+&yHYQFztGh%E{Mx%Q-ulQ6PCvuec zO%*z(Jo4!gmyh=&{+lK5-a-cN8di3-fBb9pBxpC`C1dsQTYA=i%z(;wGgL-2YI+|_ z|LCzjJ0{nPwS&{!#5RegDF8bJm4v0(87uDC{kQGrVaEb6Vs1Bx0oR3g)a6&c=Q3D8 z2@j1JMc*ULBBv|SFwH>7QUW5^fG}74QS5AY#F%k9LEodBu`)>XeF*NK|^#B2qdrr8aeW3pL$th=Sx zCw|?XvTQgxBoGMy6)jRkQ0>b_|3-|kf>`gc=~p^(|51gQU6qj6%sdAHBV zLJ~;n<-oHHTAG;>YW3{_kQQjCss3f9iv#~SOCVT2QFURL?sdvSuc^5n`h&od)4-vw za76ueOO)RD?Z+?TB{c@z<5m4M+S6u3iN5>S?H>ZTp&kroR(~$p`hM~$ zU+7lZu)I9^II0>e9$f3VD^aKPEiYD|lg_^e0vbYHTGr%DyVuAqj4Nnpw_GeBsVoR~ zgyo|ktNc4omXohy(z=bB~BYal~00}!i z45_#LZ@|epG^3FrX0)S9xJJZEiy3U2=b42gDnGY#pAu89(x_8I+T%;%;Innep-?{9 z1BmAx^xzf2&B2A8Cvz1i#*}?`{_JyZ*CbepE9snm{&9sm);EPo)3>3dD!g-^ zr@lhfl`68#3JP|L*s^{$)^S({Ie7dm%mOt?t56Od{Ts4UZ>C_ieXDyY^s#+ zn9O5Fyz!D4l&~&tGMDAF-~?d)mhH5T`0dwzd1*R$ZdyT+cZ!IG&h zryFqURO!VBOnQ8SB`W|}xBBPz5lI<1hqjhS^Sj+0hQib$`>@Ttr**A1zarNhsAj$S zv&y|pP0iX`*99HJ+tW$&BS+;U+C*ESraNKFAK>dR#puL^SJuV%mqwR0k5Yr}KH7j3 zU2`>7tG~sPnffk&G9)KIi#bh9Qq7ElWSZ+(s@htr*5#QqgkzAE#VMVBxTr$Q&Or5o zOfxoV9iMlqGTE;Ims~bft($71A7FuXnDL|EC)J`CyjDyP+6rq~UNg<-WB8Gv8{U%T z7BcnTwT}u;;Ws9BRvP?ElXAU5uAeY-)kT6(TmA z1}BcTDVS027y9dnzFIoEK1hXKl?0t`QX*ZrHja2ixob2z2Q<%|g(>Cy+1`0(xUZbM z2vm?a?jL6_k+1MYp_#a^E10`#bs0vT8>f!FUnRTOUs=c*Cpo+nIkiTe;v=_WMZ>J7 z{@Aa#bDZJesmQtehw4;A$s1%YXVjymfi#Z?sR30N#l8St+t!g!XD|;hz+*2-#gW7z z;-IPlXeYt6ylXVXHq8)wBE0$OX~V}9$W+8J3;K}=D>V`#YVPHb60~ByQ57?Mx{w(m z;xJ2aAL4;#$}OvyDmvhas43;yu226S$K(%7u>e@9&89VNS7x?Ej7Ef!2 zi~85ni!{F-g{B3B<;D6SPG9D7CjYb15WTHi!QUPVifMEw-?^|48G8{8^}-cj4#ZrR zA}FonhTkR9p~cak90h&v_UGWszV`R}zCBt%T%E9bVrmls&F>3G1R%K8DTOWSxT74& z7UtssK3;%Le9~Zk%wK)>e^#iwg3c2~BCGH+BagFXU->szDPAsMk>rEfnF{G6b^Zpk z1U&i{&ST}mp)$kXIkWEr++2y`xdxrB$!p6wOikkAdo3L2<#ScbD<{^QZ4nLIa68&5 z;Ejcd5K?&$^pV2ISUuoxqLzxx@i0GA#3o5KP2XAf3J7m2R9M~WG;IC+#bJQ=TouAj zUF-*Qk%mv#plKJM|HnQJ&S~a^L&DbH7AF`+Jf;xmqyF82{{XWxF4W~T&9V*;kwr5-j z=aPQE6-Uhy1vl2XgV)+%x4zy79m}~0PAK0C7QJsW1)dNC_do3qpU$3o^zK>ckcfh) z)i%F~(MA1J$Ry9a3_t#<$FhY5Q;FE@chE?F>cP*-NT(-y6-rd{cy2S;H%k7qm&>~o&Lxg zgJ+lCuP;azQ`axjOO*W<$esUq|A$j=ad6_^H~@Bfdb~Bh>OL~VH^ZQ$gEhPnE6op5)~O zCB)wpS%m_5v=i+~qLXwl_qyo2nY4+nM#-$>%7;<|pv_xrbqv^tEs2tu!VID|G7-vl zkgJ*cA4V4L-KY~**#FjW)K15H@F8r>K{0dUcmzB2))|nsJJPlh%t96&;(|R)RGjA(tDE>)= znVsE18@~ejZDs_qu%B8!F(y9-%3DP`#b(7Gs2pRV#PXnjQ!O{CR);MY-yFvRP!Bnb z#L9i%j=AOmz*@x3xxdf5DRRiGCH zl*e$iR1+59Z{$~A3fLel-xm%SG1Zm+F6yoYp$0W})OpChh59GryZxQYWqzLdI?e z`nkaudZd^3c2VwFfLuVa`)s=IkLR{J4{cvR9e%GU#Sid|ue^s1|Iync1|prw(|0On zXy|+wLF~F{Rd2?i4_pnaz2>Yl7JaWDd3-Lps}f(WEAn#UCu6uxpTYINT3_DjeZ6|^ z_I1sWZP9w*3g@$~10iD$`%ku4bJPp&KQ(wG$mRk8)y+K2_RJ!lC7Ip~qWeH5_wY5Kuda zg0V9F*ROeVNFlD`M11lge%WN4Na!_Steses(EC-p;upw_o%CpR!;E~;C@@7A7GN?v z8cJj<>>@^+L`pD0j=&=i_RX8~K2M&lo@&Cf9_}vZ%1EQ~pE{$v6!o$i1*S`POH)*; z*S(h4bI&-VBl8%Q#FlmPi#D=XBJT0<9@d5w!q&aF1npq~kCgR_tI`?j`(`dGTFE4M zDl~mZpxRMDl3wM$QnE=!Q)3TZtXA4nEQ?Bppu4B89#fpnj2742+#Zg-yZ30fE7Rqv z`OF78a=omufP?oXm*>K(LG>xDmyWz#*p;RdbGp`O^pPG-;Oc>xh;?b9oyO`{znf-X z*Lxb5m6@%l?A9^1tDcinP^2gM|DHDgTGZ)I2bM+wYx!NnZ&7L!lwg)!d;*xP5W3r% zdm=YmaVSULHn2m25F%rL~_c>1OFgX|lP7-&}^7ZWfgG+LM)govQA6sS#OS%iwgpAIug; zXcBEu`QszjlKr)+e>QVLUQ0EPAOUD^ZO$J54T(0Z`WIH~>y4iSI7%LkTrIRG0j6J9 ziPr5XN6;x;+`x?kkal;&%h~@tdlboI526k~Nm^QK@LZXzAvfk!SF#|)Sr&b|m}Cu8 z^7QZKxj6gt(+QI&aX!~DN_o8Jh0cQKPCquPZtm4JIk1}rerI?kI%`Z^f8COsl~`!n zdfa-*kZ@^9QoK>|Vf9@ZF<NUvYkTZ`S+aa2RP!)P#j%`9 zfV9W{Ya#zRP2ei07ySx-GIki9``r;+3g=(Y?d`1hcdMTja(jDT?GJ+&lm`cLmBtap=O@9|gZk-VIFBt76|)<(Zjb5D)gk zLPw2R4@u%oIsR52>_&+wV%zEmThgYw;E&U|_ z^E0H@P}9Qk{0OE`bjw7(Ro%+p|0KU5X4P-iV+1*H*c~^YcA)UyuBkG>_?8;{`+JY4 zN4`hcVHIZ?--XR+k9P@?qc1i#EuKdnjo_b~JsJ20wV3$9gXEKkRfxP7$nd1M&ejTd z6}{B{`%^=hmd5GZVU5wc#JKP6*B3c^@xW&@CrqvT-0#GD{hzI}smqn{Kgdu+$=x;p z0$<(vtE9{33I4KlEcPl$YF@+? zNKvL=H+o;v8>;_^U(thyZgr+0nD$*Gu@hDLObYum!a|&vy87K?R`p7HVWFYFXXrI} zovR`rzPqS$#)8_8^#1q{GXB?~$DSJ_Ogkh&Y)7ZFtg6OF)HJuhs_()yv&vsoU0mG0 zmJ-|M-Zw%=kd{r;T;=Eqn}P-W&l*Ex_MkC+e{bHG4~m-*c{)co@pPFLIZaHt6Fz7U zw*JfN?1Xo$+hJ*s)f1lZ!cOw#EzOW>qK@>GoZIJ-Phush+^W=xQWe&u%@V3otefLP zMN2Q);?JGj=Tq^XQ+@KH_Qy-=&)I{uvmVAEJns$ruTYoWxKboRUSPa zbIw;^@4#5F0JXiz_CQkpDijQ(nR=@HXNst(sVVaf90Zx(lHrpERYwLq(nf6>y(@_v zY*K!hCGYcA;h%u^VTG|l1+^a^qtk7M&%WS04igiW)_GJclxw`nHd&-0CRJzDw&&u8@#`=yTj;q)tY zq`QtO=<0Ig%#|9$DFCHGm3i9BLE@tNJZvoB;P3l09dVZH_}M%}T~;aJIQHv*i&2C+ zjsF0(R&7y#?limS##?BIH)^xA{=R7!;o3z#s_zF8(Q$u^%*JPn{glI}vRGRL1Bz$ay_`lI+6*kZ;_ZR*rEhAMeBs!{Y`|6Rr6Be@*LMZNe{Ks6o|! z`JRVWvYW+7GNb3bkE~|X_kJhAld7}>n3C^{1DicH{a9Xl2hFq|E3d3<^pBa`X}&SV ze)Qqk`BF*aa|6XZt{ictDaXG4*Mkxxm;ZFndbr+Ona|G?LAY`tn%BZ? z=`iWe39BG)m+h*AmFXUt7F@7H93*R>L;5)J_+NL;mPIt$pCbvT4;sOd(?xk(`fu59 zSvk4wBN%+#Ia+dRIWZNLdtde6TF?%hRmJ~x7ybnV%7?tf2@b7<@BHD_R4a_8o`2P> zni>&n%U*DHXQi$E4i~?28#3N9ayReX9VOB)yX_(z9O}m-j%}mO}DkNHnHOCa4UN1$BJ@rb}lN@Rt~UP;c6tK zl6BfpwlZoM>=ECmb?wTmi?&ui_1D;wjJme<@19V)?Q1`iX^|_Uo^RWXq{Q;8eSB?( zlrIwYP!nEU8S;End1ixQHT5?7&zFx*3FZ?!D^2}&x!Q4>MBn3sCLnE{6UAHp?=(N1 zs`yS0pOppxj~Zm*uyC~bkW8NO`I`OJ-)c>Y>ND#ukH^feGXWe_&w_gm?T`UCQuEVe zvRBiDa5-TA`~I%0-i9V4Kp(9`ZtSSY`0D$C&pmaJqu^cUk(FxMh1HyqJ^f=QM8#@8 z=C#?KG0vn`)%>W)iLGN*W<3dwl|udDh(!d}s(HsFodornvNT2R&DEq(Vh|t!uQr=XYnD4Xn!DudTTXpo9YKgY1cr4k+|y=*#}! zu-{)BPyPYj8tnE@vT`?${n!K zJqcTcUgdv#+`uP*2$(fsI&MG)j`c-KxD6Ji+b|Q%4g$G4uy57!_ix$X9lYM`W)mzI z-7ceqt+W8D9ey(skWB29LOP*8Pv`$lGx{N@R=KTi;W+Izhb;JMA87?WlZ z5k(!3CBAEc{mdFe(OITsIf<9>btHU`_|RfqlQir?YNqstIojB3U%VKjl6IljgzZh;tMna_O5yu_e^#%9Jbrc0H&BY%0A(God&TfA5w2zt4i# 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

c6r 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

Oci?1KgA6f=mIlg3f0mEFT zW|`#m$@baw#r%3>wc+e=;9M3KZpQ1Uio=)IaNn@lF65iv?5yLxHKc@EtT}`KPoHxp z&T-aA1*jal*D0tRkaTlN)L&(xdWlN3c%WMOSD*#66&H+a1Az`FU@E#;hn z%iAo!{k*GLzh$0%B)#<_X)9Tli?>U$c8T>jYBO(ps}n5w{gHp3W2FW{fsvhQht3N9 zeL>h3aLPs$ax%rko!A5jCgSn^z)!Tqys0;6lS1(EBbAx}+hiUrQW~~ebqsalOb>#` z%8)ODX$dgOG_e8>p@0gH=|#i`XHX=ntf{bd=Qq&~M&wL&qTset5X+*y_iK zffM=1{#+EFn~u$aiL+GB&HHNGA!IBlNCK#yb#|&#LWjIVs`o#Ux4-S~GZdG*O3#!-P0$8Pp&sKna#X9x?5H5&ALA}9y>)vHRAN{^9{jCJvik2+< z%$8F{NbcM-+0(Kd@aseW1OpahH$U0?leI=QktU#b(Q)I{079H*k7=oHWJH;p-Yf<`D)>*V11^PU!djoTll; zd1j(cP*$;WAP=6dT233*dn-bHQ7gJZ#M=CR+n-!z$xo};n(9PGq}P7#eRcWOv7p=V zdN(s4(AqxTJB2swms`&;iR*kDTFuALJICLrbe-q@f24$by8!;lLp0;AhZGENs;P3P zsCsFK}^O5b*o2Ned|}%IfR^b!5)v<(aMqW6D2+ezKig{ z=n5_0^lSAzf8t(N!ok8PPRwjbafq{4Tes77}+k)zWTQs>#{;79B%b+bZ$XY=apP8jUbt7Tr^1E!8)~2su$0roX&9u(qpV1aP zO%3^-Pjoced^M9`| z?{hQ(sjPM2P+;VGKTZU=^P>Z88;pr$69S)I~qZasz-@CnsjV{l#VB385 ziv&xFmE{+`4_DN|mrkRa46fug^}OQQs4esd|DF~;t4ibsEi3B}W5N=W?=G6jL@2nS zY9tgpdsXKSN*0eoYdHq^gh79me}eaJgJ8HpS@nt_JI@c-w+Fw+e)pqbymDI8O$BTp zU#<92sXZ6)q>Z(3!)h<+ha%)^THtv$6$hXQ_y01Ax%ttOG?g87WClYwOG8_4r3T-t z)b}ekOD+6ojaa5{Dv^s9t>YWE99p8owOn3AbDq?Z4~0i+tPJs`5&(eqU{UYeLr+V6 zT?K@7G@8^Hqpqz@o~{M00#K40^~2MM0nAQw=<^$KT$kz_#uob}%HQfErGV>~fB*4o zb-WPx9;w2DavARlbZO_&S}?mmd38~+RLH(QH*(Lif0^Cwb424kk|#TKS}L;sR=XZ~ zIWBB6lhozgzDPuyo%)b2@jUgev;U|mTD=3(uhM&c!uPE^2}g?&626b+=C6wCA%B(O zv{yr&3>YcCzGpjhiYn(ehUff`gtl--M7(RP^D3ssZ=FCMBPJn^2 zNlk@1I}u=_!0jUjGt5ZAQDh^m4bzUTX}YQ1gTzb*LMa8nc)xo^Rplyt9A!(bqmd{`{P9C~urkv=l zIMvr**(%jOM5KkqR91wJltov*yyCfL(~vIwz0Lg#_f4~2*1_Ex>(dKlnFor0PCv2> zze%v)=u_Xgd*{iYr6bpl%W5FEbn%laCu3UIm9$NGL`I|(BnqM4majs+2lTT6Zda6+ zB`%4KP26{Vz}r=o_&cR@tlO4hAfa<|;gK?8PZIHIRKkbXdC+LWB5ig>AAqrP;9#D; zKJj{`py>m=iSJZKid9A1xocrbR_G0iMA-ilPvgx`Wv%ygCO_pFVzeYL2dW~uy>{o} zp>8{fcejSJ%2R#eqP&=?RzJeifUQUp^oL5Z&8BasRJ77fd^UB_T%uQfi<~XSfn6}{ zy{q!EKb&h@MqqYkvhLcPWe50n`L5HHb-)hS>=)J0s;cR+NJAZU>?33OPkdF`_7rgW z`%;0BhEp4{tSP~&U5!zt3vUmu-ojo0x1{Y(CpjnaA<3OSUqzbLwk+@bq`e>+_rGVm z@xCuv+|c{%o)$8>gJ>l>wXKxEzj+{>Q7rYJmfbpa(z{C$rw(1zMKeR~g zvG~yE3Kf&iT5chcIY9EG5IBDd>oD78$OkTXQ|Z-~j9On}@BHI!*y&?%f+$eNuv8i) z2E}AhmH~q(?!B#?;Wnr!Ga63r#%a;)k!KLF=l{grqWK#TeRY zsh(x>igf#G^QS0rkZzOc?SVO9(Zma#-jMv}3tcGTx^F90B4U38I5^e8g6dkoDUIX8 zyb|CS{#>dxIJT)5eGQF!^%)<53GqNWFL> zPq(L{(!mREGn_*ywzezOa=&5qZBgjMoQjO0*MAeAk?z5|c;YIxnJaPxOr;-2%ga{aaLwC0AIJK{CdlyNKp9j^^CopqqZ_xd3K1TXj%pKr6`J?1-ZjZt5|Z)bcIl1H2!Cnm+dvZ#=%-OjMzRrZ{$=@(YThlb1vj~!YSPeeUE zNp(pggn0HE$lxqQUw;0}<$h9f=wztIMmSGXY~0sc-~ZX=>tD(sof#sITZ(f)wQo<4 z^GGO5Cq~;O-u8A61k2jMNv{s>xa^D=^ggwcyDafeAun~)G4DRrG&hI^*bcatXYzfz z_HCY5E;`OwLt2X?546nk)yVp*W582(Ri&4OmgOyo>xq+H1>o4p7x{I~npGT+$GV2Z zs0oA&k?1@d*fJ^G`cmZu4O#r3YN7Tn{qrXRSio1_&L72y+29x8={7b&yFY5*D`ee< zE}wF5JqYkn%9BlR?fKzYH@U2FxshyY0a=MI?uJg4r%8;{GKzzjz=Zf!m0gF_ z_0Vk#FP-(IxEddUx`r2P>-%^LUe?g}39)|hfOsE9wL|BjzoPHcK{ryDLr4Sx^gb;Y zkzxzn<^I=at=snd3bt7<;>T92UZLR;94?0A*%@EDP>zO&Km1$w$h9~ERrWCW95ZAH zl|Dz`s*!-KFH`tX8`H%5$d9n_;}pia2^WJ?oUr0mZ7;RGPU0)z;p+^_t;3_qPgsA& zJ`ZC9Fe3)r89QnWI2yE?vr=wPDCxHV4XNwYPsd^%Wp^DUn!iPgKyKQV&MV;`qZ=1L zic4B5IEMmiAJ@EFUtSW}PH1*^I@vQmKVcEXo}>bgUV7jTX=WI_gdJ zoXa=39)|A)@gx|;xuowb{K~vGFe9L6TTQ<5P_iK~y?f|lbU{nx8^08oU3cz*g~_+o z>H6nyA~aA_O?7TRaa~!5iSV-NKR!Gufd{TeiF2JH6G4CM2Ldacs<7UF;{FWF0?Fy? z9>#SJTR#qG5n99)e0EZU};I(VIOJ#L=E8!78A7c`e z1DDE`OvsG(tWCEulIqE>3p;sK!*DX$--qp<(bQQW%jsv|t-lSTe4U+RSt0>xKXd>q zF&ORX7?#2h>Pm5^-Aw`x{AetpsY6y7iGaoHFgy2zgp-d$I*kZFY4blv71Xi8g>KQk zk8YwrXo|=V7&sLG0F;iA2S?7d>G7V;W+Lk;Ih>1A`y8(i8@h9!89}zidmigw-2|n2 zp~uQW$9M#Eg$x4>frk4V0gw2%w*<}LP^vaEgt4-Ph+5tYJcQbvmTNfmx9CD#+ky~v{P(g zNBK$*rUP?Qf|VWz-uho(9(^u2?AY7`i8()QksU^OZVS8>Zr?McFK)Cvyf`pt@Dg0v zv%1(H$l|ijF|xyP&cEFJtSzj`Bb;8s_E}GvGcvh;Nh|B7yU&$zN$)RO<(m5y9!7dT zI=2`1t3Ugw3L5u-QynDmZ}pX}6n6M~hMJSB*If(4Uum7@FBNw6vQ|=$A#q>*$;n?X zZzA9Dg|$xZ*+G$P#ar)%(x&>ndK3K{MkbI#wdT$hySettlg+!&`7#!Nhy4W|c5@;TTXs)<6^B`2TPxwGmvo|zTi{opj z>5zG4g2hfiXuy4Ql&aVAu7eLEgS=w2}8i5=O z$6?6+z(P-cXb;vkuxjrS3wObh)VtUEQVtbN+ZB`2?<a+V^>IY1MrPJt!+R3GkY*O`8+8JdMRjk z*z_Vta_u9%Iqf2Bn2S&bZR?flmO~dkX8TDJ@~Nf)iJ$lKL%wSy^4U7gl>54ri+&U; zOGnR2RnTA0VQc7@M8U>UwHBCv>xeOlHuG)O{`hEGWeW`lQM0t*-9L*GlMM8Kn4gcn z@p4-DSpZv`vOW$%0MUu&FQJX3+s=q8InIayDHHy!YFIPoE_s>KZqekJOJ@tIf~_rw z?2!v_N8{8~oE`HMz^w6~67P&u_`!6P4IxT6R`p)M{iSc?XQoIiTk@d_FqivW*X0$y zY)r62R?kEGeYuTsOJ4(ruIV*L*{A2n=N2fkZB?EEnN2U{4(Q%&T;}kfVxy zJo(Gy8DMBL?Eerc&J}n3bL-g*FWGB+z56c<0=?5+q)?B=Lg!AXjr1L4__!Ga@AgJD zDc3cjz`(PqVk^D9ZW02Ng4%>Ur!c0`VF>y?__m?1H-`6)k1$Oq?j{zTR*{HUP4E?R zw;JoMbjPUVWn^m#Sogo%i>H^fM(D@o2!xHK&9x=So_TkWEv{x}ef3OGk!hDYHd^8a zZ;MK7h>VA>mWr}>X|w96WFk_4b&%BxzjTfBveL`L7S>umtk%orv5LpJl7P9xDL&3$ z{Voq@?~FfxUVAg~mz8|zxz8J(uOvPQsF#ITTw{F#Qm$G1rXpOIfc<+K(R||8%y$Z_ z;Vt>7o1`KgIp2pw!I3A(4<94`toP8f0%vEv=*MX%1h6V0Q?&}Wpo!5(9jkUh#~BRr zfR=?kAXDaGhigO>MQ=0J2DvjtoK~6@gNLp&Lg*IZVraWzM^TCJg9D--V@^qwxyD>w z!pYJHB?Jk_P|%9qx(9fB5%SA^Q|g)Ls^)29NgugXr5kx}mR&nrcq zEDF~m^~@l>f;s^oGG+A)XCI^S`|DP%|IjAh)Tqm

bf?%#ek3YmChYC){)jRnTQ0&2_U48GWMff#@`C!1D=cuErK67PR#iC56A+E z3&s3SdLe1yl*f$=u>2>h#~<+==Wg&@7;XR<0{eS@?7@EX;mUEdc}@VyByEXenLU{} zl9Rj5!ZKybJOw8U!Ec5Ter0tLB*u@=Sj&)pDDuP6%Lxm+Ry(|906Sx|fstAOs9i<> z>J29fV||g~em_mTjG|(Zijz|I{@RImKm4G^rmPE}>P=LY4)kDNr?ZHd0Dbr~tgc`2 zI2#H4AiZeRpy>vk{o+%!eweT>ZYPNmX5LM3_`Lz&o(fUy5 z%h@l4b6U$oI@{DD4fCGi#|FTxHJ_8IHh&~s3;(^X@lTc}YT(AIm}y|#;OJbkg?L52 zWkN1kw?0dBJEKS^3)eivT)mc1`+Vg?)=U7&TrCcvV-T-JX&yi$zMG2i+AsZ@DrUX_ zvfOsBMB|Hs^s19z+T@2ezSwEf5t_9ZluF1Eoh0Q#*;%-C7Ei-A;?3km)=iJ*E2z^L zu=C4H-+(TBK}Pmhi0zg^EF*5-0&GI_?GGIZDNhx=3Je}3LS9xa4JBvPpl;@81o+-O z^FARElPx&hceaua(Xa=dD%dHRMtT>ve>=pd!Te9W{e=?iB`I= z13j_e3*gZc+Sj&-kgZC)vnIfrTZD@mF>%dgd6e86h3C(gov#G)g-pGuFy@L>5cqUw z+O+X|kN zuoT!j9XzeR<8Ak$6J5zUsAIeOv%}&{`k@W2y!Z=RHq5#1AL#q%wK%%{ zWfHh0n$)Uv5Xhsm8P&6{zo~1>-uL^%S2#qAy)mDVd2fTq#os4bMHC*>rqGdc@YVO8PQ!#p`UeZTpiHN%s64W9QxR z+yIT(Ez`za$<{V0xanL~nz<&Rlh6E|un5Nqr@Yj{%<#Qd!S)(c=AsnJdpF1>>cKf7 zjN{E=1FrbikHs+r!C)vvq@}DC%25WZ4~-9XQ1m%N7MMXv9>%n^%GLk>r||Dt9DS{d z-Kdt3BfGcE)s1W15Qr)WCojoeczRB#ujO;6IFg<28eie|XqizS-Nk$I;xp-~yXMB~ z+tsL(!fblA`zQ_G$ul>MvE3q6Gs)(L=%hsZj8e@-|HVE;?UJeJq^Z>8)h-kDz;~3r z+2xm|>#nDQl>EPgH`Ip5wRYZvS>T(M$xugP(A;ium_l(!)72uv4ABG|cGH^9nXNf| zu6gNBo-jYHfXmZiE4>=h%>@ z>y}=vOw6)Lc;DDSKuVT<0Jz73@xE19Xv2P`hxdhe&J2ISsw2kQ?@ECV9DPONZ-}eY zCpVE#fijbSr~ZFzy=7R`Yu`0YBhn!aL!;82Gju4WqSB3kGz>L#NDhtC-6-ANDJ=*? z*D&1DU z*G%Bhf0qj06Xlh&1o4T}P;fS`1uGCj;xEphrFzw@tuhct7auUz6ce-`%d!7|NPO>g5#h2Z_R7U|p>vWso8H!o7%k>?wpL6^H*#*B1Ju<@-o zFBZdjH*W}S>mASki~Fw^OVNucGq1h;{{ zLx}l@V?(#0t**J}HG34E)7yDTb-!Gbg7^v>XemfR)Fh(`Oj?80l}F$H}gU|sWmP#LNkeiOub z0_Xgt`qq*)-|?5}nNTBl(AoP63z8t)DM+>0eTt= zA+1+TrKaRBu>w}`UNX9vDYpi1+ps$s3S)YR+Pg}jPXyxyR2~h39SD*Pd!R_(lk85q zm4U%wd*>TL^;r_)k8uVt~?e$)7srC2Qj} z_@zlV$kf8?nvYlMFyM+PrPP1k&j0g#peTN_ugBchRnF}ix!>i5z1(uS+|x0iw9<@` zXH}Fb4Tvi|%r z^dBS++S#@Fg;;=fF1?U#;?6yuUrgi`??^V@m@U1yD~fZem-G|pV+VvMsQDCl*)2G2`B<={>C)9-qU7Var>DIRA&d|Kc> zqdi!&u-yG0-TPl9cKc0#f#k#v?e+XG2iUgvw)CJFmgLCZp&oA>fm--p$1cTkkl_)2?6MSC02+``zxP zspvcjwMv`W3}Sx{g1iAV_6oTMnRb(-qms9>>T8wc%a+DvVc(Fw-4Cd`nMHzB`Y~l9 zd;wNbjA%!SXo37;OqW}^q!<^lQ2)bGqJ5RgtSd4m9BU4qZ+mS*b|Ke^n8t?8Tf6x&8f zrKlk}Mc*{whQ+My;K_Svk;Qe5?*)G?kmWT%V)x%?&;PFcF{q2+;lkN6&*x&}P*Xs; zjN$f(EHu`*V)-1y8iUB<&&oMw)VO$f@mbZtY>OR!FIO-+qXWjVddKB`gZiUtC|72t z?7c8|gz~I3z{oAaCsnWgx0-l_6qxUW*1FS3JNi=5Mb&9=`|-w#FqYnwHVZxRz~y!Q zD6x}WP(V4Czn#fbBV$)>EzemuZL|I(eU21eJdh60EVv)UpQt5ew5h}uj^3Ok(&C}k z$Bd;{1+ac)&Dc4m;8mVA6H5Na|AUE-ZD^HQy2rnVS}6$3?F_u37M*2w&%AR5SC1|Y z!h}P;+>!PM&K<8-E;s>lTP}Hizc!i09^h*UG2-;S>>~9K@TRMU^oPjXpW{7*e5Pim znl=(%N!;zT1DTBG+{(OB@PnSbJQ}d-$lQvw%`N%lH&@)lk6^Y-gB1?T6@lmh|M%K| z=0-k&{e$~c;6y$z#bx@;(Ts_0Lljc_ezM71xqbIluQw#nykXR43l(iE>6RbB5)~1M ztz(6baN)|Yr15L7F_fICU94%=5KfQ=fe2rD|8f2d4~075T1?(aXYb5w zjgioF6ek{kyS^c<>t(WO$*e7<*{kkAX^}Bsn8@E7{rBJa=OV|3=~+q{9n9cbWM%k3 zE>`9?R(gVIkuIYq)|k@-u-VJmrYKHnEWPE9+2ocza${>uzAwT;*t;0W&#E>Y z)8s62Q79>`FeXb_eguxSblrA4QO6jMZ zE<`P-X<%Wtl`09=ciAaIWF|!Sz%DDi}6bkSdr5bP%!jF!H4j}927u!FBe1%s8ZO*t%XyR(39&1H%?foRTxn)Pb3N zcU`t|1Jh4|)moJNm~XmJj3rqd`|(+ZHl-X=i9xWUJtjm7`_I%kKu zTNY)MdHMOY+_Y452%$b@+TUev2`0NZCf=xIyuBfd(pNQ!$!xoM@e=sFy^#%ty9^gd zixG^H1zK8QU%u4hjqY(JpeS@vqeDsSRn6!WdN#%58a9kNHp0Odbr2^v+sBJ~o*`iz zSum{sPH9dY$1^g;EJ9Hqri3(wHheARLLzpMLdRi{AL9XU>RixGqY0(5bpS9O&64fz zKV$c{t_=iH>yI2nSEzYpT*|k1Bar!CdxE=goQSNd`BE+tYL$UL>5$aDGSkT4e{bf9 z^uGaw5-1kqz}9nCn<@NwzdCEY`0g9NtI-` z9w}hZB=nkTjLqLSF4m8z!StOJGy;{}dR>uRwIxk>MB?-{XZSm2?kt6}ti zE%N?;ncOof*R6^JL&Jq-*0P*zIN(MyT-~Je&`T%Jy?6~KX&63B}XSZ zO~FL$S6hx=yd{oPSd3qsCHwZSytHFx$(MXaRZhdZg=Xnn!Hi5Rp1y1fwSsx>zB6`N zd4|faz(jEnoQs`>(DVIRKCjbKu`if3bX=3g+3NrWNSO^jBGr0>r-!Im|6W~6 zeHOZD6ekC33DRtrtRk)_i4J+nXp}5z`FSmH3&BLDz04EIEf*6B_FiGJmrVfwn6}^b z4q*8@pPQkso%jxt$IoF`NsWp&&ToE<(p6IU(>IJRT*k6@dJ?#;GvBFjt3|(@8=9J2 zXS&$)c0cvjGoWiWy=l!2AwUIcPjCkOAx&bLUw`UBH_v_PK@k>omn0KjwBWN)$SQmMw`DzNO3s2>F-*fAc6 zuDoqbXG@TJ8iZ^NM@(RBC3Gjd=tm#E+!CR+?4KcDsSnNa;DL0QfyYwy=XLjK!j#kx zUJNzZEp5dfAYHRn2x!}eLFkiPk(({1WVP=(3q6~4?AQ`VqaO|VpeO2XD<@)7A^DQZ z{1x1u)mv&$CLskJG@Povp~7**=qUzg8UE<9*aoLtQ$;P?a+dEPGf6lGro%kwTooS* z@Xv5%@CLWVMS{!)I(TEt#4b)9DIFwJn8hJ*S;8WK9$(q9$B+#w+L)fe1op5gRng$JE zC%vuNn(T+-iv(RI+wMGgcKObOwY$@C+c~;mLx{AG$v~~1LnWOjS;PpjAdBMrI1}HI z;2GNm)jx)wh*!=&bGK>{&Sb-}s;bj3NhFksqdlYhOUp3owUsh3UsP1gp1&)ND2S}E zVT9Ho@;HR(tV;f%Y?Iv};T(OE-fC?)bWv6sx7Kudj(HwQNRP9cy646|bBgryO%|09 zMc*9dfB2wB5#Fiua)HgMhFlYa7>(qK+Unv5DUGk(hGQ!!7@8tF37Oi~-!|3Mt#sZC zg>0r1eV#n~@^#J^J>1GEekC2;)eVdIJWV(B+FDu*483*2mFlBvg>6B{Rv zN6#w?7=Q6o7;-W%9i~miI^as~gSd92ow-`RM=_VVAf`tQs=K-_2r)Pq0aj;*oJt`9 z-t*+j-KL^cpV0bHnb{Pu4K#>+3<`0TiA9;GQ@+Q9>w>bZmarAkVivIw8fo^DZ?xZY z+S;PU)68lg=l)7%)6p{n8{hTFSe*Mm#wU9&Uxgw2<L zc-Q~74pyMh|8W!d_Uv9I_zT8*(?3Y&@4;ozdj?q6iqGx-dC`pYD1*1#s)0dcMo$8h z5yfj{>i|#G4{8ja+{#kX+POWA3{$(7MB@&#p}NRv)#q}?qv>hWqWTlv^r|LMrN!_8 zN-)jJjQG*ha#yPoU@7OL^J09w;tX0ep@KTF=Qmzo6?k4GQk#Og+=PYPW5yC>EeG`j z6bI)I_dQo(<0kM!QUa|RZxcVNSZ9RskW9|i#oYHQa@NZbWBPc9S05im7EkeFng$Xy znwbrZZ0U~w5`1?yKbggMXZ0Vn3U+ni>JydXDATuLvE}|&4sD#?HjL^pebrp3!8z7{lcUP^FGppp7E%-WCl(a zU1nOij~rynP*td=!{!P!yD@f@ha#413f4J?9jl7xUHJ_T3X+}cqbw#cD-`I>NU$K*3;`ZQ9>4V80-duFiGd1*C)?BOnewlj)vzsl{ z*9OaLMg0tX6b6L^t3QMH=LX7He!Jtrv|9QA)`W$cfUcQ?R#viHPqGrjL8J9l*@OeE zXpQQNy~aXe=95v^19UK!uY^dC%dNL~8mZrslUKFfq8^v@ z32$pFGNYMTQmTa`U->^Y`oe>ggT(hHvgfbvh0&RfScX*$d8n^bb%&vcf*PJ6$ro@* zL+8zJP;4mXSVzt)(@h3wttEP1+#(U^y2Ok@5y$A{1Ab$!BVuhrgw3>H#x~Z*8t+xD zd1W^|mw-b1S<^_8C~xR2P;aLusdRiIWA>+2`x;$Y^4uLc6;E>b@#xL|LvQ!5lfY8@n)G}%_KQatk2g}(1iL7Xz9?n$`g}P zNf(6Sw)QrHXX%QyGxsbTl8N|t-~av2ZkNVi4ax8hXmh(*b7-6Ln?dJfi@@blSpj+r zeqwMXu_h={fMpJ7RvsHZjD9d+;2D)>*N)oR2^lZrXryFSuq916r__w$JrZ)kVcfWS z)7h||t?o3#lD}n*QHP^zvd0o~w`R9B$T*Z7;Vp;)T!$WTE6FmPu857eBcp$&N(8=%rx=!Z}5Rb}<>)I;U z@nxs&9#r@TcjtQ8iUL0T+;joItDt34<9>pZskbE7khG|6w%MN0FUHe4wscVm$1!iz zfxjm4!IbuWjU4CQB4v&P2ck;ebuw45AO%)j>FK$+wPB`5xpZyBqlory z`|0gF)f0X52`4=78Z2QJLMe#-`dk}9TC%7+eKcxy{}pOe4X7LPa~jGJ%6WnlKITDa zX~-kUeetY()>BkZ3nLYiT-%ZFu9N+ZL#;m7Q&I?j8jFs%V+uo7<9X3rA=m*Syq6r= z`k7RvC9G#wl!ncdvRSSsD*Rx6ma1)&=Z1K#i;a9d82eDj_>}pC*H#8y>d8707nn%t zw1kr|_e>U)PSD+tsf0 z)r?S7@tXvC@acl_zwmoN{)BroTe{BFpg{@tVoF0O2J4sZ4{hDk zaT)W0+g1hkBrP`R*H)`o%bR;ES{4UE)1dq{*!sYE%yF8oj5RL}u266i?3eT+5h7Zm<6c0r0MCVguAidN; z9d99ZI};J`dMD zEh2$Z5^Uz3c_D|Zkp#A|jcpOP-YPvxKjfeBxx^K|RP&|fU18sY8iycUV|kB}^C)}s zj?VL=2jSt8o~Lf7N=Z1WJKA?f9=oBz|Ey{^;4FXFI?7>InnF*I|U# zY<-3D^uj*igGV}bD$tbHhghQn&rUaKgBM01`>uckZ zSPw%yd4NUgXZSRZ6@Dhk>`qJ#pwSO2$2HLtttEVX>sk+5Nk-4p{(WTr!;b{`xR%op za8}QjBM;Or&J8Y;(V{3HKGwB(dr{Ytg|(U;`go5xPLS-=$c$vQ-7ozacYW~-*51E= zz7V!qnZgV$FG^0A`*uXfF5hQ$%h*y`2a4T{O5!cn$_9)Tkk<&|QG^#ey^-q@cAKmM z*y^tzQR4x8!iv(lpK2ZHW51o{FD@x?*Aa>GU}l$})6c|do*76UrOb)z39(@@qj>7h z*~OIyJ`FRDNoD8(Xexn>#cQYh{4G?d;^{?P9c2`0PoFT9g(xjy@DH@jC&1 z&LmgoJB)AIf|02Q76osuOlEto){k3|<)fTT$x%cX>(yCga38K^aEE76|LX%DiyxMwE&``*Y*2n!gkoNr(YrZM~STDL{dP|UUd zv*-UFEEB?Xiz4}3P6{E=<&4j;)Q+}eleYlz*3kt;_m~yzR|W#oiK)sLyAJXv4{iA7 z4u3rV0N~kXyU#02uvt>ctloi%#)E0CDM~)cGr^J<2RNPPC96yH9!Zp|y~}9{8?sua z#l=mvf@lS)xLn_E-uiliucn$;i4>Ad!pCjg)SgR)3Z|cc>_Z6r3>$Xv5vmrtUXtmz zAd*o7Pp56B%zLYm;GyZLX&D8Zf!F1R7|cor0}6`VRYU`c8wvjR%ctwHr5ojI6#rOJ-ypVxND_r+eHDEXOO4<_2$xq$pm61s1}s7?7J{UitZN~d2E^DUjq z{{H&De#PgraieMu{ROEt)DDaqzPv{troy^DT0uv==&U~sTuTYD*yD$P$x6u3`?UI$ zq#n2iwtSB&N(TP?WtG@*?C9QlwmT4GY2@kC-{+Uv*mRwZblBZpnS0z09ehsi-aP}p zi^omlci*Te{y^4)0M~p2X%2V(p7#=uJxIqQY{=*&siUEd10G-N{yrlO@0;`S@ke=W zRua&5$@ucYhw?rD{&9;N?>S0k9nLK4@(1@-WA;!gO$YzyDQVZbjT}JZ4<@b^Hc$1S z+LFa0+lnza((9Wm*tx}rJ+UVnse|9}DLj@xXv`%teR%ru1)jn9IW^%Ybe0l5bKeuz z%mZ~lGtjK-4DKr1@0d^_ipt};hcVory%g$*>c+xJqs-Y)nZcRJUi$j?iBL>b%6iR&xi(eenXR=XhfWE1b2|)#P*Jr1C69mSb{W+ z!WVaqwu)dxU1F?T3{`bvj`_^soAzC7njGZbAxU7BlT3TP&rN%T)U~7O;^H&0J($`U zOD>phYQ7iy_Sx2)e0FP6+f(zzhUz4bza%Ljd(e4`2$E4BJ2mRdk0>shW)l~$MBj=g@s+E!31Uzmk6hJdca2}8C1 zFEsu*|30nWA|t;ZuOl(-A;zCxhm$KB0li)qN*AjDvUlYKgoYc0!c_tNKn}PJHu^{?1(~Q>ngda12-iG zUYs$w!b*;K1_*cE6Vu7U1_SnS73)D8u;mXw=3Il^f$lS`3N_QR`hT3PHm2$)Rad|T ziMhvN-=#z-tfu*7jO}LzJZ(*(#Ne)#nGz<(;;xY~I;m-Uq&&Ro`Qk+ia(VC*A3qWEwYP9YAIJ zecHDNh@P>ip=ScE-LBlj&mUyoZNh8u(!o<5KNH;Tlhu%^`d6M@S5=*Ed|MurMyB%~ zY6*0H-$^m$PT&2BKLiXcj4!+G^`@buu!NaW1#+em>RV5y6tibnb+BQYxS2UV$9^+| zb$O+f_-gJOJ7t@y@X~hck#>82Sh;vSWDP%r0SXkD{ie`uN>5J$9*=R@_LBL{&rbCL zcDrNb!fdq=xWz+WZOB_Uctz1kg7#fn5Ya^~J{FEHS^Fd4t~xQL0pHWE{{KOQV|qPY zVq-E1pSAsw3MDVWsk|I}kaUfpl_h(%Q5N9uBk<(*V%zSZvkw2_G;S)Upjce z)9cueotg_awT{3*u|ljs7Mt#?Gn15Q`6p)A6LD3E$wwEwFG+MRdpD2rOd$(BE3jyX z^Zc~R%OkF*rBd(2V4n@}$2^C5+kAJK1EkKVh#Ai*@GVDc3Ta43b)Jw-hAOBP{N;l5 zSLLE79jhN~afvI6OS8+|N$mOhM0|ktl38F;pJE9Ph99}7*J-vu&Jp($L=8R*v9u3g zL1ygBrYZ!dCYt8#JnoC`6jV#jfyeG1+-LFBGytuKtJ z`gkvri-Pw#s@S{zm!szdVZp3usvc(YeEk)+#zx))Bht=WiV?CK8V}T#zbzgO80xKc#kp%LWoWjc=?zc+vd+$zn;;fJcn|WF&{#;I zH)};fL>TRoZ&wM*>zyVp|a-E>+#=$#TBqIMLhPqa4(SB;o2_dDv63tk5AiY zn+-5Si@%MK59&{oavdXU(wpP9zKMU!(GKA<2PJ}y$o5~7kDIw{1W5?K4U2(%##{aO zmWshW5vndXH*1!F(8eBqcOodCfnOA;6=ql27KkqTWWpVoa z*-q#^yop+lNa(CrRl6usynZ}D+kE=j9QYj4*HtEWJfw$H+=1o6Y}NhMggh$T>I+}L zsI({z>l+hunfk}?luWnZmHVVVVc_Ur`(cBYiq~$U;hA(5K!GTLLEJ^Bwe>ry7iI z`_oHRy6o@Y$V!R4>sS1{YW-8b4)HHG9$VfsAEItsCfm=ScrND@5isS8vLMMUGPV7z z%r;7S7B~B-r$wEm-#V8ERc>Sj5&?Hf$fp#1`m)OzGWT!;_qff{Jh7^$3H@#8BSNdu zy!TDxQp0U{1=^<-*F{3)~G{N z3ksb}Hh7i1GKI1U0nHiGJ)zC8)0@u3j4~V<=}_)*(*tDdq^0)(A^nlo;OP}`Fja~0 zGF)oh(po3ij`NsC@;S@RUp3y2MYy&6TDqy9o_EG3Ky%k9ZlvXJcyp++r^QqVF{#N2Tl( zoF^((A{W@k_Vho9bX`|fdZEbU2u4cn*a4_2Ff9pKEfR9`g6TXsHbmE=9`$&caVAMD zlTUIS?K+{RN;(W7^)LGHQ=>3EL5x4>g}2jo)k1L0$ftI z&b%#>?)%o?2_HA2+-4;B(Br;WE;LIUjiWB|QvAfDhCu@6T=6vd@$ zu4N%j4){-W5VpAMdO>~c{$&ASA;A4oyN+!6<3n6&&QLm6QW}fc8CZSI#q5J*f8o}P z>+{j|CqH6V&SiXFLI?JlHz?A!nbZNQ&zMvH*~NWk0g`(ow=QB@Qz$oxfV7T`>x_7y zv+OoITh;|OU&UEvfE_n`c;M-|dlYKEfR;G}H0`mmo(7)U>m;0ioEXM;I$u=O0{$5oNY za*_b#nzDl_3^kCre<9&j>t*ML@4AbK@V>mHt?_U(^}xXB@w9XI)m%`q?~_1M7aqLu z<~llDQd3o^q$tJvFIBtvSQ^WqJVJL)ob?0Qmsp4-nDmXm=tK`Tc?$PKz*YgDpez8~P4YzL*TXPf@v|Y`epB9Q)VO2zt=WGVTRTBRC5EW}NXDm2 z2$wG>Y%S5rnlMS^tM=IZEgJ6r*xEE{63i^?rkD2nZ{w|y_S^DV`5yj{Bgwi%Tqcz> zcw?qhXOqB{CpE2A2f7LK)2508B!&IL&03fu)_mn!lSy>CQs}p74h^J7pVIJ-%vP$! zZmbYGfn2#yCVyxQMY z#Jf66hKzboD1$mqt5Uc2U~IGOg#80!QxQjY`)q4B*$!%VU%s_ zyP6OJvjqQ-8_0iF>C0YZD|!U?{+=Zv2o{vzO8n&p6&nq;woJ|(Amww0>d@)pV|sC6 z=1!Pb*oi@?!Og)tvl;C;qn~d^HKj=r*2lmHcfOZ1g`MiXn{HADaZ>6iYONRWDyVR= zoa5XTwv}R5`phxXGtFNI_9l0ei%aknL(^!62sb?Gw=L{6vH8`^7V^p0Zw3^WF{`F< zs^i3<+U+*qcMFV@uO9pX7V8x;f{klOgIjbk!Tku%rr@RW^j9>(-UnTpn`gO}1XqKh5`0Z(5}?87Qpe%M zh~7JS08komCHJjY!afI~Z(8Xr_+w8b61kohd2vP;8Sl~_kB&-i%I?bj6~4``(_zcz zk;6`urTcA>?E;Gi7pBzjd5!Voe!l)DSKyrD~U3@K3$n6reiDLc(GPPY2H zRogCvT@vHz&!Ts~WfMw$4CU4TT$%Y!Y%td!dF}4b*X6oOGSy%i`*r1{!SRV}{sCQo z4?HyT31m<$2ra9zHPiyiJnI+d8Z7_NHL1*f7Tz#8d)4*HhQ6G1TXx3l7S^=&15rZg zu^Jda=&J7Y6I+#P9?MhnPj=yYbaJH&*v_9I|OE! z*`5Fm6l&kSqjXc=p^A@X)R+x&P2q^<^t_-;;LglAsK9eW%)y&1?5viOa&e=GFJYi( zF@8z1{}O}rIAQ@w0xmy)rc1>)$f&6&E{;P)^-ommKsLqGaeUQB_)$YfmS1T}hM8hX zbqS~zG6bN^H4sz&BN+apd)6Q5c9K-|2qNQwq2QXl5eAkV65xS&+@T%{6%RM~Ni!+Xco&fNVF2+iy$2H|m}N-2xm42uFwR?X4R1LqjO2hv#` zyI%M1=~7&vYR`UL{}L)AMaX#~hA;7|Np3#IY;MT_o1jR*_f<8jFTn*FM0C#v z)=hl7s^nV0Jby3s-`a!qwz!P*rj@Z_7UZMK=%THH%*3L@S2u#ST#c5hM(ME4x1l-@ z#2hpCD=BJe!QH^@=E}v$Z5B%?Bq}J*Xb{y^ca|JumhB60(CYB0QiH2cfu&y=7M?IyH9MK7UWd1Ee7j=&T;y6IP!%iXv>uSti{_um$?yuVuy00rDkmvLu9ER zD1X^UJ--jvJF!p6Q$5hF6h5nbI-`*}C0P?!Cv|6INSe51ykfm}3(@4I$*f&;Pv7lP z%G~s?aVU^U%$--J_@@@fV4bwU18>*5Zij%Es~d_xGSm)3Lq%zpn?{*F35ca3 zUCC@?*>e4;Mqo{S5pE zlHRZmxZKoCYg7yGaS&>nem!Hjd@|JD{^g^haO(=sZ8@g&w=(T$Bh}`yz`On1B1Ojb z0uo$lLS90z{zS+z&I`=%#|-nnb^3znjlM6!?w4AYV7%@I$q`?WH6N$hC8>Nv4j+4A z864M{Iclw z3iysre~*I6emm7D$_2f)!@ z^{n+5j?@V}c+6)Ac)$S~VmyvH9A%ADq^G_~WTOzFv%bKg|7#KbKI`RGnY zO`bw(_E~4NBk&a@oZ?UWeN7qvu)43nBt?c`yewP2DJq@fCa6oW#kyL;>HM_wkA7f_ zE>q5QaWe+oA?O!!EKM}iTPL}-8E%uyRN%yO|1u6U9r~{&Fod?wbR#z)QPuyuF!Od^}CIn zkS+s;kNDdyu!43o;yxi_427bZFY#H#&4WA6fSGCYiN0VPe(McZzDe}KH!UVy+4iHB zSv^0~el*FPrbY#jZL=9pHl9cX`mJY6bpLa@`|<)gqx44^0Hl3e=%Gpv^$c2OjVEJC z-#Fuc+s)Unkgd@=gT)t8roP7@jy zcJTqLs**Y23!;@FuW>LmKGZ=XzNl_V2N%&;H9#T1|9HaiqJSbi@qYW1^dD8-{XC#Q z0#(tWeL};UP+a#R*H~ ztlPA{zrjMi`xD_THHtdC|2o50#9b}>wpAgpOYe!WYUgxes zS_60G0yh&)<|hZ;D?yp0Nl)~OjP2JPV_I7@D~xS%&D7Jn2R*o_Uu(1P*d6aS zKdG-2@nD*iI(SV^?T@U;0Z80NIhNywrv;k2BvV)$;zvMW7M$Ygr`PKmh_KMDR$)!j zG>Vv2b)Pe<|Ii==opNm%i^(OY^Fml~Xv9_!UPHsNM2qs7Hm9$gTi}jxNJ8ISw1Ctp z%85og_3L5CW01pWcps!x*ZB`!&jK*;mD;#ug16{N67We!7>Ul3$it|}?AH8Npwd@L zw`EnU>d=RBVrGw_y&8)j8p~=t;x+b69v!AL@%K*?H&4*ih6LPrd}so{u9{=)KF`FK z)s*mMW6)d!^ zcQFf#Ahrxy`i~Hf#kxq}iTL4=NK>lY7OWQKoIb#fB!(&5yY(-~(17u(nmvp|ycwdb z0IOI#?d+D5#nHc9_WyyYkArpKTE+!U{i3FE)A57fE*gYJ*&26$&1=|Kcugaf)qduhZ6Eik(PyyPNto2vI`W%R%!hzdkP;iw@u4?>F!p} ze$(Al=x=fImN4UVE@`_3APtJpCvaiosWpmvD>2Ti&YhB+z;nW=)Djp9L==E(M{5!s ze$v(te4IZ|;j?%{TP8q%h+CW_)HR?yk^Gn}k1~D?CQg_)$jV^mc`_>6*!M;1!*_Mz z7s>kR`%F4SRJuzI4g!YHqb$1A>B!$6VfA@1XB&L^hMAUb>0Bedd-LV+H@y5{iogC4 z(k-d)E$Ql=TP2pA7kZO>ZL#?Y}jRIfv5M(Rq{pxv2%UclAaRNDkoW2-}&= z;B~s=QQwl7+2v}qp5g6(AD$07{tv$?61H3C2cfx=)7k@vhh51r$dB!x3z@M}-LdpQ zXPC&TM788v(@-hl%DvE+s3ZGDPNbPn+yYl1R*@{| zm(wX>?lsse#dGoIYo1kc@pK(e6U#-9CLS{s-mPae zFIbc}bAViCKK551UMI&lJtwzX`xlx1?`j{n^C{%fhK=|>Am=nW=YW3oyQkGSNi+n@ z^;KRs#!#gf)y3f3UTo$P)>6ChqW&D>o6d8rfO}ugbnIsedEJgaZ=BYS@wgu89eeZ7 zRZ-McU0^CX!SzP>d$V@bv0sCmee@-t^sT9DC1$53DT~;g3}!`{YndxgJL^p+P{iQ( zD{59xnlj}ph0#Q2veyK}cNZ$wVNIXqCH;k}G9z=_gkAy+pCubTg&dhHomw6wHzNme$;H=&8=jp&H@ER&fy)&;(BrK>NJid}|**Ri^ew;QN^N zf?Dr4^^H<&p1@=?8^NN2{4`RM=5+l>|5c$q05G|DZsp2L-z=s`?(O}Rn%S&W>5E&g zqV_(d2S?G>az5d9L1I7@nT`MDWt;#{tw+=J6Md~!2IgrRWKIjxe`K0We|<7$#foI7 z238wfc`A)K()T37mniWgy37bG`CuGtv1M&0&E?{Nw$C zn!BA(!uLEVeUH(N8{~49+~8R%u-2HF`#}E+cn_s-nbO@^XV!eHVk?kKq$GnkiMipU zGo;|K?^x6y0wJ>;-VUd)nl|r) z8L!L`W-R|!y!gXU)S=CxCS4k0IwgWvWp-ha1ea>HmjO%HXI#yk`MMv&u$iQg{MVBM z@PvF(xOthbY3kI#HX78*WqukTq)<{LfP}PsOOqb07CS~pRSvP?Rd$X4#)bYb{n>Ym;fKrbyX&6jPmkvGO`{uc9py84?$VQ2 zzg;#>t&r^~SIAGUJIC@E85Y7j=VE@zRtlxVMq_lk@-M2Gc0Otniv6JIj;pt*NfEK4 z60oyQIx+4!ka^C9tyEbv0$#z2aGjw7sw{zq&Rom>{I2l zU~WeAwB{VvAn;!%Ux=4%G)}V%o3{5PZC|&clKcmA@@#0AZN+(PP()d^UHuo^a*9B= zR)kw-l^KIL^HtK~1@f-&X|?QDL1e})>p0dHl`{8O^U#TEYIV5LC^6|_|ylkN@9-=b7Mh4Akc!sIB6my&tm~`g` zlz||hwS`Rj^2+57&P~(uemLFCXK&B;5gJpF)3D?$PbzKBd66IETK3~yu5xbIxB2(nAsjRmf41@;(nWpzaLS|5&UCVPiC?x%GY$^ zv3Zi5!U5M%&&aVgo{dfK%XV|5qP1LTSi_6#Pp|7`4p6D~i{(1km9=_Gds+)z5IsJ7 zj4-)zQ2x61q-&M6X>hdUIdMpHlSPmLpMo=VbqrOe)N9#st7-p+6umlH;nIM#BBp=Z zxjwTNESG4xLjirPx(a=vB5vUsxroDRk0_K}8NH&W;FE5OjYa0!IVJ>#!o>ZU5G zRfrvJwSsyir?7Xj>jg!+h8`$3EH9XyH!%1kf!b@DkXy&apD*JxaYd-2bQFRoRC{L} zZE0*y`FBVKWDKh!^nLjPeew&}W(877`*RO?hMQvJFW27J;jq$>YRE&Ej^c1-m9jz| ze%glcR@4R1b{3gUXxtU6{D_`KAB8+8+Gg5RqpiDQrAPc9w%#(T4Xo`NE>NVS9v74DSY2C}ZzY_o&D4Q@o_#_V@*D(Z*(jz+W;qoIzmN?W^} z;YzQLThwZ1Dzj%ToB~yEw+c+#Y!UhxY5X2l8(vuMoG190GjGGNYwUU60p$>_xsq<+ zHi1L^hr%4AVUzA!rOs%e_Y=#;GtC6pN($<#miEkU%V&x6vi6)9p{X=;^MVCn zyPuzZSvd{yG?BhR&WBwmN$=Tz#!El2;l*lB^AlE%OUKL9t;XZCcP$IaK;S4kQparu zyqajqN}ubuEmWWv7*iChjRvfaAr*aKAYsnq76)&38oi}GmPFs#QB&Snll&ey1YxSL zX3*0vwH=ua`g53fYFbeA_{L8VLjrsXYxU$qM%lomEmIVaAJr-CGPiS0_5ejzWCSjI zVTS*`!BM;4bA>U_W?C0=r$c;iS`UIs!x$8}nU!AFC~EcfGI?{8VNc-566zVw9;$ZP zEd!38Csd^oG&snWE5@RoS$=qV_a;aiL|JT;f&w^dDrc6p!2PzzeHF zI=ql%-eo)hY1#2q7zp@A_|=qEal6{e4J87;Tc|sMkI&xVD8x&zM+Xci{U4aGF9I!d z>vX5iE1u~g!fJDvZ56Rbi?ltD$TgM_=MrD+)v6MjO+3He%ifk0eS!NL-VgXKN1eMu z^ai|YY!=zjaDfnw8X$ii`4r-ry49DvcE+ZR)c&OhE?`9(5S`}nv*#8*=eTs`vGy4R zhTgtfa6xodI`D$A2+GQx6td0`Ex+dK}eUz*-0shxz7^Tmzwi~u;P7_ zZOnKKd>895axJ0djgx|lx|eIH5}eMKZ{i_iba{V%ft_MxH#&38I>*GX@}N`K5unyx zEoRG6hVh4k%X?}(5VGT+@a4?|S`r0|I3~h9h`Vp%u*w}-yyU~=LE|r`w zJ(=;55ffH_c%q1&P9J_Iy=%Q&IRy}p4nD~!1R?$%u_i>WCa*>y1=;I8f7Xf9Hx^&@ zuXrV)wUFOF^GIwb?x>+WU@2UL&5tI0V()3Bu)p+QfhYJn2u16d8CSo71QZ-;|{F`Ao# zf2OFr7^|A=QwK|8@A(~RmHD>--L5y)oR^dF+(A?~0SvkN|vEv2IoD9Vhi=VM&fe@*&%HiyBL=OMnE_2djr zd!5$@yN$!e%|y6OZN${8&mla*co(rtt|Zu0PUH~66JlsGABC-=!eNA zV`X5}frr9=uFI2m5&UGGzB-=x{D6YOo+b8`i9TX!7AaTR?b`kne{d0o(@TSkdeJO- z!WzS!Abd$-nP2bK*Ue#~J3-HKb4bwUiSIlyk^4#bFA>52UrTk48L(Z!I;$g!$X7bs z2%Gy_Le8i3{A|hAjGmg*X-O9=Wc>jV_g7LTo%Y85 zP(AB9dih5au<+z`T@_d@LPPVhU-sArm92!cKUo^Ku`2 zJY4Yyz18N1RHU2}MOTFK!yGJtv5L0JNv|W~mhUHARen##x>{s>OY~+lZQ3&Va1Mp4*i;~6b#1aOC)KXncuEm zjLgw?8||w%RT<}H*$}G%&`B9Kv3L{=J8cO!G2CZaLzcAqr^YMy}FZx65V0^vFlxBu@H_pQApHH(zR-|O# zqNA)DnphH|yGJL9R38`!Nr9>lAVkz$;ec`eca>l(p4Dp7*-Au%+ z0YEkVyuKYU=NP8Os#mK7RT}7Fw0w6>d1omlvr)a#X-<~B_vJ1l-=Ux zgIUYMI}%L_^rN8lE_h>7}Wj*q9@FWkEMEs&!A$90mtac&|Et{`#;0|+}GE)#GC#4%k8t%{@4@JJclwW25-DzG1Iyu^a-{?>m5%I z6)I$1l0~h1SKxN#sDOEV-jy$|8tL0o;^b5{Rq;oYU8%Y}w|itNTwpw8K@Bsw-oIt8gQ`IF|m-~MTXJhL`AQS-&E90mMD zvhtfM4l9fK9PgiyaXO}*j)uherGY@yPQZZPBS|LL6mUd+o(cAo=VuI62B zgM%GN#&C?W^YjZ~=WE)=2d5C<0s4FCRQivGSZ@zb7j$^@?-mOoB*Z##Pzlmv73oK% zzN1@i7s(^z{4X^cQkmwdLT%nGFudQiHBrEtkiH?4tgzBq6q7R(!iLby=-Q6zKZwe@7z=HlAZ_|tp@jE#Z_-p{zK)? zFQ-&c#p~+_B&h!gLDRnjJxHqg6)kj)5x|22@knUxB$F{AMr4qW<;j&+z&fZiE)|WG zfS6^hZ)`w!`e?0>C2Jy=Yzi)<(?r~aGpZ@HS(Arf&`E-#9zg^oR=dve8d7!_yZNg9 zfxP1WPM!%|dshf5_)(PjdOqANrILKsf4Lwt(LjGHi;h~d(ac@=L>dF&dYx7`hGZ`u2~A~7MF zi%rH9XYkS29qFJr6H(bgk9ynN5I=_H;VVW-a);;jx>Zw_363nON$mV%-kRM$#uWX= zD2t$dISRl`sfv!HtPDF{eslTN{9r@5LiCCpu3~br37;2&OBntiJuWOI?rxDU^7yV$r(E++)E%XT* zvbB*Yq5XHrQaYNzwKmTJB*!>cXa%WB)PY2|cCp%&56#_zhHcScR(2MdSt)YpC5t$d z`1i-`dq8K2iPX=x(+hU$xX!!D(Jo-bE`(%7$#YlRu4>1z@uhmGaI*}t5vQc!dTUk=j{E&F6J6<=V4&X zKa>mUUMC;}aH0xg6bwE;8;#Y7E&}ZCyocHU4AiPzAI;t75DQ*|td04J$o^_3wj#T1 zdGY)`8>PP`6QSo3mxRH6I>{Zh9|ETRW^|c>JB%V!`ojYHJm?z`sm%gd44fMcVSNz9}j;_;YgXBSla7oR2aPkce0r9|dm7ik#8u?+O`tZkwq1#V;&X8-MxL_?ixT&UaaPAf z%4ph-SQm04{KwV|P9BZ`*1-4Xa1kB{T2Qwdp?}jEBlVFJBeJ@nJ<+XfIMZJ%0|2|^ z+=8^j+*OdcK8+u8u3O+e7fKS|FRas#r!DT79TraVNdO{w#JLmV8p0rWS*WmaR>F5`#=4}x9Rc$wx|CBbou_Q6edSS7cI`Dtq^8Lq&@A&qitErVKmvq8v8%g--y zk7A>=$C~p)teo6A%*k(WME;TGEs9M8I zSlF*)l8J2q@pfEQR+ysTU+L+Twj)x(Gpsj1ro1Qt^Ry%;3hLjj?n#fX_*CH0+8PL8?g+Q2^QtG-=G*O~%CJoyiIEZQWe^kHI72nN<~_fe`GPK5me7di zyTp1xpk@qjl?6YM<<}1i!ApF!WwLucZM@h56tiP1Im-`f^Y)I)M(j+3WqA_S^|iFu zKcq*5N~F*|@!^OCwTgejx}Szdv29{sQkZj&y6KsskTQ^^ls5h|QQPTf4byfyPtW(k z-(I&4Z6TpLzG4qD7oZQmd*9+DmdSroXXiEXla@EFpOdZ zd}GmnB&XYw%<7^H>PQ{|gYn*5=lY-V&ipFhH-r8^g8HQ6LKEg*{O_Y)!q&bDl`5Is z*84BEp7Y$ecuA-8(#yKc#9WdAw?0D1f@CGigKnAol7(wu4tB940 zhB&1GT^W)mGpPDUa0?X`yCjMV{)Rfs*5~1ooq>^3&EZ431bO z9W6gVq0amPanCdYXX*)sK_&+=UlAgfY7+Ip$z;-aLkkUWLRzE6s zIdyD-VpFlcu|Dn``Yx(1Vl=US8*(#DwXjPv3H6vCYAyfXk`;99lBHU~nMq_&UC%&% z=1g#p=dK2CY__(8&SXMwL$cG*+TeJtFBx&zdY`2Lz(>!B>M-o_unSQN zwzh!`#ZzY^Q9G{;QEn5B9+EP(!zH(wftvw8QF%NDf|uD-8lC)~rM>#)otCxa_p!3M zSh`T@;xTo{%hrsbmuZ?b$^P{4>FLz|_&@Cp-jJ)6TVbg)@5i2{@%Z?(_@Ez^mtPX6 zQ0NO4k$x}wjSAn!jr>?)av}Zsl}1k5N)nelvZ=SgpUmi=1o!viAa1t;ut6WRO;f6_ z1IVlEm=F9WIzPM+7PgBXjYvqM;Nb8h-X&m9>}44&S14kW5BMJOG0wWwDiR*tqacIL z?Nq+Roy?#530y`Ca|(6XAtAnf|J(!te|l76zLs=lONYgsl`H;>;#oi$?yCy|VaIwH z)T%rjqqE_8{^8cCj*L(bspNYn^}uaO;>D$?_sjc*kn|lHVx@2#V}*~E;~oY4dJ{T2 z9-#yZZexRj9=9BHQ->N~hig8H?C@rn>+W4i2*?EVa%67&``AoM0(vjL#&rKPL*h*{ z?ITT|^;z#<)skzq*5OYAenE;6yS>i93My~9vjKSbJ-}xQZ1o%RPlJB|PyW2|-9yX& zEX!S%(}xaaG*%9`Q0hv&v3$3uCj?gJtlD)^3>mOcY0-XU*)`n#b9Hbwk17hX1%7k( zQS%t1X{+ioAFg&S^$6^aR{pfAj1xFht3eJVl8k{s?N3;1hzvsgJmygru)|e|-HS{N zX(qo&K^O8jZF~bQN7#Kk%zg?A(~|4Rb@}m+AjS13FeqsbOl4xHjYjUDcIEFy3q`eP zd%%S)Op$wL4_rw3z$uHhZVoy-pXzM?QK74$*@?|$Ct7ct{qX#5f`PJ!BBzcgqcl29UdDlm<#l*U9HWkUmG+z25y8SN&26#DiJ;za_GN8TuO~U%kpAQ z6WO>xP=T85flixJ6jaa7X8yqRQ0wIow??VReINr^jYLtvGkmq5=A?KUCHmd$ZR)JY z=37V-PNBQl{JlKk0{oWtfnr1xl-b!t+-Ng#e*@RyuEQs+lk>um#G~a_#Q}8ha zlT5%{+~wq*MV}nYR(J3TBB5Y?a+7N&^6@Q)KvZI|P%BEn>3A@-LNqNgDcEsy-OO|Z zBGAU#%>UnM{9Pw~fCE)2e^qze_1=%`cZcF!-{!}jomJ)S03sJka$vYTl|-i1&JPA2 zj>Hpfb&qO*N07PL(qJbHh{Ye6hjyhj3v3BfZV8Z_NTuPxiE} zkm&&f{k{wY=@K!K%MZ@Hdc4)xnk5>8d9@NuG|tB3#BvrmvppWBpWvBY#!Gb+73I@j z>T;T7U4G;$+^;L?zNaFyc|paWPFY=-GzY@iyoSD(*%4BxsiTb7`-A6Da~AdR!1!Of zGyMzXAe*+Azlb>HB}3~F*)tE}fvsiZd=FhQpk6&_cQvvD#M6;zjSx%=$T1tE1TZx2 z^)Lh|R!KCQnYTOS&$L(Ubf=r26M}h&f#gw+7qO#1DbSwaI+y8f36;Lo6DTvUqIOw- zd1vni>i4f2vs&AncnSPWz+T)1f}IIWKx|3dLu{VSzp+YtMVks1APVo9%OYYv&^Dj0 zo>sfjOks4gN%kiu$?bnd$VSoDGutmG7cox2mn9N$CDP5C!g!~FEPU(%9}J$v1h%Mg zb={GoNGXZDZ*2vd*3%f;s-E-akhy>BcC=ZVndoWEO&wBDU`FsFd*{Xfo#g&+3A-G) zRQkY&4!ug`5@L$c2{PDQXjgNQgZG6A>t0SoLS z%BIG7=r`mn;Lq0ZMvTpK?qn#11(vQi?5&{`F(~E(EFoogSN=qFXVM0i9dIwVN&If5E2}6wO>N`4d-=9;RgIhE3BkZM zEV0cR96FLDO2Y;d4=#>JSiGVxuH}0==c_s0S+)2&hjLe%T^Eb|Q^@fbM)wAd84|MZ zlJz%Cs+~bLAQ8N35HaKVu%F5Z;&C9~Z?OHLI+KNKys_q(VUvyfIkot$@%^&NO^l_| z=^?D#J`IveWiW$|`jFUNWwqcr$eYEgPq6$OkLJPNTIs(r(#i-9E|X}yX4pZhe`vcF zPxEotSA;y>qX(AN8$13dmkh3eP_bU}E%W(uF&OPu>p}YX>GNx{?Df0tuN1nFMMH5* zd0MS)s#1XB8~$&&mt22j0F2DNk8I*Up3?TP?T?v zYiVmWOCVWQL^lo=HTRu7Q+7BGj6hx~yqsoZ-r11kZqp5T6vyQs#Wxn}wfo%}=+HLW zFlO!fKQIgd5lSkw39MVt-~QGWQEB#*BFAr(Nt;&cZZ94;+b)5@k&+1}Ga=rQcV$Jl zP_ju;(+>)dEt5CVk1KIr$AEA4a0p^@qppg0a*;i8>>)hVBMDLrjU{SgTnuEV06-)H?iY-+(aEC*1xT!MrtF}3kKpC3-uYtw~D z`|lGFzIcOSeh(DJY&bD-N)qU$njk!>x#F~H!ugE(CP7u2;f^JrQEEcC*wlik1%rjH z#15Oe&E)WPLW7)_uCCkb{+1;p68nq%%ksPx0uoE>h`UUwkr6Y=ioi+YVjhSpU2~NC zqVS8}CIp$x-WU+&16?k(i$U0hU@JOx`ivz^jl`8+{1$A|+g%pK@?7f{5fO>IJv~BX zkTqYh-JPn<5l}DSZCqMCGxAU_t4B9u3=hvC|4&QZvu-KAnhu`wT64%6W;Gi$5=6r_ zJb=ePRvTA~Mj&5X2#3NhdphkaR;?yBL^RI$s!Ce>Gn3~V{nfpj zyXs=%E|xIv(@P?|7b+wlp`cQIW2hy3EP+Sw9#SNga& z-6!i*%U||pEE96d6ahx;7K6022pOR&M}@Kyx|uoZfnIt6_Vh3XRj!;EuWw%`k$BA& zOjPr3uU>OIas$at7E^$vWHW2$OFqjZCg={F!y3IbVe7azZvT>-=_!7$eRfHr_&5X- zwPnt2Uj1H>*vu%_$e_9(*dI*w%a>kDi;92c%4uPJ3X#|8hwi#fXj|)l_Iqk}(tWw_ z&w@lqeD7`81JgTPH}X6dTX2|c&|-6 zJ`qlfscvKhBlmkZ)D!u1y2y~4t-pH`@m*X#?s4}Fo-$u5 zDh~#&0`9gKxBNYO?#3j7H0G@fd)@uZSUJFg&NpP@JJ?L?am+R+8pM0$#H36(+lXr{`Wc=C0rfj}{NsC?1 zdK`qaqrd>Xx;XNG<-%n|Sj|jxixP0X7N&b;{eQ^(SOy#b6m#%nXutZMmVB}DE$uP% z#@R!i)pa%-oxddss`Jl+Q2*TGYkfdW_OeDT*&(`pINT!r*h!3)6x;xow+W%1H;BTd zL25+vNfjvDih1S6Sl{eXxim9g;>n$2tfb3o5*i|{sg2w=o_zrG#Xj3Mw*%R<2$24a zYEGhp$`4XF1e0GA-GNIS`R+kHiABU-AGP~@YzsSzz0$bIswxWcvwcJ#FQYU@&zDe( z_8{M$4ve9su$ulR$f42-#fRX~NJmkPs?3zSUsRb^dNEQ27!{&6`gTs&ak;?V4Dnz6 zdVeBHct%m~gOVjDbXZdRmq|%I7TaYM5!xG3T!#97Rl^*WxeiU5Ga9EQcgo@6 zGC?c{)G>zEcvdkVPqwCjXDp9~a6!LaoH9ha4#^~kyGWvA8*iI{PX{&r4dyDCjWm~& zMV{8~510wBCr`;eVgf-z#R|}fP)2UhX0>=9YaUAooq-EHyOR3g>)?(JYVJY|5PKc; zt=0m_&EtI;sg50{I2iMX$@-G2FuZSlMn@^RzvlpSsK6OfYYoVbBfALsqudW~I%2>=D8azpwReAtk(fkS5kDJL z_6f6qc4t0L8N!}{2!~F$;Y~)U6egw#16^R@)t~nLQd|0!Zu9X1zSi zg>5AdZ!JP^Y~oRj*i%w+ef;11a1sNbK0DtGAbgr$>+fGh67T30-ZTOCR4uFEB(rJOgDk1Bu+<!yy&^d|#DG)E1NJz?T0$@MvgSHn-uh5%;xd z+VK1*C&$Fik9!t2RV5~`LRSD!z`e18+iGB3@2I7Vnf~^6}|%jF!p(qSm|&6_Mk=5l^^`s`Pag*rV3H12WK%@ zN$y~{cW2!`h%ZryO=v1ao@<}v7b15jG~}i|QSLiKp^x)_%l*zDn%)LF5bajg@U|;4 z`^9oJR7oCOJq|!y>S{d_uWGzL`IQ|QaJJ)oB!a7>2bdf_F@c0c(0f0=^f?WE(ACg@ z;YfHtTZB1cmI{~6k4yW-a3ozi7vt#$q-Uy?t+%=F(%$}h>Ognc*WNy-;dN1L)qUm> zLK;1xY-u$7h=xFFz(S!5K|(W)v%EQF7VR1o){j(MDccy6^K*w#?{+PCSBoF*cATxG zjI=qgH646pG9jrUJkAF-Qhr++caH3JSB>Bg9HxNyx5erq9b+q`|EWHnCtx3QnIT)* zTytB-#HUw3BS*$EfqUK+T2~uybuMYgYG2GOi`!^aQ_g5Zja*F|XgBr_qj2Mnh>|N4 zG->0d7}%&zrJ%uGg6xg&x4a=C$KUj2g56y>uskx--~di3)l!2-Ji;8*Q7JYo2u7K@FC#jVA2eH1Z!@wAA4WoV#z(al9F!( zo_iU=aZ#qZX*8@4cwqILHLlSN9lprDwj|tU;mI)fbYOem-Nu4(mAV!$RsH7GYe$C{ z)ew_Kf86QinUd9s_uJGyoBr_xKHt>fB1|8|9cUlj6KbEKBI;qXjb*mumeDMA>Y50l z2M@@&9+E-Y8~G$%nYt|nPez_UmABt+enMp1ZtI^wQT!%AP3rp$$MNBI$@8dxeg6D3 zjOUXZFZb5ttQ}WBX&oaLpp~p8?0PfMU!c6{)uXgovJ0%V0txN0IEr`4Xm?b~EUCdp z_#4LGt*bq&7uzXB)5yDVFm3jE(Ak@0i`-+FV_4n=(q2gEKtEg8mdt61(t zE3%sd)k#2A{PG?9>xclj=k;URsGpD`JzAc-j;mA@8_|5SoA=j35 zAydq{+VD+-Pj@)(Cthvsl|g3_$FZyY{yd5?3W+k3Aj_=F^xCif=;5{!83kLmL=RxSS@lOthSTh z$j4SD!-P``7|OJJW{ggH*UIUXurmt;koW=n7d;o2I9w+?VnH`^YG!lq!WlmNN3;2EJ`8$DGXydhEwS3 zo5BQ#(@X|)#Pd#2?xwF~#%9@ZSt+FLlil04q(2T!_0@)54;>Aq7nvP0eBSl6)~VrMCCQPZcH%0-uJdV4?3Dk&(&+W!BVI@9Yu+=w&%uJC{R0VQVlQJ;8UQ_ziQ+Z>0>P zq^OcJZ^u0I3A$?vc)HyE%*;Jk37@h3EwD2t{$_8TuniUSdvMlJ&~_c}H0f8xA@ad* zlbRTxn|Y^@OkwL^H28mS_)%LT_r=2t%k#jq<=a$J*V&j?+_JZ0_+?AiN1f*9+m`BBdXvZ5vmzG$Z*4$ zWxX^5;_g#9)Mmby=d2biS^|$0v3%uE$N~HcC!s#`OY21aMT@bb zi>T6ndW+@P`8OKA$OZ9iUBbpjE)XR|puZp5rxp+XoJz~vIJ*{?i#$Sj7veKEvSO{3 z#rpDwIPSS1Q{)4?PKo--t81_}}v@1^+qMWYs`SdX+c2+*jsB=jJ&8?7f> zGM^2^ZDr6DJZ#vr(fi)RY%|NMQrbyuVf-cFG2Kk;UhwXdyH{5l&m;5ifW&}A+IhC$ znW24RlX*@Kp5&d5)#=9Xq|v z>-H~D$&JDDHMP62=J6!yTmNLDnDVBH?AW6Hh1_Yv1XpJ!`6kji1f{}#jT#t zMnCOQy<=ES+D{0H)qUInA`wPi3uQ zybVaVRN00lKK!4aE4)U+Ln?CyoOKcOMe1^9J$%(GNbPGP`19=XFZP7OjT&(EWMSZ)$FbqYofU5rLjCNMEFqq={jRkEi*<&j}Tdn9ArBzO=@>CJ}0a$yXR5hEwL~C65A!=(Fs9r+!N(P z`}1do#vTir``g(sZd9bHRz{ zodWFJVzz-P z?*PZ%3L&Ts?5E49t^y(je?%Fyj@chddfJ3k*0QdGUPWA`tm@-jm5U z<_xlicT95p(^Aj_kbis`NJ_=7{wqVJABE#|Mn+uU=$ zg^OZv&9^@3`XKw#9j;J4?<7Qw_1y0I(Rk%vWY3G#Z!8;c{6EfXo}}wEJSd69q`(J; zi*+tE*j(vt(B^TjQuL2WdT;X1M)$=Apu5Ntwo5->{()NWBXCR{W4JhP35yrK`LXo;#;w{pi7gr03-; zWV7u}GO(R;*qh(KDKU^iYVM+g}E}>f5O#~pU$0H@kI3cPy7Q_RgH#-1SSqJwB+3bnTrFPv8QlL{ z)M!>}LSUP{JvJAdq6AO(4f><3eD|5LlUup-s5x^XF^FUhB;vN&|3%>(gg9zHk{3m! z^yjj&BqjDJ%qOQ@uM=~&J#Xguo?=9H(?i&z$8i5666(lqjFiTqw;aS}4ackDW7!dZ z;0Ul$V}xc?3XG@Ja=kJgiY8Oc?_6(c?O#29jniWUpop9~+aW`xQ zW0GC!`e)B@B@yhGi@7z%g9SKYJ&za%^cnVvWf~A7HkF7_Q1adF99uJpLBR2j_PT$# z4)mnHXtYq#Hv^*noUgz(cGW0Ky|$h2wy zx3|8~hVcD8bCc0CL{)q&a*ULw*fch5KsNUaW>Xrni_`Pw^x)p=k0I_lR!e`usGrw} zP!PHg>%dK|hiigUw3%X*eW*kZG?4gpy+Db>NWYGq?UmL97y3BtBc^E^l zEL@G|N}2}#^au2LmZL?3SGSIK?%NVT#(y0Hy}tXy^Pu~qXO-)K_5%ttzw7;rXYGr9 zv@-iN5S_oil7JVyr0d%UxEeU`1KbR^d4Y%1OvQocy(<^*f@k&~eyw7P;V+na`Ql{9 z)z3HkHu!AnHqM$SvT6l+CoTMGMtu(BTmFV6all>E181h*=Ud#%>uX-EfW!t@lP)Ft z3FSBE4XE-=VyBHIlyG!XiBDCFFEhlHOnsY!BFuJ9uBeB|mdLu;IGjc?{TgmVFljWS zT2NCRf_;-MO-a8Td zkOC5<(1ypt3rofI4TZ3oVCw+M$$qXFgjNw& z6aDSWbGiDXrjfM)`rX*X!|4p4M+Ak209lpV23nBd_lxn_gWN*m8PG|rdzOlU`Ea7J zcoR2g!DFum*1qEVvzq#ZzeMEmt&*2AWJTTyl;U=X%Binc%aQELA!xs`#L`O5LDDpF z>19uzbdmKENhDjywUF@DO+@r9gXjfIe62PTbK}&7`nv^N8dE?d6L%iv+QFpn@#~7t zV$E(G`KF)6?)Yt5_VKH`5~XG$DQBoB(?V#Ietve58l0i0yxj?Lz2P={h@2;xK}6_) zBaMX1lHld_iu%dNFWTTkK%;cfe*OA_ z^k08vi_Fc=!sYVC#(fG!pKtK~y5HKCd&@BkF2y`}my`+sQ|lSOx74B?_=$e&|b41CUun)Fdyk3_r)TI&~wJ%d}pItUnZo=DObNl z%oi>Pj^_4csQ`_8ES|n=Zs#*Ue*YtBN>i ztG$q5Y(OS7EVVET`tH)|jhG1$+WuHBSQa&VSRb6-?E<8CBtm;`j4kg%C@Vv`1hU#q zXBO_7tuS}Oj))RCg7Tn{H!AB=F&vG&X&cNOsdDtqNByXa=!DgI2vKY`7DL!&)7guk z5lWvh2xTd?)(HtGVG7IFTB{B$%)WFZ3 zG;os1+`pi(C$g2VB4RO+nquA!?3n2qo~SpMbwH>Qx8=hqOik7gbm7#p?iz0vykV^) zVf9wyODA8=>_qrBr`O6rM-3Oh?~#&yqyG~mj*sV#^3(PM0}r?6j+WBI^8R}N-y5)$ z5WG*5;Ci)4aC{L_pwIcIX1qlORwbADzxFFJH;M zB9JfOe|B}DIfTLK;4Lm?;x~PomxHmJ-9-4|MON+0$f!rp`1;tXbyg0I-YOQh!T9|K zO{5Z;#%$tzc#IU>W0H6GrkR#2*KB*J4OmZKI=P9{&q*CO4apfMnap7Huu7WphMxAa z?JQ*ub^uEVu|-70)4+cp8>OT4^w_wbQB48yk^Z@hB_Likt51j`n;AAZo_S1F+17lC|H75X5EI zYeRRsJ$>h6w3a75QzsWZv(jh-+Pq^Q%H2eCPQ+6`XT?L-CbYFROFRGagrlW`K)5YX zItCL{YjJ7&l{{SxD*dSysVlBHM#08-jG|@k6G0`v9h6)GS0+tQkl_o$ClZA$*U2fB zQYbD$uNf1g8nLv76*4y&QQn^VXD0MJ`$`H?5SD2krbDJ<*|B;P5+45EWLB8AM!_Wp z6F%>&@tV0Km05oFfce=@#A1^fc<4fK;ri^T@~$y!MS=I3MZWiX$A569gJ*4qcY8OU z1B<;uGmu>v5*XOhC{v3+fjxOZF{H#;Yh=5aBQappf=dI-%~bb;rF9{dc=g&u zvgc>TQR4nbUxK1_tQK}UEQTZ}gucD&m^(d`d*^+Y_|2Yq#SrH$PLr{su6pN|)Z!mO ztHqRGO`YWBOoif-qUHuL^bB{MTTBT~ixwN3C?f(+VfHc=*akl%k<;|k;uEx_Cgu-< zIBK+n585tw6CM2d%yUvp|JFiB9aPe9D*7AfSN+mNE;Id+*(pTL*)7LX6D6;aWG+Dj z(qKOZ5s`#&3Zn@hq}U)$#p)27*?f0qbpm0N?LOE2NuK0HuCeq6E?N7M*qDZkwh$?G zMu>j?Vfmqg_{#h09q%Jmp~3QCLp*)?2z_WkmdJ5Z=B#wX<(Tb!1H}E0$=As@lrhyN zYkf~d%SB~U+3kP0?roLlHtR!# z|20{8UH`<~A;Dy2QLx6%=Y^y3qxIX-m9HS{n0m8WfXwZRXkYNjKn~%5;!WkJ`yl{m zU^k%!nd#TnzvodG~jYAOpx=YIU?B1UF@XvZhal_^Ck?ve&Ko> zJF~(LUb$KM&$C+I7~Y_*yNjrWv$LbsuO)q)+Q;Xq(&58xfwVHG-LCZasNt)_qnP%~ zp%p6t==5R|;u25Pc2mLf7bB@H9%g2*;`5XK+CYP(Vu!HQUiE_=OLg4@iQm&z0*J1Xp9q+3b8i-r|A1b=G)wbdG*3pyQt8g*yM$?1c8^JKstCa(-;>nY z@DQzh;U0}}HLaDM^s?=%$e%BVAOY*;D_J8spjm!rFV8lH<2V&e~$|T%ziUuI56Ps%pJWo45n`iO=jQ4vwHNJ^aDr;0L2wo zVpM&q568gtsy=KEAqqW$0FP53?F4&IM$n(Qop360?2yecIjKqapS)ikgHgWj)ki5k z!Bz`q#ISPjN;AHlm`Bcmlku!xzEU8aj+Q8r(ptJLg5wT!)5IhgFXtUmERZm06yP6p zQzrwW1q68G>G@q>-W~})e7f(HIo{Vx_=_@n22v%u7 z$X!>UxcUAco?hh(nRBzduA_|wztfA5yOwI_P9vpUX_@%om4o2x3y{p0A`zPZC`sM8 zfwxbGn~P@ zmEIE(mEKiAN&r#xNJn}JNC`*@O*#Y!5IQ8GBoLAhJ@>umersj1@&_wf`91T@?Afzt zCVK03_#F)k6S9TZ3*%6|twr&VQNBN3nCMSByN-ZT8Rzlkxtp}RxQ=#17 zq_Ol=LU!PmgTCX-YCroEZRYs@YH8JZtxYIUNU3W5L?dd029F?U#Te84@&x4ouv1G& zP?#(4OA`_>IMb^`<)SqZ%)#eP5z4!4iM>D67gIO}T6z>wz8q zzN<5W0;2Eg4%Ani4;}M9JbN=3s`-#V$Y2`EHnw`R*2-jQZ726EG=}HOE$aY=Ip{%+ zePsWSRV3dC!C#h zj}fe>Vxp@K2(WsOm``8+4y-Y3J#a7Ouu-$7=F18omZzCv34oxD;3;-Cz&6P*Cc8oq5 ztl}Ze8=}NdVctjW+pC)v_Z}E}U-y3%)_nX4bh{B}N89nnMX*W5?aFm>hAX9OCyz|m>&nK^c50) zmQ|nzmF};(n0MjRydbLXkG?U>3{k~T{C9GQzwG(u+vMsz-@zOvQ6Og|%Vdr-6D`F3 z-vsSrTQC<7SMbM>tRmG%aQ^r01xp?SzMbOe$f!bQgTFDXB)Jd~qE_L+qOg_03TG7T}xhd@AJ$4y4d7g%Da^KnPi`AS=gzhB$bCkuP ze9lDn-IUjGo$^s&u)7tT|I-_BNBM{tjX1+`AMTsl@-_}6g-+G&4{wsR>u~x{l?0+Y z*BkILe@VTbe?tBhz7Ulhl+XSWT#D`xLdZ}sfl3=_;psX8KlzSo%P0J zX=TY5SG`EW9a85ckWn^0!!5W?6=+Wq>|l5B%NS|RgRAkkfz0t8BALSuatLT=)IOHr z9NuoR{Z9^8jR8<;y#(PwMkLAUOGj$Q;Wl+(%4S&u(3(K6@P|YVlFj~fupE#qmjcNQcMzh04nhPy5Tjl!|I^ zwk&4T^(X{2!^esy&5|7enuqW6l4@%i1!@{G4qNs=aD$6_qtqrge?jnJ=X=bnxbP*RbyYXLcALf;zf#Dm8JuVutec@Z>fJvxCbO}~ z8~T%i+0K?Yh@Gi6JVV)%y7ds+{P(+a1<}#6oK6)n>KVZd@-%NI z#-(FGw0+AgSRI-0w9&(Yzia8$swN5;(cnG*;M0bBaZp#|#kOp=TQ&F>8W8ghy{Iun zG%xW{+e*cgbV#L0`%8xoxQddK(u-s#6}g?T7+)AoT-jynPx$FU&tN?hP4x|nT`sVLTi2K+EpyoDW z5*o(`5LGrIP=4wzq!9=@SSS+aMO5YIDmnyxkvVH$Sp62Vy@cBolbLmtcUcjqM)lQ)J!hbj#Lce82de>cpMJ zP;^kkMz7`CRdGAs_?wW$JUF)^oDeua2IYspDgU1`Qu|8TlJ!8_j2P9}x=Vvz>6x@d z%ZRd1XUeQ48dy@=zaN%(zfcVhXyPw_rJER(f>ECjyV6WnITYswP~xraJ7eurbD^t1 zrFrs`FxXvhG7!+o*pR5G^ep-^H9#o83V{tl4 z&_G%2Sv{@SbC+_2-$c9Y;t)37g}Gqh+w+Ag5Wex23QjlGC9#6|0J9aiooI7RpM?2X z_EZ>57(2m*QriL(Wn1QXviuhDYJdI1J^mmxN+6x#h)SyM9(n|DTrrI)YoUC?z)6QK zL1Z$Tut-#c9TG6ulMU1v}Y`STeKma5|dHZ185^kSIa(`LPVbw zV3E#qK^sIT#7-O%b(C|uQtd{eyoc`JK*x^SI51V|+2+E~n{u7HoDIc>O3=+=O zq|w)MlEzZ+IRVG+xEv(b%RkM^4G-=rO>o%^iMTd;<>7}*X#ew$ELkT`u;!Tw9r3@m zIaRF(bIN|kdAJvTrlCOt>25sLW*pZmzaEUd#)Rq6^83N@*|JDTM$|v)oT?1JnaBFA z(5P$22d|kE;P*EMTX7GaZx5~%V(K1YThGebDJeXwYpw7L-CbU5%RFMRl}?%5_eZa% zR)8JH8s;xvh^5JyaGsm2;C_JWR8Oeo&S?0{^`^B}Ma*^dXEw?Y@0gZjp?{+yMyP)A z>hx50zZd?mf%NQK^%koO^xv1(cGE1x)6=Bta~p=982{arLRo2Vt zYNL2}&Owe%@6@KzQe<);E>-knZ~a{toObq;6`_wI4H-dU`uFJ|Y(ICy%h^i#Q)KnUHYC{;qp>K0fH<6R)a1|*r%%XZ}39uq$B;ae<(w zThzaRpgcqsVnfZEAB+h^_>p_j`#*75P0K6vx|;(@gisQTkg#2iGJbeCWsi7%$odx=ja8Nv zfUS?5W~KXwO)AiS#PO%0KXsdzh(gLwMXROK&C69$h$y<-iQ<3ngwXgWl>oG(5`tr8 zDmcw-YUh4|H<(9d&RF`Xr%JEZK={{LlbF;0_E%Rv<}}bAjBPGqXvKgTx@D9soAU(a z6qy$>@XMitY`o#FYpZZn&06CT{R0uNa5P+{(vRUkKm9hJ9}NVg8WolJZ_3 zebW3L--vsAO^V`S8~Ap`iu-{4xgYA%dH{Jg!y#F3QwVjkW_!WeW4uvrLrGB4kcP?N zKvDhL^%*N`^1_F=txL<1lGSHu&l#_nz=@%cL0&RZ{Motls7fejo5IR^2-p zidU-yDGUY9UGVocF6?4zRmQJ+dd3f~AXieDA-SvkeycnZ>5hh8PKFQS{P6c5bbOx~ z#PMu(ytP!^V0Bp{7Nkdhis7*z6T?XqH5cnMRSnGiI(yU;@882Ik}}4E7xeQJI+R^` zR93K|J1+6$SH-Z{WMig%i{^bOsA1^v?EHl(!`34Q20%9r%xNLxX5(=W#oB8AwF9eXnd7=?cimBBM6aE3mn7o^Y5>9Cd*jD4I3HN|^ zjX8dw(c%XG=5Ywh3Z^hQ;@k&qI;1vV@4IdAAo;;573M}G7#GK+NZW($`~p|vbo+mM>K9Hfuryt;ilJ^G$FC1>VBtq75%o*IP!UUe|dLVmdC`Hk}f;W54FgQ10; zOr6ba1%kI`ovgUTXIO=3QNimL@&?dJL*et#hio8a^TFnk`v9YRm!Xo@DE4?i{Fcc$ z6#w?3@Q)s=UK<{joJ-c4E)DGKq*h11M08z@bc9~R0VXMtlkdakW)awg>!yi#Q`&CJ ztJm7z-*Oj`-(dAZ>-3Wb>Spd*%zU%qtGNi+WHddTtFh5#CgnCKWgU0$5Tb=E0dLs! zr}$4Mh=dK(XFyd?7WE>JF$ls=iwb3hc_oE9Z-K-$LTS7#GpU$v;1YxBj!fWh;MXM4 za@?OJh}vg<7wCuExk4F$QYO8_a3z6>UZmD7+>nIVZ>n{`>r|94-+Z7=6%Qf(!t5NG z$o~_gqcBzAy@9qUf#&_^ubI`2jE@r_XdslVx1CgUxWf-FL^P8H&UgPN-iTa?Q%)@o zy!$lzxAo%u87Xf)apJFYXVZ!j%h?u&J_@zNe@S1$A^i{W`5qqavXg@V+XG5{6~b#{ zENN@^9W#cx<$Tzu#*NdBNE_SW1Iv!UXDb+LK6}q1&)0aQALxSC z9)4s|tXin?XAG(jNHA>dHQBs+-b(PJyaN&%ablhF5S?6YHZtlXqsY&N5I1(!>dq$k z7Mm5lLxKnqn7U@c^dqK_8X>EYv5~L?Qd{5x$YC|CV%gPBFgZLVSQG*yOsuzRrZH&Nq;|85O>2#-RDF*Ed>v?=YPsa_)IDu&nKjY*Yy{@(4NB^!m!>QS|i4bZ-dLo$eEeS&~y~<++dzm0Bh`%9~0I4tSz*qDF*{p&?`>0>6e!r}U(s zE-fU$^(pm->}OzZ2;8Y@I#cd<{V~e@cbynjbd+5&6rUxorsd%W`>(2@3%tiPZ1W4 z>4y#Dmu{Bq8y`#|e;&mj2##s3&n#U^UV4+I75fq1f4yh&E?NnD5G5dCU_hw}uut&~ zJGRrFe$uk`_EGp=UR$8drA&wE+YosU9IzCF|zCv1+Gtd>nX3?nG2n|J+8!oeg}I`%d3=M%IeosB>##_OytqX zl3$5x1O6*SJeu1wb)EnGCj`U0sJHVopQ~=vpQl@FjTv>AZ4!QAy6wVj5q>ru#wr`7 zJ(QkEo4|N`=QD%)qZk{hW0t1*0_TdWfz@AqJnxj>O@8Y6Az{rr%rQ8K*CFzD^r_SRoL|n5Q64T%G3%XFuR*rvI&5&F?KVddr;OW{nzcsD!m@fLs>$D%Oo8n# zn9L7Qw*_rsh(A$;_>(vZ8#(P`rbI9cz$oMD8kEJddSDC2t_JI~OMU1QE7sCwMX*?AF&NVj$!| zuSA=@5zv<*gNAu9kdhBSiNM$p>w$)<7FUpxNAlz?^x;y_L9va|?>QV{;gN`<(bEdl zey+ybV=g2E<*CmaYHheSu`Q_T*X+ll`>zEkW9HW3g@X=^_&`(qy%56Zq*c-M5KWmb z&a1%p!$*mX!k-508wp5(mR{aRGiLBTlQ)$9Sq7BiYq7=qdyl4V#lPC!hoo=~jn_ux zZZ?W;GRSc2E&6=nq-OH1bW_ifd^EIhH>0G>uO5s#a;t%o#I*R=y^C@qXRY+ggl{MV z=iM|qUukFucs!!xfRu!*neHos#_x%An@2S;*JuMhiuqe#5c@XfWbvAryhanjSq8r& z&z~1AV`3&gJ83Tt$`ol`9;KzTK1!a0>DJ(RTP|{8fiqY)6qRgBpi~L~E{0ODVkVl@-SUpRRa3 zn=KQ(#z|)AEVu%;Cl{O^J#pe&aJm5cwf^W{esLif8kodk@<}>i00(wFc zbaffyOy;Jvoy?c5$54Nvj^}Y#Po!7i+Vh_zl#y_dXzcz2R#}D z#VcDW)t2HUVFSHLq_t|3&Dn_xVw*E05pnQZy!P~1I>(hK)&g-+9)Ty}PRJ9=N>BdV zQF@M^2a_M8pn~e7uhmCO7#x{xwBaROaa?fUJknM&rD9qL|eWW8B;To>2#Ppe+3% z+8a`LW3VdN7i(7!42(qO3f5Rq)wVg&o*UOE`aif28QOn-x}J!dNx15rA>KaGZ)e?e zDYl;> zrcs6UwpByYHaru(T1p9)1*H=b%f3(CVyd^E6gVC)RTm~DC(l&HuBP=CAR`7$Q+P@4 z4L{Y=AmRY)lcnDKKJ$Jk=1cK0a)zh#H+ptbM4$MW9oNPF^7)cO;fK0x0^;FT-}7799w>eaTr#K#2z3Q+{hsg>^h_Y=U__t-kVl zF~T>0nVxs?u6O0HUJ)y?!Ou}{BInIatysKK?Qb>gJJOf=zXc`U{;QL>5mG4n$?Q3y zuvcVDw*Pdu1&+pxcURPc?^M?KS3?yAdo=Hb4Tk<=@OE`c3yW3y9CsLlKGK5&;77w- zxM3+Z)ckhmG}4RQ9*FcJYRQhCV#cBd=yBi-0I;+y6C#&d#^pYD$vIG5R=_7)e$H{|y6GN(5w!ntYNtO6(>^Iox^dF8+})N6hFE_d3l=I^Or?4UJipaIU+;0WFp}zE z??BKs_c`oGjw@xIS*ni__I96pCg7eVy_ZczwGA&N_vqzdjlmuRPYNPSMRO-y+74q-egaXdOG_IYh1Zp)f9doIVfjTdiJqBmc=Fu}DDU>g$6v7ekM~RB z2Qw|5^SxJU17mNATv8G6TV)j!ueaiaxevb+5Z6D%=RLI(NOJ!fbzCsn!Z8d$G_YYh zvUAU=%aUHWox4U(Z5xT)YhT%uRtM~9zwuOh93V=o3hK)N!j*mrw-hIJ5e%A`X>KO< zsvVww#jJ^&*B%QulPtEqAq{LWhXCE2~3{skm#W%T?_``~_X6h*(XUh_`t! z=J!cMav$%*{4%$)!|+@z2#h-3u|}WFphBqp zmrk%ybT1OI8@inc!yV3jYX(CTN^K6|VE(d}pkQ%+7fQsTXQIu%+D?*Jy654$ybt1bK2NN#wI+tOxN7Kd`dwXWXdk;^*>s!! z>hz0eBL&NcD*H5Z90Rq{9s=ip?xG(|?b+qK-NPm)=FB5D3H|{SS}<}uI+z7%rj{=N zexD+ZvQqcUgxdk0nMow8e2kpwN{DyJZ1MC=zI83v4y|Cu!funxF0#ljY3M4<2U+B_ z!CNrc3ugG!Dc3%78Bsi^lpAGYsM=l3j8g0B3oX40s#dxZ3)k6v9Tb|DA!N@!%@{Mj zVLScwzZw9Jqzl-uS?<@9rfJi9^hZ`0t?{bFyY7iCU*}h9C>Y%#c)Z}IMn?}&eS@(- z_{&~cE+k}E35jGPIr?bhyA1{e)4P|MuPGy=qEw;27v6@YXS4Ax_FY#J8V;g-Uvxkc z-la_N;BYQr44n8Z26!M|JH}#uz;q@gQ<*SZeP3Db>jsdS{N@2%ta^y9uFSGoO6+Hg zKBi}_m4=-~)nPPFa#Q@gZ7QEFCwL3Q5~ey7B`oLVDfBTSc;W7Q+DtA`?LO9akVn-> z$v{2+ve&Sqol=b^A%(F*6P=JDHJWYuWIS$NiP@__)nX<7{4HW3WTSrSeQ{_zCWO$I z@>QBb+Pa69Fs z+6fcn364TPK_*}w%G9$S{DDAm5a^<7nt_m8`0?cU93Qa^P0jGJsdDZ-|m z9h(?(Zd3gz%~MFOO`S#1VxZSLTRNQ*tfP$r@~2;Ncoui79+f4xW__B6KS;4&ddO^Q zbDiztD0`o=)WLjSZFKvUIzjK@*WRwjj|wZnNc1psj2fplSIxw@`^N_cSbl!p4kR$@ysty0edEEC~mPeE5q)6C{MfNkP4#Nhg zt4+XJWy?(h;@!)sX?K=eNS=5Q`km|@Q3(k!dWL;!g_vz329JNeH=DbCRj>5h!pfS$ zF3_v~m%2o2ZwombF1I2inN>2KcoG_*d;S`EJZy-tIUO= zk1tM84Ahk?FVEa>wf5GX?0hdI2?B667l0-})ghHLC4m0P@HfCa? zRkY*wI-;b!G-jhz9j6`2x9kD2fSQm-sHwBo#quYedPq1WMgqyV!;d^f99Ngsw*0I; z(ilPZkPj0vy*tbme+XfAc<>`Cl%%(lln!$$fa;Rskr zGyaEn)9!Gb)}IEL#g|bS*`O2r6@t4K`2~KYwxv*e|J$hxW)5FC2(lZRb^xPVrITF8Ac*I3(eAMndS9O?>-G z-ZfiyAgecc<@HzKsrdPqoG%pu}ejPfwuNQOt6U-!5Fbz@r_un>=S+rbbzB1=0 z@r_;l5Eoh`(31$LZBSYneKs8E|I~fx&TM-rG%Mb0^>0x=;9EW+FRM1CAugI>(xx(W zh~4O48_Sqz>JOF-<`KQ>z4Ww)f%We8C5>RWAmG1XKmpNkSou@W!Js(gnh`FPvIbI~<963-$>8HOMz3o*^jEz>;*N^IcKwU( zH~{&yh#R+qKIQGwEXIPzPhN7t`H_HQ3WkWL3`}F#WnXvM4S7+BC%7cacMNf{5s7nX z!L1N^z%@~3zq8-P;3inubXkL1?p)J+`*pG!mawDFk2v8vm6!}C4IuhUao?zEvI5k3 zFW55iO}ac3LY<==cmFNKN!doV?ti3O@bW-B9_oO3S`a zx{h6%|Dg!QI&UY!30~^_@UgPT2as+z{TGN0SfV=&^;;@rg9yT0rc9-TFKkvv&IY16 z*T-loO~9d4f|{RGIjaE|Uq$zvMs@1-o0m&BB;rO5a#5M%o^!+X{x81@e$h&Jm6047 z_?4@J!h@zqn&wR?%GrAPmw6x6rh2lsSDB?HF!0RR&CsUv4vradx^WfnlvGnQXu#A}5k^Mwg2@U1=Nm5$^PmaWpP3#k5+x9PJG z*ocJ3zaz(p`50fXrcaGNReY781>s;`U=Bg^R@Fw>1M)FFJtELee@l~_EBK_U=>ynlkSDK5-?O}J9lO2`LUHHkqti7XxV3L9QPjd>y+(xK> zAB425(v|) zaEB20KGVsuf9z5oChZl0VFNERAts_|& z*x?9TjdFkpg3|n>a#7E14s60h)cL`9cG+wM7<_!tj`N~CM&bxi^-$JH{-ZvwTtOHG z5$4-;a7PK5d^~)N#KpnLp~y0_B=~9OAJ7)k>5LBQMd)#r>POEn_9d7PxlFd|a+hK9 z5pLf%xUKC!Zqw`(*WPW<2xgJza9ax~eRsa5ESM-svyl0>b73Ol2)4AEzv5(;|Eoyt zd%2cGjc+)o1BSGJ`!l`ne+zMf?C?-be@{}+uTs?d^|B^AFd0P3a~bFrM>Y>c=nu(| zvReCtE%2iTGFjOsR@laIQpxeX10}AerJ70l@&aD`ou%@K&6PaRqpvf-3W@joG1iOu zS)>w>y7iOHroU3UjhX6YWPDBK`vicC<*#_l=-V!gA1v~J0f%uE!<^C@nd6Txf0R1y z>HHFY?P9VKi>`MxA*Xz6+FXz+?R$$kGIo|(y;Y3*B*d8W=aI&=WT>ILvX1)DWHu1+ z;Y+)pmyc z0C*j9RQmv$Ah?4TK&tHkkSOAaS0bF;bIKYL7|H|@$H%8C8Z1kk6VZ97Dllp1C=}Rn zEB24W3p+>YK_6}75F`Ove)L`})M4F3{21WX5(+!D_E`Yu&3Y zUEgQbkY%jji5U7rI{gkOdUPZ;9&Tss0rM@|s}5bDSl_5T^1gXXPcDePMM1iFbT6Cl}z_1T8iYn%O_S`H#=--5&C}# zm45HYV(vV9Z2dg!Z!??8?mBmuj!`GAD5CoHQ$4w%DW{znU?nm?paLe)XDLu5=AZZl68<6R@()m>M@rZc?!5Y&WeOf{Emln$^1UoQ*hr&7=zSvs=Rr+;P+ElQpW0sBl65yY&d zQ_)tI#)Xr0@*5M+B=Er)1G0>Q0tb^3EvJ=~v@%Np&Ubx*Ylrx3ywLZ zkeTu%IRD!an&XpATC9iASNgion*DaJjB_ZH$QDH}&(6k=&a>AQq7QHS?TZ;Cw1x*& zK64|BAckvgND)}xH%qukBc`}TX2I%zC==cRR^7| zQZ(6Zlu_Xh0tO9)y{TAZOQ^YPRoCd7hnR?5&bW@`qlcHAD%@I5ie##A=EfNQC8s~N z^gs7dUA(&{6_c`=;*iR2d|uBu_}#}82UUn@ds;C;$;WKfc+$Ro&uC$EvdR06E?)OG zo&6bS!T9^o8Khvf=Q-WKehMF!uM)XD4!H{=T@Hi-&_Xp%2Bc38w)PiNv*IAu4GnVu z7QT~TTGvxNx0CW<@w3wtiIT#nPW<0VqPbe4B}YvpboxP=a__bw`2Ay$1{7`zBm(Zn|lhRaqNm0y+rRSBc78lgAd}6fz6%D z_OA|7p$I6slm4VdW94Qf6a`w|Lhqc`SYXfj!33leqVV^Zw#>EV9t++mRKXbf#p;go zOe8vk(V@GOuL2X==)u22s8I8OU90a8BL$U+NgB&xp%amA^t*#-^K;$fqfyM5@wn!@; z1X$e?;qSRU?BTHM`&M0a+Tr1d9>8i*um9ou|5*~rJ}~X)`}6$+pIgh`S%95-4QwA< zAB~>R^pf99ngjB@4+wcZLvrq_O+2cf23L*kQnE2Dy*ChTi8qUrESm9sG4LSe$pG)Q zKpmOeDzMI}Z6n*z+lJ1G`nlia8dhRj2%l%k0f)T1NyXH`hu};u{>z!)JLE+~mSpIk zU}SN{UXCV$-A0V&KYr468X3;sd=-270^QGv2)z8?y@ZKcl{xmxTaJ+9`+<+TlGSg} z#WBX|$vK|1FUnfLnX@}let0_}8E&(A_2bnmuBA2?TogVzq(HGItfJo)41K z!q{&n^FwdmGtA-D zM6R7VVD1c9;2#OD4WBX+b>h|Xya{(0zDcBqtv8;Um&6$CWSJhoc=AIHiR)5RMjk>* zD%K%ERAMI>w}#tBA8ry80fzqCR~PEF3;?YLNj zW?V~qBcQDpJMCu}tUYnv?6e-lX z5%%2I+P%K47t3=F`({|!L=0WUywP3km#P&jB5*>7T8`;?{HubID_|G1>dx-aBc$jT z784cG8m!%ejbGq@ezok~PoUTFkZC%`@)ynlxE}~;1MXfBMmUQTu27dI#!0*MVHP5F zq)jY3B)aG7x6YdlY;&)h_SlpA^_kdom2Y}hyiDlUs?g8+$^D~ceKd>LGkD#kEdGjj zp+@UxiM-C(+Cl9Q8Kx=sL6?i8Q@LW*uC9}eDT!SMwF%E~jWuMN(IAI;yaQgVC&(g% zs3oB=yPQPNJ&P-f*q17_=Db>QZ*d<2`+-?Z!R1kfgZlj&7hvk&foJ~dbq4@ih^MNn zP{i&SE^01>MBIz>0-z6$BoYDpMY!s^M=$;f!Vs22WGKor2^EGul^EbxyqkQEH;GlC zQ}Lez=p;4hMB|Ta6wra48v_a!Im2A9lzaF*KJRSRDQ;T;@RbDI=wK<`kojKp;O%FI)q9R1mA2MLsA>~` z);NX$9ld*B-8K>OY@ar+UZAlrFxz@|?ViVp%N@k9kw-^(tXZ$46s;TV$sEB^X15p% zlG;weRmris7~)fWM9+PD^J3h5JQbww^!CG zt{^}h-&zRIENId}+bIsExH!R9@x#n2`|zE$P~goQ`dPMTLsxOUbeVY)xZKzCFPu4z z@VKzobQKJ#7OA+^%6YR<_15UYc8cI79St9#;U%=+EGi*h60l$uK_fR1^?JEZ)N^g& z*r$~v^LzZEwvYAoZ(|1}+tUfSuknw^+=HyyF0!-FSk)$QS4KT1E`miV}URhyr6Liq?nTU8F5_iP7i7{>>eO5>) zi7PYvSQ0Asg~pRL;#z$Nfoz`fRAS=O)E&5PMZ>js^}?94Za%BH`2G?EF*83&gCBBp zLpF`IqnB4N>dSz6+>wQEYI69Gz*oaCknTyJxvjpdHv@~^O%TxjIOPB9s8YFk5C4u| zacgDybg5d8*y5;EPJd4-+9{cwY$;2sMsbOF1-O6oU{eUh5BK!vb7eV**sDULX&u&W zu(S7-ZLF!|q;F1(_s2zWD$ECAqE#e0Q}h>4_0Jf$qltVkUSDgoH*6Iaz0c7klzD5m zithknj9ynmn!Xsoq4Yqa$GUuC@WKRhZ(O9F^cP+P&tDF1wt5EvtW9#Zp*}J{*MI2F zF_h4#9?0EVv-32UAWt+N(zeM|*muq~zch1vWF}PIErK~!uB}h$prbxyu=Nh0MkJn| z{lyI6zbkLZh+CT24ZIzc^4O-Sdc%c3jU4O6ho^n>=g$8DeSg^Y)5Iz2N7m+ClrtR4 zVAM9oAQMVj$a{`S2fBN_Y=1uINl5!td_4C0ix@2Lj z@HI=m-J6qOd~-iIEi!GbQ&1^&Bw{JGYcSQ<8vl4im$zZr36S2cqPD~j?;1c$a3QjS zaFA;UYo_HD);&OE8K$3{jc|MA?~>&k8bJJYrFp6N{Z!Sf`$f!XIalMc+dKl2tDiS! zBv{5Z1M!=iT6ESrad#>naXK4!+Z!kxac1<>@dqz5`$)gP?0Hi@;<9GSz)L6jR)sa6 zuF-JeDE-cyi!V14-ppR;p`DU!Im4$mmp89RF%*EsNs<%lPrXuu1kLY1zzaufyv;;GpT~4M==Q~N2SRQCXD7*jju|)9YTaz3>kZd{ zb(LNWvH`#5z)-e}?ShhQ+;`@tTYoVC)QvT0hyx(%sDL|!GPX&&bzz-OL}Xbj>gYCo zV@K6K&C%eOk_j&FuMs;R&i_4@Q!qZtJ;qdhSsNEPya|qal@E_(#to-O- zse2DV2-W15J3j{=2Cbl89*QbVR1oe5Iz|p`0yhCA;w=-C8s`W|h|jnOyL@=m-_tqf zi_U_(DpkQpyt(nlO7=8RLGNr(RP3~Y5*cxNWjrzquF@mZszKEv@cjL3r zo@zMjf97xY3#?3vG}rQrRZ{g>#Lt4QH z2EFbCc2}P3cRY$4#CBBl&VLBT8%e!?f^?6YPa?9%xm}yM&7J$M@;%Cte!3WZl*nu` z7VmY~A@%{g((~L^rqwHhb-n$?Z|F3{h7JKfTZIgz}dZ(%@E0*LcOC`(Hw& zAV^FFwWvF%=c)o+%{18n!?zxJ>Iv$F=p9^`Z3fEMk#bR2?SBM2;L-h;heQMYD8as= zJ(0^J;qK9%7D`;QL2AAxM`>v*P4?y3%gRx6g}x|@DW=j2VL?zbI!v)b2w`I&o6zG1 zX>15%c|7y$BP46~m4PQD7goWXoTA{}Z>{$wmEGf$=UPyOUS>aA2R=Q=R$0DWp6>>) z*aMq+jjT(2FLpkhxd_JVH#ipy+S36#&|NQEW!%F)EU97MB{hiud>Z*I#@9hj`9{ZK z0o#SQxPHbGQC073IR%?~L81GjtP|7BUMcM{RTp=*f)6Mk(}zB_RGi}{jxxL) ztb0g1=nv<*Bec};a@q>p^T*i1-i_@pHhUnFT zK?e3dexIy@U-V@)=dHV{eKfpB2iGKGb{@+5Fpj#3Z=a|K&7O8L zD*o@-Sod82mGCz{RbnYExxEVr5wO1yriZ(nueBRa8)2e8OP&k&Uc z>I$m1o(o{7m@czHy>;K*? zioTc)2i*9p{oN17tX)VYmI)%TDz1JXUH}TKJfG-4=D_ec#y>Z+ z;k$JwaIhzX+we3Emi0r@SdHr>O*}Kr;@C)TPjg^_JL|fcg*l|1X?mm1u=y{dPP**# zz(=Xb_9voySDiD7+z0$JqF$X=q%{%tf#bQaJ@##yWGWJ9q3uDZoZbQPv3Qlrd?Zy6 zGMLf}5Ht3K&%5*TAg{Aknoe3?0a9rS_C0h?x`m_TopK^CB`!DQJkOSNV~Xcl=R{Y; zIl1&;W$Q~`yVIRh>3CJ&*8`hZRbMf1KD_ke;}0>0q?ThQ8D?>+zR^9yu3NXDMp}Xz z*;{u)o|)Oc)XUIRIH0=$bs{7R z7~lKXul?t+Tg1PZmKQNk*caJ$lp+q7Cfmn#dgq#J=e<5^^!duWh#bjGE1u6J_;%ZV1$K>8?+?DW^cMZtv@^YjzpI7-X zc#WqTe)XmS)iS$-1)VFL+fCN%+7h>FZtw<3cb9zO z=X=(K%k>Y-G5>Sm=div@?+d;6!gZ6I;`ul6dar@Nj4}v z9qmxO8Xt1(NpikXac)~{u5g&+JsnG) z9o3}d@SB636OGjm5S6PE@Ia7c@R#ngo!7oz2P)jQ?ce*DRT%$LlABvn8!+AQ@BVfl ztBE~dP{_w4?oz968p33J`QdPFj5n{_r6Rqnb z7P5f{0|X>b^ogGX?S42{1CQ|qh(l>{nV62Zrwyc&c`8^jTRuMAq539Q_)@oBt4u9)_n0%O>6^nP*-c!P7r2w{?l#0jl>Txp zG^Lq5J6)8h>Cx)-k>8z$p?7y&neJPH)!gE3Bh9{1k-^)HIyZe*e-!OZy*eWL;^OM` z$m-=WplZhIyT=}%v@k4x?+=MSJt-G2myV-M%v7r~4=nnUMKKejkQ}-I^Da|DHje>4 zFzluD2kCMzy(hTSJl1B0*Z9xKoO2 z2<}oGD!3OZPH=)1cWZGgP$(@D+}#~oB)EHU4f=84d(S!V{oXr9e(aGS8RN;?bFH>g`6@Lyz_~|n$YD^q_v>>>F(EW6h>;z*7{I87tH>_7XmwnuJi9v|TLKG>x zwsTCp&lL})kt4*x4BOoB4s195Q5c>#5-jMsi*+M_Z$8@4e>E@aJAgSAA6>$3d>L-~ zB`8w-m$>N^znx2wsXErFNSOQ+)6}hoP?#*OoOj=35Nn1Jr315zwN_r+!>l>e<%ez- z(_?*^LN(m3>SWUJlIkL2Y#qRq%2WzIG&ekE^2TSSS~Aks^906?rKBJ|GFV)=o`)$jAu>oQ^9+qy2&

sy73kyr05+UX7LR0=}2B(aB?Adz$bM2UMA{~D8 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 z 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

x!a(kwes_GeYcxSMrhh$h1FA1 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⋙p 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 h4BS9KO=$?c5BTt#OhJ4^-8cgk-R5 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%0Alx8&AJf6{CtYoK>2y%|31>{$owU2* z76~u>K8GtmT;a1*kSMMxs9ww6fA89JB`jc`a4eVN<^INdYfhHA$Kc@YT@dj5TZb!Y zJ5zEBd>4MwOQLmPxl16#}6o#ufnsz8UhhfhmXuOe%85@Z&BKC~)Q z9Tf@3JTssyuZg?-%hGfpJ#8fawC&0}zC|AO7|ypeH0r*_y!ab(pa?m`C0>{K@G+c= z+osy;c=JZEsmDB@2PHXp7AWqA1#T}Pj_d1k#>XuGUPuYP@>?gBP0)W6Dx#=2l&-Tm z#e1vHYeW7111-}q0XfB`%~J1*j2|c-sQ0^m=%dvSeA2i0HdB6m9!mOh$3<9B2KCO8 zx0o~vSq?;R>ITu7Rd$kEKXF&?H;rX-E2BP4+xnFY|DKZeIqd3k8YnGRLL(mr&@P(k z7KU@huiyC#AV#-UhloZM)#v38!47QU9CW?pYHqs?NKgM1L=zop!&pYPIF(rZM-b{jy?Z?N?nCGA8Y|eq8t=d4q0|t*~(K~DkrxPTAZ_^#z z=CCHPe}ulk{pywfVQ$=8Iey&s*Wzlf2xP*8#7I;(E-eG$deP(Cw}cVSyZrCH|7rhV zABU@F56t6)PMBCMh=JDa>p_xuD|QSYSj;IQ8Ol^dFk6^3m8a$iQXf|~>`bz2(-UL= zp|i>>ir@HXU^oo?|8pk1=Q1*hN9>2@Layg&O!q&g&YiczvtW^`8q@Bxykdz4Q5w_p zO}P4ng$Adx92PJ$-(L;bpcv>dR-r4!Okk5cyc5^(lROgZ=~Fo@`}Ce@08Br^J6bGc zKzsf{@4ov-0!SR2Y8!jUcCa6YhmNbjeG810VGih{xbUj5E@z@_wPaaTxk3xQ8}fFR zaPa@9TCJvcfAjWR@+|MID(PV#md%SP#}3j-DH=X{<|fA~UitS2}wF_0JjBneSpsh1)q z_7=4_42HBWG5P663JtB(ZI8W}&-8}27U+)L2&MiwOgH~3u=%gt6@Bk>(9c&~aexYw z9pd!ML|I{PgjDys*)F>~4R-=O=O9+T&@RBUK@n@QDs#{k+Sbdk7toP!itZY;V+Lf3^}@O&Sy~f&q7EpIcqE*ghy;oo5>ZQ z#hJVqgKD9uC7MFZMX_kTfA8nn+B!c=^AH>j-i3~aud*S3{4T2KP8av)NsLTeO*>ox zgif9i&E)SUfgo|-EyLq@q(SE zu}dLt%X|+v%-nR2N?PRjcefDTb0z6>$-xZA2miqNyZ zFiB^Bwsn+WvOryybe$?lc*P1G_&!$9e)`DNHI(QWBXgmupE5D(wiX4vlIKw{Iyoa=hk4|kQ=7}{dys8~#rrFLnzr+>HVxQqf3v~e_Aw%kzkUS#7M`Vs z0?&_AlT3;=y)_t@uLrDili;|HPEgIfWf7GrI(XCBGvP2UB`oT4Vn7k8#F1*r$TBGQ z<+p=1Zjk=E_mavmY?bs&w=}=S(eE}+{MKO}vct@4?zGr~`#KAPp7dH=03er(#SUgr zM|K**n(gGEi|4lA;eH+x{1V$P^cybRz=n^dD2E-!K<5j+K+z-5&h7r;DRspI(wVsCYlt;L6t3ZX)|=KA3U*SF=BZ3Ec27`o|KelauCO;35I^ zf36a=*ie``^_*AZiEI;(q*4G}o+3#OCOA4l>+zJf44&ph&&KG?C{uo@Hhb-jh^5Ix z3oAltn603~@&ev*rsp&iK+68c3t=RmQ(IsBhQY4qEb)X*3%Z2rp9ypIB|cGA_~}BX z2d!&GkJ(O2>~8ge_&T|zW4J5LeqArZv1A4RWqo}?R#k4m)oRU(@8uSYGD+S^^X`;c zN!Fugd+R?851$JT{3|fZr;7J3RmT|EfurB%ag3HsB3Ad%=fq@#mKXf~X5!ONHlUyz zNhS}v)1723NnJ_BuD3%c&yN%b&a;VB@4?83@Qpy~prcaE*y?0d+sP19jkUjZ*S+8? zW+%K4Bn@A;-M80Rh&R=FZrJHZkzlD9h}^%`zDjCCv`q(vfZ>E0&S^Vc*Fou{_OP|| z&~UH2Zf4VmaYq>@JOYtl(TNzdqa9dTUM6dGGoRLd?CbXX3wy5Yt;i#f4$b@Z3#qmj zbJLzm|&J3 zow+sqQf=WUk^Rku zjaz$N1Ofdq%XQ6C@Wrx<)={EhIJcUQU?p!a7?m3ZsI=jMQQ6^Jk-M(#n9?vEXo`YU>eC3c1oL{5GX zfuLq(%zYdC_FvCmorWmBSPVQNN`8G2*MM6xVDZVfiol&W1`2Y1Xjugk6G2p$PU-Pe{VWpai{A-6( z(Ba!6%~)4I8}*mGu{a-ThHh9CDWp&(0ktiBB9DA9OnMbA8fiR(t8F9I2KQ)89_%lO zv2N6<`Xj(=H`GFCeX@w{?6i7g4*v$ww>{vBMz0M4^~NYKA#B__u1A&Xfh1Ffu-ihk ziJi#`0=IQI)yFM(FHJ^-aI`!59G|_tdsOD_vdOpuiD3e`RP;oX77p(fruR{~g&*JK z$F0VAEx=yNqZZBEe&d8srxAGVYPyTe5 z=Tk|>bzMK+j^{CGAMuo%fm}>pBz3mghTNZ@7(uUxYy^ux{#XOpT59wS zchmT6(*KOWXc^PwR{lI-NkH7*>vuHWZ*oxw^%hm&O*^&I^1v)u*SHyOgPj)o-y~sL z%K4ZSVqys-NYm~Io6rg)@s#TE%z9gw*Vb`m%8@91^rVbC%LR=~7c+K5qcgdmhtpv+ z+{K*LracHJf7UR>+n}kg^ZpdV*_N$aQ;GKV)v~QiHhMZB?2)cfu?<5K{r#!k-wsMs z(eGeFQlu!IfC#7{MWi7aCoN)xG}N=fJm zNC~||=q*5~2_ys_e&>08&R=j|&di=SbIrc?-uL?4Yh`YKkNa}EPDJ`?dD`#IfFrCk zXA@$-ZFYmoeXELtTlKBwB9&7*uBm8|1hb5BQ*ys(h6t`__R zOi(?prhzPD^EI5!>G3wIE~-{}_E=CS-luvN zh4lcuMzX=q3UQ;{Z9x%oyL$#NZ~`2reUm4#-wr!}r|{oc*jv*fuDW` zQtB?LEnLo5Rgr-jHxe@kBt545?W321f;|kRrpD0RAEJk*fM+ODn!f&6R{`~6@YKf) z`1d#&qE4)%YM#g29=y(ACo1qpn|wZ90bbGBRO zA!KU-q}faS5*G8&5x}W!&ex@- z1~>28OQX($g%4oaKii?Jg>iwPZOZM_pwU7*ef9Z<)hR-xsO8u;?^zx=E)(Xn9obUY zONvqD!}pztAZfgAPIpn@x250B$fFqoCR^m^cIy)iQgILMELQN z*$B4XI6%ZKjWj#+oTE*Xdz>V&=t%x0n((vXb>DrC(w+>-{&|Ls#srv#D!21W~S$WgnR1PrKR_~GjMPD9HIH`7N6gP_`19Qyu>H3|i7=ga)r z*on-#l59tD>-emGZKfB961k(JyJ=Y88Lo(`-Os6kNPgxr zEiKO<87r(!%3=%NCJWp3uRMq|HK9ZGjt#(&yQZj!{ryiIQKTt;EExJke4YKf`530F z$xhFADjYRG9v(!Qm+?@1&hZK~l*uQG=0{QaHAeQ}@}Ht*E-i|>M5dDIo#CU&Wg)%)AZh$PoxmZUf50WQwqKz>Ek9Tw%30)2W8YmbRqoxE3KMbhd}O~-JrQOI zdIsIdBR8+{i=TyEaCqT^uLq1@XP`AGHNQFC{%&aHb!e4yt+6U-^Se`L7Ly$<=cyc? z+UAaZcDG663$w198LAgs@4E*75y&KTc74YF16!n=Zw=#i=03$;sv~F#R=ngk8pATl zGnEf}em=>mE;noz8}d(V8YU#ZZVbveMfUYBCVjP-!PvVMd&UtTBbNjMDdQBpyWLpb zspzH>CiXCc73mIn(?1$axKX=zjUZVh=mU;rJ=rSa3UcwtilIK8A6>O6@cQPE6?1I7 z`ak&Q2gWSOS8+w@|0$z<;?qAKnMlR^{I8PJ3p}Cq~GAi-D$@xj~_UMiF&oNf+GXrCf?K57tERj`DGSeA0(QV++E+tj|>O8 z;h_}>GPiTeYz>@My>2ahX3ok3%gy540)i{qFLT59vhCLz>u$6)J-a!3Z>&*8nSPWn zi7-RW=5&L>L}?!o^#(tRP6vF(g2wXkqAmAJX*Nr)hw!jikMhUuHnvCS02%lG4CAT( zMs(uHs5ADBHAe>sKU>tOAjJRC=>KdiD02Z1})u(|3Ripq^im%6D&Q0%+O+dnV zxP~4c^lrO{5A@zjUr3euQzda&8tT!Iowb4nm-ihcecscok#0Fnp*Ar+9-I9t&1pQd z|Hq6NY-4Zm>ZjA35-~gliY93~PW|1_u0<>5YaQzw%ps0WlK42yL4(jE+H=s+>l%p! zY^~+K{uJAkNb#B0R}tR<(8%`aOAZ{QBmFORX1%3aNb&(^2)5943u=;~MiKMr%)#q( zhT}?JwHVkId}s?FG-O=|p3POd+0VW6Dvw}_p%ixX(w_UyEnuqwLRHic=J0%r+2>y3 zHQS5)WRgFw@S55NCHfOQrM=@x_GdOPKq>`Vx0$+#RTvychncDuAT0MCCKpov>=j2d zkY_{q&3AvSl+zS&b9nenAm)JDz6fh+id0i3?W)&$IK+e>ZhMp-))d(h+Q%-fuwd7SqSmzIcB30;siN4L2x|vn-&~pP4FjAqZ+yv^%8kW^UCN z=oayY_AnOgK3CH;&rUuC4!-`)os2SfEwR7C4a2KlQ}&P7P4|zpk_fT?IsU9WOReHO z_&`{Hx2-!dp4P2@So;kEo>`UsTQA+9q(HyPIfKHVJq7%USs~9k7AFKou}zUMh_$VzpoUfcB-ABB7Iq%o*V_+*mRXx>Mb^Mf%M>xBE)iLHsn(s_ zKNnKQ)IA-WTFYaB-#kXj$WCQ5<^*!-&GOFb-8b3$X0zKMs zce^d>DKkVy3z|Q=!3oxqfoVVj3zjaZ+&CdHoQ<=Sx1&bIuQ#Yzh=+}hR{>v*Xv_=`U5Wq!v_s+Pw3|q*xq+1~p6UEq?-xE5On$$7Q&?%VTpoIKG5 zt-ipL#G)KT_uJ4%*h2txo!jd_Eq*1-_$X1{g&RYijfIo9j+;Z{3ePUQI&P5ex$cjz z8oE94Ku=cWXky`k03XXE+DGCJ|Zx^^J_D**u@l{)PEW2@u#Nx4|xo-^P~BE#b}hu`R(9rx=;+bB{87#@f;Y88va2QBdT5EY z^vF+&HjhFsTs_XzTKCGy-sxzu|H~Ih%C)l_jV?Aj|LKHv*S{6-y2foV@XB^)FF6JJ z42b_4ZN8+u^l@W1Yj!`Q0o)awKcSJMlCyjsqXKW(Uh1(5moW}-YHf4C>27~dH=UXL z6wtSkwt5<38t5$3{P9(Ag;M$V%Ri@HfuYw@)ITEFfD7lQ7$lZ3m!0zW4r72ZOcLzF zf;O8_{i;-zA39ui{!a=>Jo>ODBwfeZ+f9TP6El3QJ@_vA8KG&VJ=I_wTK?CNk@%t!KI~>mRD<>9%8p42PukEVPc?g<=b8azd=Vv&n)?g|){A zY2t7hor1&NY-U!dO#!WYjT&dawgodI57Sgs4=TgLHFh^st9JsicYAZp1=>t!G8};P zqGwkVI)D4_UsCew5!xsq64?-mFR^ZmqMBNS%;}cn;-5sv){4`kf7G!u&6qlfn7`h= zTxwAq=7Mf;AZ>$gdyYYvvPiH1crs{R7yvjlQ9i02U5q$AqKq(1x3E1tz@EQ1#~O6u zmlitc@S@TY%|Rk3gzdMevJ=0k@0ajm<^AY6Ta8Wy*-RObNtV7qiBskn6 zh1$so$kkHFEbo(NFZY zMu&6K>E5H9Y-n&J#mhKcKlAZjWge5Ky44-k>a~3S`#JQIYmauz(A6x?RmN!;IEc>? z@v=q9gHi-q8aD@!qE*JDyFRIki<54|t*D0c6Swp|IT8rkW{`U@N`KH7+*&pg?uMTh zE-kHnZ!URTQI(BhKU?I*SK}?V()S^Tg5J{G$HddR*trEAiuSOr&PEtMvWPNnXd*Cb z;r`5*1Hd`|E-oDiZy0Mg)cpHTKxl9CidiRpfK1gT;ONokz#Ffm#|xxe_acIP_`|6I z0o9HpLWgOt8YE@sDCtrs67Ah);D~|W_H{Fmm)qykVN2Jh>i+C!h-Xw`1#KCxnRHot z2k>5gT(tpe0bxbGV5j%VYHZceS#tgF?7u?v`>57Te&xQGl32asHNvv$sL6k8w=|cz zu0Oq=aXI?-j!-`=>AlMbciOeFE}NWXiWl3@e^H-QLAu=c(WNwCN?>>Z;gy{Q(2X?( z`f<*TGhl0-B<_oek@MLCM15w!`Nh%&|3s6Irb8D~W6EBVB>jGLcr-OIOMe4@Il)9U z!j^^l$E%q=eZ3VGFVV4XEM?CQ81n2$4PG@mg2(yKWTrZOGls=XZ`z4k)dQ*?NN31w zK)zC!V!36tTQKm2)JHW}+CFinI}KG?ddfHPIA0QHb~9L-(I0!1x^__fM$iT-Ch6|$ zAl#Wi76`bTIXdE-a_N}6oBV*lz|at+X{5mcye4(XD6V`=7dK3Qhq@*BRxp*{;<gHdrun z$jH?(IqdGtQfBX|Yg=DpRtOpk`PNeA(N%ocwz0JmE$fYcYO+&DmR%upRV01Wx}jkD zEq=R>MMB*ZilJ3xQgkI;)j)0`cfCZmf?C&H-Gf~|y%%(PD)T(!^fcsXjXyvG;I~TS zQv=32NZEpxRs3Sj_fw7YW3RK`G<4=b4ELTssCT*Knnh+zKw=8?un!bEA;2tJzId`x zDalwUyIsk=RMRwlj17^69EZp7yVpCc&N?>LNeoguLcHxGlV;Z;1L^AhX0pS{ff2bX z=f2a-Mv?6qaP9nr#)Ki)YiOhAp2K?#MZ1p;dLog#RYIMaGNcpY_iF#6cQmu9!?iW& z0|uuT!NO4;Gk{kpj}c8@0~~KSDoJK(r_k6pVoX8LRCTQuTin+OikUT}y&fW`ZyWmL zsX`UG&-eEE>v<%DJ8;QFnW`AMQ1`~2DVeVDz1;k5V>hvkm2@+i3FTMRVGt>Dl9Jte z-Z$bfxUTUBcTj?agy8qfo3#F-MM0T!2ku&4B)bFZLbJ z6|n}S?K|cUfcomn7PS=*J{;eM8I^QieT*;CErj3B5=&dC;I|6{_Dsr)|99e~Avrb> za=A{zrA*YrNFz#vv&7Xq-kB6cI0~IC-m;Lob?{%%b3Vr>^!UFNZSG?2-8^b2?j+li zZ|VKTgOe_A1%m{cc`gUU*(QXb2WOK;DG2P##2{~#BJJ0NY?yFnn$xwf;#&|=q zx0?EBt60vfo?edqC$Z?zbQbK#4|?*qvPL7|98I{hhz}CX#tyShl-N9ITW(BO(>&j{ zU-@`L`5Dk{d*@7%iu){-cOwC7ajt(0ZeO9Gf8!s= z31AcM_zm1--N}1rFSqyyf&Iv=>DycPc{-;Td-fv%TI=vNhS{bYi)n`$;i^&!Enp44 zO7;YKa$8ETeo{wU=|Cwi(uInD%6ZUPGC*|5}!WUz=LFRB~=fqZhtK zfOE2+JV5eC=~nyY>2upSkqlDChc*5@nOjNkom3V9*q0PJ+$YiHM8l*vBBs6@Gr7~qpzAKYpI~@Tz)ql`T!365 z!b*;Xv)rbH&~=02bWYz zz!!*1&QijuxgLBVikfRRV1+LZBxSE29-zF>pTwvcpBoxCxJB-ac`dM80BF`c)XPRx zT148Zv=3MN1ap?*+(`Xsv3=So*{)BRQT|COfGWa+Bf!c97uV|i?8~3CU;w@s`xr}k z_b`TArT-?c`^{tO|HnmTt=`F_d2bZbp-6Di2J@Z00h3&SDB6v#<3ey>Ip0Jo9L)2rLt>K#;UCa9 z);7nbA49kP?56KGibD{{XkT|-E6cJ0N?kA->{$#K?~aoT&|D+4cs9#Lzgj)klibre z4aol{(6e*}Z;Qe-mByz0eS@o%ttYF+4!7fOTdrRs?w+hQ?lIHe0cZ^#yR?AWFvBhJ zKF{c5R5yIP)x&-yD%BG_v z-J5z&9oY`QPYTGMo_U@GJ|}Aj4au3PjLK+?w)bj7#4y(%;(#qzEEuSZ1Y?jyzM0HW zQhzmB=5ap$2i$Z`MXY9{o#T;?!oYX+yjxkL57J8;R{nxKUOSvUJ6Tr$2vo<`gVLw( z`g8p;zxDyWR70+-*D#MeO%L#lN7d9ZN|C;$uA&z;e&Sm$`g$h~&{(-_Zj)>yKT&3h z6P^|w(Y>JHl&|o&E0@KC$Rd!?8T(7Cn<@Ju9x>JuWm8Qk(@bbUuZHUC^`DCsj!qkz z^Y{D?=<@sa0$u<8@nxX_?U;0Q6S_bHHvf0Di2% z@7Lanj}8~9lX4Ln=iX5;$Zyz(KuJ($>f*BT;5%CmHGSjEv)@WA3v-!1&baaS*v&>& zadbx1#|=K&dnQJUUnn1|;o?n4q!(V8Fm#&>^!34?CnxZ-`DjvhJfp85jJcCjv+nim zU%1vsQ7M}`j1szk_$f4IhH9Hux-^$=a*nzXhUsHQzrth4b{ zrg@*27lAxuW})k;mJEAH*VV5$)Sz$Rt5It_EJs#|#sPCOkkMIC!@#!lA67Dsq<{-% zI|QW0ri7l2vXKTss5Ar|{Pxc!ug~w!60P1lAxC;3(i`z4||Ml zcYec)e{{}@*7t0ySAeSD|JC$epgJieFMJ^Uy0KWuX;odj83S47m#MU^jAgq$*jcv1 z3BpOv+`ml_#Fc{IE8$_cmkFl18tRCoY0e1(i5|6}VmVsE_WQ|IFP0DAMe-wGCJuah zhaP<#fJxzn2q0b!%EB|$=L!E%-+9cC;NEI95%kZ@ZyM0XmI5<@W!l2dj$Sp)O2F`w z%1q2>k;^Opk>J^^vzrN93QDBj!gB^nMKz|EIDb*`=ZJD|hem+V@{}v*Ipi4ved2#| zteF>p>|g-CDYQ6I$d4txA+AYiIit=d^qZqc6p-H|)&oat`g@qm#_Plj%mf9fJS?g0 z+ZzA<*P3S6xL|qnLY3k+70w9i3)_#Hzc4-sbbBlmD1FUislAP+MCG*cv?(IJpq8I6 z{E$0!eaGJ}_slt)icGzb+cwc0)qW7@<8ON)YC_4bB9Hj;)51-;jcqq02;Ujj&km28 z#HLSdnVKw^qUz<+Z_em+$HoAil`XHknJC+Px161CB3*su+LTJ2!tYgvY&6D05-hvI zQSVD9&VciihZ7$-`Q~*8&)LQYK^yB-O5^yQBn87@Jb$((=-Oq@TQ zW2L~KckcNDhxaY+tz0H@pg;=3RUNumdzkv!}J7BkCF zjMO2V@9dGF#Q-3tOzBZ21#Ge;WxR3mlGo1=8Jn&YB{T4<`r+Mt!fiUme{!7s{9!(d zGyD&X|8smAs7rT0hz0vIGz9+QG2@rK>YQu&@AK)!+_}CGE+*4#fP7}6zW!Gt3`w1v zu#M+JTI2Nw=8|I%wLdzjQLFAdv|i&he46X3+dE^(C^amcA#hYq{~>~hGXu<3N;WbG z>SBFKd?%H~Ur#DLZeGZLJ2Kk4% z9K=g#2zNjA*SN68aVq7n~y(<7I+n$&cskS+1;&oR`~tdMRfqHcC4E_gZW<$nTz zzfO-mas^sB@CrKmT0x?Zx=WvPpUGf53#9cCEGyQ*iap6F~x6%$BU1@05PY}xI=Jn&pOejK>Mg*K7pl~pI-aD7Ti963AM_^8h zaB8tzg#Srs{pVU)=KrOT8SDcePPxiHICHQE1Sq*;0_}}Ita0)4*5zysC?89?$;uacM@+3R3y4CQmR-~qk}%ArW>gJ9tVX1b}%=NJAMOJ_TgWp;X*rx z`-yPMMPZynnpc)`sxdR1v=6@KwUZfk7w4>ZBl`s{_1960;jFNmmQ>vAaV!G_vERvE zXazk@C`HgPTHoL%aGF5D1&UO(H9{mr%vi0cx|DD{0QsSTejV~%n!U>cD(tH(a&&XT zX`Amg<2&8-^C&V-&0$x|P8_Dv^%+^7#~OFPPFqDZxzGOB)KRGkX&+i|X<{+04&so= zO0zVo;lyhEC#q_eqMx1AA<8NhDN-}c8nSs^U`$qcU}T!&q^4KW?8l;@-!$GSyV?** z%A9$EXP4)bIEu(j65nJviarcYCXeqO*zG;n-SK%k9PuxsGS9lXJ6oIqCWhGc$n=!| zg8-(eItO2lh_T;69`S=ze#yAs(+Dp3$Z9zDG`Cu3;K{e+yx9?;GrfWS#fG5LqUH8^ zJ1=|Tc+P8$)7XdB9u%gqQJVB;d6ueofnZII!_aJ@Dc;I(j_#V(T=J+>E;bbKgTL+E zLKr>AqX0hnI#bsR`C$L7kC1s~U=fxyUzgnHf%f3~>E*^c5qw+jG9gGJ(yov5@Jk$E zb;DW=vE%(Jvvxt}vJ04O^)QYqICtu}RR~&}%XtpGDh^V-LGtO0JV2?#lCEbmri&4C6n@UmzekKG&4H& zkN)m0oU1Zd=PsVN=a6G|Zy}CJQFav5vd9>ohza{Dzp{P@&nj{H9?nR{Y#%&PqGv}( zKySYE9&w4B*cj&byq@we)8LKoNgM#|u3Q2{AcH zKE=?k>0OhVD0X*bOz$mJ0yHN<^%Cx?6}i|I_^3CVQ|F&M+_}+XjMcS7bWKGD68q(7 zdUZTn{^6(y>#u}+&A%|rIPVz6$H9~@sN}cM$DH>biqUzVq&>54@zxNJiii)h}bbh4R`xu04N!vccBMx*NWl272Tr2epiDf)8Etmt<8 zntu-7Xw!&3IPuBMpjJ!=;v)TOY-EQtfhtxcW7*gr8F!#Z?o?bX!e4(aL0BAuiKo3R z8L|YUc@cjT5HJtq1J|^pswzZAFtF>Ix)0Bc)*=IccXfDgB(+-XC_eM_9~G}TWNy>N z+13%))L(@RnD=~7T%s}0E}6txzb@-jgXGg6sUKU1+oQ+}uf1iGVm@|Os*u#J#AgDt zzr~E7mi-qsO@5oRc=%ex{e!g*M22HKdW~IP65IL35)%uUUb4FDdRLACulyfI-H9_r zJ``~OiMl^gU0=U+(^|%T9+{j@?t)<+ojCDogT0Y&PZB%`^z_fSd7Bs6R${v-iAbf1 zl$PI`nIm8bLfb8}VBJgRefQ;C#R<8p?UJ^pyLrBID7~q)x7$=Z#Ss-nJjLtYbxCw; zLB-&+%-{6Mlg`_zNQ>EKlKX)suE>?mmS?MkM>v9Q!^qb%PiBa2D^G(%ni?Wa+fY6P zDwi%v1Qv*$#oSTk0|DW(d^Uk!;$P=TlBGhr>;rx;!{uQFGS5@NjK6T=JBQRxZmN~g zOpE88JUSORWQhUr=br7V!l4RHTYbMGF%mw{M|-$(3S;guG)|;;9B?RrTRtM-CgtFK z%cyvc??f@^ym=_Q1RQTWgw4+1t|WHUJ^`1%pFd6LiCt%LD}pRyxEBwc)<)}+4ouwz zL^s!CHj~_PJ^%P`{7_J}Cu;!FIT+yVR0o#}&?Srdtzg9w8v(N4QW(1y+`7x!9UF+N zL%wp~H22#HT;X{`tY-`6dOR-yNLXY_hwxi!MP@aA7iI3U;eP=h?MR*m^&I@ueA{n7 zcHNR*Bjd;Qvrx0U(;4*JnZJEDAH6ksW+8FeBjOfk=Qv|Hi~iz{PiP1jP>S@r&t*$`jD&lWKny9Pbkr;;j00=o8r)DZa?R%wOFa|qbpOY_o|NJQrVE~6!u&g)#;xDPp? zPtIoTZyAfI-CLSF5TW#4OS8x(9_M;ZAxN`FIKb-u+MWUC6In~f5!Q1;D&uSXuqk^NO64NE3 zt9ZaD_Y6;=M?g%SG(FHdz2eOt)6UZcQ2_thoUa!PNE4c3gXH~lM2)KR|2sE zXZJZ^hMB?@(kruV_XsDLf}+EK`Ne<5YDW#(HWDl{Y2@X^_jM+x;{q%!KC*bj<~x4x zS!*I7$-2G$iK;;!@Sb%jPSAm zXm&wV3hY8t8zUgspQv43l*w*SCT=bs&7P*i-q#xAJXiBDwKV(UgR$5;=rsb|qX_Tz zvA5BWR0gfZp4ZW^`qA`*Z=hZ9ykHV42oGxD=3t9loi&J!iBV9U>q;2KHZMIH0lZzP zC#|=QzhUzZ4j4TqaX35F?;U5+@Q3TO32hk2CU)rxeT|JC?RU~*mTFZ#ZN{sxzBkY7 zZ=9`YiDNNzc;#sqKY*lG{|qR#jSYIl@oV?g{Ymy1xt-2Io44aUnF$&fBx2D^QIR?P zQB#N2B)cwLyP{&oMLrlx)Mm5mO?MsZSE4Dgelya1NB9LM7h2{K89k^a$TxVW&!vc_ z(@^~HA`XYc*%uDMt)c0ryG3M;Bx4J@hHY1}oMqbbpK408eE>i}vx>;x5kun)9-|#k z3%(CZ9ROOcNPW?3lP5&P-=8|xF?ASg+E4mA##hu<*Fbje%8I)+L}(v^g)*H^(~XwA zK7?*{CY=4}8l*oRAghA5LT$^%)TxA42AF$%H}2WA!Yu@uqS|>!>qtCs?8C-eKgJ5< z_OtQuC;?HoBRfQJc^vh~amMLrRwA?brUYqaYCOJnwKEdw?OZEk8S3w3w1>tEGCw%l zl=t${5@=Z2c`1l8bxKo4PJQ$Fr6wPzMjV}F|9Ca*#%V~q#TJq{X}QI+nk+!ncoFz+ z1e3EA0~y<1dux?B`h&cas9_xUT}aa>)KBC7S+vBJLH7;1_sqZ6sXRmg+G2dAO5amF z`?a`y&|UrK({{x0>Azd=yjpMuv=e~Zl&>Y`1GE`W5uw=R9dzF?Gtm+ z<7&1?55ecno`JK}r9HE+hbP>68VWy}8DHeQZ#MrVsDA&!g)0XCDd!>+0G=ubE9F(v zipPdy<~;7VRvmk;0IUiD97(zMi=0|g2|4V=$RsuZ6jdy7X(;rXRSN&ywfaLKi!q=7 z=s*9J-jQeHkK2}vvlPaLFDdWdxhd&cKwk*da~h|tw(Yv7i+!C4w*ViUIKU1J)JHl} zS*3inM~uZ)#)}0p*Qgd5{Bdtde_*=yKNK~;nhB7mm4e*33J)u;7qWsD-7Y>~R5?t% zhgP=TWM>QSi_vKHT)5ng(l*vD4Rz0ux7ZmBFEl*8m%Wk?l2L2~Yrr71xgu5lKq?ZduXTGKoqD9_U2i8@gb(%gG>d z?e`7XSqT(LXeDzk)PY_335-qARNg(}r{DLVSx`&&4_G8k)}726>#*PxivUuF!qFEVVR*doR@2FoDIIO!SKl21l-|H=8J|8;Ut3MiSK^`H+(|6>)>f|LGAr=g`3(R?6! zIRz5-aKV+E_g9oDp?7-sQ-~)cq>;-I#G=kdQoG=E`6BbL!~N)oM-_Z^2vmXIHHGfV z;yr}x)3MgSmds5QK#_HkfXkTpnW;x*tZ8NoB&L6>DgTC<`HQavY!*|?9dqT+&_8E4+rig zU*1$w0GFl%E02dK>OgidVn&2Q-~r7ckDq^-M82TDAA;BP%RCR%dy1!(OF)0LPL;`W62TafkDob>OifC?+;~cAyyM zoUU?vzDaJ~3so|$iN6rI5z38Rb_3V7IeZj!A|#s5&dQJqyui>$SgU*kcCS+V9Smip?E4&_yR@k;p)#k z$kBzCXMF&>B@KNNy<$*R1$ybIJc03SR)Y5NyVl*oOToYIFr0mMmMzY$2GZHc5PyTe zoCi8&7)uND`Xd%?v=(nGE~>Jj@^7?=mo5!XDk+() z{(YLc(6(N8GgpJ833ba=Nbj*}3-V`$5ZiB24vN}iSrQ*Me;F6*o_#G#)#M>-JrMTx zFvxF*joRgCho*Daw6{$QaEv^2xK{leaqw+IHutWi?7>jFiqNe=-`S6B$28lr6N|}5 zMw|fILLIlf6wq}|kTb>0)J9rr>g{DwB2yvUox>gUCVJovn+^Y%ed=qq7L~Zt9C5wG z>0hH)KJmPU;qAyvzT_w}6I~DOme+Wgs$o_&=$;1QYlJ-cC6u?PJt}6|oN%xo7(0|I z^jwNTUFC`rhSa;U>EYC?iFGB!2|=7<1bKRJ5RRf%!C(kZ)P*N@(l7cMDE2a%5LYTU zdfNNMy)RtT)5Fcz8#l3PH0k1|zuD5Ff2qs<7M@bA2y+7+rZ=dCyfvWD6F&4wc+KUY=KeN2 zIY=mN2HGo-?VrrbI)%pso3NQXU>cIYspoAdyMq`Biu5U8qcpicccbU)l)FA`s6&wY zdYLGvZPkl86q5XPb>KVaC@;ECEXa17lM7mqjYp;;;F>+bj2=$;vSU&Dd*1X(62SeC z=%R#|@P=jPE*Rt>Q18JO?_z%JEng1BmURj8jdNaXi=8@>d3%FFe@-mB{gMm5TbTMl zX?S{qv(l^?->+k_@2tT$>_F+mbr0X9ab<1j45MH00t2Ucc_s>?Q$9#>leYzZ6n-sE zhw+{1eOXWls_XU_>{;-0NC?9U9W`B2BZte$zbshIOdmg66KjgHpc!(u4GΞ5WoD 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®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𝔊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

?tUXhVYw$jsLS?>- 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≺J7n~pb>8&};v zfS*!Dpo^~UI)dTRk~W}M!gtYYU{*k%L?4`olWCk!S!42If1s&I$~gBqO=|WpXO6U@ zp1o74bi@5n&Kro^ylg^w_gQaZbY-Z!VT@W_axAcU{Qm95Uw$}ZIz3iPL%g|>CMFZN zJb>P@12#lce}!65EA673cGgX%8lI(!MkH~hP*P8}#Sh!B?Ny|K<4#$Xdv>@;`DnU4 zr~DzRPX!Qx!jY>i7J4q+h;Ys4D*9|=qI-9$c2a*;F!nPL6@TR3y=2eeV&KqxB%%Vc%(KLzrLpEVep@A*ARf%!;~~!jGr=ACTwBNFJd4zyvy~ z`&XB+u+AZ;D0$DFN7m~WFnNSW*WIlIC8!SE<+?X6+CD)|oTifX^CMNGerT*t5(01o&QV zT-v0e?*3~$`j@l=E(g^mFR7vKoFF)lm%YNC7J0~H;5X27PKh;X52<8w|C=j&Hm|L* zJAw0qJ6nXvc^BI)^LGN;oR_0)q>Bj57f-MsOsAOYqFQOHZ{rP(h+xd%ZRw(MSg15V zq35#U45%1@K4p=Q>g`5u6R(6`$Tyx)0{v$exZm_goOW4*pZHB^GU+99CGN6dCO8HW z_22E9`vW~8Ly7MCZO79mEfS%l@omc(iivWAiJ45$m@B)}tT2j|DZKsDmmF@T1}-D- z+b-qC-UA=G4z*86rci#&n(skC%B$av8_C}QQ5jQZm@oY9kqXPvJ`)z1YlfO>_PwW( zY@D)mKhW(4FbE{xNtnegJ2{BoVKRZF8TN z{!(;t|93r?cUNA-sjSwJ6=422v~$A!lxZ0H_++Dkei^zp?i+0rMYeJ}X-}U8pGdrRZaKa@2ff5IJRi?K9ZIUX*fz?dPAJ;HzJ% z(tXf*EEOx`fLviK6gI{rL5+-AF8$k4$1ZHeeD!i4*8D0qsZDS9(yc4TAN|-^|Kyi= zcEkEK?N}dy6PmKoK;Te%R6yB&yKzB*Rnvs*HncPtRA_m3-~MRPP)#Ti9r;@!^++w8 zBt7!C{*KlZd9|(X*bc5o-0^}Q(@!h2b)E0RTdM1>sxUOdXN@UrYT+J!vo%w@_v%~8 zN()FO*&h8GL)Qe|7~BV}yj$D4n=D$+-41#9;Q zXu8PLiW{qP%2;=I4`~Z)566th*++0m|B2*WVQj$CY0uUkj990DjqBm-xi1wIbY=T| zZ&w50&qsacn4*;Iy#NW9ov5_+cQXnlyNAaCKtRY?T1KmjHQO~D#}!SlW#Vs`B7$ys z#;!GPbar)4QodqdKy1mrHz((NxQc6RrAG4ge{-?;s9*eo)T{cxoN>P&0JWoK%Zg<4 zO=RJ{Qv&3a%VlXZ9S^bpR1Fgl0V3u6bK3fMYY@@sE^i(8-uQ@tCX-{wiP`8fCYvaI zKuS%@?$fRvB=gBC_VkJ=0$EF_jeF256a8k=rB+=ZvT~O~87BS+1uvt5$&_n0pL_6x zc-e}08cXi00@k_pSdI6QA7pXa_Tx2z!;&KuJ$iU+LMtv$ECq%*`fqgY94k_ow|^tH0?jM?dv|&oWB?0Q zq?)9_dSjH4{~2Pvk+_6ZWp~v1{9Sv-2J(T~8~gI?*{7phFvVc_H?b|jk&z1tn^!f% zM8?lVAKE$P5D=HoVQB6YO@;JR)T-Fh3@RA7mmM4N{LO*%$3#pIaQP#gbAW8PR`AlLpE<+KH>p z(l&En7lnUBU%?ZK47bg73XJhVs*rVM$0RA&6uDCt>D=4%FN9C^Z_rN;&r{5P>Ip&N zqd|LnxiadH--J>>?VsVUC*J7%4)Krwe8_tLF?<}>aFz>9X1=ixG6Loz$}^_+T48uI z+v5JMD#W9Sjq8{LVdb68>!9DMfJ~Z3s7qR&J-)jRECDG(pq6$#Uy=^;n&tw3L_~S+ zE5J;Oz-;u7?Y%Hl(?}_*+n=UOS;Dsf*6Vkm5|P0UX4wClX_+EbH^s`vMHUY)!9o_n zUeiDe`MyEeukq(#Z~cwYdV%lbe41=mA>Yqk)T2nW`{aGZ4-4vjCx>VMWp}9&I;w~y z*&VL3>a3qZhc=lp67D&YBaO!dIi-Xez5e4;ER5Gc^81+%7YDo#Wb-9xSHx0-+m~9LA={4kXI8T!M zq<7Yg1Rg5M_jXvWmsr`}f$dlES$k{8e+6es<^nts;WkA(NH6$VFgi#~% z^1f~d!foR)!PK&qcPS2w9~14h{||fhDb?whyi2I>^_NDAW}At|?^4FRjD1d?IS0iM zr7~pIlDM86^Patp9!CZpefPlp`oR%Z!6k@d)l|4u=TU?sFTs}V6WJYptHWO37sGm;{TMN| z&@)Wj>r#E+U2my9r>4FIW}K;@cQ=gMH`e&z&q;#|^QLW?Y*!@HUA*rU3<(SG!vsbi z03s$|t?3E8tg1Q7?P@sMa1!nZ<`^H_o#WfFz|TxqY6_dE&YPOr0%)M^kE!&=OFDaO z$`cyMn4ZI2u8h6i!`?T^74o*#z;T*uf@eSc84?*Q?;+gtuP#We#*TKU?I=73>C~R+9~gjTv>1^1Ie(cq`Z$B(e8CJJrv0Gy}KE^n(*rvkM+cNdIi_zN#u~3 ziS2&BSaG?AjzjzYA97;#bRJ&W%VA;Xg$~KQIOHrVz2L0lBCD{??QLM`gV{IF8N19m zSX$)e1}|P|E$G}o{=&Tx?VbeF#Af)D{P_JKTHy+I9CBcQu)HNyebn&@_uywf zi`a#*dlG(K0q@6D#Z5()V_qBdLWJ)d{T$=y=XrPypwY7}_@aIGf|E!}k3Or5m5NXw z41JbeIE43e=jgEOpL-W)mhM9tR%e!iKyva=>Cuck7FWWciap_6h`%9sFzw~ENgJ;Y zMpt~8Q}8oMvEx`nRNZ~2ufqA}c<~rP;fC|901@qviQPjIu3Nmcdn0xsuSe$g zHH(32z28?oLjue;$21wApp)aqcZoMH(S`;4F5Fg6VlTmT+z_pIq8#(XsLj1|+ISrq&L zP!d5eCEOdK55%_k_;b-2PaUHrd6RoVe>6V|G6bg zt%J}a@>KXqR?)|IzGkmqnL;)zw|4DBh6k?p;ew%S)vca`nxHeyo;a(r&Ck9eZa=>` z;gEgEhC8UvN2p`0wALDZJt>THekogYmW_w938`kSCFhTM;}J&d-@dyynFfdI%*QfY zo>Wbwa+r*lACT7$wG6(x&zeN?E=s?UJ-l<P>DabTk}es<-+3=qG*2<=b;GxpX_K>T3JCQZ> zhK;g}u9`ZX_@v#+EnwCAV*3_?eK{h6pw% z;pA=DA`bmaoJ_ z3~5B%IoiBu>+&c$E&S2X?Xif?j=(l>4s@OV^O2!#N&YdBF0uDK?Lgb=AoWoXQegfWH#eYd6(1HvjhU@fqbk>)@TB zn6`N);EzYgQ<7~Da-;EUw*>~fv0|QjZF+eS+6wy$j-Bakwk@bj?qKa*-ilatYN|KC zbqb180RlS*D*3p5Bz07WysN~o{v|mhrlkMy{NZF0?@hvkLB_1QTF`1yJNQF~2ciw5 zGc4BT@%lmHd;?kF%>xq(AA4I7y;}L|loJ$0(=Ac0=5p*f&bm2)pSY<~5-$H^ zXGZye1XB_M1U?`P;=4orO`$q3AqqTtUOJju0Fv9%%~q&OhF!3iWoiFy$O5gZAR>T; zpDsP+&;h6m7qcI#Py)A+<9jmCi<~ekrSz}WlU$W<=55-?u1{ep5-TFt+Ph!WR8^Pj zG9{$RH(3ZU75V%JY)F?m)^{&p41y8&zdnPY$PI75m(+9}UIBTJZmpXJ?GIH@@;<#- zo{W^^3UhC!+#Z!&Shv^BPs+?Oh&6@xH3s#xVLn+@S~|+gmS*-CbCfQ@&8w3dPNcn* zGo}xMQ@jhu@3PDC?+Ya|YjxCDFiqQ)-i+S=yyuV!C)|Q2AjmF@@AZZVdXukyk>^9< znKc}dx`AOTHS$S!ES@(@G7Wrf#LKi4U(u6>bZO8MO)D=_6xChhBjk$S2;k{+(#J2gZ_kopUuo3Yi2aR%D-!~* zb@i_+z1Y=EkkM)b{1Cu?JSm8-%=uN?xK)i~Lv&q%LEeoO$OS)A&1B4}lZqx)Q%zG# zbY}M5BLY_Ic8`y(d`TA{QMD`fU}(2bOU{4%LYsg8TYIok6_ysYlZLJSTVCZ6ObL_s zwNCNUA5TY~d8YcK=TQ{3jW9?sRce+$n}B?&(J|1;@>=VasoVh4>yK}=D^etbKA18R z>YWa5qVV1`hfv=xJgX&Zb5B^8$%^$DvN*cvAUT3Sk$d6J&Tz^ucikF%wyT5;wvxZn zehM18CL`HY6kc0viGJy@R=_P0Zh!p)g1zp6U*os;69t7NFRH}9EV|>PGSnGS(IXLI z?R)UKVa;)oLfx@3m&qhkQRyx=Vw?o;#DVd;U|Glo8%AH65&mZT^bU&Kg*rO2~m7;Mdi;0lC}Ke(zuR>g{up7m4S>3hm+w znG{IIBa0J9)@qEY1!50}>LQl^K&kt53gB*lh5R^wlg1BP-I+5MU&J5Affo4Q`1S|Q z1-xlJx_5lP?p}udu9M@$G+<=%7(Q1-X14v|zjl(e&oE^<^J~ZD(nno6n)U!F`lzse zYvV5!r`h?f|H)0&N8{TII3=^1zNj!yq7y-eMQ}^hZsy*jR2`Fxa5RlI@sSr@EPT%j zy>vr$Ii5V57T~Trk~H{BsDUzw|CYCpG-v*^mR%H$$;JLjJdL3YV=2di%Bua^R}a-H<$d-i z!cZYzs|C{dWoK_D>RsiDx@JOn0wAL4MET3ge2n+>SJB(4Onj=pCRV7ChyED@?myb$ zenB69d6j8iQq|jd>(2b*trp>VRHq4UfV9^1y!$a1(pXcX)( z^*BU)n%DyDjqD~?qjL$yJFd7L-q+;j^$3cP(De=i-L`g#F}4zZ>Ga8C0ix+O0c!)uACI zJPA|@+|Y{bNI$m$z>b6;mau$y+mh=}<)a`A^JY7a{{1Ds z@m(>{MEZMXNQlZg!ev;(XLYS5TTRS5SRR~xm$)l%3HPPv)LlS*L01*wI#=>#!q~`j z;oal#FEzoK?oFqXTw}A-%=82N;h$rjCc~Xvj_d?G{6uI5%J^%zZm&7wuGGCHK!1M(h#r~lpikC^(Uksk8#@IjA3+g3u?UU~qnK*#t8xo5ZlD9Xb4D_mn7Fj68m zI2QO7_CYc5!M*L>Yg!0dO24*8{HLxc-7t*t+Aa_M4rk&tjY%`uf+B;v(v+6<;sq|R zY(+r5|LXpJwiQ_3mUbl|P+3+zq}PY`c;lrEl24Bo=9iNmi>BvaXzFe7|j88|C(ErXp~Ol0w>)EcMTxUDeK& zw)wIyR#Au?z`U)|vaagSOxu1GR07T!wsYVG^&1%L^aGw$VNxQsCI<=8wy`=ZCbK|^N zd(PyBt~mL{>Sz9dvuL2!LQDfr!S%Nm%*Qkp=Fk0Jc_c)nXn9A{kZ>VxqSJIXvy3)C zjZ+j8tCAG~u`%Hp&wxMo&T6w<>68sSNqFi26JSy!SFWk|0rDR%ZXrh3H+f78E!_=R zmT;G}C2uUbz2rq%XxX-~a(o3$ND#)`UDb^8r&8NZMMtI&?x7PhrkOOpxrIwWuSqyZ zxpqWH(cqznidqBw*;Pq9D!N1P~A(4xzT zx_4offOqAHFG4EDqOR7NehIcF0NIKKjoVyDEjiJ_HHed$6Q+Tob06x>Qjk$W-~6Zj zT`K%DQpBb*{g;;( zLcudSaZ0tsvve;DY;)UX7EIweA2G#r!L%3&2)ZQ7P_*293ZNTYlRjzhq%pZW0BpUr zy?gWAXpsRM@EMhE!;nnA;O)c8BPnO{+s!QS#^}yMq&Zp9TCU2ADFbZLzf93>QIK{? zO>WI@-WL*Ry*p>gh&3M^PH;w5M8c=dh9kVs^D9a0R?+L`D0$a0>FbBImVNKJYoAaf zc5?gLD+*#F0<#%>xWulofbOz1wWq!jYOgFgYdCnq@e^Gu&lQpP2b?Bn{h0J}@a* ztgewjXFv31Qd!0-%B=lW_V}{xM;t`0 zrNyVx3R?e`)(n(AwRsx+DM=4hTF!-4w=p?HDdJiboAtVl1%57lLM%?{{`b&3t#u}L z#G{BYY&b|3Sae%}P|j9Tw>H^0y-wpOKWhJ3UU$^{E1>363IcA7UnN`yMA)^zXO+ww z$A}P?9}#}ppMPZrpK*Ie_A$l@{G2b%sawtjM-saoH7c*}fXN*+5bbl$7#r**-g@TH zHKl0Q2G_3A|2355wDJ8;CiQGIYT-pxGP9Sbmz&0jwYkcQu0gx>V&P*szU@suaJ&Ga zs|ps!#)3M2)j+@S;Z!*+;ARGJImacsDD$eGyzk;9JefW#+uen|av2RC3cjaRR8LFz z5Kmic@VY9j7psaEpv3ggyiaFpq-H{6;I<^_4wbD7D)t&=LwhSNJ^xY(*RF3161cye zqOhyW8#k;$cMYPZ1^}+%mG4VyaSDM0i-_}1y2E&=z0Em!k2Xg0 zrMokGyNP0x*ip5(~Nat?<`jy`lFjQc?fh7(0B<&yzPUA^#41tw$oh6* zf26AGTaQq20Q}ZqwxvZN=Ze0{wr2?A6o0i5JDVAF##a=lHgBz z&Hq?x6-#4QUw^kJu%COqrQ9?B2?m_*v4HgQ@&zg3YmLyFe{ZbbTBWLWc~YV(d0LM3v8k48FsR-(!C;=koa$W);X~ z8kG)1--6(`B2}KMkd&pV+)DGAN_**r=hQrCSYYAwBBu8xm^Xf^9vLrQrpI6qg`BqE zv~hh;;Nu{bO&WWP1r~&>g}fQOz(OfyYP{u9aCkl@*aLBCzj$>-_wyY#@3<5=^Bk+4 z`p|g8NO}@96HF3D!39CFF4P&@cM2!cR(lCc`yAfOHPH+Ou5DvWPCv&C=G?aZqAa}* zmOe7NJ0|EYoMB;Rk|V6`wKa#^DrtLLf2ibM)=AGrTGY;u<*ZI8nS^%Ihb|vZmNb!* zxnq47Ua<48qz*?S)a(oE@zL*ISZsTcVA9v2SP+Fbz9Ma-A%xTFD`AX?aEXnHk#7}v zJ`^8O+})KCVK>N*86S@LExO#Hc*t#}vouUuc|7H6FB|$k-HE+V-QFN(`NGq%KN`A< z?-UUe86c2^W?q>j$EF@* zE2m6rYw{CCCO&M31~`JIBr}H?7cnoe z2(VFGa^86ReiGZ_A&Ko@X39Kkt&dDgmGdx!jj=27p}q%@Fa!P#@$6Wt-`|>Z+~Rvm z7SpeBJYo(PT)%nRv~kqJnQ40Y}Rt1gb94{ekX*C9CmN? zo9Nno?n!!ruQnR)?>~mD@8cG+|IQ|?_^WgzyVe=Qit)CRjlD?DH}tK~Q|-+%%XBWd z!k672?Ge3U_PDT`*L(9Xsws!rUlx@*d=_{6F;C5}?#{UMl%}@rJ4WxMh*nI|pE?g8 z-d+n%v{=uXLLV59?2JR{0gxA)bjzKyXoh4w94vE5FFcjAk{p%XSR`^tZO9p(MuKP- z+$3m7?;RwSHkBx)E0cm1(jA*XFj9s;G!22)_JZXHL(N8F`ICY-MOrEPrgA0zM-vk( z9ryOv+ji%Ijk}J%_#d~59lL{%?r|NW7=xIIWIdm=v+U%JQ6E~$5$5{8TJpqUN+>Kk zX>aeq_cWsbgudL4ZZ?M2R?by*HNPIVp3nIH!E$iIdQP?j(>>R5>Fz`JRS;YS2b7U;Z_l9>;xhu{ zyJv9FjB?O0L`lB9>1oa^IkrMU6%pw)+smgNyog%*Lmmd=Dm-S1y zYS&Hn*6Q;QLQ9=-ln{1mdMU7Gi$u=j4utt*NNv%>}3 zLkn+C{{Gi`xPHfl`}n|=uN(DG*XqRRchQxXgYE)iTGLIFZhW&(zQnea13v^b;O|}eG+c{{8w=JM_}y}@W;D66SE`sBxb?M=#KDc z!nr{>6#pwwKV=!=&vL}Oos_MU0E&b&EH@TQYW9{^V_P+MvA#;5EESF&XyoG|Iecks zN8S)ip6KCmHg};91fw7l0zAcBd$Ii?Ste@Iv+6(Q9mi1?$I7saQ&`6?9w5ykss@-b zjcKoU8RECzxKXGu{k~Q4`<`8$Fjb}wiZ}S$2FoB5fG_Wo2Y0G1x9^=kueJ(iiom~N z@%Q9$$6@U*?xF2Z^9-GrE?vn!oiiBI1}8M$c}1U%)IEDuvTGRVcNZqH*aGN||ct%G(9*iPHom?X_B#Q4o3oI%Al*m}G+3-Luhka%c}J z)^CEV4(P)Mu1&8_r|49@men?TePG?O(M~=@Vamk|;TKI3d2m#!Y4y(0e@H@wnyNBq zy7qP&usUh9k22ERY;VyhK5!3cdRRtv3h>N_43~L!6_73*RpSnxALH6`{q>BNg2|g# z83#w^l1OUTL_N97jQndvx^zP`>aeabD!YEs{Q|8Tqh4}yMGvqGZ&^1eS4A3*v(9uLzo+S2y{zdzavgjRlB&K@7Wd@b~L7KRI)i@IdYB%6!ZFfPBqKr3o={+r6!W*P zA(f==&ayTt%!LxNcdS&^0_4bOz#Au}X|@|KRi?<}oE77qiALL@!GnvH2Qdv18=05$ zJ>CsgEX1a4<}=+6fmPDf5$B*{2WGL6At3ahgMK}q9)B}@0_5+}?~`XCcj}CM5NYiP zHTR*c*Mkxod`dKe>`~F!=@_o1HFRlgZvQZWjNG&W-jZvvrEMn@xijTcC^>8#Oh$g^?S5I( z8n(H96G$mU#yDE1jCIiYZu1`Q`_=yH8VbCkeh`}`CUo5IoBTThlsg!Ktwu(oR&`X# z?FJTCe*Wv=@?Cz8Tk-%Jw&z{N0UwK73;Lr9Mrcze+Wre)8kuzkvjvMIoJ+ z__Vzt`cbOUCZ9l{kYQ#w#MfY_E*!A)y_&^SUE#ve%A^8S54NJ;vEbV3Xr2d&CP&cz z3vx;DbHbdnfzOrSGDx%Bp~lD1=EEZ$|R@=0K1HCvW*|u?5~d!7+H(36rYd zqei{2&{rUFld3CabG|n)>12V8_nOA45Zu)DKvVF=x&LJ96vGlGio00Zv=?#xd|ESR z2d`rW9INk`46w0iGm2HcAyzTE(L!b`9EQO<=eag)K_^a`)8ZeA-oli=;1=yqG1+Yj zQ<9&kF3HP3nYNBUn;)Ke`BJDoFfeA5N-30$8{bndGD=29l(VFtw;B{sO<5^Tn^WZe zF3aV4!R|1W4gms5v&Zk#Hdt3s}37nUzGl^D;&r^Qsiku=k~*#8nfvgbLT!o z+Svt75ye9E)*`@VvKWLb(hKF|kqpji(5icz?IX6@c40>0Hg^!o9}t~8RNVO~UPBpM zT}vBqlpsUvK1y_&9F%blyt$nwSEpg2sUHfPcLHAvtDIOjV>p|pveKH5$~Xl@vX;v* z#}P5b&4QPFRLyYEcDcLSp~qR>rtacY6m88b!%dE6qw(P=j9aiR^gmx}K)P(4`*lw5B+ix$+f&Ql@_R4955O*6 zm~5Iw^oAO}t{dEZWQtM)Y6bD;J8&(Q7-^lWzH9?W($-0uOHmC?i+o4Bm$|nJ-`CaR z5W|*REhj_)q8lh>)g6>U8aXwwPe+se!55|UZMCTz{gEV(Wm`_awWV7k+@twPfy5^C z*E{6tMI>1vDe3YA57Dw?RK{{D534soi7`#7LWaY$^tSge<7VL0F^=dDj<=qel`G7@ z*!Raf9-FS3QHM?vYBKGV^A5-Z8oTI9Gc259q`}x4kZU=in50)S^Y9 zlj~yU><3nskLu;hPg-lEJuf1+Cr|9)+0Kz0Cr`g|wPEPk&kJyHGC6xup216V)pI}* zvi2x)d%D6M6B~zz$wau<*`p6T8}o?RRtz*r{we7*m}N@rz# zS+3{_rSy?%U$6p^56EC zDAHO&^oj8_`rhAy&Yc*{_JHU>dame+)gervfJH^bXrf06363==B5W}K8Q3JYJx%!i z=ThdNL$-SKUAp{B_^N4EbMd`223HgmBtVVKCd}S!td33L#%Z!popc7CVho`3cY1Mi z;#J{XMpMRfncMPsN7X33yW_ufciQ3iv+I2{TN+U*HF_Dz{<|=0PC~`f2(}?~60D&E z(T=P9c=UC4`?WD6%cl;CyAlOHTPXV<-2s-hHCjF5_14)(cWWvaxVmOMfP_o79=yQT zhwUOBOg#DJ$3MvPZ*GKeTqGk}_0*6+)cA!t)&MeMp-xk`Bz8fv@IpM3P>rp`Mq-kX z7Yx)PsZ>o$m%Qtu93axs(;ZIIthzGt#w!Vh)&QJt8Li@leITz{Esn6GsPS)iiX7LQ zSbAC@R=dyZCwa6X5qA%chdl1GH~f$fOGvq(e{qqm;wt$dwo0y`l++4glNB;pI=9@}J+!6Dm!ba%VcU_`qOh6ksO zne;Nmn=_gy!(0Aw(W_%Ri?<+M2DoE}?C_Kp+t^d?;09_q5bHY2x0-2WS5!c)nE844;)*rI3qY)m~p@=BLKK&w-6F zu)iV)itkz-WM<-CQ?zlemx5;|fw@k|Ia}N$)zY)SENZE4f8b`%5mc?QZwkC&`}xb& zI>i@{KVJM5QQQ(gY?o>yok~rZoML^k#;_qu;*LrR%f`ozJC^d;h`Pda4lk^Q%>to| z*GaTsZ!c1q+M(G0m^#mBw%_-UD~i^LRn)BAeyys#lA@?l+G?%Zl-8&bI|)^_H?2*o zs;V}%iM?usmY|3&cB~8%{G9)z|D*ey&*S^tpL4GF`+B{2?W{kPD%3d^)OB9xzxefd zP_qN8Kj`V1zssherKccg7}F~Tb7MokcYUW;86W%bky@blgtAXz941lwjZ&d&&$|v4=@q0`3AO1CPMh|&!-;qveoE~TNE8bm=h@}bL ztSiF*LzO_pCnOcBu3#TKzjwU!N-Y1c)4@+AA>FWnrPBb% z8weMK;?tdIiq!n|2^EN=F*1Mki#fL*ORVghL_W2BS`zx>S}c_$sH{(WBd3O-VIG`R zV~!InI^9W@9yKjH0ejenEM7}_FL${!lwVWyia+Sn5KYUMcAE~c<0EO`_9egAJn~5w z7A;&opoo#|8)_HABtfWaiqSQOpjwOe-EPE$C2*}8?aPaosydN??OgPgd|M%f%2(5} zWxz}SXvo%O+}R#wgRVJ-H1PjXl?4T@%-#HsBIHrtUFh$RL)R%@l%v}w^4ak__vV|vEIJ8GN)^#(&A$d0oY1CdSx=Mt>$>KuM-h-&=zL3e)>sO9PpOwX%DJC zVsxY>2}hRMx;7+$PqAh%m(rzlVAJpO_HUv1`vavYn#IeUCg`wh8Es+X_0x|#Y<|a(_5~Pr?K1kZ(Ztl$1jxO^(_a7^D(`5q7E{^X!B9U`rI4x!Pvs2pAt(#cQGC0LvnO0jTEnzU~kQ zO=jjP|yZql9qQpOZLlhq5NYv+3vpu8FRM zZ2#(b6OUBa4E{R6prYWbAB)5zQH!e7$^qg?rrlVG%Q>a}`Xoa)?atJ+lLh~@YpjmP zaFP90x+C$|^0FoKoA18V^@bNU5o%#=9}hE!#(iv`3x@hJSti3c&^`V4LV4lTUq&+f z@{8(VRtdZD6dHukH;G~2&|vCG6UcU0*%S4Fk8(!EsVxMc1n^?PynpOAW2%>cbNRRU zVt-2snJe^0ffR@H=GWf|0@FMND-B5ty`1i09`Fla#k)7=GVpfl%866U%q11l>(H*% zf4mCM4V!jAO|cak zwwhI=%Ff2%EPNeA*r(~5L-VM<)!TIzTcp0l z8I7f~C4>D(wggaPJg=(dzhinc^V;b^pGEmS(o6|AImsy7^w~R47?hJhLP;M1xEQ-P z5YPDixos}b#1&y$ci{Y04^O?9>n$}Y=Wd?A zWVsab^${;IY^Rq9zbL$@>6jUvhU12auCT0&t4il)T#Brx`ndN7*y--o8n1)qNEREu zz;Z;JVA)5vD6sH1_ES*me!<&Il%>%zt~u)9`r@X#Q%zar&R1MPF#=f>`0gm-5AIlm zD-_y!i{ttH!Q&k1ix}U-_pa@goSE6Ru{3_?Yr)}(E3r?Tx+lL5YY%t%9JaX#B}@`E z#RDf=?S_;>c|Y&GpMnL32iYQ}d4#_+eklud2ip2>G>^!HJoShFLSWS>wWc3`b+0%* ziuvkNyKI?kG`+?Gf>c%id_PDpd7n=)^DLV**s(WWd$rVi>G?jA^cDJLC`={`{zU? zl<~cmZJbGf0xO&`8IlnD9Y(MWS^AAC9g4Jmk<*;yEpRLREM$mne{9e;97IskB;;B*c%V9v3<3^BiXBL zd6PYo>B9Tq&PRFdR8bow82j1Gt0&L_swm)=j?n|HHNe@*BH<-!a{#s&JntUMDB)a* zL9M-I+~^fxXnnamBcq6!R({YM<`MZ7P82i=OhI*Zv~c$g76@x9ox8jWFVw#zdc1 zB2e2dr+<8s8Ez-=(eAU?dlNsz6}NxY` zwkhPpWi+iVl)y-DbKqnR?L1Pb+ww*=C9ASPe~Yzq@oBvRSVYo4u6S);;82IvY_0kZ ze=djB_;OU&ehk)ka)ctUo6TT@NT4^nuf&@xGvZJ8j&>g>7aB5#NtY^fgfq@xOi7I%l#I%=@f_$Ifjjiz@ht!$Nn+I$+QLVDw1zddDKg+_@=!=2b#w(*hS%TuyS!P(X%)m_ySGs zs2=l%7{dg(De!VSYW_rjMCg?AVi)Yc8MsTfySX21R}hc+<0vL0ua(qDdM_%5H=wJa z52zV`iD;kx!6jmxBr$h?n<`3d#>!k^#!_6@8x3Y;lwB5Kp(olSuAoQrG9OIH-H%Kjsc&KDge#TWojwc3 z^il|4u2&(FZ?T0f4;km`tBp zS~eTEqsF=Q#eqlcY>7?!YHj(*-Z)frpC`!~4VJ>`zmoS8ZPniLV94rb3&>UVKqdFi)=3W{kaM z>cdx+5BBQ5gFi^A`Ou1v;8jzWSEmHyqO2vJnGy1bi?U); zRqU#r1<=&9jo9|1_NS^B$EfH|{}jaY0ZCJBUnMCQ*`h=dJ$7T?$^3WWfvm6viuc@Zo9pq&sONrgIrwJogr@sJnG*!mH2 zeLs=#qPq7(%=yV}!BDb(R{M%LOV*OyCROH(YQcu%3%|9emG6~&yeRIuR#nOQ$tlC02+naO@81dWS!3S?=b+5cj7Q67X^bYxAFBM8(FS^R2pz0e^ zSex$G(#^-c04>=GyZv4Y&yS5TL6Z~SNE+}^cnxuE2#R|k%g9!^vUJYA(AzRUaTUVj zy2KILR`v#xs>z$xjlDuDJFu!p@SxIbbfE)No3_61taxhunS8Q9 z=6Wy&-8*`hw)&N7F|z-5RyXU+L=kiUgo#b71#=&MIS}g3vF7o}@8|YRU{*wr4ofvN zOZ0KCS*mC^@uME1EPY3qTC1-pH;;uXs6RP5JzBc=z$P;@FO%nUDsGfYsGm=ry>k{l zm;9m~gwnp)O7_`-EIAJJjmEe;Fyrteu#zz4L9=>KJJxF1s+!qbZ6{pOsWU`vyS8U_ zKNKqKuoDZRRtQyjrlvW1Z2BHIL7Swc#v130xB(V6&}a~UBTAbKoBVe3d*5$gm4T`h zUII$?A=`zUQ@Qm=OXx%h3Op+*O>*D&veSN3q^3eyGSec0n5TE4+Ormw?uV8>pjN4F zJhP`wmib6(bPr`Vx>rGSpWA@ihK=O5;!p5s5zruRN@K8jqtL(;$&x~hTb+CaywR0>j&@Mrn?@& z-IUqv`ZB}%-MM#MTTLIo?oGJGjrHRyq&1|VyX zjPZeElZ+uv-`THPh~ZHyYhIJ@bq?x2F9%3P*O`askQIA&o?a%55fDhoQeDz!OcYY* zY;x^0fK!1^TK0aFI3pfGV2GYg8`qnkED=&MDZ!?zumm7Z&y)V-7T>OO@NBn@gqiG)nAbYYrKtNkDWfJ z?l^YL=(54KUC8<9rg7_cuGUFr6UF|d{_C``&9&G2zkoRH)rHg@a-G%@-(RKQjSGGp ze@hkwND1olbD5lH8fLni1Pc)C1K&;pTvZ14Pu72iRq%w)`Jw5~mI4$yX zC^zZ3?RNp$3F7c{_=&Lq=XG=-B9%9=E3JUtq=Rw#Tbs?R6Zx^8lqSdhX8d{^*nJNR z$A@_mspxzazgOaE<4#rGCvR6$x(`8aL`KUv>}li+kbk4IWKF6Rs`{AN5BcY}-IPfV zd~?6QuF~;cJj`GT%TeZFMq{VSU^eW>{hKqM=`4vbbMH?}D|X-=wKo-?c}cs7Hx?=; zht1$xL?3>yuzgWa9Mg620yO+<4^3$?WqDCfxHw<=a6kwfm-*tRV?6Z=t4(U}G%PjE zJ93|kc`ZJ-#`c2DGQEEzsV@iF8XEj4N8)1D52KVh`B(9^+T?bRT{%iSCQW)b6-$e| zmTTE>4O{de_ueF&!*1-D8Pv_l+8K?j0br*adcayhZ(Iiwi~JH%*9^(F{uSqXI(5{m z4G6lmQJPJYtyu7;+-xgxXD&2ATHs<K8y$dw@Wln4?@WH8#+q;l1C*&~l*0 zH3&uy$`E=QX_B)3X&@Q@D_G>aPmehN_r7ghr<*&v%ZK4Bta0zTuiq`bRYgNMz*_iD z44GBgfZZlG0PcN4etfxmJ#);Ga;M49A9<&;m+)9~k6{9&7O(iR9E_#H-*^SDb4A)R zMnDJSA^eIKuaQ7(W8utRwy!&N7)GjL=FT+`zU6t<**Q?}(}&=rsB2!t2}}Ng9}zem zHDMBLi)e~Jermeij8HuneeK+ksv-BFsiQ>aaXwlDdLF@&(mt0$*y4dUz7tD$Urydl zMaf*?ch^E6w^THfA}7K{xYyRUxI{VwPbd@P*K0{8jw5#Rhx|fv{Ib=VT~zk<1xjyf z1lsiAwmzP_)&fsZ5neLN{(g?ZXOXHcl?TPY5J5Y7Bl!4A-GL&BkBVX0QLY!W$G@?v z7i>2a54$>d?1 zqb~@Htfay{{BA+iOZc~u&3+<&ndWn_pqgj<$g(Z}`hYNhd*E4t|K2xhHOYC=X2KqCR2$fg zzCL^yRRYU!$<`ez&r+h zVw03KlW@Ahw$SJ*=rZFKR#{Ah*-jQe4oXteH`FLbH4<87ioYM&fFKQpNFYZy3WAG(XEL0)`E=A=u{aXKfFX09HY~fTJJO~l< zT6st|)R;;1gplt-dH{AhP1g|D8R&{gB5%?^w4!$=dOz4rhgO*%ki7mBIqC)!sMaOQ z)hCS9r$IY}`}N&ihKcf`c9)#Gd-F`s?+of2UdN;)`ouZ#Ro+4TF7%PabUf9ZC}PtW z_>N-HZwh-gC}Vl^pC}7c06wC?Z+?Db_e*$1S(>X6+jBNWA^fHcZJcbm!^4r~bclkr zy6Bf|=f2Udo9oO9z!$h0&{j}|%D+?kl(%{Ea=LMh9zzGWSxx><4apo?i8FPkCo70j z{1w22u2#d{T5hPels;M#T#RoI=z*3S$s5M<&pf%6yC+(+yV0YX+IgY0gKPd3_%-I%Uk9{hX0cho^4e6Z&l=|8*ObQf_~9#(8?e`CJ1-lx_~l+V;6zlaJCwNNuYVV}FG-3&QvS8@s?6B1O- zCo0U_K3tdaSz?mhwW1x`WV{QzSKu+zF*WJ?#1sG%aYfqCDH-&-+wP5L`W@bnhT^j% zLVMHzTN+ubYDyKB(j8OU;d6inwBAY4(uC~&O!S#%!UnU7Ffip?@^iplmBEszJwfFO zEfGldtVvC0*T8mxZA_*6*L&~<^Na5GFNnO34dZ8$(?;}dh1Y(cJur_|FdW(ZzBsNq zeRwxuMeI9UiBl4z^4POq+~G+~iu0s&0O7;Z#%y{{)%VK8nN3Ob`g-2|$>=OIfQpfI zHx+%zPRG2p=QT-N-e-n)N$D)c-FF6ZX`M4s!*X}Aj8;y?Z8iRFeQFh2Ys+^!cdmi(PJbdr|NKJz*J3NmYcALQ z=s4TPD5s-7urlr%aP8k)rb@jU*PWaBh5`gsz$fsC#PG$louKJ|pZnKFZwn&Wdcv z<s*3U-A&;MceUA3itvy$R zQi@WOhakl*%yoV>Px7q{k-h2jNSBpbb<(?TlDm)UO3U7c2El+*-FR^L_Eg#Vww(Jr6ePxjD(v~pJ5U7 zZXau115GvnTC`zkgVH*?QZSS|JZOEOY(Euuuuf!^>tzi_3ly8er1fQ#WA)_-)sNk~ zyOG;QULT?>AhvP)5f=RXzL?*(ng`B+?|VA-i)WoN(!mUw)+v=@r&J6tOkc(P8);l% z7N^8$0^@8g#>{u}i)O{gdgXY&JE#1I**iy?^m!F67xQ z{XZ@H1x-Ui7Su7NFe&kXPrQCSEia%0zBm<&VKUfywo##^+U)>}Su6}n4mVjq zwvPwDW$t(LY_8lDCAn@_y|E*;z z*ij9?*1N?+@myex_D#vg(tEK}Ujv4_Uotg*89mHe759(5%r{)Q26O!w#$}pW{-j$> zY$r!t?QkWKD6~Em>tq2}HNEytCWr3Pxrh+IUt43tk3>2V!pc^AZ<35Jc`%ae@R{Ao zb=eM5LgKS7Hfip>YZ%?pULRiev5=KPYRL|zc-PnDH%Z08^~sE~k33aaC>@>uYQ}1G zGgX5BB%I&H^#3pk>9W3bvi>}O*lb=LjX)7w>kC76|w}DK^OBZ z2qQU&K6LYpU49NC&?*0U6oNH{D8>%j9k*tVJw3#zeJgU~M@MfgYXraz9#$32!hFkn zBN@-5-LM+o?a52Zv{=f62Eiy(B}YHrSnBqO($q`lhmx(J_~`o81iQQE@qnEFxC9ge z^WWK+nQXHO*;YF0uejcxIXlSIiQQDEkF`|y9l`29jhDe}l4n{^I>HZWGEO>=Y}wPt zPuaW3IB#HfolK<{_;mr)ama&|Fm_lJ?B__kSI#Vx5!;H11vJME2- z$#AEtaTX~sS+h2x=7y%2sn6nH3@T`(gE;kV(%7IUu{V6%{uJ?hALtnMy4dwrhw5|? zH?N2LBU|t{ly=$v0eOu44&n3~=##IR(ikxV~#fFZ9AYYy?dkNgxe*g2B zIjk*Rg7auf9LDKoT@fKu!I4P%Lij#)yKL%J#9~;CPw1zw$8DqxW#7x*Xbuxt3?IiD zcmHvz;Ld50aZ1tnCzA8N-kgYA(oZ0YMLk*HfL!@)K z>y3dQJJD|MayPB?8a7N#83$)NzA(fZ?!R8UpG&y87x(}YMHHB2xleL(1jrLF23u5! zEnKU;!D7aDRt5?_YHBn@Z+Wo*t8vM{Y)obq_xHTcK3}P-92*R`DqQD#xa*Wg>F*Qx z+pFaQcMLxM5a%~bf&PXQEWyL`$+PB9&!sCUcAYLnlaaj%7jD-cjhR>TWcxf5l=l!^ zfy)fGmo%@|>>Wr30ROYzp5RT-rE>}1zgFR}Zk;oimE9lp8P?4v#h>n{PRz-&@#=f+ zQDtgJP8E2(siwGZDRexOiTZ31%?jwsS&hS`vi-Nmc(S5~#4U>q z>XYku)N|0bua`RK()BA0EMY1(qNkDTVihS18Bm8uhrU5!8k4MY36 z><>q+aI;tq;?oQIB3mIQp5nIN*M6zn^2bd&GPJ@O%?|0GIEYh`4{dW_Sm?1FeX5vZ4K+viL>G+oGVEH&%e`nM<;vC zY`zais?XG_ct``eCZhXI9xbuNo6VG==ihLeF#VF8wIC(lnm*?#=uazv@q9;&jN7X@ zno!S#R6QL-mg=o3iB($*H?4{0?%fJ)*Q1DWOy@pylI481T^@W%Bgge_CTZ*%U*CEz z1pw-FoywAvR>|jTn=!{Dxmjqjkb(pOd`WkL@vAd$3rJ$_<;?er>~08^dRc7KuRMDe zdK`H}WA!Y%F(kY~*{8j!S5a3H=eRxa5HV>yea?s%E@iA;m5YjQEI_c2WG*qMe*)En z&X6vyH_@9h_*aXKJs6gfUwOI`IYy9N%FsptZC2Lz&>S8rylZxI%HP3 zopNNDBkV4Tk2yDEAX7H-Ej>MAP=n%fveO8;yu9aRLS$LA`;WdEeehcrL~6O{srDPo zbZZW)3q7lZ96r1fw~}JkQ{V1eKq?Q8E^>LxEFBGPKm0t$oZmw4%vt2rR9%7n#MfO- zDEglKC~te1I>%YC@+a8|XURIPJUDNpf-UP=F|ga?6rQ8E-xoOIRXaszLkW>Mm@&(n zf_!G5YLgxXrF+D*w|+wlXSl-%#9q+S@N_ev@1Jbbe<%fy?>5@KCZX7ik=53LP(>;J zx|Q6V`%JIy0|5uN9&V0uJ5apk*GK>Tss5LQhHPHxVT4bj+~WsAFO~sRD=h`n$*V(_ z>6H+b%Z*t_!=%A|uxQ$ubL6?%Li`dl=4xQNUn(xPcDJ&iF`$&iO39evq~@)+nH`A@ zzB$M!wn{jSxB>Tv&J)xJqF}ImVCOZOak)TIXu~`56>DndB(bj>%(#BK__z#y2)b`@ z)#C==yD!Wq(Sc!fS)C2F{Mg}o&bKp=cvAr&_Yo8TmP6nb<&W)4JPa4wT>L@tf!&HLFcq1_GyydneAI@$mwjg@)7If}89|%kr!OXPe4aN&`QliCIS?<4 zHIxw~Ni=_5L<8&Xq#wFjEY5aFPb&McE-tbY>{dUY?FgVT3E?$B3@lOOrP+)icOhia zzqUk7q7Q(!tU!N?KhsWfpCoRuS@Ff3qSP>ySD7HQy$|GA(#t34Mc%u*Gp@cDR*I~Z zTqT*F`8#JpGjs=p0`rsks#->?>Jrnsi24Gfqy?&k@z-8C00rt*QlPX~Rr_LY8w$tc zgz@;eagerNnP&NtyEYKYtv?+qs^sF&Wy4dkw0Pc?{c-cHLFf((f!B9h3`-*L%Scj= zi`Pd&YCK#7mh(eDCEP7{1dW$4Rl5`psR%L2mO6E6*BFfS-aG~Po@w}STbm0IsM6T6 zGrk|JnPgY#7uUp!wH&gK0|*|Ntci0|Yrj3q`s0p|iHVg0B+}9YoQKcbLBue?JuweJ zZ1x(73$8@iHBUbfFCZX-x8rGYwV9eejTkFL>_M(H869X%NA_6nz<%$CDh+bTU z#Mz`x!zh{1&PJ1aV<3$YDD3Fpg$R+@mE@1<*Mc5@XYv9(kj8rXy0c^;i?tpiW8(^* zW_|BhVL?=t1+8_#z_nP{TDZT}+mytnKQ*5OrX`e(%xN)eDzf5Y_mlGMUwb?KEVzFg zeB(5GS9!gKydFeW5_h`u_YKS@@vWMTwd8#;{~*kK<&M{zdYAf{>Ex1MtiDyhl+;o> zi6c&+S4It0Q|hXVSiQ~sb1^;nJwtcUV%&0D*hS`#6s#I`@N;ewN6e}yt)E{#0-}f` ziJWNtRY0Cme-m)nM`t$KE84!TqJ2u-m0&-k-OPEg;si;ts?(f&3cg?CS)QP_IKxz5 z_y!rV$~AUdF6I*ZT>3W~VHAs!eEgVAfNS|9RGNKe2lT%CD@D?+_|4itFM#B9x}35G zXa9K4ee|M3&$MNNMf#_+&Pk!6n7S4g@HWrWX==LB+nK9FC69mD zBUMS243|Fe_WrE|0k3t-53oh4jR+P}AaVx0vI-jOCG0Q#L{P~|Z4mWM7Oa^Iu@+li zSEiZRQ9i>lcj(Wxq(fo5!>!gm@zWv_{!Y-~?BBiX0Xw(HMQWdeW7@xC z-aryT-lCsGZ`1CK(sEZ~;a1FzU>5lO#l_5g?3nZi`KMarsauBt<70JswTZLy$pPON zIZiMsbKf=%`u#qAVE4E+y(}Ddf;n_(!7~u8FJ#&SV%|r)w4bf18E1F5oacJ$_Pk2` zYQi*`1!=WFASI@^L%g1rSC;g~mn%GCr!+NAH5;gR(-^bXkUf2aTu{DQQBb1f*X*BG z53QLGHBp+;J@_0BxfUW`g?Gox{6qCb6TPd^#Qu_dl}VJUJ@xx%lmEqLv+(P9MIcH9Yl>@UR+ICBn%*J|P-9s)6&%8+UyB4*ibsgrj4+JwHHctWv=<{<+;;}M z^K@86f1xY97C^9ke@hsBDwA-reo2(MEGc}v^6q3Zolbv5{Xs>BJh#*@1#4d3+GRub zIR05y@!us|BHC~v!B-P2hwvGl<*qF&MfPqxTNjak5&gLyS6I|{?JP#lNg5r>_VRH# z;w|n68?(63Syzfw|8FM4#W(--+wG-9IMk<3e#*W2ToXh`$U>|12-ka{^v?bEY*5eF^^qTcVk`fdOi7(*OjIoDg9**e^i zt)Kc){5QfT8|T2Qwq2loEmuAniLRb`wJ7<`{?w65S2*h+FF))<>%Xo;gyNmnjDX6i ze&d$0d|Ah=ex*2RB1p+3i(kZRY-B-i@(Q(_q^e)bfBi0^_ZCehou|ywA&t3k%lkLy zTdh!sI!@r+eTqqSrN^*ArMiS1596er_&I^U`{TtW(l<4HJbB~q`LJo@l`%qTGp-ru zi3_bR@M+UjYWiTZvxm(qQ@<~L87WNT{2S0-aH=!(hfS}`UoT<$=txyZ9QUr+emn-09FuU$8@+;}JkgszFJh?q?7K&l8 zv~S^da%yY|@8H^99m3*YpcpnkxMXZFb14nv`D{+|y&g?NqBgjkn{#gFU1M~MZ*zTk z+Er#nktn4>HYfnLHn|khSJu}6#3;6EFldo~%@6tpfeyuHY3^S-pomU3Z8>Zr?qehP z1Cju&o#~tps%}k=)pI}5*NVfxR3|(4iJX^ND)(qR=RQ7o0t=8Hm#Y-Z&*7LBzf}^q z_8xFQ85_4H>ihn(K=bH0*kP(pnGypFugo3%b?_^50g%6HiowOeM1q|py;S8=x!Q%P zTHeH11&(wPWX2qJz$>x_o;sW$=;SVcVdD5gmU~NbyxYLVDftTQCuEeXD>#_n@=|%E zA4&ePT^FR4y33tE=yE*vW&L{eY5ARvRoGg^jt6kMs~|eDCwEtF&O@P=d{crZm@xX&K!{LjZccNUzT5A?1ubB5k6`1mlI=W_Xzw4I z_E7?W3ZC{#6_gi)U_y*Akk_DX)4;35WGJ@X7~m?S7qgN`uNu@$x~k}d$F_R{$AG5y zyXS-T8HNNqynZB6;D-kybSM;&D~&sI(e~PRYI(qQL`c*dHJjA*z6w$--Vg13V7s;d9DTX2Qg!B{)hjl&P&l)R35hVIW3I!EWcXPJc7iT@P$Ne@0&#B={>(xSuO@v)6>uzMn1@cqrgclw$}xltg9{wtZ|h z1b8Yvme6f4;HJsb(>8l;wO5LA`>0`DzOY$)qs&GE-fO=oZnbQo8)2AN&A`uRU!iRX=-5~_#9?{cI0V} z91W2hXVD*a&iu1O6OvZnz|d#cI}R>V+o#)N6J8bfLqBxWtCy@Yss%+9CEQPApz+Q`K>eKQ$LTJ5PRVOnb< zc*}p~`3gL>`QDWbpA-RdzzK?OVt&m*fD_F}>T63m>{kVmtq*9}fZ2HhWL4oujj^H$ z!&lk%_ws_5H`8Qp&erW#1@*o`!@Oz|N55X?+wp2nh{;@2UUd2kb5)})ljtt8!OdagCoB$b>0^I?m=|w(vZh}33Uuf zK65SQqI(nk0avh!V+}gYVWGTviXU?SRv(Kz>Zxs4PtAI`iZnyj$MM~_+q-kp1~d@b zc%M0@*6^!YwRN8gOpvV|pz-Z6G`X%EfDq^e9nlm|z%G|U(Qr8zJCJ*VqKf?hZy06m zJn0Y4`ue@WR;6UP?P#Ft0CnJYK3mWJ+iKHQqB4zthO!be6n^$98a{95$lzn*g6l16 z*|lN+*IdsC{3w&5hnXZEtV3$sA8xu^#N@2-@XcI3g-pDck+(+=J6f7b7&&;Lj)QqI zD~4qbTTXOOxF&Q5+W+gX-Zhz?596*Q4crvFkN!tQzs^Nsi%J1mhxJxX$#dEh@%cDj zfu+F3y2i(+oqPdq@I2N!r$Xb56mv&)BxpyspIiRmoI!KZo-@q~J?9C^ji4!j{pP>yMW7SN{TbKs zjY^}gE@(HD>k!-AprBd@(9XGz@E~CNkZTpAqR%_6sPXe9Oe)OLig(ftQiq_Y`D;&< zk;iyh(a_I}Y&aFBv|_fDJH*aA z%o{P59T4@RdBauCyA(|w&tx#szciwaeWjAPzGzn3Q;ZN!Qhv<=EEmqMA8$h{Q*mxi zc1BHEeb;S;k;xt#(U8V9E8%3klFvK5dMoz`kiZaIcbow4qY3a+foPb&30=R5^w)NV zP~h`h-75z9@*{32BrkvmB1RhKsISKzO2nJ}5X+{6_&bC}xBokrxHLR-Q)6L2AO1|! z+?xviVnqEjyp!)Eid}Z^wMcSGd_?V=#O3$PZ~f}rKS&1L^4p`67iZyo$#n0JhR7cZ zlbS$l5L2}p-g2bFw=tvXFy_aS+bq7 zsL_+OKyHJOl~n;yY=-4dcp?x@>#Z)Yw3DIQ*N=Ytg8YlWw`Y{2U7?-u=pnizjN8xw8VQO(gYMV!s7W2L%r`F@pBD~S9~5kzjvE^$w1Ls zzFeRxLsLC3OK7!Q9r8J^+-n`Br}`tR=vj?+6{FU$Glo;nJ)T{_bZL-2f6l2Kcv#+6 z@MqG$;ok-LfH-{7q$l6)J_)*eKiwJ@;cjF!GN<$u*(Rj|;T{?mxW5Jm8yI&v3=V#7 zzp~9e-xXH+UbVtGjr*n;^*ftRcfCanLxr(g${8;Ocr1e5dc`^fs(tm9%$Uo7DHHcGuI?0%q)tN1@yuZGwSJLNkYTQ^2$^;SlIBl_e|PO`9( zYKN>;O)BZcV!c4Kx{hq|f&|xv<4BD+lX>lL9w*&UuR0%s0cR$`vJ4=fRy`}wfCku4 ze)gQJ`?u2wz%nT{YoB(=TKMUIMf?c6*x`aIPF`?uLevCqp7eD4G?sZ_%5gk8G-Bu9 zlARHuy}5=qx(RP29NqW9g&f;+`QVw>nuYl6%q&gVA31&~423N_ZWeg!37<3vHxVBV zw7>bB2lj|@!Z-l6>V@A`^eZ&eX^Gw2V66 zw5fLX@$ttVT2WqThKmSFObIM!)@|z9`oj zlMD`1WFMKFQ9KU~-`vQT;2P^t-%hy^G}MLt%?-#fTZ>?COXOP57DQGEDwetSw>7>` zB^;%(epBM0HQyMZeb8)S?2l>7dT#E#70zRNr2nLp&Hu#C{sW_c(WjGD)%f8+N3tjO zxgEoCInx`bp8oK@up_;krkKy_;WtCw5~YeD`f&+^=jETA-S1)@yjOW%1@)Jr`%hf% zFUUouls7>gGr{ZR;yScu#LhNdj%;bH?h@IyY&K-6EiiW_jChgixl*g#ygUOcy|I>6 zk=E|ycP{eyQY?Ty-FW3aZ^vCoMzF8g*yP4iZ2VP-qU1v~F#e;TNFveQE{Ff^sjISC z)dyW^qaI4wjGtI4(Be+m$$gRXHTuyPlX3cKi9#ho6Lwf8JkOjwB$NhJCk{TT=3p!o*wsN6I& z;7yo`@br~>-pZCf*#2At&R17oYmzuaRD0~vCh&1-hShyu$mvB^%X{+%(#QIq|K9o1 zSD4%x7h7!acek;zJ4oyy=+N${d@N82$hk)6ecz`%2Q%x3>_A2oykt-Wah8b&s%Q{f zx}EkugDuZD`*v@051EGiNQ-y=A6sV{4%Pqu@k*$#kQB0pq_Q;XnzFtwt z1H>e5qIFcC{38V}&#`A0K(ds*&|VgtX3SHV$Ev+uQ=@8;0cg)Q*1h9#cBD^+T=py` z#3b(KEop!mE1aREcqRB!xYEQoOwokE)mJg@Drel`j$Cla^=Gh_O zXZuu+glgD%% zeieMgNAq#&Xp>pAwF2o5wfI)znWfp66>(HuP7jE?Apaz8RGT2Zvv==Zdw^!;2!kal zM?pMj$!=23DYO$KPya0t!LCWpYjXjF{HIO3eZx6}nj$&ypCoYGe(pZ*efMx~U7?qn zVzcflUEr})#*f_SyxuF9UXild_+aC95KeX++_51u=x5vAJKBd&t@lCZQka6ofSWaw zNe*qL#W4XVWKez0mFPZd-HqEXpB=eg7v zBiPi>8pKH(;N#LnRIGwpsn^D!k;!ZAihf9xzZwopoyw>v~tyQ_AR8t{ez3Fd4YwrRY}wu53LB8v*$Od73_3wbAOVIbUHe3k+~9 zMsZTl>A~n1R;^zJB<-j4aN*Jv`;kUkFP6Qp-O!{DyUv|R>Q`J+pH@+xQQ({b_FN)$L2q9nBu>m&>(xIZ( ze5l^%1?`(|K;@oacVNEb1!=^OT(oOEnk&t}xEJawQh)YK5PlERZ`sw1rhs454$@Nh zEjjslvFS^)vTUW7g%0SX7KfYj zM|&)U-N5B)k}mNpTlK^QyQZAWKV8v%yR2bMBx&?K(rJI(ndCL9>w2JN(#2qOWVV+! zCjRlQ0H3OBzc3-2443A;fFR4?)A>%8;2MyKJIy@4iFlKT_Y2 zIF%!beuw;vR%+DH{tCFIv-lCMDb6`9 z3wMmtInd(h-9*1%8!2uoFRr^=ZK!IJF9$El~dUmm!c+cXgUgW?R7IBnftia*k>Q{Sel29?kuin z<|7%he6L~o$GCPn8n~t1M&eJB4zErbk~Gmm0Td>WGR`$jByf95Xk5?*?;DwGcMS%b zh)D%5&D9upeoP71DfMeHfu4Dgk$TCmcv@&>7`~TkZSoLV3tsBt1_}RTSNlnl?74ZC zoK)c}JhJ(9uwR3xp%#~Ia5h?wM=E$Fn#X#{wLPgO?!I8Vg_dKGUl@dT3o)P;WF^WJ z>Tz}9@Yq$x_>dJ)g%9S{`9?d-3?gP~OMmBr`vqItY0$7v6Idh=A$1&;BrrGkX+RhW z;37$KJC1DY$P1lONtdS}JEg-&f!8+7AU72b{&2`A1ltdp1m(xaAK(u6&M!01IgiI* zu<9SUGuISIL$=4H$~yfLxEzXEv&?JS++6*MzK4WM(Fh82Ehp8R*jm6tlJH{$`TSe} zGpB(6Y;jykpR+uao@wZ~cp;t(RJL>XJ5qHVRKnd4Wy7hzst>Nn;QdE=n`ke*gU12-lz=gyI!*xerKor^3*}3vHF>xO<7mAfeymvskL? z3+r?AgGS1~KQ0ZO8XmiLxX9~wU4hKp@$3WNV$$jzA<{g^TL&Ruwt@JrhQ~qtsswwg(c{q=`-h8Z_wl|0F==8Yr51;%CKP6D3PKuHW2G`1ZEs$ZcK&AlN#9$rU^tsa8peTM9jb};TzSm2nw`E zuOz1{+G!L}LyYWkkQrvHQ%oDVM9U%tDT)n*XJxw_6g_yFLf>Q8A=3g_dX{6^tvkWE zwCz4mbq7{_hj@0sWF{aalAz}&1qh1sYAU)5y z-hjKsN+=o@Y74N*iQapJD7k#&a3KHIn7Rw}_-^u@_EOQm7G<-lSw%PjJ{iI|w4`?L z=iBp){M+?S*OpUbzj8PVTI>BMW74+Yy7cV#_;EWOV)aJjl;9rLWkc zdBMk}iMUyXUiX-7dt7Ik@li_e!EN%OEmxg}Z7Zgl>v#DCfivbQ_yM-KB zJ^tnEez>JkIFkC(714mKdY0|D1ykdmmhtIxsc&f1F0W9Dof}{A@p+gB=_-4@9<F8&8C2eL%>zSu>as z6K5{|$k{(TUwan6dEr69)xTB^#D`84l*{urAJzbxqJ)tyFNY$j$TAoo^ zUcGz$1V+nRTtCb*FXAdQmqwl+hUa6g@tGOB^U)l-8sruls4}cU|+=%K- z?d(M0LvT=w%U|g6FA>YJ6$gG=AAIj`98c(QW;Lp0V?-!!*DjNmy{zijp^*%hZ+YC_ z6#w^N4iYN%!E)T9@K^Ys@rgB5R>=YzPW|ic&>t7wY=vo0C3pJqWEE{}Ljs@s$I8_c)|Lhj@QUOfAKpeD828Hqkqk^`;y`AbDVlJm!*D}+BwPO*1=I~JXff% zIyr?9w6fm>{8XrbgXv7+t_rYzaxE`u-<&ybZliaUq!GE*q}&>oxq-j0C#hPN*1rSD zUVP2y)QO!_tehcWZh!s-{;PLktIZPiW&A-dex6%b6~li3pwNRZ!nFaPS{Xb-e54Bb z%y>#u>Iy9@$8bg?q-u0eV+>3OqwpGF+WVE~6q~(&6k8iwy$7sm8B0X{RsE4w`f_lGMC2RboZ-|P2qHGc}!r=XEaM^}6EMhNF@r)|)ppQKmfqWbL?X_&h)X#89 zAx_MQDgtDmfWe-dbHk)z_Ox@Zb+rOsqhsVKVzlP58)RpD3rQ$#w|#P8B71Y#=kd{w zI4H*xI3DU6Q!&_7uN)`-S3;Y7ZGX3YF#}yKPkmm!_KCxP``7#t4yF%AP@?+)cS+pr;db9PXPaHmnAa6D*VK2 zrWRK-HJ!6C1qZk10A0v;R3%p$elHZ z#-N5}mLLuw61@?NX@fJ(i54AkU+u5ywn<^kxew!(3zs46YY7+1K2_G$c!`|Ez8K0k z-Z*^nTtmpozh?C5nzToqqkf%^@K4wA@2=HogeD{R|HG>9@yCIza>B(hAC_jm<$YB} z6RBHk>l(2W|0>+(Eh_$^X@%d!GTZ;n_{3(axvhrV`JplV>@QSf`dNb4s}Xu{RqP84 zl%eYoFLiLCqlG@eSU-eSpS{zxhrexg2HEwfu`K1=M*eQLz;hN~koOjI^|tUgKKhXZ zdSCg$>Qxgx>TgtgpEQCWL$mWDVWxu{eLX^vO{o?sH4y9@F7RE)ASaDNLB&DmXM zAq70GNYP*!v}!S>&qetp6v;^8(_Uvs&NY|Cc@JK~8MkOYd_o*uSZD*dH%{Gia6#^! zwAM|+%IRCQsTLQ~+=N-rGJ%j4EaRWf;i682{}5qQF02MGgbD|k;)DE{M6~nAaL$e< zdOe+6szv&XMS2Lu*4EOkO5juDp}qAG^Prcx6%t^QrE)z(#RXDrACrLMjN(>SWEVwJ z5-oDjjly&Fc@0ZD#9s~4Ggbhxu)Sr|jiuG2!Ba8^=vp}DUL!Re2<}Thwlga#L5Rx` zzNCT3^>z2!cgOhUoO0wQj}*rjBhyR{J;+UakC>Ao8;tB*WoIdS73wizW$;hix)&zk zbo$o9=ym0*=D34&Ej3ei;!XGPS^Fh~@&q+c7LXGnCV$4Oq00`2k<46HpA@+zH+Z9Zt(P7D zuIse9W3KX7IQ|>cJb$1kTC#4?vbT*%ePoAI)gR+Ir++<@jA%k zDZ*Xp7?Cn0@^Y2=rdz1T_p|jD5^63`ccRyMw%(+Ir5(lco7`mdt`${Wy{_XS*k?@s zD9)yt-FoJq9S7F=W~7-l5mID=$tUiFJSiUI`-w{NWmR)XIWX)Gqg|fcOLfaqzgNvy zaAj?KL8RY(7tV;`{!e9hy|DPA8ZTaU;2{Dy@JQieo4)L*Nb$j?3F?|y50PEuW*LZ- z@!3UGjm2(9gk5!KF(oP=@cZD6|Av~vwoM7fd@$1`SQo$6*1(}a9rx1mdwuDZ4#HeI zH5vsHXEUXp&f4S74XSQd_m&W{6+XOvAfO*oQ@6yBxl((mX0Kv5Eszrb?(ZB^s;NiE zJggJuWINYpk5FK}6;w##7ebgxZrjUZZbrepXGm<*?)U(EsE6UsVnt>Aa@`$05PSm{ZV9Yr*XxEqLie8{~ZE zOpjltRf;yfX5gi!S)Q`vvvv1Q4s_LOBzwkTLty`C&;Eme9Kf4qT1@~-yT1d< zRcEKwoGPCxiLO5fX-YmhcB%wTsEew~wz$+>Ls6X1FfTvoGf5%>H%eMsaIx{NxfB8v z6hlLrr>#v{Uu7CBx&xJr<^6idXDl7 zyBi4&nzrAwNeYiQ&c3Pw^6ffZ4z_1qb0=;u<$o#`+@o}cQ!}8wlp>-^b#Db#xN&de}c4LZ&)y#7R{E+ASTO6z}9%3-EBsMZT z^$yO?qA|-HZ`atHaw(k-5iF}5(@!x~bkgZw=;JhcJwJ#e3#OA|C$723vHe%2t+ff; zR&CXXsbz;y(!klLkFHwiDTS4(NqWKgeukus&X4L-;tzu$U4h{=yGTkCN0TqU0TEuN z7P{<_=uj=1>pYRoAO?;NE&Qu#RLnkwvkL`5&WS)5YFB5SdQypEh=?`1-Tk>tp1|n> zyiOI}P9wUb#x+5fd&A!L93!)B!`m_btdGI(E^YyIBH&>`?4`lSsz$N=u?MrTyYc0d zK|!<+Q#a0auovI6WskMEU5GuBnm(8Wy+==2NVZ|9IP7g)!KD<>zhUw|i*N`Oe$Sd$ z!Dq$yNIUzu;*+0bpR0hu=_!vIP2NhSC<%viWo$_rVA$Yyj z`S!9ze6X`YXF&hNnXq1&`1-s3Z2i{y53rWJ*?WKa_!xI!ohrO61AvMSK(Sn~jo}w%x4mD-Ckw6+vbv?kK+E zXz(hv4?w4i2;m)1D3#m(^0>K7v=efhaC|sr=YjMxYGHk&ibJS{3@(%J_aF-eAZ0WTlwTMf~ z_wOMX7r-DJp+QGm;jSuk7wpeE3NR-2`HtG+-1do6;C;4&g9?{S#{8=iZzOd5+iU~4 zwYTGxiMqS6Yq`fA1PO*veI0c11JYh1Tv6yI;`ymSYas*GJj+mHP%)>I(xSPdiaYNO zLHf9?{p~IQUl$+x*eAN|jBFLmh2b?%3mQAryMD(EIjm@~MBX*OI*j3?`snk2`Q zzx3a;lofW73%2cO!}SFE%{%Wt$tw@7yKTWof}8m8TldZQvlI_?qgBd2jqwkxoxde; zwK*roL}K6_RmUPTq+bN+h5_=fpY;-5)f-c1MBU9?9#K%o zSYL>#dYP3%+8F#+{5o9jBX5rRP!L&3C0Wl=o$&qWn(JRTM-lGFus`CE(Gi5y!zaZt zg(f1e0*i$UZ=NM2xaQXe39P#8S)i|R$WKkUzZZ6Z>i5J${{noF9AU*Azsah6#+{-q zT--A=ZF5k2h0fg+A$&WV{apT$MYxR@s{BM_*=QBT`1HLJ&&vX)vm^z?^XhkQm?qP8 z|62)#6D78Sa`pHlqCd($ii748*29}vrKUOJo8(>BWPL z6Rp#3?LmY+^=^nSj`U++uY$a~u2LmYNUvJO<|TyE9Jl@(zBW3Iyq zZ0YI1uoO$Zs?4-RLoGW@4`FjV{&R?;p8ZaR|@?O zY+P5;qRHfhLP+{_pxa8<@@HmWHb!2iS?fF`qWe-}!bV zJ@Jw6P6i&Kw|j(2Ajq(RX}GY;ofYcah;F)~n!Id?AbEsSy}JpB ztE*dhyA2`*aW8Ob(Z>SUf0O8TZ@WBpi<`5qz$^qs?$zvW_$(iSko?kys@YNA%lism zc)-^yIs4lRowwsO59?R5D#FHwb*q++nXJT)gW||x#^l5ede^7g%Pkc`aGQ*=;M#@; z!R*uZ9d0nd!eso$Hc8dd=g>76ACkyStV+GB2>51bl0~yC<#vV*TW=3(#M%$hX5y2% zy^G{Y5s0IY-wpuiCW*nX!UYu;X&ElHSG3=(6v-R>W#7NTomlkj>_R4gVAl_BHO`eP zj#76w0Brq=?M>L>gOiL;^PFV=ABlC*ROzV$?Sp%QRV5l3uiQ?(&_qJU4mT!4&^2S$ zfp?p3r0I~W8Sls93#;shS+xc3&)3;WgFW)F>4uIu)Jangr)-F1)-;;Da80cI&>i!F z(iZOF1JQk=kYKiBDBK;d`dkJRck6k_YQ-Q=<}x8D#2|373hXbR_#?8Bc#EyBI&RRr z_$!aowj=RY86fGDSbH3I)3o5}gh@>Rsn>)1*%ZlZ4tnNC`+5I6ja9bacn#g1Qo4mi zo{aU+|8SSoc zhQ;n{Vv%_Y-3@>)>0cpEcbn3~mvCw>3*^e-7mVBTA0(Fpo;$99n(ZWLe_za!opTp7 z!ExAjl&1V-18A@ZWU*)w5r2p}a{6{!%?j4)V%)!)efX&9PbPg_DEvzEaAOJcdHh%@ zbC{jMkT{%h{AUzYY~oLy&w*eUhk2t+wTl8ErKo=$_w|HHOjT?rPr;>O$Ggi_r{odN z$19Z<-`i85&_#)`UBJ}1;lbAAyT~ircY$T`6Af5ZM$H@{>ltNK6xFVDK<(kbpygby z8tzhj^!oa%#SRaEbaFKUBL=-`-;x+AcJ!Xzz^?+_jX7+uQIvVWf8mFn5n0UUK5WFH zd>MJ3lk6}xKC94~RE=lR75JCty=3u6BO}ENM6;_1o*?D)U(Oos{_mBWphx)a6(4Py z*)(oO2at_c$vZOq_PY=?p4H9k_@%n-^7o0;blJ#*AnxS8ty^HwxQQER&SiEn>DNJP zbSIx}tDZN@E>rXoA zg+`{7vv&+;(r*h+TzdMh`-Nul=Im_F2@+-tB`xRf^{Tfz3Q5YoJ^(Z?H%zRc$O>BT0##-XJNzeaonmo2?w<>9UNgAOoPB(%P zK5W-yhqzaPzPY0L#p6S`$v~n;_OtbIf#n0luUg8RJ{v`Xo~C@*Xomht=~OZD(P?{G zWps_}bp3d(f(v>8Taf{W606g11$Ugl#7?(4+w>m8QXXIc2^xp3ok>97mN*;`br_-F zKttzRTzGp4Z;cKdZ%`g=)8Fya4i+^&Im90yJKR&L=D+SDU-d3>aBuu}!;(*MTUD9< zO5Jm5>i$fMBc4$@R-r=8t4&ShAmrr6p0!=sch^*T%+|ejs|X^taB%%<^XMMqPZQ$l z!uI{F&$zrrD#z$-!9YzNOpyCUZ(`dk-*TD=J^|&_nj!(OQ4fsGeN8j^FGg&qEQg0W z|C0~g>#}w4BRPvbhu%Qf4_&Ymvu+94jTKt_2dd-#goldn_w*4rJgdS%y%3)Rb+1zE z(*65lCA&8L5}_UdCXv~?`nh!~%*^;*2K2#z^giozhp5xIyRS;OZiGB4^9dBn-ksMu zp#ztbQ#@8y^KUXZga#^41hzS+uCF|J5zT1>i#v~-T?Hep}YH%Z1 zJ+C;7* zNETRNA!

;nP|g@_Ms;c~>k;*y{ijx3-rd3~T9_J(`cO<2w)M{yZDOS#DxW!VdK+ zI4$IY)jF$qhqm{l$j`LJ(zvhxbShYP_lHbaelr^yAS~$!TfA~L z^S!$)c=bfI2NjPgKD4Gl^lYrHaaIQLS-RnYPp~=;^#q*Fyl$qd&xbd{#*2%6S04)> zJimSw2$3I@TzP$iBSuM!R;s?VE-ckPe#nXHo^?LyxPC*9*+>Um*znuEIDw=Si(1Nf zHbKXck|OH`K`HmN8#Ql8rnWROE-4?zN%mxzyjOm09 zlh;tF21{6j?eBhuNZ5I#j}8K#1ofXrwiPuIZy$B+*pi}UnsSR>00<3}`ONH0&rcxQ zy=Ri!c2_;*cq+8x^d+^lv}44uj}rI%-Y6wY5ALZ|>f}U^3mSmw=Z!-wl}v#v?4N5v zVTxMxxU;X$9}T<2dvElt)~dtr+K%UVhc4`i#oAQ3KS9sK8i)|T>D=v&kjO`Ql;A`fB?mxQIN8pVb}_CNArf+2tz3(#8< zD5WHb=8iL6Ol#)LsC*)4>B-6Wb1j}iw`A{=t#3H;x&yqSg0lB@Fd#M5S6LKuYkD*c ze8UExHH4&*5R#%Z?H^ZzFv?yuo4D@HF`=y$GXDk<_j`jw^WoujzISi9abCn}zc?;F zHI1M=+||GF{IpZ-9ofwa(?I@s8&l{~tYrg<#5pb2MGKHCf0C6j-IK)6-?@Q&7x^ma zf{-An;6awC72Quc!S^?nq8#(UT-Za~jGSM5!mR*=P9 zv>yK)l$;#!2M~nb3*kTsn8{#%9d%u`mLL4=vb;xaSe}35{9Lueq=|HpktJ6Uih#X| zoy*@V@!#Y%7N_$iGs3)YHcUvznLHMw1$1n-?A5>{ORY3PoM%}7Ga}3*bY=GZ;F>pX z$Zu)De^+c;VImRhWy6IVoEzV}cg$MUy~Iq-$$m z^So2j)L5Hc{UnI(Q`0*IR>Dwyzwo*FE_TN)h#p|ai39WF6Xok5b(gxK$d!fifcYYxyE7l37Y4F(2AdkQpnoS@oiA3yn5B8Y^~K*&0FMl*jEY1V4`?F!8zFTQX9;;qB`-aj7|K8 z;=|(3Emvjt^`!<0$+^97&pRNtr`FgXsVnEKslb(|(Y)Cv~+}`6(=mrVjbx=w7Po z9OJlxNT3TGiZP^WJ>9A`X`-x)Tc6^kv0PdR#Sgc9dTFvPc5%CB*xFZB3*~V!c0RQZ z$#2u=khEt;cylcDURF{MH16A`ns-790jM7@JGh(H`HEb@kD|wavUL)FKRX>$h8zSR ztwa@VJ#Xy^-V>F((pd%;jdqv*@$;6qvBA>#i!8G0fL^=8 z?7^-=)&+!_6_D%Cr5{pGZcuk0$VwZ~n}kh{{l<~=rcN;Z%KQCwP;uPqXX&!u_)QOR z($uGTvDNJJ=R7!l*p4@gQs%iJ5T9zKK&G|#_;5_S&Mfa*hdyKTnJXE<*XXobd>4}a zeOX>=fCV^Z|3vD3k~tbg%qqFyK8YxgFF@Phz`X3(?HYRMaJ z3Bo?MsIr|#LnEJ8p){sQ=Tnb^SL!j#tr1$V2-OB<$-OzjqmAyO9DHeRv60>?w~GW| z2X2(ZS{vWMIAIT*mxhMq)pqsTY>Ja!|BRViYdhSPSBij}JmRF-3o!WGf^~GxJ;Mo? ztKDZ=bPhim&%ci}m1yQZKk0nGYs*RJm#^2g4sPM&FeBKj@Y zyj%Y(KnY-e*x#1G7Qd;SP}(LbeNGgaO<@T$uQM#ak z^ywEnop)-9KLR&7o!F>Yi>1tv&P?Itc*d^thhDLw6qbYcvA%m}G*$i`UUXN70TO=r z&EMa1+{wPa9C_XvDsDoWjsT%o-VJ2?-KBLywc)ZR8TB47s)BgEgL+fO63=E zJG&6=naj3qZhdrC9k#K`;^gLCnzs5G0erCGoHLPG;%8ct#k1aJ=MaJn_y)axQYe$~ zmOzjKIzK6i8y)4k?D24!hI2FUxTEm>)nf2maE*lqE__i8aE> z^(>c@X)h@a-wej4G?e5gdLkK4mRdf3AiESL8jHEMhVRHO>nCulMqVYA zse49wczm^PoL{1!2YFheYTKG)t(p1~G9L1F)8;L?MQ26eD?f3jOW?cNb#QPnuCW}lMZR-DvfKN>*NdIK1e?$1XUl}koxtD8{oH}tdL z5ALLQUx6<(57pplEij9)D>rf&rOEcb`!%Tc-g)ssA>fRmLq1fQZs!~MBpEU*x!vjqG zj^01&hYDXsPJq9}K!t%#vfHd3 zpnyJqs}2Q92F z{HimM`DLcCt=`f>ld^p~gaoNgasP{I6mvmr>HL^HuoUO3{xhSvcQlX*)kFlc-vOEL zyoGgX1{~#+I@g|>w?>sDc;;bxxz7kK9pv4ryFc7I-cV62ia?F+Q0V&h;ni1910k}5vI&g>cFznW60ZieV&<@H>+Bf6L_hBxB8BHkcgK(8*(&cd6|GXSsB(D|ulYX2}n1d(9Low3;Co+=m+ckc!p=Jl7! z>n4Q>8p`C)I_H|4F3G7J{}90S7Xa{G^|nmda6l%$gOXsudliGGEt_T~%O{P^w; zYG@^X^fvR`Hm^WU>%c0>sH5y}rT4Mf-bnXts2Pxd^Gfy+`^57(EpI;x<(w?Ji}xrq zB@;~7cZG;sqF8l;=eCse6wOJ$_R1BK-%*uvix=+qti5x(HnUw~7r2C{^E&oHlJS!? zg|LI0e4+Lp8~M=n-SiZ)ZxBt$lPV;3|MAhjz6-#V#pcnl=8pbiP?;=0SHp-ZfdvMY zU@QDQv5?oa8+fPiq>F8bDFXm(?KZ>_!`#$&E5)z&;G#CtAS1<(EYaSC@88wToZKEl z8#n0@xnve)G5ZYJX}h*l^hy%A2|5CAUdc<9SNb+kb}$jIv- zVl@x0k6+*xHf<3R;vaM*1UzwQjs^JxY-XS-{Q|hmH%nXEYk6jqlwH`JE=jH1(25_1 z4gLnR4=3pk->Y0o4l1p&DA0mYg5vk{U;!@sly(QFo&^H*p07tqO{snl)#3vm`PxUF>Uc>x}o@yI=P|`2H$ot{6O2Fg8r?nX=c8br; zVXo_h`+xxdim*%e20k>k;rU-G^TQ!`eZFa!m@Bx$+kHWW@9@F2#`?0L1Ti|~iP^)~ zvL5-T3p=9ESB8nH0o#gU-nPiazbtDP>&IZ7Z5*VaRj77-SfRv|Lm)Y~a|j~hAdQ3Q zoolHLt+D^`pPo`E2`;U)<&^$TENLViqwF7(+vy8+qj8Rg2o##xh7^OJABTn`7JpT1 zMG1MXw|xZEz6#++vGk;btRzd>?>xd)AjvL65(JY+${`f-nn}}aN3Yme`AX!O8h%{duS#yOVwYSg6Lv{t};b0Y3TX9 ziEnKi_Ng*4o|i+ShQ~PUp--mbcc0)QpJrILmC3G5N=BrYhi~b=`m9o(sk`vjxG$L( zG=w#C6A1uGR?qo9oDA8Q;P?2Llxh?ITh9xzZlEQC-}T6V9!&EOnuwg4sgS_2w;@ko zg6dwgCWOUd1A`MQy@97kMSJ5xKvbNkhQ0>yanZnXh<$__|F~tDH_~Qi@Vwa5v4VV* zQ+yo5%}rBP-UilI*Ep)0YGN*y3r)V-wMwfs^qde29;F5N%Kn3r`?*88+YIz<=NkV_ zm|(A&MPtvOT^VYFD7d}iYjo6qHWR_!fFbHpj=T1z;kW z?#%rrheznxtCW`BvGojAKRyGLaG^X0Fah7M*J1TLw+h@MM}QU8OJ%^E+L6UIm(HTt zh2W4cS|MHDYRi{EdtLRAqkEI6Xqj-U5WW5s?p@}QGH?SSevzBme@>DbvFmg}PoOJP z!TIKg)30R0+I&RwD{-i4Q|F#LmE_jmQ3b}O9Z;=(Wiz;J($GVso#rjFH{dhh~@2LBkTd1x_W{#fY`%-TO$)s4VR~c#F`D6|z(4hMG!=~R? z;fcbp^|RAidJGuNEi|gJ?D$8;1$y0;0ggDvkKOrFcIU|LfUW$xX8)3Rxk~KQ2ai{# zT+`JP4DmdT&@T<*ZV$M9<|1xSY}YOZs7vehb;nw5c(kuPKhi^;@}Ukp#q1NnZE8;z zKE{T*&u9wQEb5lSfhF#(-vfSgFHxc_$*Js@^IxAZ6u+rNC}QE)e%BLr0=F=Njrstk zt$TQty@UY(05kWt?D)?I+E8$9b+0JQmF~_oH8Fokj4YK1U-OC0-jAzRKYS`3{@S^*4!VV_b$l_iJu~AvWo?pMpRvI#wvPIbYX<+R3Yo>_yst;q z2FNa-kv_z%r>Xu~Sr<+0ZTy+IALh3+{vT>JgZ&Ks2M=>JM>Lav@ey;Rr}jgiaKO!} zv=_u4mzR=Xj$41vQ`t>UCf$d4hqF=VeRMa0?JMfHc+6V`|C&la)!@K|dstM$J@tkm zi%J5AU+=d~&j5Zo-U!4gUnCcQ2xA=f>wS>ik_^Y|xfUxl0^hGdk=G7F-#h@JPBw8U z`Uu&G4!@?)Ch+%?95;5FR=?yP+lo1h(cPf2E4Gc`^eiz63jouxElM~pP8A$i@qt^M zB_Q^EidOIe7=wV@@fnC1mF6gATs_!(Zduw_Qx-q|Lzy4fak53B_!Uga-aezp}5ybvufc85n7Fm@W_*9U<&57J}K&4(CO0dpy@TX);?w0VZ(5Fk5*C3v%LE zAFJfrlvVBM!%3DgiYPEu%w0DX9&e;cycUWKKdig49RIrno4d!{7dfqMLB*(ovu)7s zA4DlMkH)&LL3$a#Hr0lwrJ}XZ`|PC>)Di1V$w#EG=-tkmijBH+CZUpbwz$5zAoW{9DN?9F*Zdg9YzPY znHF}~e%q?Ta7HIktaDH`YaoE_JFW)rd9?eLDDCf?g7LrscQg98(VJn6^#&2i!pVf9}}KptY0N5!1-vMt~;_zNJ353gv8UnD~%38K9}q=M~&*$xviu zgcth8*I7Qg!RKFRxn3pXKC4LCNZ_IsfUx9hsJcIel3{XAt|mI5VU0W9g~hkbusz=; znetgp8DXZ%cXz+NPnK!M(RuJ5OL>h2pi@-GyTbPR?SqLeijN%Zrc++eZzEdimb<2y z5$n{&5TV(lGhYSxhJ}tJJ3>_3V6O+Vi;fo7?8)|OQ$5gHM^16671!l-l5zT)wD7Oo zNjHO-$b+px7&itNbeT{#xZnAoWi`pJ`H0VH&UTT-YWAf6XrOh4-C~hV(m#55X9`{R zzGVvM`H3?1M0uyaz;_-w@-xTjGsCgTuNLB3Yqtay_3vCE{yNCA^?hEj92v*g&zqhy z9MYS|0t)Kc>SGo1bu_%dkE5oCAR+zrSBU{)T9|)$gk29 z_oLXJ=9}x0GNq)e^i?Lo*%-c1uAfA2fErL=dH~|sR}p#0^!puj0EKHv`}2N|I$`4 zZ0`o~RUECeofH8>?b_YunwG5fo_bE}fI1_d2g?S`K(sG@I4go&9mGZj1tmN>a?TQ_ z%+;S1N8OkD9|@dTG}^-<-{R0SL~Y0RGcc7K43?$E54^H?J~jYoC&oZ7(`2)TSw$-0 zirAj(iin;&8p}Wy7hrwSn`ISL%GRBjK6`Y@g+tHHLnYDGY1(GT!}E+}!<+lA2ZfHN z|KsRP{F(3{FkY!tWJ$S?q|zaC@9X|9bBRskU9+}U?Q6jz( zK2OD2GGzvuUbfKd(yKoGu8E`WaV2DS8`%dJE9ML?uelM!g@C_pxuDGhVN{2lzQY`2o^VbkIO|!?y~z=JOqO%SbcSj5Vm7kyckFGi>qpO-QLh@K&hIV% z3KCDx4P_bq-9-_oc|N#NqQ6jCjO2m@;|kPeuT(3YGBx?g@6ZhteW+>s4*_oE*Nhl$ zZkE`M0~O=CwF&8~BO6&NJxurD5&%rNy*P;zyW&D@EiBxUk#3^sW8iw4E8L(c57fHJ zImao`hy7i-`F#%io94jz`vs%K#W+uBZOCmD4d2$VdUk`Jd42%~#b>H9tKy&BUy@w~ z@%jLEb6?G7Rl6u5j1d_GC}EVEULIN!R(OtP=LZR(0a?kwyi??pISK2KN&m?hW z6J2gC(bYsjc`sYt;4|d*mYA4&HwCM-<**_KRJelz>bT96`SNo&-2vX)PVUqj6flE5+~3TDH?~7}i?7 z8-4MeoZ!mr%bmy(jt%g!Is=IjPtU{xYKkB#IU)*bmSs+DDI#6(%_zs0Zf6$D>q1*A z40@hUPPy0`Tw*=gU?<=^Fn;&5bNgmr<75J8OMAZ<^^n6R6RE-dO$vO)+>W9h zIER*GFT|O>aR*8~^EFx$H^U1rr`QSgL*PxUITff}wuqSGO8iiy_3a#uTy1@m&ubs=GXXI>9I=i+_rx=%wMG0P(s3K{!5Ghay(a^EXJW7P1Y$luOY+JJ!ST>ED<9HopN!GvHfReACRi$KA*gI z-X`>=ldJd`U)ZSdT(i2&-V__PT?g3$D7?wc^F#g@g1nVVdcw3gw%2b5RNZ@Ep0idA zMt=0Vq2m`+^JN1m6(2)^izv;(keCCeH4t0#)=D$;97Ar}mHE${$tr=qChrch#O|SC zh@6kEJt_GBu4RT0G9PS)egrFx<2|n2ZLbpBzTxv|lRSyLoe*~%=nc62qf8mkO}qyl zoN^GYF8$Q9x3|#Gvf?SZ2hF69L5uRE=IUjgtE2RnauK%xmD?>x5ZYaGp7Ay@yLW{e z?k9bWae}(QKHv(QofW0F6Jn)>_KHd3ooeRr{2J;kdYt=96hTaS`eMriUf+y^4~2BF zqY)bdnLGB+p#D(^)|6OEyd%f6HQIR6pc4GUPn958yI(AE8&`F(dg zW7J>gl|i7pL}9ON#0LCq4HQeS2i?wz?@R(Cp2#lg$dC8D(68tgPGlNOZ^`D5=Ks?t zq=SknJ0w5a1Ki!wV*IeGr@NlIZKKmy(o{?b^nLmEQQ!0V1NP7uG)G)hd`ewhK1fe$ zZ^z4QBD6PHME55By)mPF>5kmv3j-V@opiHDbGsZvKP7bGd3I6Kuu?;OoYW)kad~#J zv6r3qKtf%|_u08w3*)+p=C$~4tB_o(WkD-ggL&ETJB8haOf#m*PFF3$KRv|{`kGxA zuYZ?B%#O$!t$|@IR59EZdULAp#wAV^U{S6+>{NFueW~xmQ`)>g z0nnKw1WgNIn07n3`TD+#^1L?K7%^xlIOGB1(-o8oLu%g9(eNeqnSKnavrE24Xrwpw^{7A6sYq=)K z=4PIm+VT92mtB(8yJPBJ>_nKVdyaNC2AgB>@rOJ!0bShIe)P|nb_0c=eg=+DiRd>f zWcYN)Tf7!=Rl17kc#g|DZ)tEcDOl_*2_+)#|fb-j9 z&4Ka1M&XB8AIe5%?v7d?8j$niPmdKWRe8mlbntQ_R{FJjh%h?6 zp+2eJ+^Fe_FhA7fQAc%5NdD3SISZi4?;ko8?kLjkG0Q|%6vqF`ub|;FwUbE-yI7GaVB3LT^tbTwm-;N zNp`+ll;Xd1u;)i+J^fU?Hrvh(-4_$Dds+&t^lWq5GiYYSHdHLbUg*v5b_;XHA=PiR zS*vO`t*%pB2BzLXc`}K}0o<+$e6)xkxZ`;w)di-l_4;ZzXlLlSF}cev^x8GUE-^}F z3BvQTPn1(_8|1se(OZJu>(|Cs?d;`rrUn$~I=y3ox0v_gjPsJaxms_NoIpIBUdM>3 zep%0Z|4q+nL&yH4rm;8Pe=g!2-!-D!>~KZPbzf75u*%w-gN1-i+I*QmcT6vBzi-XQ zE7a^&<+QZI>Zie*K0GQafO2I|gf@F8jy<%a7D~HT9X%x`EET~u3j|>~J>YFGrQj&X z=6ZQJbkUN`+x8zy%aoEf4!!2^Kn5(oZuW(pkW$= z7eGz&vt%(xQ|YVjwzjR*XHt)w0@cUCV~s<0(=A@FB2skJHfAogKjENv7x6q!a&F%u`#o68qP>`3X;=9H1V4_-|YbJ|XJ z9@U#EXv{`J<1g+c*LTH=32#k&@i<${qaoM^9Kh?_-UV-7y?nPY^Uvn*#d~hM9o<*~ zK(}tZo{Z6-#T+l=J(Swi(*rZNSO=x-E3@1M@K#@C!A-KKt0#@o)F5sC7-K?fT)t{l z61d^D`GuFmfUH`?HMuqP%x6gV;h>mOGtaj7!ESk)e7xg(vZof%XA;2EcPEOJwN)z&e0K8 zYBcLAnE2jWGjym`)WP>#Be;oc#0YHWJElasgtTEJ`*Dpy6*GaS zI;PBd?2L&6C33@S4rFY+DL$#HF}g8SQ7<%#d~~2Hm?dhwbAQV)KIK-G$w{^KEG-;k zM@TS6B4n(oW?92~q2f_AeM6PhcNsXk@E%_)OW~aT?@$rSpiE|B-vqQ^(TrJEDb}jRYB|iz@&8>i%U(ZHITR

PnF%9YC$4@YT~Za?5x-#7p2mB!Z19tczo zyxk}_OK3h#Oxfo%9uXYac)wz)PT{Gih6ae~3I9VaYC2eymxI4OK-rJWwzPi?q7vQ0 zD-ip94PsH_>GV<}>)D9|(1?APmc@Ld!%a6179jkbd=J*qXEg;h8EQ?nl*@`c?`!Xi z;>IEal58!+*c8x-vj;)@p~p9RasG7NC%>4T`;MFq%#Et}X9zg=r8)M(36Ru}+5a+n z@uO)Of&4?uJC1itp}5pHX4*0(Ut@o$vRO|!Lr$~fY;Payf4~6+eU=!zYPT~(DK0+g zVcK68W<12tcbQI?8clPLj;E5zxlTM8h0IG$C`;axB?B^TzYZW?k(&Ud+42^5d3{Vw zXFudEqN{wsbN`%z#WMc3=w#_MPWb=|(N-!G}(SV~*Mhl}~_$Y2CqLehY4 zs?DE|?;uAdpR{TWqJE3V)kYXD1hkvG8&fW7$cBl@6n39ALgGwCBzi5rd0v>>ns!B**{#l-1(W zv&8CGpkxxHvR%HQAAua%hZ2PqnRvUd~6Z@PI*!UWtZhYBz!<|O))hXJOzeLPFYc%M8)0k`z|L}!O@7Or0>TQo%c4hV@ zNXok$?QcdOxYWe3HMc4g;@EYu(_V-JxL!Ti-tI*BaZbv!$DtXv*Se6$WOHnoh`28= z{Bv?2?ZpPx2=-E2q1GA`wr0I7VJlvw@j+!ihr z_&!i&ItwVQ8mdqo|LRV1T6wrc)KT1O|)E?jXs}$ zou?f1G>jK7IyWvdCD&yEqJf@yG_&VIyn|4>tv6BG!)$65^zxT*_}+--O*O^h6}MvL zw307@V1jX(L31*QIjg04BMS#L!;jXM4LdRwe9`A3Pq#xcjh{aRqkYLsfPs`e%0=Nh zNM3pp2TGYW_zNpL%Hg#J6P0CE=G|=Nz8okhh+WtafI9ts&`n-y3{s9WMK?O)DAq8h zJ~8Uj5fM4+NU}!M$Q4=5gd?Hh3P}pM@g%_2TKa$&e)5{zLHlfa(!Me&?V=4l?4)nF zdiHz4WBupmP#Vq}O*Var6BhK0n`1*%i)j@;CmD0d5$9zV>)2EYCb&r_;+ftnWw{G$ zP8`&uFZZq53(e!vk&n9e632I>x<<>>!b1Jnc+O;bcEZ~1n#Ali6y=oa#?&O|L|c&a z`$gKjAS|`EcAl92frCBsG&(zkab}@Y%fYG5rF_<8;Iu>r0?GXVC z-yS*n--L!V#l%bfJgYxExSkT^ue4oH>FANx6Q0Y8e;eg(_7wv+y8hN-*-b=wv0ZxA zRi|GTb|K?a!*g}zX+&^`dy-Iu57iZ$(a$6f`j_g3)bBKUn&YqfrHz%Q-tSbf@O_QA zBbx(8Y}N1QtPB(^JSKKwl^#j>n8O1q#3Yg$@Tl43M+Sb&Q^I0yHbyA$bi3h z%cyUyUazILQ-~?`l41AO^Y(_9Sub`+7-TXWF(xhbW}>lpb|ZP=H&d>RVwpJr4Gr53 zP3zx^(P!;N-r-%qps%~l&p19mo;Vx39|Hjv8UBuw2n_=Dhl#}pmrqPMm|q%aMBFkg`u5l+uRpVL$-l%*|Yk@BvN@~S#Ap68;P#ypS$ zSrLfLuzr^WWd(qUmK08mZ_%UAC+||WS zNcN-K5xv8%+sBHz(5lm7gnU8n`Dk%mXx&qB;o^QsbXC2IJUGbhngfArB{ya@ZnXL6 zbwqwqY=72AjRUsfd=6QUx0fZZ>@8GD|NN&$tlI874QDM309NKnG`AtILBa$shBx9JY0S^ z4Qw>In=#HUex>%y;#5G;2HjCDKWZ5$%7I~H&KHAxzPWp4IGWrA6)pnOIt|MwhJ&3% z0(SQWyuLL3&i=EQC=tnbU-E^VO1u*;#+NHwFrFwePEVpNt@*b_X@1R-F;(m*yE{8~ zM6o2E&RBiaf<7q_SkQIb_RS%4ujNvZf;w~8Yl!cm-q-__J`|AvfBXP%Oic82UYWEwUW6G zIm!fhpWjHpw*%Rzj)O;EoH>wpP{K5t^DC_S{`;mNJ;HC61n!l@o~!NJW>g_BzKfy2 zbTx2Mmg04Cy=GLelq=|Nc4K_gMo>9Wy!EiJZXaMLJPH~sSsd`wu<$s1=ddq56H0sOtauLJ5$?~yimshLbm_~IYO0728QJ(}nV>DDrg_U#}f$A+Ov5>ftkn_jT z8p^V;p327>~Z)QC_%9P z)W*S>V|&T*{g$(w}(|~47$6gp%2+# zTN_y^>Wf>43Cy<8I$em_d6TT_&j)P+(p}HU-9mVzS#iXoCH%IqqNlZXzTA;;p-m(@lQpDkpRT0e}5LZ z32Rdx-duURr8fSMf%u4bXnVs$jk@c4K5d873XJDe#5-uxwUwK z;{RQIof)9AkD|ooO&E%W&h93D@$oV5$OdqqmWP$_T3is4X8--VTnJn&htYbZ;nKel z|GIb^CKSpKFO=k6=m(t!@9WSSI(LIx>!_iC!$xDqj(@!=o6hj|`lu*RFC4a_1ke&r zqX<=}bi$t7(PQP+H>X6*UxcpaQXcr&33VvNuVsB{OSL{XL`g_?DlbC~E$AR08EDjS zlivk{OBCuI%AYd{e5dY=YP)n8BgbNGrk4 zokS`aY}u4Ac?pfHXJ}?F3@x3!L7Ym%NeZq-w3j5GvUZ>HJ`y)^)2_9nS|!lS?CT3-=3y!G>Z=-y-7!FIxR@K9;ru*paFT}+ zPpH(O5NeLgD7p2i5mX)+@c+{D!hm8=H^>j}0C4qLIn9aq- z0Cqx`{zM10Mta*l;3fT2+y7gJ^@b6Lxo!SA3&CdqL8zjC# z6nr2b1{iI~KZhTg$}c!D7bZHh#S7d){p`Ah%<$JA(D!FPh9+o7Bw3unQ< ztG1`iQP(^if5*_z8e4RZa}r94rrp=}a>Um18M{Mrbg)kTPsy~2WVy&PNoSGS zaO^EA7-u*mB_;Cf$n{aO+mD7Rm(nz!z|%hg&aVaO;0JyY)y?VI@?y{o-Nn8)i9c%` zFQj$jX)~pT#fI0z6%VD;so=C`4bvQTaRyzU0i`?@_1X;K8D%>8Ikm(^L0{>|Q`4L1 z>Gj+`h>O2bzuN7sTQ#<=Ereh%s*X|+Y_(B`B&8Dqb1o6|I%9#F_A8ar>^%KNTWvMM zvCezeM(m7@g}(&(^5JgzCk`I%tM^?WW(Km)o=-&TBt#2?%op3#^?&w`20bj}bA9M% z^%@jcZczSq$L@8b*zjBLfhem`SaXM*Zr@0Cmuasl`oVBa6=P~$k@+mO`?01g-_N8@ z`O~X?1EKI5+i||_k0e}(#3)-y>1~nrx%U`YiX8YSacbItr8lhaNwbf;E@UAlQ=M=e zh5tIyu?AgQ&#gRXCb(f>>-Eck>-Iz?FZwhq`{Hss)R|_m<+Pp@jjwui276N};VbUr zUpD5uNo0XhIP^gKY#nX!jr#eM2YM=dUVjfcYyrQUrSy^Qs4MHL0x{j_*pn82?M3SO z=J!eB4W4Ub^Wy>%lJe_9@OIGyg1eE)VAS37;`97htQAhQcY$wV4wECR_ z`dO%sipia+vAM$Nj?NZIMR`ER@;0IhZ>*BKk{j{hGwTo(<9b+BaO*FKUpT?*Ktfv< z*V*o2(=GJ`6ME;n=)w{?gZi?v;*(P{1l16sLYV`7$)^EzTxS+zYt(G}v{=(ddm{vf z)QxMUcScGFV)%@BvM{4W|V7Z~Fe z_DY~xoO6*KHlU;mqbSsJ3n*8+Ib}eN%#tLq6#JSY@Wx!PZp>ej@ zWD<^)yabKHEcK>fA~&baUW}W%yv9V-RH4~tO39T~Z_YTWRy44Mk-`1OIjgZrPeWT? zU4MKJp4TOt9(d+OgxE<>F(ecbFsfX&J{fY>&TDG4uhdL1Su?c{cxi5>xkDD@Klt5U z;x}#zruNR%KHm5iT3u4T{(|Nr4*u3Cp4I&&`->g?Sff*Hnf{4>=9==97T$JLYUlY~ zSY;)@#KGe}(|#4zm&?aWY4+v;{wKbY02e$QA68illI6>jv;5YI@~Zm^8z!qJ-u;8W zwx2n7$3!lfj%;4?@IRKvw25s{SVkV$%^FGWo@MAS^7269q>+?Ns^Wk#fQ15>Tw}gks z1d&x|F>l!MahIZ#6CVrUk@w`Ug|HUy<*4~awXqZGJ-2t8=b3zN2@>OzK-jw=h$By> zMAfFeBkXzu2N?F_ZKz>(p@j=lWL*O0d)#;)dj?BW5=+)Tlv?y(G!il(VoLtSi6lz1 z)?RW)-d8}5Zp?4oGsf-OcDn>~EL?}|5)%}TL5*!;C9QU_N!${9f9a1kVEtTQ#wC67 z2^$JL$DsV$`Umm9@x08&^MqT6JGWNsE}i?{hD#X!%V3!#l(kzY}*G`g~$U!6q-8YPaYNuSgP6^bRrx}iZ71bc)6QP{5VPa zsP7RC{oc!|sG&HY%3~9(4KyMZ7Nu|@162xmw$7iH_!}I;eNQ}6UJPJBxd@aUJTlb{=Er2=mJ3VZM9)AMZ#}Pw7Q6}lS zHd&*3)k7&rLC54&~o)t=UM*D zX~vRHpaFY=a4b>vMWBzzCAi0f^S&W=0B8D)8T0qsf;v>j8_m2?uE)u7I|T6nC^$99 z`1Q1PSKCC(E1+Zhv4Nc`>Yhu68Qe((96zJ_bP|8jZ{t7zA9I2fBk3j3vAWVe_6B|IwNSm zU1x9a(Gjgi`rMkN+JYF+WN3L7;5c8zHNQEZd`P~^s>;zzH!ZS2OqVQ^GyEx zLPWUW1}n?cZDzl`VCa1aG1WvZbD=8G$fJTgfo_JM*Qn4T$&4RiJ{HZlCIQ0v+#?xg+Fh{hU%1IHftsOmORKj_m6PL9{mRtnY~Xbl}EFh z4^9S9q56mQJnJ^@U`Kr5$KJXaa<ya8~xz6BpLlXz94&qTD z(W$D1G#EPi85M82B2XXF--mX0k zXClmLQs6bdpKojNZ|EeNoo24SUHLv<9%U||pFWTCOFN>Pd-GLyfRA~NdKH_<1i9iX zulA2y!J_Vc2y!U@q%PXw4i3b8BhhaC+bBw1aX{5ls{_^dNH};MI4s5u5)lw9w8JQn zXX;&+Tuy}SWlZqrE?i5jZgJjCF(q;m)PJoQmY#%v-T4P-jRm^(_OqIpVbpda$P)$x zYebq6CT(J@V{Q&ayG#v5C(#+5nbQsMae#8mh0scadR0lYWq6k$$j2B+f`xVV!8-w~ zg@)+ra4{%dB`n6u&3O`P`d}-VwOZw{tX1>inLy>Q$k8P)ZL0hu>^fyb!mmq=X8Fot zD%y`*D%GG@n7jMY#q37cN|+%gjui`hoj+F)war}ko2hYaoB9OSOir<>j1?$hoUxo0 zVUBqFG@@qh&gga`poMB)xs2EM-TG#Yu`x~6y{l{WE$a5K2KkwDC%l77`uYizOe24G zb5hd~9-vN(@CMIntF43g;BU`C98U@vG(l5;)!DDhYS}xM;ufgew1xG(yJq;WU~?_% zj%sRL);)0V`=tS{mkc}zf2|7HDBQ>Fw;AnKy*dIY;heVGS>t%r1y(#sUX6QVZQmNk z8&<6OT8l&@zHV3v>uddhr_RsTOX<)>I2Fl;dXP1=3d%C?eW>S|9Dqy zD(X6(GF`-Li_96xO^*EW5*5?5t=dpOB;~B6Oz!%?QEQ$vPoqy`wnFwF$2ABR69}y} z8_ly#HmJ1oeq+EEfonJMrDK9^H*}9|?dL154~r9-s{W-epHc98wiDTcAkH8y%^-+= zMwgR=_@omsjXpkY?`T%GVe-6%z|p>oUzC%*{LfS0+cvaYIC!qgH*u)QW6^g(n3rOz z-3N7uTCVQ6dwD$>??U&cs?Arie+LGRKK2|0`N>G#py#7tkIb_+B!-u6kuD*;Dq4iv z(En^>cs-;!L%EBnq1o#g2*sPSNhWOGYqpdE&g^bC{fGW~SB<}lv!ZX|{M~#@a_kv2 z=rpt}-g=hee3P_6B9QVIE-q3fU1C^+f#El6;FG(SxW_J2vJ~444C4{Vda3049e;-s z+X%o>wR(m(T!~m%kesCl%Be;ODV(PI5Z>B1(bD4Jau3TF{cr^~5nZdXstV$wx4N;s zF{x3HcJA+_ZgLOkCTwX+y_)eZctO@t8o=i0=x)pX-}7-PDm3@y!MxKdVdgR6tNJd6 zf-kqz2In2uuy6U)AV+xr>2eOEzFrRzmYWhhiZXS%3jPi+BlQtSDT^Hq=~1e3y%}d| zh#u8jJMa4r;YT+=Z2lD!dzzK-@X-7@Ao#828xA(^V%03!z$J?$w0U{xKwL05jXzQ* zl=@Fx`*0;Ufnw@_DgL*!clw=-LbO$Htzw8mV#DY(v2%Mm8i;Awv?r1h2PN9F>rl+>LzQ0&}7-I7AFw{T^=?8h;@q_aBCe9 zd4oXlwRT19O6aTfh|zW>&!`=xa^!TEBN({nOJ{bv;lw?5&6sB| zyQ-kii%N0#pLFqn1Pj?#vwnB=5dZikhlRm3{?k@iWr;=38qhK7dhbU7ZId?kk!r7 z{*d=%#_EvaDc-*#u6H@l(F7Y@4`(^M+pX%|1MS|bVzX92kv zqj+`|$=6fI!OUm=VefhIt9UVA=Gx914DDO<+nrH@C87wI%LnyQ{deMBf};;#rprVrV+=Xm)378ywK3yiwQyzuL>n+Xyl> z5VY2xTaNp-Coui-k-bmY3fcAnsrb`j|nTG7qmxGl5i z0NZFCW%VSnMIA>%(B~i2>f*J0pscDAAz^8D2uf1om7@^f#zPmNi*OV`k2$m|frlI) z!+wTfnR^5pIbn`Y#~vT4dYh8}68{PeGj66R!0qLCMVO_`y%KB|(O|`}Iv9RaU%-yv zQ)AOB5k_TZfZ`2s|JG_{We}XisCDVXo;x-WBFIW+fF$*RfKhR`Paj>x13S5!L`$Jb z{>LX-;JFk|PXJwnJ@=lw2w3$OB{NP;G+Mfp^e)&*sr+Qq1t8UK3qXpp@n|7$^)tp= z!p`@*^>iAd^L;vkn0zjvh=vB@3UsI?p}g}I6obl9W!)!#-MQ90CUiiHFyt@Fe)FN< z!Fsnz@jvmBd83DE(Qm1b<5^rqhrw-gGDHUMYZdCyhyfjX=;Bji+`+4=CGISdv7N{I ziJNZ|!3nZbk9mvlxAk~BX(|S-ThbeWh(MWu1gq^sw{gI-k(0N*b|5SnBvg+^5*1xWMCOdl){W&)3UN%de|X8L0MLA0ZDTWm6kOw`AnK;f9&u~X!Ab~E2=M(=o1DCT`okF8Fa7!;AJCGFhrSnZ#`pxRgIjejRmuw6!^gbEd(#RdN zM}G)jh%g_$+Y*c&%ZtQK@0)e$0x>k+7Syasqlhvd_+n!ZPPRC4D2r2QR#5nA@e8S{ zNiKVyF?=E^P#F%lo*biqP<8SZm;ku}tB#^N3tv2LgS~fAe!QBkYn+T-=zhKf$mN|5e z)@!UcuFrkDl+6&yp`W#MyiIfaZx%8PxrCrR*>Xq<J9fGR@*3|zKnloKh- zvd|RK=xb_9i#Xy%6Mi6#9daGMo^4QRyWJsj3l}|hBDEI+FndeiV8%HisOD zsQ3hY>0W7*$U$bRdO@*0`(V;=dh9Z)0`pzYuc!IY3kCobz?LF9sc#J|L%sa{~lPNe`HY6N#{LrbhMZ?Sf)2TU5fc6?`pX=z235}Hsi^t;^?VSV){sfCj=MT znsB{=)m(L~x%rW|1}~9Zi&?UykQQs254(^Rxo=wJC{kjQy;7{kCEDzsixvxOvfu7y zAk63wXCLGYh#9tI`Yk4$#xud+WS9MuP?n@Y+w`kE&THPqI->P;ZgXJ=cOyr+Tch&K zpJ2rlk$=Abt#S19Mw60n82`kBE-8CV@a}*PYDI$r7X_?K;O=NPzdM;xbn95tdes&* zDP*o6rsHLPym)Y({}bshy1cteHQ7-8k3QdKg1nAf;=13_dZCe5+H#Xwy!Bp+o`9~m zl6MEWx3D?TyU)FD+D0KxN7bqC>f55O&FH=D_V!s8R=BX?T_Q^_Xz&?7O{_iEf9( z&{@#foRebnd->N{MyARq9IOrDe71sfeCZN*)a0kbc16ERT13t~$78CmV+#+y0CTkv zadmv9SAQxu%N`CohKf_)mLxGNZpK+sy-!L24URb+zq%LnwqtJYF{WOS&&+Z{Y4Kp8 z{v0jL_XW4Ru1NTN$mC0} zWuuzCf?C^jo0MKYDNi{!uR&sj1dGMGBdrW{@5zz;Dt-31u_Lxq1b2*0m9VOXtR#3G z8Vzya*_X`!O0)N=!yYYJQF^~%^-k^}M+W-5rf?!A%GQm~(pz(M!{lsKFm2{FD)5H| z&p!U!+l40%GUBkrxB=gEx%}C@@RH2@Y0TpD{^rQOj7Z9iJ~@$X7@=iQA4`^f>@)*Z z{!LGtX(YBiGk{&MZEo0bv%~LVi!FEZFNL)%5MMgGmdcqY)bDiGC}-%8m}pfNNBq6q z_NTSTj4ax;57KUk2wqs1VuZs`(>yU7y15whcYQ093zqUR@DnX*MD^VtA>9_DN{#n= zMj5Glb?*TRIRU`X_eCJ(ih5Z`PJb>u{65ntDNy#;J4YO#X#&mEBq0IasPtdov=#v) z6f^|vOAPkIfa{U1gt5~Ke!P=sRD0VEICR>lv%e2y+liNZ{MSTdcbv^h@lVii-W&GJnu8cb*Ak-kY_5jULn$-`&_5ayuYrE1M(ma+_TZ@g5-t1;S z4bi`@9(Yil`&r%zsR|BoD(QS;e|C4;VXoMXl7Ow0+=sjbJ5lwotzb57i)xpSBznYo zX_TLLpDecEk&`%MRT)#|EDbFPtN52v_3^H;pMLsVu#M!E3TWZBiK1!SHRH0)z1v^c z)UTEbRkw0w9AuWI0J=EnrQRODb&wS_(#-ZgZ&h#!yT{i*%J8F>M78gV$=UEA@DGg9 zE<6wM0u@Kv{P6f)r{shVGl5*MH4^f1d5i&@0ShjoX{3C-?k~{5= zu{6N%^mHQwD}PvOzI{oF4iI|uVs;0UH=EX`BGOe`kdObziRoq=y{A>}w3F;NKqrrW zV6u;tS>e){F?b71Nl&2sd81}=#faLFz#}7$bi-O`<~@Y$Bz<=)+@k4Oi`T&^FCD}F zN_xcVrE7BryzUYJI{&W}**C!Z5tG_Aw|A~9Q8paydsUrZ#WN6Z@SH==vz5!P>cra4 zFqTT6C^t0p(m?yi|G z{nIIYy0n=Fl=e_;R{K74BM`T_iLyS>mucqOepycvS8s0MNC|c4;D3_ocUA4bi(P~4 zEhvd8?YVE2>Ty4uI^rng8Dpj|5$NriB0vRWh$rBPa`{L8NXV__BEOgRF=wSVEw*+E zaCUz+-P_xyJSqN~>YiD)!j7wV%)|dtbl!hSw{IJ-yi-e)%yN&?%F30QIf2yD`dV3c znOhtc zR}TEr4~!l-o_Ikn64!WvOeMG4-n=|TDM(8aG@{0nf>hG1QahyE3&73Ik=BF6=?^E6 zO!L`%BG@TxE2x~ny`F@o$d)Kwy%qh9#(yJPD)4nu+FmwRM2=S-wc>dyCPGc!+1{fW zzIIZB3dQzrnXkvpA~_;5@kc_D5qSS|x*Na-^rX!38^_)XqxzN|Hy-G>a}z$*O7PvY z-yAUrLc?~9Yu|s?ssg@)uQy(! zZ1+8Lma>qP_}Lv9$P&EtQ&7C%hD^;sv40_o% zI`O)7;}PYJ-5B1BX+WH&VR^rVvCEnHrn`&~Oh>imP~tcvULaJL@7Rpo*JyE46Oj@j zrTKx#PTvSRa&U6}o3zc-OOiN8FJhe-qXD%rSc?o*k=VT;5&9nZqhu7y-qQ?jN!$$m zZ-`Bwyas@*Xu1fTeKvYOcL}Fup*LyY7fgkpFr0fgg=kB}-z(WjWi-={yKPtogSGX5 z6mkh~+W(SI(W{&a9gCzWWwb6nh=`}oy{KLm)%-9WL~9eUMa^IO<$M$Q!I2oeVqLR> z6x*o#?~>)HRyQBO1Sj)cUw zMSam$3*xNbm*Cl62go*%1R3 zoS)orra)o^r~7!v?b2u!^LDy;CdKC1BTrk%a7I2!HI1fK#UyK*a9aL2_6q8+x1Ifa zYIM(Q-xv+qXKqN1$=WeE=y&O&iX%5872G#|*fZiuV+INL5b;6NZz^kJwF#7YfeDU@wQ8UL^XG+`hID!y*8|K%i((2_i+zI{TcJM)R>B}le8%c zmRKV~F%Z4HAA38VxKonGrRfPPB#c1#X<1g`;`2V~SW{{91)0rMh4qRLOMHsA%Dm&# z^pkCV6^t89Tsyw3B@N;Cv-Wx^H;R%+a74j%%gV*{1&c?*dv!E^1DXMzLNH!(>0ULG zJnB%IrSQLfm78g{?lw6OvX!1zNY7JjBDP!{kUphsYRR^1w5rWv(0PbSFR+8xf8CN9@Yqs|$9POysg_6M4hIu3SV zwT7bar{J#Bz=*sii;vs9KQ1yXkcH2L<9YCrPwi>G>geqerT4!>UzMJs!MS%|*A1m_ z%q*%WI$xB1*|!Ds8&S7ik660L9x_{^W`<59{1r-{Kg}l1?jdw3{TCpnv>UzNaD4D5 zr0bMTn6*yj@GvLNQ+OJV>MN!DSzFY!y?g&ujxB0s)zZ9DRbo%r&jMiKC)9tFWs5o& zmP#ONPiguw39NkxuZy>cWD@tLmC@RY5^dqe;ztB#hwg_9PAe*2avHrHbSwCCyT;|b zteLZrJmJjKW$0pXY}*Os^lg9km+fhUNe0K1VqzrBLhi_UEannsMLP zr!fHBycjuRRlt;Rx}%X#6({dkp-6gAM4oH&fOQ|$LyW+V-uD_k-a4A>Dk<9mzwc4o zFCs(Rv3U^iJ3`uG(J938Z!(PP09dvEAsz^Y1gd8kVUU$!yv*f2s*Ti+8 zQMRUo9TIc@>voFJyoRKOct3NgO#1a=bCg|fN)(V9e_cZP+1@IL)g%C$MpayQ1cf{| z#B*7nj4F}JF}$d+_@3J=cEc1t_ypX>h(+Ug0iXgU@lnIm6! z*m^dH&K(nfv9Td>ya6;J6iKv?t*ky7(f@irUUH@s8d?~E!AE=SC-#duE)RW(7O*9Z zpP783X$$EH{Q%uO62EnjR~z#Zh$7l~4A%Ucs#j^Ql*4i|;5Yiy)7tJd+^aphY>>|Mv=8udt>(y(I2IzpPa4 zPxz;#d`yZ)-R(VTv2>?j3$%@rq&eZnz+!5n! zG0ms>TAnK-qWfT1#2}%+-wc`wws@Yxr2isiUJ9c(PaEfu79;f1lNsVov&!{8F(0HK zCuLauXW?+ShM2r2b+hq=jEpXQQ|Z5^g_sQ8>gpr8ynf!@WVgbR?cIBbS=Ue(YCnr=kirtRdw)*%}t5_ zY^?8 zn9hvw_+j`r#SjCYn;*dAWlbD>OWW3VKjHPiIp4OnY@;n6Ht^pLBsJHeh0Ustoae+5 z4ZMCUyY0lO0!%AtaJ<>Iqzzl(_uTlsbDF-B)ZqybPXiI z1-?20o&Rzx|NeAnX_o#LbC7T6N1{<~WWPnGz{JyuwY zZZEg&ve|N`m$QA~^KV4rwl56KRZpjvAr^?DnED?A7)Z&J`BHj=$Hooj-uHcCh(vE28`FRzA+1^j1S$XV9=- zqd}twroMv9D)y&;)@izqBIB-vrs*7nJva9o13oEvvaUKNl(JAzTiUt@BN`3%uXXB> zgs1#p!$uCS2wS3)s>{@^_BOEb!wucSv# ze<24i-zwN!>Ep`-Rdct**tBfMF;nel5;kO5v)%N$;-5GTH?w}o=HR+i&-i%cPvz+b zjA;Df&n<7gH#>AwWW9_P^{4!E{>Ky4gJQ_nhwhvht+bu+nS%~}Waza8o0uH5>3cmY zLm)W%6fWZF|2XN@;9qVJy6qaeQUaE?s#RQOf{0T2QHk7Avo`h@gN>AGKvrW5>Fada zs|O}M+Nsw+ge%@8je26&=2!M4l!Hk?3ERX2VWBcz^&bQ0f0MrYLcF0T6&c@f3#(M2 z5+P|%!!I?IJmG|etPEl4YZH_4h!~II5(lCqUUt0j`5;x_>iUQ!|0hbViCso)oU_WEI2qmnZee7 z$mzd^U4R4o#OkP)HgVs#)~N>W*QNba+)#+Ew1GG3v<6tIjf**;H3-D&$|K`iE>g81 z>pfd{Pv^x!IXT_r*>|G6bR`tIg3umeO$>=_yh8yWK!wpcHDH#|x!3QF6U&Z%bn$UN zXsmb6c*bo#I#*^D=F}|ZZVT{M!J3y(Bi9`ZlQo@ie@A9>ZciT2u!sjD+TKV&8JEA(h6-VwUm1cw zH+^@#H;9WMGG$U;D&Fh|Arm}2k7Aygf_d~N$*&fWm<*RiR# zcMb7On@9f?57ACh-J)(ZmBDQAG)^j53HE7BrfcnS*3fac2lb18F0IY_loiOYoUD*; zhXl;Jg>cg1_L+B})e8fRe|*Lb<}9B^Q{6mge~)nz5$+anZv_|JKC%du{M5?LRs;1d zTGDYtxYs;>!y?Q@LSZJ^bp3Wt@lZ$^{}6e^a3`l%y+d+LC=C03_!xV%gj5VzT>I*~ zhmI4Lho>`ZNF^0uT9n#ctHb*UaHQq!SHQ}jss%5x+ZDvTPx}jp%jh+f<@(m!P(2WbAo8Ml(+4|qo(^+Xc&^LXc*M4-^EAch-J)0igZFFKNWV;I9Q{@4u^ zTS_Kud{E8n(tBSAWjoLM`i8v$>hd;`;sxfy?>=}v#_BFiK>0M!gUbx(GJ4Q)N$j=m z`td%zmf4-MO-nkG=o&_m>KJQvPl`gx=S$alfM;FYlfyo(m~_mr+#Hejf+*K1O=$hrAv3|%s+s=tCp{rI#IW#r&p>cR>~){M=Eak?$4 zvo68veO?$#$vhB<(hp;3M_?@fA~WIHXc4brToIdx=lWDH<{7tGK-Eo z8#ZOem>^Cn-TMq?yBV)&OL$B!uauWP!y=^JkJ~HQFIJ;|nUQ2oY|SL5uTN$by2F$X z&YzA5Y(a)FLZmjr_Jp)Bp&n%%ubgOM5OqD^Ssk5p^1urZT*oj?6$avm6EESvE`_S) z)4Cr(!mUhuI;`%4Vnza7U-wvL1tslwVYBW;wa!QJ1(=H_TNXtLy^NMjIja!GHrd_~ELMPVej@(jts22WcV$ilt zcn0zY!+U&5%P{wW;oH0U!6lf;y4f3*HXn}}#=c72Ruq6DIt|WyO*VJ!L*@ajTerQh zZ;12hQ^#avF^wLNH-_&Htz5sQ;pUL(sFS&LC$23Pv~xO*kP0<*{om=ClGXAm(N2xE zo5w=57&h_-46V>OrNru~E~oYM(L(cAYnMJFlFuh1#P=&4%kxlbe!E*e48oD??ebZS zSF1)u6K`6C+wsrx)e*Y;3zLMJjE1yZNY$xzL5{KUvxX|fQZ=4-~?JmzJd5fDWrr0VY4u(w>5uSjA2L#iVJ0o?%iCAZ6uq6zoP6H+=Rh|#~1SID)@K6n~wv`;<)^9C2E-jqhTaFV zXdrFa$_4Q@)=18T{&abYSnjt&IQp=}8ol8wCqLRM#G@aV4_JlEO3ihrL_jfLBI7l| z4Hn(Xp`*++jZTCA7E$+)hI^D^vNRYnU2bAfnXie4EW<$a+y>V?eRz0&u1iCPhwY5%44U;V@%Q?vJzv;6i?;h%EU^wyXL$+Ipxqh8HPa)B&pH;}eo2>7 zjS}xAhloHgrqSVZq9BQipfX}rZPidZ+WesglzI&OJ4YaynBD&dw5P_rLti*vVpu*l zu=>*1x_lC#+NsCp{#E{u9nJSL5$&!nxm1}hvqYc@rbjKk5;JT`sSVF3 z11M?v*L2WOKP52Y?5n>lWVI6~%2r-U`<`UmW7ymI&nZQfq0IGBEputO(Kh#ZvoPz;%2C(i-v}*C$7-K=La>h)gS_y7!WMD%WPv~XixH8 z{$Yl>a>@ULTQe%dM`bKtat0+xiczD>@kaj;2^OE8aK<$>Jo@2o{(kBdpuf>iqMs)dTtCR?Bg3yP%h>`8lD0ww?0dFH5Ni#0IqpwB z$k=MYU$y{ot&37&yWBG>?wG71sSsUy$i+vX-lO&DUuK!T;ciP0&nYD2f{R8@ zz^%UpXm1ko>Xt9=Xf_1*iK)D~Xdt+UQm*MLB-50J`B^hCinAdmZ#Noq+5qa(7)~{sq0CaReI`p4|pGmHFRO4Ss zdF&pWs6Un|r2ASG>~?B7q!()Ru%O)nmKVx(yi{LyBMsFvln*p{w%M@x#&deS!-CD~ zl6lM!%-X`?W8&DfhvlXxXO+ZvOV_*Y;6X*t@R2@gRl06q?6o1g>kwaZo~KFH41PeTD4k z;Dgs_&~g0TMqoWt)x1%IxiLq^T?#`Yt*)#u{>O=(gm)i~;R5>NBM2vLF!96kCG19q z^_J^{I)%Y9dH>&omsS2&Y0b62*0PmhZ3o9lIvCIX1wZC{*^!HDCjvhw(QQ&wi+-fZ z&iBKp8`X83S%M5UqzZ|lo=&~en|78wtlLN_+#PbRet*DvcRt#rhs>t4K<@8uoF%9T zm8Vzo8|0H^5*mEV+j0C2J2y412ZF_{s@LpJ-r`xV2raR9o2Q{@44hn@_FF5iI0;sw zr}@gSO8>p9#fRH(6#kj7NRr=Y4xVyaXd;&T(0=lo%L;v8-eL~ZeO|3sPt{Bbtp&4% zS=Cds}#i;?RS zV>}G(Er1*Y@~sjzcnW;di9iIm)N{f+-C6*?8~D5La{&18 zM^o)*WI4rt|MYIx%L7^#PiDbd56UBndYZRVk`U~_fR}NML8UN{ji%=E&uM&tg!#%2 z#Olh~9gT~>*=M07kz`?mydmJ;oFokwo z<64rVApQVhT`Cdq7u@mKv|#qGsNgOimQvYcq8)~^vOc>eGvU8;d$m39eY0cL^R+pY zrXNq`KP{1=IiP=ITHZ2sNMYC-Ldft%ct0{MMLu6OF&P2y*AOSud}GP2ygj~(n7iOP z6+^ZeD*cCL!_sM3MP3|GfuZT;f+FNsTgW0e7?k`o2rF@Io#-$#$InpFZNPrCSD$$rWZcZy((w2}W*qa7-{>p9W^UN>DTTcg zBd_Tz%aULi26ZGULs)1|W zeOgiTOnR>Ug%oKe9NRkULCFcAsP=aGUx|Pg(~ZaBlvK$ZX8`qsv0!gw0b-BNHL2@0 z_D(l+pAKcP6zNn#}=|>`~ z?539i-B^-yxlZ>9XVxI>(15-hfedKtnJei!sOB~0VlOX49~Z&a!}KsYn#VqM;m9pt zAH`HdHA72|tKXsy=eheS1NNs~gDgaoU_ODH^Kx|$*93Ms-w|z{JV=^FxE8Kn@wxi0XTr(+WD+ElQ_|z1rr=`;TTlaL-_Zkj-W!uP8%D}Tc3;1k$i}4h@7TL zFwumN)i1Cw_k#~UKirfiYgURpa=X4acEnZu)F|f{RDHY|-qj7n2%gN#zFK{;VC&7^ z<9mqtkYQ7c5_<+4=68;@IFcw$WD(#dbz1a%mg1550?>l z{W$*I10du>sbOGa+|Ok@@7vpB`$xYe4uu3)xMoGmc;F&~c4s$)FF#+4b2lLg%13Gp zAI=#z8P?iTzPHTUlW%CKf3`_oX1b|g&w8qTm|Lr7Wi?OW*i5fWRVb3{4!Bz}A$vD& zRmNS2EKA&dqt;g_&b*I?(u#>41!n(y9^0t3rFX@2$tklb2e58#dBYC95}G8IR=H~v zA>4%*?x}IRz)RaxYtndfI{sZ{^4S8(9TY-H`|`omjQdC2qT6=U^;|Rhx3wOTmdk{! z`VTnkc9Wpv(&OdGj=8ADnDLt}_eD*=r^W%g7R4o#_gk-gmc1BE1V|TM{H7J|CTh(DuFxpiI5^@^E=WpZKD%JtCf7^Rv&xbSjIH z=F?Ndg);WL0@BIBU$7$fYulTcwev4OtuNLE7oK31JqlAwO|#vdvBht54w~e_ve#N; z!w>N%R@gB!8hpySN-)0$a=TZgyTcxo(^`ib!%!Ud2t_nYc?h5 zSYeV~gH?K)yo`rk`*jUwjVVz|qt|u|yN#p6)YS;!wnlO)^95pt&L=e)!|PY(!pUh5X?SmImY3;WsLsPv4d#ckqA2L|K< zI~g_kk^(eJ6!nJ~DR)zN?Y{j&mHs=iDBlKx?D?g2zLzIPqsv}xN5gjBnQXv!6u)cq z%8+x}iH-ZO7MA-@h=~7sJVE5Rm2_;?Eoxm1jBGq8DWjf}BCYNr0ViJW_S-yINiWuG zH~qBwL4bNsZ)8yFF!(MH7Koi55<<9;(+J$kI+BE7HvJ_`vo-oFQ}kVMn!!%_G~w*g z)b6=r=s9T(0Qq$#d;Cjvowk8N^qAi${HLK5)XcgY{QYm3>lo`2?S=?0+F@zNl!7mC zl&k8yFg-OASFwE4cZP@{;Jwvm&5g`~WNMZ)Z8{2^gWRRf-Bf(Lr=T!Sg8EE1I*x@M zpbvJ=eOs!xCMiRo`?`49u2fkOG&O=;>_9Vccfmi%;s1|lD@_WPAlWI*>A~7-9F?9F zIf!7!RKcDzW?i9>S1&FQo;)kAhSdqPNLyQhf zdX{^5HZpj?L3q%4Y{N!xax8yALk(wz^yjthR0o_hs18{+>}2CA14mrh|Ark(vlCla zU6X`!c8hD+;zG2;ThVU6`prK8k-8|(pmO68^sqTOI2yj&lj3v|6;9TCY`3N5YXKmw z+%~{g(N1FFRExcu%e*_(0cku?Te>YwJ+Su_@-WV5@D6tss}2S}9Wt?g>D`0SWTke2 z7rzjoFBqHa-a8j^C}TS9J$79?+c-(1Uvv$A{Rxb7XA^aCEe0Eq?HhrBp$NXwaf2rw@F(h^Pl&aBFJTbp!>i#a9YxZ2- z+i-ALStxjwGS`*j5AZxzR~wJAIC5a1SKh00>wm@71ljKh|7tH~+}339Yx`~pxXXQ( z>-6G|B8YMZl}|}EBC}4q$))f>cI8ZoNn8;iI3Y+s4tg*FSiy3@op<*4j_*~o{$)xP zi7`Byx&06?0AhISC@h%4bgN%(1G@ z&27lQLi^+ntw-L0(SfhR5V&`#3_tGI)b zS>)ygdMTp~>DJ#b%6;)Qu?v_`E;s6U~K1(D1TY2W(AXc^|vp?mcv%QrlSAud1LD`D<-c zEcN@GJ(aq!id)!{knS!kfXgNalfLktrw90MQUBN;sQ3Flshg2LkPu4+T0y*d|2wQI z#zg9AKX{HpF9FNOtV}56D_fxNw@c+RH>}!d8hVi_0TuC|fVJbdNzAAX`Z_rW*ppw& zC1~glz9!Gt3lKTDE3L$HD{bO)4Vzq#Q-&Tnr~>Yx6_fUCtUtAR3UIIQLXiI_GN)8T z>DCaZ9ii9Vs*h~WArb>uypgD#Pf0)NpcjtSfTsNw=nu|S#5}9OHq~ZikPaaSeeuRR znaCBAx4$gya`46!2T%1V;!h_8=ZnOw1tg5&QWewzRK8G7`?P+&6(`b9;!H#Toxd%x zaXld)HmE;D-(PE_1h23UNAueJ17N;77AYMRauu~~if6jAELcfgE0xoEaK zH32p}pnZ#~v}HxyX(Y7VdsuyHVp8a8#2c9N16AaD!iIO)V1$%4PQW=d-?{Ypz@*rm$OUbYg_7LBVy1jJajZ@NdZxounT#k zy~mCAq?z;9u%f=6-8(6F%4f1m9RkjqbnH@qsCUySf_5aKB5!B#-t(_#A7ye_vf9&e zP?FF+kr2180_}?7SuF)s?SH!PjcgkW4B5OEISXezRIs8_I9A@(LGn4YUb6p7=sScW z#4)a@BAcK~3HgDqyK`t{s?nU%Vs)ZwAzU%n1+{&U$15&lXwQmP?2&Fa8^Qi_K&*s&MQmSoij1Qm@7^!= zIF|;M6G_sp8h=1ffYldwx@3Vy2Q&3R{SZv!;G{Up*A8PX2MV6Z(vSiJdsV??4*Q_o z%8SH%13V~NTvf%i(@BQ086T{0F26w2en!Fac)A_50xdspvU7 zbnBaVl)%aL%~Q0f&k8C_3kw- zv}m-E_ftHHak%s>02|%FW_J4MbN8~-YLJ7~Wt~s6OVl2ojnQb#OIt8A!d#IS81)WI z*42TLn7hP~o4medx!BBNIo^E5v>rG#xI58-SRn{$Xw3xF_D!&goj14dmLd+eh6iIP z>VZ}1GZ6KiOK=x0KA02Z7vtcs7)4Zto3_XO(694_@j=$|eJG$1;Dd;6a;h$twL9aW znajTqI(zAYi$t>bz)Xy<&hejf?2y7a2DCYzDk717^H}QxLsr*e?}kmnBG)<|MnQBB zLT=R}WGpqm=nVh$n2^jcW3Hz@d<7)-rIK#{37m?^X95I1+_KcIjZLf*@Yjifdh zf83If4q5-BaK{?}F;?3!cB-0jnn``LA3T5jKdE`QC$z1dwS98G#UyWjtoR+XnfrCW zPEYHNg5td}upwgh?iDh^?flwlir2NWwv-G_+bnWK6qEjzvojf860xrS9`M0zYW$jVFxrSuvKwv)7ORLu4p{6uU_B{A-Kz$X4Bayi6#yCFmxvy@66ZRfuv8 zen`6_v@dKWFrWMZ%bmRf+N_3+{y6J$T1TIwBPp$59eLq-S@FY%GAi|PDUD5m{_m?L zr4YU0^(T|TNz*O@0AUt2?Cv|$bC*IH)DKiw25ri3YHq8*8@u;lgz$&y+GCn~3#zKBhmfOHz)r^|QH03FyN8yXF%iFvR#%ddC8gyblJ;-$BfJnOK zq;n=D(N`5C-ph|kxThfWD9ZU^A#bX^vPoZ3H9_Z?+csXIUIRHt5dHgH$KDSw|D%_J zJA@jM;P-`{ly9w<5MK8u#p-Dx8LeUEC)$P!Q<~|3{|Rntx=X*k?cRsGA}nu1J)zyU zB!psPs85bu$=9a5O)uZjyUg4mS02@(>kE>{8@ldL{%Sjc@!oak?F5&zXJfh`xNO=-!HNSAO*yx>*`o)3QoV$(1rxk&oE5y>|C}DZd+wK2q!jS zmUEv&b#h4ipWttn7571hS2yTDD!waSB&j*m|06W|EMj5hP3ucjn=s7NPpJlBJEsFh z-QG=dj^>u#Av0_iU2^d3ySE=v8a7gO{+$cFf*I{IYJ~=vYQ-G6Sw@D=GUVP+j-!Ol zr@SBKV}K{{Dvn0&2W?f9w1A_;Ts`3=;e+PMgkNeLsyU0K6I?k#QpG}6cnH86zJA={3K$5xV&PTX+?yb()fYr5g~Tkzkw(W`h~n)AX1D+4 z4bQ+wxXiS~{rit*w$R2{qDHjWf~L0V<&NurCt4Y0R76_+>~v<`g)r#}zt=zrcRIu- zAW4QXkQ(38jQ(=YejQzXWvi1yN&9tdN6*5zHF48H#_ zRh>##^{9WBdp?0>*<1HDe~e9{;q6;tpx9jHw0H~3ow7eT_5rHWC8+y!S=4rEE2~{r0A6&_{F&Ykr>!>t7wVj|Z7Pb? zWt!YZQpjpI&4v^8lBi-6ciE_uoE8G5doK>!(P?xg2Xb0z&tPlyx?)bK=0ui-gWzS` z6`<-y;ZCaAaf=5!b5sia?CcmGA4{u2K-^S;S_IhpPp}jz|54)S9wE$@g9l#W@tL_z zZ$WMaUKOjHmgFtF$()6IOqL^I?UGMGzcYh>jvW8tRG*l_2s#*KN2F;+-Ch+q7=9Qw zR`-?HUo;#?VK*t!g8PU&Yg~A7su5Gi8&;T^)LJ?p z)d{M#7+u0}%Fbme>ufgEfT=4|JyT|{b?S!&VdXyohnvpW+`XgY%{IV#kw2{`PX&b} zN$BL-kFN%pLXzP6zo3;=jnLj|`vRT@ii4 z`mwXG`ZDh%doSKPrMasXUx>X%F?e@X=hwf@>b&STWKv4xBjR_AkM%Av0KVPuAHJ%cITZ6(|dCCU(mLP0xW5@SLD2ew%6vHxgANq z%LkkN43hGA#BN{H%)u~iaXUL`=D)1@DTx#~WrF$rKeicwz_N&(U|c36etGG&8Tz7i zZ)~7(L-rN=`Z<+F8l1f~L%pOA>S+y-X+&bQp%QG(E4xB_WU9Ra=n;K&yt)}eGCYD= zK66IX?cRg6Y>cSpZ7=hs(K%;bhYRayT?v`Sp+Zn?<@esWa9{n7ogn#LK>Efy?5Eln zj?KxRgJ-tZ#zXA*gy&UP7Gsq0i%;dkl6ec*sw$56RMCKWDTRVth#LsqV0-q|Bu%9f z;)cr*^t2!43=Pd2owfCLW=pr7I*#Y`t-XUBB;xIIo>LRj)rOTX$BY)&j1~?oozCpQ zP>o=ZCzNrmz1pa(;?bquPe@Yk@FmQ8LEC6(M}|n{3RC1Pch^XfJ|#njc1NePWJ}1( z(Yi6*1I3?j5C_-4fGObQXpJr|mgh ze1vU-A>W3}7hefu2#w|V5`7hQ3IvJEj5$`@t@n#{%C}(u#t*N2nom_p z*`Ly&M$hF}gl+DaGw1pcMnUxW3BW$kV%j>Wtvssx>P@{WykjXE6#v^|y6$uqTX=Y@ zlQ);^NWbX{Pw3r~!W_VNF9yoa9;UYRn->20%9kz=+v_WuW8z(wB6-p}#gT>~~N@69-|4p8D$ z9~;+8m$irKNCt$P##`jE4`nAL*PGXF8gx5f`h%ZyV)x*&Ba-1TzC0`Nn$@`_hS2MC z=xRX2&1Y}XiunPzEM}}`#wagQau-FBtFn6XAECdhR6JrGL^^}kek3dWzJA7MnZXu4 zWXnBgBKz!H>?h>B5^u^^TE%KftSs|ZDKyWY?= z%5r`9)57y3qfhL_rK67vB?2n+0yPFxvnPHPC+R%Dm$jmXC@0qsN%)>74S?H`MToUV z$1_aOmFUTKwAIXOxkCy|M}kfG)D*g{3z7w0Xg`Pbe=2G~o4C z5YG?e06%dY?@i87y3((8x!(`S`g5dAIqYEWQj#QhNLh0G_JREPI7!gPbgv80nbi0W zz#H_aF4qsy_GO)VFpQ!sC`n@ZwO&a@06dVOU>sUrepJ_gj1`l@WogCbqOZn%E zdUU9Thpee~mX@SxYPvX2#xYlN*5V_5Li4}eG-0mKxF80EMS53=~unh%+ zmAMyH-lw~R(pK6xq?&f*J8l1dKS&7QQJJN8mxs&%?@^X89_x`0;ggj_ z+A#2_o>Rd>PQHn!j$(yZ;_0Z;9MZR;KKIVLta02+LUNcdfuZYKdG?KMYmo;C^$!p? zX4cL*TnEmFWLv&K>tj3u4q~(`G(nZrp>!S-(N*B-Dcbe1fH|5)h6F+9{RhWJr_ zUVhRCkgUFY{71C31W&=Wf5uyt7mK^=c?2}|+K*-*bjp6oL-lMMBTZo~%BuU|?kz_L znr-ZH=($m*6LJ51Re9=iWG#Yf2rZ}r62JX7vup0^HzS+$1#V;Kni#)`cIabd@D|>k zo#;-c$Rhj{%dWip5EyW?k3t2#@0tB%eO72LzMau~(E332RHOXPaqqxyC37Q_z2Ssx zvq0^O%B70-?BVpf#vInY^`jNm873X*Wg+hSO?WUYHax@?HAD_ly{*VDeR&^zr-tB)gz-32GKeYE zRg;bz-j1%u#P!905yShOK?UQ##Oo=B6mIkKR<#v!RElpBmuNpy1-&n3-ZBYif-WcScfG<* zeh^2qneG!4sBn3CB($FTh2C<{!OhaGF=40GzGwaErKka!Q^<<{R6>H)pme z^yTNw0_*r=2L?C5vFaTS<`!Ai5%Eb$BP+4c2QNFu{MR;5)kX9A z+({b~Nz@^Iv|2<=*oaJp5_T9~=W)lEWxR(vtw?EklXMd>WTuJW8B+vjSfJ#q2O9F! z3C#7>UK|N+r31|8=eyWr1izLBY z>h3ZjG-RKX7P>8Vw5|!|!kmT`v0XO<~8XS3Dnm=7Y`0f4*qzIHO6eiwbH-&H=Z|HSF7O%>9s*p;Ay}&N1tNu4wq6=t$kOs3yUdw z3D@gPhUrVE)R}TW>o@q~Q^D0h$X#xnOneCpz@{tAr@H&p2s{~?h8>Te@TYwh#DW7! z8ieVf4hymU(|&?e%msZ|%RqHaFXqCpuErqWE3pkV!&=1ysTOThV3+R8%wHz%AonM5 z==F>X&=;K1SMp8hp{|BVPC2%>p9-R^HJkVotabce3=The|O=ff=HbC zgVyi=0u9{mZ*)L5lsu*Vmsg}p^-QRXZ1x3S0Wt;^{KRygiAXs|=z_skT5|>7{;^=c z8g%Bw5sQy&j+cC=#)Y%TkT)M8xurrOXdVKx%AqcxR6J{gPhCoD;5lA(UH@zQHUT*M zc#Q5zP0Fmkom<@-wjMulPT%xuv>@ixAp2_b|`NF$M-*o z;*Bx*bEz;)#s$sa4hh|S^7|EfUfo&V>y?r&83-r)-ngR}kVH2F__XMd-1QV2ALDaD zT1m6oXCevtMbm=T-D;z1`KG(gH&$3wC#c%*!+m?Ue!T z34jp&++<}h_%-ELXp6Yv>i;E`79HP%krEhN5j)412Qh{tkT_04YyiFH0y_@&g248&V*=CP^xWE9WFYsfJNH@F*>SX+WGMYJjrQGlAyky82U>4#;M#S! zxlPvStVBNBeC7aCjt7awKN{w3zi?TX@F7>4v=<=HMOiQJ; zC@)D`#&HWd(j3kf$b)gahGzG7m1aWUyS`wxfB-Io{AiuCb1ikrQwCh2eBRK47$@^= z#I;DqiC+oFz(=jm-&)w;KL4;fa?N_Q+3~;r`0=bpudO4&o=yQKEy`mPVG#N*ANtw; zWADqaeWe4{B?x|+gPpMopcR>pTfhhGyV0iz(dX9j@k!gQ&R-N<5>GvzsXN*~9c6#l zm+xoj0t#v0SSxACai?smEzl~$ZXOS3j(lp8|9~^k0peLbPn8A62FzcRRR92c2;T^|CS=--7SOwF~7j;2T zB60BL9}cGe36CIw6H1xqjoxYxI&zYCcl#!QLf)L+9u)6Rz^k=5|D!r1YdaAN>QOgN z{IFp;krrU2Ek~`iE*Mk2-U56gW=U6rklhSjI{g$b{ed(^kC-Xn+d$Mt0#*ozu!OF5F^GcJ1i2DLA2*0>^YxHy~vZ!7)8XB;a)|qc2+}-4Cth!*{lVSu2 zeEZos4r|$*8u|t-0{UjFg&NDLMefGzq&*jE8{&W4wqu%V@+l$KF|_XWLyCJ> zwE>P+%+Mh~Ff^eW-yXzH7*M!4vum|F#MexNzw*szQh}xSM*M&RTvJ6xb7E~VPaBU_ z8{w4zo^k#Mu`A?3iPpo7z%U)KCf5p_AuIqW!rfMJ!< z(w=gCjWx)%@dyM-n3Q6GOE&>QDZ>7kA+;gUq4}dJa=`x_uT#&Ti2_2l#a-KLdX<)v zJ_mQN`;%0^IrnUZ$j_eqycYEH?l3j8@nCO7tC)^vd_dA2>X<$JUY-Z+HKx#JhFgh* zMs>Wt7?{e(?Pa$OrZ+hzvF!gWb9(LUXPXB^l)jz5q3uuy{czH91j22qXJ6Q6^OJ3nd&T zvDFZIXTjJdcT<~7&#@2b-&=l`@Zi0IRfbvH8Dc*f^z?9N+OWY*hwgR`$~6|vHC%ir;eX|EAq3`!m-{Vuye{RZ0L(+OD+F93 zQIyulFtx_sWu1|&hpZ7!`~|(MU>i;2qk{^D>2m`nQwG*$89AcObYzIfMX&9{So1l) zOxZgFcf|iube?fZwrw1) ztgPHw&Rkj9a_1JPOsz-D){`^0X>P?0NTrG9ek`|;S*f`)b1P)-9B3-y#Jx~Z5s>}* ze!sumzx%p>*L9ueasCgPSdg6A+Kz1EPPX0{^Fmm3BX5tn5q6mDxB+~9q>2^0#T5`U z>XU5t{HpD`30Msun&WO)56IYKYn}D@V+8+|^mNvnxm(38Pp5_-OBTm9qXzg3G4TEn zPObd+?s$;JUq|)K+3?M=SLr%<{4I*gT@}~s>Rtd}r;c=ZH67H1T7!V%uu-hT^6_}B z!>O0wJuvbDBEDU?4BCaI$Ew=9|(=cXQO zYFw5Bd&}+glKI~7d3qNtK!9Gw?E0oXl+mw7n|XVCf6Hc?fUFvXD8z<<4=Zu za{REDFJcP(Kn;K>hv?V}#^qGEe)^`v!Aaf1rp$jQ0kgHy@qE7TkDLnQwX}Qq-At8t z!}j#QK{RmS^k)|b0iL6*O)K2~#rM?qLER;<2B%9Mrv$PAdQDkd)g;CJWKVAO5v-wC z3w>@OQauht_`>j4OD@#E`76LGF0%S(G^Og!BuugB*r+v8j8*^wur?BPlzzbb5m+xr z%k2+VjAy$2jU}jsE##+woJRuO<#+gP%OgD34!z8!S1a7>il?ld+-Is>pA%x4o>CWG zJ5p?nF`ve53`z1fmHU_CkXJhIv~w%8-~UX0v`Y&AZ?}wmIyuo3EgP=cfTNEc)8EI7 z%T~{F$LxuRRk6LOTo;gPaL;$Z&T|R5-4I-UI_~`V(P77n$A@IZ>z3{?5nRz-+V<)> zA#6lOOjwr%aBpZUXVma!vbNpmJy2PAP|i+arl{8ULiM=!#!UbB`#`SJW_h~Vj#3~@ z7P8xgtVM_9f)&ATe?COa)pCdL!?<0qfR}Mckv?l27=b2a(8SElWih`gEhNg&r1u9B zh|K)`gT}o&_mfdMbQV$#WOLR>wT=bs9;~*6FyiPr@24o-eAHt+bieNjrR-Si`<(<( zaDYw-Qs2TgmY3h&sAiR!TuKn9wPrgM9Io&~2_ik;HK)7SIgiMW|zXX z;2~AxEk|^J;Pw}|@1E_TUxn<+@#rSfyNHuxcoS!ZrI!nr1ch=FTlyvlCSHG* zY2Sb4c#{1ev<_Qu`Ld9VuHpd5n))DBV}-HDI~v~Fr$PyHTvVu#_j=9ml6on7yO27# ze-lbP-o{2!nyw9vEiVVTF}+ecYM-4#$kbbsR_9V5P^h<{-mjwBmw76u=PnSRS3jP>bYX~;8|Y?5%QfBuv- zMt%@^1-Yv0X+VSc>+o+%)tmj5dQrFP8Jej8CJP|>ZFS=Qad%&Fs#}p(9)x6`r;rO0 zLZ9{|UG5872ZFpSrZPth_R@TgxN%QQio28E@05KGc4ML@Gw^S%jLGEe+15KbIw&0J z!=o!cl#UtT%VVqw?#CaspVD;n{1@)}Y56NmH}{uN*d!xFXqy22K}dYJTF`xc!;$fQ zQGJsAilesq2iEvWt=M6Hl;}BA1IP-#aHWZs|D`ACt#RyPF!{UEg4bYmZ?Qq{7iIM9 zbTqMTT5~+w8Z7e;NOv*w$x{g05z68i$hikr6bB#o4s67w+i;>Eap=;1G{-zJc>XbH z-u#~qY_k;9EkKYpbBwvB^+O_6jFr?5qXF4tWyd2`-o>Lezx7EA0r8Cixq)IDKD!ky z5fwT+$xN7dG@;qp0z6{Z+aXX%?e`iOZmM|`xYho>+QWTi?DIc8{h%6}=gR0wLZv@y z=#0H0r7Hz5fPi7=nODPt^2S|llC~9nQ2&y}X&-gKBL1VPleJOIos!mDfRfdMQd_X@ z0v@QV!ZyF1k2oX&CKtWRv{q*bUL@Y=io{s%GnA7a8o4mXpUZNrAPzEtNC`%_;p zB1{0c;2Gvw)C!G1p+a(`1*Hk)pJ?W}KbQXG>jSoju4D>9xK7hu?=MVlD|U79UAiW` zJ;_@Ueo}6k$;Xo|u{H|s!Z$q1iTU@B)bkU5`_8X#Cnb#me&(6r6n$*^VZWRXo*%kl zm$z`Jd@J{Z74NYE?bBuDRGB632QpsbXTz|Z{iT}Bk{jWYz=guVP&lyYMdwR2trRtq#=yQbG zz|J_Ett*iaD-)^^LfkAL);8V3?&)F+zlpMQO469{f24cEN+BQ3)g@mfOWqPOM8CH| ztU-oc&wL}Vw8^V0fR|P1maFr?#un}-p!^4VwslfRcU!+B!)S;e0|AaPpA!hk-I~+i%`hLLLbAP;4tMP5`XuY@7Qh zvB@Z#7WgLw?v|V>F-i!zS$xS0vEAGCVpGBF?WPdzv$|UvK*s*JUg}*a{>_&<8Mp>1PzXNU4;C--?Js4-Q(*>I`d(K{Td zSM|UeLc%MD`loPRq&?yB=Nhb(n5KOlqjo+2rXZ}5QL!~m8g_|mu*ilPyXG{hY90_P zg=#XD=kv2(OdgR`XkCl3P?d4=HuZIRCy7jV+A=1m6{tm&B~RTxR7es+$}}?>9d{e) zxJ3#&5bpXaOul?v62XuwcuV~`-7xe`Q$zVZDRd91eTacv{`h{o)^5vS6tcMW(u-;{ z*fH3m>Bu?nnjC=Rzm!5Bo5?cr6jlC-w3Kc?qdd1zU|C;14-Y+l5LteB2nZs>D=|$y z-~FS5Sx$VWiBi9>L@)h&f&}5VksBXcc9B#^+67Z|4=wSHPajZEStLpcdMG^U#leNB zsGpiaB`uTe_ke(&H9+{@o-g}sV`C*6muPcl^*p4Dt& zdWt_kuf+}CwOWbP+hGqP^wZoBIBuuXLweS2I$~_re7_#fw68tNdqeUJ43Nsai zq9S2W^-%av?^@YO8=Vq@3$JP#4h$4w#ADe}I zlhxQ0M*=3;&d$x@=kL38o4vy_7f+#DH=2-HkcGjqz~4H8`I^o#o55yiv<=8hL4KM# zL6g4vR3b+|H73kFGP|FDbG2EMZu)}2sSh}NghD_y8NIkoR*geS4{HzNYr5#c!V;_l z3Ff6$sptMfF{mI-QcImg^$f#3#noL<*QO*46NN$|aIE>|f9AEn&vg84u_&Kd?QA>y zeq|DJQj6a^&4ZFuzyB~(N0$}^ofo#p;p;tbU9Pb1p~{Mc^$(9!v2LyzS^c&E^h5_O zO8qn?!+Q67gf2Z`P3wI9j?s+N`N|CK!cM#s=dfdEfyYdY0+)(pB0qXC~(zoR; z1U7=>xF?z`h1>P<@X;s&WkUKpYdEljv4q_Syh`pdlG21!0<*6g)r%B}!^fCv{r(mARO1*T_N@o^4}zgnkdeO?9oPFn1`8wXwAUttX#XzU;ec zAeDUBd(b-I4&Gh(sKWMCS!ag7(=+RaNzdeKjCq}vEk4E#^T4@BA~#q@wgy@JBZ?jJ zoJmB9&vB?05C+jH|1M>z1l7^rpH_ce3&e+FJ^~byE(eRwdK$G;?+vEnlBNmhn-8$c zwynRSQLkb0&6v~?nn-qFTK(4n`?KXm9q(EX`S1#lu4LCEDTH&aDj#keY6b*K2mtnG zOnM-C0_;WWRt;p!Z9H*(WA>aZ3hk;wfVpl;qq710?2nU%dO!5|eXY-K=J@gA#eh2> zr@)`?lsBuqFL(vu^Jt8BwiMNh<4!y!)-;{oKzbyf-Y3D_vXi2jk3)Z>6<1`NaS|(# z%>G%Z+YjT+)xoFa+Ws{2QL+AQ9II8=>iaW(>JO*Q^r*wmdONRDVco+fAxT24HJZUt zgiTo_{d~|(XT|V1$E0cmIVbh90%X;@!S0s{d%r_Xx7|JVl{qFFFT(t)E2=-{6^*2p zi(~4f84m?0<)c`-EvSHG0vz`&4=KR9rlFuooZXMnNxL@Prw3WS{f5A_*F{#)<<&^@ z5l@QSOiheVx@rD3DdMe4+(zIUfQU3Te-!+7Nc}7?YmSQ5cWkBw`?ww*uc2aEiH>Xw zrxor$&Lq8`@ZbCXdPi%nG6l=^*WSe{Rl26n7RnbcL=Tt%c`(Bz|3Kv2Vp8N-J9CbArKVt3G@0dT4D)M!tX# zsjXv`C*&+e`R^Z8o;V2{@xF@rMNjT~1((FG&0M2MG$5Y*)vmd-iETWkb($Vj&L

93{fpF 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
A}obN6P{- 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⪼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

|XFssrj}UIG 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¥$j@W1M+*ccBV+I0dj zbtl7+izAej6$|02H&eEb{kPTB)7mvC8?WbffH+r?W{09C&Du1llQ=ywYgS4pRi~uo z_Qm&bk&=e_hQ~z=#}=xa>-Z#c7vu$m@ zUFV1VtepR&z&`tWOLimg_u6&E@_Fw3O37|b}J5kV8dBiQ6A#EYO+NQPl7$2i6g4?iJ)q}@04i<;gN z6+UO5U^c<;_jEJ>S1@ZmJr_Rn7kG|TU51h{QAtWr$&21v^^@`7L)P>%DBO2L| z?j>(Ia=1dz^E9sM`m)Lk^?$&zQili@ar{?HX~aKX+KUkqUtf(G=7-iG$}mF`jCN$= zQl&jS2Ai9{9u^2h0X+kxkWXK4oS#&+j~O)HVO2+Kt-U{;`OXil3z*zbJ$i;aR!*{3 zV8J1Ya;^LaXoq$wR9j+}z%_cw<8O3tOx4uuJC zqrTMXNQG{9{%6wdT7|ED%SsLgdqppeWhV5)sivCRD5PqO@_IXl@!AG}fLs|kAoc+_ zKjh_-{#H{!(F!GyZ+>#S=2T&)F{abP`Geiiu<2mF(jv*_#V3~~DhsNvFKzwL!V$F^ z={DrR{a=LbUf$vc41M7wcfpuN;$X2AyVZ2}%8GsN|DfQcpFmHA+~bzls4%q|0Y^a) z#$S~8dOB9*eiSHH3@+Oa3Q$zqN2c7r_-;AS?{yPd-jEv)eH6En#i|E!dZTver`myi zR#9NYu^+L}M@k1maAI_Sz8<2I?g$VJNlPA2N-*RNANWUXYNr<2H?R}cx;emSPoIaI z31_>r=kGiUv#HgySZ=%R{_Yz;ycge=Ol2%ShqB`hpENi=wsi;y1liGJ_9k#_XpB+g z9k}JY3dB_iYd?2}2pXx|1d~MUURd07%aAgen^aQKr%?+E+fs(9r?8N)nK+T^iP_^R zQ5lcPK~~jQ^}KDMeR6dqQbdh8c5vw6ZavH`VXAdmLk|p&DkmSbZ(8)c>bZZ|qOQ70 z7Am^5%1V8aJwQ;ioN0*~tL|nT4-t4}JKfTHk!(9bwxGTe)b;H-dI{wp6|asgeaLys z`m*AKwz*^T-?SLBV2pdZg7t+WZg97`Gvk`8r1I0Uj5T8yAS|`qs^rhk%c~))^?ttx z23;R_Ua%skipJ?2a|G*58FE^%EZGKt`nOg~r8g&tERzh;cP%?aeH2|5@PxC(5S?Al zdSW~AK-oQM1iXcvQ114ECsL$s3vtWC@oNv0$(a4k6M1Yq2rXAm1*a#Rd?G}CezA|4 ziTonb+@0C!`INdB6*|v;|8HNRelx7MR#js)@)q%ui0?tg#(CJ;Qk}vBvEm7A- zZ6VyF0`ju&31dsm$74;)uT}RJJCR&WScM@bTYFKVTX=eWyh#(G%?3{Sy7aR|`6NVW zeS9bH^ZK*&vA;abX#QQtwX<{WwC}-MgU|%czYr_n{?o{WR9jEqolC}MZEa_VTyLXy zsCKV*npG#)I5BX3&i>Kj<+m@?o^K;Q(BwZ%A+{3nK&x!_UlTjVTPi>I5q?%aY*lom zo!j<#eD$xKiCc~6*q*D}WgQEwX25V7ifspk?^}wo5$jXl%ojyI0z}3iiQ+`Cm`^D+ zc;k!S)>fq1qQu&+OhTM-HF$FurC(k~e_ZqR0eT$7qLEL#MTY6366nuMu(W7Aup^Ug zGw3#h4Kb7I>?_*ueZkr$4lS_HsXP#oX-(LCkMvUlx`!wfrf`fsQK9;QfNOt@kT=aV z!dAQFnn&=VaN2uyi-Lg{Q(YY1q|UU=YLlTMk4)rT=5h*l`{?uWA2U|~8+@@5nafp$ zJT{w)WBvX0GBFPZn-^_lXOw@gMchx&B@9zjpN?EhZc^#lvDoiJnbc{G#GrRI@Akw! zB|m;D;Oy*M&sh>gN0xuesRe)y^TL82Njb#tqVQ=KGF0^85Y zh__9jil_+j+9=T9NNZnM5Uk%efAvPt+t)tuR@rNlf;etOu?X?ub(LwSbb0mxJ7NY$c`K-jv{)p8OD(6 zwXufJEljLWbky?q)YbMrLfJsAP7p!!^)9b%BjQv0-EPBKq=zn8S- zNYAlbyPOHlbLZ4wQ50EI=ir2$PE;(rsGQ!cTw9UrBo%MCPgd`kCw&N16&E*#{uRkS}BI;^Cl6N1W3uRT-_*-?;gvBWbQrDbN?*TWY(qiyJ|8#UlR@pF6`U zdCJ7+Zf4XmlbxKt)b-UQh}j<_2jfoHzXUfl%k|e2C)UpGcP8s?{&ptX?!wCJDvH0D z*Ueu){hSP4NBVx&_oHADPY?KW3}nhOxdLsC!P>{;0N$*ZJB6A8{|-7vI!Vs@fD%dvg0g zC0Pd+oMOc)f&?SlK3mtc3%R)y#wVzEAmArD#ZGeQa>Yq@ti_j-mm4U2J23d->43Y{#Bd}hzF{j!9X>kDQ*1G$zs{sg9=bF zhA%b-!MWzGu{0ekhr;W2mm_57KiVNe;*cH`7bD>`u431+Hdc$cz+`o>YM!%^6Z2* zL+4Jn`)I0}d!6&8{M0d}^*P%V1d{M9AWmeG`Kxbygc8?2noV(1v28;b4vo6#Lyw9S z?I=IWTSI8pSkSii@FYzxLA9RAm#8-&}lpKjD|EtOrNCk)NU4a?Ql z2fr?RYw+DrLFwXEd$;2_!7+>6Y$@KQ2dtsr=qW8;)JwJZhMLLRW4_n<$O>n0sorCN zP?}H=ZB}ZBSj8={J6zunJnKE4Q+2KPvKYc7xKvtJUiXmCBF$P+KpMlYRjcSbniwc$ z%`(OD?zHvUNcvJ`7@97%J0^@&Hze7C2=%CV2Y&C8^hz~Mzt0DmrZjsZ=P*bCS+VpT zNV1#dyWyZS^79+32l{+NneQzaD;h7W#;{Fx8)9Eyv1Mfp_REB>;nM|MaoJ?IHdt-C zBYwl(1(9r<=e^%vbbfv!M>uug8keo0uZ(LdJ7|7|8vCwjIduT_~E*8`_@RJ=(;v)EisV(@7f7MP?+Ms z6yYI8)6X9Er(fB4;O{0Qujfap|FHl@CFIsk*O^E=7SRk_f$}U7nS_`389r)|X3F6t4D1}2KZmL_B5%6Q6ogu9+0`P|byvvr?nTY_CJoOmtV0Z! zHOwn!K#2E`2_EDLFN{gNRt|N5*}zFIzxzw{Z`kod_VU#}YQ(v-tL2O@=L#SuyQH@^cS@T z$zJ-KBgk#cS>(LwhuSpzWqGPm)y^TfD`98Q_J^{95S3ewmT<7o3ysBVUbv4vyJ7jM{WnG3UJy z^?}b~^Q+G}ze+ITw>Y1jRD8rjyGQm)?xy+FovRK%OlB;|Pg>g@?|Hj=&17Pqm(;?D zH_Kfq(*G?1@7N9$;6zsomA2jX$Dr(Uj;D{>!u=l=_pOg=5JIo+&uf$7XQ$}*tTZkmbfaR?h(rvfl{7gfqq`vvFda%76MdB0#z%8f=R zoxkk+FTubtL2dSV)&YixVEq7imIk_NyS_D~^7P7YEolE&?v#9|>dB!>BJA*Ix)ZzGlM9+}IY1+wTN+8v$y_7%}bqU{ycvTdka#~-z*&>8!_w%@)t_QVsz z-5gI=P5$}_{rt^ZZjFo|3y3aZ5#OlSIshjww_C#qE~00yVMPT%n!f1A4R3YDt7Foy z8u$-=a%sTEsX)T7Vo-Ah=34yvI^Jlb@*GI*OF{X77#45L=0v}*SK*p$_1QlX<6xUD zH3+B~pk8~w*^fc+pB#cdD!2rVaY?UFNs^H%W+5YUfQL}Jj~MIylpslum{xYtfpS?<%c&M7f>`0+4g0ADMJ%AkOSSWO_f3k* zMU!Nt3a&W(^T%&4RTvRnby@ zl+!__uE;}K20=kQqIB=5R6?8YXDecSt!yu%ib9$seCV|BdXRH2NzT8Xyt$pQDlL+3 zTTkhHjobV$NW$()fxl+_6FeM)98%H#>46cA8+L;K;VFA?P>Y3yPGa*prMa6{ zs1JGnlc-}qkO_T8PcAf?R(kD#s<65q>K^_6<#e@~?$De3-+fX7>oU%44u38mmRJoQ z28ynUEju^@46w1{cLZqJz%+o6IJ@h=II%~888Je5#tZ8@eWss243d3 zrz`><6eIv);^7&F1R374%LDO?YjjAH<4{-dj1c&j9!Yv!{bM zHLs6~hY$?6iLGsupz`xkFwGE44Q?&S!;)Xnx}39B6hN@pWEr2@8pyIMzT8wi%*|b$ zZZt@;B_-BEHBtly_38umPDO`3+qNLWdupZA&H9wgxtS52BijN8T5U zJzaR6)x*8e#6^s~_d3`|rc*bwv$}Br(~LN7$DtEfFtYN|vWr&;54b?wVYy6tn!)W`S3uk;BMN_LsSCIz+Ahct!=rKhSbNF>4|=cz~CsA=o- zQF#a%ms+{%&Ugm-^z-|qK@oWn+#~6dt}W%OOnb@B`C;yf?-bFd)?j|o2{grQWVO@s zkz-!H?0RH#^22h^6Qd0+22PqcvymbasGWwtca#%*uWZ*_RVF;9wMs9G310n~Ly#UT zm&bc`&u>No{TgH1jvs7v=^kVyZ!Fl25(z^OKKRC{2K4y@`SaZSDJiiydjpS;bsE-=|z-_VFsyZCp{di^1{J+z(a`|BZ+fEs~n9SuHM(I3NK zH+$M~@|=Lhx@WzB8X0(1hdfo_wQV=7p5W3vw8^!fnZC^T5|Lu{y*|8ylh2pY_q}un zlPhmXaebw#??%j6#o7Ra-@`vjA-x8w6Zl{4OYL;(OP`*2|ynBZEgBKRB35LkRkRteO!00bu#GufEy19BG9YJ4C70mIR$sTsaP$^ zHtx6t8mM%0g(zVDn;YrWm)IXZFY?5~W>n+@Vh!iqq5q1vC1WnM5c%I1adq9W-IV7k zZr}@gpX^0FdvI3q;Uv%MGltjpN8XrH248&oS~(}+W%z6!P5uayP~mXb!BG)ARrP)^ zfAitDJ<$0o53>d5%0Hd^R4f6<(lg3kV~StityJ+~A3qNK7C$bM+US0d0W+q!Jh|gG zduLB5rmArO<(b-W%|=5S5nYHqHJv9afAjBjcb;GP?+2uu?Gw%IPCfd4lmmCdj-`q1 znm@78D;GXX;bh0o{WbZm>aq3`AbDH90$FW-0#W(pQ1$k|0FCh9u;9x7?JFMkt=stB ze)Ka=P%I4EKDBxK?$Jwcf4C>*Ee(sg!RrxU0sYPx1#YNkppmintq&~ixNO7FPEnCu z#AhkF&-oIC?xPnYz5|v%WE}~4wikWp&dpzD>xoTcPaohFCNJlOhXcytVdt4n>AvvSaSAx<}|J!Cfx5I58fUgqT2lX*jx@U7{@!JIJ{zDJNx0a@g(`0yu zMpBrNrCS+Uuur$jaSmCYW*G-k1`z!_OHMG9v!~`p(MYw$Y;DqASORPw-*o*}?04WN zJ9Vr1zC!>HsDyzM!s-x#DXR8dz+$XD0dFE2|4jEP@BU|8Zn8F7(oiX zCQ*I7EO`TFu+9B|8vun6*RN1aK{;e2sWZ~}Sf+yWq=gg&`F)9Y^1{XWciGRdpRzYy ztdxaHQ}r1^S*k`qol&zP?z@+^JVvYt25RyC8z$|JVmNIthNW?J;&cA7s1KY6J)cH-{2pm); z{%FXHxVNSY-6s(1v5B~4+}GQRSa&>^5L^1mt{;+9Vc`L3+NA^NU}n{!XJP?i4K9f? z^BcRrU(pG>kARYZ;(Hd08CtXw@@WC{-J5OHcj9xqYW<0)&c*S%pb6tr@uxof&U*DY z)q)B$F58{oGhF%5U`8xW#_-XrfJ2Qk_PWImZwPXT|4hB5wJDIED}f|*s02k^>c5GY zhs4_z06f{>P)6LVrm4UlO&h*o{zoTpbB9<;!#Oj(F>`roDML<&{ z;w#-m+fOcZEj&uDcBJ^jW;PKFD%kJOjXjC`BcF;Cd^umX1@Wq>-VURBNZ28V{!}C7 zlR0s&NZB~soRXqccot*c*vg!B2DyH-VW}=uHwKv-`-$j!Pl+$NmFRLDA9T%QM#uji zu2M8cR>}G0W(zLD)f{^6wnT60MId|6{2Z*qoaw`+WrEVq;p@xF-BwM z6AbnHu?U`8+0KH+=D-gm2zX5S4#Hx*fdJU|Sm%I@QbOARF`|P0A}6)-zo~s@wy4lO zV+HR9TwjtbT!Y>O=*8rB6{6uW`@pAUR8j9MIH74yfbmG*Q+|8;HivreGMQ)7Db1W0 zCW9rt+*8<$jUq#|1NJG7#Py1I^*H}ttwF*-4+S-4;eFuhSX^+>GJMYCU0owal-n4gV8@l&ApQ;$Xpx$U=zYuYg^5wnnNg&F3m zn%~HPgU8f%&dSv6PUq~E3J;dWRd2DTMqnPvPAva6=>DlM1%OqhCvMM`_A8c@w5%g> zB*1unjtE?RzVDZ&@2JDuAi)<`;AT#Evm9vi_~kItWU=XV|9OCK+)ZO37QP;I$h&G4 zI=FN|SN+v3Ox%lfgh{J3Yc=li+Ei1MRRK`QxqgsNO(ko@pOZM5$yYOXq_M>5_wKH% zf*{!o3c&4qXYcYT-YxsG7DH;pk*hO6GWzJg>R$o<<^|?Qou1t?<9yiTK zPQ-{E*>>=bg5lERrdaKv(M3tP-`4rn;h_nqDYyM8CPjq4=eF(SMqr)9P|Z1tQm<*i zmPsDb_<55>PgP*1g*!5V;EPQg7ds!Vr}k0g{^MfZXJwY&fq_Q3QJ_Eu(X4}Tyn1}V z{r95^#B-SI0KE`Jf^3qS+Yx%@oSHy;JbX`Dr(5C6qkZQ7i`kphM8~TH)m0NJHb^!m zPGeaw#ch0#0WMk$}Ee3=RJu?ur+YkPaVDNSF(}X*{4yzoP7yr=RN(Vltum2CJ{ZY(dqrzF~U9lzY<4BdEt*V33i_?<9 zZeMR=hbh3jik!IB^^#{Q?cY=4Pdq0iWKI{7l;%CzB)< zZ6JlnfmvWufNsmQ{Y%Gb?gTl*pst=q>--4=TGg90+M;oGliL7e@TM4ocH7pswLlL?vmHfXL$$VbE?C3Xzib{^8_(*ve+txpO#;xIG_-Sp z?a*$)Ejn+R(4KHqfqwWgBxUVzTEOR1TO1VpcF3XBKW7(R?ms&5#A3Ob_8ti+V%_?g zx;W=tu1`z|`TRILZB98tw(Kj{r0{-+OZg9m!xX}N9XZ@uF$r^(9(Da1^uMUDs8w!K z1t`2I^OeMlF!Ey3ca6V<hYVw!sUYHe|OY+7x$pAN5`i+ zJUF(=Ll?~W-${uSiVUqxBq#}&katiivZA5>W?yo8nr&@`|7h5S_r*|F5$E|RIC&+W zGG2n>Zf&;LGb@sww#y^Ym6Ti6WHHv{oFR4{-^INRul5;dJp}J zS!nK!~aJRTCT2+b?MnfM1+$jp-3hsW=bl$%^AM!fK=ua@n7)q#K2@5*z zA^|1u`^VHY*3(~_6s6=7jov6AooBw>xmS<=qV7}3jigLwb)+2zy53zc_*~E0c>yF6 z6iQ-WusVtH=fmldhkXVP-0KlEoHO@79yw7%OE0G`$w|KYRqXdudcQzp<(|(Oy`>8W z!QnjV8c8EvoR-nSPYGEP|M9;%Voc`4I2r+omf$@{K0HRajNUmf^&YW-W6lJa{eq6v zzU>X&i4C%oB#x zx1v@}-N)sG@-jApssxeWU7V{*cTlkrnKSvt(8NAw z5_bAJ8pgbD$hZUSmj@YZ%m25?QIF^_O`wrXArRgZ1aj^d$MXU9YmvOdE57K>o|}zE zH%fcrMM?dG^Fk@|+&cwei^l50>Au)>c6coS|GZQsUw<_%A<^#R+%Uj~UL&-^7GO zlJ6dEfH@9EI0_B*kCH&46{e(6!T0fy0>`NtBn!4Si{!pCq+*gcPMvrG{UV0^DV%<& zND{yah6hWCWv$qvlI14bf8BB! zV}D;A)aicNmZ0I?yk>6YJrC5|#Zts%n*H-47^Z2}sh_=+*EkqHp4 zH*$l*u&<~7=Efy>nh7A>sj!_d#a7NE0#tmtpgb_Ph;<}@ij(YIXO8cQDkFvRD6Exh zS;ioisX;xs`0%#dhyM zXDqz;3;5nKv{FoRi1M!*uhZYe+%g?{0e{8*uWJ*O7RL8Sj$Sr1LvNM>_RPLD6v&_l z(o2<*{haSgm}(_HC6QtEET=qrrsowsaWG;D#_%a`;dhzR|E$J0V^6`ZDkbip?jv%S zzpo%S1xb>Xb~1fp6FV!;P^DHK+|QFbCe+83!l8-Kw*|HvI787`^)+bK7TH4h+zIch z0mvupcBzl9e2?i2-2`QCC?=c{omb)?aw=Io_HcJ|Ks z5$!2O1?arX(z-UIE)h|#|EC;CwCmkD)N?4I`^v}B)1~d>4q{AY0j|+~!O5>S(gwY= zGxF*wXSRF5PixJ%F(NKOwer~w?jPfMp3{MBGna}tuu||mRfQiN8_yO$yNl)PXc(*9 ziPs$`5l2~z&4$XM#jVm$MvMy1bUaQ#(Ff@}BZl5AB}{vS(xnQyed5uim})yfPt4OR zm*H*+W%nWYll3)Y!bH_2#?h_KG?uL`w++^DDsFG01{K2L+-EUgaBGhw^uttYBP)i5 zJ3q`NMXDHMs}T~nN=8MyJ45&Nql=yRA5)Ba(8wzjZZ14|x^2<|l&|WsoLJpN@*^+U z>u`tO)%xuh*tuEZR~Pfm$#Vor-@Vj((B8+p&|L*9gff27bN-`;Df?ueAs{mLw@bK-`Sl$ z3vi=SR<7)4Ogzl*dN*pj*FQ*cEvEe9+Jf4+1)24_D@d1bkzL{g!M$2~o+vttX6KEl zVum)qCEp`)Qw9iP`Cs0MxWvqS;kZ309X7LJq=8<$h z-_AV-;Q3&WMIz@I%Y4omh`YLzme86Q7p28^K!*O+L1t~O@}!~I0d_HfPsv|F_=mU6 zgurV!MFnn(Qz0XUyu#lqmYyOX^!18cd71Im5C`gHb-Bb^hb$G1&81cphyw6K&o=>s z4H_B-@#Ti(+ol#hxl`SoKhP*E?gocSGu#hFJj?xHf(Tq|$J16xwD$lI*P*BZ^^z>Z z`D3W_>Iva_r^0)efiZ>ueBz~w2RxbeAZzYA_48OpBr`7scw6zq&u1=Smb9FYdnXC8(@-useF#pu=)B-!zE=AmnAQB{TdmjRomwhm~6g$H0^^O zzSjGhc1NzmO#QAe`^_|-MSI2h%Afg40H!x-99&ldO^lk6IC`DW|B-hH{wKhT5a)s9 zvkrZ=4BqwGA9YATo;N(NA1CznG zjOV0xD$h#HO+l9#N7~32!?xaZ4F_fNhH&Yq!%15vS^wFPCxdI6jb|eB)bEF_Ml7r} zYStX_x0`%;#?kA*kpzZtiX1S+a8pHm` zmPv&6@CsA`qoLOLwrZU>-q2_MebSm9viy~h4j-P?dGj`2nRHsQvY(cvC}%Bg0NbeB zMjwxFJJ;8!q%zO)kxdE=Qup}QyLrf6_awa018ej|OuF$PD92-u$95UBBsbF{nYDlq znz)6or&+UTSS5Ur!+fuaU^a|yh8}SKI-2n{KnoZ=d#V=PW?ln3y?vInzs%v^Jhbxk z61z2r289%!K#0G1xYx?<$=wSLv?CZ;Pc1D&77)fOx0?B%?b*v-95>VTD-Jx~g)Mtp z3H71K+Z`r@a&In}Kw-M?yi0i#43H!gNZk0H`KHvP^&*l!9pq0pB94wS6$NR(P@bpf zS3TsQ8zjY2J+RP5$22n1irAV`%7j}9;V}}npG=sBANdoY>$DO*HgXQ=S@(ohGxQ}! z+O7eclaf|LG!M#0Z{AlTb~A}GhBR-!Z3!e3u&`ALMeq0VVOvR+T*i=v9|f@Rdy?PN zMoQjtos(|m3-?D|jqttr@ywK7FaN7j7MPtSE}i}II*X%&qir8`C#h1ZbR#5^{ zQM=G*YJOPc{?%idG!n7v%)-K6S8k+#;;pGRX4@f-D1B$^_SER|^TeM@ZDXb;_<+ch zouH#yAU2srTL0p-kB-&X&DtHqOp;Nmp|y>3@p3(%b@MCxxx#3LNe-;6LmsQ(d^f%H z$EQ2auk&_pSWI>^g7A~vWAyOw!9|)OeD3fHt3qKuUC0z$>o`iS3MoQ3P4(I%P%Zx{ z#6C=LiP%caXvlmr&slkU(H-_FZjE-zlo@nGK5-{UW6N}lwQe?Oao{kyC)m>b<&SzJ zK4Xzr^thxv>HBijv(vsXu*$ICd1S;p1d9wh6ZgmYB@w8oq_97!Z(H=8k3wdayj@(s zy!x{2|9zb`5kPloWB}Cg1f8;6%vyE1n8@Szg16lG&iZT)=oHjwitg(}t_!$jDa;#K zVrlceG)NXI8O!3&knO3}Ed3$+7QzHev5VPFbJ_Mrkg+|yn+&sr2aI$z;j{@v z@&z4UtQfjS2RN-d6#R!L`;_VW9Sd5;vIq--rbs@~s5mAA{FR8Kb!b!l66I`F3h(F% z_MR4n13(Knj>uMPj<(U3V{$2-BdZ=CC2!^l9Of!99^y@k-*8{Y3Q5SgOer0`$<4aW zy4X78PIJ9X=c}b&8zN{WbF<@eg8z8an)LCUQGZx77{i^;1xFv{@%Mp)Y+^Zu!~!Tc z=T;54nsaIu|5`I5UWF)2o}kJo1oT_G9|_Cf-EYo0l@+g)S^2(w_?7h_Mz67D#68JO z_zJ9G*E5kHkDcMvA^lu58x(;X)=U+5h|tmmq2e;{|E@KPay^mSg4iBJ@_ufXUlYwD z9{`SB``GhBpyRwE8NltYBV1=K0>yrU;EctT*wcULw?F%^W3KE^0yx5 zkVzZ*F)aq8+@$MVDmR&KNm|LlFk=O+HZH=o{Vp;ko!!~SrOTQED4a5;&mZ&SKRi35 zKhfvKNMvN|Z_;p!Pu=TP_)G}R?{;kLwx~)G)IEsFUSi235_a3a?u}xG`9+fd0DrG6 zMLBFkRIrZ&9}#x1-A?e+taZr|wrf)<_%4&rl`*&vs9BPIHFpdnK8kKQ31GP)aQlkh+-W03BK-C9^qIPuNxZ8Bt5F`<5;rYGD^ z(sKGCsQZM)JPJF3P+NqtR;T%^)buiuSwAIB-$)Cy4VI%5aBZ;Y=cZd^d2EH^+nIIr zcJ=%%4*1sZ=PlNM=l8%OIMqqTefG)0D+?doDltVOHJi$Mj{@u=o64M1iXQ$Ol8O>O zSJw|Dk%O?VWsf* zTa;bZ^Yv!S!QP)Ze)%(Oc^&e;fHt=zIPqDIwF0#XBaC1o5yJ7x=GTa~Q_$*Mi*4m~>O{r9%+jap?xc?5aYf{x)-Y$V`FJU<^OhjZUq;FG^6x>VrD2hu#?N^|~ zBrRgY3z+kwBz{?B1EGf^e`UFv+|uN>T}2p;wdt~xVK^!+$Ys#OW@y4gYqlhsSj2b3 z%jLf^fN#u!r21qh5P>)P&}C6$f4f1{L-hrO?j?8aBV*Di%#kc)o^3+i5f!W!lQm?} zD;6*H#^kds8#}|rS8&G!7NS?ox@`)=O5aCNUW7q$B9B?0y@yJ%Hk;ng1pKC~uy?jH zVkiYO+%~&CXBu9)UydvL8jnqtDY7JKv{hk`3+0#-Dh_{7j>|7a8roupAGiW6IA-j$ z^BDajD0dV|{Z9T zjuj+Fi@4NL_g(vKv3muPJHcrGd?P?XrCM1;cEashXYrqmj*oi%71&E8hnKnPMuSNi zcYk76?zc{L0^E(<&J^+w{M&1@54bTaIwMrdG=K7Z@+EoR^=|%jU8SQ>!rV%h`9&bV zHSsHdV+SZ@LJqqV$>*Xy?WS~n7aL2j;bof`Deg^T`U9_uf2%lBTToc@SC@^E zpjj&8J^Nq@$WE^IAKU?Z*$z|wuGDgcu>HObgY^;oDN8K|&JD4%g^$8Fn_|%R68R&~ z=wYz7!D$60lSkFCP<;nyJ+&Y&D2aJZBbQVGY8^^urd6&E_a`mrV;`~M@a5BR3g~NF ziZ#g0J5UhA>V7eRl4z>jkqNvvBTi0xGq9Y15MisHP8tHHL*{Kj)yrbU%gp@|2D*9l^wH{8r*K7m4kKidTN{i-oL>^sf?C z&tnb}IL2(|O{{y71ZR~ZulL^?kweCw3Uq{*s(bPhQM$t>S0I{!G*jvT?L_6{1d|DQ z-{`lc2CaU@*7uXV$Z7E`~!gKyg&R zkclFvdKg4)nEMI=9ER)x1+Ki12*AI?uJURs8=Ai2}6xCCx-t*`>G}I|oQG z73l6wt&tqQsU0?-M*J}J2m9OY`7vI@X!j>Q!!T;c$YfA}t7+t4DyMydS44}X$dHKP z<08f5H;b~N2UJHBSZM`DRNk`Ik6T{|h^xPQrNXw09rMk!`C^tDfoo69eqhX#>(*-R zmDfZCh%u#2;Spr z)19YQGw*;m=H!YZL??0a9Xv?@)Sy57IBeY_YE zJMT0y?QALBe!x1|Z7&*&wF5kie=VzQ;h13Jh}-g@J-9b@aR>Xf2iudnEtTGaKJH2X zBRnSSj((BJV>t!JE8nua;`s;X&v(%;n&(6|AyEnD>?hc~z5k}-# zsW+zoWycxb>0IkW(1b6~P#>(jIvKo&+FkI=jV*tcUM;LLxGzqsX)YV?H*{}hoipnH zl{Fq`Gp^f8N5>pCDKw-A9`08|eF`ubB}DGBYv2*{u8@h3M(eR#>bhHQmr6?~4qAR? z+(?)Km-MapVfy*A6JISuq<7k+`TEd}H&U@^+-+RwDsBNd2D6&YkouLX_CWr8e&BpU zBRT6|jDAq-Xg_e-WhbLZ;E0D%AV94^c6^31>&RXztH+vp9n`Qr%lfQ6kG4hKP$JhI z$2~I!l9+ku4FyrEWpS035s>1Pcs7S$dIpPm5FQrIz2=wa{tYZDhxmk>yXlABjt8sM z&hvU{+A}>@XXKAnge^aGqrEEz$*iBg?jE0Fe3V45ek88nq9asQn?i~+5>rKMTx}eP zT#s+z@7A+R*%#c3lh0mHL}pL{Dfs$ja?5`4^Ml79uC|j0PGd$u7aU_(2s`EL!`}u( zyd-j?Vq@8%+NzNr5=!VEuLWazsuE=rbdlS|gzI(cK0&t%?><`1^x#L%7uM__wj#0n z#^}R7-J5>zfKP5+_mlp>XC<~Z8o*6uBZJ^sn{hF3^PHu%o# z@~H1VB}ZOm3?NETRqrUA@Hh7_Eff^|@}vLMXwb}D@7b=-@bsf(+t(fCAd=I}NezB9I86{;#% zo*t@*x8h!~Gl}-0pLLT1dZq9eCiGC8SNAu>pMq1+n~9{1gjOm37aQ5pYRs=YZ*rCu z(1j)&8(s-3a)PjKO}p7(zIvW{Vl>~dZ% z(rvo9y{X5Z7WOIpt0j?{o}vGC@89F^L~2v;tRa2Yr8V~NDJP3l@%l4$-(Jt;2!3Ma zPJ7=QnPHu&u8x&D#O&>KJgjpx{lHf|o6o-G)RP5UUhnm+(~uEHP{L1L@+0s!_L&}O zltZtK?;}S~`no{yxM~~oz8lw6K} z4&mqh)yYHkT}Rsx;z!-C7?gB+$F5e{#t9?`21XUJ^!!}rsX8*d8NI{oX~v^pm{L;p zze(=s)iAh+jHvvHd5*E@BICq3fg=5a^;_JGhG&2!AnzshI->}&63@4kDfFYg{jve0 zxa0Sch&4v?>Ax5ZIw&Zi2MULxG}0%|_*DX@cw>IeQ}t#d{}7{}Nxax&33a|k%e>2h zzy9go46MVni)1oEFLn#)ypt~p^yE~&C3`hkand|(`yV(Md`jgOd1K&Sjwr!=-UPe> zbcTBXUA_A1pTFcqTC@+FI7pMPxKN0DD+u1h`J#odD+A_lB;m1}CKf*gY4g2Em!F+$ ziN~}}nu+9Z^LaaF$r-t_=T?1_e}|~)+(qPkYz7KI(oz>f{3 zi%Nb%vl(g^1CoCw=H7$nPJ%gw%M=w?#EELiE$-VQpTZ@}q)OGEC0Lw%sg3!`bazQvo_Ze{ouFD{f?b;P zVXtESX=i&jYxU3MaS~^g$kpXCeo6@q{nBn1IjYe?%6s0Wez-X} zteaCGL{~_OSUB&%rEj;z1nmbbizo1UGPps>>t%Y69v-g!TSnnbogcD1F_qt0_icX3 z+iC>A%-g{I zU=gK4bG$5-CR$EIb;{;vUdhcjFEOwr1Dyk~)4J-!?0$W1cgs3ltfV(@6|6IiE8v9A z_KSuRvNZ^oJP*>uozO|Gt zPy#eAG@9h+a)3>6?X@&*qgK$u$0d6G*NM3Ix*3)+tz4uf;!^BmU=e60X#W6eft|CE zVYf#3DOvF;47|*nRt1V9rzwXdr1@(Z7T%TMLI2lIDa(q~DN1njhB|qM21LapXErLR zx%qU2qkCuCXvB~1&ve=w%8baE@jSGu#g`z5H>QSX#0Lsw0PYl7IE;b{Y$oaxaCeNS zYlmkvq zCk(yoo=emz+Y(M|Dd2%ZAXgljk*r$Qn09FM|`JaR}KkpO^|&Pal(y<7gpf+b!{luJ}pQ) za$}{r%l$#G(5@zmD@wN_y&3>__KUW39^|t3em3;pe@Vmls+UvFVNN~bbI5tJT~DY1 zOp{Jf(3B}zR)BSA9$v0-{|5BOJsQjhw6N(}^YK48%tQdm=& zFGJyE76G=DN=f&cRxg{`_Cc|MtXl9HH|#B*XPoM_@!VJwpUTf+PZ zH~Dsu7c2yR-a#|gdh4xZApgQLEp$kC8&Y&f9$Lc^sc>~Wt+w9a%R-~E^duEECDCi* zA|?^%DJ2n!;Moe+g;-Sl~KMZ3@%w3+BFGb7>4IrD+rvX9`~ zL7p`}&P*h^9H@MTII6LkcX=;bl-c#qz_%ZM;K|f_2JqV!$tcK`A)EB$zpYcH4FAP! z>((J?rT885Lh@jXeZThO6Dr3F8Sy6|LC{MWJR~1h_o^SS~Z5C*?+> zPbD)_`U9-IBdtDMao-2+hbI)3o6^YD4d}RO7R+hc{g7wkUUV;r|D5x5@24|UoF)mq zn7#TL!`4EYt~b5+Z)Hzki4T7*&q`K#cGD3*>e>CJ`aXj3bcE1q*&)|x?ro65dmCWa zHHa8~O~I!E-uj**w+nUN)D>4)`djKUeD=b6*0CO_q<5 z8onp@lE*bJEzcT#vqN)AP*)^ft!B^@ohw*f&`N}hg1Q|$3ng=<4SmyDhjg!bS{2^q zRtktPgAt6uKa&k=evTJuAg6eV+|}*kxfxIlRm5Z3W1t4H_vQs4UGSjSn8sEId6YCg z(s^R%8BCB6ITS6j+Ox_kSh!-(Ul%;hWx+IfoN3o2A`fsrxxj2dvVesN zl7iLnqDrJ9sq)iW(akEJu%HKMMs&OuaIiB4!+aD+my0XEMM-wj3th7x3p%b1%!)*) zx<@ri8rPYY`By~TU5932-HWvZ*OD?62^B$GDFo3YqTx6==y%K#f3!x!#SGOn>4ms_WuiUL=wQ4^;xw;TDC%1P6Y#qK7U zWR@nCT=O>V?xg`se{@-$!q-aMIctC_=i66;pvi?np$q12aawgW`qc;z49aZ0Fj@Nr z#g?}#pB=)Ki{a$X zvOV~#eq)4M*MbMnihX8KC5IwGpz_7?>IaQ3C5DeR<& z7KdwMAHfG7ur11ZGH0Y=?U0}@6}WiQp!Ht7`O2yJ^p$O~|ICinzOAxrZgHqj@c35$ z@bD*HkNKMFl7=>~s(&;K12rtBchw z-o)#rM4i6d6I6nEAUE%&EVl|c7G1ijrO#zTY8apyw~9?3$zZYU0?lu)S78> zfPGJM#j@uEk9Pzrt74RlE^AeXcH!#*YECE`o!3F><^x_-2$$6yo< zFS@UZ+RvJ+7qkvJ))>AszZFr35A!>9skM%ybb)auZMbp2cBNP;w<;|&LMH_1ZQHI3wd??opEq|?_B zLr%qU#J8kM+^^~*DSh&@kM|W1q2DI{Rsk#J_yB4UTNkRI|0b%Nn$yHW=nIL1Xu(+R@7ll2=k>;?ADrLf!eR6p)J1wI$o#; zqzvVa0$#sXjU?-ombT1?L;9k6+rQBC4@-=+pT%(Mr-G&hmnlekje z?Q8F2lpY@FBRc@t_5tCBwRT0L>Ra94sr7y}Shv@8)>=R2;(U0@M?K#X$Uhrpew0hy z=SaC={(%nc2kUNBLzJ~RIyEg%Us80w;{7HPT0AC*FP0NC9Q|(Y7A)10mQOZNCW0LN zg4YH@bd_F;O@mu^!S4F&_$Q~xuBTq_w>4&0gsrZNToz8|N|fg_*8E`Cm5bGmO)KIg zfjTpn@onqZLXd^1ACh+W@=*%8o2o?h-RzYK5pOQutP#Wz!DRdzrTTY%8z$=|RAB zrR*2~n(kCfzvA-7P=lnZ#a`eFMa7N&8{O+xddAzpbtV}yG7+9+A)(phc9fEF#;VZW zLoOm+&$F*XEcJ^&?!T`+OXjroOLwLQRCQc=NCUwDoBG!)J=2M!~)+Lq9(R2Lm~y(e-7c%{{wzuRPfjJeecp_{H* zsDUbVN^@r}jQD9Htw=;Hx82!zPt<0iT(odx*F@y9ZCG;&QrkWQJ7`LC4l!5Xzi=Dvp*E9v_j*FOBkX-TeJbcWF%V?XP1_&+k2}n>jW|D4PNdhJGfltp4#i;{md)B zJQI-J*V^?HuyCY1qgqy#;nuNbrr8m1D0W&=aQ&rauDl=R=!4*mSM7BqJ5bMs%q{&{ z7F8SO6zl+=7sO^)h?J776!+f>yp7gDlo(ZZHtRRx{$g1tug>*Ffnpe8%~`o?ogazi zsz4p_zNk!|Xr|8S_uh#VN4k{=cJQR^SHasMipa;waQ;b~Z%R$(T`f@H_ojc4i*CT5 zMx@v@DNte1Fk$#;nk{~cW)(#ND36PNmt$0Hn)q=%AJXsCp7}v>OkbY8zn9ye@kpUo zv9a%2GJtGlvzXz%C)oFJEw+0yG5#l^!t5kBPbmffU~kKCm}ZUFm47KF%WFtPTIrji zH}}Mn{B2>yys4DPD~%%gWk@GHq$m@Sc!zAoe16Bo;M$cENJa)&AF#0)^d{@Cm#~rp znlWgTN?U%ECY#YLB4;)@UpTrH6UWJ$%znmN0v6VyUfc(!)f-LamKx~cCvg47Wm9*g zFLu0$z?tR{dxvVmcg02wx~D@_weDHW=Eja=GQIrvHPbF>S!~LU!ZmPJ5l8OK^khMP zZe=+J7uk%n+Si=`t9UCA%+I+H%UD!(`yi1&_-VN0FgHiBuvy%OCl7;&o%SFV9?dS2 z`ka~1n;0I}e{#z>`kb|Qq=#l9nX40F7f*6nk)_{gJcuyrR#<6GQsfW*fF>?EaZ7Oz zlm3|)z{|^A;$^)#XN|;?BZ^l6N!7Hd2ah@)52GfAD?Z5#O7a$^qQVC=Gg2>fN*~|v ze*hHWY7Yzvzi7K)J2U#DphSe)Df<3vE8hH5GI92}#LjCk=RILF)!&aLei7m&+P^#p ze3~j-9if&&PaWDu!IgE7FK_a#(jm`IjBJfDRY2v@q92UP>QGvGkQ|RvZ;m3^L)*=t*hA+V*-y3r~*elA9uXIP7QJI#JY-4j%u)3T(zSD1$G) z|3O9l{iw({(R$=ZC-TILit;T=Wimq#Q#VwiQc#F@5B)w$*lWtRt$DwI?e~8eElClk>S=^!7=0Z_rrpF z4+os?sUxyQKf~mZCg}6WWGiYG=4^j)(av7XZuxk~JbT%LU%F#o=j5+u3 zVAxR3ZBlSpQWC--Cs%=6rQZM2f8ysgo5PAhozjL{c%iWdw=xRPJ9&~Hr4wn3;65jh zKX><7ep=v<`t!m-?zY&2Cz7x>!;L7yB{t+s(v>wm*eGx#X!lV^_eajUklSm{o&~NI%DYT#hh_=J?nJrDr4GS z+*pj3_`7k^m*S!!!8?t#Q|alP^WD23iuT?`AoPC` z)Krx?+sH<(s@RY76*J<0rstoVDkrafls5{cx7QAj0iHy{dg>VMDZ+J~7s)jO$;#IL zZil9RQ7H45KE~c2H*vW+Hd0&5rTVk6Uh$CFuXo`B8P3E^x^V4u&~*dkXX|KVTk~Cn ziJiRh3t|HZsq(g`>dRQcn1c5)H_`9OZ_%Mn(-pR^PUsp(bV<70sQKZ}mpO3v!{uRK z!N?u@IpwvCSkUx?%HiHkS{3mJV4bWUv?XPTk)bo?&PQO>Ah+h3?t5nmhBcjlUqqA* zkG>#^=#S*2>0My@97lg(~@_>5w0z!JVX$+gxNnE{liSPa7@HcCNpFNzcjLClfXw^Sd2Gb~aNV+`RuoG1 z8&OUP);ey!yo zTP!%p_!gsll>CXAFr~GCa&PI87LAWupJY3j>AM<}Go(_HOV3gxd!L1vOy5n;k{uE} z%_g8@Re^+v#ueOJF@YL4mqy8Ex^EZY2 zsy%Pi;h(Kp0*IV_+lzXB_i?u2A-%EJP8<)zpPW7g)YfscbQ#_tlNX;2dv3SJXrZhf z%gB~b-gJnRu!3x?XZHA&U&}*=euS!2ekQNY+{~@(0!4Rm{2$p#{aSLqCms=F73V!8 zI5vicj#o1$x<}Fb4kQ$FM$-HT6=G7`pxzKj)QL(loAcz0?vY48GYcrw5ccRUOlMcT zQL)7eD9GQ6q*M`+7nGN7JZYVrpbgSVn?u0Yg_Qp~L(wy{bGOfYMW&m+u}_ z77s@jzomd%;}S8G_=~DmL za`G28G$c6^Jt;S>u5+@sz_s*8iE2>S=kCsA-<7^lIK3+XRFcl-J#wZ#;t$nTO<<(< z4z!um&krZI?ap114nNT6sFg^tHCY%S9WT0bu)YJ_rx!%M>mOe+zwmn|ED0GjcWW0; zGi(=9+0<(=9VOm}A>UtraC7qaO_NJalIMwPrhY$LkenCkEQ#b{lrTT)0J8GrT9~iB ziMR3yEV!aw@#+f2n9*}4(o4&0;Ul|&V-iBoYQsm*a>bPP-t|iApIr_OkwI`jxQvtL zy-N#~EWGYI%Rm!keORX`80|exh|!{}!PWE^?yMlKJeEp;k1xUXqtE=HJZ7Y|*=TER z+v%l5^;{)CDtV7*r{&7GXMb8VCuIQ!_SQEyDaUuFLYT3zb*~+HQoQF>ahqLWSjqmH z5W?s4bY|vY$!4du;U1}zgXlkEbcA&6%>*`*MWahH`u#YU^?1i2LfrGvem&}dPyG*; ze^wi9j646(=lUtw-@j*~5a+6)sMPK9fWvQ1fm4HU?Y=ZI3j>tUi$9XQ{KF+r!|^ZI z5?*tEfQde{LPy=Awz=r4yGyXZR&PJQ;mA2`lK)){&(YG3+T7Hv2^{RCF&c3M*Qlue zEoZnLp}4#yF(8(dG2g}v6U+waf&J>Q^yf@1f3V&ymw!VXDOr0g{z;aQFWkZkm0lj| zg?pqF-oAbLjM<0%p%KRcdkQS2p&bw76cZVrgw8YiyY}yG-o|vCPHU!;3{n){ZkDY@ z0l{MYEHTB-lsy|pxclu`Tsx()NF)Ojcb_)$ceRgN!KOrH*+$kU zCbX>SUtU*NJMcr*mJ+*p6ES7 zQuNkZX!?^1~k*#O@8q=P{Y2iDOE+T3mX;&a>KHkJg zqyd&h&%%(Yza0@Sc3P`Ln1ut8)8QUhuIUqd?PkH@V$g+~5_E)77ar;&rO_YX_*33JQqiw~oT<&E6c zrDYFaCB^lGwMO3PkJjN8{NzCRz#&rDVyAUf^ioMb6{W_XgC-?^Aw;wcMevuRnyzN+ zRySs@lKR|E6)eHFd(%bhIl~H_u8Cu_)No~n#LOE<|<*> zy_Uaaj`i5-guzjZBdCiUWFvRX8eT7DWQXSBo^81MtX#)qI)2vYbXWCI?6w5#t=NY9 z@@j_L1sP^JJj_|ug+*tKofVEnv4l)}Ebu|V4F%N95@->_lH9_5T_YiG|BjBcn>p`B z+qplZaI~puS0|-o^I@f|4#lxfel0zDLTQu;L1!;81(^ju`s@k6qPD~a2C4C^4ZZjA z8oS8yAiooR^;nvdT#Yl&#X<-1;t50HTuwXd1(4~Vs4s0hnjR{X3PZ4_8*GI-mec*8 zi1B=iSCW#!{Qg`E81_;*4x$}714IYJ5h%xoGZ%QDXGVI4NO;^|zUs=R7@4LWmop|z z{D_zD+;LcLFNKA7kPC$+3#LNPos?){qVB07D_4Tav*Us$77=P_k57bzT~Gw)MXRiV46yz$)Dj!eHv_oIT#^oS`B!hh;|f zv+V!1scWm+uzj$@@YnDyH(yX+?h{^h-mILISWX5J03YD*X8iqEV#v~<>mYai0Clff=}#R@q5CO)rA*jF(1fRp&JzYs2<=w6JB6x5#=CiZ%- zcJJ$A{fc5u@jtd?->~TuljNE}(%c?Yar$Y@jp9Tj#;@bqENSusbeq`*o!1&nxY5eT zfe&)|!|Felq&g#ruhCm8D*anm#~frA6tECdxfF}T2k(+o01%Eji;4=F&e2dg;rz+@ zZs8w~3RAHUgu1TF6GrmL!e~E{a{-(7C z3%oEy7&yE<&TJ=E+U1b6i8}7x$hN)J3^}1AEHaXJ#LGqdqlFv^A=%a4STqlsf;9}X zZq5mroKVXXtAgD@A$#%`^aK)LDGz&3N!(%n#x~^3PP7ux$$*EggAuT!KmzLO?_K9o z8!~Cj)>i_{;kj%spLTXn387`9q_aoYg{Tb*8^rAyguM+& zMpjgwX+6Q3YT_l%-DJB*Mn1%qXx^jLF3g$#RaCj)uu@`bQ$?l;du(O5VtxweM=Jhe z%vxQr`P)nR-?|>7ETFfYW-M$^}_75vm)6@#b~bSGM7U{Q4i`S!3ESP zZWxGYh&{Nbvvk)tWAISkA7M@sFLNM`uDwd7FY}D_^v> zt?&t9xCcPhcz?Y1R>>d2=zIMf?A_^j2+u@GGHBiVJLnlqI9wNkggjvn=-OnKv;kTH zZ>8)B_<-q}3Z-*4#c4Af$f2{9!*bC?#PP$y*lDAQbT1K%w~o^WDXV!3Q^>){j$`}) zS$`E~IGhy9gmWTstJ2`#;y1J0a3U%pZgB$h;r~85hBQ~Z9%M%xI4sPASE|SxYmfKeEr`v!J7*^kvuKNa}kR=mv z50Pm1?Zz$HvAC8wU*F_Ayi?PtO`3wutej%FEmO+n#}|s5pa4^$cKy0GlMc0AcZ)*6 zQ=0N^tFzifgxRoveqXQkoG!N=h3w)eEJW5iEC1L2ox8T+O`=0!A^Y(M^=zx)aKoAY zo{TvY&Zb+(DX@tRV($cd4aT0#))nr}p`;0hf!wZRw5nNFOq<#S;Is&IBkxN^Da=9+DW&&Af$EYfP-7Mp+eSc z?Rg1Y%P9Ik4vqIf>#UApFgQ`Ey*%4nh1&a4LYN2 zYMTInlJ(R5ePOrH^g}gQmtioH0LR+79Ik%r+F}m|WlNn8ktm3E@%bE*Ux$0ioQ}Ep zyw<EuXrSYb`Q*fo^eo(+w_3v5N3wSiz;03=G$v`%Em+RBnYjUlEOXECEwXxE< z9p3u%S;E#Zsf5|HnxB3LUbRZdz(#ke|oq& z#gTg4<)~xq-d&r^PX}9iBCFqLUHHzhxFF;2kdJ>j`LZzrHIm~X@|vhU^B-E-a^V0( zPVcLC%J%2OlJ+fmLY!9e1 z*Dldr(dg|x_hT;ClU=Os(zVX~UE|KVs->`-R(C>1o8h_&yd0kkz<$w=X;_?ymY^CM zPpz6D7aotf?6wvpcBZr3)70CG-oRgh7hcq%fKXifnpaQe2JUuvLTVYjM>3{umxO=+ zzAL4S=nl-{%{vF|SL+Mc-C*6I(a|~52#Az5ARD5lR|q*WW=tM^vEwOOkj?hbc(F!s z+VHz@0hhc>w%ed|?d7vVv~8WB;B2H#;~oj6Vp}DumF~f!!J>dPb$KCLI}OXKaO>Ga zYd-a7NlF&v9XPpWYuja`?w=r9!`wwCpQ=)JGb5;m*zuQk-=A))iKYk;#hRdj3MJPd zHK_obF`N|i3)1z(iQ8H(fd+SGUS4inzQPoB@eW5FTOdOp-w`aUtUgfrY=(YX5%C4Z z1knw>Kj-e9Ogm2=l!#bun$z6pw_Wj|brR(m&MZ0oJPNfu13ft>9vce0?3|Mkjt4V? zE)Lh3s2>6-n6M?`>DG@>;<^j_`yk>EFU}7;5X1sG$5{5_cyzqot0rl`V2h2xFUhp3 z`q(q&*2_$RB;|a=p1)^y&iH^eR@je>S3^B5(+vP}L9$zuB3_5Rn9 z0PC1ly^KD6t%q65l=h0=B$S@v1(3~j!{q~bit@eFJ>xf?vVx8-h+m&>UcHxXZKm^! zNGJ4PYr*$TYD!dg7>WhjK}v26Cf#06O;u7H?A>ZbY<(5tMvIWps`oGU84;BXZA5=1 z*PABvM}KBiwo&o0*%DYG+B`>F+v1+lD^W02!LdxXmKXNb9u(VADfZ)MaYh?4XY>;8 zMa{4C7Tzy}x6+zMGA;!@uUlx`t^a<9m+UdZIqT9s!W0JZtl2%vmR-mxKSrhc1pZl^ zDSzqVWuJ`vQe*cg*iQ1cTtRl~==-Jxvq#$ZEf4VegHDVBec(%JUiv^!sz`9}xt<<* z1k8zjRAHlK$=S?l@$#zn-$fiMA|bOq6S%Rp8p+vnd`Is#Pz2jhX1;Vmi==3mih>b6 zloAgJwlyt4@2yGQpmL7!*qmNf0jyNt+xib#P6OyNpUO%@TTC{06~64Og;a+v6{%*!`aIovke{;+euTZ zLRb365Fyj|a7GSirUzCc|AZ}ooBw%v%z|)%f{e7D<;SchNns!ZeYj#fwq9tz$IW|U zT=t2Az5q?{!SyC6u$N}M7YaC!I-GXuNS!{s|LRwoZaMyKwWhen7OM*8MM$ht#b16h z#i@PCo!L@V#y1mdb)C>M=j%s|earRrwq?vW)CIJ7-8MsBfmu0;_>TK{1*xhZZmHI% zVzKs)#jcOyM- zXi*@$%YRO?jD@TJy>d*jqV@va1}DD23~&Ii+j3FI_N~66&7`;5Czgn^$m=xRqkXYX z$i^A_bHLEf%nQReQ^#+X?F^unRc5@tApZNEAse{7xfw%n!rlEAdS+p2;ajiU(?!gD zx9W9<`_+DpA3UrAiZ8;RzeS9+QTxMopRr5)?1!xSggKpR%e)11!fV&CFrxT2bZb_E zlmnaxD(kkrqtkk^#!`F@Ao`Z|6PVTGb&woBjRhU>T1F6J% zCn)mfZ%QPYB-;wR6~^naI=@h>MkoD1S3`uqqDq+C??OX)Cw67Dhn%Rcxiy`(BrN0n z2eG~dMFjo4kT-c3YK>+m^S-{^sxX^mC8ck0mP!^Un<9V3)LFie74#^{BZK46^7E}06>$t2YhdW9)PpZxyN&xT$xa;4D>Ds*+g5!oX&KGFd-qa-fg4 zY+{Up1fj)hz#aVqDpl9E{oJxU6TsQKaK9yfU{L*5vWfu_j9{BK${t($hwF+3eqHO* zV)80Dq>e3m#yg}eI3?R?%a7^-<)}HF?jWTGn#I3fI*U4S-0b8;BLdGqn?$jQ8+{lW zgn6l`g`aovs;gnwN}FK~^g-#9L$Pc6MMqa{d*{E_o5hy;@N8ABdqAg88=qg+ZD2-R z2I$tL2Tgp-GhwG;fdkdFwf)V5>^{W+uiKI2A#k0Af6>#q-{-aacNC8=$ z^XK6n0uZIy(>=%^r8-g4#E%Ss7nTXs$>=#*!}%XDU&D`D@f|r}zJIG3%f(EAde)eO zyv!z$rKQTD-l#oOHD0+H1Fm;=B$jd`Op*C=fI*)9*lF7QvRi=JZK_RW5QxP$h_Xluxm{P$s33)@~8d z8bExSr~UQpT3Yr{Wx=Ve?HuoOFpvIcKe{yN+R3DDO!=m8BxAzyt^*51ML+`>zK(RC zK}UGRp0vLok#`rl)9{C9`)mgpsG#dzE;^(*re-8|mFV-I!4~$})~rTdB9}y9X7J!7 z$Il=>gER0(^<&iC!2|+pPl)jkkU{zmH=9sda*FriCh;C;FTJxsfib1T5BLED#HXq- z`Jz;l&l#@8$Gjb}W6^!A*)+ZfKaOk+jrq2Wo}I_sZt85vD*CFdf%{!8IX`V-WH9_H zY2Q6{aFazY&`NISoV+`;0Pj6LRmZC}LVG}qNb)z*KbZddj@jXrXl`ZYo%Ge$+?1Bg ztL*N0i+e3T6^mb=wkO|~G}aY7d~L(L zl7VI-{rNjqLNXUwP1ZuyfXjvQMH{SayQx;oE2-s4hnlmK2ZkNwiqY4h&(AGc!O1BX zVzVrVa|4>jD=z*$qCarJYnczCAb@ubl##wSbkgNtcp-af*gRfAeiDbjUMKfSQ~ST6 z65jPt)fR3GKJGx{ShWW%{dKev+mXEZpTSu!$%6raVSeIT(O3fM*lSix*igT^yf^br zi>LLZON`4E(e-4Wd&B;T#pDb7)t_#=L-;IyGxFZ;^o70jigkr+e(ju;bkQ5gSp=en z!&V+U2Al`%2F3Nu8RaJ#_ECuz7rI$fh03iU<*$}Q@aU=wbxqc@)E3D|aX^Ziey{I4g5Grc6f4xTW}et0LWy#16XTx&7I|x85>aDW zrHznf|GM*A{+6#dsjhh#HQD||HFU|5DS2aq$ZvMorCreJ9^y){;FHFzZ%2|@rpOnH zlyC5AovAp3H%ci#OB=Ntr>=c$2!_8=y zYgU!}iBc~=wpg$a4igxh`}}sIc1BdM^RV|FDbk^PX=ZtN35q1Vy~ss9L`VjzpHm%> zlrB*rGysl{eq8jB5gXl!S~L2Ocm4}}AS9;W)u1%?gIi1EVJIK>o@LgKBsMd>f0I5I z-ICB8cOd(>n%Arf9#zIF60Apb${(iym@+g9G(Sj8^f>}IvtbDc6?dHtS%`uoQLN*cHx=#5_pN`;ZLW59c(2>W4< z6G}O6(L3ChVu1SR3!L`pB47@sl=!nsUj#SoS|!|sU5Ef+6!uzx`**pp4d)9{b@8~~ z;#czVP|13XR&SKj8yQ`%aRtELE1Hyn%l(ANMU;F0`VIbF9tr((mtM!E%H1K9t~51n z{`cm_?@zwXm~W@T&GZPG1`B!wGrw?A1Qc$>%@Yx9Xwc#T*v26CSBl$5Jm_5sAbH!l z{jt914bn3aFi?T3q8;~GF(XFP3ft0loqMK!cF*!{8HgdN6$yUOo= zx0p9UZb;~Zk%o>Sg=WKCRTw_+^y`-qx5wcwau1=j)oMP%k(wu*>#!`p_ETI*#oTUS zYQkS@UIRWG;e5XxT1Xpi*%RV^>3F6%l4`qVla_USqe|{aI>QVS?Kx*PT6D<>F%Tq_ zH9C2L1X6&|XA3PZLMfIL$&1vfQ9?5lO-=m>!{+-br?57K9x(9`LjBG;*ZBj3z9^#T zWTq8iWGG&K96`N%=n&D=Xvce%R&c6o!hRvgagM;y^0TfiY#Pt+qjHLx=|BhOD8kL_ z2RPhIQ&vFDHnBgK0wWIsad{TM>rMGDuZi@*T@wWUngF7x+z}gd9w*WguXN+!4a)Sl zC`|uYC1D2f^f+oH{$*M5R7DUMvd%JUA+7O`hoQYwY-OZGgcH6QLcitLF$G2>1||Py z>YsiS?Z1XuPfL}piHxXMZpd=5Wc92pX$jtQMsBpV9M0DYM^=Y{9_X3NlvE}z6V>W( z>8HkH6OM6*qgDDaJ6dl4gTqC|Wy-JN46xdjM7}+Wh68UUU5g-FxNh*Uwc74@JZJFi zZ&pSBhHd(<SU-${EScW5;Lf=!8z6sN*bgfK2y(lxNH$mCH%^@QlzwDg7@x4ZUg* z-()L6Bx1zVj4lrj^fUl}CqfKA3J<*0{ZzPS3^QfHA@9%L46Sb7DAtGXq(F!4USms_ zQ4mhEu6^{xz3m~1^M8MUoSEKPO^vtwlIB}xsDU>-%MG|pEPyjVvilJrz5NBQxWLU; zOul@3pdZF1@UA)kmeg*#ilt^FPE z;Vi5d3EXHa&h zMZqyUtEOYqU2$XGtcQq;75A=(>wT{KyE0escBJ4^uJk)rj`Ig2Q@@mMd?L~M5UyR% zqcq&B)w9Lh+Q^!A`UUNWohwuP9hq8@kdMw+}zA0OfXvG#T^~avYL-f zHjbSjq`SpYdsbGTN`cP+`Jrt%e!n1L-}4s3gR!G&>Vwb#_KHngZI4pTi>IiwCnVR= zo4LQRNbB9Fl*cz{a79IQIMI7g?Fpa0OOl6FVytlMz=0ltRJsJ~(Rj2k4F9y-!=3#=tx7AnSOx|{vSUJL@h$Cm*N_=G7;@!H%inmhggfp21p*6(AiZa9- zu+wvziAuT;=DzCyzN)67^lAUqgKEdr)Lg9)v*JG>V7X$0zB%tR*ZP!AXF<&fC#wbN zNYk-k!H*M|4?iXxuMCx*9}a)$plL;PdBOetm0YjiP|9_a@Wou-zD+J}j$LDCIdZ_- z2BSqtUSn#AyFb?y!e-J zEOpxPk@Xe@3r;PIy}hC!nsV=w+`Sb&+Dh?L%{EMbbJtHzN%sc{TFBw(SX-JYo{br} zC_FJ<(MlFdIFyaVuJp^Or6L2-I^qXw+s=`VeY3WGlas|C;o}E8i@l^CO#xF|%fuOk z_JqP8noz1$E}xPcqrS3wf1uw^oD&wPOJIc^duvL>+KiZNVQ;=RhfIq*vZ6ydl}bq8 zes$_))a*^%ymJQOL*ftDK4pa|F#9gL9~`gr#T$hz80fn?vVFpLvNEaB9nzTtOh;>^ z^vjx{If~ulVw;?wpqBt858uY5Sx$g~qIVKy*Gs5z)=$@s;1fFZFiv-yO3WS6RMm82 z>FD=r?iFdb)n?GHC%pR)?d$RSg6O|(KOa;Omo-{Bg;F<{Lcu^ef7`O!aovIwp(w%` zd1l|hWAr+TlSfKJf$c^U@1Fy#Q5ipSHQSdg6;@srtT31N5EI}v#lG)-GQP)oPCr?7 zKGI3i=3jN%_<1Qm1aw3=w);r^Cw%GB4`rdq^>m7+205`1`cb0;!i5$)Ei8L~s=Q-~ z!wzT1l)j7pD@3!ad4Jjc;_KL#e-@4uwYIieLtM7%=xyq)4tQ*H_dD4V| zi(71V{Q{Pk8&r@7Jd$nMF5zKc`wfmG-$nfy7oU;5wQ(s)^h)jVk9>*4zvC$o7VPzo zoqqPG|NN->Gi-N6>5HAr)bYdw#2-iKBp`%nI~cNPCZYJ(7LeV7zsl2&IgBz}XC@J7CnpziWdI4SA6B*d9NT|Z0!ti4G|xV$u-QsY4fs~Y zTP{1|9j@JokeHALT-$!7NBO9PA*TKZw)-**h*~u>lIP`DxyO>JK@k%6$Wb^#Kv-tP zK>G5ZKvktip&x2k_!y3;$rxghDt$?^N^IGFZpL%BK2pX& zyg5&GVHM#gky~agVF_W4<`w&6`@XhzVqx?IHskeRu8Yw)qESN1acc)#iXWB#mv^0c*gEVq$ zw5yu0tznFz<9Sth>`Mdxp3?VxH(cvX*);=}B+KWh52HIu4P(~oCKY9*RfQadLMxDX zlShLZ_1ryvxNM(mYdeJsg_n7!m!oC%t^#Z+-l2;7LRs!j#2JmBlINTKssnJZJ_;*c zSxcD*$9s8;%u)M!?cS$4b= z3pWybxT6+60Nouf{;4mR31+GLrZp$z+^mQ^e(R8!^2REv-t6Bu*Y{>(r{ok1CUL%TRQmwwEa-WiK-tFB=dCo#Jlf~WR zVXnD)zK1>(7A#K)=wgeejmZRTS{=+6<~z)^bVR7JV!DH-RQ>kA#1y0fn?Mbf5Hg@lGBt);AT;S5D>`zPwuDcB*zbZvxKr-PhU<_~O5373S*mkZOE4o$`r4qt z4nELyMPQ1|S_t8_hL+S>!2jJ@-uwox`-1*aHEF8DHYo__g=aj@!6F+;ZLM{)>wn|M z!{_`0*dC&D&R%BFgxE&TmfowLPW8nP>6|>nEOy@W1nVmde%9>lITpKBHF@Zr^y9zA zUCk}l=?EXgmYItn=DIz=AMSf3+h39Y-kp+q4y?+Y)mViTRg=>(v6F9dSOeeJ76{1; zC>a(UG5tZl=cynEMR;B8x32j!dwgjzVrjUMfVk_N-1g@~c6VRc2@>YSdL4pD)%Tqj3S@>p=|u#FJEB(1v)-lW5{ zshOY2E-#LRKDc~rV?pB{#P=x#?TjCvb@p#06`EV-;j(`u|6pMq-}ms4socbbd#8>R ze;USL9(60cCLfm7Bkk{dDGD1}U!ssAyJug-=ohjkxJB-!n}MrpAIXgDX`ZzSTXX#G z;{b2{S`HmrP|~KeF+rl33E6TeIF+ zc~D}%+==4kHQbt^ebplF+#u}7oRJRN6#A59<_ndRc$!q9ARt?V4x`3opClR&+8@R7 z{}OG#@}tkHlx*k1&82~zgHyx{ODoW!KT2I}-@NQW%zzA+_~*mE^EQ}bB|7$|ApK(M zY)A!TyZaxWV&sqQ>rphA+nAxPP@+j%mcZ zuMwJ`#ru*M*1Cb`FSS_CrS6;i0L^#Gf15qQfxdU$yo<?a2g<(DqJxIPu9VbdrdhX+gxuaz1um*4^dSbM! zm;KI#Uj5!+Oa&$Zhe)yoFZ`Hpu9Gbg?qlB`2fo@GxWozB>)Uix77XF_iz^7}z1^9S zvE^#HwRTJIV-Tfso`p0!!E)+0NhoMqyc_Nh0IX2|j_il*t2uhn4|H`iV7b|c&;A}~ z29@&T!u$gFlGNRh$lzD|lzIF*iy#Ho&U5qt%R3SJ`|~sBoQ_i;{IB!zfxtO#7i>zM z!Weh!BGEHBO;>MFjyqjYf9chK7wgi&d68~T)0&%F-;E`Y(7zD99<-+@Z=b8!IgIZ@ z@g;wFA`$C417GJ4kKrLL)nm)~!EZ5PvLu6sAm8NClj2PCaZaqG%I(*oHgXj<9-M=K z>$|@b4NgYe=QRh9o2WXv>tKxLu+}VXw;*6!3|_NQCj4cgRykN7jcHQ0E!kDGOQRRP zx%J#%QhB13xetbB(Buz9=IJ_OU2O0?QK#2Ih7zssSNdd{Lx<`iWeUui{)F}iD)-*2 zf{Y=l2wa*Je)FB2DfC(~$~DE=Poc7MtN$M#bCcP zade&Un3GstJ9Nz7`HXqWC6Qu|k`Qwf{<|g(4!gDnI;xIZ79j|u{XdqR9lW(j%Xq!| z);A*rk}d7`M7EWrsj`w`=N_SA16M*RjXt1Z_>vL8E`t^%{HK1~cSnf|$bw=!@%aY@LLQSyuj!_10Gx z4NF*nG>Z4T!-tCRBTyGX`{;R6t&b3Ob0sIqwQkd#u~9pH$8Bfi=H1}eFQ=e6!GP|uV;^|ow6YaLtu=4o=hT;VJ=GD8$S#3 z|7668`E09tQl{k0!sJ+$ULl>N6o8aIY~pMjXd%>5=h>fOQUFO_l=kEN^r^6JO&yCV zQvcL~-3ZC-rf7ODf(a3<(A?=d#|PZg=Y|i;bx8{EehO&$+MIMy$yO83_85`W!hZl& zxT5IoUXJol|GX}3`ZiD6on1}C?@#E-p0(V9qE+QavE&76PM`Z#8#oxUFuC&97Qy&7 zVHenYyTA1ykh*=VF=>w2Ao$`1Z(L$okcLCk#?mh|I7WXnXY9)MSNEqUS1LL>}^p+NgX zlD5mj(ftC}gzn|32NEjpuu@^_Gb3B`v13VadIHT;P$;rOOcKF=(L>K0El%RJxaXH@ zu>w&W@gOy6k-`f8_Vy{@&i4=GO;*Ofl}DfvXMOv#~Aj{IPI zb|~#Ii`6;5T_SElB)(%>1~6cjb>pYDA^xd+LcgYzUbUA0()AP{JlY9lXY`7zu3*rZ zsr5!#)R814k?ZQBk$U6gv#fzc2oA`YXIg`r?D6PjAy^{T6AJQxOZWBcEQ?{Gq%VfZ zVay}zft}@w(tt6rZzafm5%M-^dPY5&JAvUJ^=DKf2=?zGC)JUal}T{4<`X^?%6!hF zlqqd@_&fxa;mOJ4?_7}AkBg``G>^OU4=KoM75;l-H(`ewIh}tq(U06RY87wr0qjIQ zalBWWTvc~J_4@5b9zNGEZJOU zmsuO+fD4ILmDvRvKayD*OPLxn@OZ{)JE#&~C!#R%i@0zwP?r^?mz;iPWZ)2?__jIQ z{s8a3lO%nNsQvN6X;iA}_`6TobP`LloZ9L`J3i)SA#L9$_76`oAWld%;T!^j@N=LJWX2aC>k8QVu-$usRW0_*#uFvKN%aKZ_t2O1Hm0tsVSVEV%ZN!11rgZYq?vyq`rYxhPr((y$b+7PYEUIP09vc) zKB8qgK-NF798Ecvs^lcwm4}1$N!!P2lEjUx(n5P;Pi|0y%vYpym5QHGkgTApBLd_W zH$pz^&3J6gNctwUPkyd#ttfRG{Pn)_!y#l1Y829n z+dg?&SdWO`;t#`*_rHR$UWSkK{DodS_mDG1!zM5#n0P-0V7cB8t}>Xv@>lx$c6AqI zi!(7_tsfgdy+;Rf9Hz&5F$(4bO5gvNGRZWo{-@C#_VV&~iuVDCwKvRZQw!02SZIpQ zl2(v(pd;-5+#K?MhbdQD>!yY<9y}Mke3@EWqk`R>j=%S_K<(i?aj&2ht|cGzoh}wY zs6xL`ciD=kAR8mNsQ=REoY2o?6k;9bn18D-Se5RYN;*!6Ew45qUBJD(P~T~vcBU(e z;hT~j=qHF4mDK-USMY}&4xU=^j+Rh+v0f~Wa<&uS!%{@mXX#Cz2bEg=8ERFe3}K;` zDvkHJ=}X5n#d+*nc-*~G?_i^qhj!EJy{Blsj`K2`Jo%;M#fj15lOZc|0IkOSOZRs$ z<(t9E?w9WE3$eKq5L*jZXoTAdR_@YF(OU_Kw}Y zQ*KpG1#F${g3f<=D#Ts4 zf0mTgj-UHd+o~Hpz;k(JQvUPlW14-7W&tYOxqff@8tZ=YsC2=RG$8F1O1%_BZX1#7 z`d$hv3+{EeVsx=I7P0thp01W8U-vFR;Z}g%9S-H^D_y#S30Xp|A+N7@LXVgBSz*MpO@t)$P+1>xr9$n$;s$(smaeBwg3`&$&4{wC~r+3<8{CSqla? z!ary;5*;R!T16hB<6r10uap&o@>kOxbvliK7ezDAW?Kb*vRm~M*U|kI=i514#{L;q zGkz@1x{(`y6c<0gGSDPL-{fRHD}u~=PffpM=+gz2vG1Y`vTFL`!o_A(@VwL*E=$HPnqO1zex};XwWVFpX(|GnD024Q`b~SxJ zzA|m#><2*gI8|8NR%WK%QMJ&PJ85!}bvp?S>&k{PM?uS8IXWXz;*=dP&yi3H(@7M0 zE2Ou5vl&W@ojB7SWBc*%GC_~6f3e*zX?1J`OY2CRP+g^m8km75#3Q zi(zDQ#qkVt%mcASD}HP#l|(stIM_*jhOwko!M-=h> zN-S$cH7&pJy~OM1%{tM)jt%1IEs#2WXsZg^4oSYNgO(}l5l5ABx8Hu^CVVKeWBU*j zeg`z}Pc~l&4m;5C5Ut9B(6sBA#O!J_f{6~hb{~q?=Gu@L+BY8nPE~K&*rc&+xy;xy zHMT+1QI`Ot?lgdgHWi_VqpL{W8H^iT-GMw``o|7@{h<9}ZByh{wP+N@EA+m`(YF!G zc6n*~;_A!;JKWpyA%u#+o|qYq!|;kMQo2ND_1plUQPg2S7s5V=g7>&kRjMq5lr<=) z(y?9rS2wfnr5mr{A7CbZ+XE`yu%3F56dt8ee>LUfQS;NGzkkWa!|lrT$5&$VJyv}y zktJs-OVfJ-lzaeFg- zST;vtN784Vv{NEKcE!DiT+dV*ED@H>P+2dEe&7mKYChA zML%>VSO^Ph;aWU2VQB0qZQpc)w-y!D#q$l`tZlEkezZ0hYd3(NI9wc(4ukQ}2$xMT za(RPR4%Y16@~PHsg+jD|xanZHtsO{@1Yw?CSP3c(=U%>kA8Y!gZM4%4%`_)a1-zjgUCh2 z=w><=Sh0HE3tmGbW7NU3L@PVckdWAAV*e;jyT9dUxZ}y1>Ne<;^1(_3Ipq68r@w)& zfjh0i_jj5w^R+XLKNab@!MvrgdHHao>$r^Ml3Lmnjp*cIqooR`z^0Vs>Hzf3-LcMW z0wu7Y6w4G?h4+>&JzRp5S-OOW#`}#eLW0Sq#5}Y1+M&apL;`>m>AL;Quljg!tEp^= z0se8k!R55qdMWWV&kBhA3?dqU)}IJiP*IWTmGfB6yk!ixAo1MZfuepm&uud7s8o3q z8#OtE!eKIJBZCO;%n^P_zX5I{4S)VDFTVP!0>9+9XUOcAiOR$tP!&wzT`#um;IY)8 zV$HT<$7rs(4M5TbN+>ZMoq=3?k@d8z5Pg2_Sb#B|AGMJS9II_rKid+_9jSD24@JY# zp-U-enp(Sef%~EtreU}kiO1o+oryLfN6|zQCmxD=p)7N@2-!u=>w&@4e$kMtP)0Q? z22wr>tXZ-faMvi0EZa>c%uzuIy0xQjf9@ZHrE&I*u43DxidPCf4~hei z=BZ<)fgL!p9+khnctF^Vvv>df_y@A3s)aw-FTw4$!oh(BTK=vPBeQ($(A(!zRf5Zd zS)(Yxyl%&V&>~cxna9B&Xw>?dI&cuG!M2lXq{$f69_YFmf05%8-RY^s${jJb)AJ3s z$1|2==jiU~BTiJC>)s!ap7`tqhk`4kl2(rk!@B2eoztGa>qd!xnXU}BwZla?zZI0e zjlbP`<*!`WN}RZ+JSzC|kpbQ3T8WVqL2LP<7}c2iCnB}CXv7{jwe;#C3Ps&F(&<5T z`!^rlxU_o|lrzyVKW$^sc|V?3vsSLzqG^|jQmC{m#L+_|lu{i^d>WY(ZW|olf1}Pw zdU)e}0Q!hNW3qBWi`cYt|84&|PEc6gtaE1`rLlCFyUg}ApVHvn4c{pW-KTfP3$k|c zPoY7H1M`tu+!REHYV$hNR!*a)k4+eG5JUdnEsZ1JNzj~_1KXcMpN`gJ{`T;Wjwc)~ z(dXX{AJca*hX$$sT35npqo5BOTJYj8I}9J6z{-X>MHV>;*nG)ysLei4K6|I0TX_rbL+m8a z*zu^Aj|8VYYCZN71X2-g4d@w@*PB&TlDRu&i+g(h%Z}X`CmOu;z8q>ww*%TC>EuHb z!qhWVvce^3Sb65^RHXg-&(wC$F=Kekb!U2VD3u9q6~(Ka{z>H*s;Q!~R;*5LBn9+Z z`>RXW;R+Ap=q-}C`rs05RZMaWmwb2KQKx-w-Wh2vc-o!{)%Y0mZam!ZJle;4aJ?Vb zc!Ja7ef|_RlVkEZ9l=hZ<}=B@Jb(>R^OX*6S>t-s_89YOjA>2 zwjrVW59htNC~3m5yM^07FbM<3lC3e~zZ-S0ncWAiCAeqgO@n8dNzD-=4ypKrkT^yB z>s^NvtU_bI4^^U0c?NZ)I5aF2eCOK2NiOGS4FivJ6@b%Wa*8mK+DZF18}TZ-a&6WbKaHqZvyUkNvcuy=DOAKl?{nx;>*&089CPY0}N? z$a>$b^Nc2jH>R#J5sb>OdeUBDc5;_ukTu_5&hb$nMjYZsNlWIq!o34~*FANxjH{+q zd^ra958RxfLlbTktZ#BwKcH`wd<$4b|s6{@P!n@#*s`YFj z(}KP?P}BsPH-RGk$^wQ>>Yg0jyhIO%2i0$_`k%sfQTJpccXS|;#Hb%5#(p^IK(B~f z%U8kr$=r3jxCnN?^K&SJz6lFG^#v~wlEQZC?eh2IHBoxvdRJ(zq7?Zo2Zx!RY|wC5)d(|e_XWFMApcvcqbSxz zb%x+Q$`!#r2=IRwitUoLetHZlg9BX&QJ>$kno^Ph%i`OB<`CAwTX!58@fsH{j|{ND zLz7<;ya&pEw_XOlJSI23wm=KFw9bm(Tb>pGZ!Y^0&yi7iwJ z-zw64P2c<{fl#+sc5Fjl8GoBe3R~`Dy-nM{euCg0Id@*I@%rWoGX4e(V3)b^WaTg? z`JUn{FPq4JKqcrw>butiR@5Vv&@VU|BS7j|s@&!wYrGn7gopJ|JEY_Nwpjz@vY!B# zL0^NJMP}qshSI4XJV|z~OP6iS;-npz0?*G|#1Ac1Ts=tefF=tR7LJPQgCl34scpy^ z$ZR*gi|^yB{WVfyr+K6tu_IEAq}ZuYlE$j}K;|%COX5Xy)Hvi~;N#YCz;~%YbJ-|= zD&NxxN>?ebabr?ZSBGVd`UvkS>&YF(0Z@vm#m|Pq30#vqo5n@@@co^yOUIVaqt@g4HxjC zOK?ykd(cutJTU1QH38F2oT_>5k5s=m3B`0K-&5G6KED|HKEs%gC(J9MIO6H$s(3%L zaAq1BQC6Zhg{k?iqbnhy+SJgVD&8m_Ly z6K;rBVJ#RFQ9dBownrL6l0##J_fijauVQ;JU&`0DwqUUWey>yaYyih+RkzHkV-&~v z%cgU|-sU1Z#x&Yex#OmMk3Eax+mG3|)TkTnrE7Mx8K3qqUy$u`%(6J=vD$Snml5FN zm<8C4kUhk%(2II9We%pxo>p}WrrPOjNkdQWzeL>BT!Q zJx*%BA4TCf7|J!-!kNFsHe>RSKtLSpIddV%v1Usrt;uYFG+0))^-t_w3Lwp0V<-;Z z41xbn+E$YmdhoCNU7H}`^}?NQ@UL-SzcfMr=Vk;z*}CiA>v>w#i9c5Zu)RvQjPop@ z-3$VqWrR(P=H`?YIqmm`ASa)mp|q6XB|mlpbp#&aFBVn*eYedvCvHu}G-8y|b<+_i zJB+^z**U=l+u%AS@9S9)3Qpu-jcYX_>I@enJ+dK`ntH9eo}MACle30!L>oQwGp5fx z)lD|1Ln5x za=|C*4(7_Y)Rb-~$Ti}6!G~u>WX&=h?GpUR-KzSTOP62GXMOD2eMCo(UBp|U2x5%- zMZsM0Q7<`xa{gr3zIdc@7;LlJrJqdAIU}L$7#&2=2(`80c&-zr;AHlg(y4yyWEF?7 z)wQ@;6`3yexYeLwHW3vXYMXp@Nm!^BtK%h0cGO&X-^^)zwqJM}L8_3Qw5lR+kC6Aq z-zh)G;M9F3@q2y6h`r4Y{kxYErqj$Kg69!G1(i3dEoBC}i>XnuY9U+S-fasrML znNxbJVZz7f%)N|;dKi!~=>@k)^^uJs7DPE-@OGSm1Am{6#W|zEM_+un(WMF>x5OPq zj+0iz4BqhNzQ!BF%PAIsvEp+_TP^0aybnk0 z^;K)1kMP$HZ_8kCvkK_?Tb(x=YDQJMj%nV%BDC!;4K0j1btYQ_D1iqZ=Y0^2IT)$- z-oU4scqDXx$A-O=*w+~TyRXZ}Ija5P86!p%!D#Bhb|mkpf6PTl*iwD zANg-_4!P2Vh?|edfgQd1Rcc(U>}qd}SS4YbC`=Jugl@&6tfnZ#keb*U(T=lF3b0X2 z6l+3ptPV)#KvCzY1V|4>@e?I7LG(FwRT{)^J3Fd-m1nyP_Sf=WykgsVC4jJ!zwwt8F@pNudM z_0HeF89Yz_92+2+D(o&~$ik^HiCJT#Ld}Txl6DhN!sFfH+3GXb{q3v#mVW&X)hqSk z1ze6Be=op$w?1iIGM1#~0lZ&G*=dN3OgLQ0Zw-uX`v(ZRxO4IpsP1UaD6TEgK8FjL zW5XSHf71MoGUNZDmdFYM)f|jxZ*V-j;-t$Xu{Ob7V?Cs#BoJYu|KEGBN*V48Bf(Xy z^5SgN?_=xeN4S8#6GW#OqsluVjM$xGoZGuVwcRy=qjx9cLkzdAlmE0a^%0#kD4}2t z4-xpb1?CFm=Y0v5vmR-)ubkm|Z5H7Ksx>>*H`nfkc-e^NTdVwhZm<0law1|mvfIcr zyUH-tXtOr^t1l*A^%@_vM(dDAOEAlCo^yVbS)MzLhB$U&;OJXak&h&+9%JG)y&G@P zZ@oW>>Sq z&RyNJR9AvYSro-1D)oFmeELlrH+`xhX}2zVVpj+L`O?1-&dhcNX$5vIG&~7}p$GoUVh_=>Zs%te>HKE^bUFxixsQ6+8WR@_1qmywhFwZvGz-AIgI@FU z6z5*F`4w7kQIwk7x(hN~3vXj$gK|8KT&(6zx+`1>Tu#fvJn#}WZ`BYk9_?&Vb7sdo z-dh+*ys|Y`7BW^5s#E$YeXUU{Z1CyCB+SZmJ7-xeD(*qJLV3!g($O`?%DZ5^U3NsB zg2$B5V%-nJ_05F>n*u(Am7E|#b{4BKCfF!MS#DdN^sJ4yvaYj=zL&VYzaAe>dy@=P zWbV<@g0i0o^Qi1iVno^{jvP5cA@Qr`)t2z|{WpVIolAWmM4hmSO;q83qs-6bV-yK-1^Q0qc#~xq#P9Y4 zSq=YDEu{|F&vcUj`90#v>i1nZDEg{rJaHv7oUIkYDNNyZPO=aZu$&z~m5Go5J6ty9 z(16>v*OIbEO+Z7p?a6K3A}vVJ{Xq_Z`#_D?JHx#`m4foe=b)arnug(ucz zoG7q4mm)Kr)BH9==~FpXn}1-fdjY9i{APG4$`dd5YhqYUXTTlWe5_QEH2Lm9`3rmw zGfZ`B{F2~XBXIc2Dnsu|D;~O>XT%Pnj~K15daN)0YUox7ELHs- zx4@bFrhD5Uk0o89fg?vbmx8aULmDcdo+ULn|zI6!*oeQkG;#qxN`Bm#~bke*(N|eFAswmfhy%5Qy`gDfBT-0PI z^v+V*2!zybrCCsLYsKvo-%y6ovb(xiu%w(>66%{A za~_gVDLOjje8~DZpHH*RDbyU&!68ghD91VGu#KFLBh1;Ha%N_>*=F(` z{dzs0+k~ZYc-GnFCLUF9s8g+Qp`ii}odTK}t6@28fXx?sWO}EfFUdsS?w2NOASdz$ z6aQNR*2>*`j^J2E_K2vyr0r(O*dB!$sH~{-dZ-W>XPf9X`sdxd^H?pnh|Y{0;%>TH zBRRQ@7;Z|ghuLqBCI%2v5r#RLoWFv37XbRmRxUFeuYVm;Ph>0gEGRsEQFq!+`TKh6 zmow=Z#s$|oT}Mmh7oBWADkP>-7N2TnZb*Kd7|7#_IZvN`eubYYtwH!AP$B(%AFmgO z78$+P+b(Q@E8{LA!qo(!p8ujLo_(I<@VrjdQ^p0MZ z_DfwdfmNE({YS|m_~+^7!3Rw@6oh7yI=zXN*q>d3j!Pzk4sCGil?WG;leuHXXy(tf z+o0WOves%TqufYju zg5O^P>nGySazM>!hNJ9}2qjOOA{*XW+*DvA#;GJ(sFVXt6?4rM_&ZJ-A}Lm8D0dw% zcpiCkbyWv;qtA}BlO$uA0ks%&!kkNi;|l1?2ysC!Z2X0ZY-6{7!XRn9AX#1|>gcC||8}GZAoyy3iFP1L zb#fBEuSP59%?Ow21XG5-0Y90vfZu=y<-(^!vy8FnzwmI`tW~-y@^>Nsb=B3ChQPj$ zIE}$X4ikq_r(iie-TkP+f`o7(e{~m4 zOpqLNbI{>;w`MP8ufqPueUXq_+UOI3Z`v;<-fY;BePs>JgcPc7&t2Uc(>(nFgDNsl z%hR|VHijvjwQ|!H?k--S78)kBARL%VW(S>CY>$I|uibg4S#|}llpF6}Kw&g}BCHEs z=b%|W(y{Gw)yE-|h*76jCBGF}<&k1OgD*$Cg+K8${c8%Zgcb_^_nYl|AS$_=JPx; zNx^$U@y3|`YA3J3$7DP2`7h5hx7YnXM++FU>g9GsBX+G<8)h!Uai20WU%AfK`# z@CADH%_5ZaFM7dFW$s&K1umDux{$}N$y}(mK3p~Kt>h+tk+N>#(2vsmv$?=9IJ_gD z*dEXBaPQa7aJt+j94_|v-F1h7Z}<{@t2R^lk&QZhQp@`b3_UZV4U~5;-(Xl%bGdm< z@>1hfgVsM}ss7(D3yfz*edz<^2tPglH@D!0;r*xQJXUS)cW=cuE=2zW3rD^xCsu=5 z+i#FvPgI7#b-rHXnohDn7XOo-s}_D|hsX(bJzQzoP%hU%@}WEt7Z~mL4iOfPni|O0 zYg%#nfBS&_yF<}pp>8%xG$^ptH&UJGGH+$Nu?Uc)g}m(iGJItOM0DKw!w)HlPEc}E z{tD>0p;DF5cs3oCBWdzgJv~Fsr)3oJq4<@Y5r8)>GAEzpByDEsl?4hd0xSHVSC3-Q zv%mD0p4I1|*ag-pEiNugm9KS-N8JRJJf7nDbuVD^lU%wa{*u0s`C z8_A71o%K5U5g!Zn`&<53!Fb@>Ms(Qa)XPhbz*!g@>GGu z%~5+ofBfsPU~j#cO|~S@2dIjo)F%ekJVhy;o`C*h1HEcNBBr?KL*W)9Fi*^nfrJaW zYfC__t7SMB?3`Y17jw)#{3+L151%9zB%`tgQiZ$5cp&r}3Je^}jIXYiH+Fmrxx0q$ z5wqFPHJu2&bqwla33?qJYM+`pZ*^psUlaMIbCWrISuq|&I@=lXBcy-Is=d3dsi|<0 zhN~{f4jb+o)Ol5-aeLS1-_TcNR_BeWvpP{{?pTuQaec(qT!iWD<1mP$HSt~fpV{2C zcBBDEXv$TMq-CBiYn#;u-IQ8A?w!d9qHgprjs=MNONaU-bD|irRqgSSN%ty6pw{cu z*m}yRmVdk?*nd80;dqKaTFiq#*%=Z;{8z^svpQhQhA(n($#^3=0wH*Z?p(p6Qf9x| z?u7eXvE$1W#1HaDFtJ?tO11vmf-I7lMF&C)j26@?qGi=R00&N9&=-PBznvI@5Ww^aM`Dg3g{^ z>Ti|l#cL=nua0WjRBNqJtDMZQ?$Kf8)~R8fcZ&nS;c|+0LYJmN&)qNV2!8Ud9J-`f z?QqquD%4Lf=ZD6VmdT{k$k=I)lj><2&-W=3TUuKtsFRa5kl@Ytb6oF0W+yBx?F)9Va*+ zSyEz^-N3vo`FjGS1e<`6t+!FeOnOZ8?xCSmB;g)+S2JVxRrxvQ!tXj^Bd>*MKv(BX z#~?;l<4>W_-8(m>rjtfnjG`61SR$Umc*t(+9iReru@A!k%4Hv(oc*wDpd;gv;kho9 z)`Ea9zTKF2chaCFgc5qxe);|JVg>GFqEI@84KITyfq{%Rl_GkXVin^q;q?+kzgljk zy&mv$o9BBGP)djO;rw{HO2dK6c&!;(nYtV0CAMmCR4P?=-xC~iGJ1e3Hq#zdmFtRK zjeKtf@zs{zk(wW1A!ZKtc9pJg5NDs^Oxzzc8y|?w5qvb0UD;;!Gs+DG-fo(CPz3+HX{=EWTJq5X# z&cT2=TXD_yS6JFMRg^zt_UxzPAmn~fNmBA9O+<8uZ>gx-Wnaa5T)fH6bMx8-7E6Id z;}g+_higMtgFowCTuz`^KOX*OIJ?CM1J9Fwumzs;Os_N>e1Bea<~e6kC=Nn>D}K*4 zn7Z?V6`ygPv}!83GUjB!KpISX;nlV--A$J8RbpVG6j7vp#$t#htH|BSL29DqxIqdW z(+sKfsUTbPZY-YF4EHjyv6T1hX!4v21@-f>4kNJ#M&I|B1B2rd{|jUc>ojc$LP!N2 zGk@J?FyZ(#hiyEzw%}B=Jeoq0;4FCZ>Y;bG=_;iI1TYG7-4;#Zk2#RXQ#4PTAMIXg zZi5t;CRJdVfwh$xt*gy%2xRJHg>GoK<+GSGZJ4*P!29-t3E{6IBW_J7Cq27QV!b-A zxPv~atv{~$YvqTJTxVqSdVX&s8qut>kZv02M{;s1L9B^2^-k=*>lj>_Q~~F)6oUNN zs#=kGnp_zubR_X+KY3*86(N7qVcX#z;k+;p9s-x$AwrCZ3Sn!}d1(x4QBcUK&)?vd zWXE1^OSc_8jc`Q(K2rZAjEcWYE|KP;)z&TdCUI$(!a?%&*g_#azu9NIZNiq?=ZNgm z)KL5eB6Cj99Ux6GJADPyqgz*r^K!jU zPb%a5(t36iYDWL`pNQPD+D5yvfxf^n7==Es!8N-&JoC=;0lpL118dFrvqL*BwDQm3 zORRlMS1$B~ewR8_U4Cm&r@k~P7Db#)xCEbf1~^jxsVA+Ao8$LXQYxUrFAZt|KP^`7 zRi)f(>fA-Go_*+!Ni}kwpiSIJye5WUb{<`w6aMDQciWUgD)@-#LaBZyYOk#>n;I-p zXRCum_~-a`oq|)5WT4+BH&xJR|3V2XDs`kFBrV6l566XA8c@>5&>0Qnwt^k1+vsW@ z?)t<+jJA^32L+3zI}TE$A;?UD5`W<41>1ma8?1=Y+;Hi~B9kKEGf0nATtyY{tI=1X zJi#eL!bk46p5dHdQ%1mBwbChT51&Rlgv;swZcnLb+zGFg+Oi7M^92k4=-?2*F@*JX zMvZ-2*Dz0>CCGQq=^Z$|aUfZ$9S+Ih)g@T!w@o)SY)lqVXJb9SR#g1a&G!Z^Ng`RI zlOA+=tNR|BI6TR_Dt0& zQ_&CC4jQg!F1~pod8#Cm22>eS{e-SKYDeB*Dl<4}FSZxzwl6SjZqohn@4nQ;_=%=f zhqpckskPY3@0Rf#mirsxtGN}zqj)RG8`0*mCSyK_O)%Viu; z_tx=6*v}`g)Sc>JAJlbm!y7|VmknwX&rTXy(Kz4Rm5q5!>kD#C?2=`0f#S;emP;Ao zOEK##$^4M`i65~{A+#@xypw)QR$8zyd4i^yNe7+j)iIH@t;JjQCAy5gnAQ`%#AjjuS&S=L zJ8eA_(7)x?upn*gK!80B&?7Hp3x|L?^sB}un^uDASNqNooMhmO9EyM~l{WZNOV^k> zJ0nj_6q4#}>x%;?RWH=$47UOl@0#4^tNz80+SNOe11tR4M^EGhl#pSxiyclbj1C`xe5|yn|1|Dv`zgF%CiiZL+rm-Lf%6W>F>(uVNK62 z(-QK8nqYi|l-p*xfOXB%1+Dx5jrK?OrL7A)cE3Zj0(?M$d`5q9DnpzZ9%rR5WuR8S zHd<0A6RN8;GLXKJ!Su82=zS+V(+el><6OgZB2u;A&8@r08>+ljd_LDR#1n)t#W z-DmVkqn+_P{z4~82M2F&zxiaDXRD)Vj(aS!B5N5(ep3!|F_T(25av12tGJWXw8imPOu)>aV)Ssqa6=hP5Gi}{yLD%Em%*8E2vNf7301an8+So5 zznkGv{k?~3{=WI+59;{W^1CD?D}fH3l)gw$0SUJ_?sQ_wycm2d|1JyF(#gC$?{eCL z_w={?I;DT$Qo`PBTboL4a|Cf4twb`ueK=~>ae!y+oSqY29eF9TN#XLa1IV>udV8OL zWwgjeK52bd3d;QXUr=Irs8KK}TfVZC-@E$RWnN40`pUFda_b&Vg(vp<~w`grXn#LVjw9M!czP7 z+Qro(4L9~!uyTiWUhn%sH#d%`n`N*{+puLN&B#99pZ{hA`cEtHYf8j}meF2@wtQXX zjlT&hYUAb2omJ|+xh2`gsP}GAl`GTwLwW7aGimA&cdmBcr2dzJei1+oHVyQRmIg!3Y5>G{hua^lH}Mmzd#B3I8R@-WD~hyu2TxQOZ=q zsGR$pb|7av&>HPpYLjRyjI*I00^^A#Kgn4I55zyEri!c+F>QCIO(Ty1Z|x2JVeJ}> z!M8F-p2KOAK|n`!5L&^-YG6EF{@;HJ!wZp>Tn}Z!f|UGesoH+lrf{gz%SZza(OQI} zo*S<;`A!(a!-Su+3I=?lzGqHtvI?582!WpVA=KX~YLh&{t+gZhG~lkeLWzI{L^WdA zCW+TXV!B8lRiJ-wjX9mX+-O~lBS4{q*yN=PuHL+@Gt964=fwjS-RdF=fHyW{A33zY zz>P0OA?@S)Z`cpCsB|Tne6nlr>qVaBu}hXw!yeAVn3KUOEw@bQ@?9w+`I<))S|=|4 z(VQ9p*1}*j`hG{Wz^}b{&JOB>aVL>yhtjjNAKzl?vAd$o)vp5_suvJ<^&gfcPORM3 zUlF|*!Gqrh*odC(U)xYptK6RLpN(A;Wb6%=YTwPXW`Xh_ZAKXc4w(jeJzA8BD2YV{ zujJU!h?P|u2_;3r@4O&d{fp|BE4S$|e*8a9tU98s*$MnpmMzx)Z%oI~qpHZc=ExS{ zevVuvFYV{{k3MP962T7s8ysY1dy$l2vg8Yc8enLpnLD(^&dwX7Iqy~>)+QbY?eyW; zrYS?*F%Ez64jgkn|Bp1_yor#8OfP3fjNg2S-$SjtRX6`8^1&$>Yn+Jq{-Z-dj!4b- zR~6i2k2;jlk0=%~%;Y1p<+D?S$RaL6u!x7fIweC}xY9pw&O=(!WLGuP^;vpRAQS^! zeit{G0n>KyT8n3ujb~T_hJ=LatxQ{^Qo0!jQ)$$&bMc3;!@sMnr9VI@e!HN2Iog5L+=>xitK67dv6Z^>U_pn9|mDbd5jc`|Muc1X(*0B{BE#?SDj1Rl`fbGy1B~}>=6$ac}c%tallylaJ!*EIr z`$=4CB&JF8^}m2rBwO`w#wN3a`yKOB53O`f;y<`Y;BN>A1N(q7@~-r_^MwhON(>~G zr4vXM%>r&vrYw6QE05g&ym?~yoDpor;CIo{kM+at5#`Zb+>U&OiMp<(g~Y0r8kEsYt80P(7;tB)rxi@|a zkc)*-s4G^R5PmFEU0Y2#MEJJTlLV^P%Y`&Ys*CEeCWy6X3vJiK+8!Mlh51JIi%H|; zrJ~8*xO(@U?GF75o691qH2B*vI>%lPt-FH}t+gfoIacuZv3s!G$30UG{oBB{&P_P8xhi`109e2cVCV$*Y)e z9NZ_k9J`IU9_?e=FO+puquGC-jkL|!h_TmfQ!ADU5z7^d%pVCQ^!+gQ0MB%PZeyu4x=<3RM4M4j?4-FmG^gj>55Wj9ZP%GFjyY9)NA;XtrF(Duy?)1=GzBfOJie!8*K+xR@(>v z^0eCTDBki?rKeP5dC4BY!$6$25f*zSC&m8f)?NFuEE{squ2t3jRWexp7(`QCwPVQyJQ1Yt?RGjEZ4_FwcfXE>PNAB^4OaxgHSHdZ1|~NUnZ;emHrkCJZK=Gr}9(i zrW*r}%7ktzGgjIKz1F4?MCwpo=Z$fw)~4U7!`QJzg8fB?i1L{ z_i@V|5fBpPrc#0Wz>JH0$l5e>^E0db{ubn&AM+Gx2Jmu{%_^ z*XeCQBhWn49%z0K0Vr+c8vXP4g zoz+Z$lZ_SI@?qUH(H^muRKR8+=_@z;&ga8o) zv_1T17f;SXO@=vVZ>W;VN(c1)R2J8plWWDO5GvxyoDyrj;J^X)qZfD`$q)9Rze+sTqj{zah1;~pdRgl$m&!pM!S@j$pS zb!(RX1?}%{?p=Ii$>ndT#PntoJ%Pbi!|Ti*qCVT^5x=lKDk9fQWXuEBeQi+OD;KbO zmn|cqfy@gcOW88G>S*~ruC}>>FAxss2Ca7kqTzMwn!tJiT#k&RJ>wRKJ8sR6vg|Bi zC~1#JHI;>Gcm0ts&YICu!ivW`4rw`|j#Gpq|J2HFop?Hh+_CtuMrT0{a6}~7NAC{n z6A!k>^bxgoH1usmuO~GZ${rto9c~2r38j4zdmb7Y`K0e!H(+yPN=-dm zd9VK+4FiBfnA--Oboz#Z-1P@5u-b!Zj?3Bv`|LM(F6Wd{UGlcYTaxj07VU_NCBp9; z#J}O`K4o`O*}lc2>V{1{eTiE#MA1OwO@ve0AoOyJ#VLax&(N@&mM)j0+hVxJIr6S> z@aS7>WIeeB3p&%sBN`W{eZ$X*tlgT-n|4D|{!ZAfc1>JYLVSCV?31jHW0zMaGVODQ zsmTOv{jTQzgbB6%waLK<55!72Y_RUNk_w% ze+esHs}YF;l;a$K>BcA$tMKk7@WKFj(Q%gVrl(R)HSkga%H@@>dpsX3kI`We>78Ey z3^s!qp8HSop=aD^X4aDA|M=+uU-(I((m`D4%0TXMX&fG`mTGa>;tlN^Q5@+U7lyp+ zRpi?qxM@AAf#3KLWk-Pab-`LxZ) zQ+e^*4tp*bC2OSS?w=Y$iUspTw0eU%{);+NC|QdDsR{m1qEn02<+vPm41Axs;@~JF zFBj>XH*X1G;5)1imOIWRj}>mrr2P9f4c}C~`^;$k<4Vib)Ug5zuaYOu;}(;R7fwvp zu0W(oKnX)5q7)p5$#m61hWod8hzU8mriA7UNj4N?rTV6|wk} z=N>6~n9BQf5a7`ODajM2Z9g$cGLhh7wY3UQAHP3U)U`vvNU&FZLIGv1j-xgdixci1 zCAmHkbK6h)@mlD1Ir$BHSgWoC;+A`T;|5ZA)Z=t(#|j1KSqM2B>{nG7j4sVn&OO zNV2ZiKowx3ARm}1O_p8ZUF_?NrEIG-XvA!Uf)2Z1mTVbv?sRp$V5a81M@M7V$}BE> zT{dv*5)#!9H5cwX6c%MNK@ZKHchtDTSeod3IIQ1nsT^n*8CTD?$NHq&w#^MIg)mRt zAr$YF#s*e)%A_f2qzT@6v_5wImJmoNwyDrxpCxsic)S=s0G!+>fXd1adVmeJJynqR z!M`meV^I!qFMWr)tMv-vBsdt$1`c>C7iswnw&`gejy-nA_Fk$p$ruWGB%%CI-gLwn zMw@VH1=xD<>vRGl28``l>0O0 z1KE=+^JHF^NRa4v_k);r+yL*n5VVq+6G(AF$#W zGjq7H_f)kJI!X7!)@k6CHJX1zHtEbp5gA{f;aAwol!H14$xYsC$2!Zaq)H8wi77xW z(_1tt9O_KUCC~g;yFIfbiwUCsv@!|W21l-NMMC2klglH3gjZqvvH=i-#$C0a#e~)@ zCXdo%{!pS-TU7T+gSpUf8y+o}%Z5dvJ)suwK`O7_r07pr-OI^bZjiX}zV=`zIk*WF zaugwyC?8>X3n;mGS;OfYj%l-++!c7Ay^7FEKy*@1OmuB`xHfpEItQ-o?d*g@D7Svk8wpF@A7w@tEtLXKFYoAjiDbyb zwpQ=GdnOrK<5Q}`mEqc;b3Qh2vPx(9<5+5 z1?}$rlAGe*Q7@PFQyjdfc0r?gOx|wQcQ#JN>ekB}?nF^ppwWI#Gfn5es?IqHlCk%x z2RWTac4LpnaajsVp~tY@Cmyer;*Wy`|Bq2#629?nIjl}$JR=Fo=fd^YTGhv5>`5x_ z{P7)a#2iNZW2Yw8k&DiSMhc1tE~>Zf)+A(^(%XX%b0l{|gte0aeiMQw9%_=s>ehA_ z*F1zS(c;PX%dcKI1z?U1q6=Z8ml2LKB z=1v+udzw;R5BJn^JMHrIGn@}!aK(W2gf65QwO^xdchI25{Olh2kWK8ic%!d{RB8eZ zvV>M>zx=?fr(R2b3VC7VUx=R`S6ijf?b%hmIa{NhpX^@={eywN+(ju#vb-){sX~sk zBdu8J-#*w%4cwR$|lp`NX1S6C6&SWNr|rJKdBFt#hYmN{n`zxislp6WN%Jx z?#?TQggN=;895a+F|CjG1OXAKuBY46#2rKbfsZzyga8^hUoVYWIaE#pR#jdf%`rPV zxb#$B9CnuqJPfZA>swI7pZ+ZTXU^cj)JJkmI(}3RMC2v7w@ zqoI08w|q}PMG=QdxHWe+>j~H|f_BSfo%(Z&E&OwMT8~>?fqA_IoL2>W@&cnHt`@O6 z%{rUqvRDCMECj@ul()ZG@3PtiPApfcbs=b+dnBn-&)Sf_CbO^XlAOk9XoEAj1Ld}a z%TA6K@h>y*XH&p(g>$Y8pwQci{=v7{2jzJcI}D}jwPU>Muzq8^loTZ)R1)amIJ=urlFw$%$%KV`P@OeE{ZTen~rv)7upcfTPu+&O$NaZN~{qo1F*l2{qmQu zb7Ew;C9b;qVi%=@uevP#ryTDowR~}wGDtn4Ki9H>i4}x&Azim)x~x6yHC%nrieOJE z8w1Cy8ZKwUea)Uh96$`H-R=eu;Zah_VwiZ+g<+gh#{NQtT1o z*1J=ItyaLV7~D3~iuQf^xGFUK(s>xo&WYZ&Jl4Ve-hY%hv@LM;ZFnGU9h;vT4f8vq z@`MXqIUMuBTsArMo1|koPL_5~N{}$$XHjpg`28Z@KmTePK)mB$Jg&grb zmOy;Wof8eLxCqB9MG4~afqL$a$yxuo$Z%E_D;VUkDBhojJRO64>%n?O6X~gXdfgGh z&jC3y2h+G&!=w@$^j&0gPJy7lKFafKn=3gLz_YpCLFL|P)G2$lI1XgyiOot4i9Zz@ zZEtMtbwzK&Wp%1^n>ugrpuvZwF=fnw8iI^1*S?L4XI<}}m&0dDlBN)m(;5_On7C^> zKIeICxM$@6r(kauej{Zns)(T((ht+&0wrxcP-Pkh^ySgm1_J$Mmz4FTMK)pZe49LN z;yUi-*iJ|H!M9CgD?Hb%wX+ern%e9(i~c2PJ$m|iC%aOm5{VOzdGw(vBb z)sy!+g>Nv0q9{Pn;g{)-#OjXc%NwYP1_xZ7W4(o;3p|lSCdi#?d&Zkzp7wLbLa(Mu&v1-=D`!57N=XLt?856yrcX*v!h0UVx z#^=6;Qa+BmFsQ1dZ1Y;zqn-b*Ki+Ol3iC(}_U28QC3oCE&aU^Do8M(`^F->`asw+n znR(1#gQ{_+NNknFp@l)hLN(pNE&&aY29dO(Et4604=7^?*e|86rwRID4AG_6ZkRys zY?h5Zf$8=d%rS7dlC&n=L@H1H8fqY(dhO&y_B(3$qIf>%D2KyRY&MtwQ=^+3Tz`X2 z_TSe^DQtK;Zv7hfhxDIm*8E9*g!>9}q2)x&FN|@bO->Ce2^cZ$;2YxvD{Odx5R7>$ zZ#TsJo>!O*?qv9x^Zk_bYv4uh^akVzOEv1>N7K07X<*(<`^w(=Z+Y5vy}PB={Gjd; z$DucG-Dx6@G?>tn=U3i-lIXr3oH+D*7g0mKjRAY>Su$Np-2*&AZXh2z#iu_!=zJqF z885fr{(X=XIyWcgORW4U$=KiAvGWp8awj46|77=H^Z{6t`1tev?KUX8x5}zdRzwJ;TS|OC58Ah}7 z4$5bCrWE^^7J`tO$!?<{&(Ody#);y_ar;--u~$sDc9f64xrEPM;du4GS<}VWGXvXx zB#uSy&9WKtpC{fB#mD3ST?6}J9FW8>hVNWs>nbQwq{NL7JGCX&!-h|kfl)paa&3geB8_07P91P1pn0>a|e$A3>hi-Aq z?a-c`JgKrp`Q^DftBdc9(Cau{SNci%DjTrSb|we?h&RgxSgchPJx}IpXdU0<-%Kb@|aKNH-?UVc#*`P}43ZuBH2S>Hd7R z!71cBbOV9@3Fm}N8(|`wbf;mQrdC227?bV$D1!R_Q-si56T%--Q!8~!t6yIX0SQ;Z zhCKdU1BgAC|2m?bY6Y&1i#70xV-xfK0ID++($3^nbj5yw?33OsS9-SUOZ43jA?;W% zH608?T~%TZpGg^9xXe|!-4j{_z1U}^UOjOuwI8R6u4(=@CYbw|u9s2LwzLU^yv$qM ze{#ib@%9@5Nsrwq_-CUPuN17xH{qGJ|&l+IrX6S*nv&-5@idi(RSl;PbR z0aN6>U|YQGJ10#SY*!KIB0jr_qwM;d@H?FtvOHcEt7>acjFpes=9T)IKl(cLIsQdS624LA zqn-*<==mW=eyp63hBEa9xB{>Q+uP@m!B~2i!%ITs{`+wtBMekBjWq@CoLPhDA0o(Q zrnFQK%Auo0?s~T7b8LO|DWGRgigvv4BHh%3EV(-GoyVkOaSk zOEhif5sGr!3j@lZNNYKuk*Z}DOv4p`19=8#l=QtbOxY5 z+pV2pD)V~M_b(aGd0`?cJ zo|kkayha{T=pUzhXtz^RS%Y5_iQx0a6190R%~v&vugeMC?=I&&FNcNsDK8~OdRDH| zV3Fak>+AFqhBl}`FOdPJ9)|_+SDs2mr*hMjV)-gE5mS}4If*=u(CH*Gsvc}yoMrWk z2{n#7sn3WFaPto^ew?#?Dp{6tY(l&F4# znT=~TP3YPXAMw!jm3`IskoF-d49?Qo`B}z9)UqB=0mwTV`&>g^{r~-81}* z1eIKTA;xUs*6ouC)x;C$!*-Y*-=U|7;Lfk&j*C@}FAeObz@=(2bz$PIX4_qN2f1ZZ zANooi9`&+i)wZuV9i_W6D?<*A7ttAdB2y!@vf9l}o{bpEAh`e?oLb0io=eM_BE8XO z?1rdbMSqWX%_Mk9VL_AZjv%FU% zH?LD3Zo+2ieK0!I(;EcEXqsnHd=)3+5w|lpKH?TnKB!ITUS&zS^%w0!9ANNqp40Sw zDO+gP@h3!$p_7jMzO{2%JPh#c&$LL097DG-^=+U*@iy5E)x7=;vrJJ^o>ukq!eDPy zY)JhMznYwzRV>{OW4#Ss(d7#E-)&NeymRo)ce4R?Y|PCnNvAXw)k*`>bzMsgHzQ~j zy<>eiFkByHH*?yr+)Q|gJlT~GhIwwE?mVF#9B~BWi#v+gY!0XD@66t{1L-sUV2CLl zsDGHMDe+Ibd|g!6va{E4og6x$FlPDbIRP`F$)$B?pPKd%^_$funKy+!{|66k35aCA zA;BK(3o?VCKZx^Jgl{av@&*Kpg3E!Umeu%E;RKoDu54hYwNdyU&0~KU#0E!ViQDdF z(x~lFoA)B8emSQcOs#(Evic4u788yI3IR zdUm+Nc$2ykb_;yAa*g%**mVuY19n>KkBj!~-}QJd&JR=Mg*O-0jgoW;FYAT2ND;AguQc+l6iA>of344Uq^lOT zZ-G7}E(PHP%ryF-QDa*{2w}i%DUxXYy!3}oqHT6Zwv9{XLkT=}H20{F%f)`fA(pSG z;nioI&5wGLPMx{g$c6H^Cl}Z0#z#hYg-9qKZOyu1BaRy4Xd3iMRa`6q8aQna#&7ZA z-#{X5$jwex6l&Uk2c3c1-)aT)rMLSEHhyvh-q{g-2vsYhw$DUZhPp+BPaF-)t6`&J z{54#}T&b-sS8f$DmJ%dDG6#24&(4R}hBU9mA_YPxp?~T$O4ZehI{8imQxaX-q3&sL z*X1tst6;FQ0@V1Q3qTj9SkugKc+49YzR?`Y{Y*t_315qTA*JP<*@o{Ia};It|AGu@ zA+oHNsV28tyjf3U6Ng;UcA6T+bFbnfBR&N|qCY?r-vk5X3rMb}J0fm|S8Jum@mRpF z2iG7b}8<3m`Z zb7ymvM(4*hEW8maM>eAq3hdaY)6N+(aH| z9-T(qYj}=uh)@sXk zb7%9liebA`^ROm1$u_nCQ~+(!ms8$z$a}RQvB7TLSnXlFoufM@Z}-VfM7DM+rcMdc zK*3}x#;0mrO3BWX%eRp-QUJIko5E9u^)MmR*7;P zUWO+ybWjzwcWzIJp18KCuv zgqvRm(3B1r(33y07D0*s-2X_?SWm2htVqMsgV%~;KX0?LH8WW(Nz!?mywbia9FIBv zb#{aO0|Ie2Ms~j>if6C${X`9hLQyYSzp8(W`}$jQc_!)wC!Gwr8BV}1gu`@_?VU4q zVS~pLnH~!`MUTZcela>fRW0lQPfk7qpVe?^D@xHKb zwU|nFY^3jQ^Oz~~n&3sUhe0m?#ABBY$-c?!D;|g^tHa5BDtexIeLAaRzJ)%TTKk~Zs6t@$ zuigc%4+kXH>F}_*P&}wsHt82SxHpoh($T}9-pk&+&dmeiS*u35qoNs@!BSr2Yf6fT zMT^tbigmnc;QwH5LZHwOI+PCJviM?~t17d86=bnc5@KWq2M7fQT23+k(9HQps&noW>pl43%$K4vw$^$2|CA(M zZcJSiea0F0O2_vacdOxTi5}skEnniFjhpOF@pIMGGc&Ar+a4V0!Q3B3hL>wWjc{i> zg$=h`w9*jFV_V0aoctwrv}ggE_VQyh|L@@FkFt>O(AUh^@-I`NaYHv5132@Cx5=($ zISFDk~jQXDiRyoa;|Ojvu5WQo67%rmu^1_8$Smt zlE;1YS3kis#X5Z*{DF(n?#%lQUkS2YffdHJA5P}A8=LO~H@mF%KdoMOseB(K**LMF z76=&9?Ci78EhW3c!7n~B`Iqfbfy!IC{n}gu^&yMoV;#s$qjn!ituGhV=HZt|N_=Mf z;_6_gr&MmS<{$o~xijilerTq5%%W>Uy2(+#L^;6ZBG?Wz@#=JKt&z!1!H;%ZSny$x zD2_`8B*j%xL4Ccn5gO}K@SC~*6TZykeO7Woq|={PXMO2&T$x0B^5}Xi01~XcTDkxX z*bH`42)}Na8HYq4RQLgHYhEHKet{4JO}=2%THdLDl!NBR=Z?3=D-pAazkoTV!$Fb~ z#MPu_FEn{1A|~tPc_AwU?<>~)5t!eag9qy*jy{vypRVBj@9sC&Mt?*lhdy{sZry zKJWME^|-F<^}OVaG*+ua#w)+^2!*e{Tw~R3h~4S!-F)kcNbl2^}?oKf*ESTY@R ztxJzAoqOMZPh|?CfMGsykQ~~q#d>FZLh@ty66|i}PPM*;e=1WKbe~UFSYRCm7NBFp%mq!aFAv9z zHfiA?@==#kZ+m`^HCU*Oq4531M-tlyp2)0A&igeqp#NIzGn1fA#g#UJ>f6HNk*jM^ zvldytdrswy--8@2XGA2wo9a?y+3!sE*Lf zw)C%+NvnGy9ktK0_mxZE(^x$|>6Yy75UzIE@bf{k! zE54mqglgW?+9~)-CqKI8-j||s-p}RcLc+B>)VgioE1&q1>s9*{-=9y%@a!B}oEMhm zIh({ce+^jGru!ob-}rS$>*?u&E+Hqb$ik1~t>@$U1x~$uxp`QG<4=uy@KiCTNU_#c zpOV#7c7CeU%@tt>3f5X4X^*%H&;p%>c=bvBL4pd#B)&gA7;4TzyKyuXF~^AjkrLP` z6Lq$?<#Wc&mJ?FG`*Z>a{NwKC^h^cQ4pWi)|$j=8EJ=Jkeai+-yv*X;c33 zsyrl&dh)w`{jEFT>cg?!EWbxkAzfQ1I!#jVAgKJ&^5!+@mI5xg3!i5nLg&KA9kmnZL!Sr@ihtKc zwtmmmet0N7TlwZGX|5+f&iV|0N8FA+>9bGWG(fi0mVG@4Qgh_A~Pbi z?*@fEHV$+yFDu`_V&w73Ji8qI1r}nUx-rG*dUj4Dsci?|6&72(`&CMRGiiX4AlzhV z*^x>>%@n2^Vg`002IP_VRY5S%)L!BL^1w1*CfteD1B{x!-lXTtO1TaWt^^|h_poL` z`QW`Ss12GI&HG)q>x_3u>Aj_%HssDJJIS4P^O?0Fc~k^~P|f-BJbA&m3EadzT)WQ) z@1~H3k*iJ6@(XWfrS{^n&gD+@&?xY$QN?EW`S{3O>&P7N=Z~;=ja2?GdsTPlZK2Cs zc;Gi&+IIZ@@H?%a{~21(P_lV15%!!6nT~{CKfy0MpEihrDJf0?GUZx|=&;Xia7GEe zt=;HP*MrH4=iyvKc$dBzxK%@EGq<$cu5KymK+hm^?BfeJj||gUYL;V-F1A^0>5?h9 zf?8+WoXYNVz9pTv`M1=PhZqB3JYR0nmwWtNEoQ-arlVW1qoY3`X~O7SpEd3h&X`;~ zVm^lJT%CxwNEch&_%|d4!y}Dc396|K*OW>9{;NP`F>+It9wiKL-Xkj=OjnUus)a1U^bfK6{)nKyK(Kbhb-yctLT*mVg$5?oVkKw{nXy z0!#X$s}JlSlMu$SdN48=alJIGyA~!c;1_yRH+_Bk4VsBs*=UbG2fEOcT=Q1gn+e;$ z7P)}F+vQ$92~VFWz)HN4iHS&aJ)U3D`G(i-r(XF|sS!!9df^@>Hv@DPl{TGRa92Ma zAAQ32m{qdI(ePolE3q-7vRP46;)xI1JKjRfl7g{w8erGnC)nfByP(3KlV_$lI?)?x zo3O#k^zn6&tInfGhU`^V4-p25if_S%Ig zC_-3_k$$RsT;^mPjsuEaF>DJ}-eGQ@&?p87^HV@&6Cgs+K?8PwJ0LZ+u~wyA+>h}2 zE`9lQ@x42RZI?l^X`hrF=%>WBTN%dc<4w&!e4(O8F;CB$?zs_Z2YiejKRgZP%Al>+ zm7L!8(#T(l4PI(^F#4l;us$q}SRDfFc*fnrbe6hFdx;Ofg z^=2P}8J{F|=B^tYSPamJOyt z#2{(G4W?W6&}cz80T9;H_Z>?#fMT%Zk5qCq=f9rWVqP3O$HJNtYxwC1Q zWW(Z`H`fD_rao!Zz8@4+WD;C}21-$?fOTC$SDY;U%bfK!Z+aiibd+ZP#Lu%pBdvKt zb`M%80e7>}3ZuKUa4ko6l2IOMYu)V5vA?zst4en~Jadw2c=9B?S4cchW+lWdy@$nP z4y#*gqMlDU6{dhh;VEwGtx+`7Qf>XcR3Y+ch5m3xrC1%Qsbn;;%oYfJ(}`*N9{u&- zg~Xnrz2fd37ASJ}%(vC5&v@}NJ2>w=!d?#Am9)l>XQGL>Uz!%q>u^Tb_p8s+)@0xZ zu#ae3I^*GZd0%IyUTo!w8?;-S4x$FYjHn@toH`&8Q9$9$o)}*(+}Q1Pu@H@``m{NTvHIM(MdCiHJ4~MZQ`&_KML7 zT|%{XnhT%bW0y^Qs@nFtbOI7y<>$Scj;(P$BNIb+K$UIqd>*{792{@0I#|Q`YUww` zNI)WAi5`$|dMX5j^yH53oS|x&SXF%Y-E;>Dw7Qpu0z&+>CCvGP88d;L}2t5Vgt^*zYwo) zsNLt+5;&t74LF=27t! zoO&>zytc&ey!$audK@fjrlt@&O&MR8E+mw=9*DH9J&V=HI3dZf;?-UhzJk677P{KP%{A75&o(M$&fE}8t8%2DGu-klQLA*HkOvEA1^c9A zyB=A@kQ4j4oBMy8)ag;UMkx$^$086f`vw>SpWhzSTioq8&`^IVwY@3iiMot1HFVr= zx*&X~BvSs$#p_XJsUs3v0$>erVgYKxmI$MKdp)*n7U(54Xa}W_L~7#?pXU_SwZX41 zs!`Gv%LijXu)5Y+py~RN<0l(83g~Yank(I&e4v@Z6=I$wgVM%bp&yc7JlMm;h%ryN zJ`GUZm?`4%_2c zh~N3H;^(lSDSqek`laZOoHoZ_6m*3dTDQ(k`^5e3YQp7cxf@D(f{D_l280jLZOw<)kU>m1bw0xL}=+GZh|%a5 zhWn39i|bS}lLBL^Oe3lS(wF%qjqahXqU(xKxRy^cnjatKmv-)>iQC(=g+8-=1xk8x zk6&c*!xQfi%>J_7{!|~tMw=<*I*01Q&f|&uA^`Vz0U{>~|k5alI>~_p$3T(J@;+W&9uWJ|hY{Up1+R zN2z|Uur7=Z5$AwgoUs=Nl1CLlx7hDG1dJ1su!FnXr?L*V7CVti3w@N?8L)vVO56?C zTM?^k7C@^pG?Yytvu(zvi@djtrqFGuy*!;i`%bU8DKA6zV|Gbnra^iO7Sear@X}>_ z2OS6K9({9hFTXqGn&^=ON+q7L6X*i2U3D_BQbQ&y>H3s|2N*{Of}X<<#%>v{@7Hfn z3=N4_A$`W%%;IgDy&C4MH%fGhUwDV4=Q5qT^<@|j>?A}kVTqoJwF3}CG{_}Qb?AoCJT6L^=-fM*D}=3Gzx##MK$xK znY_`(nZ+*0VV#%QkRS-0_kB194Xx}acpUtGI1&M_gRVU5X~bx^GC?xgI0v1`6*J;N z1OG7Uh+%grmHxQKF~9mDuDH8Ig67bIO9s9jKJqU`YoW)GU|vviFnJipZ?UDhNnHpk z8)8@J9?sQuYM;8NtX*pO|9U8UAh17XAsulWJF50SabIi7!@3p;-41-JiRLs*;+{P< z&_#4;-3gGS7rsh>hOp-Sm%d8l)^DrE-$XCf#8krRqs;u+?Q9G39#vp;C1ZP0zP=+i zKuYiYD)L_#OsrJvL4PspP70G>q{glPYzCQDIEn)rjFwa*6h!xM$z#$rqW9x5?9eY= z@eoOdLDiRFjdJApfs4*7I7RSih>=72|4%Koj%okZ9)0u-W}UJsoPpoNo_2XV)pol7D_onx)dtlmtU%8fb_g9o8Z~moJS|!Po0r(Di)c~X<53lXZn5Mx z*KqSMF7v-zP;8HxhR3r|tETFBSHblU21f@Des~AeZ&kauGzJXwN0Umfc7Cf^Gpzc! z4c7MK8`;;%J(w_U%~JB-8|IQ>%rw+~;LO(zy4b9LPg`>U(Gkn`N~E8yEoH2y@Xs=R zNgxnv4?N6C{j|-i%(jKzLiNY8Wjz-sT_k%;-cLT$fPOs@+^WRrO24HG)EbsxuQW98 z=ICYrHw^u!f^t4@qB;?yOB;#Im7&2nfBVKC0lqobdv?HdR|MIX!~>;Yln5**?X7|$ zp{*o#4V??ODLbX1@}81&U|G7nN?~6Jm*ysbDH1yeGbp71=A4J@)#EoAuYHi)RmK4Y z49xp!4)U`_V8~%02anzVzS(sl{J{Cvj#%1PvF}i$#Qj|}ul~h|8Mu7poSzeOvwJU= ze6pW(fMd`-L+q)&2UBF~%cZ;_>jEtp)Y~oUbYQw{OqF@}Pm}D$I^?XxvpyyW4n17d zXWEqvx!|nPyy!cVGNILx} zTGleY;8}$d8sOG9b~`zn8}<29AByKJw!}Rq+UG~D%%I&VC#snmh09+=ie)c_Fig!* zU_a1)bRUvA4eb9KY`AUl;;q8sW9fQ^mWrcW?A?P_M&a$}!D$spK1*&)%(|AkFs__s zs`9nn$aDn0_$-?8j+GjvzXpX%@dVcg>U`&Sv~&QeoA2J{Dhw_ZnKt9vDn<9)TIIam zjWm|_Av*Nf9R_&65Wg@vkqG^vVptZk-!28&o0k|HdClNHqBIFssfDk??IVA2UzGx` z8i3^q;V1dXDQMS^uhRK<&$qDs-p-3#bDLpC$R`rT@V9#OO^Zq_8dBu}ln-V%$;{_d zW_e};q1NXMa=q^1Cri`bo$VF>%fNhDF_2f*e1SQ{xzluN|6234wJS;Vi8n;&d_lnV zn?44w3<@L^Aqu%={Kx9Dhm21KE_y%Isun%0DeUL=6LxjdcY1$425`rV8XAA0?=ZfT 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%0A;Ebdfw zz)v>sufuj?Zn2K5{}2y69WUJMM~zx?>i_%KC|R$WSCKANyu0%^??eNc@g-dyt1m}^ zcoyp3(Uw18E4E_(sp*)iA-EzY=O@!wT<`j@a?!m1uKD}`fBQN@hy}$nv#j5Fh zXF-@8v53353!Fl4VFit$wFLs7YZ0I8M->j@n~``=1Ku)gHBTrHw#wr3iP#xWsptKe zz=caF@V!yz8M}!M3T%8+r|0q7BVgG|9poBdk-gEkD<6S!DUj!-ul6!!3-!?NtK?=T& z1_5il+e4)>n%G_)`s<{=@ChrU_)@7+Ki*Wid78ixW9 zA4U9vI7W~do6RubRM(<;oFVQL(sCC@cTGVjRfp2O(mi650&6HUawp%icpSt>WH&=O2 z@1lNx`TWbQJ#zWk9J6_i&q$gfo7fuE`|$hnx)-A1=k+KBzkE!C9=sE20d_I}Zbm}#{>%_}I~ zqstxVBeS7kgBMi2o#)vjqS{TpZN7DpEi7TYJiu_OJiwR3|l+3wk8o7N0v9DlkG;3Nmsh-~4Xlt^99O0;?&&bfz{ z{lb3+;vh#Wq6QmpZ%x}L`p9Rm z7n_`4>mx2P282N{EDFl_CQAaF2S*GV!WRi1AAD(^m6{xXvTG>|=xYS6z+3{rP1bQEDYPkbM}@dmqRTeUK4{*9YWF z{i4s5<~>G3OnA&;WBCY>jfLo5=kP&xQRW@1x&{ke{EyGfMGk-Pb=MFYp*|dMQeQa0 zS01ctWUuTG0kw_1EqV}MVS_UR(YA?T>ymz~Fl^n`Z`V$sz2+z0No(((^)9W%pt1R! zBf&PFbh=(E-=4`8d+2b+;={6SKA0KW@9`0qr^KMXSN)@pT>XrsTdbv~HS{QY*ehmh zltD}+g!Z>?Cen@21&dBdx^ON(gc29fA`F^6@?|WwKcnuNJg7JEW8Vm89yGSL^5ndMG5M^o#+KCD@8+O4>!xYaKpXvhodyqIVePz)47ST# zc=SBLTzFt<%vzl>;LBPo3G}=PzF&s%Sj2cS$3BeS|6H5q!A{K46@SLa=gdJLTggYX zg30x)qvkbxN8Wp#g*SC+8ElVBF{$y`0LANI0ddqY_Wd;uTIUGKm&AqNVvHOD`TWIt z+}-ab;=LoCy)N5+*U7rNwsx`}p_;)L>()OptX%*u%+a`h@e|zCQRJdi8+=yc89e?< z-g&g4(UbJ7CCtKPy@HRy)-ZG76`Qt@1MckVZ(zM`}8 z2R@Tvc`O-f#lCnZK|nKP49k0da>!J~BDBv0_0@Kb5VxdktaamZU{t0xpK;=AoR&l5 z$TtK=zN}-c(b(R3QQp*U9vZy&S%3|UCV#R&>tcJlLbg+Rjm~E%TE{;+T(f4UuMs}$ zJhbueb$BN9|3rmv`jd+A3}G^nz2(*u=Jk0dKIO|JkNpl362y(DXLZS*Q9HF{sl%V* z#UJ_1w0e#g9t^ciFyDOFCUoY>eh&^E+vn_^m<(b8+3}i8F7tA~`zmH*Cv&0l)7g+2 zXT3d?uk^eRN0zl(`_lF~Q=79OAp@bs^jX)i6%&#>aDWhE|k9Z6ea&Lb}9Vg$kok-ZV`tRdHd zY+iNgs7u_6>oQjX;bWWJxyIl+C}bpM+wy6~_!=CH6H9ZF^$PEN-ay}M6ENt=p!4VW zz#Eec!FIh)pN{doe!@0i@6j>QVXU@!9g|}_HEW-=7WQ#)P@af}0tRQrVPhy9&pYO) z9w648dQ_A7yEe8$sqtY(-9#5$+tr*sldrVQ;RZcNBD?0|)8rhu#9MbIr*%cLd4Viv z96G^PB$hK@jMfCac*Yt8W7V#vn6W%P>U?x6YZ-(Vbr9U5XN=wLXED7m2ebDQ&dal| z;o=wjpf%hxq05)?oM#eX-}F0F{OotE$%Fbt`&29g0DY4r;CA9)`QuBfGdogy174r?kichbw;t{5#2eam*49|MrsnY*`Pl3CE4epr9nVPyUCVl2HHAI)(A0-v zMymMT-(AxY8QT7xenHst=Py%yVh`e@af~IM@wGm3)__Ny=NTt>wmf!MEKH3<_;KzJ z!s&Azvc{WSz{A(TWt@5SV$O|+hYe^wBaYv@CN_@kYvkvdyL!+0v)d4cavssYtefQE zgOT}I@|vh!_eJJSl9W#}CK<)4Ib<70b?slIQL;brTQa)f8vXcrUEgS2bqp>_%;Hfy ztg9xyyqUD@dJY&(LR>#b6J6qi%Y=03lV9)O+Cg5nycVnpYvVC0%;Q($?K3vmkgvw3 z6S+&gI?wrDXVu1{!NeYh7!%vrx2~=$2Cpst#b@NbAJpCTV#q+7z|8)^=iGyn$mZSW z<-~)e*SmJXvOlr4Y}%Hv2M=>2YJbq*_j_x39&!$&9iA?vOfTGg;Ak%uIzhr~}_F2o_55#F3FacA4->YKRFdl_=ZpEE? zKrhTI*yzEHXErQx+CF zSzCCp@hdVB;tIBH+4tDnc~swd$j>=_e?T|j6E7%XHGdv(QH)^MFL2j6fyn6gY(vL* zsJg))rqGv`+kKv`Iz(2yeCCQW&4RTxG$7{5y(dig)4H==%_T>%xpZhXZjIm{HlXA& zk*&NShmOcOMaZOC<%WU+=mN>~f{#?%t+f)nYs(tf< zGw!%=TZc@37RnhT6enYH)EYon4YjlP-Nq_5gSBSjG=>WLEK-fOg%yh!vJE~$X3ZLr}C2P6sC4NPO)^LiM9LIO`_F36|qbC*l2L;bDIA?T{ zoB1#4H=)ZyaDzYy1KkvZ5C;HNhvZ~a=&gC=A&LhcDs~DzWJLYtH)E^k1=BbRtFaf6fv5`xmSd@$CYVb;MG<#iA%^zHYY|@|Y?Gs8jg~mo3e-M~T=Qb;8iFlm za8tl$>+PKAokKPFxN8OGkWvcmBKtxG2Xa^D%{;hd24KHdf zUt^}F*4#Bfn$BjtTSff^xuAGUh>IFYLNAar_2Z0_c7^oUEr=3e8)0*&=|a) z1JoMpWY;YvTq~spNeBK(Fnk%!50``|3FCB+i_W~$Lx{c;@9WaUYrIK`NR>w!|a|#f5qN>l5_RrMfL|WU7y&@KCl5PIc|4bw~|xG zQQPlX!;ynrQzF;0THDs!wcB_`+VQShi9K3lFr_y-*h8lIc702-cJTy$a||(VJ`rj@ z;6!ZXm6OK6ka_1(y16fzMuP6&_I6UaA_gOk6bX)r{#s;kbRG$E{Tu%TJ>4u9BvzK$2Tx*$LQkw z?8Ogo2yXE3m2ux*Zvge)fANMsc}w3k`~4)a@ZH$>CKO!Q62%;k_jh zY5{2mc-nmUtjF%cl!Sd^Za+hG8d$KhZ$kE6a=e0rT_l15zp=q3XT@xdGLH@;*Z6>e zXJ4mp9bJj9EyNst@b*5j z%6(F^Gwym{DY3`Sw%ybuZ?pI0KeEgbr(>A8U}xSu+f>h{0~V~kHwO3-9=#+6h+*#}~AsGZ+0F z?z2UlGcOPtsXKDb-kQ9lkDljJZ(XnYgEHY%-m8WZQ{$-Xfc8VVhq;=~!<%41U~Ag- z$efiVQJsDsg}Oo}Kz#nD3psWhrF9b@1r~AYob#(^7`lqFdH0<7x;PGeWS>}1vQjwf z8@~Gn@BN;9mn>y$c+I!>lWpr=Y)jw+W;01<>K9{lO4(ClL`^m?VfrF$ zTZW#da^{HCw|(h)Z^B;l zkaH>?&tp)$$KNC8;_xo9_FZFaqLc6cG$)_zmlXOOX2OVw{S*&pz10?@Ij#0Z`5XD)N`2^HjUBsMjx#z?cT(w-z9GE&}o;fF=& z2gN-5qc;%vs(#nXITW?_oHxeIg~7Dq&i(m}9aVNbc3s`uK-M8p25}swZ34 zU_As#j-rz}=hXo4rH_!PKBrdI_i&!I=__9R$BJVSk638ghrrka>+d*;vFimjC-CqM zb~uPjp1eA@k)>~z`uGSBdHUG&xfSF7!5Ai6I=4&2xJF~#0G~xxiB7Y`-)tC z2o+3X(|Q3#F7VBI!OVPe#}o)4Gk5yjI)YeJ>kbyU*>A{^i+Of(jS6e(8#&m0=8L7# zkq@2&*Rax*iq}AW-xr6+@Pn?Q(ed2mLRh%s+#>4Ol26Fcv$n1ybL5BQQAxeVN8^la zeYHLEDVt~-mzVYDzT>>m$v%PEn0g*MW=|qXE|aU~7D~-ylliRAI@iFY(HlLF8xO{u zb0~f{f6lXd;CPQPhkkp5-#j#Lp2QF1CD)Njon$XzfmwW^7oRn7UhJR7$qzb{FI{|( zK^JvRb4Kv5`e2hBL?`igZ|96aD0!m~26mAF3PJ}J#`$cKIm?a@bF^ihSV#S_N#toY z_FAY-o-;-!D+x&Qf(&`X4`!?`@;@L@i;P3Wjt}t_b#i( zHSd~XkC@==&4ik+G1&c{x^|&`g(Dwy1zTbv=RMN)UE};hgLtmHtjpHfxpH17PJG7| z@?kvT5T^IW;Jc5Gbwkzn9&|q9BYkVlx!^hxaYff>!hq1k*ARO*YY`ovUHBvI#G2L) zYUFsP1q|8NnOW?&$#*;u%^oj#FWUw&NoM@tHICl+fRt4=GG9INhMLCsk^8b3k~1`Y zU0YxE8T>&=D?NHE2HVyPz40%3)k|;dt2LjzSwAsYe{{RItS1TkXq;VZ&YuW8_jEz0 zKYNDifA`Hk@72e@h(%fh_@_Pc6%38Z5js<2%?Y^FnlYw+?BlH2nUmH{>&x-u)A#{l z4@_ig$Ms2kn#X>LyhmPo1KIO~F)=ckb&D^qEs^73a^j+!x+88R_VeAY$DaMl(fCpO zQr zauQ+{`I5c{UI+CZk6z6Km#klSHsY(~r*@K* zjRPeX>4^u9{~~~R&auXJ(Q4o~)_mUsyKA|9m>QD|J{m`ojWwR>Dp^|3(Tdf4Ii}&; z9<6ecI>5)^f@OlQiL5a=%r-U{n#4i-2g2|~(P@2zsuvF>syBX?o6qL)jOS=MH#rt> zT2FHEEB-^x3Ff;7AT683LVs-Zdr92)`Z5pZ=+n-{a%q)2HHnGb&zgvrIOyVI_5-p| zY+>7;*e@u)C;s*M96qhVa)$XH0V8VbjImre#_ZYB^CUb}<14bsjb^--@!3Msu|M=- z&9!^xvcAMKPA2Es>-g*XnL6e|uIS>kQ3sJu;8=!WXl(=CPkOg1mm|4iDUU zhR}qchmg@s*U=;Sgn4q)`tbg*ExqaWdltMwE;`D!^qI#$@bIg(J#NU>j=@Wy3ws+b zB9Lw9x;SdU3ojTr4JH^!na|bvkftV9UiA)YaA@nhXTWfrxnDs@O;^0wg`7GDlFh%S zo*Ay-n(&X2nL8G^^{9IZIo8N)NG-$ki@eO*oGx9@@*#Zbes^t3-{ZV2mpF1hMP{EnZXLgPdXKe<0gZO{ zIz09(?|k=%oLG$LO^$46KvAL>U<_*m2)qRVc@s);$Q8QbJOIb`@&QTBkz6q0lLPBZme#AK9{yHm z`KP{Zk|!3(If)P z#N+UaT{diV#bDO{BOfF9vUBAP2N!XE;~gKR=D)e48P7@g>TBiT$=j(HB%L#4&}41( z2QT1IXO2Yn{lI|k$e4{k;;lHqGB0{Qz}2rD^L`1JoSo}}{qXAJsf&!Hhyws@k32DX z9<~}V8D|ay)IzX~Aw3`R2HDtMcW{bdIdC)9RedsGe0V7Ml^RGq;jj6*q63blXHB5w zZ~q4RNytY}{kuE@g>>rxI@j3k@TebSNP`}}CjP-Qjc?ddpjf2_s%JkmNSzb4!#;xeRL~BBYyRg6ZLFT zV?Rt@{V46Y_qxEtmwQ>dU1zW$=g;wKUM#ryTHV&Q`K?Q)#7ORSULcQuGmrGSZasUk z0ch74ozyq_vFkNBaN?N=vogv&oZ7x8m4$SO117V2YeJj5R&^E=% z8HwyXYj_kJS+@bZPLLS|mE%XyRvVBIuZt?`7pIR%e^GG;(9+NO;myXEe_=8_v zKj-O?#W%24{+Jki?09_+zT<%bDcRive$G(t0?qRhHH?2*GbS>J9od`phAgKmbM!e2 z6JGr7{zbk#%M%C+L&mZ1^SMLQ^Mse#$yIZGjhQb?{d+A_nS?_*28RD54v6sdXP8 zH92wD2EzMuL&nUXepy~uFTmK({@Kr6pk@EF(2;|Xb&eq03>GYWTKis%oSCwTzpj^% zF?3yR)kPkhmN^S zNU*ZCQ93d9yx!!@%H%RSer7UPmbBJ@lMCm#^X%2(fy4T1AdI-;+7iFxO~|4bTjyD4 ztck;O>fpyZD`zfyLYdOo&ydK{M?gNL7WqM9zB6zv))||C$R3zzt4kUWLXMfSKW+2P z8m$~ooTScj0C6k1h67SB5 z&no256$Wdyb1{9Ko><`*zjcg_^L$+Q9QumW_rLK0ozzZ{mSc>0$p`Ephs`Y)GJfkr z6j;ftwJ*kpBb)Nc&q7jS+`43aoNv{O@dkqlN=Po7(6bwAS!1Kxr{D=t^U|^4_53QG z&l`J>5Cb_U&%`;ko>^idw%o4_$<)#xDl@O+ zYzX1ci3@el!b$A&L;J~-B<33bYqsZ4{q1u?WuWE)nV!2{Hwc`{p0s@Oq*~`Ic_x3Y zKXAQA5zEN)xqnaYhbE*L6dUP_uj)9zlb`GP5Z(ITIpj*lA9G%70p@c=&nAo_uT~h# zpMw&C@Uf$oSjaJiNz{7}+I40`&$}PiP;mNR$Aa(YS#0QvI%|G8R|Q}wa*ooOZ$y}Yh>RGn+NEumC}9v_&l;5(b(~N zj#gu--@{yMJ)VpX#H1%2U-GIhJZ%`quD)fXU}_G#hr7oXmWg|8Fj{ZfujB~9=+-uka?>_Ie=e{B+=V{i-a^{hm)VR8_JG92S^!&Kr z4^Y>!w#gqc*rwjy7rDwFS90e#CG7Z_fH(7^{KF}*vxiytb;j!I`waIqjS>SgbAN;@ z`7@WnL}m#bM*_cBiVdBDEKesg7gQO|(2=ZHmr_UHU-EoKi`Q;?EB>J6#p zkT81w_J7K;j%ai3IQT#77s*XX;5YV-C)?Q%l0+DPPXpcNmXCIvUa=i?$ z&zj@D(mquE;$3L$+7B+X)*h>6eX)!#WWUB9x)wX)gpKTd-aR)wZ#_~ZAM-psV`OJd z*#EZSe8y{h^1fwX+QGz#KlK|ShTWTq-Nx2g4j)}wkJT9njUv7nwhJi1!Th43p_uH#uR1U}U9y z$+!2oTGy_}^wnA}-QB8&)BIk=UREfrq_`fFxB&4fH4QAUke{fE+jcQ$=NpY9E>8{v*Pw?VTv5v ztaoF&)VHwl(b#&ou4UA1@=_f3n#GZbT@gNm6<<7K0oy|emM+irRQ+JmuL*c z?dRJu#1&iUpE2~_!2D^`^@@VVYws9~c~E$FpUj@I%yDm?F|w|CbVqZ2em^LPX?w1M z;a^TvEX#(unTtl6^9&0{;=HWc>EDqf#wYfv(_BM2Yb2ubGZEU+FM{ zdJZ6ZK1Z5SnsH?Aa&31W%YRAFFN_xWO5);`=I$TfaR^=yfkl#M9+rO#c=Q@f9U0WM z@DTmI;8Qrru>gaE&PoD$$4zM+is~b?li!E;_;YW&c+knGh4AST;~mx4`&>NAhBp9i zE8~yLZN4x~oL9Tpw9XVy539;Rxuys`KkY+n0+QA%u^V-+P<*?_NGm%J;cSAdX-R3l zCa1`I?Wmb~;GoOVlob-qI+oCZ9%aWi#=n;%;yLHnScd5Xd#~NND!cQSda>V z#S^LWt&6pnMA){D=J3Vj`JD?Wv5K!GtUM?$?B(Ws@ze%x1WoZNIbsjbLm*R!E$fE6 z@?yW{Y$!HsvTdR_zRtngc*5W7#fkEQ=E%oMl__BtiLM!j4+)UEsKO`G|n#s(Lh#?uy0R@^KE z@~CjZxB9CV-tt}gT|X;CW7Tn6d~2;5k67i8u^d?JrViu(CFeHB{P20uu^v7&-odG@ zqt;G;9Jc^_MsmS6{N=B-$VKHNw(Fv{HU(?tMZIb@E|12yGtaEECe+Q^VXx?w!G(KY zOyEi15XgaRc5S9*Zu!PsZHU#_QysB~9>lzP#)2C?dS@(x3{P!+gpkKa>~-Jttj+n6 zI=$9W{AXx;!#-tp-R`&`#>t^~*=7EW`^+UyTW;(*9>(Uc&`1BkmH+DjaB}SRkWAMB zLS3pNNi4Z}{!zd7TCerfa?tR-5|6-#&;B~=8v+N}=G%4-Y_5#agZBDgsj}^ZV>^yT ze7%f0s?Fo6W68sx9gq6TAyVfTA_0*ma(CxMV%X(4dgQ}?A?@wx9<%C%Q7G>(g=m8&BT+csyz5?0)`*hs|O|E+3dLJ}aIxj@n;r=3+~8j2j;i`2lS1NtL&qX@eS!=7d;S4u2_uIk7L# zb!qJ5#lHHD!S0_qd1PD}tUQiBWCVP%4Da}CKSv&aYkQIG;QJL@Qmm`;U?kz5`n307 zvQdxNMxI(Ccc-n+-^+DR)IL6Aulzlq^{%Y_GWhl%9=`QlvtPQ>MpFHC4@s8%11kD6 zM$$RZfIe^T1;kQ+D$_p1n3&Zu&+*7XY!&OI>ihHf_+wdJi{F^e{FIN7(NPqUv-Txo z8S~^*b&BsCiNcZm@b7&r)z{9SI<$KxbEm)OdLvbzpyD>KZR;;%^di4)+{bhJeV&W9 zCz<7+8n`^K-1}Y3lZxM1&$vp(hkNGaUj9+OLZ`oUE!lMx!}*Y|eVuxm>G-TZJkE=* z5hX=0(D5!a($S=!ZRUJ~&iRwhoN#4~uO{wqtv$^)Zg9Hh{cP1dJS3;<#^D{F^F$DE z=2@he>IPT+)=OLa*W}Qu*6=szU?&ET!5UgN)rWiH;x|0&jgIf>!cQ&Fcbdm}n6;Gr z_|iO{*yMoE_xE0c%%21Y+ih&izn-E~hwt-Dyy*lVU1Ovj{m zvCyU8JTZ&Z8Bgbm0S_5GSa#e;CTDz>SzN_+`e?7GM&U#|RJ^vv<2rsCM?+@F(ZUpn z{ctX~zxQ~SEzfzJXJi3{Z-|vMh$}I9{h1V{TObpp3Bv>xDshu_T)2U?ns?HIIZ=ETH}mm_2Y;1mT!43 zftF9mX<>}37`<=65zpt0^HINd4RsA$1F?O5Ubk&sq1r1Y<`X-4?Yg5c#)<&~i5_xZ zCk<>tz6J+eX^ublYn-_`FMZ7%dFi>e<+6t5L5$DZRM&IzQey-dfhUd{YfjN4f33;n zk~q#BdXp%y<_0}m*CkJm!L?jwRzB*h^Qd`D^_T9MYhIDLC(t^#k&~aw)6cpian*tD zW!r~XE91(qlMmUVbIwfsgkBCCr2b`9`(Uucbgs#Xf4_HH3(V4X zz3$uEGf9|p58dbm`<|!)pI$w-R$b7ti&A?(?~FBD?&-m((M6k{7C{^7po&d*1SWbXRR^48e1M zVyHg0PG37li)+uSEwN>Y0}M4Da~?7y*75^8se{y}$E*c7ZWAw5%;uQu!cpsaI}(f; zNDv=p-JMg(GA-Y`j!@SU+~k{?+KPhpQlE*o?hjqTH?vu2l{)9)TBR_h3Y*L-7xzUQX4ZP!;ikNP>smLn~g>hE2g z{uHP7JZD?MK5O+pXSSvJ)EFiYY(7URAJk)c$Ro#v9yrxGYpYc3lNf=4{qfM(P-42r zI(;RU=tl3MzCZs-SH3kTJ%^ES4UXT~xW-IWnYXm&(8>NZXX!DnKlE4bC5}JjP6CsA zanzThc&a~tZWo&DSk`iQ8!OE-W9DkFd0FxlhRE>{S4L9A=dn*LnYj3V<`~WPj52!! zeQ@wGgjD=(y`DM4EE1Sxu5mzpme}7h636vfptYJ@?fWluVnNA4ey_syN67Gb%Mo~2 zc?7aoyH?Df>klzs-`ASXxOmPZLBjJoXH6mdY*X12#CLjf+IuJ_@$S!p`*nisqZExx z9@VRj`!k8T`)3Je7$<^I_XVh6-P>&)cC0|WRvp(@$2PjPMQ-Xd%6&ql}x4Apqk~PPEV>Onpu^ZYo`7q9^1Ltz`O?-^RYkb4e`#2{K zJZ8FH=h(go56s|fI{j(BA#!fXS>H$1&xr)5wbr&iE`P|c_F84mbvtd}(-{Z3b{^F~ z?Y|s>TOaKAoJnwqT}CZu{23S5@~U|m9NuHM=lO-vx4-jUJ~MHb1xi8fLj*^AK&?Y0 z`k-DHRSzTmZF-Nf`fSjF$vz>>JD+Mi2dsuaSeCPi)YN&y0O{$FIq&1&ocY=00*4=#35 zv7=A!@C9A9^>eVDAM@2CC+gQO2KG9XCkbMj4FP9wTI88)ov^;q*T6npeVce-s6+qE zbM2sWUw>mJa%hSH-u7kY#tviTiiJ;bD}SkzB?o4{7z6)2MBGkZdqAKgIPs~We4)7Q zNlR__mVbcKbx~`Wv5OnnwCGUkBRA*tgGXDvv&F}N9C?K?nCME`yqzN^b=6e=R!!o} zxg-&_mhhZ$rhockdtG-%M_wDNb3zCH_|p7A*y`G}_0-G*vOhEe5?z}d!YmhLvIep+ z>$v6tJRTA}1023GCn3c0(1EkEu)w;d4FL&WetUg-EUkB4?dCjrB@<&h3vMg@pTxCDvKH zhwIyWf&2Wlj@8N4+s>ro(esDAh7+M*8Mx;>KG4=i*BL%3B#u>&%&QO2wc?mkBghjA7|u`Q1xN3TPh+5b z@pb7Ov~b5ye6QWkCHGkin=4KR)7^Spkn#G!(*7)#bKU&T z+*zy97fru*i3=8Fv_6M1R{YpQwK6BMW{$z~#fdap)!lgrujAHTa=UrW8C0CJW|^lx zJagwGJ@A%KVzR8ejw=bNe>`{YID~kd!}SL~wjemj*EaoK-}tH-i;lc&i+AMVT2Gy{ z*S!wGUtj#mPwyGzwYJRG$DY;8*G!x0bMxnYMeeAVIOzP?+3~UG!pwS%{8@)K!b>{M zvl+&S1pWjkSX~$UgQ$4+ulE_x(L}x;P{&?#`j!bFko)JB)gFUYGwKrqE^glr5-h09pKRop1dy#$=7=HRvMo zsZB6FOd~tQLC?;wTwtmD%07sER)`XNpXtQc`;mLE#3G_K=iTLd0V(vnDaQJ|G4+59 zvWb_t;vbl%!LaqazQsgcpYmXzK6jpaVOOOf9y@pLhP;VjoP)W>aTmd^@88{;=P6sjzK*9l8%dLsB7wT z0x{_`8?U$DlJa`PcRJibLfu)1#5N9ePCPL+%oyWTWt6 z-T6{KBYZvT#2n4=k{mozYVGmEvg${FE*?-b`+rBtbJ~`*S+{eJPM&Jh=Nd`Zd}7s= z|GjN$94sK58L+)Cc1@>#sfX@~;Eq|ZPx5-Vj=Fd+c@#Tl6F7LIS3Xp!?zt0_7T^4Q z0N?pS9vdS1!t~yPr+5j6oH;Mz8Hac@L3N@JB}a)lbyxpJ;Go7EyW4l->bhch`K)pB zr4Dn(-k;fufTiwpW6zm`z|JFfVt;2#S2ehby>*`J68y+TkNtFAUx@f2*NJG=j40RO z;RDb6eAY$9$mDrsySCW!y+}ilneMrk8kQ~>CZlTn=B)bsf>fr-hdUmlcG6lu3^HqB zaC*j51JM)o^22q3KhkwO1+2J+NdU(3>>Q-dA$Qe-IO=e3Jjo2efcJ z3PpD0b;U+c7-oTo_GgFi>dJaffFy{nQg3xs4 zJ=V4VdhepaxvZC&@ODn|xwTuF`U=3_dji7-O89a5EXrO*4%35!EIqZYOE}$g9?w0O zW%B3pn6V`Hi*pUFtS&Jvp2+sbALC5SBks6*k1)0_@zsW+r|V2vhqxHm7QFhR#{0%K ze3=_e6s@m|@}dd#V4@@W)wl-~IJ9RxWh{fPy>LFaVbfR)ooAcS zRKFjxYbIn`V=KRQ2^)@N#ZTY9$Sz{kll71l&#tJ?I`<4)#K1bcF1t3J)63oZVe7Ub zdGg7bfgL-q*x~6+K_>Ahc4O$0+!F_CiKq4*6Dmkaz&UJO|sgI_n z9OHTaw+s?_Ij>Oj0oPbo-g}a{?lY)sQ9`TdK5R{QA^}c=eQb@XwNLz+1eR(&|A11T zy}(QUS8P%N%kuV(+UmMA2a)wjXu8mX*Ibbggk3x8a}C8u+r02Y53M`%yzqy3Y!HgYYj4x(OUL+A-@tX=giB=S zXNJxPmotJu8^7&`-OaH$xD!MuV*HD*YBUOJ2M$0%=s=EsJ3^G(pt~9s~@b& zL-=_5#zgBA2a)q%c(zXX_v=DGg4+j%&HcUIQwB<{s5ASSnbbuRv-XRwUK7Z+MuyqO zDVus(K6KQWTIY<`F-ga*h*e1)tvgx zH3rYU6xpd)k;70IU*Mq2T<`z&zu3s2pB&D=Fv>5CdP37(&@B#x=3?7P5~2ZOG!vC% z)B=EO=am@zB}f9!0<+?gYCz%l!}Ao|Ae+=Io3KskRJO^&$3BcZcxP(cJQpLJ;GXs@ zBXY>h8^at+>^McmSL;oNQd~26dURuF#|<%07yi;8C2Y6QkZFr-3l-iX^as~Y3{D;{ zD7Xll?VhKXKP{e3?Mnew3FDP*3S{R{bofkxd((;q95Q?DA#kg?`vajRq+XB}o|y2? z`ArBXr?Hb->IUZ88y@}6@9|(7OH@0ye^;-EajxiAA$6;j8Z71<$Ed)oAJxpHbYuge z=BY~2A(nht*@wpHn~)M`=Gr3D_#>0C>sI*rp((_;C=i3mjk;*#7kStR`8CJq`Y^X^ z*e9-9&K2Qg+5|S2)GBX~a`iq&PgL9XN&Qo%{^Z~z_lXf1q=?amoJ)->r%~6{>ud!i z#vYw=JQ+mBtb=nnT-qG+@g-qmxyAkCdMiOlKK zrpVP+v9h=Ic3#MB@S&@I=6pjF^&y54*K_^jPvqkDAlU{vo|;r_$RjFfleLK3>ky37 zRzKty_sl5}tu^b5-*YU|+fVG7hrH#4iyp|f8+*8Hp59!Lr$gKIOWY$M+I!9eU9cB9 z)@D8QLH2cOci6TNsPQ*7YG*`!VDblc_JRB8pj7MuKvQz)Gb0xwF=Ec`)Yw^zm@=9= zJ=2>@2z&i6txU*koSI54f`I0#GyK5cf}7|Jid7;9n}*Bs$wDG^+HX8oG3Lf2W?~b- zTK82S5s3IQrUsC;eoJ7jY44lCVW#!om`l;?hj>Pp{U%w?2|&DV_7neTk~eB4`#AFG zwN`q@oVFbTe$5yy*PGeQPYoI>eC(iyl@R_I#x0co8Rsx*^d=-@GOi8D#t)c!7c-oI z&;Eys5u02_X(S9U07i_vpPW-EF%Nz}d|F2x>xqhiodeO7xc0q$=OlWkEn2AB$k}&E zvR3zNOlv&#z~4U%2oCiDum3WLdDW4eIhJkg!;k2qdq0W+b>GtBKRB*m=D8;hCcLwj zmWk=qei`&HzKRV7GwGLiZS^wNs%5Kezx%9+43gd_8pA2CRLo5s)Tiwqf>{G`H1@sq zSa)>L-shEH&TDx1DjAKDGbS`+=c4;q^4*6cvTD@;c5WKWCl|e+G0q1)h#Y{sKlpLQ zujU`Q#=$7-8%f)km@&QT5D77hMGLR@gT%wUxF~`i7?)3ybj;Y7&gJ}3 zivin^{<^=%hzLw_IJ(lwS}RVNA~f9dc+DvpIsgFw^hrcPRKUXEvh?#@lV^+cVS2da zyY}l|<~{ByfHYP-(uwKqTgXCbl?RZRD|hdea?*^(T%hE-`H_jKvFNqV=_l`GH#!*X zT3B4vb;NJSfG(gS#D=~1#Oy;e!A6HU>>5*-nP$9ej7iY&Vb?mG^6=X>%-gc83wD+d zn%i+&N`I)yU~JON_?J=ql#n_b*ZII<@FzTMf!TbWdo5HSuo0b=OUdlmpsf>P%=$zz zw!&{L;nY6eSyLO!z4WAeUqb0LhfvO_(?@iI>)Zi=+}#*Ze8Gm@9-bTHU}x{|3C*+i z`>=<6>w=b=yW~rqem24UnV+s#&%1@cvzcVuz<|eG7?OW#neQd#~%B`Z)~IVLURa zadBs!p=2<&vCUtGb`mx>5!lyr;7o)Y-HA0f9=B5?leJARAa1F-pBf09{S~uoEW=$@j(2NZ+<9G!uSJ~7ASgcLzra8)d^BFgS*R!7a;HAwT3jeI}&YyXz z4EFlj8#-}7LIA+4C0)Z^vJ1 zU-Eu|d)CI-h>&feu57P0kN?cd*IDDm8%6rp97d0RA|GANze275>tSO>zIIn^HXsjJ z2U>Bl(b}+X^FCO#Sc+Z52Ftc-^_EQI%7uNi?**~T)P4Mk!Z7OZHNNIMW~4oN@K{t4 zW%&QGd$D8 zZ=Se{pRTK?Vi$2qcnaJwM0b97A2YpF`IipE&~+F*u#0g;Q4G&FSjg#{q%JOUXZ^);|9c@o%=I*e^|);ol92wD5XK*FvQ+Y6n~Ip`tB z6~81X7sB!E*k&azwN{^e*~BomC4g=4#Oog9oqEEL*?W*1OVYtw@;Rf+eag6Mn@7Z! z&$jHVeK#&DMqGNV`&qwRHaL54Gn#nr=9a#u_VXGPIj+d~nE@GQV45PstLG**{7a|G zAnU;Tqfi`dLFBi&KqkgHCM=RcyD}x5lFZJ;QlyxR* z8V==5pS7a~IU}57v}a$QF#_vW^9&NlKD$~cd)-3SjT_A8=Q-#ZOEgnUxAFEoMpL(28!V!>t#4mCcocO!_+4Yo~>o_v&oOUvp<&73}#YTh~d8o_X&-%pA z`GY`W@8?SNtSNqTGeC2(z);54(WQAHu3a-*hhEpDzLFJ&R0>l;==5<{cM4U`+zP-}t-{$BD9sRz&xb z4>;se4gAzz;$ZzARg287%$+>>^U(KzmKwp4V_wsav9%mOC&#+bI;PP(2}v?(j2V;u z_N^iY*6T;&)K$5GE_24QlCF{?ZUYvP`Rf{b?^4Gy2G6yPkSXzy7wkG->&6y*=j+gk z&-A$13t#ycM(uHu@j*F3@BzeK6z!Na8nk5r5TAKF3kJ#7Jo2{1qzi~-N@s#=aaalw zz(oz-#VB70rr1Ccf&bP!kuVmyhz2VKl>)I%UAt-F(1UNc=-6I};xdvjY)fx1lC>o| zEePJk>eVJmHL`q0$^~cL$kKW!VoZME**6C%Z3#4QePhLH(m@QLk-!@H#Mml6X4LrY z{Gx{R%v;;ON{7t{NtQlb>l1_J;zfOCWBG8QkG@*xowXeq zY~mwh4ra)|Jx;4D^}xIf*$CmE{d9Fv7q<O|2)XA*MW3%bL}Xvu=Ea50tfxHab~1=hZpgzR+Y3B7Mv`$B|jWsopWpagM7A02yya7 zEbwxk3@+zJhD*;q&4Gj-EtJ{qJN(lp`(yjGdD!tyPA_cRhx!*t%LJ!-#Ht=5*nz1x zI9YqvZ$Df^^bu;FXhCycrI)=S|9E%^D>=3_giKcQtab7RLc*28!1S(@cNwB#LZcph^_esGzCXH}*& z$C{dF0kJQ^rk?Dc?4#E;U2&WbA`&n*3cNH3dVD0BMUo*uu5VFu2YF3k8_cenT;m$0 zUNa33uInAHaN)1}3A1z^AM>N9wsjC6nBStz*SFzDk(b`s$}H=yn$dhRvvJ&#H}i7s z`f+yUgQ)mkqtuTP$c;Fyede+sjG%sM!8yYpjhq|$#!PM$TiRL zQ?nShT4ZRD^ZrF29la3?Uhpkw<<(%p^N?c^AA9Tz#ld3Bv5owzXD z+VDM0bk+c1*`wGE*^YSF=Dl#EzS_VMbM{MYXH3k^L2DFz-WQm`XZ>)C+N!MALzt0| zW^1nXU#vVUpf`IMsl9lj)=1*_JR-!($au+n&cgVx@~K1+*Rtn5K+i~)v)%FU+;{P( z6noSr6 zVXWwapIL+G+8Xl=2FJJ_2hTNuKbl{4F+RX;?Dj-FV=}KXvet23V<&$0Ge-9dGDeXv zuY=`pw#yE5fV>BuOFla40P-VY{w_e(ane{ zuE+gDYejA&lUTD3(r9et08!ziMh?L%1~Qm)>>9g2@WkU>i;;7^F-C63i)QwK@#qU9 z=O2Rk9x6<$Cq&Io$5_ZVcdi3^_~K^(;aXq(!3f!c^!2&Wc=;>_)AIJ4H4Z)^)kzMR z)7Uy(BGNn=QaJdZ`s0}<^UZf@__s*^qkvFwET4gRyd^#4Tzg z@2s^r>-(|zMGw60Pi*k4o07&y-!j5 zJqwiZe#i;)*)pLail67KfLqRTs%cCE}0Ayc}C_eBYQ@p7HQG$!V*L8<3AaQ1a{5v$%_pX8!B4+jjmiOtqEZyhFyUH(D-r5Sj_ z1`+(Ve#9Iprh~=#Eyvc{3zM0)Xl{RE8w}>-$2^0wpU7tnEW(ZzWFz_-jvvdfNbPt$ z5O3s?&z-BrRPw!0Z<=!*e71?;ZA;>-n_L6~c}s|&y0B?$*o@xjBqtEe_{LwdrA3|& zGPR2ww#f~B>&N6Gd_I}119BjEPWj!T%FE>gvhf=pURVdduFa3V6Hq-WHAfIOZ3-Q| zm}Bhg)RW~kMuZ#zNW&bm7B$9v7s-n?Q78Eic@8ddipg1rjL&~&(9uLZ+G`4Vot@}X zQKNs_>RL5MxLIfQwO_9HLwJc36K*G`_?URGk@d@73?|fj0!Xdt`7VUbB;9Z+MKqHja#EX z0*Y6bBnA#L&9CE-9JvPu$Ec&s%Z}pC{Sm#)GnK6AswTOO4<-W{nSmusd;N(jc}liV ze=#6kASKuJFk`T>H7OCrH+%*U5&XhJ)*@qcT0htz4t%#K>W2@KbjCh55(gv+@`#+~ z5m_}NR$>#L`mROhfkfO61k3WqQQt9huE$3Gam-QyKk+l4b+kTL8Hif^iV66%L*n^d zKt@gCsYvYNr?E74+zdUdtH!}bx$6_ZAmrjZJ|}~|Crcic;?Q~|9%JVx1DPNXnp2zD zCx<|}Pfug!rH7y1zf!3zl>E<}_zs2IR?|Fp-_v^D+}Mo8^ck%fWuNY<9V;d(aI7O% zIN&lsPUbbP&G=`wvCwJ#m(M3XE2(KKessX@-?ugGTbK`q_nkDjjL_q$~-wDq%j#!q_oS1+38*DjMY zHPm8ansrpm{8}Fkh#@L`o@0JLoA3{ZAVdDh4_wC!j(FIMPrQ2_5^nuP4lDHmzD>l8 zIPo!iAHBryy#(t3MwdB!Le|gC6GP9}#GM+)e+6t?pkYSq5#B|GB|9i7#;@rx6=xa6xG;#m3xU z=`+-&Io~zSIOIAJm(R7Sov0y`HZdbtKkzm8uX&Cjsd{s6K+f&-Ym@mAUbuAfc_8sO zFO4U8nB0h!dWdd)#g?(?SzUc~9Mu@T|>f52ry9Opk z+nHhVq`vZJ%<*Sj6eqTl-{1k2c?R?IG>uY2$fl+cH)#wXo6I#Y>$BC!d9AD$MrvG` zYKa<~BRc-4Mo@8htgj@9)v}JaSoy4rZDf$2hyaT30(HCz&OXOijlomyv0MMm6jh$F z*Fa~B?Sm;UIu;Q>oJ~e|zOM1T!az(YNvt_)tKc(&*824V^!|Xe@QCn_=|cH*ff@1=yRftFj2KtXSA1|+bL>5h;~lUSuftJmek4x9LZYD*)*2zC;jFR zUl2EzW*ifuQ`hJD?V6ME$~aag@Bvxok(X^S$rHM^bI7a*iD|hsCg)lM#^|L+;z#1d zW@;TFrWw2T#Is+>i-#uiiF4|9a3QXp10^wIMtwSZ2Mda?Tr(Aaa3gC3CAYrHA958S zM0c$C>^#7i?U}KT<53GfxW;p=#1enkIgg(Zc^0c{T7Ss1^;Js`z?4kunoN<4QtknE zK@{BX7sg)Ou^k`hJQp{0Jap6zF#fNGB)Ia7K7KZS#}Ir6sc}3ErfUpdmfK{>)|i-y z2|W;^?+*f&2+z9Y!+uSy&YQ*u1`}ZVjS6p!YvefR*`m2dhQ6`E5GDk__3bOKWd|l$ zdQBcJGrG+QF~(%Zi)>4|WPJ?gi^=;{LvYb>U#%Zb_2xqe9&}&TLuCB0jE|j%iLH^L zuHp}08s!5yF+sj6w$!JbJD-`8T?*AyMMdg%-xl3!E+;b#s3R zWA4Gy$zLvtudBw%v&8rk#~;cDgEJH#ZOXRrwYkaJ193H` zcg<|n_L^@vKCgs9{&=so5Otq1Za-SGC*N&q?2!k@qPfUM2BH?${*yoUmp*)n@}>{j zFRN$$q2k~tHX<;jK3H8l?63}+aNe249zXOUtoR6#XRVj6Irk(rb>aP`UUFOP$dXU+ zF_D-iUS5(5&eVpkIcIotjqTuOoh_$veC?x@j#NpB^C zB%i4V_78ev4}t1op`neX>vQGHeHAbyxIGUgrqkgkbKsnEvb)EWY zU9LQUA^VKLa9`qB2B%RtT-ot@9Wt@Kd8|E@IHxjZ{lH-DTjxHf)Y>0O+7;YAs1r#?mH*Vp*3{v;Z1@+KJk6vtj7r>W+@ez=xT8Fd70Ie4i{y@cO0lRy(I z62Tgw!D=6x{GbMgX5%{~|Ctckj<}9ve2Q(2^^T2$6k{^Vv~ZmVjftJwVI-bWr}bKn zeaq^d`(A2`m>e5?Y@Yn-<8wbRf;Ur^4_ET|ir_;jFzqO zJNnt@*fyp>Fy$EOqqb}_Mla<4%yC8EK8W93*B{P7H0fjO{7$2}@xGORmKz_<*R^>C zk2qF+%AjR^e$IM(UXAe3#+UlXm>kk2{lSY2&YQ1^9SdlX?8DI8O*s04pV5gNn0y{c zUg45+9Kw|SwO(oh6zi&go@GWuM??7DUDPOS`OjxaWO!q@xnxk>`rx`^3PFw00h1OL zVnu)D)KaXW{1{#ms<&SD2m9VvBA+vfZP%6v9r3UMVJ9)(ojY@$=DSwtdjG`AF*OjedWSE$1rF1_*h$LbuEIR7XF-d z=s?Ml=8RQ&&98iBP0jN)GVzr*_rAD3wTO&tq3?B5yLyBaV<0~yTDrXv5M(`bt)`=^79Z42?&X&z!HXv%=R_o?Gox|qh&^O1VIl*D{g_&C?P16HCKh2hj>J~~ z=vz;+?Gs=91=~M-RGXSgoJf-o{9xR*T>11^H1)jJT6T@;YwDPpR1nJWHO3#}h9x^- zG)Ct|6CO{T_>U*G#n@{(_UliqVJmigl?)V#@od)G_F)W;bD?_ofAxsmXpwKvAGr1d zj^;4W{N78{U;K(aVu(yJoGTj_;fToVEW~O@?Wmbo{o3q1iY?|>H%Eod;dzp^=NtKl_AxDrfknv z$g_CyKd5JZdJnRFQENIivTFq%^5nvN$Jaf~Oek^ScK}^a8hcNo??1^weX^x-06P%1 z04vYM((zg|4~5sY3u62r@Ah^4&$8#}V@8H;?;pAaUFoPns0?IEl+4^X~)6JbMhaEZz7_!od`|Lt#&IadB&8{1Am$hb$+vO80eSGSDni;U^;}`K~|DkKIoVR{Y zfv-Wqj@D>!;@{q5-ACla-(6IGTJ-VR_ADb7>oECp>;lUABo7eSiDS--u}z=Jvb&diT6jo$c+5j=4YnG-%do++W$kYfYSZcUsbct&AD)EWsN`NWtxWFluAzmpr= z^%S<1C+S399ASb+?VyB?|7e=epP)OpYVD`m_#NLMdib_;mi3}V7aPXFwh_8UI|oKN z?D^g!nbcAAuu-d)lMLY-Tdn(p+uE)Vu`9A*^x0Fb*XA!ZMjLs=Az=MxJ{*n7RAR6_ zM#^=4ZM~2S=SSqen80=odd38A42qlsYSJ+Hgl72kx*o}OC^-tY+47-zr|yV>Ip@lu z#s|lvYxmHHKKP<-L$RVazPOKE;snU+tFHYWIZdv8>Dn4{mSnSWppRVlzx^H`9PQXN zU#&^{*dy=g_&Es~<3`VOsO#-Bmx1Q9uBlICyB?Mwzg%;g^JhP#h)?ZBR`U>7pSyIZ zN8%tR;8b6JZn0eOA@srYy~f*a`;2UB1?lFcd!uz`q``yE8h{dCoU2htm(~LIu zSr5kXVeHg5F=?qA>syKxYhE(s3uOA9Q)`@QvCmo}k2b_}Wjff*S}=!A&-gx`IsAbM z8spTT#U-Z8U^DOU&4#kS6Ay$9o1NHGo6!#m1An9x_i~Q|gdyudtXT(0t*7xRc3Z2+ zG;i2*{;(^cu4mSonACUN=|ikX@AJ)#6y3sy#T>b1)_x!_negR@c+9Rnn4nDlFX>}2 zhIPIYY zJX$slSj-_6UpQDc=6a|U`NIsY=3_teNCbV`F76_dfO8|w)r&m7$f>LRLB(X2g-Ohb zpT%)*_2+{s5I-Pz4f0$5XN*woHmAYZvM$caY2!HCqF@srB)qUo*;G46?O&x57rI@G z%unmJjgO^dF1`3IS^K-?iU~D8(8-6AhdmEf9$5hoS9%`e4>$ez+8j22p{c>KQ-8Z= z^qrHDu^p{dY(|*2HGKNJFxJ|pEuP!)39ZJ057)J0?pphsG_oG?C9WL4k67cSo3^&q zXe=A5kJ`ZJwGP5-eO0GVlk-vpSG9`ob@TKiqIoxiVf+Y-zEU#Aw?M!F`(==tG%^1k=Dc#du7 z+48>bdX&)erSUp5@P+FSK;ocp-`q=|oM6-Px}N#s+B4-|zinmecXL$VkU95eeqbQ( zU~;Uv~mK=vCtV`}}Q>4=?IjpqEsMtq2^ z_=P{nY+LApf1jt=IGh&Y4?J+{7bx}9KFmBemko~@?KNoI^NM~X5@+k{?4P!ZU8?N; zTHW&*U+kNA)nI&ome+n`YmS;T=#0&E!B}l`R$1_gl-6q^zNIDWxp^Kq@#|xA$Ox_b znBlQ!=>cose6}YR<|_*o10U-1deGA~vKkM@8As>gL8q_9HBW8qhhIz#=FvA}*RN&6 zDKYW~t4G|Qy0JLR9mAm2H^y-5cl~WmopHqW>>rI|dFv)miKDpC*@vPPzLdjrOd~b> zg!wavXI(+HS$=)BAHdlXF~~pV;W8fqOE7NijFIcTE47giEVUKSB6p7moqk)A=R}_= zt)XJ1p?iu4`XA#)vz2L+<*V8`C9JA#`E3(z=*=s)6$%BzJ$KI=d%)6Do zg0c*Vjs2{PGrzQ@+9?istX=%L_;dOx&db@WTy*oS-P*UEL+4`OqrEqvbH7#pT<_C9 z_WCTv46Cdt#Mc>4-bT)zyB^SnJF%%HkLP(*y5ILc=UE4_>VNah_{64dZac2cGcQnU zO_MwBSpy?>UDQXjy8AvFy5!CI&piy>u5o-;$o!=Mjk{0d$(2B=PH|$-UYTcqWEXw% z0MW1CUK>8tYs~byjY3 z?5y=2edoY4a$CLfC8i#i%t5E^N9|LHT%gxy%@Vq2y(LeHu~LmOgv?&U=7Cw{@!58) zj8WN}`iANCQop+RU5sc%A3KcJ*nsNIdO{ald>-&Q#~^gSCKekV2$cHJxkt&Bnk)2j zw&WZq-)An+C6C38yts^MwRSAu;#tDcxjkvcVA-54dp#z8OKt+MSoHA?A`hou7ZRhN z8}H}pzk)L^<8$4~!I}HoJlD1US07*QEfv@C9`o1w+f+NvqcbR9uxX!Edtzvel;)@r zwNAeJtV4<3ecX_sWkY1qc(nXduYG)ItWbSp_LMt`xKc0bvp3{Vh`BR=r%bx!~8aqDl+f_+wZj&bANxj*%AfHM{Sthx8etVho$w7kx&%dACtJ;xYh zyERa3e0WrB^#LlD{WVJ$y;>^_kcXBG>p)ziXV%yR*O(fg^?3SZc}XE_X~kVU^A1`3 zXU?98jV`eKg*3QFc}j2U8L2tLk+R=LAR=4zc<+OU>u2R;TIR6d*db%iIS<{(26;{7 zWS^1HsbBRacC!adIWzM)=Kjof6vQg|#;|dAzGAD`^fKQwroNFw`)!-?A^5QyFL!*Q z_>Ya|slIwFby#TL-;W@4J?DOWwbJ-@&fUjVAC{g7o2~U?VROr~&hS!Kr@hAId}tiI z;(5U(*CLz!cE(V@n!8|NYxuS^dV;f#bX^Oh6D*01J*i15WE|H`TIUk!xFEr-PhEtJ zWvQSrkJsg$`>S?Ns(k0p@mUv8<18Tyo%SGXBG>&4oi%TtZJ=_(5R)kgjf4(OaZtE?9m`x_dGLvEpZnYsXMBt8 z^VtCGhd+BDU3@96{3WhP_}ORtfQA2-X?x~J*GQfePJL-U(L3{T))2h<(=)7uugGJs zb$yR{^q&vV$z9QaD!5)NJbt~ zXRX7u&1q%GNBBZ(Olpxgp5&695mpb?`e63V+qQa)+m;V8svfqMF9*Ldojl`B4EJ_Q zm4|~&*XqnUu`!2U*YsY#6#qcXy!93T&KH<-KB)Z=XNlW|@JHuke;n;xVcWRNmQl%nJV8%V(@m<6UzFByS@Vk2f}XK6AwE z>33si{`Bjl=9Rfbl65$7x_%nE-*cC1vB^#MiQ`bL@Y#ju&&^BD$>5ZNqjiRvgizQS!@O6JKvNch3rdVUkF7&J~) z8Pg(94|gKH*X*njx8e&ta(q`KB2P=+wfX4h5!))x(Ka_8a*rF2tG7`JRfmpx(=f6tFeS3 zrFbNf_1rZ7CA|eS1lhm6DDh%Rx zFIb@A3*1$-#!(L&R<6!9Zitxqfg!|)+(^Zbj46P`);3n+6TKF`u`QEL;ko4tvXYYy z|1EldVCFSqoh_&N7LT!m>*R@#%lKRWnI$x8!u^S(>*zINjyHCUJ8P|Z4oE*l>K#8t z*b-%Z<-ep?U-^)z$^NTfA6OmcBMWzaTO1k3msm*^GWF4$*}Bnj&ei1&u4_nyj{VoW z>+3p1=`E|t$eAbK%!nLx?w8hj59smEu`nK_007O#vPNZjWV6k%Q`k*MeB2i9WO7C$Gd#E|UZN0i^q?HPiL5 zJaePlHs|B4h53;+VM}k;ICk+N_&%%j>e?Dx3}59x2>1ZCrpSrmUGJF#xIW;M*N8b} z#j}*;-JmO({!&HHr85Tb$saNI4D(tr4~|%o2}bLKy>iVJz4##^SlOqVMLzS1fB7kD z&4ccBM^Cc!qf3lAM;)tWb9H_Po3U+Z?6+`{ON}H~yLPiKtQkyfpTpwtJfkze?Y2Laoa3~@BanNJ?!o&4f9@66ENHBDV(Fe?of$WF zsLu<%AA9Y^s~$eA7`(m*9s{(FdP^SxG}jbsV(&nE*1D`uJiz zbHU3Q$J;S!0$fV~tmeX#!@5qsnFoXO(4v;{{TDeY@`aCGo;+tgqVImdC64w{-563Egb)nj`uHG*i1HX`hz*AqCV8MhBK0XTA`rts|tazn^e(YiktmwP02g7(% zOP7e@7^aXW^t)Gb8Qb&jP?hWY;6$1=M2NbJ|IGtonuk0-a3(4LxW;_;7X#U`FVXA1OAK=c&;x9! z>krG`vj*y8iy8Qylb`098CmO^5q)rbhF}Yyx>nD;@|Cxr{n?+n{m>7->GtH~kMBJg ztFzW2*9qDO7UP&!zRZWCtL=p7do+8E^@xec#_`cJMld@&sc_!tfX7_-6n@bXBmAeH zdG_|kH-6{sm;d=M-ky2p>2;4|ZJ>Cjv0?)|xZ>FMUff1I<2tKxBfG#<|O*F0Ti!~b%P z@X&`&pRq??`Gs_*{ha}G;x!g~*Rk6AnfpLm<5<>K#f?r#ZDn9lC*&UBq1IE+B9qrg zeF?(De_HFYUk4Y)Xe`X!*LX9aF0;OH;AOvny}yj4R?umkxNeNYFgeDj@l>j5A@pKX z9O_7pFrTvk8KbywJzmy_X|2SrZucR&d7j(0e1^zQYdU92`Z-fX_7(fdWn%@4dhj|S z%7t}Nw{@BP+Yeiit0+2|vT2Pu)Fu+-u= zSfD0Od?7D{5L?wpuDK&NkQkl57b|k{q5Gxwyv|6CFU>tPoaC6ETFVQU&t{l$T=pe( zFj3<0;(@dL9-nKcm^@!~?>3)}YsJCae%pfH`h$I>yq2Qbd-g>Pa?xM7?fNC2^nD#) zf=DwyjUTNGx0(w#c{7%5BZ@8b?Flcvk(txd@5bgmW*Kzsg<{LS21#tudOwQWHFb_6 zzVcOHsmk*=C!xzMHc(lPd0A}cvDdG@r1+R8%q zU+aY*j$!cazuxv=1A8tx*0ARVcQ+Al=+Pv@YOy@f~33ly} zp{-0DCOR+vxB`JEyTnzj-PCR72u2 zkV2o_WVH3*5*PVq-Z4@$@Q_!Y;IR)FuY5|}ShLm+z`U#}gs#Vf9sk5ZR^+@Y*G$`n zI?jXSz|8p^pZi@DgG zUhs1d#4i3d9_y-Y9g?fY;Xl-@Wip3urafjlJ$I;|jky zvz+r1pWzkHeyJbT=zA?4Th52p7JB2f=ZtN|#LzxuO!TdifRNAqGoKl#=b$Aou5F() zgQs51G1hFHG@kQFEQDs?pqW=|?_{5r^?2gRCvT7I^WFp1n)56^>k$Wq?RAXZVD5E? zu-$seXNuS&$N0^tIko5PRb=b4-uPK+e0(o?`j5Q*SG)6p%~=Ea(AX?Vj_FM*?eif7^kn)00{ZHU3>`5{;*GynE3JAa$_(1 zk!OH zI$6_5R)b#iKnu6`6Q8r#mrm=(xmUY#Z2yk65yeF6)3fBmw&_RDdG};=vv!h`|D?+~ zC0_KvJ=Vqey4apttUASG&w-0lQ&ZpS@T2E3_d#e#-wa9Z&DStm6a^5-<; zx4wi&zKswY&P|3(wm;|Rxxms#d=Nf#O(3tS`V5ineVd%2=k=9b?#sx}9vffD&3P^~ zzj83Kp;SDzJ-b`~Q1g*E;ih%{iCSZwH!fJ{k;Cx?{#rA1#KSjiA%VKB>cZIZXlx$` zAAa#l_S^X-#^f3vdiG`f0wxy`&t=q$hDMt;c7D}KJy1iMVq);Q20QU2H$AT+p{@lR zr!8c1)tiB*HlhS$9k zz42@86K`wCpAAIl#{NF5^GCLH85eB}UVN9F6ESx2LF3|E#QR~^4N38nN7=g8_ddwE12taf247|j86Tb| ze0CwAIX^ov7CtPWKjTC9JtNK@|FY=FG6#92JUMPr_ifKT@rtA{I2q3@>tI10iHg%?$vOIrC%NBbPcP*J86rHHO8QoJS0qyDKpw zqd$0wfoVO%H*DLoB-pOJ_2zIaA)0?W@f~@y-TC2VJm=X^ct0O3q-^W)^Yg zL|ypWK>yxH>^V@iaCv(X#Y2`B{mz5VJGQnj;DhU!D=Ed^R9awQx(Fl^IqA{YLNz}8 zj*a5CK*blB{j(19Aa?O%y*Fe=DOgXMmz>~Na!iXe;ersmi1`b5jS0X-#4L`FB%93- zMq)>vLIZQ>85_okws?wTei?PkgnXkj?mX0q*B|78&pbReTo*n$$ePAdNPTqGOA#Z9 zc5+D{y=2eP_)4yjA_wL$P|urKbHSlTav@MgN1OnOxCSSq_&RmtbwQqo8FU&8wGwROYup2i1IDE?g3bY|x{x!t z)=>v+CgI{MGpMA%UW_deYQR3oSM=*+zC;LS zQGL$HPvDXhuqq)G+p)>4r#h`8Y-HaA6=CWK9gFzDXKjS1aq1zyK*kojX9j@Lw- zsl(Pu@)f?<9SqpwiD|pt8>v$(;8pjXaOefF$ zF`-91R?ZsPwyxx$)_8O6xrN=6#v9=ay@8656U)AMY#ulDn238GgY9kgs0C+}gy)g1Y1) z8LZmE*Vdue$`a&@9E5r=a9?r`&-RiBrW`YbUySE|iC*{D+GiM-404Pchx?Yv!=Fh5 z_&q0voBsIV@vLpMGe;j@@<`7!8jCMp{0W`$Iu}gnoi*3YoDGcaDgG&cV1U`03dpXl z%!du;igo;bfL)xajD%Ls#P-b0mx>r)j%Oe5LG>fBe1Py76t9;@6Pr5Lz002j9V4|5 z7s7w$o0FWW_&5eld!NuQlA+46HrqaHv32|fq{K*D&UX=NboE{sYUp!zpqcgUSz>dh zX~Ix`UhyD%n_)0SYTair=eR*UkgUu!J{UaqK|~dXFu56 zVS>h(*4M#s9`G3e_PpeKKKZ|`2T${?4Evk>`FUD$PF>*bU-!Rk0 zS9*E&Q&)1Zh@E+#`{)@hnD!fgConM5+vM8ye0;F&@h!5sb`GrSM{Q!kH;w6+QbUqZ z4*dKKhGf)@6UH)#uf&G``AcGv-GpR(v%W^PmHnf6$Cn(KrM~NrSu;*54k_`Q!M+>A3_M4d9WD74+o;UE-2_b}tkO`)N6R5NDDE9~ar1kbRU) z&lHp9QYUn?k9os_i&!y|3wfqmqqU52B;fkyJdEDTD>4gA@A0|U)*xig_z<7S!6sPI zLpJLf(rEnF%ejbO$>KB5zVi0gANk?ixBj(nz5VDv`1`j9k3YWFx$A--wMjo=1&8jg zlk8*vMTBr7!?Z452QW3pJ;t=`C#3PuvTF4*F6|=CF-@+^@40WkU;x6b?7a1@fA98& zH@xBYyrwb12X+*X5hI%t$Z}J>r5gAPjb$=jZe39$J z_~_>TmK>4Gt!-C4O0L-Ja3{){r(Sio(VHBaFP`fe9=cp))5}EsBagJx0NcFot*o=< zMc6kfH|X^|MiD#xJ_0$fMyC9B?DQ2Y^VAVC)MJDqiEYk*hVfG#k$a8FozG_{5j@GM z?{i{e#ec^PC|FYDKH+m88L{`iNej4joC{2%J$V!Pj2~Hak%@Kja7;w(-cNdC!r%$6-4e0p71L>bq= zgcDuJ&p~4P3r6EYl2_NIh`vqqoPwWvrmo=>+iT986zomJBa^P{1ixILaVB%>fAFQ8 zCw|_E*G%Y7#?FmcjIyUBqcsmlq)B|qp3m5QW03mPZ~Pw}jeRy-V&@KGJ$xPzkKVOu zQBmzUuP`*^-qz)2ZJO`HJ`WVk;szk>N@_w7Dj~jWM5B zx_9HJuZBu~==!WR59OfO9{yykbr!4V*(g{)ekLcI3s!nuz`#c&X!jZhkDM@veCq@q zGf3Waoh#|UXlkq+uEp4n|vi1wZ z>v$#Wjx&)Hh8ov6@LtmK2PNj zF40HM_dG<9RUd5T$WPAS-Uo<{7W9(p`e2RQ;m2&+B2btzi z6H5)U?7P@8k+ zIDf#NF+)Zr@_?Dvho{_Rt)F<}3IC$#d*A)8+t2>YKe_$XPyFNCFaE;M-=2Tr1qtQ6 z90%P}ci6!{=WO!gSk*<+*v+-I;L+&2RQc#&iuM`^iUi(GI_Hg`c$=9bM}qyyl*F>Op)3V)?bEgRaJ(k@R+Mho8?_ z+CSr)t&l_Yxo-!J7`#f%#s`6PuRivQ$IbUTX-vJi_JxgB;s=W>zN@D=``t(Ll(sls zE0HE$|LP>p*zZ}~+RM2YY)?oA4%9qg1Fm&FpL1 zj5(*JKXU=nlqtT5<34)Mw_Y^x5vSL^1;h7HIpcbCKGKg4{$>AI6LaaN7Bw!WZMh!` zA0mdVVftAgHDv|YwrMqsyr}1o>qWB2=iVHTtgnl60Wo$Xd|h2bYGJo!7F(``Of1~S z>HWaEAkA89hMXCf^{`=ysKv5<7aov_JNqhd=z`~oSwnP!L45dPNH8?(8b-wyx8KQ2 zjC8KJCD3gfzct+)cAcr))TD&1nix1=(vu8w=+Q?6OW;{4wS^7W4AT)xoEm_?$Ks4_ z*NCY4=*8yj6ODRS&?09j*>S8T;@2AvSLcqp7+pgWr&{FfD?*H?7H!|6IkWJDCf`lU zKA(xam%)fXChUsWyh4saOi=POo?_?Cm{_3ub1t^&G2idzct@9u zq0f2vxS#14O*iwBR9uKy-*a3Nm)}!6{#m#EEMfoZch|DKIXRZMd^yX2d?gl>L*vh{4GUo?i5^Ge@DK@&kr2|vlx${&exyhtQp{vkCt5)u4v z66X}3CKi(fg2#<7Z7KOdMYbo#r=EIJSb1o|qvRo@SPMCJ$-ndxKQu#4i-trdZ>A~%_ul>l|mwwq-+}{7*_qa}3G2-5~5;tjagn6x`nJDu`zJs3Q=a{#-}>8b zfA|mod$;$$|NWEC#H@kkp=IY-D{$*i{lm2Yl0a?02ai7?S$V@cPmJ*^Yx4Ya&zWbP z!_Spx!{<;-jmBQn~fA!{)^CX`<&s_pgl%;d9TD z)3@*yx#XXkb09Yr&0*)jfV?*}Z#iAbO;Uc9Meh9{_`s^I%be}y7i@^9dkxvs+VYKc z6W)$Bayg$QWj$;}DV3phpTHnq=yQa}y&?ft>w`DY7&G)|5j9&P_S`%Ai!C&Xxe#1TEj2_@#Th@5= ziwP*YPdxtk?H%uY$L;_8KmNDd(@#Hrd(V5`d;2s0?SH2jo{wP(gPqLd2lX7kv9<1z zL&+oK;KxU72Z8IkKa4ZJtusKE9p~)f@fmy^KohW zBsl`my+lTev7Qq|*yI;nx6tS(@(u8AFP=ch$paW?1J zg}B;BI$;^x$a(oJqtm<^U%BF0^nLGt-|g$Z_G@m>KKtzLeeZkU?LYr7{=3+dO2@VB^%us(C06W^1J|ww;`Lc##}L2B2X*>_oMxrqq2oQHzSJU1zP*1#{h|@N zueH_*9CS;JTU+>%wNNy&Z|o`*%F4Pl#u*Yz&sQGLNw(M8c)72p?yP}=`;2^Vx2#PX zH_xm3qd{V+?pR$mQ-@G$P4=aWV%H=&MnG51dyfrF@w>Os@8pQMrG7YH`1wI54+?A8HOqYDOU{C1z-l~?tN+B4I%g$Hp16mjMgHug zqb1H+cs4Nqs(Hj&*oWXNJUqwdk%( zVW&_em}fu72exwAGZfmjgWldR^YXrKz3`$Jtmy6a)r{I_o__ZB*0;Xp_Fdoko!*bH z`0%}*Kvj-b=Y{9`PRuse^Q^ZV)f?F)6Tj4DA8lidBa~Zh>PqXlWbX;(-usCd#e3e*cN?FJ&u^~*l)alZiGA-ez2RABsP>+D`kC7| zfAjx!`-NZpMcerFPyb!F&-(1o%{@+X$?xsBITw4es zhdsh?Gd7c8$p1)A3|$v;uK7f8tMm`R$`$`_Z=-S-Xh`s?PQ~`i>DM z@XYCY`n4&e?$_#s)X|ya*ra#fPY}Vj_ptf-G9Bu7cg(%0y^GJ}^{k7t){TL-a?x51 zK6RKu?KM_sOu9LbS@WFpUQ6Fsurcdue&nzPmi5Vp{`j0lMy)4BG(O+-hdPyF`0zAI zEPdWVcKgPN0I`4OTD@5}=S_39ZNE{I3~h5#Is9nd+{X@AV#bO@t}ae|mK>nLl}vFo zZErP!CRcEncvL-`q>6UySwd#?8JM{beUR@_Ia@M)+Jsn|z2#?3aBf%#q{aX?!pJ2D z&GUUNK~#}*cEm`R`^oox|M%Yh-dq1)={~r9%*S%S|C6`pKJY%YqpZv+6xP8y}yz%xgf9+p-4dL@y{rCKy-*fx?&;J7d zSCf~x4vHU|xvQ}=24uuM@?vl8wEfVvYX=iO_&DAB2jZ0%p!Z2@o?kBE9|I@`DEMpp zqX(7W{G?X%tk0Z%qjmj=JGRMT&qC5`J)WODfU7rsdgH_1j}wpN@^f!mafH#jL-Rhr zUEiF!gDpL4R0-b5;fCGO#Ci5cNJGhN!v48leD}t`)}MRdi~3B>8@!drgIZJQ=6M7j zI5~5$)Xx*fP~S)3)WBK;@_+zSiyy!2w5Yby$KIT4jaxc+z|Up>mv8!d)$MaW8@})h z|M2aTe(URVUQ1@@n?5$s60UsndNVgZ!`s-&Keiq7@Y?n{yw9PrML)hjrO(pD2^s_z zeYZA6PiG&tT-r;_-&$_ZlcJdb+qS0$C`R|RPNOT|hoV|+?RoDKk zoAERUkMyM#j@JeK;DDSw>>7_|+<}%q%HR3jq4T0ESY5BJ_1Ntx-3v*aQ8m?lrp9qq z-!Tb~?|D*-gMpg#93%H}4diBg0I>BZ9We6i9hwr@nEod zvY(EI8DD1FL|p#I#WJ+aig|?B{*Q?I0OWHwMhbEv*qXMFKUQavNk5#Q^GpN>J}iJ|8lx|R_S#NZ@9YY#-!#`5_)%*v-0 zJRRF`@AkWCa2P%6{7GzC)9%eEMW-^gY@YCm&H1$*a)2)VkR_Fu)|Tf<4tnalXouG| z&3;O(wlRI=v4bz@gfE}m-#^2H`uPp}xC5WM@|vojvodRCa9^qo;g4X+qgu2;#Bbz` zt1G@(9o}H(904M8T?emKorzL-#LhtRw|+WLCwgIl<=l9|;W)#SlYNe_wGXgsXPr~X ztN*BzT1EL6<>Axh}XPEvGBt}X_C8H#~{Yz7Ut7m%#D!HgJ?Hktl5hR}; z*Mr5=&pdPcb+7&C+i&=|kGsA4!(MZHP9HR0d@(=l0=IGE(GyQTefz;5_`cg)-u!0g z=CvR75w|b>vah^-;QjBlZD)baDnF6$14-wI0rG)6`Qduj$R$7Gkw5fW^Wh)0J922% zUxE4X>K7%Yr}d%bZ~l$He*2l9{%LFf*5Af2jQ+d%0lugh+fIGjb{?iz%rA!AZa?-9 zfAsdYxBcAhSC#koy)QX==IN(zuTkxM;wOIM?ce;APxCLaz3=@W$f1OvjU$a~q9luM zm(2Kf)=2Y%{T^hAB-)Jk4OC<2XWtyFQ3tMPi+auH@W=x{EPvm7-+TL}Z~8_**pk1m z{Hm|^FAd=vSo~4KtXG@rxP}A7D>7$|q2G0f?(<v(eL5vKA+u_Rc4FT@`zUFU+v)Yq;@n8YkvvE@zQi}a?C~#*{_p?m?U`p@d3(=$-hKNsf0kbu%@0_*51^gfhrr&E`MtJbkf56r|IdlUx!vp_1>yl%f@`?4mit#pyS_j%b>tI4b0 zV7FhnQ=S+fHAd@P+uE$(5SS1$zxFSG?e-%-{6qfX*9*GOeD-I5&h4qEo^kG+uZTK- zbk_$!<0;P%9^Ag?jo+y;zhv{l+v{Kd+ixHL37_a+8ZGgG`6qt-$8X>L#_#g^^hdtv zi*K)e?dt^kl5tpb=W^s9<^Q=}a?WFXvrqJw_NFWL!!mmwl8kE^3U+$TgqB}oz~8w+ z0{ry5mesB8huVoRamLS{IgRP8soJkUodb_w`u(wgm|qyB|H@ar^7a*9^`H5RO6sCE zSjaw$q6clnP5iRxi&{f|k?B`|?bmLv|Lw28{lP!Tz4`t2W7U#t_wK{oAfKqtH8#b3 zTyF4Xy5%jT%bcGXNn3c>fKz*5g1_qixPLV_@Od`pFHn5#U;3KcD__Z(^Pby(`Ct8M zKO^zsh1h(aNfvdVv+587^)0@73zJ%+VCPsXJpy#<~o_Y56Q6Ke@ zdS?6h+ed!nNBI|+_=2@LIqSH(rN-*q=zZp(`e%-8&(#fp9wCeAUj& z(aNpb`hm}Wo|Fl6D|6q6mOhK$b@ogCXiV=SW0GH_MlJH)EA`>tXZXJVP2HS6WUjf$ zUiq7U>;Jj^)1Ue2+sFPJzy9_mfAl{{9l9nWzs?Q!CrHM`tQNnZ)$ba@8^7Zt{@--( ze(&vD{>mF}@7J^DXZ-HZxc$E0|5>*Wh=BT4H$VK+8VwCKQFFb$ymT&nMJtx28_B%iMQ|5tTW~Yt0X1`Fz^v+B#fk zWTxySLdzwFOPuY29EyZwnT{W9(G=lo1X-0#+N#hbqW z`)*G?{nYJwJsW+_=l%iTce;rD1TzTCA8R!8@b`LtQ1$uD?a%$W z|KaxPSG`&_`M%qie%Y6M5AR>NmWKRCC!TByetx*=bJ^&7z0Q8>1wOvVk9;}% zP=3|dz_=c(R~h_%%bS1T_U1Rg<@Suu&o9>f@HHR)5t_>{rwZDGgoIHI&IXy z+J`z1zisygC?1Q@0lOH;_Lnh?rb}up@g;NH&O?6P)mUuqXIN&dgH~;B#Q1*30^ReR zbL9*>S&RLw(>1;)>^;og{$PVO!O#2k^%*lQbfS&w1ACm1}y!a?g&`#Uk%eJRJfABXlsT-e73banL>r z0U7KGV(p23cLHX8E+O9_RK?7=;0oipR>o>%YA@7B2c;x7KtZ$6;# zQ=5)+_+0Jl+zTiTk40x4!12!zM&^Fs(Ql0Rahy00(|9}Q51!&He8l`}R)(KB-VJSll%ZeqeY=_Fs&(Y^;F z`=p*Rf8rgT7F^ltG?>1{rt>X(%N6S(bahBk;vLB9{pFo@>RG0`7iuW ze%|CSm4E&he8KIL^_hfcXxEnX`F`qe{Pn+jd)wRIc6;5&eC+Ly{fB={&&l#lmUyhi(uRnI?LCE`v!*ifR-TM+4jHDC zwsUaCSo!trXRhQAlgPM5ZtUPYF+BP7Gq)dk^AFzM_}y>3z4BGBG7j~CEOqdCpZ|Hc z&-jebbe)q2;_8{}81ZdvVW+-%x#4I&xy)WzYp~|Y-TvhO$opUX=AqO)o%PmrI9s6c zrO!9$bq$+?()O8rXRi1Q$Fp|W1n0C>eD4P|ycXN1^L&RYzY%3eyw*GNsg2li9>}vu zB7+Ifto00#e9hU$0*GH9PHPX_=Pw~Xe*4Ed1OLt&zsvv9>>v3fU!>2~uk%{;%&a_i zqK^aN(zg#DCI>G^jkT0#!TH6U!8O*jNNP&Gd}iz~NHO8rS?4Dnf8zEH-}v?Zb zZ1}=I^oMS*fBo-RpX*Vn4Jf*~-$BSciduJQt=!KTjkZuRkw=#A0LUqyiPwT11P8gt zCHJalpSivEqd(^M@xSroZqGdXD*tSey^)+kLKg=4!{__8&HB3n*Rvg=de5r0$9maE z5qg%@wZsgVkE$CeYnOBDq!Y&&>N2*!jGdGHmkC-!Uyq0fU*rQ^Vrz{h zI{c(wU%GwkxBk`Jul$RDar;f5_?vED^d*1P-;bcR&N)UCtFb2DD`p5}azK9QW2b%; z2VcSAO557}*U`f=^wEw#_x4)bU4O5K{`lU8FO0oTRubGk3!&IcPU$yx^srQ%%Adp@ z{-Gaw)9qdFdYAD(=3_th_GzE`>AELzf0tLv8Q9CW@%M3lcKhD<+}`y4-|O!SS!4Fp z=YG!TYb~6;N7_4ym^oXhG2SI&$ayA&o~d-foU@l%cyh>VY8?%m%RbXW_GI){J)kVT zS+h6svecKlY*4 zh5ZzEpQS3Zav@G*z%R?GWv*12#@p7pk{I*23TAS*v5H-CeM^{nL(=VGiyrv(^BmLf z`fQ>fS^F_(F~G$=^;SP3s}9cCp!`mQtjgELw?h0cnI)d7^@{9q-nc$%$NlKzXX9)f z%)4GZPA$|oa%btO=X)w1?aSI9EOG#^IH{NIm&rAGeU@ik@B1LsHgsP{E2iQ1cUK^< zi1Nu?Wa3xH#U`HC6SkQ-_c1&v+1{?h$esQ-_FY4?$yux=7nLuM`7?I-)#+X;oqkr5`hyry?v{Z??7=tHMw$2V}c^Mf#Tvp7d99s?;MgDEV%iA5>kSdHn%dauA=mFu#4Cc#N9^8aUfxF3{@XclyXN;14h4I9mNT8l=F3 ziv$}+u!ky+dJm{E5EY)=iILxJipcdZ$JApKXZHMum0+a^K9S#j(7SY?-zdI7j8fKlRxP% z?|=Sn|Md17KJM4wKJ3F^b9?@U7ZZ$A-SAPEIf6hNZ<8QL@%MqXYDWB>G8Rn74 zfyA%3c(g=jA17CiUql=$2Sdm>AHz$VoV(YK$hb4F0f16X?fTH&qVZpO`RSkesoOi> z`K!ix?Q1{!_DP@gN&dpgz8EKU>@@|)AbP81#Tx@$O!5Pdx4h+tZ{PgQZ}2aR@{qUw zHjv&gDv$4e_j~+h)0^M?!)E@L-~3y&H?&yl`=Q4+Y+~8O7Y=ZGVp%3qP;zD&n9Pk1 z`kiA>@}(MoGnLP9y`gtCyxIb)my4j6;6-QCmf?wNCD&dfRIK7HwQ1beVJ9r{_X z`~ky6*1VBULX{k|F? z*L)opOut4Oc_Aa$c?J$aGY&4xFNUL7+Jj*H*Q|HBH@j z0VK>RJ#7g%;|l18Ziy#MqpoYH+?uD*x$H{UjkZzC8&VPCu1gi*njg-VMd{FhRIMI> zl^-_gpg6G6&SLE8xU#Hs(`!J7ULepSkAG;fL1^37O=acERqiiXn3^`Dod9x^J4AVHEYYjfdfm&jvZAP*<8#rAVuox#Ok|X8orZe z(vKgC=b0bn9%J#6$rF44hTK^$pxxdAtNwt?_N6};GBWeR8%jQ!In%sN{)IWA3e)tN&ah227Pg>P%cOp>4d+=Akso}k z?dmW5YLxY#KvHM$miV&$&_5eG(`y+^q=V}WnaNrVVK;DJ!t5L^qNqBwQtx-%c}r(gJx%x%@*(vDlp9zNChiTu!Wl~IAQ z=zH(Jt#-cDZ%JTWJapKw(&5xot>chehh>TO5;h!m1RpUE3$WlR__H1=`n@V5$vEF@zpYrg;e5FlUuwY)9J^Pcg zbLXz(#;-BX-BGq^%(`~%+Olxrg7U%p?`j;pvGkBH=+v=OY+5uy@lf%?iZ_!gdCZv6 zW#)$;x(zQ}IKNCibDDL5-G+{$ou++dooBnH7PxlZs>sQj4?gzjqaH(}lYs*V)Gu?y z1BfmUta+fWPP85#dFVmQv_-y+`N!bFLqwAnOkKxMbKxg$>^<}6r^-g@4c+yU?zmaO zoFwq$E3g+tj&kNy|5gV{aVa`sJMd!?E%;;8{=xAMT@ur zMH?mnFJ%is$YU+SOI;8Ih5IoW){onZ(>N*(;EWA40YeIWk`cUC@!*dO;j}!8<9`?* zc+Mao(%gO(!3H88Z7yU=8NQ5t<#r`pE%KPIQPv!<%hn)Z&vd#4-U?UPUt7=2H8QM^=?pP5>)D$Wb01n z&_U#DiMSt=yS+LJ8}J09L7ysuX+KdRzc7*ky;# z>L$*VZi!1J8aVm2PUKS<%djrUgA393CGVjFY{>AD;nGnaI|@3{pNodl;5B%OI7PC~ zIcNJsmw_krZyg$*voaKbupfq8>HaL_0$3{A$d#qNUQZsRd6jGH1!*2>s$r6q76L$=)>jk5#AP5%8C^$%9+#D zU#lE&Axqr2$vRD0g9tX5c$;k*`_AXJw=ARojY|{9B ziRYh7moF=)ck5P8@7}|k7mZt(p@Z(Z@^wvb*rIuhc=8uEp`2QWwwuUwoG-rZ*s;AV z7fpC(ZZ&1{WMwz!MJ;uWZYdr%aD2TvU1z?e#LG2QRPE+i89H=m=`LB~#v!_CQ&z89 zUfy`)O>ZjaVRX*S-{Nzj3ebVNkir82S)q1Z3i*|8=m5Xv;(-G`36kGBlOUn9;N6F^ zTeog2-GAVI9@&Qs9_)>*pEJ%DOyY0!N8p4oC$97#l!7;M(3xrJAWleFaDX#lqHO>Y zenx55eT7pj#eOtb3OZ6z2KM=|NLC;9E(7(_%Q1^CswHEA&%IKk;y6 z{n|2sA;0Q4k%cT#rqK^8&lr=Af1)0vP8GmY{d3fBt#3u0UpcXkbO2|5m1da*iw)`D z1QIuRTpIaPw~A-qk+xzx1upSYUP!?Ynvh*_rLk^&qWlbRWL&pyZJ9Rh?DE-X__e^* z^sVSgWv!Yh->3^E0iSrI-fMadq03sQ&{jSna2s`miqmx={sK1#WgHPq^nYA22KeOT zSzeE%zPZ2IwOe=3!ILIfYP9O5*`{4T#K7-7{la6dUqZwr4_TG}T#F-cf>z4Umu~VN zUE{u7_A$Ahv2B~zGS;nIUluJ~Sl)Z@y|Q8bTD8A{-qg>U1^81>;IHJYqo|*d#e5(~ z_Q^`Hy>O*?@TGKMs2A0r+Z=gHLIdPCY+UD*Cv+J4B4iq=5x`+f3qC5&liO>YtT7z@ zmirbZQY!ik7jrOv{wa4H?vT&dI$n6;dFzYyqkpDLU$bVs-D`krR^+fhGFBNZm<{Ilj4@QUb_sqE1oD5c1*C}&>tX(-llE) z^7rTQ_Zy9c(L`Hf|_ix$die z;3e1Pk&9A^B6SveB47RueJVe7N8n7y{tpgb=i zvwSUr?GM`Et#Lxiz!mO^V!#;I{z~{c3@jeaUZfG=T*+}Q9!)`U^Ce);LS#IR`cM*< z6ne%-8I{YKByrgv`k`+K{g6kU6E`}iWq*!L$rHZ~U86kxBu`mCEpkWN=P^jbC&d}Y69;t7VP5m6I5N5Qt1PM5m;DV)I5g|g`WBQ3`qH>yPie@K zUW8v|nvU^TKHvdenAci95Wy>TgzkeUx32~+U@QOpQcf}k&d_=4*XZ%cPNt2rwVI*u7oaEg!?0eK>p@Npe+eq0wWASrZmv}OW} zZ0O6^;xqkA$lJU(mgT_A*T!@WGZ2ts9ipMZh;IzninDS;Ud2t$XRbqVVbz6YqY)`T zoEr=RA7#nTSHL;2E?hSFIc3!w}jEZojYjh%v0~^*l}ev^del2*MWQEM|i;_gkhAVi2zaKca|^;A9T5P zryyY8yp;}!BfDj;XY|8O2INLhr<`(f*{Z?Gop;_@mMmWA8+UG;I5N?3{c7)xfKqgeNWe z1KpQ{?Mu9Y!uDw(9V95EZGg^rbSBZC5EiOXY@=8~Q};nPCs|HYFgD@j zk~p}yu$>YMu$rEHD!u9>Utr@#TRwjr5K0p!%ILznBCXQ4 zEmWE*gLNWU^b`87cJ4Bv@0PkFnX+LYfjjLsVG?&RL7AxUZ12Pae{)PgJaEB5@+_Wo zCM9G678GPE-Fk_*>j?XI8Q^Q1H=br4HEk-{BQyI|Cx`xYrdLeZW>AWBPT}Mo`8+5m zi#!F(sD#uLSM;Iy9Q!Ag<;DzbQ!d!2MDXl%{T!?k@Sm(2Tll))k*p>$5jrOBVt(Sb^;X?l_N_g1lwR`VgZ#=vIkM~F~!o>p|I-5P}U;LR5WKpc)`}Irx5PTB>SmaLL z;E8nehyXFxXw;W7`26&<&pf5^!jt8Z#~${^NHz`tK|OHhH_xOcFHX13DGsdY20sDs zHiEqd1CG0_E-i*;X!~$AAdx)_(Xa5 zk%t;%EmN#EnEGT>H8$)`fy(C7$`0VN?gUp6BO7#GwBj+K{=wI>eWh&%9mU}hohe`! z#-qG|N)kbfu>rF3Mp15V&@UZ2e7Jn=YhQC+@j!xu@WJ2l?KJu!L+G45LC9w?OI9dH zdiYKHD9XCL^h#Qe@d32%m2Md3vKohZtXjvbc?NfE+Ha>exVGGN$M5|H3O158-h!vI zPSzuKbnMt?egpd@mtN{8VtGUVj2EBtywB|tT?>{2y`mlDa@AO;;T}mfZ+zI~GppY~Qxoo5pzHfHEtVFY_n!p%wiH^g=hNhBI&a*}Z44 z=ULO1un_7=shs|ruKXjhI!eR72!g@XcNbI_rjqE$!m zlk$TP+{UAFzE&A%8KPzymEx%j@<@w({CSnrGGSBrRne+)fRCacKY!7bo3jIWD!k7+ z+)m&~S#C#?m+UA3+?N7*rfVXUbQzK$Wft&d=)`%a~&m*52nel^`nzzP+WMa z5BTTW_~8XSg0;@fTi6Ndq5lXCc|a?8^Wrj*P9TeN1o|}Q%RKl>n~C+q&?nf_PozDW zQu3@bu^0mjr_S(YuCQ4MHf%oVroODlil3Y|c$0S$;uK@9v>oIFzkH&B*;$1Fr#lL9^4zpk3Nf>yK(;1qQBoS@=MJpNT2 zd61oJAX@TmkvO-+ONz>Ia7`H=`t!OBhuSgsR9GX;b<*SJpQ>Zvc~dlBF?-##}j&Y3ZlK#?bCG|Q6j^`I6Zuds7u2cB|VQ;LnPoGp&>8a^F3GIYicTt?T# zmFPHua_EZG99xq{{TYrrv)sC*u4}o(8`OcXzCf4IvW@D3c+v+Z_)t0XK~MqPQ0OiF zedO?`pfvn1_>hk{IDtnG&2dWLw0$Vf7Y;uB@O|H#iTW<(=38zlmtJ;d89nxlGIi>- z(zAO{+dbGE1m|&}TWbbvB=E#FGo7NqEes_<@^<2NAf>HbdJ72eJk(5doid08tW2 zuK6_%PQMgFGLVDp3GVyefxeOFZ1LC9Z+VSgSD|-kMqfi2>y&(#skB@0N(fBNdTaP6 z`1gsqcC1ZsFeeR7C)3GX%n0+ixSZ>{6H#g!;-lyA@V|Qu(Z&n z`BNPH4O@sj0)0xXmuQTrthnD6{YvyP+{@>o+_*o$gKz6MY%IV3-EYg1#S8rKE(OtD z@({G(Px_VK6}2o$+cl+VwolT`QRNGpw(sIB8KXTq+xb~H4f`QO7}5v&N-(5x4RG)m zddk54hesZJB<92#FVknb-3nju2*E0k5B(5KPuIYSX8H}%d2xoy7ZUNhFg znZUz&Z8UzIIdf+D?Qecn4jwuf<8?@xo^aQ8h%7Dn;tXZxjbSfoKfI7g?M3H2+WB4! zxT=nI7?wE6sZ0Hl4jnW}Syai9x<&s$Hu}5D2YBeuVZPy)1QP8n_(K*-1&)eS{6ils zjHO?A;o0)UlaH52AAMN1w%+xewrjtmqCRRmZ3516%_8~~MRkBb+D^2ar0r{6*w)|$ zpG0Pb3tFiYW!F5`@pFCA4+SgL#SNu1{8R?>{`P(M-cybqIa*q)4!Ez)7e~5u=_c6E zL_6lD@Ibks9ky-UAXm)wqXc+Nz8Z2Ojp(8S>)LSXTLOo{6ewd|>9D_0jJPtY{GdcX z3e+!kLpGN+lKM$M&beiplN66S4!IhB3tlQrzyiYwm^%J3BNbM$v@^=Pu64Ey*o4Y? z-d*ufG-MB(Lq7CiKcEnLRC!&7I6;?~d8jyiDcF<&oTQUgDVhJIYgts^fJdDM@054B zs$cjIUZR|yL%sZiFyU6tPea2a7!iR>)M&vdPHQ|TL)J>*2 z2vO9jL{k~)nq-wN?c90>tRBSCH)Ww6e1vUUM@l2z{+(P4g5E7XP(G5jVU>VLhR_B1 zB*L$4N(sqh+Fy>TfC-HHRhnh2G~GTZCme?0IY0A-FV3{p9@A`0&w{cJj;* z@KHzgT5_Xf^Hz0@F2nAtjgY2u)(2P^Q=~n+zA96cHBbHrKKzO0(#f<0pFC04)Pbw? z_@Qk24(k*c3J4}b=*#w@tiadghjZg0gGwjL3%AZ34LhUHgkrr0-gSp=jDWO=Fm6a1 z0AkbRa1GC<3w~r#db9(j>y&VWN~yH^xBu?n|2;*$!2u)yQpsYVk|4pcMyNs%I8iom zkf47RfeCibk`#EO;u04p41shvh?>uJ1Oy2O0@JY*I_M^CH(V11ZKQ)E8i8UcvC>ka zX#?YAf@N&-%}+WI=;x*n&Z=prhAgS8;13vsP?Ct@;0@yoVwSVg~qSMS6x#kOqfvNn#bfRQ_9d` zBTSn>WBXWTFtHZMDpzgqcPND+| z92AWk9Zs@LdEpcI6iFTPxx)nu=9j&D_gRO0I_CQC|DcQ?kL>75I+IL1MLBTLV9_dN z)5cA{k;?#d!GZ(`cz>o>>`oLEk7-@c5WFv)Lj!--iID#xMP zi=*P*b*ey}QisNy0I-h?idcQ29|CZcL4Nc@0M?-OY#l{TwI|94-=xzX;Dt>}OP4M# zJ9)#X(z|x+<|pucv#}At1rtsFqK*iGhc#VcOmMt60-aY%I&tqlqph4xk-@Cqy zt8F3SXcIiG&L>itOdxC4yJ?%Uf-ahMLTY8wfR%q;JBuIj8TJ%59XgME+b?HjXT7i7$OCnZ7g&{xwVlr|E+0CM@;_T;QZ#A&)zEod*mYPf_+IL9V;SG5^8{3ACiH4Hx$&UC6C2_Aq3kkgIVjF_zP68LpJ z>sqCQ2k;B3q4RonI%msP>5x}{$#gm88NHK$3;#}9^6WE-I-9=wjDrUcmbr81y8p)a z;Wt=h0E__c4A~C^K2w*8o>V^i@B>4!s5eOMxmT}VUL45@40V7F^8iHGu3gJD*M0?L z2<1F<;JKmMqfAQJq#5m0*D7b-Dj)Pww~^Q2RG09Wb>u_IiPd(XkhD3Ip73Ejfx}oE zt3;Ejtb(hROR{*_dx#X&JcRy-*S31LqW2QJ2u(Z@s|TIt}UJ(1Vr=IgL0Qm>hy_Whqa@z~8%X-*WK40i}Ij&Q_ZpGIW^h zHRTQcaDa(FaKIA?xd+H(-2D zf9A{&J%+;POjG|)`-}Q+mZ6X-=o~mgAMlGFc{}o)Pd@RYDI3PbOKZX={|DVT;`tBkF*;>y0uHbog-r!EZdyvjnw zk@iOb9%Xjw+|{4uI(T4z88c>VnL6z(`##tUUZ9!drdrTPM)d=*Li%)P^2;e05d9dR z(WZDi@2(v?G$w0ZF23Z_(z8cTx6MXSIe5*o$LZ8b5wV<&{wDeubQHw`hH(OKm3;N( z8D;;z{hmu)aN&jSb4`G{(Am5xt#7~nW&eIYxAa9h_ndRfput1^NqX~BgQF^ne$1QX z&U#86_*$4<2ZDhP=U4!9apQ@)4LqJ3RJ=(o>X1eFlghfatIL~jzNs;ulvi$7?`Gx+f>$YuM`wjV&XCwLQ)vMJmH*1_b z(VwRi0?W(cpa^vPsV?Tvn`0eqRJ{!!G136DKuo{$83LRDkFMZ7>oF2_7$=&`OEwYh zD4RBK_J)GbK0WF_fw#PaAEAKdAn-69QA(E!5nVg z+BNG9Oyrr6HbUT+o8H_^o_Z& z@L{no1S8Bn%ysC!hJXnXkItQSwK*nvVUy_10Uy8OWS| z{Dg_#1nwIXFzy1-gHqU4*eyDeEuiC!AxJgF4ds%(T0re@Yom_C?Mee$!SYD_QU#XezqEjjqAN znfi45SKOF|16_m5`mE*QuVSg!K`;0VemKY?AQ$+dm%K+EfQt!rwEPvUgG3-PN|WUufIJvg|u`ycvR`arJp4Wr(~;Ccan@D_5I zh~+dD=n)Z&?MuMO1DM%2xFKC$2n?R~PC3h~i99dtr9+E)PZ`6%0O&?x#L9TODHb9j|1X+kXk83~zy8cIbN3h?JookYE zog!>eDLIzFPwBd)uZi?np9vXqOdDh4?8gWxuW?javu!tYp({gI9Ih`NgwQ>81P@RL z_Ly~Ttok7zEW)OggjcNcS(5{}=4Tsi@)uwUi@d&2Ud^sH5@o=Rtb{D*dQ`-HMb&-q zA2(=Rk zB>Z8u6Jv=wGlt5W@kVK5Ne03W6yYZdNN;fo4s?hv;W=>XC(A1_=ddoWpVT|Fj2mjH zXZ@He7Zp!ahC2STa>!1b0>7{*Ieob48dvhci9(dqp=)S_Y}A`2b{0QyWtjr3MmT~# zmnmyz`)?S*~ozY{mYiETS~WX-OAP1UMISIJ*f7hgj(J*)---? z@5p8@s_goU6a~SaqztnnIH$#xOVFo9iNF(j4t<)ou7fUlA*bmFBG5RFU!3*vN48}S z{8_it@n^DQ*IAb35Dk20Tv!+6Wr%T-(85y0tW(>J<*Vmf9$ew;RIa8Y4}O}rQQOCU z_L=Y5Uw7Sg{vtx&gX5kZ_vHHa?c?SZvMH`5`*{nIJJnQ3Uoqcw>>gsDW|C;L<~}I*Gsliq-w<=Hef#%&uE;vz+&P~pe`@e4IZUet>&vn=`9goTP~h}K9KH1H z)w>)$a>#w>Y;w$FR7ueP}f8So3u&rn7aCV z^WnVXb>?=Zc=}IlmUPloI8jx&uqWqpD6sA{Z|)r53n84=^)!t;M)@8?_*ZN{^h%-j z?c0?H9=Ol<_>qfy0@r=*t7XWLVdd!2Si1z+da32iyJFTSX!J`Gnv0w$MxxU>V~bWs zgoGm>ow`06{HY9Sx#?e`R7a-@n5Niz6?|IU66Hk5;9Fi_^EWwzJkeT*?QdwH39jI zLh;Z!Xp{gjeRs9JtjknN@TV>DGiO3R}D zvA(z=1hfl?%dg* zEbY)iN5@Wzck*W?h;u`|pu6SDiuA<$-gGSvM@7 zi0s(8OXy1ScGCG&9o)zsGI&V2=DM$!@Bi?J<&Xv%AY~H$&f9N!VIqcE5zu+skVCcC zh{sO*sJr9s1#aL2ezQ#k&(T&$N_$J$QioZ_IE2sH#DP|M0_D&p>2b3d*oqGvP9wkr zsl=MU1mps@7o8=iq1?t&pCK0_!S8{C`}`SyHh}VWo-t!bmml14gBO>0s*6F}p@Rns zZ?Emxv2*$QH@;mizW5@gAM%@Y7A;;<)~;P`y;&EPmxe9Df#@gywg+9qK5eQcTy{Vy z8~FryZe5>5V-VW#FPue=`}shI&Lhr%Gmf}n3ypBtQ4SJN4(t)~3?B58ekkfIbV%Sg zWDUF?oVzq|p#jP!?v{L!5`LtqkHGOowP)JDY+C129FMl$Np|lyGk{;mNo`uYy#w3Q z7l0$;9Yjo8r42%>3I``XY-i$0`92FEdF71mDHrWG&c>tCjrOZFU{e=qW8qJTH|aq? zaDkhFtID`OQdfej{>8kyjb@z8;LB~%I?zP}d+_U+ zrAz}SDey%?wPlj=S1A`+jXeEEy;81j4EB$BQ~eSnKjpN)A>T-JQklfr@X^^$0i~RO zE7}_J+IWEw&n{hUD*GPNz-wJtK9#9>Tz@24mgYHipLI{Ya1II~bKKAmd$1maD`5$w zWnV}-@>srL!Elr}-{iqBX;pXd0tMTll6)wqB^{$mpGhV^&`<~)i)*sL2i_dZBtrXT z)k{-9!dr2AKu1!bbjZ3+-DDlN0C76pSr!wEdf*&akxyQno#~K14;yq4J^XL??mf$o zZn&|0_q*ToO>}>fN7>MV_q3hB7k-VZi26x=)O_lNJY8ko`X4~y3I1S#UuRi2&@m7& zI;;!g(t-J?@W7zcd0a-^4>Qy{Cp2ux0sKl+%sxRE zu#Y~BDaWWcS6p5W9XjNN)z8$S-gDO-rEQz~c1Q3EBRHXG|D`MUUCK{=Suc&Cc)bQb zbq}mH0FPwLrm#nzgl233eF>zDplb{jPwFf1R9}JYI+JegDcw9)SjHv*ST_XoYYuAN zI5(%1th38cZvMH(fS39!2c~5R;WKQL7u%h#^Gry4&3t&^nu3YPV_#jfsfJBC-}u&d z$`5~hQyDsRcsa_ZJu)dG+7yL1r=T-@9MOtD>EaWNw8q1pp&ig^L&(c!zBt&hTubpI zn8XJ~=2=%?b6vSnWWwk8BL$a;L@~^)7iZ?>Df%W1`E-Od4aR?A7t53n^NF#|OxC}g8f#26vuLS5d zbs2sDnpvK6gj&`*Zo-gEykn=+Jl4ezFo)}`@$JwdL(An?TvLAew|`fL4I8R?$05&W zmoHsjUU=@$MJumr?D)8k0OGvvOB@LSG2Z?3hITD zegg)?f{A3^ym_+Ve8TH%qlfRHogw{;+rP^?)esbcH0LN`BmwK#zZ8T+zqAqKk={Hv z)g>}!Im@eq@pf?A$g%ENqaoNfozI2R6rulPjz(K!gJv*Y+pVL-!y3T_W_WJks`&)c zqikGTSHc5(*_Jp{&N!487!?E*bpr35_FcV&NVINh>whi{-b^}4??ElBe6#C+k$|BSq=rR;W}-A z60{ZTU5BB}L-0hgunXlGPoyf*Mj;%`p1YKefm7Ra7Pa)U!ZTp}Yx;1L&QO+#ufKTK_Y6GYYC+Y^4*szvsATDcN zpg%(?QCcG^Ijjc-uh}WyuzTYSoA#UBNLM*{1W)8u9o2Kn7(ppj_oP!#l%*W{1~Tk2 zLfRh!lIOa15T5EU9TyKF2XUQDGI+|H-W&~mLkoS8ud;}nW3}wJY%_ujoyy;8;O#eG zyS;17Y3T6RP>x@$A>h-d>>J54{>UQ@$q24ro%7fB=2-kjx?)w1>BtTEJP#%9C}Vi20_ZU|cqG9a8qH9sLSUJVbRqkKT3eSw(^V90BZu}MnYTxWiSY8%GkocbGO69;J^a#VaHYv_`);h$YH z$T(2H+$+g(W~YuFeCFN?_YwN_8&EF4@~ZMzfAv@141+#SIrY@?`WtVQ{rmP>4@wIC zgHIP$O^dpOpRff|h=*SVF8EGA5`0Do*p?wvfNbhJ@DV~@w9)i+z&3m%zYY8mf@ahW zyd2g1WZLwz%MCZ&R4%>j3XPSI2&UP-qP~Tz+AnEYFHM^hR>c90v0d=;Wt$}Anz`!< zy(let2iCH-2*zG3khAgWOuBs_K{TU%0T(dvgT5OuE$|Xc-mrVlsYB~a_|c7NXS=QC zNfTh$cw7a4z!^5|j$qr+nSRw2Y$M1nI737`Gj5$-PW+GtocXJAaHJl{YXtlR61$YH#du3=O*dis z;&k2D`ZW{!rwm*`5BfkeJ|r{cYuJVkvaDmub6xe^=+~5%`s8S|JsL*3E!K37#LF_&*fCYX(~osNAN^;&;eP4!&pzur!!G8)Yr1{;2?kXve}Y*z|iLYxKL;X>GF&8Li7GYpv?qD~R{)6ahXm*w1Z z&+*z2YbgGr%uCPvMOaBY#0h>mLj#*io!K8LEAk-(eT<5^WY*1hcH4tedn8j)tAVi-LV(#T)h~IQ?->{D3+|azzel zK@%+2Bk=kK$El~BQvUq(Q)R=t^&X2IIB=j`c+rJr?AQslUxTgWopuv-%^4bQBj^sE zNyYD&kbWBck`yv!u>6LDv#e_!E%+nN^^iEK-bqOx4t-#;EofN{@KQ-t52R2NbdLJ~ zgs9)B(`YY|DkyA0MU1EVQkT_r!w!rDx%sWQTuAw;BNgC`&d9L7h?!Px8_1<((y~l| z2TYVD8aA8wu!~Sn& zdm|lOwGP4$k)|uMD>_cL5AX^e+|JiI?1q@qX-7(TzhV6-&-$#06kPY9G7Zv|>oHT< zL$l36F6B@GVgA!LbMOk^ppH5J>{XS zyX2Q_2{uOW08C9#IEIs<1I3M<%{^-se@8KgGL>!2I}m9K30t^h+RB+u4c#i=}C zZ4kNw){R5wz#n{&*VF?yzyYpwl@1=BYGGi_K%7sk^E4oXeg-kemLwP#<5Mtv z3c+xIR(Jw&aDWWGA-i?0^2p>gWoD<4gB{DE1HCbkdAoZ&nMQY%-jG;eSp`VPKhz!V|sx(1k0$OcbN)HiU*+R8VvxdFhF!W<{?78$`? zM^z5wajB}WmW?(SI3R&u_{=8wcr#b))@_xSldGm)u)&57eO=p|LTD*M;#S0Ef`91} zK19%)Omr5QWNB08&7JF~wZO{4`IT2*UH0!iP(GEOgYUp$ed{=|f4`qh?%SuQZ_-ls zowwiiXYEZ3;`)bga8f?o=?N#a@|&Wt5jOL|W8;Qbr9)kWoXQSCtkcw<&+-XORFDNb zVWSOjOdxDG%CpZPnH=Dh2HqI7M!Styw?iWWO^qvLfOMn0aRwZ9MqPr3G;E(YGFfhw zM*q}D$Rc|ceCVRmBqn^E2@TmKzbE3H)rL7DjhjI_q!8Pw$e0s>dLouEwf*~(Go*bM zew27n7dq%G0zW)y?wg@%BPZgQ$k%V$8@!uGw_nAT9Y97 zYWKg^VT;kOX)nQE(DR^ExhV@-(N2S2 z^vk+dTeIqjS2)htFadhhGjGyDkN6aCf*_Ay;3z9}@I<;I`k|Z=n5M@M%EU+UX2Gau zaPg@U!3sF&15G*6fKkf$y2(%ILDzy|qdA{2v9G3{T|~GlJ_e~-CS|e@GE;&uuhC{m zvR*-AeFSY?`HWn|)3&Hf<55UGNBJm2sM$^@Bn-4E`>ERTkt0XSVcD_A7vj;7*bZQo zfO%F9bfAE(xqY{37wuJP=9{3hi6a8~sP${o#MOosM{Z5(Fx36D4P31`dCggXGw_)yWrA3iPmH%*=j~qQ(j>zwL3@6B( z6i_DZ%!{c4rhQpA(kFG*T6Jc>Op*?(w(3db{9`+D3eq+0ivU09&!2-4&+eaWH&H+E zP8|ACLP50M9V%oRXC@~09fHq(ypi9iccTm(x`@p~!54vZjvuH4`luYY@fqp88dFS| zIHmmH2S4yNZFb-O1LdWcUex%az401Pu&(PC?G)nG4o`GlsjXY?IG~Qq@Ep32IzSd5 zg0-&$Up=CZLw~jp%A-`|1yFRO9oBM6#OGsoyiI_-poz`|0N={bJ~jO^iwEE*PQ8N- z`=PzWMyfUfQo3L$0nQkkz;}$-3DFO#k5L+9Q~E1>CvuPlgWwI?!4Njhm>+$`c(&;y zsO#h(yCP;Cs3dPCJaYI@+>9bcyrMt1N&W#6FQmDT)@9=2Fa1*R8ai<~!66&;Y}eow ztN3SbY_jN%y%4~iizY5-y$A(_HPXS>Er!7+l5c{`n_+aIYr$tguiS9$-MhET0!G-d zex2==fNqS9@{;d}c;37@-k$2dLT7x>vgOO&e?))T#Dy=Q?D}z6tuW?w}c7d~vJEqyT!gj|HFG5{O>d+?Vb7dwTz;tp81+kYtto*d{#2p`}=;sexf zZyd5^`0+Sic`gVTl;DeN@kAkyiByO7Y3gvu0vGlHF1I)7gjyq@UwB7E^ltK$(m(T- z<~T8K!sP;*+aSDi0dQ?UDKE0nj==G8|^{Y=0m(iIe`%u9@K$`ay*#ztQ7y{SO|TfAJ>3+2pn$HN=kZB7#jsFIBe)e zY3Waxr!&7~d=3Kh3Lf(WEbYeFjDz4j;mSTA?Dz~N8MonT8zvtF=9f&$Dh{121E0JV zFXmv(HQS0;`q$>#iu)k}dozYn2F|p5AgYwwzQO4_Q5+dlHv~#Dj)q6itEgkOary(53|@5(=zku_vkx_2O*n8;p8BSZ zxUEPIcrgz!!(lzvb^tCgRDOKGXUbjE;EyjwS-NUp)C+GrKdf<`Y3l$lz9VojrxG5e z*^gH`!M6dUYACBb*SiktmFx6v0AU*qz3adx@l*IZ_Z^lo9^S>j5Ws`2HEfJ5F@yBk z7oi)kzmZwb@ZkD_xr(b654+a^UHUCjEd#v6EAXHaa{7%nv|;L2^$c#~Q32XW$fEv7 zJZ2s!tfLA;0>3dIuINR zP1m1){%JXI;E?CrH{9?ek2?virT6#Vf3Mm{$N?W7|A{Z^*Lam?)@ohb?v&vAtnk<- z>drc*?gAS}Gf*Pt%_=8dH0EZ!>_Rxgmnn#E%Gv+x?Dpb7z1OG$unoJ?893^gdCFn6 zy-$xae+xVWVAGz^4Rv51IaBXC+m5JD)j4{AN5g_gzlnpuIc%urRX**1e8!PRS_Vt+ zGCI(KQaDrIJ_p@nZ_3AiyNu{Jf_c`-c)=C$(eEoy`C?2t!K3X)|KK){#!LUCM1e$o zM4yIjXBkR|Zi1KKhc=DRfNSMim(6hkIK74~IQOZHvsBJ@PpEpNkjMsazD!(#6%Xd8 z;^Yds(5>~RKr#5mrtt&WhLFvE0lgb8==v9e3Y7C&H@?DnL&xAps^r7`eGxW-AD|3t za~?+u-rUu)1bBwK)CFg^Or_p;tkokf6SMCqK~aMtUP$Z z2Z2+FT+Y}OPrYIr(QcycU<EQX9K6ZRSM z*oLbv-H!I%)O?!iXA>&o}sL_7L#`8x0$mO`OR%A(J( z2L;K`z1v7{28vNn)T8^ks>>{o9MFe`{il$lQhOv|Al4$dpOp@+&(teA(wX~r+~eQ3 ze}6gu{EN!y(Ic&6>Y0}o9gwc!!?eW&_HF&R?xUXU8!T`5jP#9ZXS`9A`-QA+TBkw; zE@88L1|q@uYn>?xxgDqj1>2V4!^U&Gmw6FF8O9)f=o9cQ_?1@l6G}D@C``d|_%x|# zr|2F%MoO?p#5SS9fO$}0tU^A&@Ex^;or%Ay6Z$6R5!ePg6Jpn|GF=Xwltb2tgSS5D zrSwMsL!L6hZ7AW6lCU2w$NpbwX)hg4J+;i3@nV@jf4VE>%GmxYt>oKwq5rHa zXhEE7Lc{OX`bixT(hu3bNYannaxDuy<;^qrt9?N;_}5tx*h+edlK_vV8<&lcdThv` zIJyE?>a1aZ0O}{}SjnaV2k--QOIe9S-)CK$cVLyz**q&P=yI)86AqdL)7AO-_GI-q z4qXCegV%sdJ~-tV0G@L^2fVj==?Gf}2f&dCeW&qT%O|a9|4o@wUj)ky8tSp~;C!7! z-bzOy@enANwBaZF+<;W5elGM9Wst;j3ce+OVP8Ns+lk@$=Uj0Ck-UW7B)5P)b`nlf zz{_F&6o7XT^jFhNPke{$!eZMEIVfwM`R7m^ym7%l@F6es;V5$CG(pG~->U-m+4H|4MEX$TGEIW4YP)ExGB$JZRgYk%2&Xi+7 z7n)YO@|n!>7MHzycbDbMmzRZ$7L+w>*Lv~1{mCb*Ogcw!L_N7Iaq(kqh+jHanoH%{ z`bj7CF9z#KxmDJX54&Q67@t({Uq1IIWlt#k_U;Y(s>jebgw-faBm${PtBDgG=-O~G zi9Pw0Q+xw+-MY19kz`%Id|BDCW4rM(&|v^-9MUa;IKZWeg1&UFbV?pNe6)-ndxqbrM8f*@>sxzXtg{rRPO~7IgG0-h@jNf@8-%D{K&MDJ{;F$pfEXL07Ib z(L18}G0FMa=bu(R!GSs|O+vUCO(j8|m$KfrZQEiy zSfVzxU3LKf?b@Ae-G@(!fnC~xeFgZ0DfHBoDLU5hon~D!WjW}RM;gJbD2>*XFyxV* z?LTcj+8i>*;!2yg?G48#3>J&;#o~Y4w$0XG`*v+r2y{r@P-iE% zZzp>=RF!9$1q21Pn~ z7{r#51^+@4ZDjG{1*WlO^G4O>=khV+i4M9Ht?*fhKz~77W8>_nQTICB2CJU2O9J-8 zClb6^tbFROz1kkITegViqWNXX(#2&9pGjatklF{bHTLmKCq!Hi6{qV)d|~q}GHu_! zy)0e2$hNX-u(SM|Lagd}V<7PrtNZ$xC$W_SeUsMK5!it-QzZv{MjV1HS?W|i%Jsm2z& zckQzLrYC;VmcWqXR*z|w8ako=+xrIXuHC!J$`woP-&d?yt})sk(>Y20D{LNr1y8UW zcxx}?c;gU#(t__eMHIbwo`lX zh8+jdPQB>II;2k3u4&`=XSjo3!aCVH?QQd>^&zKu*0@K0mCbSVYoMSG8JF@oaoQ-d zGnU+~cECd+^jGj3;{nXX;b`)HYLNio*=sxZTFYr z+rmWOXZ+ZLb$8VA_{OY&xUqum?c2X!V`ljzjsMoIU*k4%ig-^N;CFvv1@VvEF?K`d zc*|qhsd*Gk*iq<}#qhS$A7hOT8`jAOX^gJEdz1PjaG)m^L*Wu3E0V+~&KtAxKeY+o4yi4cP zN{0>|ECBEu)Q3VBFwRi4|Cc?jUcJWrV@D%Kj);CsFe~ME@l6q8+=4Es13nA7YiIa( z_#RN-Xi9KhLrDK|b0gX;8^A?P}v&w`>;7F^`S1ecK*XCZtWDr=#i!FhlBs zycmx}*$lvWk&%+ZPj0h*6qE+v?Ib7dY3GhQm(anS2>(gnDMrA6K%q08kJWzB8#g4c z?bsmE)?#j<@w(b0oI*7?0Y<-qYcF5VIBv(z?P@>tar5NER;gV@U+)J?M9(_l-}pnu zY&RB1bq`GV15me8o6&p#9}5qpalp4=JucE=omig0o#PSvLGi`>kdoUpw`LrIkHsJ1 zGfzI{RQsvGtRMs)yViE#eh%Iok2JK9^+!Eh9$n#g(3wBsDx94iDg zLG^?9MUR2t*?2T&)BNK^4NkUh6`%4$)ZeB}n=B)JLAGxSgdYomu@}mNhkE0t9qS(l zx~|A(j?B1wndX|zIVo|n ziIb5h112M-`OtfALb6! zJL4yOC$_b8$%3+J^Jdo@bHf~$Av5K%Hjf=>gVGW8!Uj@;>j32Zi{A)JlWgcv1*O-R zJA{o(r-Bc;QDvRABPiR(?}Qm1BJ2mK~}z1N>4H`FYvbPef{J040wjw45$3%-#6J)|CO zhe`+D<4xCPuB!)Z=vQg7HP(w*|6Hr_IkvrA`rD&%Flz_1~n;pE)vZ zMjN9Pa*`mPsXNwI zSu=C}SVq}8{k{Azn_iYKsW>-nupQxN(1Ue^ZKxFX%{a&HQn-Laxxj?l!v1|tunes2 z#+cgUaq1NQC<~a*M6nGOh&VCI*0Zm5Bwl_SzE1g2^*BlC+#|t$c;o%x!Gmm@+y_~+ zdNrA*jXsIBoYUKB6|3Ic!^q% z9O?}ANlU-Wyp^(WfNpJfI^6D5-vKX>+HN9UHYy(QEBGRK-N+b1`eJ^Xyug;J>zdN& zkFfyjEv%~oze4)mwR@-g3jBmvaKHwT1HDCikByf+2=BSQ_@{j^ZbldIvSWM9Cz!u) z+Pu+lZQE(Q0MgWt;7&oW@-J&N_FpVtxlHq|J!(6&U&f^Hi%mk+eO--H_f1=sUVu}? z>kj4<8bQalt;6#fg&i8xE*BkaYQ5<0KX5?f{r1+Mbu3&Bg(-jwp1Dk$rv6ed)H@-@ zcTmE9+0chBO4%-YtUoT%Sbnwpc@Dvmixl728|7bebU#b@3hbg)`t029UzlwD5$J+eTI*yPusBSoHeiAyLMFjQ9G00 zqAgH=Q8%G$+kr4(10X=k**RI7chL;W#Yui;Zt-C zPWoY>v4hHzeO#0-F&79`k|P&xE}V%w(FW6oLT3vM>+Tg4{0RUE9wLpSzDqt zY?VFP2g#l`Y}n}eE@KWq&|)6M1;zE_O>|1b*T+2wjc-y9I_De)|3e<_IwY?_dTYp5 z%b_P=pg|45Z!;i|O9&{&C6slNu3b*&0|yV4bIv=ze9A+50%aXxgLLXmxRerIc(P9y zU!MyH{S636 zcMz=UYpm7+O5($N*3F>5_vz z4xedWf-c}M#yg>FbV!K%Z5sE>t~}nv@2lM(l3s##*aWr6{Z7u%uQe3@hO>S{CgG;C z1cToTDbZ{*M7fGXaI9Cn|G_)ugAYFNx(WT{sF5Sf#TQ?0-|Di|J!q}}+P11LF%IUD z%wG=dKTuYzioRgw$`y6pL$=L0TV<&q`x2Mu3x47M=(}6V5XgtK^hI1J@Az2)w&wm6 zpJnK%Z)EjYifhHuS2KkE)jX^K@RA>;bm-bTMo5Fu_7suaq16aMP1jW)^oK5CeifHa z3{m+ftxMtnVF|?-@}=E{ ztpse82^+HBbxBh8&DIU1b>=$xCRh$qW#jOd_#1tMf2*v3iCgHG17^=Y1|kDwK;CG=xF6$biTL!X%2m}rGg zEAREXp)aLE-?>?@`e|v?#>KBQb+SI1{>=QjOyGuZ(y4nmNqdJc@<|IFQQkM%bC_~;wE@4M^R)*pM?*^7gHo;3wwE?djg7G!< z0n%aEECU$)iUwyWnmTpQ75H?5H@5-hT7OCl{zCqcImRKR8cWrw?O0`aYd&d)5PtG> zVcN(H4MOUfgQOGF@8`?MQA}3tRTk)tAa3PP^G~D6LmWmATSh{hrNnZ@xVm6FfJ<>5b}w{f56o= zPylA*6HY4$9QqAeB2Kwx0B@uipAklIGQ5D)A?Wbyid3FUHejLw!>eJGnQR-Gk&A<> zGjwO85MWeTzy@gG%JgVX#CcWsspY@@xBp@ta^vrkOD-+rCrs4fhJixm&qP%sid)YN zG#E79{=46(Gi+V>O#4rN_Vd!YQ|I#1j2FwIg$s?tPFjI_I`x#3%Xt@EP{xm+C!p~gJW@d;rw~!t+(GQyLa!YFz^!cb?@GzTzJt%rT>6IzIh&Gn))!T^{1Mvx*;v< zAA4c*UHkILBM+7h>o-_Yg9Z*PU;E~_%VB?B5op2cl)C54#BIsaMdjINp7Ejqlb!$b z|MmC2i4w9f;pMHEZqV$n-&OQPW$DGffY9z-gy1BvUTfr@y(Mp zG5F9$X{UkCs8J)!1s7aod|r&HI-|bRrr?=0Htg=%yQjSV+N*v8DxXoz8!+gYn{fU6 z_4TJDyLLO>n|&JXLIJ%z^XEU6rAwFjdiaQu<=ShnRh_ZXMp)wCe6wKq&_fRjCkt_( z`i(<;4vIHLwQtv^JoD_+8mKNa{Z5@a%0~XePixucjiqUucFvNE2_ZKDX1w%*2b>I| z`1Az>vs`>vr3#iC`0dM@H7m;-uc5mw)`t{gIO>8=2Ay-xxqd4wHit?X+;7^nzC3XM z{g%}>$`P2wRn@EF$22hh>tFs|nf1}k^2Qr)G!_aH-a$ywD;plWp4O%O_{N*PDFwW| z?*5M7|ITvorl^~5`B^#j)DE6F*m*(=x%J0_%BLD&zWVYE>1>JLB4=8V5Nr={Ok3Fb~#d^y!e8h0o`E})x>KvHB z9wB{LP>#sHR<2xH{`AC?)@|3WUCPgX z{);ki-h8*CojZ3~I!`P_2R?iD?p3b2`dWW}AD-a*l~-mMKm6vPojh)uj2tn-n+otB zq&0#VW->Mtn-DEFdUozYz5moVuz>eOOmM&d{jI9&&)xQa`M3W@6YF;6HPM_aK7r-N z5Awq!d1sw{PMLbcqP9v`uP|Ne5@t-tl;jm5}c{NgX=N88y3gZr>aHXd)@vZ=iO>dR&0 zMmC7bhhuA%uhy+wm7cwNmrF0ZtaLxUhc^V{*BdhWM?q!aIX1d{P-e;}^LD|sTideg zs*h~r(#x+b-Ksy#;>{WW6~4M%nLmF{dGFo#%C23zLNUS*2WL+*l|+ zhpbkT_qN~slWFo~>qQq|5}SMIlTBOwpX&Yo`|kGJ;_$I&pL0$*Yx-HLyRi3Yn@NcN zvR#=o`{VNNd++(?U&D4qpStbYqi4B9_0g+mZ`X%y#Io_!?TKago?YdR+kYR6qw>#x z`>+3(^2zL3<+WE|wcVkcy?ghT|NMXdSM^_eEsF}fANly>kNg%mZg$x&m1o+*j}IR@ zY=}RD1`cE~-_n)ag>bMS^^gDae|SNWMUQ{=%fI!8o9CZ@PW2t1dgjL2-~F5a)qOm^ z23*(%eaYME&*!Vn(vHE0R4l*_>x9^~`f);<`kDHuh#-35mm%RdyU-nqk zb`-S_fACJ9{`Na>mW2xzw$KAmz-cVmp<|gcWlEVM|8<114)tdY(291(V$rR?`L){r zDdoU{{pD}|=I?xy&_34CYAY&|b_3p&2ivE;&_8UG@A~6C@?EOWLkA9&pZ($&+G|2oa@DA_;ex374{z+1bJ}hP3v!)U?X=T0F1w%%8$Pn(XSt!UVuk8ReG}#J8!n}@dD10(!V@!{f30?KMEz`T2nlHU z8kLOe8{W>B z-H$zEoZt_8v*H}{`;Ipw+dhz4v^jV0(cN|(K99gL z{=z=bbt+(P`26{qr^=GWi!I~XXP>1p>?LK+Cv(&fzwS-!SR#6cKkRMrkiqKnuMyuT zSw8n?5EcLnLG->HPm6!};rr#yH{bM_uw$nV^0R;Gz7;&!P(boVl{WH|n>D6>E&3z; zsC|QAbWrDg`t>W9$j^4|*4^zE|HF;1$27-Sy>^}7NFghfE`-zdC@P9mpWve%UU}8k z);;5k6|%c0pM1h|As%%2*)6{a`xF-R0bg7pFE>}0ELrF=)Q;`UA)?K|AAW^C_Kfl4 z%lYSB;4&=6L)&sHpG_wrZ(^-&$k$4-FKy+USO4Yz{{Ol^g=faI)O(Ia;SapDSvE6n z->ET%+9~}#oBe60%sCtI4$zB}{Z8eF9JpW8tv}loFPACKV4=CUG zmgb)FAqF<#u=!`O`6WwTXW#tRw`A|1s6DPREMwjdbzDFjMpo)+=guAF4|m_?{*Ig9 zzx=!ZCE6`|7oWsw3-G}vaC{7QL%qO{gW|1adpsa{smAThTXJ2%<0jgYC}MjLKX`xH zpmqWNNs}gfZq9lFA@SYuyW2cRBK@1+_+}X}Xpn6Pz8$D{;iKK+-`;umEw^pzC3G8e z9@;HDU3ukIlJ8XGBOhHo^zegzvnuVGnn#aNr&e4u(i3A-eAX3LT&1!xC!}t8lc@m8 z>#x6B7S3PbHVp3^_#hB<>fG6%l$$hRLOCFx7g&=*Gei|;x@=AS%$ql-%y?0ATIQSp zRlOvX{hSW`^)0er>qa^W{m=)u@wn>sH(o8vWe=WXQkTNR7a~s5n7DWEKIOs-FVuLp zuQyn>9K#U{E)^4lSuai74Ib!^ckI|&?z#JJj~|$q{HwqIJB^o?X}WcZOVW8Pyf;V6`Ryuz-=2zaxO}o2X_Iif;28v!MhD!m8Y}qAue{oG#HKBLnHMX-rIl=50E3TbO#GVWxNPKcJEP7k ze%8N6jU6L7FL4=eh~j(51E0_vRt(CH+WJA>4^)qAHf0Q+eK9t~TGD`l{mUhnULm

T`1ilNRj^0g9w$$ktnuE(zL^SNE%lgXS(AF; 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

0;q!(lJ|l{* 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 z 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�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

yOd&u$JAY0eP-N`BJ6A7FP33l6^k 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

YJrQLDYeKEwh+QJDs$!()* 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≥jS`0qNXF*d*+w5Tqm(AJA&1&{v3g|W=T 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 `O*^@UskR2Xv%QbgcQt_5hd8 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%0A=G6&-%={? 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

b`%4A< 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

*6hHmlpSMNe%a?(|F{P` zQ@OYVYG{E_XIcxNJ2}b^PbT+EevHHgP9F2JWImXsOH%+(2aPFfxYIjkp|>yt*SFns zgZA-(;ppAdb;a%xlyA%jN%#~XWZ|mWwDd$QD06y~y3Wu)W+=lOTo`}UrN$E~>)Xa@ZrjhNQbjaMtOvFnkvK zY(Hg|GtFqDnT-Q29Jy(66W}v9-Jw$Liny!8d9#c`ps38IKPWS0eE39hnN4S#A5YmK z{?m54o0UH#FJbeg?be?MRm_B04jdfLSzubgNMt|tb(?GacXXEJpItaE`n~F4K;z6L zXFcdB&sWxM0ecrDQ6e1;BcarYiwyO(Sgx^R`f>458+j}CdY|3w3zAzn6GaZ~a57s= zEERKIBl@>CPcJPiY9%C@5eI8we@{Jqotc=FJc)<^B~M5N=2`Ncm)Jex{1x;C0tW2C z3o_FR%eWOT#E$`NBn^8d0svw6Ac2Jyaj}iw0O+Or!%Z+kU;g~Gz>)7Pei+wb% zr!*aCt)$*v>r?Jki%HKljyZ&-!$Zv??^{m>5)_h2MX}_P&mK72nf0&lnqPj=%Z~ng z;7pWh*{$I65G?-;;i!f|9&W3h*u{h~oti z0z_|H{sqI1l3~25QgEqLyTN|Bw1lCzy^&PvA=<&M{@QOjQE(H`YZlb>%mNB33N<*k z>0eLhp#^>z(?{Bc&Cd*=bKtbGimxsS5Pa|VEKG`hcarItf3Bq~GWESYpJ99!DIO5fq3 z_)NGA^rAo1%(%S?KjwuI=TPUeT=4Lb+l`hq!2lRN`%(4uHIlFPQ+S7zQawp%_4|Le zY>l(H%J>6j@F@k+nkf|4(Yx*sQwD~yKV&H~55qAL=D-*<@`O>vK|H#}gj>Uuk-)xL z(%1@8XccMrIi6!NPL_^Z1Jm^zld>>4$e&2Lmvo)|Ge({3v<+{fphc|;y z8_3pmuUdrNCEQ9qU#igX=G`D#EWUJ8L1P@Km4j&>Tu4EfP6Y8+7J(vPgtr%P&`#s` zx|7=S%0@-ca1#>op)7aL9VDIMsdiFKiPIv0fUD>WCQMwk^~{H%Ywt;1j^7_@?Vd#X zZ$&NxVEAg;#RRUkma!FkEJP^-!H)-2??y0F_wi9e?{s^ZuBRb7w+)4B!d;bT$+y%p zvH@-@E-=zras-DYoazB-55%_m_Cmgq=1Kq6M5~*t+^u))SEknsq{^U$TE;z^K(`5C zNHqlc!Fu_y{#kEj03Gz%O-pwRlS&hr z5Hs!vzkExcTltet0HEkVdq)~-V@_^}YEV(9A2j5tNEqK2^bPzr#N<%vskYJSHX#T; zof{t@yD!ea=A+zrn*!;7>@D;>%hL83AyqGd+Q9E1-Ept`$Ox*~{55ZW!+?>PiS}NN z(|T4O>c7AffEPp+;~3rT&m8AW$l^_)J=e)86;jFOz4OJtnm(GNe*nQ2Na37ds9^Xh zcjWH64MeagEUvg!zpK1sn$+p&q{837pWciUB)ex#oFw{F_ zT;{|Xn(c5`ls?=`W-fsNKdaaF*C_5+%BMJ#cQt!s5T-C^7e;0dnqNY-xWs*zuc~(O z&0suQyT_m&=I0er*Jwuzm+~w30j6h$6+61sOK5giEr-j!vyhbOUwt#d29$7+{k|tv zS7O_6SL_5&kaBmFr%@!#Au}ny0!i|o5|6f5L8yQ|{IKNr*1o&`>@5lhrcyB|PzQkl z|Chvp`KTT!UNS#{2<4mnhqj|Wp45lF3v5y7XO4Zly+JKI%LjAcpDU>RhW2L1UDy@U zzowC0fOi~Vi>ma4bg3Vh-u!%*n25YsKw6SKS@q+rT9RcRqJBj!CZ#VO9q}b=Pnf{e z%eTY!CC1!9^b|q4E^rATHP{{gH~&0XpQb3bdrJ>hVzL;l-v~O=t^fO#e z^dl)%-^Enm3GOYimsd%rX-(gz ztKWE^)@65Dz{XH3S?S93vazVU*7Pr!>ItA+aobwnjYb~o$&Ihx4>YLij_#UZluc8g z-B)R>Hi^%u0A3Sic2NEzN-!`05zl&Di(F6yd>~OjlU8_fPBGjVlB;V)zSEJhjpyh! zG51Tl%)`E)4a1s!YpU;M)_EEfaS0c{jFh3SWtZa0L;xLMdG}PRF2$&c<7vFJJD^Nq zx;(ju?`4UnBf{?iCvsWO?LT0WC?le-rVbCP6Mg{PPbk9v5&b@g-^*HG)k{g9{eE}! z)e^cqmQL{Et=CFJcZg5mRei}ml2`*-FZh-ldv2ZB@GUqnefp_<#?}tl=R8ncv{O@%V-RT^wAvJ?^_cA3u3s~vDS<#Sc*zK<)_$g(rwNoAorQI_HlD% z{C1GK^ri$3IXP_qU4A`<`OBpQI^Z8?Q!D#ew8+>Ed?pNNbY^|qWRjG!f4RO?u3#dGPyYTlOySP~zYqi{P#LJA9N<*bdu zaCOx$q7S6TwZkx5e~|s|bKpoDM)5~bgA7Q5q53aNlf}IhpvO3h9k((c<{yCmwegOp z*KC_0_xN-`qoXv#l_ooWFF5)Hq?%X%k(Lrv#iPK)e~?=IoS&g;=l_8j_zg5(hjSY# z1HUPuVp?y)e;00_bds}K4ZoS4BRzv{>1z#*$avr8H}@RsVcSe>L^DyBo~0%pF?)HL z{@21Z>U@-?C%fDJ6Q|^1qNCcVQ4UrdDk#SnRxcfzwio(hy?j_r+e_<-ZTi&^S22<^ z|DSXvy{3e5TRB~elmFm1VP22$b(f!G;SphVuK{7U;K>IJRP9)cxV}0{o zEeb@cBgBgz!)Uk%oummy0~Y_{qdF``6AS@Dr4xq1PJVF4{EDMYiTeTL3mSAO*%-l! z)P*K3IEY96NN>fsiVuom*m%0ZN5M%|1z*YRZ=tTA_;ycmJI*;OE_xGjDtDg0{_xAZ zfsgXmofo*|Ex_IQTZTbnM35g=wVG$Cb|e2%>V#Cz-K(pZX--{Mb!8e}?o9jpP|e=# zHHz*4ko431ME?%q{7KtEBkN4$^;QfEb2fD!DTps}D|i%Ob`eHfb)5O>XOyFM&0dt_ zmge$AZl$m%deL>BattA_z+Bm!Fa}|Noa>OW}oGMuezi0@9TWlY7_xzXxQt7R+ zsqP^#id0Ob=Olh`;QJE#fQu_PMfM@yly&7EzSh@(kJP1g4cRddsg*>mw8NvGH##40 z#;^)^rP=)wEIy@xo2hOXT2GvSS2d)dHa`zQso9G@hJ~wkOr|@mJZo?-^!eH3(nd5b zQYNvx_f*=}>MF78?Mf!oDh9xCCW?;|%%=&%iY4tmd2ix^={hWBNqP%?@~so$ekjt*JB*dB)RVSFe{Bt&%j;mgQ9Da?w7=U2Kjlpa$w?%{@cMz(RleZxZ$s{U z@tb156?Lfu;}2$PA=qmT1Csg1z_kkJBQ_JIQABLH^T(cX#)|g`3fl~o`hfWhys_N~ znDA^>Zv4eC#&6RF>!S@1hv+bB`)g}qXd(gJWql!IDltL$Hv>z0V2C(jAJ!75nTL{Y zUf0y|4z|@TRH3EErvezI^nTV*)tRIofPA5!FL_D*I$7E!@yaI?E$ay+J>Wy2x@5@BxqFe#%*-9^SrYw?N@s(BO-N8mMD z*ziOIdnRtjPfbbG-7@LRJjKdfBkc3X;aE-w2wm~*-VA=QcVjPEGg!TKL4{AN09?a4PBCx9<8+?X-h zQW1@{|I&S`dcnQWIS2PSx6Zy1{x@=Vj5(piSXX>=#>#J1@qF<8XzRzTO2gU)#9U7Z zWPsXfxA1~TI3+{kBOr#8&Fwt-0RLuLDR6#N#C%V*&NaAO{s)A-heQF|0n;RVNF2e6 z%MhPFz}$@6edh~Y>B_ju>1^ze=`@2I6^$7_j=rHzzX@0?Tx>rvYEzfmSWUuT!P0>Q z{%bY1#EL3aYtns8)PyLqdSBIRkV2{PU{e>DmW&GeBFQ}%EwIP4^qa@SHB!OSI0Vst z+UXxFy`Ul{hQ@ewZL~4<9lnj|cKZZr6~h=C(>IJrc2$6GD`iXMowB1eWf6H@YxhK#PXuAW0pYg23}wx-4n-8+P#uAh~3G08s zi(M+$nxhKv@6Kn(@d;+9ZF3Q3MEI6oV0x2s5@ETt!)uMJ22d zr5{Z+D4tcMWXg9#mbLQZBYrt|K+h3VN|cdOnX=sFd2*T&pOUIf|5CE?aUEUigixp> z!9}g(TpbHKP22s4sn^aGzIzgda>R@@;`6f&1T(J!H3|J|TOYKbj%`fG%^q{S2y9$% zme)K0IJ;;rHtR4?j-Kr2|3m#T{X}K9OUkg8?u}ep|4!^yOumfjH=wIkga$V$0D}4w z!vZpoBMF6MyG2hs5-ig#HM zQk4Us$eVMQpnfI1?kLeJDq=uXM2fRRE_l2slRsKS!+rZKQ1HUq=uP7u{`#e?Cy49Y>xn|B3OtHSe1^sXa(cM$bQo6Bd4sv77BZ6a4ePpEvkB#h z7bvZJl4{7YSje+^nX_HFpNNMp$!;U8+limebEUs1M;ju~9-sBYtI)H_vYl(~$yFfI zf$Av`j}E;I0@4SYJule6Mi#0SgBLPGZ%$@{ypEFi;c$RMQGn#_ID`hpi5|mIXUcI9 z9CQ3^Kaf4%W$5(#A?TjfU4Hbz4=JvMN<#|gbXBK!1!rTs&M;0}!hpb4q~ds}Oi}r8 zt*V}Z>NP&f$vngIZSl{SQd_2rVDi*VXRZIP=l^APA8aOZz5p5r8u-ZIS8iI}y%cHS z)^_|mV*uY$*wYlEJxRy)cMXRM$mDrDus_IAf6viI#86-LrQ;f`W83h(d5&s@yBj0v z#gkc@dNr=WHjpH}r%eD|>q`sl&bmOFW*bs3MMZDbEc5QFr1fq9RY^}WrTkI#QockG zIN!g~&~SZ>*SmwUC8a0zC*DQAVHhHm;{q=+vynxrtfD)Ih#w`MFiVo&WPWgm@m`8n zRL4yK*`{+XxWSs=6&>u%5HWXYtzwxQyN??7}7{BG)`vFm<&DFYB za1MHl0Do{6^J%xuKp-{0su(DMeIo$fL{BDMve)OcEhv&nX~aV&!oi2VxWdg=axq3% z*5@dEmO^EiygzN{=gwyELvUQ~6M~J;LM$E#=PJT?k#OZsRgB*OE6DB)nkU?!y71L_ zG&CTztfc-ymGMLKNcGzu=|*4^&e#=udfeIvJ)r@g;v_>z_Z9s)fR}p@quy6Uzo_|n z5@5SeuEWAMT_HW8L~Y^4ewi}7tv;yOOjD$v)JwbYnoRwCj(*NY*W{>|>NPfaCA8I?a(qTT zIEQ2y*+nx5_n(v3U_Y<@hUQROg@|YFiJ8g;r-+*4dI4ZH`XK!V<6{T`!A4mvA^G&2 zcK_}LMfSUClT`5gDVMdswU&C_dvBnw0lC;V&4cucp* zPX60wLBp|{4W7=2PNWyO!2=I4l)=)xH7Z!Q#}Oin2%;bDPG(;QrXnUW{ZZ5z=2?Ab zj@=y`OXbf0Z&etkp$sza-@KcN21;}1me-XX#dRvp_tZ_F&mc%CFH=|y>X&+Rn`FAI zhe3uz-LS%HuC^mpKged05|O?Q$7*xK z=)X)?)dG9jYv($WtD*XxZ8@~#y$kUWqcm8Uy?xlx$7AbK>HK=%rHNBf8hrR=xj!~FEWgY za-9>jt!|>w@hiE;0JJ|1gDbx|#9qm3iCrkBV7IIHxu8G3`GVCjhV^&9*K7W`{O8Vc zcZ-I%X0kbT-Ui!|oc)nxTvZtmOCNHkk>FwqFOZ=oDBQ8nJbBrTNLK3m2~M2ggw?&+=>6vA5vUJaNIYzXL{#n@F5^vpRZvN6mPv~0Q=^?jK z0EIEn#7J<<;cJu;T5|fE4d?YQLzu}#mC|unX0+m2nD=Y(m&=b3S+{2!JX>>r7h~xt zp_G92EP}NDy)fwIyK7>Q`kFgS`>nO|qfKRo;e@7IVWt1szyIl|Hr^y8h{BR)?_ z!PJDMia5rv_t=f&G4?J^2%w(mP+D}@hKeA%^ctNm?68RLP_gYLNDY1((?fj^0ZJ7KRjnIcxE4cCJE}7Bgk9wtI-VI_^a_-9@aQ}Q8 zDbtZC{Ep+N&&eqS14y$3%M~*Z@aTGLqo6i$X@`ePi2qgnE&~gOMal%;kKdrkCwg*| zzzOAO`LrZ7`FoM|#R4wz`+rFf3&!}3{9qf^EXf4VHV9md2VG34IQ0z7#9qeO(pd|v z_jgtBS^v5l3kpg(B^_FGBlQG-oTN(R7K9m*NOd`fx70&?oYd)-;1&C;c9L{%-ZO)f zs7r@;8L|Y`#`LT7gPJ1c-!LO8jg@Ejuc zu{XJo=Y^!4RmP$hKhLfhwHHP6N|N(eaiW)uPx=vtW<9F>@}Xc-W3}OG(l$PMmV->` zlcqO7$IM90mT+~Jl38>(VHsj@WBX04PUZMNp8G4G@bRR;#r|&E+^elefv>k>Z#oYk zN;f8R0y{9AEx^B#MPigrmhanF^f{TNfHNvd;EPrm)mxb03uabo?kC4%cho)SjA zOJ*6uaWIlF5bFdFgot0!aP19t8UCYXHfoL9uE^zeD=Mot=yW3Q@r37R)1}B}2Fv0b zqZ-q$#SbQ%?LYot55D0-LiF#>&4-q+{`bob`#*l>v3I_DzI#^+fIKg*uYiY+=e68h zF17G?;@@y9{QO|mW|JqmmOo01I4UGHtVn#7e&d0fWdw|4<(Jlr>k?Hm!Z0`gHQilo zG_@bFSB^TTmfJT~G|)5M5-Uf(+l2)LnLd_WSVNBXYhj|(s#F@X^}j+u1$?~K%L+0Wer@F(*kN*PE3n?6K=33*$u&SliIR@tP&nDml^rI$>5ty~yKHs{|5Kk(UR`dTsnRw&YLD6uwH zzr{t}&H{(8i05Fn|6;5%1?CIvFB?*XwpDd$<_}nwFD)gkz@!4k@DN}DkkhnRawD>l01LM6j>-@)9K7$x?zPA`T=@Os|9xvkuA1cw8$aaeh;zs<#sV=r zgrH1Q;k1vy+lq?$e~&)AY*9)-qg5`xq@=@R@=0psgCWMaRBheR7#=pQHcv!+| z$a`luw=a`17Mbg%bC4=~ zaocLp2d4e2Q@ZcRIA$fN(}c(4uVa&(9nj(?WHj+v7r9Qpa1kE^{)XAs$YF1?nR6GX z<|UDeS{3V@o11bsG!+Y|VE55E?0ob;DM?_?m31D{o z#MamkC~BLUnFNJG#y1rd&7S?x&z4$nT_R73_S(EN9!TZv^$y;K58M?|b9vC>p{r)u zSO`?Vq*b(1)E~CWf${?~Mv?0OqyxnxbA2R&6;4$Jy~EYbnw@V=4?0gL44&^V%N2~3 zT77X(l^+x3n91bdlbcB#l#`5LaMV+ z7(O5N<=x*Y?ZmtPi2>y{t1^R%nB`YppE|! z)Ln6Ry-Y!yd&p@!Luz(5;*gU}GYz%Lz|VKRKi|aLjpq;+(fd5QpM!Q4 zm=r6#leba1w(qf7)}%(ViIzfRoMiuP>;S6$IbpvYW2$_TI`qJHeQ_fjMZvzSc7!(W zq3~twyQ!Xw6J@!1VvHhrY+oA}xN{VKiDjc6#Z!yt8`HJ*YVAuAU#$8cTd>xe|-D0l)SuKd3jJ9}Aweu+3D=*B#(OQZQ!=AKu(#rMm;kF6zHj z7FxYGrv#y@WFN4yP0_%^VvX{hqV91qKB zowvz~Qx^-!^g=Q8nK5^)@kX7=t^g>PeIPd^TwJ7z=;QT_g(uSdlEe+%EWmjD=L6n% zGd8*ukuo|~bOM<+i%#v3cAE9=OruFjvgy>m%L5xsK~p#8p4i}kaJ%tZnl|jyybt8} zv~|0tg(@km{yX5^`j-7cw_Dnw7aw+t!~Q>2_`hqiB4knh*&5GHd>7xt#7*j|PVt^h z$Q2)vVsl`URTBOO_Rr2vTC4hj6-yd9hG05XhK6={D_mO6YI4sz zt}A{WKw&3C2Zh=aF8G;jrXb9SYv}LUz+Iq zq0#y_7kXkL+zV^^M{mRV}UDOHshpkVNo>H(O;KqKI{$SL#0w-r$$l$ZA z&lA{lM*?Dk7_a0D(h_t^3FAv~g|+Rm%Y#h`#A%CP$N`=!1>b)~K+X1gA6i*C2prRD zlMMOIv9dUv`-tRuWUnUfeidHXHTTjCzemF;0&O%HXI;+gD0PB`ZtzO7c0;hoU&(nb zO?0yp)v(3pOO6l|ofm&C#pM0CldO7^2UGhONw@IZK9UL@M#Fi18U}Mfm?^FJgfu>B z&>p%meC}(&o79I-jfED>jKX6u(Ol$Q<%>FYQGBRqj`7Q3Pg`YK_6AJhxn~zTa{eVK zw1;CJrZ1ls{Y56G$g)oI%f^9{k^?QYeXmF_15=znt|z-s0VS1$LY)vA4^mu=C8&~5 z9w+r3kIQ`Zxp@-i{#T#aYo+4J&MPa^HPCzC&Q(Mn+qL%%?hmKzY@a~l-UL)k%H`?` zXai}@C0Vj>7H65fQ?XO;nUTkOZyzkgPhF6LcAxcR*1W|06PwYuNr){Te;M9)gi~5# z+wi8!Y28~;4c%z!v$~j6@7Of}t!?d2VysR{*b=6}Pibiv?loUxS8W4nDHgUW;JSj= z358Q98I+RXGimnW=&KnTGz9Z&0oRZB31w5P6(VoOw4Ucwl|ZU@t4H7CC9AIG0dl-5yeCIpHr zpcJ?3y1EL<)6h=QYS?S9t)vYhelhuHuurrUNlQw0C3|_R=lGq?p{ost&PCX4YLaQW zkNbw+wa0v>#BXS`>E9Ocx;QKs&=l6gtsH$Ic7~wzHV-phdypE3$NO$eTUru%DnplB02ghHM0ua z#}1CKXwzZ3wqDxj(e|OJ?9>>;2EipWwm_xZ>(Xe-;FZ!3%YN2e9$n3mr3AcHe$voj zAi&Phk1vKpSmo-2nNLk8BCl_R~!!E7!GkiFsOxm#~88rrCdHF?$`mx@j~u;v$WRUxUGvtHZUPJ-mdPpf9T6vxYy zYw=yV1&3;GO0ow6Z4H}Isi`CY{3<-nxOz}s_it|iwn!CZr%^ZxOV@X~JrH(4nC?90 zcWY)KPRe%Ay5=NgCD@&PrI|K*GkX$v0_iyF$^V}BIi@aRRnKyTAe%f8`%t!>0v$E_ z^wc8*TBtWaDssBt8Xl7Js8JN4okZn;-(@c;h_O|sh6jWpqZYYP9NTj19r4{Z%jBH* zSI2HWC+ij2Oz&`u>N~AC{9|E9KZ$9TluI5wAbJnr9sK|8W&fvAPkjD{jX65FUr`7g z$*)Ns(yE!-_&QRLdjE&*Ib`EWZ6^+xuMkTk9UGGt5U-@v8ybMT`b!K?5m;b7w^W0D zc)AH4A$;TQ7jY)QotqZ3$hkp0228UO-mRnta2V{C!vgIpjb_a>WJQxjO#Sq{3|v@J7^?X7R^_TPQnIOuT6nvIHi3d#5-{)cqQrHMjZ%-bD@ z2r(JA6}75opP02EWKx(#gZ7A&(4}&KZ#-CIrQGJCJe@IheX_mJ1n)6o$cq1=m(DwX zZCOvS^2IW5H$`D);G;>mdD^$Y&a=ycc z?>bl~Et4MNi$sS)>krQEVt6hF#bzvRglbqJ*ow{7Y)jDWyHaK% z&EZIZ=zx3q`ZJC#CNfX!LZzoJv}0DSp!Vit9(B9D4bEhCW{7KIhsPC_tT93rFEFKT={=iO_Avc zgGCJ;6Q9p7Ut~&4ej1K_8z0;(`T3X8)?MKWVwW}s?^rJ*qaPf&rODoi>^yp+_piAU z(ekg^Mo*3Zx*cZN4KQ+tk7=`sog4lNxrW+xO02y@b}VjUiZ&R?Xmag#o87GrR=r-3 zLO01j&hIV(7o@C3>dA`N2;_zJy^pzl3g-qfes2KHZZP%Xg~Yo3b=5UY{L=>|inw>- zA5CA&%0|_k@$Bw>!6<+8>G7t%=yX^<_&Q z-OKYir}a%rLePm|*$tv=>w`4C-D{)4-ycKPTc2`hVV-U`+xyIBvHJGDDrrxosmN6Z=o-60)}zlJ#6zyXyT-HIsIcZ zox7;2^V6{{Ma?JSJ0{|sw#4P$R=z$}VT>iAO|}B|9Y&nAxeVTU*u5(NZTs4>tI;c{ zq2+e%P2SenP_=z(%q553y6I_c<1TuFkPuR)yk+>;5qZIBs%2?p_C>dzw<9fW$H5Mb z%|n4`)>A66ORWEgftC9;y+y81O(i8He45TW{XUtm`<3f<;EWb$?_xTXITG3>Va z%U4I9MsS~KGz0wpkwP|VEK&fei)yM4PZe~9Z?keYU6{iDBwb4PMa9@~8|HMM15+aV6n$ zU_*4+b6|3GUa3PbiTv^2@92d!urP=aBFZ6N!_6GI*6C$3ZDG6dKNiq=_94YhB%^s56fD?p6w0PPI!>&2e#+^VldAl%_axeGl#xe9353cnmS>-f0- z%1U=}cQpyOGl*n1=l*`cvtwIr!eXU&{J>{Lnf1?|f(y2H6K+lVG+haM@axEHFQG-m zWpvm1RLTEh>pi@hTDx}dt!zbQOY9&5Q4s-YvJsGyL}g16r7K7a9Vvn|fe?aQgTAJF89XVq{G0)DV(#yGJ#;jCoBX!kn^;g^<31?)c{}{i$xF3) z%G~yO=2M7lyC(qBDH7!Hpu*1O9~w81jFO@R6$2zLM-~phW|FCns2Q1qAhUFBKL?J{ zh-0LGWk#YSRS6#>5Kq1B9P}v4LHUl#icZXtjtqI>K~LaYc4{@}t_&pTK@vPbI4C%d z-GQY(9fp?+wuhnve%tPS@0|R)X3;&rcdb4$F2(ld6Uhl)j**A;bCP2@c0a*s)uDpil+Tb#Mud{pYPm$e zUc?||ic3%8i+@zSyQ9Re|p`Qlj8qX>T%kExbFBA$t+ zI<5~teYh&%HDh`*U%34Wu8)@H^BI4R%6+TlC*Dy_l7*g?2Ab~=&lg~Wen%f)*xUsV zm1S}zpQ7^VHt;#XEj=&axMi3AT)WTMZ0Z?hX#Dx82cTD^`$Xp1m8CqDV&%Q_i`--- zQv5*ys>JeRqV?I0z6SA!$5>0nJn`>eecx73Y^lx-r>~Ca3S%$$+KfN*)rlZqr%80>=OqiNp92$jjr`;9b?6uyxAP28bU1U)Z<8DEFkchJbSmfQ;%*A|^|^z`%cJ-7 z!|&60pwjo}Qspsn%r9EA%I=RMzqq{3<{+}~y`1PJZff=jJXZ=4%QT_La~C^vd8G;V zvVPr~r}D51w~AT@7Ky(x$_YCYf<7Ca(t6mE_NaeU-5&x1mwQjBdh|a;*Qtf?mf!Rq z>xF+tpLW;RZome5goLFC4s+;sSRVWa?B(9m$bRK2@78+ZO$Pt%);I@^wa5v2?gl(> z87D*NT|6ig5Bkk$10uG!Uo1rItJopf-Q{XN2i^E_HFxqu!5hNs(8kuVRtCQns z-n2c)D!D-1JGE>ZAhc5o7|)M#I-v8Or+JS2xG!R#Sdml>BV=p{{(7^nZ+~{Mq_P5A zUKYnq$4mqmC^r_n^r-o%1M?=O8|k*RncJNPorma2`4O2ifj{>2y~BEovb60XuSOHR zmLdqbjC`sR_14iE0|2YcI3E6umK5-YIP#^U(`VN27~^{`7#19$MB4d#!eU>(t@q*< zL$lR=TMVT7;KQu}%+w6Lfj7A!I++0b*Bqc3$Wr^mVuJ4WX(j0D}1c`jY z41*K^=0j^qNvPG;kYhAzEBSAt46-sOU+yN|``p>Ru+`o~7kDjYEQw@}QB9%B|OL9Lxl>PbU3wy+=1`yPZA<)f23 z!SkN;m*#HEE7;UsCKX9Dgz@NMKdkU~blJUwtYZiD zlasY+@KVK4+IQw~Eq2dAc~7e)ThpH*b|->Rd_kS?=W5CW^`05#{myx=*a!K*n-FIG zDf`=-L%EulQ-IeFT?+IYP`suPSuGdYeUX7s5-syHfkOAb``mvZa}N1nx5;^(${P1Rq|KBPbK7z z#I{cKS>3D)D>)KulB#@CJ7OlV2=!rfgK6{G1Bht>i#W<4^Bs#tbJfykBM&{zTCX)M z_>l%p6T*v(5E;EDpp5`rE04dyx0msw5x@KC#T<89O#wO-`K#1)w__0!Sie@SEy#ZN z9W4@H-+B*bFGGT#i>y=~)VwQmu%Scp&qizBpkcI9A=-Lyo@Ha2MMR2P&vN*M;?Y>I zm`YS}jrClkVP8e(-$$1VF!!EXJ#pO}iIQ<|wC=f5lnCXe135KM@;#n8aQ?Ra#Jti9 zqyNP&1JWK;)LYq|p52R1dk5LyCC{5gvhIJ~WQs#fhL=|cghlrIgCh6V2YxsqC5Cw? z0xSIWspgTC+@sn3elYvsb=v_q+D=tQyKLib`O@|H3C_x-A?_bfuD+ieEn@mk%t39| z)@);RS_@0lX@b<#O!NE9s{#>&ErZswcTKou+n@FVmHc$yPF}X_`PrXtRgC!mWjb>WK5}kUQWAs`! z?8MtZr3WUYtS%z??mNlm1a4sPIhocb<$3R)H|zmV<`z=gI=W&ZFi@EYfkKu>btM-4 zOs&>bxh{CdHd`oWcF*m;AOg2?i)>Qn;jdOIRRV^C$11WCmy;x}mRVtr1G&Gnn}};W zO%+i@+FnzICT1>tz5ZIHdC;nn#-Wv>@~60)jSfluibbsC;KUxPH*mQdqn0@f505C| z$>Lb)w^tZXJMSG(e-PUsWvV~9_}j^sZmHWIOh*kU{%hs{z*7W!F?Nj{Fmi%ZrJ_<} ztGF%D7Xfv%q+EM1jgoo&Z^^#H)pU6^7k26HsfLakNjt80Pt-3`8s^vm?UTs~RK$){ zjr-pYd&5@IAuWq>Ra3sPBhwUX#gwIG@ttrb@5_4pxwmhb81pc2_cDjUtjLmIy|qF7 zf4I2N!!sl2_YsPTQ{OYFvsL#aIO z>#$x)ms(JXRB3yzq(Wi21g@2~o`AYm{Z~q!<91EMVa@lLKz@f<|8UDfu{Rr2_SzVh ze^q7Cg;O5)nHi?H?tr>mV~PQwcRWVr_40GRIE3BBrdZL?i5F7F$i(Bz&>-m!rtPx! zVf0!~l^suXE-L;J*(@vI%Hug7btVgod5!QuhXbJnK&;30iA3h}aM7BunSvzRi*2~aiUwzCj zZ14D~QDekkf2Tj58yjquHG<}eJnE)VSUOtHQ-(Icn8uvsxu7wjn^yL#@c5O4?UQZq zxvl-k*@ONUt!HVcpOo9B?EVuTJqn(1I8U)pz)cx761z#A?X9d+J)$u1)?n}x^o{Hu z*u!$K*IuFTF*M|0K4xK4H9U1l$#TGgyCNo)rZOq0MW{<&QA~53rV+hDBf30fk#I|^ z-&5_)#?TFl_`93`sN!gLpS{RLj6M$Ot>!qDK3{kgrz<7{pAZKTF zzOj{Uf15cS*yr@{S2#c9Xo6A$4gVizVBqkFogzaU>$_;gr-%8=pz`~ zr|D|#eht#GZ2e67%mak{CCM=NJTx| zJh-b(`V| zT%vK^6k6*#C!pR(_N;?rdU%=r@bpXtUV35gyViR$uWy@|Sj|bPtyNX~WcTt2xX=f} z+OKRhZ}ClNt*p?6nIA^bJz8Pu%&`)btdFPjq$8 z_>JM*gdrDZ-Om9dAz8Zhqe;%LX#kjE&=0O5Caag9fVDlWPR(T%7tRHK{F8L6cYwKs zZvXLwe147h3@ zx*+t>B8wXF>=8clo>6vkVNV|7Exij^H^eHto^BH6-{!uD{lk(ZN)W{J>Hill*xW(y=C=4Qux4B9azl7wPu| z66pdx63;bdyrN5Ub?~Vj-SH+MjZfx5{MCR@$!6k?GDW8QIleLCtQSEMmY_880!f%G zjyZsY>FWjmpx!0t7WIVdS5*4^ne8R3SO3b+a9Pr|k@NBun+)pPf_Gy&E=OYIc~2#m z|N7K(!DH9sy!P>*#RwbS-sfQtlq%-N9-I|?j8zIKn z&tLsHPE9}3sbKh~Lsx4Xvu+%c!Y!_coCRo;?#{0lwW`>?>?-i|4R=KDT5$_OOs-6} z@Nx_jd=Gl|FvL)zyWP6}9Y&`4+x3G{qvV*BR-df{W2D{J7f!d?S5Sud#ef9?NlEG> zqpdqiWzexBi1K}E@EtL-+A}3+-b(%0?KQsW=d<*@3G>T~^j_9tyZt~^mT6U(ZumKQbvz+9eFK#$P+F;s$ zyKqqV^;YyktV6g$38#DJUHp4WF;tj;r_u^HZfBMXsrDOx!>ZRW9>jN%n%Z+xm{oAob5Xjv*y5kp-F*BEZh+)A|!o8Uj`M}@j5xwXa z*t0nVz{^j_kZe67AX)T}`bcS`-Ci;3AMGK2+5x+>#JXy%>H_0jnc z%<=cO)Rn;EOCL|(BF+=fqniOg6*=6T`*I@D1kO#BjMvnU|7!!W_Y%E4kJtCEh>^e;>4#junTJB9w^Io z{Q1_8D!1*iI;#eK_YnjeYq+n#T{GlPX#;Ztlo%%^lSM=+S&t&($Ll|O{Sz5aD#LfV znZwH3tzr39{uNZF1(RavZ}uMLQ%dff1b*1B_coa8T>kpfzXYAX9>C>20K9O`Mj3&Y zjy`UVeGj9_G{aJ7dt6ceGn_9E!W3pvLZxzY&1v0+!i10U2iK)K3a3-^TJ@l@`vfHW z%RoUhzSlQ>Mm$-couu@^VqohIM*Ooi8gOgC_xS4GzC6CNRTaLFgpR>PG^1LS*jpd_ zfl*B}fQO01x|y`uo6|e#XMYGt?i6pvSmBiTs21d35L6qGoWuErjFtg!p@%Uo?wGwC zuhy0ing+;0@L`peDlW*a5~EB*%>twQ8%bxusTeoL;c<$?2s0EpK>DQS?ao@K?Tbq8 z4C;IIeF)>!=3D}APbj~`29kq7CFmxo33;l-sCA{9s2SI?ycSzmFVgx&%4(}(o3w89 zl3K8aTgHoI%0mynJN?eO{%QNLdcZS<(O93<+MgW6;HQ5))TdeCXX>%?U=qj4I9n(F zm&2YBG!gs$nEIT&KQE$=D4e~GSig3rH0su9_)xIFJ?f=wLqFtnaxv$1;>fl1E{=eg zEwDhpJ$OlSYm4`W1O)9lgr18X72jk+J1;<*G^A4lr665+6A2HO?V<~T3!99vJ-bkx z;kwn9iOlm>CMn7dc~+XaU*m89P=u@?c}i%=A1EF=gwe^kB^Kyb8b9g^aCsyvRY zl$ndwuYa%lllk{W9?{Rm>(Sggwvx`Kglo)=c%>gL`eu5s;HE6%Kjb$B+5& z+L^p9lI~)6bo!qJ-9nv8ylK`oQ_Psu5zlfH>QK-VTL$$u!*TK2nU$&%4K_h7{>%#X zTe06EXvO<;x+dSC5<10v4Q(y7*MAsQG)#Co(wCto{}2sUw8O(6-KI7}PWXY>cQ(HX zLe$s7za`99N%@`spLwp{s=S8~lB0~+&2u7kr+8whm%7KY z>AEUsPwW0F!WS#*&a^UIsLm_l7&(8^{Bh+Ynko9`pugN2!3j@K^CvWdnq`RKy7BSW zVK`^)X%t4^3RAY8r{yqG_-IPn?!|ZMc_HW?jD-@xX^Dq4hex;bYbaA|>&krQoR)k@ z&34OtFy=3PaessHI!}v9jrI6-!$^z0X`0&sM|KN=Ci!VT@YPnne)cJ#8173N0f-OM z+MEZw^tZb2N8az$d3$7=j5LYh2+jX)^F0mTOF$tNGaIkrexI#_@N3B1%o+Obe7qmb zYCNK`9hYNSw&R2W>4Hk}KGkL7E~PuxZ^yb{Niii~^LJ~cb47IE*>=A-(G_zwxDFFvNDm;CE*fiw>ORRoMnT^SF+v0lxd*M{^t|3>Rz~wP;=B1y z2+L+SJC5KzmQN(lFvq3Fe%~)Ru(`SiE&*V4ZA{#r4-?E0X8F2|bL2qBA3)0<)K=g8 z|Lqgx4Sl^(&HXx^v_AKi5MevP15HXy`~k9dV5f@CFV=dCsE(pGB*I%Nh5A@Fzq!t9 zG&9xZ2=!I!xGQ--WOqCGBxx9t3QH_bQD+B9>$&K-nf%qq;{}y@4|5t}uUc^sr@(ol zDRDC&zDJy?9f*#jNm!JoQMMiK{w>WfHeuS>rxrFwlD4=Sh^`|Y_@_YJd*Hp`Yg=ju z!*>efK*d@mdGXd_H+!)Q8wa?eJe#j*+#u`{T`!v z?~|n(rF_45#-*@EX}do7pWt68VbN|Ep>+*XY?m+K#C`j^|DIjNn^5vWaz{Ygwdu>5ERHXtR}F~-Nq zDZXdEehk6RDyi&Gg4}!4C6{}1BrYgr0bfo%Csu`SEmXnT-J8Q{IIzO(;zYYn;#LSj|}L)56hBPOxt2>ka*$sw_PK?A@gA%Py8Cu~eM;uQvU_^$&Z8cC zYDMMP6IiE-%WrR}zX2&>6g!AN*5l2^0KNJ;1EfJ)kHtT?%@Lg)Iwt(@RcdUC1w9AW zy7w8NpJ8S3g^Ck_sGETuahv=TQDb^Tn0Z`7i=sZyZ>u#zY6Ib0fk2^4>hy0bDV`9W zN!9#Kmv!`<#RS#v-99@3So8?+{5V>hjWs3QAkPGZx^Af;!=7Nq+_^ILh+AC@TMM;0Q%`ztomF#t?1m(-1DTTl`#E2P~Bt zMN_7x;pYVY9ge*cDZC?Y+vqD~+u$R7z%8S>VY)Qwg^efq6&|4KVLXt5P(~=aq3Hu> z!hHV5hJau7<;|)oX}ik`!;N!omR6W=l(g0Ut0h@H2w{bH>hbWYGy0V@GpYQM2r>uU z*x`U_dG*b2g$Fc^XqPpX)uWv~zOB497Pyt*z{1jOT?i_z2*oQigJR`yC<@4a+y?L7 zU-?!!{kfVrFA%d;KMHxsz!OfTmO(F#0*jTNf$CfBKC(uOf$cXS`oq$hP}}dA`a(V(_1_0jdl>9O8i4ACfa37r)=NDo1YltW#_OD97A- ztaM%CaIhk^Vvb4`_=Lfw7o4#$ll!(D`~=85*B<8|*1+BuQ%!+Evak|v4w2i&I`kto&#PnG*Zk91@aVYY!&m*_>u{1`v%poP4x|?g&og4Em zK!|Fu?N{jSb;Tl?ss7DqBL1q+Oie*qi49)RFk2v7B+|G=*-;<}EO@iu7nBI?FVXpY zn{b%K(2A8~+`;D8=0%=dHI<0R0Rkmvt+c9aRvtVQFYs?gnL}a1ef6!wo@h0zJ}o^> zM&Gx!<+gNDww$0~c(gtE^6^qBczNULFJCL?e9|2J5s$#gj!A+10y*$V$fs2OMO~$U zXPCD{DK#t5#M=cDvS61mc{w}wS;ri(`%sLA7jAbV;8lRsXozsYqqsIFCWH|Fmvvm%`cH@JkI-vyMZoD2ut z>p6?!z!mYEjs6gzZwyiMNnAkbQDQXRraT@LqsG}Eha0!8!O_+&p=NvFYW?x1;Bf2O z-Iyx>#pNolZ}YpEm$u^k8k-Pssz{O$HBg3a^i*i>uo00hf{<(O()+kkHu&YJ)(I`B zhY#ChtEmfRH{GevoBV` z-^w@H#=K0i$uN05H_%ta`t=}B7Zf?I}ZhN!n1A|B-!g*hR_5h9# z3ur~06ai)$4P1fy((k=0#x)PNhwwx zH0`nDA8=+@$vz!|Stx~|Tjpu*Mw>tJa zVSW0vIO;$vqSt=`@E!d>c-E1q$^4?}yp+C;`3KIbphYcwFSW&8zMh-zJF2HSqkSQx z%!K`l{!0nkeBi4^Fnzc#5Ayy-q<%6I434|@*~;G3p50@mdA}>=p8+ctm>-v$Q1DwF zhLEmTmh-qOSLk>&@_d0e1J%IFc@;y>QmDEGuef@EO@E;M7QbEw*Q7-DOoU z*+MG`+_?IYRZ=;ouxa+exwa)EbB4keP^;ml?A$y4UA)iuUbf|gL9ZQhZTvw$0xV2A zg%h9XpVzptKi4CFyfoH?*mg&Gd{4Z2FTri3SAzij)g}&H+56H*{s=)1pj?H;xNTG4 zQM`7WCkMp)yrIUbVDHF~<3h^=Ld`UMc<7I$11PIAd>Rt|sJ{%#epBV%H+j2;H-=zG zC;|e^=U^(HE~W}A(-Tf0uAj~z>7~Ej7^0G)$_zi$4WR4GDw|_D2=(1y*>bG2Qz>N1Ia0XK)L5TqcesVbbU& z1sEin6F=79$#qdiwC8*fS5?|GI`4J5EUS>l{E&=Ba)yb+z-7KSw@1$sGaXa2@eZ10 zlK+U`vZ9F>8Y!LCr8Mo=-(9Wlm3|zL_vp{M$Pa6VuzrZ(FQ%@ATYp^|cAL<;H~`}$ z{TME2E-(p?vea*vY6wC2@SVpf%#K(%F5nZMl|Jhl(SL5y`&fr~zJ<@w`2$vDVurj3 zn6tlO_8f2Z5Uqj>H#O0`>taY4&D9F_g($1=ou2SNx~0wgTOgC+`RqZXI#N@E@%Cfk zj?Xp*6Qjz=4o8(de@C?#6so_(U zU+jE?-HAEthC@iG(>kASxK{WKhjAiSMS%rWrsIRT+Bv{{#5;!B*!zDxIEUGF1N75x zZF-*p5~UmFknkZV5wOD!KZhmUEcw8^*vWf^M4g0)TMV9js=x#M zxzr9yO5O*TO1LKP=cdR*uB&w}LeZsL0*O}#m%Q8%7@l6QxHABsYLIV>IWPZ%*~)FN z8ki0Dpt@$g;D$#-_U0FE`pr&P0ttU|EkGH4d0{j1$RNp}$caV4%H!(ON9_Q^bs-t`i+F!6*=vyG_sTd34iHqSrzAvvp z37c3~89mq>GU#f%TQe~#KzDA8rkU0k{AgjrWv~P)O3{z#?xd##Gs0y9Nki$PuV>fP zpUmWP942qm0>^AO4r^YEP-3g>hNFWj@r_PTgxTi6!fwFQM@iR3lc3ToRg1$IKYZ!p z7S_9&{=hG=R{rQ~2jD{~=!7B^=SQg>9oE4C&vTD5I<$HlmvTRJ806~2sAgiG`-{`d z0C{U=l>nb^4Ezi8Lcw9A>6!C2|L_*PT9g*P7ix*g>&HAwt#N#freANp)qqtJ9r2j+ zJ!>Q()F}Gse{@pddDdm>`eI*dy8> zXb#$pYK%|zWW3rME(njtL_|TU@PYE|I2q8q$|`ZL)^9Qs2JH!>p#_S`rc9rt+cDU; z{bw($?Xm(5Z?N-o0_=e@5QcEvJ9cW*kshRjW+JLgZVw;oX)R1T!_oU_uD9xPWc!TE zzGUB)9OEyj(cJIvWWnh{ei}k$Gzs1{H{gb+v~yFW!o5EJ7E{e8sAo#{-zn1SF4I~y zxPYcnCZu^V%btV>ddZl|E18@-H{72ol~`B#zvSCEF%{k%9Y@ZBpcqH(iZ&V%Q+;ur zH5sKQRAK+@r1Q`hw$s$u`YN&bVEzrnZQXT`Y?OlrzQHh!U8ekUx4%RrKfgUT((0Se zwF3i?nE5T@yWMW?s7hS$?03mH3VH1{rq*`vnM439;!xo*U_yu|`MiR+chCFJHC^r( zqKZ#)a*0EcdrT)3Oo`AhK02)2=VfEekS-C$FkRLkqwy#dW=N8YYuI0_?65{} zXrXgO@bm)J2>JsTc9a(j{1&d$Ezi2vk^OxvN9JNHvNTVZnli(bs0TrF_hR(N$cBrP z{mh%$0)`~rg++iYLfRNwM1h|AqV|eZh242<@PjO3&wD^iKsmG37KiV4XLjDBZt?MS zidlZ^rlz)w7ac0@y3RUv_rs`nx3}hKUPTZ8XNRb?BP9r(VQd%Zmz95-GN1Y5%!j0jV^*G^^299ffGE{^r68_wmnZpBlE(9rO@FVAxX}wnc z1pM6iCd;Kux|%e19LmAyie1ulo-}7!Rz}vzpT6~wrwhO{713xla%#W zrM3U@`S3-yKqv-Zp`QPkuGn>j$`%c?Aoa1Fu<+H~oj1b46cy?>B0-E& ze{=VjFs%OpmH?Kf0!F# z+T-s3pQvZqAkp*ev9>w&fAqUhy=`yzxD3URE|;56lv%`=xv}_NqTxf1PJ@nTdOjmB zOw#q=5%5CVzu*h1ld;gGc<#&LA`UhUQQxZ5phVU89uoW0qNK_b^3t|NHj6O>eAlV7 z5AD5u1%McQ@6^`uXeP&-f89N2VM{GOAfmf<{6scN8`&he1QGLK5C39+rju>dcf`0k z-g9e-9h9^@JKN>U$JNz=^pl3M>zI?~@vlX9e)*f7MA4utoV(<3m&h*!FMazAQm7AJ zCI}DR#NK{O`juo*{RtD#;jZ3Y2lhMutFY+$cW3tH`vuo{p`0PHcQi9<0idr!*{BGM z(x(O991AYC34Rz~VY|EUpz8i0Tg-Ac#AAhsU;fy$Tiz=8+uIW~+?S;(#j}~s^F!R@ zchO}RWq#)Z@R8{nkuS&b*~pP{LBhRKk?*QL^ex*m(S$WG^`U_tcxhm4cE+z;PjIsD zx55{B<;n|5a{WfoE}3}O#-~qhpBCYjg(|EZ={OgQavEl7BMH`}Vo*lF9O{ypq;P(d zVG?bqHs&9txyV$Q7SZGJRd%sHN$O~8R!6(D>Z;jap|+7efrOaaa*e0VHO87ryjQ@p zh@Y~;gHc4eR`aWx(TjWzNHKD~jJE|U&@!~8b0Z%9EWtA$9%fs1F1Klx6V02;E)9v@ z<-KMm%r3n+3COi+mc))q`iyu(jQvlw?@gN$kLt z7~13c8n-kg@qifH_MVB=AA8gx~P! zu(q1Byh%%X7<@1#d9;H1R04i-+a&l)9ft%u{~D6R8$XN}rHd`0Jj^B-GM#% zXO#Qpc9oLy6)8s57D+gRcDUN1*jNX-B?K6!TOa9jM`tM!j1!Ym{ zqeoM3hsy(gCa_8DVv|;Bfd7J$g>2cf; z&E6a!X)QUIw_flOg*n-)x%2U3`%c7Vg808lz^khP5+jW8^IbA1l2kgN-O%G@rY+`6 z`6HYsrbpMl-93>0Q;MsSI>Wuvr!r=2mh>?(V`(4@P*PuF!uS)hjt8_m2?FzYr{(;1 zA6H%(=4AajeDkp%KlDh^$1G*;iq4F>z5JI@D~?BHzY{O$+((qAjum1F_32M*-3xKe zr0S3d+lFBakOK?rRz!q&isW0`kz#-$nsYJ!kiEcIk;;<1{qt?2KCZ3CKNRBlD;FQG z{z0cmG1~1pVn9Ef88>FBn5kMxWioSruC#Q2_(!lyW@<^Mq{Sd&=5rbV+n4iCh&xHD z#Sd6EPc+w++$p^R-C4Qzy4pv#IC|{J>|Ez36seL~BpF3dy&d1PA9}2Iyati0;=d#t ztWZRpH)>%sg@zhAKcmskuL7G?H$|@Yl&I|#aH|5Rf^^mD z#&UB$e>jbxRVoH4np+?ZB9;+{Y@dcqFndxJ0Va{%EGlPScV%=)3wzf0ZUlz$F^xI-$AY5z-Zg;s{}#?% zboM|`nwc3iXfqZlv^~U|1h1^&x2m4Y_V17+H%%dw5nz*FIkyj?Ncm26X;9Mp-0{Tu zxiH>{mRCLNed&#kJ&;w1=v{UhmAMRWy&jk&-ew*459QrgA5-CcS$1+~0Lk-9nS>io z$;Spow|pKXt8Pfn551PZUjrf;@sjr#W_vM_;=x*%Whz(d1QTJ(2JHKw2KaKUsc^#H z5;Z}h{6jl| zr8A@&zhxnTB6a=Uzg0cCTqfGyo-&TfZ(MSBU5mYYyl#nZ5x{;$44>O6bl=Ur;J7W@ z5#XiJ>TF?WFH;ttIntOZ{C<{lXX{X_neJlA7{zR(Y~-v7IKu2^+DRzs$)k>!`K!<) zjBo6+yrE04X0s=0}vHaS%KULQ46GT73(iJ0Rw)v#`_BpZ=#Oulc9!1HIgj%ap4 zm;FYyxKWg^Aj>__?BVn293FaAGMlNE0Q?dm3+P;vJ-w&)H6&tr8=>8zYa6=Yd9Z zR{xmO{%M>jj$XisFS(a%mBt#w2#oz+QmiHT3S=DsP8>>JyWG0uU7DXHS;9%AZ@uhE z*sj$#+fcAt9iax`MyJ&BcW&>A2q-Tm4mW)pyZB=o8~9@Yu~oLY4?tX7m6@+bg}IKm zxEWbNF=hyW+u1SwArWZv%i-J036l9t^09nW-YvoPGB}?oyStko68x)ekhtsOSQ()= zV8$f|GGuVX*Zm0{(z6{Ij62umKxi zyKgZyUFGp^z&;0Dv#W@m&DWklRt1b=b5b_XznF$mA_~*TH*sYEW7D4+Vox+nLv_Qu+0gpO7tf7RdmuzWNYeyehk zT0J(9j)0ecL(bMkyN3ANSp1(s`+v{+4rF-wv;%=>rM<@+cOJow=eAA3V#7?sUF$H~k)*#``yF`g%Ov@=0t^v@*}}v0Ugv{7Y)l*)1O8^7fyYT0 zg2d9+e{;)tI&^)Mp+CLNw*iskY7{Bfy~wk8Soz)o{7N_xwER}d@7x7t&zD|NV@{eq zY*WehUznauH^^+q8|D?aC@n!38o+)(Yrq9dzxD>xZ&-6bdm(v@Ry`|{QfbToz+!Jb zOl7aY?)vLRg7APUMg}JSydN%HqF6Fn>}cTLW=TTMV6p~57W+ptNrAdcCXi+NiQnC; z5j?C38Fez93qOqW5sxdt6zu&q!rec|=bJn#tKrgz?!M)wcROE8li>ZS^)`A19$;Dy ztTim;N0Ln{u2^cf>&c*@*t@XRe-8mMVMHPJ7hyvl9z}9pBP!wOx)6^idV_>wlM1vb zX+#LQBgwdeBLtw=xguBBpHftrAH!?#&w)C0<;5E1ks=eJG`l7p_+Ap)c-!#y#<=ZU zMcc-uPwQorV^euG9C@T@D%~1rZ=IsY7POBtY1m-5f>k1Ei${qtkl7 zAZOKI!xR6x8ve_p2|@cTE{PstcD~L@W*sAmi8!asaWcjHJnV>c?B})ITrmeEU=+4& zDB}I1pOQ7HVF-_RHc?IM>@WnW{FJk5opl|&gbY}H1$)G+pJ=-MXB+6{oT3iz(?O2f zV(kHf8y&%%koTGM1$^fcWxd|J2C98$##v(SNPd*46W%OQD9lp!Q7Weza?h)||GFt3 z`~V$=?|QN;@v)#`k4qjK4OY@lF5B@)7Y4>A0mn1$SI3S5w!(x{F_AMXu-%Wg#8`N+ z?=2?G^h2@nsLEwed?Ay1hqk@sRAdEaTzAzi?Ko9R>^WP|&Y*_olQ&uQ=fk(mB%wl) zz(uN_QOxekDr`L40`j_Zy{^o%-8(0hO=JcswT?aC88BHNsbwtu zmq(VTqSRy})I=){uWAv@3&+gr#Z73&ocu(`rcW02TXEy2P_t8uV=BX~B7=Q-m<>55 z4U#r(Bjj(tktMZiuXE*sM^ithHf`@-6Mm*cSEaiIuTub6*H`~XLHOyIoF|(TmT*sH z_{ur?b5hVbL9P6clF4UVpj}Y<=5AC6UG;(A3N<1LqGYK2NhPyP^%eZ~Fvkvr>gy}a z`9@|U^|7%E>=eUrsRFH#yl)UAo+4qx;-X2Ni`!!i zqXA85sneE?vaB(7a|=m-7Lp=x>xnqu>vk>Y+}n2T(Y&j5c?@&p787hb_H<0JyXck; zx}w0;`HLdT{1i;yT)jYH)JGi5r<(chLgCvRC^7me3+ITO8q+xe7My-0y1P?D0O&W& z`L0a*S6~Mobw>sYg$74Rpy1a?MYrdqhCAH+t`Op36{kdiNHlD_em`;0XtfJwYNEH= z#mxEFi#nAbplDZhxn+lh=`&soL~2hf`ApQP4MY$0nMRh%XO8_CkFxjvexE(`^g#V+ z?I(!Kwqc=U_fxM-hclxVs}-gWy_~L)_t5VpzHwU-#9zqrF_%bSdRbw>3p`xeV3~8> zgRBN%sge}79I=mzZsrd}#Y?SDgAJi$ZklitZJXMUSeD!@UFK18cfs@*A*1HB@DN^# zXrN`}NFkQI)%i;6=V?GN@Hh7orM_@!`0LLxbMJc@O7AVBqzI~y4?|i-5+x@Hf;Sto zp8B6OAO>ytovD*#cn2ooJ%-1;%UtrVw;N}wD=I+oTJW7#$S1~P-~x^&ss4O&x=h&; z(DIM+Ep=SiWG6-+L}YO46(u3g4>4KNt^A?nb>(NBf{-A!(kl@2zb!X%Z;vp%W6#L6 zei6`Ei%(Ilh&8))LsAq#U_@|&S>r=mV6<0(S;o}tZXk>2zBWK4+?AZmoX?2)6}`hf z5@Th5ZJxFI5t>aTKk!dbLgp$3Mqg{$#^#BNsx2vELh=pZRv4 zS!e$_C-Z4f_JW!CFF^|k7;tr%s}>gpXVjjI$mmb>u9U2o0ntajtU#>mGT*!=t-Xoh ze;u;_YFg45BsT?L`f<`P)R9FeLvqyqCy4lBr_aRT;M5!Beb09%>>m*`i~N+qg)Wwr zLT^*ANq|W$<5?<52yi&%#Dyr7Dayd-P7Cu8Z|^T{8{7Xr#80duUeLf5GtG)j$LHnT z+SMH2Tb{m5=jRH&9y^HJpSRhZuVS9AveyTis%N3gv-DG|4*oj?kel**BjlcWD=&QN zbFk^~PU&iR3_?k`IUpvvX!sD~O9O%ZdBcSFxt2vQk4`%bOexvsPN(|qAhcm)rJ!i=K9I9`)RpbErX%&eA6Jcakq?X%$mZJ{J{hIr|nk zw6sb7z^5PdR2)t?rwGZ#pbUX&u5sH8Y8Iu$j_Iz9yAXL7JP7W7Orx>(M{5U(!bqRd z$63pgG$Tk&9@7P`5MmyzIdmUoto#uD_x0n$SGw$(=JbnyFBZW*hsKZSVD5S+py*f9 zi)1oPyUh%}lkc>vF~?h0HgiwOR_>OVMST`+HAVTXM9jtQ=?WAyOn_DhC{7tK8OnHm z@;>c*v;#hMu4+0shkidV=TJ7^n=;uk+Mmcpj-qXaiv1i7m&r^O$?*WYmycj@_x`NY z{rm0M`Ivg|zMI!O_j!sxQu{Kud+A;#AWEALX_6p<^oawl+@XJzn_s5)K!zPLhUO;3H<*faerDmXJ@}j) z032319Ydr4wZt3^ysU@x&eiqa{D?HMoE9HgZ{PKRNaM#NX>MoH~Dg+X*&at#j`PWq~%?Zy6$jd4*;78E|=Rial%gV$Vi6!{y_E zC3Xp;iI{ENp=88|0!gBjyc3r$%~d+sQoKX-e;0v<4>erqfsUo}To8_H1IYG_`1E%| zWF)a=qwW^^?bO^nYp4DY#7jB(~iazDSJa|CXUHC-&zxH6Zqk8P|ThHLrpCswMwJiPtd(l&sP{xtXVg^O-}q!6F*GT`fZ5|7QnSJn`5f zJiI#>ziNiHw1_ZLhAs^@#qZly{~&Mj_fC3+2zGlNRHn9EK!=#7 znN@I^f*&RQ3G8F6NT_7zu5^khT4lzrHBc zCw7)+&1b4SDsD?sLMXV;%mpbp>aUa}0Z4pNA*;tExLeJf;`x>~=#Yx`;8LrmRhoJ< z!MnAQB_-1oOj)+qxw^E(3%~&v9sO9M9xzKpJxA*@x z|Nnoh&>`CdEMp!Pl?wKI?1I6dN}TsFHH|K}=lYi}kgzAVspLK;b{n)BfNJjjPuPa_ z|B>}3UP zwl*$D&h3uTA@di_jFg`ZFcNd`&XO8$*#^dMV8}qu`KZJcMmzZjjiyWV{Bo#K{jBbZ zoDf0FhiHOr-;i!HD{s@Fw^E8l?ejX4-w&b_Zm)z`AKQ`bO1$;iB3Fyl(}3ia}Nd1S!-D`)@DDdlPxFD9BC^=zB%)la_dvy}(ijHk$k zVLyb;r!*m3M5EyjZuPhEpIiYfdBbQeQrEJDi1+g^v;tvNAJY5`-+kUijfx?b(nx~Jya);l%*`|J zH?Q)-NfUWFf!P1YXNfU@VQ2lC9gGNiJIojssI$lf?Bec3kWvtR_8&-+dyx$+9(KLL zUDuQ%X{_W_6i`d2s@hGpG!4S4cUFHW-E)ITWT*kJ<3NGE!#iujKW&>WmUjv@W^H%2 zYP@qrpnX3N_gHBsfTNl#)wt*S_)n{@N<|j~Md1 zL`MF~0jGsnD6MzuW#Bd->3Nv8Q{i9JMdmLNo%H**Lmd;?lT)VlvZG|2 z8B&+LEL5+ngQ`B4eTmXOu`(32+>$Y*@z5H1fl=zGOdF}6t(R4peUSeVlUyv`%_cfd zU>~89oh@fQA0)8=|1uGx4V#XiSfjbH6%c_O?Ray-OnC<7DDY^wgZ_+>&Ij#gE&rp{ zOr)v3%FInv3%B4D9_Z1J(y>eaJ@z+JWgjSr`1_Ya+`(Ly&o>U~V!tKr(tQ&1$gx&@ z%!V-f3Bo3r;#>H>(a#IvO8p{&nZ$;dPno{1JV~+|dj6F@SHF?doaswhSABdJvD7K_yA3l~FjD`z>!SFQP0$U* zOzmmfSP^ql0jvFQyRyWNnn6EoUK5>M&wJnA+@j;PO(mwYs6_RE_gPH9Wc}s3yh+)2nJsPu3>?oFqMPnN1ImMc zX1a5gr!4!7lC$tBr#}7yti;jtn40XiS)$Q%B99EjDSZ(PZaTRYY5WU|xoCbZfJmg; zSqQ*x*z&>XUGt4!J$<@8aliOK_ghzN#2|+ECfuL<%KC%-WWm)+bbvs+MtfY$t!8F< z>GNm1*3&)exf8A%_qqIj6L#%#{&Pda)t%oVXNa%scXKt;{g0_HE%jgu2J?MxC)3*@ zjog8m!%&?@;_E|3bKW-?jg*N~@&qoHRq6mYJ;DF_A&P$H*rzp@2^u#KAZ74 z2~@6A$?|UE#(ognEhm=y?3|=FYjNmA=USgYbW#v4nz3(eCdDXjPs;H>qf==0Xdtss zRxR>?W*T!05LWgY@eq=G>7yJ@>7m?Z(%ih{>GfiD}L3*I`ptw+YQJr#(xIgh%?de7cnH62M!i z=KGhhVNZP)&a`&t8*ybqPSa`~#X(Z-0iz=f0DQzi$$yeWwu0S8PZFSl=^%cVVa|dp zHA&4MnD8}=!M=vaAWHO0#WLs2u@g|U8&!Top)_c3^Ixu-AdV-dXP>t))8gJn90-H^ z#^EEP7vF%_k6gwrY7q@>f6&Ohul1tqY1ZgAR5{lU>GKF-{v%(%5_JJlSoS0#TQuxP ztQ?(eVSkIfMEE>gd6BAd-1z!oP=?pTNSh+G7wztN@d4r+Nj1Ut>W`X_YLz_hL<^nU zFecTWsHH;mMeg;-s25uCI6)q7hM2P*CLcD7hbVYOmqSTmSR9?Qc{=12@{O-O^fgBe}BC9ooQ4Pv;lYx#N|1t3#n zN^Gi*8iY5&;|WSdw!p$AWE5tnbYFvpUmATblpfX3YplC>t12dUW1%W)Q(L>nGsXQb z#eZ7eF)>-ZHoT#Iu^H(6$beE~nKyaDK%7yw6o|{vFrxN}a0;M7qrp{)a7`H{)YIiS zQohu13~21cQ*EC?`WrgpM@9ygh@cC>8!MwPS^0 zn{rI`THY|mHA$29n_~-CM&GoYK6-ao?aM-5XB@lYv-Dk3mPdBoT+{ z-Ft&dw|>C@{Z1KeT3y+QV?(xIe{7~Jq`J0|TaR@&Hmw3ToL zjrf3lLfq}|HIAQu6jBV~E$e}VS_~b`#+Jvo9JOyHmZ!va!RIBi6>G=bUabu?J75(l zM9!cac*gY0Jh^9&j_GSJn0LRX-9;R`Q>K5 zGZ7bLz%!MH8oEqy5k5PV`Dd*d1|eL1IJE}^VoK(Vf_G-=L$IFzF_CPSe-4Z9D&OI{ zAH)4zq;K%T4UOjYz<{!n3QlVFxrlX(SlJ3Oe8|L#Z#UGs)kL8qs3#cu4Bl*boTKTD z9Xm`tci!p92A`+|V~7RRGQWkc7YnxEAGc8xcN?DL7IeK4Lxg#Q*QBfR&=dQuV79i> zpLi`$WVeI&S=_(VBS7PAmliRmZ?stxCiy6MJMjLDmJ5gs!4ICqcKL_iR5lR~ZjJh-v9y&TN~iBt z2V3*Hvl7tDsCef^7iTnR9`xa7v(BicSLW;#P|u+LYi#9ucp}le!8iGvMpx(^+6Gz- zqZ-)U^5)7633%K>M^IZcWK=%wDh$MCkY?$xDD$t(HsE6x_N3wra+O504Mn6Gf#7NQ zIPL^{V(Sq+X`r*&4<>w9ri<4N6(tf`4aw76T?TH?(buiK*f`$^!z)Z11XY#ylxKh@ zh-J7g?|~R|Qo<0&yo9X_ybJ$+Np0ujKxUTTh(4n@75pILtCFjq%cJ4fTiHzVrlSLz z><|#iFZ*T`LS4&iN9JaMuVz7`AI`_3;E9i6y06fGIkR@fY&@i`{BL~K?EEDrqM3tu zK_Z?o*hZP9S9sB(HxDXCEHp*FFAG81G zerBl=QM}wJLZ&+JEQiR>z8o*157kdo?J$Zx&jK-k-`n!UGSAFblIGG(g)e^**j!}1 zBi-46Gix-wEcy|3SO7Wen(_{NEua&-Aqw~_KW5&=z{b_O&M}yXAv?&>aK%PRe~&t< zGpk9?P&3WBrfkSrPkm6zgRxHs5oYR5Fo7!kc4q`e)+?(0i8-TQ;}`h`+pv zot%#z{EwBB;7p!VD4?Zf^7|AbQ~lEGi`>Q|_U1Ef41yO50gfEd&&MzO%WQo~WUH^5 zR>O^;T_2ra1(vvfmqwE48?cQ;FUOF@AATPaY`D*9DJ#2Hd4M0L+3sx1OxvoS^yxR( zJ9rkmiBrr!QWhOQ0>V7F-*L)jXQI7CZ{9HqSyaJck;x&yU5~FZ^C>J|qx!PL26&R5 zmbp*56MZVxADlOy+2(>tJE|Sr9@%SfZ3cb~fBo$o2fV#GVnQ+Otz%$27`I(hPxtiG zmocK^P~CLUfkW1x98TYx_E~Nrrd$RN&!||b#3W$X^1jxYpTRdtuZc3Jzrbj)gAnpW zYI6)|987Zx1zBoKgFg^&7rAB2k#+KnujErBPmaaO_~(j91;HN9!wvWP3KQUnpi?VZ zaZqyynkK55#{j1>w)~KTSR*n!f>!c zVHeS(m1}4jz(@oC%P!w1Dw1|b`YnksM?g`t-)1>~ir5#W+4;hhly?-H6GZncqrht| z{V+TET*0nZalUiZ_>FT@aFg`NK+@L2I?{n)oZ<8}?wlg?+EF$?JAr}=7MZ2uwrCFp z5+h*51+v*eO4PdwxK0Tvs&iy7)tfV$Y~IzidYAO-_h=^H)LUA>;`TSce~Tm^QhHjZ#o?lncjPsTNE zM@cc1HP(`2vw3(}$oqsdRu9Iu!Ngz8ikxTTa5=}?LS9cY@iPD{k+3f?rX4kjUe4mp zS~afFRw@thp0*V~jObQps*s1O_mz1q%Y#Prk?3;R;q}>6 zs-myC>5E^C8D=(y0oh^VzUejI&RHQoa=l#PIp%dWZPT4_^!aw-<2e`~Pg#smd!ISfyajb=<$ zupu41=RBldSM#h>RNO246xqo;1Rk-7I|H3`@%$o2R$l z8yfher;NJO-pj7ZNH1DwxvKmNUy%a>1O#>YQ^2rd7aO&1COPkzj-)c?&(6@YTNl#B zF^vNAO#Pa`>-HGvee(X^ye~o@l#AglXw@rK_3p`lTmi!6x)k>CkI4PYi?W|JY!4e@ zEYc~lSVZNl{@9Taax$k`!5=vx`&jZ$oKc`LkXe#zH1IQ+oKUs2cMGmeb`yPA`&I6V z%LtyTsnE1IZ)u!${*sX@gDk-AF&KGNwRUyJnrRPtbdDlFqk^&bQZ|vTllnabR5 zEuZp_oKn6;R@h5B&i9Nl+h^7XkNS1ag`B^VWENHG5w)#2!wqDDewVGmxn^F)=a|sT zytXnV@fitBg1S0rMQJ3r=%dFqD5rAznsp#HQzihXyOHf$HLCIm+~X6j{mGQF-@85} z_jsD-r-Yv7ZR3nIsMFxF+T&o%jW7P_A#_h;(4ZA<15-Bg=D#Zz$Zk(Oq;z6O@w8&mxzccg>;8|hP_SsWr-WEMfxO0 zPwfJ4dGDn|wRJ7zI)a({i$i)&7u(8)t0#w_$+xQW27Q5H2Sc7~l>lnw1`PZ7J;gRW zEVGx}+$uw`qy2W*GQ@7hrQWXtM2(RXokdQfgE1g1PuZ*S`mOu)8Va2Ze)$Cx99{wC z)u4#aptjqhS2UKg{HB)E>vF(%XcK))GANK}D+PEe_n=1~(W@3M0CBz?K5sWzj`~i3d+E?EKL6o{Cx<8D zxV~Pyp!KD(3D3rHJK!1gH;@H#5je z`qS1QJ^X83_nv-4jmU!#+wq=Kjful z*rER}w_o}BoroJqYSLJWAuL$va-+nWOn_ZB7VZO@KxP{fPJ8vnh z*Vqa|3-3EXR@-B><7YX8L_9T~_eO2KMar4P$kvChFNqATgx;f87YM4^@S zpZ~=gUoiGRuDO^6gEq>cTw3Pxm-d`M0?bKnwh?aCL4aEsL{2AH-LYk;y2MY0rCXc+ zrvR*#2_9P!il0L3k+!${u(yXB(>7und($v^V(;yM-^0!_ey$OweF7PC^CE5AUPzYs zpz;7Bh&Dt^9Ur$(rwE^;&Ngs;4pq8k3s-j(a2TcMG%fjd1g|LChD|JPu>9l7+D;`2 zCpveoD4RiSmDOM*LwYX@Ts3pp@*kR49Ya$ecIC(RyXJb3dW+s=li#-P=j>FhJC$y` z=4iBOf#5NIFzIjF&U{G4Wz0SjK`gd}#Cp-+;Vmwh!Sj%s>lDK?NiXe=To8sB0x1ad zmu)8SPNFtbb9bgOpt>_5w}7sm5B?p()$I5tHiA%K3z^16Po{%q)!$3fXDlEDkPK$2 z3H>_-0ed)PkhU-3q4fvfJkGF2-g?m!^O8r2k1$S11m@G-F!DkDqV7Lz0#f$cT+*J| zI(^bCNAY6il{PN}5KMb}-OG(K(Wwui-V+=>IGtzvk2SD8z2#H!dXh>=w}ZAX@%=v- zynL>D79%O@B?k2CSm=(932tK2PF2D*UPiQyw*ijo$?W`}% zw`fH>;{Vnh(VU7=@s^;ylzfX5l=H$BKn0sYp0l2?Qp@{-N+}Sv>oer2 zf|W$j8LarS%OE0F+1#dJ-$8TPHs|R7I>caiS!1#O5VK~>0b`SpytgBb+5IT*~ zL*<6+AoZ4_2@UbduAT;9fgXpZvkYR3<*HTo1gyef>VL;%%l~ZkzrnE~( zr{rbkcgsQx(2-%vwbJ=t6U=+dD5Wb42XEvD5NU{*8@Vgrsc}xrtRk#v z*ccckwGQeDWtg; zGg{4bO4OYQF`Jk~I_wC#!`)DJ51~K^XY0r(P_3-Xc+5FPLtnhDy!{)oC#L&nsWV_SXI z**(dB{~PRA*0HwCYxb~tUDw&F$Mf4DGf5VcZZ)Sqs)Y5TRRfb>jYZ`r6JMuNb+-He zyUq9G;2$>kB|~FAWP_p9{j&4+rY*wubiKDSnD#oDHU!Qc=&(L%T^W5NB(uwLc+N!m z=I@UOon7}NJDLu^BhWrX-(t)pRk$LAEcLax{ybAnUk>@3n0mR=8oBeF^wD7Z)kq`X z(ZTXy=f$MXt+a>=pXf77pL{Q06Bh@M^u;+a6kg<8zLH;Z<_?&Y>9==p(WWO`2D-b*w?59!La*rQM>2yuS4iw-yBbl-0Z z>4ZH~?H;idnwtqe{2?a5NIprl4$$lsHFZaARR%O_Z>CjuJx#4L7qL7!e3;6HO=Qj* zj2u1VZEU>(!l7EU)oElHHql8Abk}(!PUvLu>_1-yVb>@llxZVfEcO8eReQHADfvuC zs>_SKuJW41C^gl4_Hgv)pq92*6J^Ah{bLJ-_I~Xa1%lJNmeGo! zy+%gM+pB3CV;X-oO9Wj~q_1U=xio z3wA{b859At$v49U56!T6Eb8Zm%fPR(*{DR4=`B*mSx&HfDhhEY?4fD9_%^p4o_<^f z*dp6aRm`C8-U<81ky@}<%NcO_!{btw_&gJjI@{$9v%#htl)2JBcecZJlQtHAsfa#; z9Caj6@uzThKWGFq$ccj@DCU!9=RWkM9d-YC1?7Y=JTEbWbj1EbD-EY=4+1*Ix1=u^ zBEzqARUvVQ*ZqhhDm`%{`ZK3wAEA5OkAK7StYM~+G17!9(kk{1n6WQ8~ZhZpP;8i<q&v-)m!la4KZA$f*JjW<_7}Y;)Gc`HdVmak@p6{c za7n%8L+l-YNVlg&0B{f^Ul$znX9)^@>AF#a=r6T-}Ph%o^#Xh>kb@-Z`U-w>4UMIb-h@D zObfe2)%~9CbhWH|azpB%K`TyG%oiUExprYNNQ{Rwpupg z*te&~ln0G~f^MyxoQ%j))jXsp=4h3h z=ahcZIm4yBNS4#hC1Wa^Z74co^MkPO?f-(z+;?3^S2C{@kVmrlvoufEhxkgMam5?$Yk zf20$VslXiI#+Nm8t*!Q>Wv*oY&--4F?)4do5{qP9`$ywPmzYSMLj9V9XQ$i`K}z0@ z`Qn7i*N1Du;Cd$F51i-`29+34Uyoh2QpSNFO;0_kHk2G1&4kdck-!1 zs0C^3-Apclig9(+`iE^6+o}r$o8Me5|l2 z8)&#b8F`WTJvM6l9S(I%3Ai1ciMVnQ3(?C!>qcFqEzHJ_D|$cK1&=_IuieS$eYXAE zTu&KemjdJBe{vb!_pII1s5Q+0LNE35prUR6U_{RRd6}mLS+mn=e^1gG`+G&@*g z!aMBNs)N@*m?51-+YHr1XCQzH`E=(5v=;aEw(9pX*;Hk44bfV=fv!O)d-&_ICTm#2 zyM&jW)1N%z#n$c53fmuW7z(1jZ2;z~&AT z-Fqhvb+c`y#O++;2FNHQzS4gn6F}Ul@mw5-e-Gz1lM=2-;PD9{p4K0`+rVP%)tD=SpH1wo zZB^PB=j+CxJ@Z6_mZlFr?40yZX)A}mApXXR1IEVttk;zemenW*$P)1L-r@|0&mnSA z(86-~dVHjyxq5cw6d@u2`q8=8z83zof3dS`k}vTo3HUWJ1j5ZtMOuPEkv|;Ravt;VRc9C&>0>=ZI=Tk-ue}S2jE)Yo_ zW)0K5JR}i!SwhRO1x~Z5#-(d!>xyirRY0}TS{zTez+t{~0cqOuM9ad#=tbFBZm zh68>9u~2RHi(aYquAiw2V2ZUa-vvB3=uvQ+WP6kR-x53!C+xd%!a8Am?)8xv#@G?8 zY_16A9}{54E}rwBbB(qhKt%gPRu1KQ3Sl=#)4<;w4|!s~4Nu544W0|=`yP6II*=_c zOQ8T5eRkc;l`!s3m z?mfGz%~l}Xkq$Zhp?9Rq2=?mW-h<%t7jLz}=DV|ZF2Dx!5K{-*C!m+Kr5p{ue`Qhb zO4KVy<;62zE~s;;4jc0^0(+BhnUc+Q{IvIkve-yk;9l`|VSXRr8rp1N_!LmowK%Tl z*rDZ8>@&qzahB|dMKAx);Dsq)=YTsMF;|Oh^+F}}Z!se81HRbPSm}q-ibK%Eetl&d ze9c=Q$ll#v$mPli{wpsf+ZsA+b3S)l@9^r-K?PVSn>nti*f zvh_UptLqh;;et}?^}7DqM>ej@7VwsHnu)6gj5QrIlhIcn?A5dk_{978)orNr4 zgtJSi1C|3?Jr-xs{tJylGh3mr4d3PPKf&|X_YPZ06r;6)T2@e5YosMC!;E4(Sd(z_ zst1;Rt|s-nKS?q&H%)CmYHkNqf51Til6sVn29~rc#E>6>)Kut{RgWIlYX?`u%3WAp zJR5~cVR(*jrPLNh{QM_S@kxyX#`1e+gA7^S`rs`%J_WuZ1Nktr&a`|0NvjR_Wgf3Y zW;iIrk=3<3a^TwC?lrY4>n_VWkip98&Kl&o(K8;E?jSEu@N3hlx{z zfFE^4J$(u$?L^v*Xi?y}#_9tJ86`8~By-SduZW3#6A5scLodF0%sR9g5Co=v0*B;# zMsjtH>stGl2wJHttC+}gP4E%-dhyGkxpxWq(&GwV0(@Oe{oKn>tuOml#GEwTsSx=q z*LbHat9UJ(I;rxeYMQ`P(toX1FOLN+l&3fl$~tYrDq$a}<6~Fp4iepXn2>MaWA^2& zTP&qjVNs-^c2tK2NAzVOHvcy%*iYdcDxxTb6Q4)N{sKze$Q%+vt2efboO0ikdDkIS zq#>v&g#JEjaPk>DiQsL~EEy+a~@84Ixw@{2OZ2J<)Pd^ep*b%fe%O z0oO`0Gr=qcm92pE{O=_xtlqvn`g1*my)R*D@w_IiRqi-wUgMlYlV2Ei9_0Kcl|~Gw zQEB@M_QXdI{t7J!-fk9cP+XGQZMn1^`XA3e(zw1oJ-*3pBv}PlN=*cOLPKpvp$=5 zOz|_*EVi(I!b{Gp(=(1=YP@g301{_QoF-xVQncjS>=3fd;;Q8(tsS$jn7B#o)Gz)9 z=>dB~7pp~|uT-fycqU)KNqle2*}3vgvwbnZ^KC)JI$*)6$2wLp3^n3C>`Sua&SH`YS zK-tTKLA_6>)QJwTnLB`pttmHp;l(T(uB^{veH*-8EAi_`>JB14S}K;U;98F97gTRu zI{}qBpBD>J>{3i-P_%WtFb;0jQRtCxXOeUh3LG=y@=|P%jjg0p<9r?jyJ&rmU#Q_u zcylZn3c?GE)^6#tK>Xg*r#EsNt+`mvt#dvu_hWXY=lJnwodDIZ>Xc*x6tfA3RY978 z5$H?sn#qLc`+^Cg;b>xz;Ie((6drC03@uTr;wwzG3e;Sl(txt1I`-NqGr!?i+f>v6 z=w3As4v9v(eerjyU3k4XT9+{XaMYv&P%NV=a)D~BqR;gSyMx|X1wQx;_zBjvn<6*U z@KD=D8h@a?l)OJ4W4i)bv14&0Zebs=hyO$9;;YG0c2K)dibH*{MDT{N(I^MwKQ`KO zufit%;U_a5$zlDhFJ!Lowo_sfPWFvLDEj`Er3YIE04i=2m6Q6wQ?>Lqueoq%yIl^M zh=Z0ENN1ME%qRJ2h!Hq)%6SJc zusS0dtRw4_`6NgjQziNbc=2o#K%Y8WFpuJxwu)|zDVm8DsP2oS9vz1wHY z&7GxtJqPZ1)qjfooXzn)gXv@rE8!~0(q^2jueuL)(8BF{9b)j>;%K+*6e^vOc^KBb zoCo`G4T3SCYr>6GOTc&x7==RF;pqT_mjPVmiaQdi84aZ46>(~4Cv7{*?GtA*=&MTp zB=12801|$TfoPvth_}AQis0%(*5egLMR8E^7|EkOr5nckO}GavdIX3&Nq>5@PBDyN zdojT2%aL$J#)_jDm3!2gmenij*r%p~BV|X`&_>}R*8$Z3ze*e_hM&W4Ff|929lIL? zN`gE4aWjZ2bD@%DW7St2b*IeYG5(cFVoLEX(#5xSCJpyx0dLZ^oXBDVHZ5r;I0j*H z-b~ckd9{WUx$HB@{fWndepdHJX6>B!K5!8#Mz1E?ZJ6obdDZm*QNS?G$`Hg}HJlOp z@BsbFK=)2~2=zyP-A?x80hv_n86^H9i#&|8ujwootX;Y0X_A1-Uu(r>ZE1UF-XD5N zJJ5Ja;HQ^YO8*0mw}7dyE`RYnjXOi9fWOfNk*f^L?`i{$0k{4x23B^%?bV_6mWA^^ zA5w^`(t9v~xZbn8EB%fG)w6?eqSW@teCh>@HM1@j`eza*{TYkvHDGhzbYTh$1-93)D=WD{q!{7rgRl`-ZnMz_!-vfpP2pta z%rQvDJI%8{4b=whnzBFc&(i;Jt)qa2+(Pkc^>`$(YB;si?s^KthULFzLhi9Tztu6EYO6(k4Hc{MCQCvEJDI3;a)Bg$1&c zBxB-OF3kL?bEQY+O$2bqIj>c##{A;+A(460)qwhR*mvTQ241^isUGE?wUec|8*|(c zXT~w-%|Zk9h@Te}$Cx*O2nDOj7$GbKm^S5~(3|Ec(ZUg|p8UJr(T@nhmyi<_n5wOE z-_q9TS|G0ixQ?SJyfQyq3+RuU>c%NAzc?yviS7M!OZ3oCB{6)F-YsmBPSU@ow8z(! zHfzEa6@axqJI%tC*7+b(9wZv3=*c@HWL26)GLZfN3p>|%{{2O=r^Z0d73#O=r1UCw z{Yt3+swv<0>v3ERYDM!bH+-eoJ6!zr1M!A9FLQpi;Q@dTM|oC#=@U|?e`r5lQT~3t z!qbqU8gy;p2v6OEnMN;QnGh)fDQvwDk)ekb_f z0oi#t1L!ZcX^%7ZJW#;#zLX@Y_^FX+`?)aS5-eZzGd9u1;(nx&XS+;5WPcMqe4Y<6@|UExj&x13Pz1{socQm1 z>fx=plFhTj8G*e;w0R5y&;8kR(WJ{a>XF&fK9Ns~wN2wMCSm)<&x^t7w@>2)Q-pY* z2k4^8Fk->Bxj_~YavQO8}+C%PjgyRboXWhGEUr(j33Z0t;Z$Q}_+)(AkV$y7w@lD)7Vzr2O(< z{*x1|Ck~j#axk*?{tb!h1_2M>GxjHYzi&(8_KDSIQD-FG_OQ(qGol0BWBFdL=y?^I z%CU@YM{T1lKccwW@>F7NGu%XIpExULVo7Xcjp2;K=fHD>^%MlT?qU|%@w1>Qv=`$E z+a8lkW-1}N0P9+3N+)RGuCpLP*u{22Tjuf*_UE@?uUgjs-f(FwdCikQQeqak_eKn_ z_bp$_$NuY)%aXTA-tw38#CdY@3u2dFHty|QUIELm-zI+Ausq<$gQ+VXQACYayD$0p zKU@AJG3dW>;b}e;q^ZH?2q<=!|lz4$)Nd9m5xRo$zh9`HWYw$PbZ z=6`1P*=j3_qGSdIR(V|>E6Ib+YhXrq4?lHZ#sR_!aAFEvhCT&@>0Id#9T@L%Pb*r| zoX5P)?lpdR0N!tnaoSs0d~0K_hnDxmKf{0@3zc>udDm*ofZv`@$6k~iXU6H3vRTIt z6xZX-=Q}ZSQV$+*7-z4S$I)6l9v`ygu9F4kAH#!bNb)c0yx|S`22bjV zGv~L$NCD+5Wk9g{u~gY3s7gA*IICA$1d=u8=vla5BcE7^SB+n7Bk$QvFW+d_!Ep77`yLWcswcHbR$H{YiO!+ z%qS2BOG2-ub~#*?hpv~r?|Y3M*l7W3!bzVwMi<6)64cuCfs9!8}pe^+9u$af2E`pu#%g%OzNV|E@HOGz0 zZiJqx8~oh#>1>ShuG#B7kw0##{#iX`$k&O}4c!rEUA;egS0Yj4mS(87A)i&Gc_9p^ zkfx=$e5iRe7#ml%1imQPNtVQ^F}eP5W!9R^>}#eSqn1GrjAqT@#zX97~8SB=29w%De}Rzq;; zbW2ptLlA0!?8B0;{6fujZ$`!zb!I~DIP=)uU&W%;cG5zdNsbkgD`3T>%p;9$>f#6Y zSW;18%af~5C@bgu;NpTxF4J)H#YjnNFEM$RwFCTp2D7{_ePI<4YYXBkq-BA)As_Mh zWCTJYrO}=u<>HN0a7>0^lO%s^a@J}i9`jwJkCTfGy#Yb`DTSb(9F(}mUG%den$MyC z`anrp1!u=&8s&EbKgO3HHNCz2LXD&PtSrIC*tLZ~QAHO)c3=lXb0IL%Q(CfO>h}Qy zEcBoysNQy7M6HA_c5EiQw%J>!hQWmHEi2oNo7)j9f&YE?<%y&~o=xHPrc!@{D*>K56%Il(uT zwr@#_mF+;caP~ryz%KbA@fLX_CuXmqXg8eV*YOGv4B+_mDoYexWziAjZwiYBr9? z4nTujjJu|yubIxcY&@N|RUg+Y#{m6d3`kn&TA_a4`Hiln)7|d9#~xF-9(%pA-=})L zM#hkyy=WmcZ%=gdeCpJ9yr`((e!lb8^WNxUMcQ+G!arCD!yj06|J<-!e-0`a%mxC{dq`ME%{i{$7t z(R-H*Tb@2pUVeHNH#@Ikh>Mr*xL-#4=)PZ$!(OfXzM+p8fcdC4og-fY(WuEX^$C8sQsu5M<3Ittt-`FT)s zWjbx|Y@;q6NQ#>|BrRuc@ff_#e~`Xt;mh3+-(eC6+r0f?;4vW9Pmf*Q_!!f95POdp zRpS|0g@PK~GeGCsn3nIE|1B#6hz+k(FE{!XF7M5jzA?+Uihh;AzZiIAfGp#`1xH5A zuA!?NcrSHeR&1l0Pj$KA^o7v75|ub68#kaB`+}L&C%n%imsR8s)NnF2kl?~$6qnQl zicut0GFREhtD_dPUaIrQHeeg{Wkx@aC zpUyG4_fuCGz}9`Cp7YOA-xh0RS!(8pPPf6Es6-pY(Y-}BlWI06Z1hzd9DLtCF$g) zmR3bz=Q~5W?pZgP-XFNrkbQ(J52rUL#FHfbjq4=CW?kz>>pTK2+>?Of@p48iDwc>_ z%$gXQS~5sKY<=98GiXc6nxfhxR5b>X$1 zc~7-EO(4XLrB1EW$-yQHpFcQx$W(VFsn*;kiuH{QXuLn&*N0Sa_B_Dck63m@ZUq49 zG*yoV@n>kLIn%LHxf9BT)HA8E+6n3b?%aAzaB?JhdW93oZx+*iQ1C&chWtvbo{ zM?x{;gc5ZR`(5pm;?-2UxRs168k)$qOArRo?<(~Quza}@N%V^MY8e#@{1if$RYh?P z%&EuT{PaaOpvS^J88F2T=ejcuFd$_8ZCX&*7goZ!*k&*G)?9wJN@P{&j3dn-!sVLK zH(!DcbkI`QxSGym^O z<*~TYIy!aiU~~+de41`$isX zt5O{oqb#ViQ@;G=dWu%PPDwPypdPdlwuYoQW|e3b0mswyNqvOO$x=B(vU?pjWX7#P zpp-;CV^b#=A8pIJ?^_P^aS*lN4LLqjG;S<=sKz|P6c`~MB2jA>-0LPW>NyNtc4@;f zs@q8S=pzBZ!6k8Ef0Jwx;HpV`4x zDwV^8kkgWL4s({{ijd=+=eQ+@*@m%$*=F;7U*8|UpYQ80aARJ3Js;1<v6a_mM9<9*3nCbERi$v*09#;1&ADV{>s>I6Ej31J! zz#TsySrFx%zj6rS{4snTu@S`~yD$~5ceY&?E?0Sk(xS6c)aR9l*)n-#99kx|8)Sy(!>3EAJifd!0(X}0_>Vr7;M$X9JU)SVA-`T8&uu) zf$AU1T#?~2_%&@fjfRWzXg2VQp635pW3VH@K+W);Xc^5tKv>QSR6C_=w!wR2ePvD- z2SGj-H0)Y=C53P7fOHOxoO-o!N=NsY0#iL3Rkl7`kFQ!bh>;pB=z zGsM}03o9%;-Hzu>g`;U~s*`+*OQ1QhMS>r(io=^5wSB~iE{Ae*6v4@>jUgf4H5#J> zCeDrsla>Un3#y6=)E#QoM{%9cCc=Xb|0XU1_Ap>q+-nTjqcQW+vr9SNi7h_s0|ovm zX`&i)Dl+D?J78pQwWkQpzYf~e^{1_eZRliWK+zvbg+*(~%OId~OA5#Dm8l9siTM@S zzX3}-u?hheOZir%D|~>OgdHOD#M@T5JO9&DE7to3J;giMTrvTehL%pqy+D@r)=QoZ z^tq=O&%yjT6(_KXVRe(RX!WhbIl}780n4(EsCrU~gq-0mh!jp5mVI&IJ>+R=!uo4S`-u~Dczc5`7?0mu9Fy|9aK68ou%=rhkKn;v#V zyz{uR^*>}#k>-i`>ZV8A1IbxU)=GUjPi3;wCd~`;(!Ssg>uX+y%b;PyLdoL~*`F-3 zG&BkM>+jB%T?bvX>IO2BgMsQ3cz@l@XCaWQ-^XzhRq2`yH5Fp%EZ=A2J_OP2-jmbR z+^AQ;hsBoWy7v}(^fq{D+0{PXoqZDSmH=Wq52*&DXZKS64iR^DVYoRLMPB&b#rH~s zn+Kw}e+J>NPb@Wx^Ls0P19tB=aO&3g-acS=CGz&YbH4?3RdBcNl3IABUlGuVQVzi2 zTI2e2A-z=(am{TonE3eY2Rz1fLl#Wl!hDlpremCIPWXs?tG=lmEB1hmWutl8b0(H< z0zN%FnX<9F$vM?$LUTp^Gv*N4PnZvN^DNO+Q-?qNBQ%KV2XJl2;)qnJFi#7if@^RLuXL!*509;l zFlu~`CT~9nMG=hFmexA=YFOc732wRpf)ETe*`nZCa0u$pMRjk?9YGD}6S?&9cjiGY9^%7HnF*~V1d}I(A~kpG*LS@? zYP<^=!jP@Yf9-8Bd=$GY42_1lG>3a_@*+ej%LdRWg|OoCp6cT?l0Jfv%}^?}q_%OY zA4TooLR^-SIfV<|tgy!DH8Eqbx#Q+vJ7<{2tfKIzrOggwGEp60G|?4P&^+y~A+U73 zrbN%IKflS_lPy5xZ2sN%UVf8(V3I>?d`TiKKAJ$FHn5aLJG=w%daRVBFYP!MFtGQ` zv!~J}xS_^xuOe~I8`H>b-zcLQ{ViZf_&K&73S1Y5^V@6I1Vx75ZZSqD2M581ZQKOB zDSz+&W<{mu1;tniLD8K|>{g!{_1q-=U+uM^V~%A90Kk|1CW#7x7>oV3lNJ+MRk%!r z)qvk^ty#k5^cIbAqfflREO#49nb;L9e5SWT;C?6@mM@l1_(yaz-R)f6*o!NYtjBTn z!)Eo5`x@5p#IPGYow=|7!3>WmZhf+yBfb*mTkp*#h_l?HLoh)Nw@$sqJ74j&0ZExAtw7_W-4A$zLkh>E0spR8k# zhV%Poe+bFS#EwXKDZ#ZZ-&^y4LO4NkjqqaOciPyqtQ2Gs8s`r`(uDh#kNl)-RN3xH zvz|C$%bj!e<`wjjNNYT|BX)}-qspgXVKEHcyKNqir(+5=ZFtTd$)cuS+O+`liNHU@;Qc6d zyt8~BY*DYj!I<|;rV8Nb3$XvDLF*s(!VX#5x#&*dEfiV>nvnOf%xEVwM5#8R#YOvi zv|p@gaA(VM<)c|IpRk~D4`%aCgB^I(s9ft7pUw6>);$~vlT-{(HE_Qcx>D?tq&vsn zRD~*|{~YjcRJYQthB?$d`!j;&dscbkQt*nV!wOgrI>BU6HoZgVi>z-nn17|bv5r_oEY=LsVr^iDxBvds=zR53P(OtLiWO(xFYDSXVD{kf1Q6C-3B zkDD)l*DB7@eSY#JGOMRk_{HaB!+Gn)>)XPA-1RL_Q@igLx1Dv_*aAQYfN$V6J3<)6 zQOlgK2wD*JQeRXs<+fZ_&*9N+j;*F(!Pj!CVq=s+KINY>tEDsqaf$Tyda^Mv)i~3#ODHIPFY=*PKde!~ z`qw5lN2fJoV&kn>uAKrytq6(yek}BxFKq~-BEG^jGp4V*_N8%WYO-~2S?G$Od#4+? zL+)g0DS{dBlOSK(g4y#IvR+DN1meqG=kk-xgt(5dzFJ8UN&Xf($0u?!!qY7^d>wM6 zJMEF_(7TmW4ZkH=rjaff<1Jy@wt)CB9bg^u$uw}%8ux*{Fh1SzOB6O-YkNrlS1U2* zn?%W88I670zMaT)w?D1WBc{VJa(Pp5=8~Zm>4ss7h~%3sVnK&y&t9J)A@*;il}+cL zMeK||8-UrhCce(acwN$H!5Pm#=k3=F`yNmgd|snrGr>1qdi7|qa}y#J>LtSqIUvT| z-pJ?aMASW=0@w&H1wo6V_R*=~qe|;tdIXQxnT`aDky=rn_`^E2ePZ_2w)R9CQAlC8 zMOug591oynRg{TUJ`gr+!LPYqki43&lS4X>-nbyYs! z>#JUcaNw^9c-=Hx9ooh_V`-Mbv*aabHmwV+X zx(7`j`L$c~?~ra;k44o@1V|-IrvIdc7w&ojQDkW2bz+t9)>ThzL7VX}Bo~a6>+tD& zMp?M*Z>$>;k2Pybh+^^Ka{eSesh}(lCw9|Jp3b0(9>hVRg};*f!QFt?cg_l;t+%JBDryJN)5jZ%WR+SeGi^Yw+Y9 z0Xur^n8g_xXysn6JNScVfWkeqIdRL%zAKF9`U;Bqn9>@MyMW{{&&X@feR_HQC%~eN zQibugXK{)K6L?_Dh@l~7ts@#Phz!FQ&T-w~VV?JW3?&sR`hfEAz1C<}PL8wBIc#SX zRPfe!(vgyhQODyQP5Y|N2325OV4Xr$3#p^Z7nkfPdofWANC#A9MJPm0&T zG;IT}kOXh1(6!AGGw4Z?tY7xlb^l_!Nmr@x!pqR>MxG@#cO8utHLSmY^NK8=%_Ou6 zPD8?)@ME@Pk81CnWn2n>;6yy7_GrU~Ap7h-uD;*O>p;-5@I}Pe<4d^dgjQI|A_=s# zQ%O|6V54D9u>O`|{mXFv7bB_@DmZ9w1O=KkqFQ_Ht8Qdw;0#u-gB;}Gon@n$zkwdOUG1iiPONxLu+N*Yrh@6n5z(N6HjEHaDFO{O+ zcmePdnHg_=cOCB7uZ+l!yOiQWW%IvyRYYsttG#I15G$wm(pGWn-(0z<{|rRntzW7% zTTjH#QuH6ApEZ!RfKAW0bsaFzHUP$zwXBfLgFsg^j?E)@-W)Ea4W)vw+JXjM$_V8S4M~B)0>71cHZ>OmJ-}&534ukjNNZbuUKAMeQxZa98fO% z<)glaY3Y!yy<~#C8hmWFQ?;7e5NZ=T(gscnoMTOr2&Y7*hZTP}7~a4FwOUs*w-r^v z+_(&2E(h2^3$qj3f)@aOt-zS(=Q^h%toA9k_0M;(xon-n*o&%${|VQ(JWwE?cD7?n zsH>%PSE}*MSr{wr5@!3C3hv*C*7XQ*e<*Wm2=Fto3a5UswT*gHq0My~w}`bJEM1A( zdyb92Ki5VNA~Kf;j5O^F!obnPuJwIU{IpTKml4QSogvhr)zB1aU}gN`K7L!LS+K5~ zO%S(aWiP&frYzT+h0=$!WXkUA3*KfM{Z?An#kgZK|H1d0Hd8yet-T+0+U$X)oafBs zHfO$g?%+E2fhZgjh+e7in%XF*Cd{-_L^G5}0QKdywPgsUxNN26e^wJUQLD}ZyLGuyYwePONzRO;r<_!tcFOY9%k#jB^Ui)RAwY;90D*|nUIjV z(|4_F%FUzDn;2d8XCCCltCh^y51l#3zC9-5@9*a-A@|qU_-qOwJB#mfdTI6|wK}XW z?!wIx?%h_#aZ)OdOT5MSG5Tx?$cBzEEdtiuxy-z+ki(H!-Vs@41bFQE#|kL|adUKp z&y7i1I0HGOH!)Pm*}aIs1W`Et;Y#FL= zg#%k(ljyDE_LTK#6%+CWl{b#Y?DN6t}n>npaGMFVFDaeOAW{%LPe>haF`ULr~ZwP}jG>GLac zZ1EJ|(g7Uvm%G9PNS@7*T2#Lpp+9)`#VcTG;j5XU@*4(cZIy@hET-zX$P~pb@U%Mf zP0{9my5~Eil0@g`X4y|x^IBZ`h#f)jSCw_FtIyEa7v|#Q)|VKqr@QmE4C$eok1Qam z;clTcTjvu69eLQ>c95qoZqfb1Pz7%c@l=hqJSx)*5XH9WRFAx`=3!if)m}EW&oaz} zUt>Ka;VvaK)DW20Uu-!_*?wN|8j_+B6l8&UASYlCMRx#FRyoEQXAVcr*Hy)X3r#eD zs0G~4uw!{)`Y(2y9C@=JxUv9y-z&nl&@q?vUEoysn!e=mS8t2=79oA_;{5N~hPgPo zZKeKUa&UO6H1Z5$*oDK6WIlIrto7dA364n5l}iEkK2Kd&Tb*q+7T941FZ-iOvu6mO znK+q>2jV8+Ylr;7V@}&=H6v8Cnhb^L-m@@VxI;AbSP~f|#cX>#U4K)Zd_hwb``2o6 zM{D98m*Tq}3$p5!J~{AQo@rfpU)tJ`%y#-Ixx~B0Bp`Y!gbk_gPTc#`F2|7dHjPsd zSonStHXwh!K6Jfx?aOv}fPh2ttN+g3)|j5}0A$p>d!7D*fP0Kfh(c1U6XdK*czo#f?y>I-Dqe#I`>!U%qhg&165WT+61$!dK<$i_#T_;9NQlfFL zN@@76lcu>$(v+9Cdyo5}&|@F0w^3WtxQ~l-fDatjjSer%PWz-CEG0;TM3{sQKb?!f zzd%yv%CtX<T#&OxBEYdx;%Bc(>oJR-1k;5hJn@8H@aTjj{@aJ+` z=%MXrb|p#LMeC=-6WvDbDvm^$uNjn>4S$flU^!+`3hJSW;>iV@4&+0L)QT+s9pd@* zh6~sz|L3gJ`s0zUdM0?xJ2-8(TvSJ%HCqz4aox;mODA@4VtUQsH?C`OF7T7B^%szR z3@7j6rJJL550=?`V5(TuMP`hpkKrN)cL)9i+VEOTo+~ibTO%6!Z_2(aX1{T(g9e5c zCXoBIsfTtRmH_w8?!CtNwriv>m6Lv|ap6Hw~sCM7WEHv+RbEx z`ex@JPlwcSCr?{@>7(s){3Efk5&7DN=_wg{v(c02e%8xP2f8E*!XFu0&XGxUQ&+7$ z-vWT&ImHCn`db|UGy>)0pGSodsOZ_x(Hgsl3)r;JK`=e*hS2Lkb6gz|Ut0SlnU&O$ z=u1gdJi6HXkRrQ)zq*>1 z-JvprddQ8Ewc>z&AosYSFrlXiltN#eUf-y*1igArAFVk#h@6j<&rJ6|^d{#eYjl%w zz2@7)3FS*k6|9dSF>5p}cWzC%@_sv>%s5Qk@ow&P?ZdQVE`p`Ix_8@1^s?CH9CQNK zrlWh9xTBupL|ksS16>uZ*TG_S^YhkEq85tbAQ?Eyo>$cM1;jPD<<)0_O=M$vp_lGg z`??AOI}-{@W|;UudOPD{bzQ=;md9MK23E64gOB`INJtUj(06qYjHh<3Cz=WW9`nZu!xM zTe#eQr3=X|%lpHt@*rKo{M4BTE`g-IfQG(DGpy@u-$fM=W=({|{V0SCOf%x|Rc(gD zD4<#^T<4E2$;zc$Qs|kGb%WR1Kl@#;pldBJ_h!w%-k;u@1vs%`VlfGDkf!Q+g#+~a zbhN)u2lII+{?!q!+UDvY6A$Lt6GJKdaM)nMtQ$MnGfnw}L_BIpI0x3BPz}UKYvWPv zjA7pSd!Mql!c6QG-ByH8;GTUB?(6HH=8!+5psX&=z{c1AlJ!wQ3qY)sh2bB~3Jb_l zU^Z?6Mr7m+d)0NgW)nf9`TPf^oR^%|M|8~nmybm!RBXspZ~VVQqTfuUV~ALs+2PV% zQ2W*ucXE0fbwM%VTR9BO9fUXq%1)twibdB?MiJm@YJ!%wV1EIU*wDG}dSA1PU%1cb zemRI?X84A|IVkS~LPE(rWx0VMFLDNHyKmHN+2_{#?|q$|GtJ=D>(-?@osG*gbI1}O zgR#0Ootwt2QuM&{T;8z!GoyN4)fC{C%B^ZXGh*<(V(V4bwv8n-@}Z0WsXEonz z!dEkY_51(G2_NwPDUIiA7Z_BfTee(=&W}ycrKjxVzG!^513I2GOudKpabN8;YNZ|m zaFQeXaEc>3{QF~_vd?%H?ks7?HdkH;Us?h4!0 z5>79Llcs_M{hZ^|OrIq)B>9WJT@WQe6D`crk;P}QW)v&n?F}Y+)druN?DvvoXZLi3@=b~tR4M}Yl@we z7G$3yDE3pz8vC)-)%aXS&vuhoou<@ao~WYBs758@D*9!##vC3cN+npGmx_M`R(B!M zH5z+C_)VgI{`$ox76mSgkG`u`cMCLf8(t~YF2oyN16jpHE@Q1CXY`@z) zmNPyb*qwd!gGFHH(Gp_t{*I+``|VS>J~nwF)lC7kEtLbspET^NCx7grL|Qj%G~9Ms zxc(y>^XUNysA$n>sh!#QCeeB~MWo?^Y|4`jbWwBl6}_ikBgag<{a`mKY@SGFr3#0^~l8 zw8GF@9DqJKhnuMKQ0;1bNiczOb=bKbHQ>lJg|f^=x zfbKvSmQ-{7;NrlEBeQ@nP9F&6t%VahS*MzEOQvwr9e ztC)H3jWaw3&$RZ5rCv8fSK7!R$?SZryL`e$*XDGb+xsjPC||aw|B6wWCa{ser(!v& z=EMO8g5Xa6sAdZoaEl+|b!9!s*WZS`3ct)4h?t)w*OIbD4@wQe-R}dRmO-=z5I#3t zhWFw;R?UFh{-(S3EFDSu|l$P~JjG1LJORoi=6ek9g4Q|H4rm|41 zqKON6^B@C^v6Q5 zxl%-|!Ao9y=Qi24=8tTH+tB+TBE$CU%}A^ye7Y#|z8rPSi+IHV(PV{C3Q<(4&UZLd z@O#e~I2a@IZ)WhYF)vn2^aMNf5#H#LPu6%NP3{yRs70L^sa}RI-{}+7;30d&Aln7M zL z^hI-oDG&Rd-G(nbSIGD>F;!Xif}UVD;ts)m3I(czoDhGG{&;N#7(h0?)uq6cbhr2i z(7ZCwE|6Tkd#Kgm1IVJb`JF2lI_959Guysi@V<2zy{hi2eJUz#Ck_Nw|2$vYKK^-4 z-+Ea-FN>-D_VpnjOTO$(s^%))w&L?hPdyu2I96MZv3$Wze0{fsBI%zF{}Oekft-ZR zwNs>E`}Z@hBa_f{Zge;}j9LtoYve^;0fZeWI%XEAV@>s)Wkwve684(4Rnv2{J7<-m z6c6U#%#u~H9!o2&#e+Pv1zsz5ZUr0-gmAgp?Bd!tM-OM1%hr(HtFXp#&AhuIpV?mA z8Qo{}$3CMvx2ZC>&KAIA8oNC%UHHUr)mFMRw4`~)D<(ntPeV~Nfc!~b_7O7^9 z8JeA_gE2!%Z(UdAky^Vwo9F8wg-_|f;|B#-D~=h0-VN*DP`o_@lnaFp1B28ex_(=< zs<1KcUbmP@2i}55ol`SXM=Szu_JL$#ES%ezSc1m5?L?2M)@y-AOAhi3Dx=da+PR_u z`ttQ=Ug{H{q~o4Hd~^NGz;oXkH+9iehd$$+FwubbuxZkybZl&8i=ir(>>CSUC(Zz& zmh(*vV5JM&rqvC1F0KAukSShRBM=(3Ao9P>MeQvm1^!YyX0C|13pltK=lcCcSgBLV zlzWjG-2FMk_MD`9qYJ9VTd)~;@a(#EQ6l$~q9^PI>;bph&L}TR1$fMfnU{@$^q6mF zBr~2|f!|AzDY{au^MqOa2^XcniZ`Bus-k`+arzUSpTOQv?xlIoD4k1%X&SQz&7z!n zU+<2inNwcuaWDMT>sLs!;W>E4moVy7Mp==G%ar536#mS1AGvh6`^JTdfC!c({{=C2XKC~Sreg$n=S?rm2*Cexh`5r*VV`Fn z2)6~okAQAb(4=|JzTq5zCrn&?3Q-xph<8Nn+eRg2rTa9jFM;_b5~xGQi#zzmqI==6^l! z(VuqQN;F=O(5z`@yfMJ3qAg*P&{{>!`(5vCxdgSE7XWv+V!(Jdtt4qnf4?|=wcIR@ zXXXyy93uTDiSxgDYzSyb*Vu?M@~;0q-m=rh!yRjw(w+O->L|Y~XgC`c1d1-St zi$UZ=O!u9JbULP#6c*8e@#eEmy15U#Rta13&CU?|a$?9B4e*Ld<-##qk&pJ3bR4HU zJM_u3MT6^h7S_@!^dwQ?y6C~!bm!SILAAJCNa_0lG{`rtfr#crZpY4qo06CFN^}lv@F$)sL3l$6tivN?lp)xKIq@E)$i}hnx**T z1}d+9Cp9|fa2|(EqQfUe_sJ?)BckFmYvr;*MICAI8ZxJ4lhnEA&XU2M#u!lpDu$kh zy|r(Mz<j(H6et;; zX+682_PYMnw`ik$X6!&zw<^lGWxU3BRBu zIu_=fku!IFV+p%Dd6jf(<}*Sjs@)DQUF$s~4=`T70ghh))We&C?>17qzH`6M8!cZG z;Gn6O?9%KDaR>T?y+RjtveE+427FVn1?cVCFO~Z5_{Nwiq|%#phRjl_k6f`G&T*qY zVDY7X%L2rH3TFo1C@%+Stn?c9>J+_63s>}^L{9SKb8l=#vJ36~k;W>`_}H2#dTfL! z;}{B65*U_@dVA2)b7ZtaQJ9}&+>YJ6mRXc9T7OPIJ2ohLVI#oNaYEt&+M#L%q|8>@ zRZI3Y4X6Hx*2*QdaMyL`KWvLXmwR({XWKQyF{}xjEZ$biE9c@6mAjNj+daTUOud3J zYONu;q$u9F!5|8=y#^<}TrlxxlE_P)Sk=q?;A*%lWFl^)e(5`X9#g4f7_nxES^Vg6 z$`PI=Dsdm?NtG)6{Ob!9T$|8$x@P#?4aJU#-W+h&BAUPa6uxJ8j(6!;sq274m6(oN zTOTo6sSZfJ5OyO~9z-q*bWC7GN@5C4t^6h22hxDIwR_77Nw!0gznlBapXv+z?W^*@ zzzAAFhKxLSmfmk07v_I)@uza@yCWOxv`PJyw`1?1rApZE_^Z&qi%j^tE}?|-+?Y#J(_}>X zF~yfI;4E%$L29KcAWQo99)TAOA>>5&BQVZy&)wbI%(JKseF7QMDHHwt5xFAc>>suT zZ8%L6_%e|*%G@I3OBjdBmYaGIvrV5Y>xjkZurXYlBDb95OUFh27pN{!Kt9akMq+cQ z2*Rzgo!lTDt^YY|+ft3z_N#Y;`6q+xPg(||} zQ-Zt1Q!e2h;#q?Q9nW*=u9X`krrpQ6IpJyk&(r=H4CQwx^CZD%f1Wi8yCbObR zjfl0H+nG+o{wGsTF5q2Gjz<1A@q1d~C;q%Hu!$9B3f0o#GDk7%yFIaRZv8~+? z^E3nA+jP7xNPg)}<7r?H+?@7ZIYNE4AAx^YTJm?#QTU;LG1;z7PD~x074w=s%0h=j zg+>$^vN(?S$~j~vZ$e^9b4ppuej~HqbJAzyKz-QoqA%w?*1EQ(i2+f4`LXJ8jXyu& zRP*AO|KPx!12c|cxgKTgxIKj2=tKiRUDt03YLZj}V}3?Tfc?6Sg4Ogj-{oO9#7n+YCKh)|7Br+qk4#!X7S~ z3J8i27nV0aD7Ed zY%tytc~59(5C&SmKdmAS{(tRAM5O7{V=`*QbJ=8ErTl|xgU3IB9| zc-rp=sl7;m(o;0+z8=x;n0o7e^BmM7#RaGM%RZ1>Gy7USy>-PqZQH9P{gpFaXBR2Nw>4_}h zDwyW(3oPn`$?B*7aR6K@c?$=l6cb$L?!s&ClBoKQ1_h|T9Fp0nRvGCG&Bohj*vY-^ zAq!iNxNUuR6}lGC2_o=DeWN11({&@D(DjPM|Jr#n#mBBOZcZH?#Qf_iD{Pi{IaaEh zj9S!G$Zfv9@mXR)J(v*{;)|hISogb#E-vKYZh%w-5LGyde^4vB|H|qvZqtn57cUQDsSxT{&ZmO0 z>YTN=`+&B!eITQG6ZRNb5t5rOxSY&W9p6fwbl^8;Pa7o|f{M8*j!8+PZ|4lq*zm-GgDit{xUQo@7tXRXeBzr#4egw-+ zB;<1b#rc20tXvl@R}fdc@0>r~M{at+s z$cSH1gi8U24)ob|xCkx}dqE zt`v#YL%|d;*Dmn32b}-c%Bz!mADZQ+hr)&kE91G?xg|!#r}1)NlwFEsg8Mh8%@VEQ z`9!i2Ks1NNGB7Aed403EYZpCM@*s@;R=RC2F7#%tCr$|49Gu-^Yu+Sy0wbIxrSl4! zuN@pd?4P7ET(zTd+D@{?H=%++LW0@a(K2psN)jefb~kqI}Q{ zr0XO{L3nJ_%OtAm@y-3f+_@XMT4OdIu`SVB@=>RE(__8{kF*FC$x#%7XM#+sG?zaF z-P*VzjOxPfklE0MOgC&|UB$=13r6S-=(-^;rDNo?EbLn~@n8~@N#6mEa7kxJ1G7RN z+|e%0OfKkNse^(GZ_@5{MA!uE6b0HekK0zxV7<3~1*mTe&S!K-%+7qkt9xP~V^O6c zZLjywu73RQMoZP`QHR1|? zvQ-thF>8H3q7%&)xus<#op|uu(UdaLQV-9={Tg5XF5=50lgz_#+B5iK9yINC56(!@ z-;fSGs=C0TcJCN%fPJxcEx)cwQDs1;`N3Yg6tTtUd$ zlSkA)G;!=Oug_3_K1%~D!!+F=c(-lv?_^yiImzjjH0nW&C!^roi=str2P9EzLekK7TX4+vut_KoFR9XyHMahgvX;G~jBq60a2jQvx4b{@}St z-g%>U1LKG^{GV5&)>?!$31Waxf8wN5ft%TTE{ShR%%n~`maSHJ`I}Ml823+4eIkY#dQh_ zMei}r%Iw3>=JYhc=&RdhA{&KRRnA)hN8@HJe!oFeM3)D53ecu6@WQW>{OJ2ZDgR6k z5&B7sEZp@kWjIIFje&8r%WD_OJ}0S$~&Fr!T^eB;3mA_%=;XB@-#t>xjDV0rBbtKqqqI09mHX{oocBI0#8T*0XcU9EY8qKGgRSMOr82BrSX*Y&~VSN)6@sz^~ zzE)x#B0FeuDbbmRkDhII*w4XkqDhTp183FCq9>LuwclPVp4`iA(!_w@-2u}rns3#u zz86W;cYo#K}E7 zPa>r(IVfY~n~=Xn%n^j$m(RuZ(O(6y|@;*=l4@OY_ z=yF=qm^J=GuOHw)lrpzYh${XrZ!y%oHT2BmYDYLicsWx-e^HF;h8kc>MVt&V=uh&( zuf~_^t8>*}uu19_5giqVBC^&CHQV1)UhCO09ddpj@eoz73$t;2al-hc?=O4>9#*@f z@y;0}FNmPI0K*6pVXMJ)jg!Qbiu@JnFbn3$fi!C@%ofM55i=j2 zQQR01Mgg1ZK1)|o19w)fGlo}&SIxQ~ArC=R1jV^gf8vo3{^$JKjtj&k$_4Wk{m?#T z7?UJQGdePPW6y9e<6hL zsos{|?v)DeNz*|Q=5nVNnq3I`<{KP5v%>NnkufnQerISoENw8|z}b<;bqShXsnM+e z&fxa`@kvAY&$e3~q>JJC`yCA8h}}#B2f*zD+Ix15+qOS(@1y^9qxoiW)SnGWQ4Tqa zFE`$s>JE%v!1ygAX|0f&2XdcY?mTmB_vFra=Ld;pW5rFf3C{JR7dJ|1!>2nRSo164 zI@as&w72CAmELi08@!KaJx*WKvap#_czWR*ME56|H3$tr(!JECOziJ!* z!iXsL`+;It-jHV9D^_?n>0a1Dz+^Ed7Q7WT7%x4NMD^+~-jGdaYf~6wK6`-Y*Y;yC z*lGwa;)&uvwmyoZ*JNvV_0dcj@3wQ-ziu8F{U_7ENHu>_5*vOYWbD8;@Jt@$jPD4K z2u&42;%69YuH0U$(lTfTAmPjPZ*HZuC1S&a$I(Q{?-FE0jfZY+-3ohbb_~>S)7xes zVLpr43{Y27NHBFh1YjI8lyq%ro+I_TW4Dcal3M6OO+cmi4vN~H@bA22W7nyl`4 z8&Ew^`$c?MjfqHhq7GU1)MJa<;jwr|g~3mabw z2#2L2mUCKlvVuJC1Jw!il$vBw75UXhudt$}8fFzWe_%3dJ~3!gCZ52`JLA_+O#iPF zskca#ve{AB%ApMxLkqovX|GUQW|^T|#E-2!DS^SB;H(R3PK{5V0-ugJNrlvwxbGWp zA!nO|zJuSD+BfQqGvjO?}AJ@s%I zT7W||pO6dSJgD&(pRwYf!vtarH8U5qoB48k-h)5W&URnp>;C{@Hs`c_X2r8n9ysY> z$_#X@sf2Ky!247mcs*0nhidXoNDgU=IzbTkF=LE(cG)O5OF3A~q12D%G#6kpu~DbgEQI4oojR$70FXMs*qs4t9-2Ny9>)r5XUjKHUA*vkA;xBnP5h*Aj5+T1EE?dNM3XBTut_N9MEB zaaf8+Ke+CSg$|`MPkk`pB;g`B%IS=Gsa^AcvO72O^xQu|N$8qpU99*(TkWlMd1)o1 zA-o-ANj`FM>wC}4s{gGa?t&2oV$`ftI(k}ESl3Ydz=@~YNVEK+j~c0JKWYSOat@w& zq*kjbxf~IF3=whQ1MA0DcT{fHq9wK-T{Shi#Vtvl?8Gb40``vr2Km0K3yri7Ieh-s zc08~sm>&$y@Mj_0#C2co@7G~W16tC8jGjide;QWI3lr3dYIePo?k+Grjr;a;)ha}u zISHjw2~xKCH*3jhvUxJ251f|sTwDVceo@uTTq4}D+jAz%z#w?OPw1O25%yq2@udm@ zpJyt1U<(2|mG=B6cgyk?-UIdCfSK?J&$Uxr9#2X~l0_Oc?1;d>^(}ah&SGy@bGjAc z7x2&WR{ibs|2^B_0kl=4=0uBu2XDC>0^~X(2$iw4XX$RNk|XdQsOSWv!r#A|X^4cGiec!uq#!J!cZD3jqH z>rcKkSIr!>bH7!R+fli@LobA3X*O|IL_oSM0!k6QD%b3{SBa8qY zJE?fGMHK>_;|FzdFSSrvdArb+bMY3oy(~>-SR$w8*!Wk4l8$&;GvYjAx4KJx!(#Ze z#*b8|cciPI8eCe!x&dmQE#9Y!)%kdoMeL7McI z=rD?ifP#wDh=`O>giwSObWj;oKzb)CO=<)TJwZW0YLJppgVYd02oO?8f!{UXwVvnA zediCjva*tO<~;V^$7g>rJuw~C7ke4sxRm`dxV?C5Ab$t(Wx#4&g+Z_#-8=qk9hU7# zzXusq!^I}DCBSlQuD7J2_lxxN{+wPZ4@zs4AHO2I49*5Sa`u$O!Gb_oLhT>NFL zNQ9@WzmdpH%9) z7R^pbcAkhoIVzwAS-37HW~N&TNvl=7h#!{9sdnaEtb&vm zFL9r05g(hvEPbw5L<6hPOZP~_wx+SYUFdtEtvT!rNJTBi2RD4`-FU%R3Gbk(fax>> zy~9`nw5r>ne+j=m%c=9YsmNjNk0Nd@Z=THkVdA^b#R3Hjz zLa=1ax>4jkG>0ZQ@63*|`DJgFT(y8L&HW-)M6DjXeFdm5-CR^3GP-k>`aq;moFA1) zefY`4TN5`2B(4R11MebxlJLmR^jDdcvt{LSmToW}%^NT8#=E6WeTPW_1N``7B*}EG zCulL{XW^r7Cqe!+ooH7|(Ae+!;;*MSDB{%?^+I2MX`&jxUxs(I`cHWT(lP+}h0x2JrZK z)tP2shq~iT2$+Sqb%xM7Q|cV`)&_Yob4#_HiCsuTG#Buq_Z5Tfe^@Tm8|D z1(ipTGh=Wl(?j11Twi|C^fmD(+0FG;nctat0zreJs3T+Z#9Jkit@ zTzZ=>Ra|r2OGAi>Q{_%Hjwnlc@GuxO!Kz@O-#ztCq=w6y?E~eB)}@%QaQ2 z$)PKb+i5b&g1fS-Pu>hHE#EHKlI=lc-tuSk0yi83EpCxRZU(sA_fT{91?g8B#3Mi< zVL*9)K83St>JDXeu1+w(=7TGK)#;YCv$8KM>`NuKOG*x zI*L-*4G3LyMc}J5%$a{eJyY7wdz;89Z%e4!_?s*H9e4Hrv8AKlW9<``3-s4i!*a?> zri!{$-71?j!xOTAYYad7M{311vUSytZ%)e&kFRfL?Ex$> zh#XBIbbL<6@n+Y1aTs;i$ni*z_6bB=({0BWN3C~{RKY`h@74j!#ged_?v4*c+Bhzv zYCmM>2g-r9lZvxuxJU{%Q72le2$UAsM0t)-xWG(R(1abPqNrrzi|zG|LEx<(N3Vy_ zw&lJ?vo3jo4JBKZ{)u;nw65{?UT0`lsR2K4K z|8Jb7fw+RrFi@RcxKFe=7c>9vJJ1My*!Vq!yyVHCR`u5I+(250*{@5!vLi4~pB@Jr zv0G+J*fNv|QPUvRF`iP+ys`5?hOX$=W%u_BwpO3mS|PCNEBrGOw%)MWN`2Vw!RECH z>N3`-x~#PN)HSVhVXcQ>_J5$Sfb0h{N4oyV2ql4Lkv`Y+vo(n!rLs^`^rA)VU-)Wj zq`Ce+$Na5T+do_>ZL`Qp_O}*|G&_Ng>ao(sl5%O)uqMxER|JpV^oFGGeCc|EKYN}= zQ9Ga5trrn2NRqB;+(TSlv781nS6Sr-P~TkchlRvxp)dU)!A;<8d&?22_fE}!7Lq}FpRl_~8!Y%zoS*7w0=t6)zp92d z3$?;_q8jI3s<#(_QMblCag)#O(3_t=-uoins?zf!|2lzWW$>IyN_BQiIND)VW($Pw zL0KKY$(w2J)oi`sKT&gb=_>qG-kWBTQaH8LPMOqgir+I{q0hKNHr$bOU$@NJdax@c zyU%R>bcJQPqu+RL1Y%-$NpuDU*KAmy)Am|fFsn7wFY{H`UP1oS2kbhjkyb5TV85~} z!aI&S5-8KLz%T2oJSw8JCSgUXVPfTbLSf+YL@a9-xf11l9rgqH-cEEY?Mv+MV9M{y zpGrPA3=}m|WtdN&?)M2jzOw_CgFJzv79-n)-U==rz*Ptfq>QylA&8k6{6+qXmVX1{qB88vDetGNL3-kE+ z;JDH`m`+gNJioxLb?YhUgXJ69hkcm`p}Y<9!Z>d{V76*jGlJy#!!5Jh5m(-nzk1c* zEHrfMrrp&hXs)oD+{um~=A7TXK3q1r_EbS>xd&Q*Hk{WZt}slzzcGv215(;pduR5U z-_Qj!K`&Ua4`jG)<~-^@+A0IvnRS}|%5T+e+3MJp2V=%gw||KsIRNkt^Y%}r4xZw| zO#eA{-t?e#GmiCcXSCj3_oQa>r`vnxd5>Go2J|p6N%@LFpK?z`e=9quqN+j{ z?fwmz+jO7+&iIdiJ#tc@&Ht@2J>HSoJ?qj1crDRBkGo&tCR?ma?twmmZ?bKiz4J@B zor^t7H}h*8Sr|ES1!1?J-(QQJnteO@LSG&Kn`0NV%C$b+#(=thbX$RJIn=1L!!V)f zpLYX`n2@ZkH51FKc=M@U62HeS0N3qM{LE>?`)Q?1FQGg9qa&B3O9lte{F!-lSCLT& z%FEWn7;kxiy4kkVyNNQsr-_uQB?`lt*((hbRBIzC6%XA$Z&UO;B2^+VJJSDc&hG$9 zMsBN}G@*iR_xJR$BC$kf@?SU&e0<@(yv|M7GRr-rk-ZiaykgVvjPh_OWZl%}p8tk2 zv-eQbnp=u4SDtgfeo7g2`7W>WrtJ5l_?=sBIs^zO{1wT&_noM=E?>|8DXl;uz4_}O zAU%l}BTSH%yHr3+1Fiq#eM*wE)L6wfmDpCbiO+Wq1U27L&^M7Hu&E;bu_`-%wAeVHFsVW zpD5`KHaJ#x5+1MOEcF4l((5=9_6$sjqjR z4!s3%tc!`a90muV6MC`H-r6BL{-+3*29uvn2Ppuv-Dtth>T zMo`-j{&Nm6HDtI)d5Pir@p(V44m~?&a_~*SQ5LF z;fOcC_-_KEUi}M1m0K$C*XlH(junm=e+>J&>iZj-b5ofMS~+U3<*RqjS8Fp08Q2RC zQC#Vd`urjXpLjqmPdGYuqoTjRUinoIz90Q6F+|4^3xdA9Df_6sbw3FVrvgV>EI^D} zd^!t~a|O}@nEI`%&!0Dkk39$tuneg6#*)M0wioM&6K;RoT*@T3($Xb^6~V}f__PF)!ba?{hg(3F0AO`XXZ0dj zcJox_!}!s;`9*dF4)sFKp}26H*RV8!Xb-|7-7`(X{D!rFt>;qddz#JuUZCp~y3`S^ zZvM-ETMEuvXS|rt=PmqOYNvbNCG@5d*Me;gYFQ)D!QE`FgT#kXpEN%&Q4{x@#`4a` z7q~$t&1G+$A~jOZeOTl}MjS_@HsXk@b(4VxYu*2{3bq)!LplKyTdF1A$HO9NSLvtS z=GF5!`i#(lE3R>Q2Os_=G3v|FRUy*Gu&K=HkH}~4bZeAa9`AaMwe;5uj%N0aCtvN~ z&`Hi^!wg$R)9iK$SnxqR`pe&2vDzbZ${ag0hUcsd+(Z`@-_<;`(fO#{W%^X~gGRTM z3d@;@G4DazKcDD<`S;7>hp-nnz2S2n*kk4L?g(IjYk}Rk4|>?2orX7d`@iE!8Sq3^vDR#PTOY0 zOzc+V$g6D^C6X16Q?~a|w$Z9F>?&yC#|`(nQR|oeQG=3uH_TMQjQRauJ_g%o9l(=+ zdCHF7lD!#{oj6);{B4?^2ESy04CE_tjiu+~Ha`^m{~bA5BG@MWL6lSeW@oT#D!X{F zTZR6WT5>8DjZwb!TXlD9X_};nPq>Eu{&Xd@^0{%;%&Rx?zsu-Ca0Pk&04Ma%kr2E82gVeiOB z?)hE>)5G;+1JD6dD4)C#ERF^QzO?cilkm*dJ^8?kF!C*fEVJ1NT=c&W&%^q*gdZ^4zwYq9@c|JB0qs`;-N_ z5l2^jn#CK`YTXIe9^+nW#^~E)9}*PJ}kiYb!+F_1ufz-cO9R{#;{{& zBgxTDnFa{_dgkeb19Gl{k}cUt-G|qE5y!kL%mwR)XEV$g~tnHFpLlgH^$D zb+;NnwUUkj`kII&FEl=R%#p&WALtv`9b*240W{Jm^7Uiz)_SF}A_w>WUj5W!*?}|Dx)0J;7y-@+PLawFiq!3KZY#xW_LbJpC&{y z_LR0W7rWkxlE?05T%@xtvWZ(V1aPR`u=QZW$c6JbX4m5Di7k9c3^^88KiZg++bHKh z6wpguvMN+g!lR8o^G}!_tWj@`I^T%g+y`w?3+i?drX-k=V6O^3&W1| zq*U+pHw|}CFE=4_C)7B z>EYwAF|Q#p*lG>2d~(o88vKd3#dHt>vNFxpPF#K5J)WU?zCe-hMI`xvx z(zRRamYMd%+IYw$SbJ}$QcZ*v&jG7;sgqulZ^;=qdD(&;e~i+PSj){s%q6bha=)P* z&oH%1`INDu{AKg78;SOO#U*e>B;iO3Jx2eI;-Lr{Ezy`jqru4iI|_&U7_m~TIl1w> z3S%vi4h_O=L_3wVQ@M`AV=)agQjmiW2c`|p#5e6^aXYJW?EqD9*fQNN&!mV@KXG`l zanJY!3K3<+sW;o)7@{l29y!|kn&(LvktvKCCr8!ppdoLKxQnblBF3`eX_eat$w#j+ zj7Cya7?We};Q%um6D{I%(};CsaU`crnH^H{5kN^~7UVgOgc%uBIUP*xd{Z_ z@1!y8n6p#pHt1tuve$jiv%670vxLutu-`7yuh6aU;z)+V){}is+A8E-9uN<97T1d{ z<9WZW80)zlO(Lq_F%c7if~>-KxzdLX>hFrOy5Z4pIs>r|4O?~@&nIUXB#+sAR0&Rm z#)VI>9*Mq_BexcwD6KNxu-;|qjbYV#IAMQ$n)=1+)H})drc1j|uSxVG>i&AIg?z=O zw?kYfWg?W>)4RLbvx$RqZNm*@uQu==ks)&F^?J8mUeXd~){_x5)^s*6Cg2_Nsxo#j zNx}-s(U_z!fTGR%^39u_-f&$9nn_oTV-%%9hT+qC)4>^6nbSNW>O1 zdDGLC|6aVw7bqo{F*l4qN>MLwASMSz`B|cw)_U%D!$kAz-S4;`v~W_U*q0i{*C3>X z&Wja3lq1NxYCzJp*l6Q>MJ^mBdsV1BaBO+-@~S~fJTx|H_kOJz*1S!$O(J+->6Th% zx{eiE3TfQmuFD4bE&qf*Up2C)vu9MWG@-PFu*cHik`rHAtlj;=_unpD8-5m&quF^O zYv0jd{zK{T8~G4ql$7&#T*!yLha&V>kbiGy{vw`ly&H0!pN*DXmn-+XTNPMQH9k3i z=8zfU1&x1Expi-cutBhr{FmDd+2OYs0XYGEMuNw3n%8@g(TW3-(cPW#1kOP7iIyLi zceB;E=rJlpQ(%?z6zejMC_P#Gonw7>Vz?#tg(*yjziO;I+@J-Bq6ynu!9y%gx2t5L z_W2!4`Y|*tto8559X=qlJJbgjN>y(426n>147hu_B4Ki?IQsj<O zHPA6&1zDqYNL#+4sp`~Rx^!$iZvE5x8Xp5(53MqFy~FP|JfaG?`nBWItjaFlJ9MSB zW2cqg)gWUH{D4MXmBRd+fyCYt8WTELuK7XhD%AoSThlwkH@uJc+dAv@PxT75WJ6y9 z=9rIm9*c1!zU_=C$y0g0*y{*D!a1f^GqIkDk@k06u@>cli1!KMMvrw`D z!+8cgu_hG8hPcb5*A5_{o44KaYQ+WjV#Gbvq-r8^9Jn+#{V}y&1$sH-x%8~tL2NqB z(S6}&Sdl?&3hdr|G^Lx5W6f`TmY&iQi+bVmRdCXKr*e&wRZvqg`mdRp`dIWg7v6^+ z#l?!_W+%k_OA{|1!UgrKNgh-ORJ2W(MSI2$y&2nK=YDwpgBiC!nxkXKpueVZTSO16V()k>PV9jK`rXf=7 zs2HQ^T17${Dssuw9=SOy6}I-kcPY%hHW+8mCk5ZOt(3|OJbQ}u(WJ-CFViM`+xAvY zyHKle%&ZQ;;Nm%V&0Sih;j{BhrOo!Pu7BRE2M<}5#Wop+48fwBr4doBbdqLGUTuYW zKT>o2&D%_c5ti7N9#U$_sRoaDW*oUpbvK=Fg277$)F7Q#*ReNRzaMfK|7GVty(?%&>jYI^bE!;1-}`ysBZ91 z;U4r3WTbv>YvTUNqAMuO^F#0lZjct*q&4w7m?(>u9sh*CAyU_Z-rf4Ce33yz3J=l( zgKu{360ir#9_rt*0J#61YRA95_^JtGh&>L}GY7B5uRJ-H_!VxqML%M*_UVk;=`wcF zW|a9!QvPDLd{7X+VC$9zb~Hn8rp2%d`iXOFC>N`affU>19Rl3QbZnzxz{E&WJ983B zXzkx{0y-51eZFwn40!PEs-eVK*y^R(zz8BTs>Fb0WkU?V2N%;)iLdDw*e8X00EMT} zuw_!==+a;{3pK>JMwD$8o1b(6+B3gCgq=je{!iyjd;jvA80YXomyI4dZ-Bg z5ff1C`O%BBbk3G}wXtAC!RQm|p+?~JN{2|)E<7K+gzy}6uSZPD8w3%gy+jwhdPa)R zZJhfO74tqt@0u%^Zhl<41L5X7YULfp>n@PA7mdF%^2m((=J|o|-1xEgPC@QxM8aaN zq`s+mSUv(ccRufBfs_5tYc~A&d%Y6?KelZ2v#q*vXyP@>M(6*3=`p8M8!S?@fQT?or0p+vP2W!?5rZHl9$QYy6CIz`0p0 z*%?u#&_7l$en-dtGiw7`Q=)7S&X!bb!%bsfa>FZ!Pm2=je%qpMDbuZ%o|VOokkZ+u z1-FB(NWo_RQmFFh?F=kH`QfW6!%{{QF~Tt0F?0z)>1%p46>RyC#WSA$n)obBH_~xA z+1dxgCB$eMB=RhN%##6A-lZ+Mh#E`AZZ15U@P=j+qTPHF@0L`>FDb;K&NNf4>HHfc z;oW~8_yz@QT?6Os=BmF(s_1D^OOx*BLat|<87J=8{?p5+--3Hiw(*8LxrCog4D0H> zqA~7lMQ`8hvLP`cKK|I}Lf5r@fa3;=Xy8bO+ux%5>O<_Q)Q7Kg4I^v?V_i@=sAPPD zhOuv99N1M}3!%phS!T$sgryVTL3Rm+?q+=wT5o-bbz?C(Gv7NJ{t<#@U$4Wfw4=xD zNRGg#xA4jG(AahOedE8VwfiX`u14Y()Sd7^di-|zh~_sry>z>m-P;;+O%JX$rJ5xB z>(rlcNBv&O(`u|qP%2yWJ@vjHQg^4kdur{=IdY*xYgxH`qIkksU&~W`(eupPbME2K zLVJp^zgTc*B_ppkk@s}nLde(&87t<0(8`Nfgsx@4)ue*VkQmFyEEUlU1LiJ<7jFL; zsX}~0s9ympNxsRgFs)U=@C5tTic*>KJe7lgX3pb69+aAIXya7zH$X)tdi`Mmnog>y zeKwc}1M^AKz(>6S2UnIb%1^rki4oiDlawvxu%Xi!Jjs$x9W|BQE2-yYf44kXQYn3f za8+J(68r7!zBY-Gn>+A5=H^IO88k}vmr77Q7nJw&cX<&-Q0Q9b+i z6st#V?|Y?Rim4vUZDtf8U=x^gbB`@=U@&Us)M#nYp-s)sIlmAe z1-p~G<+S>HX>sp=NGcC%N}Qta?p3Rt*}R{EeVQ8@?n4xOsG>@7oc)x%ZIogyp+#46 zyF8hhpx1u@x&GX;*edIuuKPWYnUoFi>VFn*xqoaars`KgNKf<;=OLkAgMH37cYeOn z6aw~7aF<3Z_kE#zO^pOZoyT;8N*nwYWWaB;E_m7s$8LeA&Rd$}re|vdrl&Gvq%S<~ zx*-ex#||iy{dmWzC!`Wn*JS*^gg`Xw{vRi!`MG->y0TZg|mVMntj6gH2m6S z?qUJL!l#da_?>&2(}>wd-dbb-nL?c8#px#67|!vx0=XDDtGZ)FfqU}IqmuM&*S zH%>5dnnJI~bBAT^c&)Z``FaS$1Bfl^3!Wu%5WFqrVo-wco`UuL zDhZ@5=d~5_r|YAMX0#?3;^>8IB0~;^R$t&cYv^k7gC0PDj+^yys#?^Py1;a$$hQpAZ^@AJEjt98a zY52-2+RG7=Z*-_C%#&xHFeGO0NnhoEt+F%4?dV%UO+L{9!3l)h6=yhHhs$CF7VTTU z!$Zu$y0@~hU9)zkj{h$kDK)qj5IGOL?O&z|7eiIhb9Uzi3NRb1bDZqe_ir zFRGxjN<0)4k4+XYub|5=!`fCm&cQ~;Qe{r&d|o3HWCx8mxlh$RAu6R&4acHiIYK*t z;%S(6ozbue+yaZbPI~dq-M?6VIqHP{#*b+7m4D{m(hkRuW-u^89gaWf{3=)SL&pO* z+|LNm3Zi!LwbmcZ?VSw`%khGtfYLb9n#FvbKlP{hMY?Fu*5-eJcGWn2H{xDyk=UKS z!Al-qv090YYqIp4A87Og%X6Rp**#i#Ci8=wmkz6VrD0AhE@xX|voa|$MAhBr-B~Sz z9OO?w6Aea3mUNqL9+ZRj1gy9DDC*wN2@M&LS`~X&!2U4Iro}fF7JGP z>8k$T#y9wxh1CyxUXRvNPp4TNYW{aDTj&1bX{fBYNHDuIypnFh_@d>&eQ4iujHU6Z z+mmTcKSlj{H02lWd+36Ci!1~4d`ml7rN=6zQ(_WleE(`*O7b672kD|o+tMuGV*LI;EyyH?_?@Jx4 zv#xHYE0N9haiPvR88^f|%wJ=rA)b1%_w~|kW>SwMzmY{JE}4uoh1?dyYL-b|)hoBy zsKwtmE$0fPFZaznAR6E&Pu`cWHc6Em$vG2FydvZO&@eA#U7^~GnZ6!phtXt+)>nbr z=?a&665~Ji{h4r+1i*oMHmUUZ;=gU0DP*3YC(HXefZ3ifty^?;RzX%;5(tT|sF)WW4I!;}=(eM1s6PdGYKu%?Ees8X(O@IP?qdiw z_yiyAzR;!fovhFJf%ckgSpP|wZ`h3a;WkiWo0S||Hcy?$yD^N8_2CrP!e(MsB!bl= z13Noe9^Hgj+0Lgbdo|*8p#Aw?o*K_L8BeZs#zcJHMLqQrNjww-wE8>mii&h%2aI>8 z>wyyNN0fR}&VAt~P^_3v!ax4-4!`FNNFBCtiQiAbqQxn=1G?S=K9yEPs%Ify&BeHh zN`CxbyGQr#i3Fmc!LVo>PL(Jyti}7i(bC9wqdS%8`f1Sb3E*aMltoF)mBy0Hhrtz* z-!n{Zh;(_aF>3rj`rVmHG~8p^&I%d5F3attCp5H#y{>U3^0-UF0%hUnVHa8Dp3{YV z)soJYZf2avDw2X6c)oO_D<)d^WKi!?C)uZq(wOP@`WEa@6XhW_t*eP6U@7cNzUU;8 z()Z2??+AV>izb=icij$|c+B&fZdrIP&R(<&-1gIK7N^}reo+GKp|g4ZPG@pp3*5$4_p?tYsoKvuFP7z5DX`^5~gMLpn?M z&OeA9x@zq4=f9)SkDQFvp*>Nu7lSzApcno{JAVz@O{+7+t^)VZl>43`@^>&ODa)HgV#KSgeedmMWAWw(YkajT?3hnCS^$x+7RMjbgT#VxTUAR1+TE5| zoZ?ek>WRmt=0iJwZ|$^f3|P%;Bd&-t-f|n?zUU*RcZ|t2SRyVqecI2}5I0?Ckw)ela7-h6D~32$82IcFuyS zz7DJ}uSovmHELXQ=U2HD{EQ*x$zRm)#2qXxBiA}CHAk3Te(oEU?PV@Ua_ks>knKHl z>yJ~-;!)5cw>b8d;7$GL^4qJvMh1BvrkU2L_Y#F^LuMX{fIVpr%nm=t6YhYo9$Mar zZIaFdb^buaML}hMwSj&5t5j%}fdGW{E#{z6j`KH5bA*k1{plOms>Mvy-j%lwtu^Jv zt6;8yH*fV(+kQyT1Pi%!GZEwx^bfxLaK+^)@E?n(S4AOn-6eVuOS_=AJ2vNT|6Sx0 zk7b2?clAU+?pi$B>-Y@5yV>jkv~qUW734hSER;nqX8yW*_bEnV@!u+fciGDatt!+|fXN(Qk$d2ho+ z2n!A`KcSQG2sJGiGSP?+xqO2eHN5>ZBeNhG-ra7j%tmd(bz1<+8C>t!gyJNu79}S6 zfh74%Ra9W)b%n2`By^}C_S*ceV&UXLAaAV1gRKWL{5dzbN@WqD%sYYHBJMt3K*!75 zv;U|l<>=1`Q=6xZTb9D`zy8bRSej^!qo(azT;Q)rB(ADAKjz|MEOwiod(&cwvrNh3#_ zb$zc|_vLPMrYP47|KA~!z31B2YJ;^j)GsWz9BG1;1osVo6&b76TXLL1%T4z`ca>sG zj}O&q?d;sk0KKMJJh-(6qjL4H6r)mguJB!TtnjXc8K0_6QQ+s2y)b2{Veo5Kby|2X zW71^tC!BPlWud-h&W&h+BCF*s?OOhY3`5@se1t9LFW;v3(#-Fhg|5Z}O!R9?r4iQ^ zJ#RF5(ca)jMg2B$%Q$}M6=ju9Qo%{5_FCj#otJ-~kAYudT$X+qzbE>|${w^GHt*if zS$BbZwVLgY8zRXre#Hg6NkH)=X;2MZ=jJfOZeHAc=-sjm;VedZf_w=njAdm?>2z*p`<9sV8mHsWW-ioaU3>fI z;r=hDE@wHlAB%wjO>tj?^zdZQjZAdKjlhm#*VhH9L9CR|9pm@rNJFi@{%^^g+%D?o z>ydbW7w^X7LhiM|i56p}$K{eXW7v-EOJ;9nUL?FrIho{4X0xkPs`;Xokpq`Qy51 z2A&DMlC>i-nc(UzDSB4qQO_uQkBOw(zq>BEJm`+UC1K*>VAA8xQXqV_x?AOvh~7$? z&BaMBR94&_I$7qoBFfhV6bEsl@03DTF(YNI~* zZ6)B;erPdG{R6V6gr^TfUy)qWA=tSgx|6+TRlK9mPR*}H*fl}Xi+%X#D&XzakG+~Q zL#_l>I#pennn4O5fs8Oq=acFx(3NwCy@iQKJ4PeTdektRXU`=PNnljohk&c#H75WL zu|Yrv@+P3e^wq->md7P{4B8F#-dVfp&LkukQ%|y74_0@q`W262skgVbtm2X@L0a4N z-F+qK1qTmGMOKwT;haI4FvAv;StZcrGF@68TQ#grz@AMX)4a}O1&d6lRXWexfFAE( z9C4ryZ?wqFjLTNKRNjRa6>3ppnuri|U)w6KRF4mHGqEc=WrvR=p|Nr<96n`9*I2$nA zAB2Htnnu`CQlp$vS*RRU(PE|MC3&vR&%*uDp5Z*Z`mvo z_(BYe6FYI{s4Ifu%dORancs!*H|1K*46nz}Snp*2m|h`^SDb*Sn?n2Y_0?H>Chv*9 zfD_!Ahi?uLx&v5^+eb6!g60F^u=HKw0mZh{VBY8Tal7a<3{eQ6L?5ndn48!NjEBN} z22AEEEP}2^Pls8z$EmbvnDNKEinbf3b}uE$?xJYh9#_N@6lnW$z6%{vuh+~BaZm-k70#L_*Z|M zb>sH$W=`|VbEg~QtDt+#_4JX-+YyWGO{zkZ*xF6envQs!W#-aYN+s=WmP~q{xjvGZ zxCcU2>o1K{+hEZT4;kSJf+Nung_37fnWdXaj)C{C*toOyV=L6QO@kOrNpgSZvH5`a zJUU;4x0Ff+lvE=?JM zzs`sMz@g`wJEI(1+QFy?f^K7av2^UWSx#D%*8v3!Ds5~KJ-qXtIYz%jTb<`8#xk(t zcHMS!_6Eq87Aunp6>uh581gl-D!0fT9 z{#wCuSwSPao0mv?iM63$Rxj&{7-8aTjmL~jpWFO zz-bN8fK~y-1xyal;_?4(4K)hj(8&mQLzY<$WCvZhJK4i-JOenZ7tn&jh!>uKs+!H8 z{pOi}loU+ix4jljRB}`rgXfDMt$(Qp&4?%&wR~O{6oqfd|BnrRU&waYHisqhKEEq; zwkIjPA~gJW1ZPisU?YQ+8y^;A%cq3~RrPjFp4;4R9heXJY*hB1C^0Rm61%IUT1P%$ zrj*F|lVFh3#L#^(Il<3S9q;Vj@Vc$vMI|)++S!NKs>9sY_5BzkZ%r{<>6@~Ca0`pD ze+IW6iN=f<9`T~l+(V=x!E?tOKrl0Gu7YDPgn*3DlO}DO*=TwO_1+Fw@PW#r@pRt6tSA^ zqU7}6xo(G{ewno7cw$J>m5!oZcgI}Wg+%|(?_FI5lTBgP4deYnVlD12dOA6js0uQk z#H0yJTU9S%l~xdzAGKedja@|0OR5UBT|`Y=hlq;^d?`XXTNI{hsWE!m{B(f7&%nu6 zy@cvF4v99`zi$;!k)ma}!<01qB?cN?sknbL4KxDnDKP#fedb+hN)fg61?_SdYlE5~W$PRAgF?Gs#f-Ng~WpNPC?X zF(UeG1+l4v0)BJ>Aml1?`fddJ1xsdB_|5(ws+vQa+oNDt=pcK2Lfws1eg|*OA+5IV_P4EW%ghmK z5MjXMh96Uvy8z7XAqRdfv#Pn6Q(>-ihUMxvaF>28o2l9HV#{`t9mS99res7%(T0a1 zxk)kh3*QONSjme=BT150M+}SU{anMPSHJ5WqHSH0&OPSjmw{*(11P_nh2y;h*neTN z*7>saJ)yhJd)-9&c>qsv!eD7}$EC5$J8VK{$xs2J5f6YBra{I{em`Q}0fz3KFXBo5 zji)-XE2`iH$CcZB?&-3EDU(o$gYj#73x3e|lc_V1AM>M%f2@kZKjoos+u0l2q!W4| zBe5{EO)AHAXXpIgfz=G=Lu;WUam+-+)*e-wn_a6pdK=uI)bX$p4b91z`V-qRv-!0y zdj=wx(?KQ3Bg~gaB6?C-ZwcSJ=o-d7ccFs=PQpL6GMNzZ?aF-JN|s0-UHunbtw29P&vucziv8L+8yz?*h8{QAgKw>`k|*;`;CT9`;k^7~EDQ!R z?H8s#j)LV!n-~O%)N>#9o+17XQHgC{E88imbGdJFV3<;ASQzogBnrPl^I*L!uUZon zkuJHfh_Z_eQuW_fM|Z^}`+JlPFX-p3V;ItLX4alFa`ty!H}DcPjn~vioyWu{JDQI> z*Jy5MxZgW-+3uS?e~D_xPDhS5W%;O66s}kcRE17|<%H7jP3nT|OzemQk@9lVfpQNt_ zWj7i|6Ju%J!*LF!DfL8N}Hf%I1|DCcy!G6X8Hw@A^XhX&pDo*tQxqyHFagDstx0#1X$b%=6>ml1)R8{)rvD3<&*0 z(%!O-9D?K}y@*j*pfz~>>%E_@q4SKl+i};Ur+#vVD>4n^O(Z4Wz_fywo}iCj%V@gdgbz6_Pc?r! zH-hZ;3`T1hf?nT8s2F?*L&*Vw97U|RvacE0ZZv8 z)1Ei7V{`=a0Q@TC_-l73AHg;!fY&o9mYZsD0{Holi7S3LxhSh1-u6JipZ z;o*{(>jQix+}8Y~HqqmZ@3(CjzxwAFz1i{D-0r!kA?Y zVtVCifqQek)FC3x{FZr4W%-tRYQaE}c(e8Yv2~ttNw0t0KOIk5$C9>XDlJnpH8ZzB zWjQiOTAGuJ)Z95!1gtErT)E4cxiSYXGzUXSmAJb<|Xhh0Px)4y@p&sBiVs z%jLP(iB&}-={HJ^TQe)65Gr_kd_?NUX3irYn~9~RHArOrp-*fLEyvw8OI>>yu$dMh z;Fq7X`L)u2F6wd-i2Z{$Q|=pl1%RPC0{tkRnV&X4Vn1jE_&H1{dYD)F5qC{U#N0Me z9?W>BJjWf@Zr(cbyI3veC|pX8v(_Fx1#plE5%U=)R6bh!mVow2B0}=r#%n(d?W2Vu zCCaits43WT>GG=~t;N{HTI}2dnxb%)m3bLl$+E4iQ)$C0t9w{C7mYLAnjnAVCL7U* zBFvYcPas8&IUP8g3fP)Z66!*oPo6#gG>erbg=%gK27L_6PY5u6U8??pR$8z6d2lD> zciVe$0YQ{q(=tKU-0GcO>s1T8sxzO*1p#))gqrHbMhi;&%0~P&*7fu`x`C1tntc}_ zIEzW@ob(=RcKspZo4xWeA(>2OR;QZ=4Fuy8V<_0D8G}v^e%~`v)M&LiSVk!?a_-zbo_^0zGx3Xjwo{`0 zf_IM^w}e*^2>C=}+}ea9BNqPdoT`iDQr_OURSWR_hz0!mV9g>w?xh2x1LN5edPuC- z(;2SB+Fi&(zs_(+!y{$VReQS+$wc&2H6h@g;X@WnNcPRkp%%(vXu(rgUKH=LU9 zt@^QK{Z-(zcgP9yHT|0v}9R ztgn(=Y%xBF@+~D-xaxM1%qCL|74L-UpdjUmEp7R1-H+?t{`%L3U9N>ezC1vZ6Uz5c zNN+8?GGP(Eq4e!$4MzbB*pMEOgz`QvA~2b3TYL$af`cb5m$z3hp(aHSxxS_o2>VtRuNp$mYkQ%SHy4s}rs$WcEq-spn{V*^X`>70F#YXy?-KYx==u z?x~@4s(KsaZKs+gi!iy+^K@^fwvQ*W*z$fw6`UwJ)@_Tr0=-7S_%&9cfWPb!pB6kT z16Y_5%@3Jgas?VR&%b7i~sc_`x)7LUZ($wRTo}uF!F{MIxUy);T?@YVEFkbfgML4!J zs=Q^9_qHN~ZV+qu9*RKfh&HhAfdn6a1My>gc)@x4PDD#o+zhY=I3Fkc^CU`>JEjuL zkyrtv2Q>wvmfw86?+<^5CO{N}(iJ5JvtU2;i4 zO0^e!xVWN9no=8|3BckM^aCPp7h_(!bk1XGH}T`WusKoHjt%>0s+HqCVu*$&(WmNjxwRH;C$Xkn+pZopYnB={e=UTB0V>3)TlRMK2({Hp$jqJ$1ceYu|I3al`E9yVe-;iNo^8RswNCx#54nw z9yAv)Lh9LVQ)FR*J@sFpABa_z^M-{Mv&Bp|uT-yB&?cr9N7iY1S%zz2$McO`tA~14 z<6O=<${CW6S;|I^wfB{BKE>~(r}udsR>aEIaXzdITb024M*tiCL$A)cGW({w-#br? z`0b8{aS}ZyqX#XvA7bq2Oz9%0Z==}M=~r-Z1dy^+!@Olbj^7CXUkSw;x2(CKv|Mg(V9)c?FxP^}PDyD;?R1d8Io%l z^Xv~Nbc)E2JL6;2u&cS8jwnFg1`U3nNS>6|e`hB;rD+FY?qMl=UFxz>F{-9~BXjLHw6I>G8KPg1 zJqwljQ`pybx5Mrqe)8#^WJ0%jaa0$qL~n_pE?GG`>t}pP6MAj^2lBC+WPwzn)X41# z6$`!LHT=K)4;8Vx^UAVGG9M>3-=_M>wj9&P71ZR9;=st0kBm>{4xbPI*uc1r9D8;O zvI7$~^mE7=g9(XY{Ck`PG9N{yC-YG4%%TZuA@-(BCmdO%pEI!zzedf=W*| z^&HH~Qu9?%@;OV%i00*iGJ5+T2ew?uK+^{$EL@}ED*DMU-@59AuHfuQxumzB-n5ES zstnvFnq33G0$oR+sGQBsNmfhBS4?iYI_~!e&&EJ1$a~olZtQE0z737bYz*65q)dK) zMg5w;3@)yLIjp;>+pkmp(#dzqL3v=-tQP}z5MGT(jT*eE%9HmT9c4P^E@aqb-+^%> zV+1vFU23h@^?#|pSFUe;Z(+^8%tg$gui*2NyGa{*tsX1r;oi}o7vXS|_6H4}$0+E3 zd|QbtSIZ9-j`QBNaZ8&CIg;q?zgYt0{Qk7|0Q2#%rOLCIZ9a#KdA~RjNg_;ugC;8F z3Dd{Yp3*aLl$k83)06Mu7O-lw4!Y|J6;fU}Re!%A*bDvZpu08VG*2v6L2i9{ej;5B zL+M(JmH?c*MPp6B_*odxAk^LYa=q1F5np^ZMZ82*z0Tu7_IE7UjG$?-#~&$)xa+@B z;uCL#{VryBRrXa`_TPY~^(OEPHP1PW*^Z7$s!-$dqMHiDn||F`t*vu%goKu4$blzd zZb6pD2=8)1&cjhcX;HvM693v#ICBX9*unypYP0@#ecRC`W*&HTIkgKORm;H(P|FgvaG@(hP~Ge4C(O;_7-_$+`o0g1M5V0I4{mS;I({ct^~2! z9REGaV%xtWQslX!KGH^~rRxST0Fx&|4d%atZbj@hRtfml2wqfZh(Y zxjTUtp1Qu>9cmn4c{tLA`wxDDdtZJ>Q$U_nkr($MuDp4`OI0b;v(;lDwV8fwvl;Z! zX6uu7cJIzCWqxFUvJ0|LCj9pVXK{Xwd+7K1_D1td2j&Z>Xyung-W2^%uTusM+rA4OX`hI_rwH3dps zD@g>YD_Dn)L)*Dl#G@zB`M&N-?>)U)lebiTP23ze?8Lf;Uo&}aeLz@OUs0}ryY8j| z=PQ8&B|Dvw;;p9cgu^I$})>8Ez^yt3nzrL96X*9UpatlL8W zHS-1YOZ=9unFswD{MHR1VDbCbvFLylRKds8bLZ%M+?ChVx!h zpEJytu4&!xQ8NYVx4A&8TW)<#{MEh_q4$T7Ya$cz65nYFMn3KLipMCAA9^Lu0-2qB z_Dw>-9B>2ZGX$A(2wB`F*h}*h+U*9-W={IV#aK#AWME@3EpBF$3?J@dg4;|9Eq((a|wige&NIG^*8CC|bKV`638C~QL@8OU2{zy@>8MqgQ!rvK0 zXJ46c>CyEL2HjiPJ%0{6vOsDdjp)9KJr-fYKwqi4R+ZH1i>TPQC_{i6$F9~EuEp|G z@wc!D{l9cmBau+-{m;;|!)6m|OK(E@mmmIRoNgiB;3^)p*VQ-ygqR5oD}iiaA0)ld zRcx0$&~iuHd}@?7ln{}f?l-WswK+N`+{K^1Q|r6H49m=D*ozEmlnaJjA@yqU*6=hu zLthtQbawSyz9uhe%|muS=u9hrkN|lqQLnr9ZKcY`LWh#F@mGAbeEi0VC2D#VD(G?C zw8B>AG<~D8MJ^`@9kvv1@h@wsyIUi&nPBlHRalc`JF&=1Io1`s&Vs%*?XT;qS__}+ zZ{B!_HdF9`d~gZ(X)KV=l_}0jqAJjD+&LBeZ1Y?DlRi={kJZ^g6a)`&7l2&T`yM=5 zEL*L7*o-~U_OLysO4D1v2(LB*7s9M(w-5cyv&nk+7wmcN>>ct79nG0LXj37kwtfQ% zqg=2&uAonQ8(<6!F8v<^vfeQVoRchFO-~JRXY+$w0P^eF7D%rvt9@Pz$hbCdG6(V#2ZLDdevCM5%X|)#>3cp5dk|iX-Gu z^$<)mc5&lWQ?!9T{SiOtzcaAmb$*u{a;0XeXCDLOx6Qb_Hm?BH!mB>XM9JeCt}4;h(lK zT{Jx(4GNWo#-c9_1+uEDW?kL09u3z7j6T2wXGvO>t(efw?QYSPKQ&$rKe^dZ;-h}4 zH7!ft#ae4|D8Z$NxPg_i|AQek%oGw-d=nih%{@+0nlvLxe5;gEb$_C+C?R%hG1>&Jl zKF_!{_kuje=i@Rqu(MTXKF~6l!76~ySfNrW;jCVS&v`WUB2777}WqGeoz9tt{qu?yI}XcJp#&b#e};VTJ;0NTO${Hc29Y zI#eQ4B_#HL2refBdz_iq>ln&5 zo{=kCbQfIHbCn@&BUanyFu?@<@x=s>G+F?wxK8O`je+9LgpNJ+kk!qw|vMH3bzTOT-o|*0nod>gvsfdR{I>& z$5P-+dkapq%E$aF<_zm9an2qrs_{Gf2+@=0@~tP165QQkJNVY4o^)cm6;$SXB4TZ^aRr$pxL*O`go2|At}MY@nx{9*RN3boIz!%sy)xq zmK;n6+c*a!PCPB|rw!FJ8M`MORD-RtzRrSadT%t+oMj7**-7w2Zwq1nW@`D|WYO1G z++|OUU|o_0XJFV!z&3ketPu?jA5Z_oCAZQ4DP(=Yyc*g4x;9qlzdq>+s6T9$I~&PB zS!HmaKQ#mD(-9;C12}@uIy>7w8Z?b2$5v9pugZ!6k<5G3AqOK?6RBngvsYA{r5QZ2 z?GD`odhWr*m;9VjT|tIH*iGJ;8YVed6#6StZhu`{E}SQ}Kj5!0kpN#7uI>$Mi=o)G zW2=OET$uJVZ0jhh`t*x2pyARZ-DqXL@IVq8y_jak9}jg-N6Rz@cuY}2mA_Xbw$_Cv z?-v1s;a(VIX>twN;X}sS7Wmt|vL` z2y3ap7slUG|Gem`oYF`+d4G-|MZvX`!w1@fudzxS)q&Jj!IiYYn8Q@Epw7$sW0K3k z%hg{4%AawfbO#v2|JyPr>oqF00hLb;!zVGf0$0H!_gU&WK4U?QeVN$2WBtWo{*#n& z)bAmaH5!X6wo~sE9BUTl4AaErY>wL{z~NH!>(F5M4-&$uSH20E7E#XS<6r^bi`YZq z`GL=6Q7$ovJHVxftBd0tw1bN;<_lRP`Lb^dZR2|Pbr|mhV+jQ;uYvwovsY+$%B(OH zwD0{d2EpDyj@KgFm~AB_cr{UO_Aaj_!n4WAoB48%_=soD>z{^heOm8l6c}XdvhEoV z+|_)hv+_22BxCN_Jn6=7FU~=~q_BO+n3`jZ;-HSmGOuuad@bxYd@fklvG3=w=x|v) zmJ)7V#@)fs(}1(=%343h`Tss>`Y)^V>cS1{H?RCo$JHcoQy=-%U1<>xn@hAUHZDN>a1Lpg(B)`G)pOV%m>juxh^2_tjFWTQ97w>CSQe?C_E5fs}Ie9nmFP_9}z5q4=?&#tMi zw*=b0WW<%Rn@X=xGffC8EFPf!#LlG|`X`0$*>{Kzx?jrOd7<|)ky-D+lMnvUzM@!Q zWA2&Qt2kFTO&yn>P~Xk|qB$EiMfU4$1uzj6rF1cIZPOF~5M(!#%U34h6 z%B4fFM^l&HI#%9KKP!APwqW<_Zt2L&Yz2EsAmv~M0DwL-ib!Sd&K)xd8b|oasZh=A zQ6Sy*R1=Pq+R|2$pwlnbKKIGRvo9IWUN#qbt3tcL?d2QE67eH3)*_vb)W809D)jqnH0!u#KcUwpjM^!!i;&mn`))fwYgl$Y3S> zV^nv!BwV|hlVO25=X~#PFlKsl8enH@ih#XRd$G9rpul;6qmxT+79W>T>tz2|1(8$O zbwquXdW@29%se#W_1m3w&@O0R8?wc_*sc}EEO|8LYVqH|g9 z1o!8P%h)nReK2nPaH+paD(J4=>LqP(LIPGjd+ZMRz5z91oD60o_+FxdWLe7X@iXoIoCT#cK=KG88!A~e%J{RlmS{r}RJvt8Iop$uW zdT>Nnt=2G$U9~?y=hXtvsXBZfYk-sW#G8THN%_K$YLX6C1_<&~XHfR@Zd4-ECTmz7 z-uga1Zz2CVrGy0NR-WH85cFzRsy!~@NYrVc3vlA&h4|x1 z-Ai|xufWx+jo3ERWj4O8sf}sL4XtC%Z=SNzSoxx<;#NUc-O&XbNz+OzmLZ4`Qesan zPNEPw z@LhBf&!4w|#iYxn-L<>|o$>O50vX@6n%o5LdVTn6mAlTGR{brI`Bl4p_vzCkE)nZH zh<=~Dd;>Q=q88l)d!!fwZArLLQ2%hHps0?SHhGROKwN0-@p&7A5I)@-u>Ime$AaXF zGu}SSvPXz9#c*u0$yUu{^-X^ha)A&1`9Z@;O)bYD2JGqZK%5XZFNF z8do}{Y2zLe+)V<%DsuAO_k|w*x%9JY(kUPHbA;752Afqaf12z-_|4rw^uAIH?{$K) zsC{NqR3Yx(Sr@kb1{}Xt)1m7lsLG)Rmb-`=y-r-BBU5CAE4YgkVf8Y=0WA2vj=PwP zfP<~KbZ&f!&Peq7(fYX8k+X;Co%{asxe)romeu>DhV&tE$8<6RHSZ3cyY?9dX1~`P zKT+xq*+VxhU;182OE2Fo1xI-RcCc5yFjX|H%cr1u2pit7n+ShU%b>TXK(ck(&PH$I zmWo(&Nuc^mTHx-Tr{q=Ny!4!Spv68r5G-9NNQBuuyg7aF%&pX{0hG+=QrK&oeSMQb zMO@ln9iEf8URUz9(ctu*GY1l&)$8E&zz9xuWl%pZ%+0EWbB5c|U=mnkuaX&w6k8cA zGM9iuSSLKD(=+KcmO8widP~5mT~g8MaVa9M2~r}jJ~nlmQ|`A{Yxvdbu}ldD{0t0L ztJ?CgPl=H=R@1WHo}03P)}385E+Xxm4&%rHgRZhEEx=f?o4Caeqs%RPplh{TMuuH7 zM>0647!r>YV(aAK3#6~mZw$)+UVOeO@;Q@QRpFSh>U{#9cT9jEc2fIQ5OF=~#2_QE zVX0UzR;6w6Z!{WoGzA`*z-4i@ONJYxOXRX(Lx_bM%yB7*o|UX*+ZQotG{ao64#W$g zzuCA3*qmtHZ7=!bj0?32%ueAanF`7F>t6dYWhlyPR)y&AT)QpmcWh^5T=4q~|5>V< zq6+GfJ`t@?7Y&tb$M}b{2`YcLm!(j-`vMCozi&o)8iV!f2eCgEJHb$FFlQ&Hfyf! zbpfR*km9$K6E-XTKj+lrs$6R8uOX5b#c*K7dI6TkdtcYRQC%!DH{LMB#wG1Q9f+$k zRRFgtT7)p9a1`<^0-@=ODXb9BL_K1~%>VK@^yQStz2>9f=yCzBHtU@3{UM|HYD=pn zqw@*ONbk2|aBybdF}N(RvQS@;xbZR)*|%fkqx4qhj$hF_<4in2go;D~++R5YbD`!3 zV|%TA9wzA*HW&f))K~H;!)A6O9kURI!hCd2g5TzRu_Z7dYUaJ_-FHIU_ZFCTQ`J*Z z;Y9=c{{6v*TWaqcz~H6!kN$6eSEUUuRw5TV)~I%b3voi`E47>t(+!eC%D6I@<5Jn| zA2{5K;K)onY|8`iuH40j+TUyN3|0p78b%hD^xPflCF$aXq>sA)EiE+*hd22(EvGqZMa&5H-l}(0^y(b0GMo#?LbUu2PNB{!q4P$=H zA>m`uf=hr(W+{=ww=>ZDm1mx-ghf4CG5yy}*ITtuyCG1Po!o<#afG)nhP$bZNBUbi z=gFN^>!-HADL@?)wrt3|EtY+l8O#+mDPjPM z6=+=hQ5)o6ne~SrBxAXDzVEt)sezBL-@OKThTKt*piKI>kcwT|!r4`1)WG%s4rY># zG=ou=CN}}64b_TBu;lNiD41s)PF^{@isY_ipa;Vlcst&5yT!kNLE~~yty?)+a3Hqd zEF*z9;tll~Pg$#hZ}~|lv?#l5CGl8`Us5{3_t^oUh8*h1rTQ5~G&in_m5goGNlSo9 znXF+y@E*tdRU5-&)R1bL7Ge3fK$DocrgiVw3y-dCt&drPyzEp#(XyOMpa%pNjk*uA z4>@{$w5$+AKK#5Dw7Yvynu)nG);rsq(dPwg9-1~OHc-NrYX5J_u>R$0`SaB`6oP|H zp)O+V`iFYa$VWd%Ep}WVd(`UPd)^4HKg(lLDq&!poPsYstjHL7M-k}-;CY$dq$yE1H zjL2^Koy;{`x}Ntw)tKO)QaFYqnQDb+%AOw8xs&N&MCq+;z`8e#3-ha(XM?Z%e;e&R z)jE%oqu|sWK)=p4!AloN<4NK1UZlId9W7sT993H#x0yAp{)$#;q(B|QABU4h+Igmu1j`gJ#VU+7s+1zVZu zvGIoEfhjWd8!0*y_ppW`W5c<|foC}xdLv9Xgb~Q=ITts1lyMtnmq3*rN@kv{Oa&a) z$Ie3+PHRoHwYJ;$BsuD_V=kb_9gZQAB@1j~M|S?~A_u3hWi8>)cDK*Cs)b=jgJ&w# zmqv=DS_&B7xsy99fO_-p;vB&T03rCNKZ^hdJ_dZlh8d*=Jj+a)0jVSn{5v&7FuX&c-7G8Ojz^5~!OKgf8 z1tTEQ^B!ZWvd8#R|7=GX;=Ch#*4{M9Ne}*bWl}MnqR`=kRy2Z>7HOo9GA2%m)ulO$ za;-@xGPw_&3MlhpXCRqKZ$zSs}!_4KZt1sdZ{T{9_X{9ux6z-(@WxRwndA#)_BH1W=pG_y{FVkFJ{`$C zoRF&eSj_7y@Q@0-vyHknZcDKu;J>oUk+vYz_R{e?f+#XyfqmeIOz1y> zChDqE2iFP~H+a$pl3$9OKc(t_F@qHq`?1u*7sCTe1U9M-y8>uykmtj18ok|RZmgPB zX|<=rLUrk}YC!6J6R0vAw=Hw};GRapI*YSZyGB$3OV8AzJEqS^8A9*R&Bk1JwHBo| zv|(T|&^HGv5iDzU6SjgZbm&-v)?`=;_A^{1{1ENk&EP8t&%PLJ$@Co;IHP(P(C&!m z0?WJ~o!cT}b+AEvIJJM~mjYPMw!&#@s2Z*Kiqc&ms6`KtM)nRVCAYXkwWo2Sc?F2- zO4Y=RMQ8fe;P0H$AzD%o{s#FN6-ZvM_+J21cD%txbZ;0ZYnwr?VDej94=-wy7c2LmZh6HAxl$+iL_l3@*q{dJT>QZN&RcK!$?d5rE}W! zT1HLJ3XSyT-n)Gl?BZSj=iIuuru}jiOWC?df?VX^dc?9;G(tp>u{lo{e1&yaNk>{B z27``0)kS9=mUHf-{r0Dj$%i(eqb~#gb0=)&cvrn~liS7$smmxL^eAmv5n~tw~&k=M^KJwN3Ap>6cCur!90R3#FK*V}%fowhFsBXVhHSW4nhxtj0 z#CD}c=9k@okW3cB|KVqJy~$Tu=twf8-OkdxOk`^2;>vL`NavEG!8p!cLeWb~jM^%p zj$(e4Iei^6fKqV@d+!z3aYJcXjO~_!ubQk*#iAEHC-U&c1AE9#0Vh)|}F_%X8xpFaPfG2E_4Qc9{v*C5J9 zio_9zRFfh8IyQV{{9k!@h5n$Hko?yVi8&BlYUq%&Tfg+{iAh(iN@5r@)X+J$u%b!67!%3jguPYxoYO-;%w>%SYgoVxu5CgMxV(=?WI|_@TPf(_4CfM<7v^5;6 z*C2~Ij72N=3Ru)_-csem)-SfIo)f6rXzQkxNQP!yU~})D0K)_@=xFbIUC1U4M*OxH z!XL0B90jJOhlGlZaWf^RaBE14J=8SfRx}%J&R9j-R5gZG*;7#^#nOXbz2k7=HR!bv zvoRNqcb!Ze_ezTBzL8T&%-K}4`j*cR$0Of6qDzim7TIew5M=Lfd5p&5WjiqUWC_#V z?JG$?!-rzd3j3BR4a{OADJW?+jl(WR|4n%n@ESRte)!1X`AP0) zqzN2Mz9dH%+ZV#OFB^N`o1>{Av;ExW!bfpqFq^mGkLTjKkQ%oM6t4v=q2bQ_%VJf5 zG@O-3c28h`P&g2yapSGOum&^NR>0`o5;9H{-TII+U@zBM0DE?We_gL$j2a-gD>AaHfGTE>#Gk7l zwes#G$q(Uc#TAkfo_Tz?>(_tX6owPXa z-se*6g0R%$l00{SA6HDs6zg7URlr`$$8yi#4zO7H-)z#wwQcFunXnbPQ`}v2my-XW zxjCQ#G^`2XiCNx}*_QOt>8HIaixu|LyJMnjJ!X69Dd5(_{0-6Ni-lsv;bs_Ks0Y*s z1-h6B$4g#4vB2$g9mCs@M9TTzl4zWnL7 zv95HacRNK6ieZ|5PYjW*iG=F|G#%RR)N&Klz>{n9rLyM{=PJv?> zOf@fVt)K&EEGU`nQ={9<{IG&`3Z&C3IHWbBR+{p98<@4a z{PC8kjJ41B8_OJB4UL|N>Rxqz`Rpil>kb)t0spDD=pw*IUQ4Sdw4Z~Fx#!|rZX3hY z%bc4kN_J9ibYx4HB5<4hVNBQ~*2No3LKlDy8rmnukX>B|J^k$>3MDmJnt;#_KI{j4 zoICFDVv`N>E5|1HIOEJFT#&RB{Yqk~_-PCa_cGwjpq?|RI`DDUS&X`o|EHd&pfToJ zn)a6a$i@=THuq~(H5jsnn~>AJbC6JETRn(^Ga`cJ7W)fJ>?U?(%ck|t&CSn!U*+0k zZsrqe)iOx;nisycGw;P>o~^`BLf^6)sL)NmSb2-!Qf15~tv9(NikEF&x^Zxs*t;jF z8I5T>fgTHfV6y$+AT~F}|I`pE4|Fyf`FN!PmY0JQPvV`y84!)1;mc4cl(SU=l~j-o zGI;A}Uu;!&4B~$3Rt{j=2woVT`4ppODxiPYpN8-N%1(_>jXVL05oVGlfbokD@;0o@ z22uW>|BM3vj@VGlaE+JM+~udV(-nE2!>>NNl^&RJn4mEHt@v(l z-aYp2jo`c&1_x4^_6bLlC1g5k%0}s2}j*&0NRn0xz zj&nu)(5$$Pr8230L9SWdgxl(gTZs*iY~&zR~xvMho|A-mMu?9Qu)Mw z->PlGOfXi&t>jU?TGCWjiESD`XG_(^!}D14fnH^s(wSakhTog!wwD!%yHBtbPHoIU z7|1{rK0DKWVsZWtEA2H|>JEu}6V`>szVG+vX--Ic_k2xjtTbL!%MC8x<_`EcJYR=6pdR%V$R?X=%;752)h#Fn>?jL|;sH{T@EgkmG=jyRGrI@IbEdiNA}C$DJ}? zxJ7mU|i68gyW=G4f;R!)z4aC!!eBCl@4<3GiVieU^w~b{av)K zBje9|FtgSUJ^g?no7dqj%r7t5)$!{4>-&UPm zkFS^Ltbk9?uQzPoYj`Jv0j;x04kLA&DH7RjJ`p58ImA+*oJY^Sz!)V2>UevEb%p=h z_ElPM%%hSeA~rqnGgh7NQP#k@w)M+YpCMCpD@S@2!-$rj_`1^6J3TW9hN(L}?f!I` z%WghAG(@^W&0~Hz0{7acY5JMY`RfRq;F7>}JT{E(9w?cYgM#5?Tpz*qr?V{G_~K$89wv!8Ol!9y!^`Od#Rjt6qu(Fiq%*^9OI0F< z4}SgSGRFuk1@oyV?fMtwPHczx45o(i`G$n*Gb%+x6{G{hzkLZ&n}=KSq^nO9*_r=- z~Fa0Rl8JgB2NVU|Twu)7(a`m~Lxv(&D`siQn96eRx6Ao|&fk*9)DX zw|8M$s_V|AN^s=JOBerN90omh+&Bel6uxGy)z^&fu4P@~@(-VZnZ_+BQ0Ov4iIOO? z`lmPR!gJZPM@n<9hM4kA>~h6HAu*lAXv(NruGm>uDT4TS9ZDdY|0}^MIQ9xdXu9Pq z1If@~DIp*rdq$z`VnblStvxqwjC{}ULZrJu&mKAIr(jbsdgqrU`Ja+o@v8BLnaX8u zIoHp9nPWw65aKrnQ71&7qc(#-M|oF^sgE9!s5a}pr&q8ReA}x`hmrY9vt7Q(3o}+k zxEef8OHNpHQ|9RO;!9w03v(i=3-7^OlpAW6bN+x%`RU$h$l`+sQ;lqoicJ&xKKaYy z!~bl^Xw97ZI5v~J%_e$7cfp0s;(?|hkAyqDxo6;T$US<0j_x>A%XX_ZCOs-4i#dJK z&xQDO$H82|kb6sTl_m6Hw!xQTfl*U#!JD~uBPZK8O@M&S^KmU z1(1~zNlT=A6~Su|lM$g(iNW8H_OuheyGw1$C1JeP^qNB0Hq#F)38ZYi>2anLU>fmR zH*Fj`lE5r;)}A)L3g|Y70)cY)9nyyNBW{s#w@+Df(Iek*hc@QS8cByIlN5~AOEDAw z1u8)ppGx5sVJfaVN6?>qP7}QQhtE@wo;6RKW=9ggNfM&K$_c2mg~=euMDys8&b)hx zL8@FJ9=>o_vLL?EugwJ3=H1x8^^y!$OAUA0Z6+#gEHqX`r$Umm)uTDOo&&^D%7F>R zH21cy z-VwevcVzqENV)x>06D-P%E}jMp0dZ}d=npvnLS(+ut0qR9Eq|7!9p*96DrtLN*~@4 zKw{suggmSNZ6UXTVoZMZ4;*15I9c{ptNY5)OuUJ}fkK{)zRf90c)Bat=;wgObfeQ|DHp7@oiCP13OnUa4M6@gI>|R;KD}r+{039)YJ#g z>dszu8BYDjyD|Qb<9|!xstvK1v`-KQi!CMoY$pM)?^da9-0$R^(CeXsn)p3{TGn&e z@C%sT`xV+tu!N><6(qxMvVIfQfZEI6TpjkyptzEw)|yw)B}G`s&57c~vGl5qW}`K- zJmAz$$V~8p&F6uDDS!9_L8Qvoe-iL3JX~f4-nJ;%&qR{bv&m|H>$(jM>S$-J^tQ{V zZz*lAC#1gwR<7-pTYr^kW#lCLZWx#ulQE(J(#O)ki|$TXe0Khj-2ZgvcwR=_ukS)? zgI!*reqJZMR?Yt1@9?922#WiMF~=A)RX}IS<5$-|OfSmUjV5mW)mc1hZHAai9>N17 z96uXy)av(6OD=AwKu9925*ugw9`D1hvVq>dmaX?;Ms^yfvq6I?M zf21Qafzl1aV|_+Pm)rnoqa9@No3VPwj<-Ac|MKGpQd@w@uTkUXNpLzw=CK%M{`{GU+)@|f#%cai z765(JG=As@G<$o4Oei`jE$y|gPkS>mRZ67EIvs(mJcTt)6!@r^Jh9K|pdGk4r$Ee< zXng+r=*ko>DI(CtOoe~?SYbkec9;DQnVWwv??n1UeOtB6(Dd%!|F(R~)l>EiO63%| zHE5=#QE)>6M;*xjRuL?<-S6^}(G-tsmX|9b;4Ku)*hA^yaOW3#`VBVP=SE)T3A8Le z9nw!2QM+itYCgB{ctiF#?=^WCi0aH)E_363auU$NV{V zJa+iKMviIt%o4R~ImRh~{%Nfnn|m}oI~OGg0Fs=4re*q+d|`>9Wk;##!DA6yy+9!b_LGB z>9v@V{Y%T|93n&--*i4NR8(wkd8~NhNDr4xyv#EuYoc`-Kk88n)U`4h zr#VyQ%@1Wj-pjKO1o_SaDVlbAToD*(#(&;?#YGC4F#zHCtyR#t2?re z_53pvkQ2)^NNu2lU?})8CaipUZW0@*8!hNN1%EJi$?{zrf1{mh(}MJXAHra97;NMl z&dwk@;3;o!=GDxaD&$HN0v1Wh7$+z*j~k8VOhdeb7@w6s+i|eo`vQlhk`)*-b>4V& zmx+ARZ_Xc_{;TcHgmf)XToRd)+~+jFfPbGgM%5g7?>AbhPLo5zYQvJZyy4ZnsY;^%0&G0D(S zPb8PrnDfzHZSY7MI?-F*W~@JzooVqHL}kqu>w*720j$y?u9#*8$d9FtaRMJ&sz5Xb z)+5HF>xb2?HhdiKXdcG%ErQhcXD%>>cMmFQzcb_>5s7YWZywUUTo;yc4&Hfp^cv!mue};dNR^`=g8{ znT+s)GuC0>xT%5^xbHslxw-*+FdcVOEgQ-H$O^t%HD2n5t%SpF3T#~hn z)S8g4PMf#>JdEGuJHnMd_u~LF5!?#<%`~R(_Z8F z@#wRV$FB3#FIef3(sI*~gppI^3{?mtjsJE#)F+4Sp6(p7uNTF!aRi+_kK^nfQmCuQ z`70NYZM|}baOLd>bGMPhoh@eY&6Uc>{SSM5J8sAp2$sK;5<0?eojw)Os_Gbm4&6Y= z$yscD(@)08Os}tUqiILg_9QD-qJ+A7(#1+)+wn?a#%Z zb7221u4k3|26!e6B^X0avYxyg!H`1@ooK-`^B{u0!Nw_2mz*eUTm!y;u{Sq8V4Z!_ z64@W?d=^a9{^)mKFL%^yZAq3IdeK`(4w&0sW^5U4^>^(m9JU?@35<-ghiwaV3sK#A zT}7;CH?dFUd(Li+mWT`Tx;>S0#up_#Ku7i~1($`qsT$XRk)Ygg>xEfW7$ z5+?t{MRHRy&HWkS-A%lep@`!21w@-7Rpagh_VZ5l?PJ(Uj(@LPCdA7&6o_lp{my-U z$ihIrD@*+h`#$?t5q54epL18Zd^OjY0te`ylddTvKa7t=&}rn3jICzIl;0i+snvsk zJ7AQ0DC6kq`D|&{H=j;=H-rsD)hF- zNGYJZ*$1QW=Gr}g8jn-f)8XaX(K`nUB1W*Mts615&YPnLVTOcmRVNDiXIs-fTw zcT$jy`-y0Vqxv7=r2%K%GDZlS);}OYh$poL)&qbqw}>*S;S*DbR)(ZvmwK{gr?)CV z1y2`c(n)v@>`%PnQ)Os>a7j^sS3@0mf`HjaYvAmp*kN7%EJY5hHf=<->=2R-{tsL4 z8P;U>wtMR^$}o&XMMY_GWE35Rh=}w=1_2#ZL=>bY3Mxv=NDpa$MFpkAN)&;JNKs0p zOG{L$1PDFUL`n#dKp>U$oq67O?_(d&em>>Mr~AXb?sZ-3T)*o)#~RiL_7Hv}B74Y1 zx$B7=X1@N7SCatGPbEoT5Pu}{!(Lg%|CdhCT?GLY5!PNF4VG44@~?S% z676dc!)^2=240}hUStF=bQKx@5A%R(W$kF5Ea*RT-mm5Z#cex4Kx%DxLw#~j==bQ4P`0?JYZn9O)z+ZHRi~8}$>D}+Tlg-tTT!2- z7eU=9Sgg_0sQnQB8tGhl#udp$TF2=wSDlP!gF0<{mJ{P9V6`VmJB1rEi9PMc-YPc+JO-nf7#$?7zd-R`hKDX$e+}N=vi#=PB%RJO z{nLJ)_De1Kns0^(I`a#g?0z^kl=;JdQ}LzNMG_m-YODBP*Hwkg!RYGSG_%4 z7q!=Iet^(SgJ~Ao##&8bO?k-sD4e2J^{V3qauZGQB?Y<FLE8BAwlXzzF znhn2&MJ$sOhX)i&9pdarNMxv>Ev4s{Pf z6=lOJBA*7d{#B*v=?59nNPL4w^RI$_gqhIKi7P4QRcAbm6PBXe8g08 zqKD&zYH)lU{jzD1(FBgND2=wRJs$ep*F zi$QC3Q9kqY_n|J-_*g$^h;RSMl1(GC7t26EjStjt%Ojdz->QFBe*R&=Sci5*a(1hO z=NGTJCSDzyKL_)i#+v8F>$EHTjN7ke#s3b8;y17862K<@?X#7sy<46aojn6M?OQe( z^FS0BJRy#QqZso}pO_SUGALWwzq*FYePU+c%NeVhB{NwEmY7XjSNs92A5Oh%buDT9FMw;Q_trLC?VK>(3p9bD`-;im!j= zUPnbH3NE<+@cL9CEmPRYNn@ii+VfOEd}Bva&(Q;o%e6<<ptoVwBDNZPlx?*|m0SxsQ!7p9@GOl8!0X(l1~Fts8WfplP+ZpdnTb?TC)} zb4OrMy7mCIePZ@sW70MDj}i-7uLYfc_p=N#vy6J5-~SS9`^gu3vqksNzbGYG_+gOG zDU7BgSjmvUIG4oJfyH{u>3Eci2PRoxr3>h%{hj@?oGU8v{I~3pa`@O+mIma1I@{ir zK__W5SAT1uGP#c=8fP<+xIl0$X*_u{(CP-aGNJ?+{)OCjGqLKj^=91yO)U0>#jP~l zd#;m(uH=B@vG$=v%8fg3o4{DTU9gcb#CRCL28A8tr*8@#-bDhyX_(Qc-CFZJxYx`E2b15w%_w3V)&dF|)lXr?Q>0(PF?ks6s((bla<0wR0fu%3+c49E5F6+)U z_C+Ii0?*RtT;h=O@2)YKR{C5jAQ=MORPt{+?CL}7X47T^n#~h#IuUvK3MuHu%7kF( z;?#h@EvWD?%Sjp-=eyNdvakl>87Y|spx?;r%&}>8%EGsgmrJ|=FDmp$lDL#v@nfh> zLP*ie67PqD=Vhl8kH)zr{75q1qh2|C4tR{$fAAcE{3=|t1PYC1sk*|4bNIHV{AJG$ zu&J8Qng~IIn-meM9I$!J^0=@JQ;jkDNRd1XL=PB8sjbV`CVRAL0YceoYX>k_-hNGe z;W+&{gmjccl0_b>E2ms)S;h|^QS63*~{PrULV zLAZYi^j1`}(LP#o8z`TYAKB%2i*s@L=ttV{8*UQt#hl5To^!u0I?3{Ew;OTW*B3nq znK9N6UZ%jyTOz8z41w!cDDZJ^2mh}sWB z%e}mQufxJ!u}&&6@CDSq#`L3hcNsUx3+`~R;TQ(jWKN2N2uDqmd)RspOmwg@8BMo2 zq=}Vl6mOZvvrCpEn}zw%;~p3ej0C>nUV%`(Qm5wFW~-9dpky`kp%0ZcsD4w=H%CN0 z_liY>Dy?e*0iMS@se%)k=&$!SO*;YhsARy^t78vXsv}Ku7*sum1kz#C_{lb1@J$UO zV&=Hz)o$AN8MV2u#tN4BPfOwcX_C0!r&bh9Teo~of8-hFy@ip?z+Ep%bZ_9mZJ&Ky zTeAZ?LyZFd=u(?#2n$l3^FOCOKr=q&Iz6)++C@5Wk-zWxp|-7u-;BH`<)xjY0;vHQ z^~LleHSt;{j63!wM|c|tmOnhPjk8d;0S^H2omSleDfU2$bTnT`2G2}_+IH>qUDZ204exi zxU&0=xcNh1;@d)N+(^on#*xedmfyf3#U8Y_GgUVpnu)#^21AMQml4y|o4Tyjzr zjO@D!a*SS&-Ok#7br34kuZ23Fz%CfxMY+RnfcF0nP2i^&&DW3IYIaRD<&^N@GHyOL1AJ_g`aqER*470DOxE)b)O z@#a9I|9BXmu%PR-9s-2U8*|kXKAe5J<#c1m`|lUYrY(#Kc5aH#7F5l{hVoFUW8ddi zU;4AEZpVc=+#klkw)~O`2gI|3YmeQ>7v7UX8^f2}EFvHi`J;)vf9D!u#p)=Bz@Q5y zI$IChuN%K`Zk9M?mbC70ovZu_%vWrTh3 z@`I?;kiTmheo;d!E|+BP{zO0W zsW&I49>BnHHFih8twU@-XZ}PWDM%97k2suv@o*x>>d>L3wjgo+fcB+alTRNItHD>x z6TvvxhTrMLn$HKYk3w=U?Wv|G8`e-yJ-KK#tbsUbcOjxVX=@_ccvxV^&YQX~b;qo! z9Dc4eIav15N1k7DF za+B~~MdH>1K)V{3Pz&LspAQ)-UWD9OPLQ`u>FBuY!3?4DcdYw0?2*EF_RLg8@gj2L zOV^IC&fA(a20jj#47&9}B#&@9B}B4=I(gMzw4rl?AtC*<0`CQ=_3SXwCi!T7^CxIH zN340=MWw0`8*iw)c>^J`Z_Zvko1b#^*2RjF6Qv8DaDjuu;xpT1Q(eZ6(WLcf1B ze{=AK9iBV-e%21sO4+p0>E}~fJM0&}{5JSH@uo7C7!t^hCe|<%Ip6l~rnNPNlnGzR z5F_KV2}V4mBjnPzZQTNKM36tS(N-4xTsI%1j|6J@KXXg7^G#^!(3?T`)n z-XK^=_xPm0`@lFVwZOtgt2|1Cor_C+{zc|r%L>-+B>8BsUH8+p;~nMON7yl+xh>zAv}1prSa-}`r2E@ z(Z8wRYA&Vbe%N0WRDB*&QSVXq{0e19@cJmw52NK8+GmQmNACW#OOUn;@mGGhG11m4 zY3k^S3=;GgN<*w^W~lK zBfiO*KuJF#Jad+Xbzl}{S^{#$yeDubj+*Q5s8Xl=k&?IZ>3=&>#6=QYR&EuFQip-p z7y-yq3e^v~dJpEeatGIlr*Y#mxv@SkX+;K0?7ry<9XzeLg~^FLO!Q2~8^D_o_0#PJ z`1nACFlx-6?h8o~S>aSX<`RWbDPMR_CLW?&s14clGA%1Sp5T|m$POTcLws%#d$vhd zQ(Oa8yI@JJk5l^jW(;{OMGrmA8UfJgS9(t}W-nRx9)OaC8&Bj+)X<XSq=E#mH0zmSX34rnp)G^qLuP@JDNf;l*#v#T%97`~-c8*#W6B3~}_7Nsqi;ETz z;)=G8g%dch@)V0`hul}MShJp5G>fF46faau3&rMWPTKxBjz?$hfG{WSWxro0zl+^E zh?V+Ms&WqIANMmxl*iWF(*Y$VwJLfuYZ(d-Z6oSa|u4l3praO7PpOQ`^ zMIZ!vsK`|N#1+*Kw}nPo1KhP{M)6Nu{$28UnoY$#4Z^oQDEk*GllMKxmXz^i=sulnCNuIx{}u<|H-bqLed zIsUX~d0^+zuh<;#_g3^bmws!$Dpt0>(jXNA(pwA5bPnIjKMX-XaZ97aw`&TEt$q|0 z(!AxLt(`K+jP#qF-)Z;Id3wU29r`W1ELy7yA9C{31Kh%v(nwFeLx*<^ZLHqS^l4hH z-|G|HDpmeay0ghq_Yfao>?2qIwQR!`360xv)g@_H%6E9FhRkJ2~8 zg6U3nIk_D3h5NCj97Sh)9gDKRTM0GZOMA}U@ur#4pz&xm!PYK4TGq=~0!6=526Ls( zl*?Qco2TAa9v3EXPzr1HpGtgllx@uX9;6sJKPpzf`oyv=I2Xo*u9cT$(#Xp6e>ZQg z7$xIXsma@smk?um3z-VL_X{5XhFWTM$@57wrfhPsS1tZS@gOzRtu!MgEit)lw|w zId*|;PEa8T6{t>4Mzk%9<19o8zV=1;+J;F!$)>_29IAYXnM_ihp}c{rDw#x;+=>z} z$HUD@(OCmV9R+x3Q|{B=4d2@L2*P?PPq)ks!c#CZhI}dtApv7b9TaL=N3Kl8pd~Ln zFxSzFk>uXU&(jZuLVs0J22NR=e1svJVl+6&^8m#_{mZb>mmPkmsELumRP<5u54n1+ zNou)J4A%vuHGAhRqgrv8ydF(q$lC}{c|r13X=lQPo8O=B6;r z=hE;m2^!^x870D3stGLr0p$&2oyRO7tFW24g!PszUO#`F){H@LW^+FW#PsK66?6b$ zs;uc!X@@Q>7w<|`>#!3?I@&2PweOeZqDr5Ydzr^FNLMK4(U4FMa>klcx-wgp@jwm1}o~TaysRz}v$v;|E{@{qv!|NWX>2=m z8MuV*lNjF@+>l}#p5@5h6syc#m4TE=JjKf6i`J^bQoC<{P_`?1E!*%ZQ8XcXi}?PV ze-EH>ezJRqAKWqiI6mF-nsLKjhx!bZ*yH~$0P1qU1&5QmF5{X_4eNce@6N-l|JoOyR#Z#v@0>IiTq_$M z@wXjXm1f<{`4qO?*^97v%&`h`NcZ~-6Z*vC2;uO_!PyOOTC$*FXNP-gPP*rtk1ZMm zG>Q>t-|U#naQuW%85}JPbey?Q{fgYUm~bvRabMURcrxlMxb>ixL9|)Ci?k_X$D4En_%n&NlLWQC7%th^y@3HXlO(_RRc7FZ z%4LCf&-SmP8_HcPR&IDO^2@(q_-1uS#LBmgW+3Du+(*_QMU;WV>zBI1mXdd8T++R6 zfSl6L@0e2Lu`T|JRy?f4N*@8M99Vj}o)I126vnHblpFX!Pf^t0!#ul>+MMLw^Y;t` z6O-1N>bX5dSswS0x-lN)J+y8@Af^oHpVdkS+@Fqa*&?(y$ca@~mwVbP)ste3*cU7y ziJ`rY;-<_y@&yeu;JSzL=WN8hFXd3t0wIGd?u9DWwqiEl9oa^{p*zqAceP)9ubUa) zq&PP$%8hcd71LCU{&HEWu z^yWZ}q%jlUv`|lJ0mcb{M-x|w%5h#jZ1skaV7~dbM$N0#GNBDHLbmE?cm_9mXGg2{ z(limWA$+b(SqO@Gh=+*^rEjJ)G6$&*>?pMexgyZ=OKyT142MX6MpPur^B(5L#hR33 zektr0{JsWP)vDXnbt^a3SFYOi&j3$AjZ=pifoPK1Q zbA?QN>GlDU$xKzL;~`*}75E7D;hTng%DP;=;A{+~h*YTLl@SBX9eWuKj#0xeeawl7 zWdpo*(^@)Zf-Vxh!=h^lF}yPr1k2EGeO8Ye(=0K z+O~e7$~u|9o7zFccy}`)2St0EUq#AXTJM7srKS=H^Et4>LB`5huG_{C8Ut%5qxfY) z!jAaBr_sYAu#^S`ZjuCrk-M$_i9~Vx;V}?dsbwZvUPZekt9VCi@Q?|xzSzMKn7yc9 zT=E;&Q5-vbnRbLA`arm#%viPjwZS=o@2?C;EQi6!O^fH?P;>H37qc*Gi9nzUIK8Kn+PQ%NA$c-!REk?5`2mPlZ~?_B-&?X0Apno~uA z+XdISFhs8hNJT9|N2%K_7_R_UA)f)M5*1^|fN%a&<7zR2t59M7Of+iim|T{6854g; zzkFvLH~(#R3V8pc%=G_ivHxwj#hN_K%astJxS?IrN%}nd{ZL61qIXSfQpf0cv4!Aj zA-zv+d)2WZ)}E@p96hvA{HPxgoV_>BFtsSaSFf|jh7h9T=SS&Zg#(Qs9kV|v$D8uIR4eZip7UA)cii$tq=EEw`^{CT*EzWMjVN5 zJ9wF0%^d++{k%35M;N5JyGDo(IdljeldbYQZXHo=xnmVngA)dsITMRU)vaoT?esw7 z6mitw_3Il=_{rJP(vI++Yl0#o_UZQN@nOSgH>0Q&U4LX$0Q-vQz?J-skp_x6FN$p9 zu|e2^Gg2&hf;<93^z+%$Tm71@MAA~0wD5S=JxRiOdg|({nxaZ$2POU!mgxw??$D?y$3E%RykCNv9Yy>Fd~CyQs=|{KC?#wu@F%iFu4hh= zepjLD*UjT^Be~+k?e$j!kF?FRPgTs)K7}Wq&q2&DQeY$@u0+xN)knQ4WD?dtgqSDy zIz*S1K;NMiPmz;Ly2oFl<TkPZSsG{oe&B`h=xOi01fVYo5#$sM_@D-V#<6}tEbQP*YqHrstpiiQ0s6dvB zGcMWYpfUk`R66XjUdS}f6;)BjLew6^JAwfwP{<=g+O}X4YV0d~i~l-o2;PjD3?^Tfz!|EXVX-m=YAv+v z>W}KrfqdpHw+dV0?p1BeKgV7RyK)~^n=%OB+$__i$0CL)*rIZVfrHcnRx2NeH~nMF zPqWP052Tin+Pt~ahzuGO*%LK3!MFg`rt?)MT@1bPw)*%6R#ew_Q<{no2;m}uR1MMC zeOB7+NLbEbu1U}`{6+pW|BS_*Pq4Tt#%NTC%%rGwhS zjjAh)GI@`M8_Cwf{&cNPY4cbqHVG)9ojQESD1IkVIpR z(MJa21D(-to)}F;o?UOM#kC&X()f!H%#E|8Il75d>}eKjbg);UKp9STO#WV5)>UJG z9LXEx!*1Zc^fdqa2c2L1$LbgUhF{7asf`Q>RjytM+4`rF-A_oq_fH~ICg~ur(GL2@ z5A#}_cU)&gnrCwTH|N7YU9?}i?}(b)e)yFxQSH`=_PF=?++#`Ygic*sMV_C)_1wJj z!Gj#_#3x21VKo++Nwqy1hlx#5^)gMzPng^6mUoFqMop2!Dd`=C z{CDf6OvX(3hfn zOuX}FqHq;A8Ft#JiVQ=VOa9UjVvGIF7e)Hx)>%4M|B;5KDjf=e`SIe^hL+0nWs@dx z)3Wy&SJTacE)FUjKg^Os!>Huo!p_g$iY?X7j5{|N_dHK*V~Y|p5vbjV#GMD18Ww?o zy5ZrZ4TOgsd~LC`3EevC)@K{>;??N7 z+&j6RwnS;dd@yC_+G`^ArV6K8kEI-j3F)#gSOp~UMWtYVb$vSD!x1*qKpNNCg69MLN*#)KU+r2L|3D;09WXJYgPW@jLuT6~s7K%%;M07=_>o%~$S+(lJ`0Rhw&E zu^HilgZ*G4!=KZ^>N*$bx|9s7CF%X%NC4FTx6a|a?ANLM0kj#tBr2*INeqK!{4$XV z;y#)lJm{5%fTfeN18@z~`9Rn5HLxLf+YF0T5mVBD@AAT=l#w?2!m9P&Q9 zzjylM=HaD_3p8PxZOTyof^@z>AgJF4VsfAnc=4V!*vOLX3KX#SP8TaxDX zNn(B2W6s7vNqhRSo5l&GlduyajayqiGIrCp)^fH44)^Q53XhGf*;jdoabr9xb2NdVy8?H)T;bhg!JrJ2va#w$CiPjWZKjF9nySdi>NmQu(N(lZ5 zg4~(?y4~iDO{#^@li3C9cZ&pm6Gd|pj$jiME>$Ge8d|mNmPwUNg4CbE+_TC$U0O#j z(Zkh~TGVYNWgFUlBT#Na*RJF-=GH$GrGN+_-Nd-1bh()wM69U0BAfk)miT@dvCZ?P zmIPFkm)q%G!}VK@WFLdUu4ic6ZoD~qkvwuRthx8b*<8=oq1)ZbXl;o0jYGZc3U5Qj zFJte#$M+Qun@7harlU$j1InID-ktdw4B6$EE3g{A%(}7N>T;1^a%|d|d+vi@(l4~G z1S`~Tv_S2yXM)J)yoY7Osp1yq=Rg^+!|N2LJ?D;ek>Zsr6@=RF!YmaL>a*h(E(~wz z^?VDOso!=&IxTsJv2m`MC&fZ#aD#(eeWED|Yc6``Fu|)1GZ1PT$+ZqKJ}iZNnVh8q zp!9W9qQ5%U;o(h3JL9!GzzX#p4(jORsvk#OIF8g;&!^Mm7Q0%z${8aPI8Zh`tfYTY zX+h;!?a+hXaVp5U4Iw*NyN58Ob3U~-slE_I+wR<3ABWcntoom&+gT)Qw7nd_tOTtW?%D zZm`x6)0>A6(V1iGhh?xzYgn^@^uCQfOq}9=&hEgul%yrsfN~>F7Z<68o<`zx9Mk$* zMpK=0{~GmA8=iE6O9Cdr@!J&da)OLOml)K|FY@giPQ(VfCLZ}ac9|*>M6{6p0=4sC z`{#Y#^x}eq50Y>;(vsevWP8Lr5eoiQLDIwnT7LoNXSBtVniD>ExOcx*`})vs_7KDy z1s}LR`Eh^o-2?2s^SA6;&-^L4XQTN6KYr}gN#NYNM&2o%i`(Ds++=mr60sVaWafG` zX$h3iX?>c1l$zcI1ssytTLjX_=v|XlU^yH^!t`V=2$Gm>CZe z*LL3|BnBj)f{o%<9cfLK#?+s#8=$ivT_C+bhtWL#!Wq_)dhBvoiH}pd9mr=2<}ZGa zj$ysFa!#_0ag<)gU4Z_b^>FFBIdMwxeXPqP(9L4h`%#d;kghRQ&UJYo2iFt)xp3J; z--2u9D}!ZcB#&Rb#))r5UgJdbIM-KVei7DX+(OnToHeGe{ePPM`9?Zr87nbSd*3LP)2&PoYQ zE9n$~LM-luBnM)34o4K5D`F-oU3UjuTjB#J{~BaE;82(jJf9MV+<5+@SEj#q#jiv z9|tWVsyziP(?mxJz{svz-iZU(NO0*e#0vZc@f`ZTXB z+FH);b3-~kSF{CI#{i6{4D?*Qf094Y*<87nxl8xlfJO$T@XXa-24n1Raw)GdoxUX%fkY5V^9HBN~VJAX4`6RuIYNsAv z(8>wZ5j3vyLwTn%7^@^Dg?IHB%k)RDL>ptwrG|e;`+SSsoHSYMXVrDx=z6}fogY8p z6Uga^LR*{^;2#%aHugj`PVf{%*)FjD;MPP3+4~MNGxdq!{f-%A8KTEDE;h*6YAI&Z z7Rfh)qVG*7nEgccN3*8Z_L3`mW>1H9XK=02(%KO*BC{>~(FDy33ag z2^JN&lYJM9u=6ZDph2AUucUZxSVfvEd;^CXuN70Tkfe_ol>rIUIZN;Zsq}ofqxZNb zaQr%@0nvT+q^y~wTQM;da_5tBGjR#^)M2iEkX9`CYr%ZCMGbW`U6+0 znts$_h{_YqBbcdV^JS+w$pb*6t_-*PWJq?Zr<+6?@|HY%hC!CoQ=tQ;@rDE3Ur!vB z1v8sRntnQwt1;>n7Bkbtv;8`{uhGwGWZ=QW;+iGSsOOm_HuCv=LtkO8xpXk#lP2dR zDAE)nJ~y@N!m6FV;x~oE9F2JzpIt^mWgM^=axf1EDqsCFR)y!>P2_xEeo~tzt|8S0 z+Z&%QD6Bs2GFVeW?CI#ZOHZL;c6uShO%kXMP#;)q4{rdH;9Fy~MJ<0!@n-bMsP&M# zqy^J`xWE}quZCbMLiTarFaOu!=d zy%c-WX1Ur6k5^5XWQi9N)RS-3*|DNA%5+OIjh2Mc0fcyc0fxN5)ol)}q)o;>WD(+( zykQvs9EA;4NgGHe{o*xV=|?^)?Omj(Ge4KA7pN{_33+SJczg;DBHY7Nzf72tLuFtw z8tW_+Jvh@1B4uQ9AF<4eG6}Nm(Xe;R622iX;1p63!L|S!PXw@DGxz+Bv-}N)l)v#v ztmriiG#Lg95(TZnrVC^2WJgq`+u1J+DvG$sm;!>CpTW_Ro$oxunj-`6w7sN+phRnm z=c_Vpeba`KyJgwrHdY?JSqx-V@pjxhg=sF0j3yn6IzrcptM-L$R6p0t9ny2 z?E|B@JWDzSpK9LpHaDlXQ1Pp1lf&j?-^-Z`v^|~kxNX4;$&je;fWR?9l_U%*F{RYd z0slhC=0sh`r=v81!ajiw^)g5Yy|{fYXpl5_&1kK;Fux$2o;;s%yc%X2ZjoqiwJ9!L zuo3ERa!cPX4Uy|>+TO?EA99KuF*m*)Irl!&GDc9LV|6bjHC9m4Fr)|e+1((>Plev! z9CbZ4yZeS&fdAX)iv6A-*AD&zUVU**xsPI3KuYXxdGyw{s__=@qMbntKEeEI3+cY{ zgUJ;?6tg}luJtdhb5l93t$z9zZq6seZBKI2f za^8AO`W?*XV-#1%nV&K9`+{5+3NuC)i^}&F;tFW`7r!T>bH#tS+DDsF2$H*=paaM8 zWu)8I>(}*Cw0~XS?Gt`Hwq_;bCp2Wk*U$45^1KU7&|B;tzPPnx{As$~N)c%OP626T z=nok9_eOS*-nH56O5?D$hGy`t{ceeMi}@2Bcf0b9>=edB+w;G;g|FKrDVx@A3$BQh zxaabfht@mL!!&i#ev2JY8j#l>Q7-!g4yp_5!wUcsz$x4H2{2|v%4#LniyD|1F?yZ% z3WVT9xywS}Dw0H`k}4>RMS<1wwJ<0-Am%Cfh(4@V(7T5vId*`zHo?0;G8er|i1ItT zF16Hv_~Z%q$CIv0${3insDayh<`6kl8WHX`(^XO)09I51n;qoSgyQ+ks$RPx;b{hm zyO&HC>DDj2-5+Iy)36&Fkp!Yx?szxUw~!+s`7)!V*8Z{Ad0Ta3A4MGM1q&Mv$t%>j zO-V@53sYd?!qBTix3m#s3c%c{bp|)exwggL_56=U@2As9U4>^@*_d?tV%ky%*pE7J z2+YY!?R>=2l0LqcexP1|s@#@68Qnez8gG4`@9EgSyZ)URsOb&U7i`Sx>fKK;7abk1 z&?;NIbKoR>?Wr`Nv|rG$Pf0bkDAFs7r`kpD*~GS3DXr@LlXwRL4bFH7ln@}K>^t+X z!_ZKwAL1oGlw-N=Ac>MDFIz35YHnB)GlgaoOJ! zPxJuUop{HTguJKnRC7{-1 z32A+PEL{_XMO1Bffk~gPT<#3vJ$1_nN}-)B%Nh*A5dJAOSp`$$>&8jm8D&NY?Xk=M?Ild29&k2OI9kA~- z75L?``f#dNs(DCGyqM_=QITY3-?8yyHz*Lr993=da)#g~g;XdvhmyRDPdzhq=1rAI;{(SAdJ(qrVk7 z2m^X{j_rA!x)$Cy$G(@kdw8Gu$ldvCUV%W%oBz*NcT(IGsVSw zLFdl$*P>uVv|Q1-d9q4iD_%MNr#F5gR!eo{;(|9nBjcpokKi5aG32Awm7u+~m!QIZ zpe3IkZ@~MzyCn4Id)sGIuAMKX?aFlrM1}~|lWIXfhk1&xI;JJcpO58}O;P2}TJLV? z3QlG}!F1wk=+?=B&pYnS?Cx3%)L8=(E1%y+J?9|7%@y2 zd{0WDUZH+Km<=HZ0`7Z%QV&0Ebt|*O=Q7pGj4&!~_i^_agW2xRyt*&^mh->W-1-`p z=cKbXy3?zPJz4W0sKUz><>@iT)^xpl{e-vs@r{g2$92I`J7!z$6#Dsj-P*7d_$_Yf zqt{z$S+#jj7Y@~=45noKg7n{A`Mn6UgDXpy_ifjA3*76G_Yo4>Z|b*P9HvncVdWj2 zW^tc>#Q71KRrD=fi{IM5AByM8zh81FH<>lzk=;xirX@ zURfW3E63HgN>o^6v+$o`Z{o9bk<_sg5FW(2Y!ag0suI5kax3LLqI^DT1R=gcnt#Oj z9Drb6?vc@*fxjs40;T=Td+saEsE&B~$;Ih%VM_(a$)u0Wy&Ju=n{BYlwxc?2J@4(9 z6g1Rnd+26*82ADp@wwz%syS5If|ZM;9=}0^riA_`Zs32BXjr}q!;D(X;WjocxPbi4 z&2T=7o`?u6$E7vPLWXBhWA3Aq*ji?e?KLxNc6aI*22$}J(jlt9nha$y9O4a!yaRJ* zGoaRp-1|hv1>wuxF*}?ckVbhAUC;IJrQT5o6ng|f6o{Aw!~OYLL-!VvN`ytDyOO8` zYU$KUbGh_JAoj{FE2f)=k2XxpKRd8B1RaRk9D1>K&0^aJ_vYH;F$X$a$$;tT4zcZg zN?FZJN(d}JZWL$ytpK!e208Z8BYPFP!<{9DHrOA z=5A3g5mgP!1526?>$*#D!y%RDDMhh?kjQu}b|X57u#r+NH8IC*e-l}%U%zZ)nF}as zPLqeX)SrU>e3kZ#A1r3gg_2~<)9O%A9pKx|%4I|xY){U(KU+&)abrbt><|g_`8_sjKGeyHk z67WyjHe*(2udKPEJgH4AG#W0JAm#pRg1P#AOH7Pf%BV4qdNAMiSxR{~_`9`Ypybf7 zD?qE-m@sftWaLJUG`hf$9_)f2Znf?5EYYhInW7Esm2%WVttp(SzWKb zJGn)l6z@fO3{*!MNDzgwm(G>YbmO>gPXO!vm(CdjlbdSd2KPeq+1rb>o3m&^Nu+#T2Tz9^YrLjkVg?ICm* z6#WJbJd1u__8vjrYd;>~zcVyKJcMo?N1lS;SGXNv>1W5U)c>nTVIxX{XSK;c2q0^E zjMs4Hf!IEAtZ0uTFX0zd21?rFq#oo_@`63k?NKbidLPqEHO4Zd%7l8=DfSsYO*6Pm zki;5RpN(B>&VvVG3pCXn~I=I@9uco z971-ejaazQ#PKI;`LQh#CCz8N_HiT$L;NS++P^GMP=XONQPU6f%o$1}26<8j2KZz6 z5^|t|t0j%7;#^`5b*+Ey_lk&qKx{tBtJ(G;-%Pv{xzl3aE?496jXw_XszAA*B}MH7 zZrOT218N)(zU~+1NqW+Ji+*4e`gu|9)yTrf(u-87zE@iLWiQgPg81W28MF;!?|q&N zL)^a@+YT-AZ%`~5!|m9Kh-9@7S)bs6tM z@9r>qB_kT6YQuh#LkMdUO7jYT8$}z-+Ak!Wr9mKo>W{hQ&7vtLl3k(5?3ZB|(3ykh z9j!zoKhD-b>a@$2d|zs@Uf|q-#NA_p&#+=ZkK-D|43OAqlF5)X>(!;qvfjTtJpSoh z@M1AQbRT~By!#j;`~hY{^si2##~p zg1R?_Qph{^eLo-XKcBLo`f(48jC<#r+ctvvxqgK|IvO&UoDs!4vZE+=Zs>)%>YF<# z5Inz4Rf++Ez2C1j!Ibq(H7qeIPqn@pL3!ONOSHg^ddJ2uRa~=;(bWG z;oqY)-vPXoLmsM0-V@wdnIY7 z9{Y3hFk@kczRMybyqp$nwRB`}QP~OE8WL$z$wIgM$MMH3G@H2QbvUSUvlR`x*=VeP z14NJe;dKLYsMTo8m|IiF?=w}_zW&N`vNuG^ht{$Oh%<{7^CysVH_R>El7a$#3=iQA zS#RkbSIU~o+img{cE=iV*`FRLGYj*rlus?Z-_9@_b$%hx`40yWVaZ^~uU}S=1}1 zOG&2;o|8f|9eQrRrpFsPYKW%Fm>Nl}G3O%&FvgnpUkY3JAtY*~0a^+*xD6KkHjyU62ku;L6Hx16uy|tq)X(lqJ0=NX2hc6B+^9rSt;w2mdEllKz!>9<<*!t6iPH02I59aY zi(XjDwO*;5lml!gwZufO#IPc%e6R4y0vNewB0I9oXmeX#?b=U3je9tKa^9)km|Hk0 z=&~k}Ga@?8Ee??ljrAJWDQ!R7;o1)G)I-36usm4tA%aQHHf3TFo1LI1g^Ff|S{f8b zyjOd1tFegvU1LAn52+kIowTZ*PCaH-_ReEF}6_xu_^dR=somC@o?F;dO5YJl&MLYcqzR~}0} z*EgT5=M!xLqZ=udB>E;1%3&tO z_j3b7SQQd&nIa?c!Ct-#&<+7{6V`H<2lm;w0e^C<)zG9fnwFhH{Hr+pL4r^;nL&By zw$a7HNg6Emh8#>5DgtDiZFzY)GkRupnQBq(BPgLWg)wP=dhz+%juvBj=P`guaC9D3 zl*!_y`B#Ngrcx0p7Fv|Yt1obyoXNY!lQu2%NS?VSKwv5=q?nJ9HmCerEH?kjrns&5 zxVhmso$KnPBcn^)fUQQeWnDgP#SB9hY@lxj-S}I5*2LMI!Ikf4==IB_UL(7#N90YD zO?BIU*42&5uLunbS@Y=O@h!>bn=O%44AT?iv}*A87euktsZ`ab_1bs zRQ0LnwMTByMdyrgE3LZ|u>JMp?rNSn?3c%(nr&b;EfS&vz(forMe5?%L|BS&&~2Pm8_w<3fo$7R;PPa|DPr@Yx|ROjC(vNu zyYXnmLM14I2VUlIJMJaYZ`LEXlJhRMe=ho{t7K9^`)nxfSZFqFU6U@!@}0-30{^iy?trOp&d950r{q zyt+fRVQFF^upnaMYMW-w%LSvz#}CR@qtH5>oi^rOeKP|)s~=$psh#l42ov?92MEFv zV4yuHK!Q4(@1a^+v@TOUlFlLH;?zd}JAm=0=DFyNlnkO;G+Tb>q?Zk@&xN{5Yq4nI zuPm{pkN9$nbT=&<4EvSPa>(9=y4E%@Omztr3R`aE;7ihjX7Yp;S&KjEi-k3^>ZoR^ z7RbYn@Vt80x51`PWLg z<&-BrP#nY^9Y{&@$B2T~g{&S~!Wt#Q?9b>xGo|tHw2`%UKyO^Jdhg7knou5IW8v3I zCGQt^hkLDB`L7sRZN0%TIOLsk%gQrRjUGzgNvgbHQ#t8d_vZ*xg-PY1Xlqk7Y7T4u+q%1ML%874r^^*vEtuZDM zh_3Ayd%f8uK@I`iu!ABYc4py26^eBF2hE8}esEqARfd~odh?_? z5*RA-e5E`xHgR{4@CD;RSr6H#5G7<7j=VnPDDP&ZS4I^wf32pvHV(*2e^?PFpn77= zBDs`nvJ;!z$d!yp8L86$0(hE{tM&n;L)K?VEHPUmRL+(?Eg9Yhrpt{KuVJ#zO}>>S zO2cdWTN_sNcZ^{U(wMCIC5S7awThhnQ)Y;}MJlhuuqOwD+lv5UJzSCWu_~ky=`&k| ztfAXfoN$Dn&F%kpy%=|NIWwE?g+L8r0fAGg*Y>SM2qIyX#e#^qh{Q7{zupIwPokHy zg?f5;^l*5~;YrDocQ(UWfL;A2g@{w;%~RY08l-F7Z2J-v>p{tOOhYa9*+F%^%MhT zOi=qE7h{UIH^E5d#tL6wokrL1QAP%OGXXe`H)6Nn)oroh$NdrFt9e^ zmrZJgQlC)nhWitO%Z+~!2?VQrw>t6aS}KAF)2imFwv5z{FXbcut376yjaeBxx)s>S z=c+;;nK%dkbb6tQQjnS4*|+RH*KQ_SlA@OX1s^GxW_3u3Sa$5cn59&9zMlMl@W&e) zx6U;7U)KCIR5!qwb9r-d%D>_DBG-YshzPJ~A&BMxrlJ4SU8MjQC3fSG+)k0~Nob{N z+K-46Dx%r)If*xwWJR2`1|S#!dXdw2ZFP59rh+7BknZwbVNQ|ul${vpEV{n9$X^HpOxZ{xwL&WwCe8KXbu8z8cWz z-}5gn)bEoW+L6WndW z{y#CMNINHPB)Ez;O;AfIkI0(%$i~ScUx=;U6Ci2qRRT&9rZcvxv|;s*!g?t4X=j|!;tc<@7cJg~8*Xw^9OFdW?0&jZxYu}?IG zTK+V~?6FU0NH>}(i4r2Vh+lsSqXtTyZ~W4t-yc2IETC?S7!7&sxG!A=pD{se-{!6AIPthzV6_n~Y(yqg ze~fPPW*#y17bKZlAMcK=y(Ff(MRG~)-wMeZ)29in0M}vM0?NHmyD7NZ#DBf&QQ@Mq zaxX16i!S=EHXiiKwsg(Lq^5`I<4L@^k(`qk z>WDLy*<8cc9LBg*7(Am4$vh)bK_7fw zgp6x*lRuQjoOUZL{#F+N_*-6td0b83RWX0*B7^XMG4!8q&Fxsj-;Lb7Au3vf-6M+F z0$$uDe0s^*6!sAcU`qL#Pq+&wj29N!4u9$Ztw;zvH(^+Yb~aH=4H~(7azW$DytC<4 znFyjc_pHR^cA_L&bgU6wF!2x)M;;W2<}KrkpZQL!phZTV?CsqTZ>2q=yj@FPGWU$&ToBL^#hl@st&)Gg7d% zp@!({SrCJbC_Z%8Zt}HKI}z|f5d^Mkh<=oQqscQK7>V~ImG-EBRth{~7s*qd*5E^F zGv2p8e-|M?kthu`S$`g(GEw2ubFDd~Yr{KO@WB?A=h7i6Nzt9A#5Qj0d-rC@Z!Xw* z=k$~Ng_9Xvit;rRQY3M4Bi-7W+0k)F!|PWiQ%96Z6MW$0PcD`SL3z{t{_;dQ<2JEF z=Ck$FA9PrYVIc8x8^m0yLU5X1g)2C&TRD zifeEt>Myvy-iWz%^oE_5mu3fl)fkdF9pUV1>->0uzmTzUwZA+l#7}u0)E)bke%lj~ zxE))BhhU@maE;e7Kf`=ZavaJkJDn$%k8oDBb|>}KzzUqGa}q=-IqhWOE3v#qC2q&)Np zFf1je(tv4745{9GI`?P)Y%6*2&y(_{|3`85z6fpE+t?W{b@eI@qG+?=_-|F(iu^_6 zq4Go>F&g&_G0zRC3Ds|$b(U~M>hzVjHbkDO?+~N=U>XDWviK2E!aod_7Ab4a>>ai_ zTN6cuLnh2OmZ{wfPW3Fc(gH=p^HV}_@N9_tCxjAw;uW?hwoOdb*3tfEWEq!pX}IO6{N9U5{u!yZfY?IVaZh^QGQISHOU&^ew&}$b1T}I z`q?ci%>7GB_a3zL-J+en_4sHkzj~IVCUEn@1@yy|rl2^y- zOibppX&+%D!IzI9b-rZF`2`_CEDpsf)BKj#H&ur_yZs1ev|Ou;I`sXhAg2CnbJ?%0cGvrjB|7wsO=H`$@e`l#sEVnf<^tlDBZ6P{9| z>^v3!eB)}74c%e4Pom=be)+5JLXzkE&o&m1OnzxX-FOCsEqI*l!<^&}mV$1=gtvg7 zYtrF7>|nN^bTX53rEuWOXar&YkLdgrVk3v7H4yfAI5%$laVL32G|w$(#_fCIDfUI! zYY!@}Bhe-d-xR)Fgq*D?wg$Me{_Sft@?JW!Url?)u@{D}A4UjPHU2ojuf(J_=RuqS zfk;l*9Ov3lrd zGW$Zj?IQo8u7TvurgYNjq9&Pi>z6M1<%-SOrA8AhH>mlHItyGIf3jC2LfpaenxzU` zAC{K>+mNRqPSTLY(%{!#PgxZjyeriFI=$E}w24T#0Q%ok`_uq!w!D&1er*sDC-HyX z(@k2?}1QEvUc zxU~4dW?JBMYN)3xo3f+mpbB{?)S1#GMf#xKRySQfSA;R^MOWO8`>^>(N91K24LOay z^9IJ}RCc3Wk@lYz2FGF-Q(Nhx&cv(C{S#9{3)Xkv_Y%@P{BQhxg3#+I(cAKj@UQ1dxA;-(5OR|oe6Oi0U?(5t{8(3c-Q}rHWb2hkdlKF)?r?Tv zm`N@jOFqlTjm?@PI2zIW-ax)j4%_DT)zxXmp?(!OdrMfls8w3p!N85(u$Nkg~7 zvQq>lXcKb6i@3gf^{Xjtl?2O71A4h`Ab?o$oJcL* zeB=jwh?P@zyelq|E-sMz{B_^y6&JM9Ew^&2y~ZXFW8 z>UDX?jBoziwZwD*sFFapac&6h3G@{3_jp zB5jjM0V!d7%eo0KqAmEm2|w7RE*-P*ze3rt-!1;Z3~YG zH%_u>)%T1Kr+ta~YzWM9wa~N8`~MBG{?FuTLcgOn8!P%&8A_gvlQ@UZH%s++{G=PT zLn_V_p0|SD;8Iur$y1_)n(qsAx}a_cdM!e~@;9^ptN7=O-m~P!MdiFI%Q)q3`3bLh z=|B|gy~j;(p`?+l*7Q?d8iML18)$1E4MyhXwFtWj?w!YpsQi~>CBFsqkA{bTox>7s zr(BB!HU-O$K>7I_>xg^C=+4-YOc}u|mEg$&WDD452Sc+!>`DAZQpm38K@b4O)B9Ua ze>@Yxv(B&`QAZ%m5$?=hreg8iKg!rQ3Hn+PyURwXKhMgdO}q{LuI;%UW2_@9R)R*h z1An=&W)RrKjvV)U?~IO)kOJNC+7H<-Tf>h6=E<4rMo?aeN~JO3Sl6o8>*4%@@VJ!Y zo;oBLp@=VdAMw1(Ez+ET)D0P3+^`%|PYGY-+yo@f) zBuleQoRtkytopYWj}P|s4>U2u!)0&#olKT-GZ?3wZWML|Le_uBS$q`NXbx7)qy)NY ze<#aiXe+_Dtp1vV5FrkU^Ku>ZIpOkX|4q0xd{+F+Qs~P%WgkLP349P*$2G6qXmSzM zGC$_XCE9s*|Jts0vGGoD{6Fsh5D;O+fsg3Dz90s6(d7tSXAW+p4Kn`b?3r5Yux=;i zP<)lW&0*B-4R)BioWkf4(=^y+glXhxvs1k=_SZ}Ql@J00W)Zdr5?AE(e2t??E*BIh zRK8R~JRLh271_O918PLX^ht_r)Fy z;8|vkqdaVxNQxdVtT-Dy^F~&t$jrY2&!A&X*WV1k)S_IuJ94*IcjnM+5xdc$3%ONU zW|VxDnEeiUD@2{1^of5ohZRe&7o9L6U$rN3CJ}wPAB66BR#A!SF6eUjfjprqQ7$hvfz2 z3TQF&9rW-|_=D~rry9WzBLsKPM6rT8aFA>~Ax??=l&zum9k+fzxVFd%e(TG}A$k$2 z|A^|Fgq1)Z!l!(|44@+E=tf@MbZM>f;Jk4SBbvEh#`QbbQWS#Sb#A&Bf_-9(ToUU2 zOj{2zMDayRLKn}5IkHi*^6{XH+Oa|$_Bs3c&o`U=z>YnO8z(`|Wr*F%Ro)fF~XGFPyG22p|=- z?QWc;KqXTRuDrh zneuMIM>zzrnlPH?)k@%7vp{phxgs#8>)Z3G~AWns3(!1J?O-Gh6kRqs#d zJbz-Uu;-tvv5LxBUalbsL39upiIppU02dg6#O6jJaUF3OF*Dt80x_|lKO<%3tgW4J zSf-xDqVUZP%bT^LoiO~XvK_f_y$OI3{2Ja0P)w{iJy zLzi`Fxy_1EZ0Qcj=VRfpG>R7MQ9$qbkpZ|3FqKFMpuA7CDlAPt{jHs`3OcZ*Bw#fB zbxtBzUye0UOS-ujVe(TNRhT8O zRdr0mBR|`>`!$kJdgzwVy}jEN`V-&O*W)EA)6eF92_?~orMKx%{Tu0bZ?%uV{wUXT zsI!93?kiC!p%5rqGX=WwpnP=|Ny3Vs(<;~sxc(YkK?8}D`o11ZnNl048UJFykEsZM zcU3J99Vzjw}1z}D;jjiAF10KNDI>}0#aNY8L*jr6LXpKHiKnrOig2_wjN|s@tVhZHVtWC$w&t zaqB757pD-&QT{v|``&!3S04Lrn*WQYEoZrqbG~rFc_$nBOOOuIj-d^VRO{=2JY-)) z2_R|uV2aTIuctgp`^S#gP%8HeR5i`oE5Yg&%+I*$<*n|f zO2b0LbYT#S+W;o#t7YAF~oJ!JZIqiDrMyCk2gI>L%2~i+4VX0Cdc=b{75a zJc4#aIz1a1=~6-j)mV?NQ<7Qx;fHU~KZs1pOb5267SHQCjlEKehoX)(BD?He5q`eP zwm_ekwe9(kjK=E;eq?AaP$%e`Ngr@M0llC4=pMc-%WcGB1ddef*yi5*4!WGEYGhsL zS@e+{WBjseDN{48Y_QyCFZk*D8}`Zp0^;9(XYj*;k}VPKO@85#5d{@P;8hRX&G^B! z{y!IdKXJp?YxZd@WwOHn;|A}>J+HMYX_Pf4A1*!>!Am;gN_)RqMIP&_aPE2lX+%*6 zSm6U2>v90%_dq*2#Sl{?iSjhKrD`o;U45GVylCq6T1n@gXq}Sn4J%Hk5rw0Flei({*(Y--TQM%3yKAwFPlgcAH5fYhXR_@9FlO)hne|vR|jlFh7r|k}@5%KG#7< zC0jA|@f7DQ*9O7E z@}5E7w5Tk2q4$mk|3t;hdu0JR)>jEgr^DRWN}c{lX|U zO|_x!(biC5y+UAw|IH5;$`jt_@_W81O$t*x(c)iFf}Ao~Dk-ZvS{;k^PWIHThaFOP z75pl9&iQn6QOqFJ_`CwrQ7`hRq@Awi8$Z0IBPwX+yDcdR^rf-L zFb@X^Pq3*Vd3QmTV@Iwa^RndDL53Kci-LQlxFw--*Aw7K9Tk^ew_JudO&{5JDog1D zR72c5+jkRLjFG)J3j-3i2!IFWArD&AT+Pm3%Sn{0av#;`R{R4bfSpW@tdQTHt67<0fV&i-qr-FpYcatv_YXY#+oV>XJ!E^gww$m!w-~~f zFLo2#4+AKDvgB$Mvi#bnLtLTUo;lSz!lJ^3yHPg9Fuitt_iM8hyxR}z>zvXUt9Z!l zVhNq-)N;KJqp5M18#`JkQI;EFy|iVZj#6h7FKPAB3BO~1YNHPXi#xwpv%W_6gh8gd zpB1_ET`_rkD6&OUPaCjmBkQb1nHclAbihRXK1VY~syQwSGwO^dF~sTG%lc+(rb2u4 zWkQ~OH>`!D+xCi2fj(m@Z198Qz0CKKWN4SWUvKMw&6yS51wlY>=BtZpRNu%>}uVl_JZ`a8#8;X@hUf7wrLdd zVbS=0U})jGtqk~hETrk$uvKl)H7o0n?g1-@v76odJIyBUXmb$DR}nXwN*JyEO1++!Ix3W z(Jsw*<5@vIZ3l=5fz+MHkY}^f#6MgE``qPame;*pd$QP*b&SZ=2zKpE;bGl~mYDri zVSIk1o9s_wW3dhTOcvV{*BSFTeC?T7Gm?nt6p@se&)N04IKuj0k-iihHLYm{Q&$f$ z!t0GyItWm2iuK>F>j*A7sq?b)J@LcKy?XfuD#6bC5m;dC5s|RFt;cxj+G|wr6H56M zB~SnQ0tIuW+$kqhs`PU2lutz`{!l@(X^Sw+W-^FAOkvd2q0{)hy{#$J+!96Al2APKc@ZdDh(l$qM66sc8F& zc_w20<4`6}3`HKEo^`N+&E}Q;j8(OK*ogy8&46OVij1rjK|IjL3!ZaCP*WT}S1x1A zN@t)8o!<1j>ayR|jP+@{&=Cj!BRV(1jsblTg|$J3&|lcGJ1_AUegBOshdb+aASFBo*cPvN7wq5J#F|}++*2-@~zF<1) z3Cf^^{`fC=*TrY8obEe&iw>y>`Jg*Bx4*%Xz2<~@y z7hK4ht29aIJ_+5g{!nD(EBO(li_P`Z*%mSqkO1(>Vnbd9YO0nEYPpy&^jRD zD_Bb4vJpD9iXDdBhOo(Mq7!x9Bog}>u$O^i221@S^|5U-KFn~6fSj+k3e!x1qF5iV z64y9BZ48@0A^6M9r+&!2e{-}v70LaG*Q+jc_|=42@%8-L&zt|FcMaMfp?#wwwGn;u z0SYRJ@QfC|1FCpR!(`cHigJ1y6UJpc$ba2=LedZcTh@)SXGilHkm| z4qaDd6G`a1mnNb7xx_s{Za)N2u1&ni{7+EnNJnPHcXQ&*hvX_JL9Sew(lY0G!;&FpF zBit9N3%KA>N|x(ii-Y6bS+#OscenTj17Gj>rb))n?+q^OL*>+%#qiy*`Rj0-{Bdf( z6-^Wmavx#6^YNC2neFeQe_Kx8+gOwCS%d{CHze_{l!qNj%>*J|HSJEjoI>f%pB|6p zr5E(R?oqa@Lk;sCPN##7b?VhXg^)T{KP&(utCJXpKYFTlAoV$A-~~(C3ifV$ zJ47qz!-qEZ{G-WQFbKmc!7HYo3r({YE*>L%gn!yn?yhO?7Qi+7gmWThtuhVbQO?TF z!INa~XcrN#iU`C&rdHF#X0xu+3%$jdZWZ+Y&QMMmMzv)!(ndb(+kp9cpyj#y153~7 zKa!rrCVb~fbr`EmCC|IR?DoAD1@6WLE>BV{gWJ0phdOShF+Xt)QzfzZ@qYJi&%IvH zNI-M``ugR%_W3h;wwr_9N`A+gHY#ZgE1&=ZBd~5^H4Hyd%}ip;h|cMVoaRQFRR|{T zBQ9a8!UGUL(I|K*@&qA+=xe%JDRHPpPyK5d_|<4cyZA36h-L@d4-rwto}Y1KVeq|6 z?ahfJKD&H}9CT(Z6$_^MQ9G~=(F);Smjus;B>V9ML-5jN&8g?$#VqSE;)0M#4MopL z$EsXse~Jf1GBjUOGb0;W;V3(`S4td6EltIpE!m-zGRN+Ljk-u1#_V}99kN4I{f)h= zs6lB9Ein+T8PvcW^gA!!_xkhyjQlT)a7X6O_!TokjSS3NioI~6z9;sD5%)l zu84vkFlry)hMcKc{d6hoGr6})`?t|p=m=Nj0Gc_#jz@NAb@q_Lp3qDYQ{77J@7c!& zPZ=dD6=!D`kCJe50p53AZ2Xx!y^7zm(nyE-Htc>vr}S0~OAFgQ zDuE?ovzWR(qSJvznYL}=f6f%NvnB17)a~K!g`-*e*9Wjb=hgGf{e?qTb1M$0BcP%m}u;f^f3wyxl8TFjZ*_S{i$u}x@;{f2Y90rv^^y5aMKyx?sf zkBy%N4@Rh+epN})qvO^Ir{DuLEFkNa8Yu!=7_m4G$DOSA~2*XH&-fdXUarGu6Y1+<xH)z zD$w{RV}ZHJx(7# z(>JbEIOvJ-F_}5S%D{VvpU($BQqA@!Edz)OZ!gG!Wz%A z7fU(`a?q6tss9|;pNi&v97oA1g7Uh=<>6_>Dle}I(4mr79n<5OtL9z;3hwpz zTTOl_!WPY?OWuBVu!-dO>3$kgFH@5QL&VQIZtO*MUn|raxum%GG=9t_MyV}2=u=8h z74)v|lFk@kX^K{8(2#6sN|uG}V0Cj+F3#MDqrW1vK>);s1KLJfP!pM+c0$67v1xlR zsjaFBZThVr0=7}`&{zD>Os4K}-9n|NTYrAu@oHwtZhRMBg<6>4`dFcR+mt`QRK8n) z|0HsHov2;smK>tAV?+9jBBQ;F!Z($suI;n;%9)Z{=hLb6c&s!& zEqL>j^w#!1E@TBgG*sm%Tee&kc&$eC6^!!AYH$%YR1b%*F130Zk=t=EH^oCHmFd`F z154m-OX*PKOhkE0<)B6Xf`r<^j{xeeIb96$PT2cBA>;`-2=;pVxAGN#snmGJ&-j1s zIAt;=*8>?E^YGt|n3_Qme#+|;KVmkJ{-v$97U{ZnC2$b8y9C;QKxZPWkqG553tHDp z_owGMz?)BY+_%)6lbcd|?`(E9wPn8c4ba6N^jyDK+aA#l49+@_NRU%paS4N%T29|r z0XL@0tYQRv5>UmUTfQdcUp2EM!F`ZqR7tod6!W$-clQJU zfL_p-Q(nqx%vJxM0QoNK)6BZ{p?4tn6Pj3X!92!h#f3KqWY*N(l5Nhi&MfY4{s1{a zI|~IOd}%A6c43s)XGZ4R*A{YIvpTM~73Q*+h#sIoY_CvQyiu z7y3KzE~j9(cOS@mxBi-ASq#Ee8gKs|?Jp+B*KF*5149*cv>Q)rpyg;@yzz=8LMlq@ z%bACYUZy;t&u#nLIEN8}=qHT6x&zxO6OVX&3As&sSK(pRb~S+H&Coblq%@y|^?H1% zvfbE7dnU$@8~^==u6wC0iJPiii=*b`+Itr10#Cc>R(Jv)u(|gKO|DjsE$uONs*n5!HZdRBsw>c%%=a>cYS9QNru{HQES4FsE!MvA<_QuPT~V`6$FOG)%eP<8TB>)t-W#og!+iSiP^xaVuM=Q=exo!Txe?#^jedn&Xy zM6#8YPa*p^UccmiAqKmD9Cc;Uzo53vp!Sh<-YCPakyqQpuQGFJA?ykmoF z-qXSInI(j8U@;SWwn1O6)b(!p_;d`~eV?vtKbxcItZNE*x?R`jd89%;<9!&W;hs6` z6mhEc;_uP}J6=?tN8$)ud$ZHY3<;z>T zlaM@{?50H&h!OmvIFY^e!8jzN*J4DrR+3JJKH<8of3Uf*>s9gU#67ElcfKpN=Hl4m zmv$v}9bMT@`%z2_G$X3&hcY1iXf;q#w;^yRBirPOqsF&~P*_|RalrtEGP$r+KzWXH zAZ<|_r&!Hq8LS>PJgqJMO>bXJh5NzuZrZt)YKu*sZv(J40i)d=R|3je zUO9!`?Fc`%H1Opz33#DP2E?-g8iJt41|_SX^bvKMG7evk>G;#9oPuXo4P(`clX5ym z^*eT%U0kZy^|^F`6($@&$$2Gw*B19r=S*Ie%`DwU8KW)becoM77iy z-n)0nixFjK{-icFf*DIScOe|z&kE0>WuL6nokSc{MFvj`WYQ zxyo1jyHZnB2nF>X`Z~$^d6%bLk$d z2vAo3!&;RQ+`Gk?IpgT@fkYAWogP@fH%}cj3!gbO&IIs}j%8=3_OWy`-+^mmq?Q~) zorERcG43_LpnUJ1S#Y=dxc?B(|Au!WX_XDeHa>|5J)= z1lD7-Ye+qF7UZOlQa4;1`&rn*;y0_+)T89UaH|fsRL>=n1#vi?W#TclC&w;N;%P&Y_0`xxl!(97LxfvQ@q1%Wg8sl&VL#- z|J9rRW=IuY8IL43Z5Fm7-;343Ei*M+z(D5y7h);&Q&H)Rpo-1 zu6zW_F?6xuA&{H(?AuuM+S1P9CWi8aeW9!h3v#>&e<&}=$ebh7P2-_`*vNX3Ib@0B z%`>>6Id8!0GjSS5Cul#QZI!$0Cd(Y;K*kQS5Y5(vFWlmfuYjlEz(o8*yL0_N1`)BE zu6-T*v-TkpZUXgqNhVA-<~Y6akz$F|u*mAurNn<#r>eTQ1g7p@|CCx35@+u_A$$n< zQ;y^pw>x!4#pVMa*xqU*6+}eZXo$zca~(31TxLy!mzsV8_;!d6Ii4dccHaDq+B<$n zz8L&XOG6l5*WdZOpIoQgXgF5+!;Q;Pl(vm^{*Z3F2xn;(*B%JT{o!g;8inlJn>(~0~{2;vQcA>Ui+tnlFYZHoo19iR; zYMtme$baW8f+yv&C_d37h?ZrXQjqGkc;m@0k^7r7)lJ}+6`hHaRN8F@S*MZuWgn&E ztDcQNEzuOKX}%bqIISYu<}6vJjE8sUs3}*uYmE?@N+e;JcVxX}7kZ{R%T|R6RSR+PvUHO1t^op? zE8S^XJpWcSVI-qDCo9HY!K@lP%~+V-?K6Uf^yws`Qg_e56=~!0*rJ68@(<#|Czf?H zDOx@W;HzHWh)40Fz8Bl0gS79S_tez!Byrr|5!u(%HcG4_6%Mm_D&WlQLQwv^;dA3b zysl$CQ5fqh)&D!PA7yDzd#Nr*FpjE#KUP}_vS7zw_I~#q$vn&k*4SMnf5gYCo4EVe z)z04qrBx!*HzjQ-s@dREGCdqoI2c)hGGqNX$VR5!`Pi)LHh- zrp&uW1pP_A|BFDeENHNe0_NntVjjGG@WJxovCj9ecLqUZRFJW((=O(j7pfE8djClq zc!exmPOZew!}p~s2dM>C)jV1()TREo`C(y?L2DL)=f^ej$O?ewB5&3NHK}y&zOvG7 zE_iES(;E-w0KL#Ypa~z%gQui^EB0BwE^RKaR(dZr|FU}03o}>e8f85>&wY9=C)R|YSyn)L7x|!KkRIC zm}k1nawwKfT8iN-oB{q(Y>6J+G&rc^_8#o-Mm^UzpHpe!mY8cEu5k)~dd9!hHMI=? zN;br6yzq_5RQ!#du87!pBzopI1Q@Wp`0 zm9}&K@Oy2}76^3XN+nbK1$2%Q5ug=jLi>++BIA`N;<||sZ@_IoigwRpah02`^>as_ zobmrh*1N|u{r~^}?_M2LUWF7ARxPQ7*UA(zA@=Geq+X#p6_vwC3}G9cM3{9%VxuKw zhlXLpl-QKR9A{^R$@=l%P0`)8NSE_?3rxZm%$`}OJ#uAFE$IOO9S zJ*8F%I!M7T>6j*p8DADEBJ5dE-L>vcRN5&0sR+KC%lZgP_&CjRM9kAuz&VD+E}^Rz zu7ZHYh3JOt7}Hy`GL-}xP21neCS8o1MIP_c@^o4`xVGPrHIzs8%!#P7m?G+da%OUh)va!EdQj662xa3&e#oQsEoK<6N6hbh{<)Ze z?MsSzSAEA`5T)yy3srke@TV5r@voip4=ik>7ds5q6u9Hz8n4*yZUsNlm%i36-N+of z?;8^W&_H+IkLN^u!<^YS_=*=d^!Ua`y?^8{g2^n0uMIpSor#ucELghy0&$~8Rq9=E z!QIxWtqFI4IEY*u9@0vmfdAjz#XR=FjQPr0Maojv{bZC02vBGEwykBR`(Z`()NsE6fKxS({gml=t9CKs(eNrtkMF05i zg|)l-7h4GOyl0(*>S)v`tAkb)kkHNPzWz9u2N3gRE4Sz&J0ioWUhr&3ZTW5I#g|Lb zaQHOxkPl*{p{Q6#Jai`978uRHZJcaRSbcY=VUckv-^MuZt-1u4hN%G={8lKE9dzB^ ztsZhe1jFA`u-lMGjfuwd5I(2be9o5w8IM3J5KWQQwgECg$7Jf_a zi@Hs1Sekp-pKfa1Wa6hA@ZA5;RllXvyqW?M>>m|U(OAIa!-`Inmo?P4Is^XHufegT zfDCT$`!O5!N8C+g)+!;PnRz=kh-kAXZf;+St}MlpueDGqeMRkT(-9Ng!ZP(ydiUFN z`uqmYrS;itVSJJGFfZ`?zmdNtAqTJ-XE+X(&G7QK+F?NMjf9xe3y-|GM--!e?(o94AnDDm~zc zHDXsoB#ri*G-jW!vr3@sqyOV9r+ySH9SY5V#pnf^SFiSB-PZCj!y>vd90goXKROHz z7Ok|XEPBTOQZNIsCU&VM*TH7boyXsACODN*3xiGUaKgJre&DzSt^wZXD}2;4qFjRj zFcNEDIgJ>Tf`XF(7$%>nMmV_&jQEccXY>5q)U+LVzAltA9ToXlU+Sb1fuSy=BZtrO z|KdsFf0VM)RvzhXsYvcXd8&8@vX7Om)%yy8C;`Ys6Lfypuc#-KXXgU34T?DOs51Yc zTg)!CmF_FhjW`M~x9Wx?UQL#P9{@$Cslk*f({#TUDeZ$pXu)^mQ;^V~Q8mnac!v;Y z-!j0keCB{6gvkgpU-|Hghrd476{cRh#PiHha7trWo~zLL^ZMA8wJ|tz)$rX2HGJxA zrm+y85KrRcedP$YTYX=RwOziAC`%asR%zP2sJQ%$-ec|V`Eu<#c2s=xE2o%~;oANt zDHkzl20`T5Queou%(@%a4|b?9 zeKI1Q^f$3S|?LWxvcNzwr7ZA1>St zMYlmO!<(^Ao6$`a=@-R-W^wJyu{7J&tdyzO1Q?M+XaMzQ)bj7mQ6sNZEGc{cQvBY~f`ja5r+(<5X6 z&&iWXj1qF>N#}fA;UyAlC`&o=T4q#mBB{y=n$a?Q*-PXS7Z^mmTVl8h3-uABHj!l^ z+M{8Uu_S8z+c$>((57GF=!N^jdJ$Fu(Rf|EmvXWM(q21cxK?e%Cwm|(t%Y<|(&|p}o9ZiEq%Z`6zNW6Fr-H`I#Ve~5j zhFJRf0Qi%~ylf<;O-rclS7$xG)bb%zC=z-f-y9!c7=3y;IQ*$Tv0)5x9iG28qNCnG zw{?Xnrma?eU`azY_g486#k@Z~#rg}MgZ9$hu`UkpC~x7D!l&LqD-3l=#9YHgKfNQZ z0wvL~wunSmj_{dZKjY7Jo#rYrR1%Jdx-`h%#&7~dTfrxwbX&8;klZnd5j6T2wsrgJ zkcc-#y1ZB@+q10S#qW*tvb(>iJYOL>RAFkR7*4-XUm)Rq zk)sG?T?Vsfs!RBn#IA*DDTVrQrCJABoF0Mcq7V>ovugvnGo(A>w`0m*y}PFpVFKwN z^B?p_Uv8`DFtNOohG8D|SO94t(|jD6pJ#>3{zc#!Z;^_JRQT=6ZtI=fm?^#fRc zp-il4smV-C#E(y2I0So<;F@L*n_|LRWU{-!`EX9#!rIV)2Qm%YdFLHIx+8>e zXV{n65sfM87VZ?w);y(FU}+y*d?TrY1v^?WrEPt>T?&*lGi1~qQx`D7)F=^U)b0D7 z%#0(9tdE3;77$H6r3qcfbgc!;yTho|4$7pPNyE+5o~CbS(wEm1>*XgcdA)_~KJb%_ z#bZU2u_+y1nT4|@iAT|dUMYa%hyhN#A2aKr9Du)d!2dlhXI7lxYh{{AQhX1=_(gYs zZL)j5X;dg?eMnGblH4(I>(WO2nTkR5g>@!zRYRuUzgfyH+DG+CI^CeOJ}@aZa?9K5sVHci@Mu8V;m*}{2PcF1cDH!IE5`NA z)7*jS39&3;+n20aU|Mw0llX)EOnLq{m@0q?X_Kju1${Ha*;w@6#E3Eeutz{zrmj`| z?zStN6vBDes8?@1vf94f;rhx>8&5GPwhTO99PKdqwM^8;~Ufu!e;%Whbt$(Y_Q zK+qKRRzu6k1(tZ#E%(&CCN#3x5Vf1&1PAr`>B^~+a4{J1D16slKI#JF6ml2kS=bXT zJW|i1UeI7e{Rv6~&S?5O_n9_>!PtKfly8e@&?+l9&D(M)jHO2@I7JO{lop_+2nkt$adCB@eak39(DDsp5|%E5){a9>WjFzA1=ZwULFHBs3NY37j!|9?I=z{8?g+m=D-Gr9<4t z3_mf1yEDS6_3`-sc!3gh?zsethT12pfqrZ2*{4_2KOo9M7l$Ya{5W@C{6_2asCk1$ zLyVl{1Vr<>*gwJd6OAdpJmTU2K?RgIigQ1EVbcfx;l$% z`1-hPxKq^={#FtsiTwrqD2aNq(3{fbRZ6yEC3mz?L@Vx6f(M zXu^Z;m&vVFpYN_Yg$&=z>NUHy$@acG5u_=;hf%R8)`vak z;qWWUAtCrgXH+FK+O(NAA%9CL#>Z|9ObEaLZa5<@bM|!>Z$AAu5Fut9Ysq;(DynB`d)WaiuH>f`6uTKjoWf=UtHD>UR)nXO zY>e!z$<*05D*2`>z2w_)JPF)H z*0zOs!=$tlB*l8_G7zwNDh#bwDxp8$5@!oEzevf4Js@FKb~&^?S4KyEA}tXext7CF zIYLUkszckN%@~+bhz(bl+kx%`Jf)>U-N3qOM)uDjx6`Ahdp9nL++P~c+W!4&l1}AT z`P+*M+F4=HUH~<>wp*P@KZ|c_j`ue@g&$bFnQ9d@gFG5vvt^GS(DXg!A#HI0it^;O zb?jj(NhVYs)38AZpR8E@hAQhQ;W4&^Pk{D#T9ypY^~}A@jki((#5V3p-zMW8+iP1R`b!0) zb=n~KEcqc;4tnagJmJmNYQEW$rPZW=DgRVWVrc9ps8lV_F#;~PJ3t?LQV8JXeJ&zr>&+bNjrCwzB2v}zJ`1Zm3MKx zjH|j5qsV$^E0^OHu-CnzS`*S?YlE||;yLXUcFx%|ttzYMPMSZ8S)2K0#tSP0`-B5; z_Rrr&uk^_NZ$xnvpv2I8EzR09qxNf|V-^q#IaOSV#9xFA4*$p+JvfZ)#D=K7l5&ze za*!#d-^J45PF(D0@N4UGnVx5pcIweMo3=qnUu3v-mSbA2tf;orB+&SP^n_=%_oXFI zqY%cU&wN=j%~>@Lo%Y;lyjPh}6dOurFacwEld{=oITmnqsoMnkPQ!7PS`X-@LHDlT zI&8tH^lWP)yxPqR{GknMgkk(f9Csc+H9ghsL%{_w!JfdH=K55;hj}> z>xvdf2hc>0^8`{EXOB(2+35Q_bhXnXDe5(Dw%64-mK&j{Fs`k83ibFD0-2X~6C370 z2<85hAc4exJE+&BzH_c;gtWkv+*O$maJCHZXedmDX?xo}=fIji#+Z(3M{%+3UXbq} zR3c{R+EffM>Vdg=TFQcJ_^2#VS2yGr538-!7S)V;A&z41-W_aJ zq9nb@&xZoK-#I)?FJhE9b3Xt=RGDcvKWqcWq{ZEGCO&s^Z;@p$?@iTsK1)~=tDiH! zyO}h}k6P58Nu!SjaqY3c`gzkxmDa2>O1qYf-!y>!;hN3gy~@bDJ-XP}*}lgKgA*YX zGYSe=l4E^j%;ziE^i)7XHewT^y#45zwO@8n!gDM;vYe2r7mr#rFpWz%1z%hacSqv2Cq*wYem#N70NtHE$Z4I zw0MP|h^%10XgPTRk z&~tLJO&awP{mO4>{EUfglJ*2X_+qWuWGx}{e$B#<|C;0OD(>t=`U!`@3gd;U;Hf@! zv$Z}I&b~vQVj$;8@R-G9X!iTb8(n{=9Sz(ASg+9`RU(tu>v0yP=5#&e!vC*`-xg`u zG^+%XzR2oO>IX%Aj%xU8SUd5fJnl?};vGGL%sbrrq+ivUqX6mV1)N91tjSFGZN2E{ zyO2W*%DUqX6My(UKt8gCkbn^I?^x@pT*f0Wo^3cx)R{wzj2rwC+JnT@3`2O@!htgx z<_>Eh;d=^+ZTo>l$=5P6x5fnCGb3L#8r#9s=J%MDp5c(-3(6eLhKEk)lAj#{v*H-H zx(XOCUdcNHRH;4R1&<%wGzfr9)^)3KJ;QR1iJ)mjg#GZlwiEtd9KJ1L_Baw7bMbv{ zESlNUpvulNr$ZZAD{-U=^YQD-yW&Ro_}C#ryz0^ZL&=v)W!K3fw>pnc-k()4w#U`f zsX|y)2<5U;Mj|Ezp zk-@%;Uyi;JfwRK8uT_XYDYsa8fnH!uA|{;RQ)SUkc|$u4E~Jf=)Hak#h(_pE`%&)X z?uNYKS7wb=Y`C{5!?k}qGL13O_#)SpdL9)o*ik5C`y4h-_V@)`q){q>o`H8|9r|}~ z5nZM2BR%Y8OmU&q{%(%b)FPHD{k23b(fbfhWY14@l;mOMfH?m@YfQZBm%e0jZ@k_X zZ>keQcCr4ku<(^)9*wb0_@UWu=c!T7E66b_y3W>k?DU-Cs49xFwgvTGRc(eS))Yd% zdKi2kT7FnB)ua&uR^L23+dKKTW?kvkliD;$`OUNrue-s|6tn~ES}@scwNwAfInfgp zWbnki*Z4Y03On!g3n+h2Ff5socuKE1^m8WYs5 zX9Rff{4=iQCJ}8K!};+Y@G=fhyFAyYtr)XJiDSi?9fzF3bE1v6A83n~!%JfZVMI^% zxF*3@5u#JZWBVZPI`P5DO~cdI5KQ;9>>sY$(HI+6qZXA5#Nqaj1?a_6KMn(_`%26i zGlcZ^9Et(d==Wwr2u5r)U*9H}IYtgH*E?@kFx{`Y8tMVRVtCO>jbUlLzxti#J>!V0 zj`AiqG)cj6iP(aUP2-6-4X|<$#e_y=aLfHV>G1$=SAlsTL~>0E?m>Ror>McABY(gM zmv>v8B@PNLu9fuEriVPfl*qs5J-Vs@tWwNGo<-5zW<zZ*P~>s2(qD+1T1tO=A(julCO?bXww?6t%H->D-kQCJIb6jWlys;p(vdyhagPhM5a< z%7`Ws&2wq7l602_`h~O>?b{1%(cjDa!}UfJSu_4e1~kHN>o#{M=^jAj$5rI~Pr@NR zwI(b>+E6vD?|}t9Li*!?nY?q%4D}T>3CxO^nNX}#-M+oh^lNBBBft3i=#IrL7JnE? zo5$NTldEbd){+;Z0U)*X`ec+b9&Wz@VhaPO*SQ>+K(D8eQ!Jno>DX5Lv>&H9HAIRl zNOn&*AJViR+*kUN_8$5iJ?PlwXH-7^5-**6i1M?XJs4bjl;C07@#~MsVqw%{VyXt# zzF`bTz(4#cx4x{?Cu?hlV`}#hyhap%62CNG;C(fFJm4ShI2J3;HoqF&`KuQ~0*^aT zXE@Bxqn3A`tlAQRU~v&nCJjNk0X|OWKD$KNOEfORu;D%D;e6G_ z3)9?b@Ut$k#Bpmx?NdHc$er&^A7%Rk{TFO=G-I?G)sL#Ktmrp>=Bd7k9564d;p$BqcU zGzib3cu}QIn4UcW=pC&tX~P#i`AeuibLC;B&-DWz_}V^Uh5$)!ZnD)V?g+KuA|>c5 zDvC7c6L1cTYwnrK@2D^F6@CDXyJA~lTlJLgMCOJX$kau*z)95iZ% zNK`Sqc;GqIPA~Y>&dEgyaZ>*1&ODZ>RmPMGi9-E^w@^~M%`2_-!v>1KGAC@NhNv9_ zn)g2f@DvyEUtSj(vH17KlC6Hd5mR=%-Y0dyk7wvnF|}e*>!AzOPf(Qy-Z9?TZzfZ| zwlI@B_$@Dbz3 zZR1nM(i5-l&KDoGhJV+PpoR=9rrvbCz-k50eVuvHO<{!kw!V^NusOBd!81E2XEs|! zc)U_a{&~*7VKI9?|0^tyeQf^YwHyE%*0g){>SLXUPN2@K$3OysT6wL`vgUVx;c*v* zHv!LFsx#K~iLohLEUF7MXlv&r$4_E1-5SJpy%`>9lxec^Zz4h*|>jdNaaxt#dLK(-nC)0_9!Nvb7Hn^Yj+tL zI@luBc|L759q@sb2@1Z0yVu&Tnr0R6!j&=R>Sk%pJW9<}^jN=*W zV1Cn3#WNJPI6HLXk=}*CB&P->G78rF>0$yCI!m{#E_k&KWM+Cd8El5>fwDGtj@|pu zPDE>mh6RYCg1R0Sq_8%o4-3GVp-=kWkM~&oT}wi}`FSbl)9nRDMSRUsIwZ*l$RZ(> z3|;-v!!_naEo(z)fG(QVv~ofIIo24l_DA=LtM~B0cfzicdDFWRcX7NurPe#U2ON-Q z(Jxn332e}cFMq?ZPZDwB%GkZY_6gilBn=anF=~ zvy3opMsRyRmK-&Y3Z+kMCp9PZdQ$D>>$Kb4{_fJ!h?x2C{iqu9|>Z=+LfNy9@D>f+#U?q(UGf zuJ8BtT}J9A^48iiu#b(~LQ8g6fZ5}=>kZ|!&YsaC+Lez4$#%(ad+dW;RORtDsNZX! zrxuD9xTpMr*X-34aZavXT7+pF&UnQ9oY-c$Y3}rV8JSjH^8#gQ<#G&a^powNtA-q! zzQ5t~?F=u{>7mQ1p6^Cw!G*hNqnsL4+f$RcL0jMEhJanG7m>t;In_gNAseYnZkF;` zJQ4aH+k~NmjNdsg())pv+z*w@>-%b_v}Glrv60!W{{S<<*`TMx3yJ`}e6Xy&$m_DiH=SBUx_M&2Pc|eV6Q%54sA%7*NYg4i=B9YIrDkO)TztnmL$;xyb$LOVJ&aUG& zD%PqKWZljBn!f+K<%^K*_P)!B;xvI5T?F}LvT%0u@3ZqyIuGAHr?G2S(|3)fRpyph zhNGR&1U*X9eCZ|QE!TyKw!n38ZF8|X3-KhS#{_5_gu^L~bjx@ExSXx_X4jWgz z8nEfpD|Dnbz7%O6@^eV5H@#mj4xPpgga#?g)4HtA*rbUEn!hQ{Puki6sfLX#*`}$t zI={hSEpN}j!63~hY>yYRPMfbM!l#I27|ZIgAal>i?9fZO%tE7qLePi;8J3f8Lu#5F zPP&O7c&r~!d*|Frxz25_6@EYR&zolHHQ`4U?vb`bF3*$FFX#5%v7vS#avsh`5p8su zOb$S>#S0c9K|6V!=eb^R40^kkLZ1uY8W(w5INigh7}KX;|h+bixt zduP;rY@>sZwFwogXxv5^rTYbCt#{hyV-$%Qe2LXXcs^8>(7P8X>v0LJw6}>PUo>X8 zo)eY2SrbUCOiSO>(Y1RKHI@4qMj?eq(~!rm!=2^32)6#o_MolQ7lEg=^OH4GVspu6 z&=ts)RFB~091B-ZYOJdNu86tnr-CSCF3~8(Fz{}~1B*aKKxc59XKVuod1E)u?oVXP z>7AsORJC)mE||-~`F#|%P(KG*EGQgBmMQ5?HXd}Wqgd^mZH*S6qa7Fn&*{-oXXUMO#ur>Kw>5LSEF(!ln#?4UC+ z4n=~Z8m1deb>j{|N49{Qb|Cxx=@lcl7UGsocaAGUV#y0AKXAHl^TknR=9zG^EkP07 zZdIUXTr$5mGE}wqL!FoFO^ilr>XIE@$NtD(e1vg4mV5TA7f|k>nx)`obRoE$Mdo5@u zVlDH+R!?@NNOJ*g+&2M#(A=JJEI?P9kxp0a?i75-DmL_1Z+OY|&#wFJhx4Uc8!K<+ zfzDxp4jlRQ47}Sy>_ua?&5~bN|3r7}v)Ir_6h~jBgig5qx zT}|$|>|k{7lOF?-0;i~T+l|YL5DHJ+nx%OT-r4L|Gn7oU+ww!0f( zRO-iVQB{23!=HT3y8p9cnS}nV(Rt7%K2C=gp&LKnaU`1CZtq+>>$CPE)!E6@|NE}` zNl`f9JUX)d3UQ>VD;e9d(9Zp77O~YVg09q@XqD_ElFz?9&7zZm>fpoi(xJQ0dOG&R zvQ}bZ>Kf9c3e)__=_b<&CUeYjI9{go=o&;&rUrH8V}?qx-=Qb%o>ioxAq=IlKZ#7U`Sm$Rn0C; z(f46Po>@=OZSVB>FG;r!IBEf|ZiRjv&%QqkMSE~*6%nbKZgr62lYWB)wl#6b_X zrJskP3&K<<>|X_C*!cT#hnU;}FRtQ4qS{*repm0ZH3)6#(8qa|vn&q*R7Dj=$sGkb z?HEXpK}h$4%8?zbI?@#D3F#Mo7CHrT=6NwMj9O3~d;ktNZr?MZW{79s+>E{Y$;-(v zF(!yWag8Q7IeCj8osrezn}Q@Ci_KSy-^fSQA)5Q~c`ihU)~PcsosUtT+@Yt4J^B0A zNo(2eYkH5jMdwj`fXIEzG5H4s1+817uw(P9fA2XU@jwDnO6H8P9xJ9MQzaFmXWT$g zXgWuJ6Hd#f5ZwS0wKp$0oNHXoiEMR-pCLI$gfCsO*Fi36dGsHDwP=se@vidUBY(d4 zf=?iZV)Vews=!*n(jiSAD8FMJcmhLT)OwM+WZap_S?W0#PnzpGcdM><=C8qt>XPIoIyUum8C6)Q;fy`XBTs8l&JOh11(_ z$a>o&txrGilY(E}dA6juADiu3nGCo9%BYY`r9bF|^7 zZzjZl?7{_1K?(4y{rFTu+eHIB_YRwVI(|ko12G%P8I$_1rHpl^nuPFhMZGwGQhbYu z8<(QnY%q~o_RMO0VVCtWlZbCK7TE}6Z)ds}8~td3d(5HkpTFNxY>XRS%l;gMA&k}h zhljOJOJ?FH|7Uk?{pL3-{h5ukrQy~gM`l#U(7^4;p)T75MISmj%iH@<|C|J9h{oJg z*?r`pUX1tTy+(A^_DJhMXO(_Y)dzz10K0@)ag^m6k5>o%(61Y>sI_;ByX4tJyOTh5 z_GPVD$oM_{SAYZPJ;UlC+q>T4i%*;n4<|=Vv;u&?WXDQ^yK-Z5!><73BFTyEr{Sv_o^(``kluXp{X( zXztataW6|BJ?r;bs}DQ&1l$6CiTjIBODVs00C9TRwD4EccQ2mbn-kAVb~RXo- z78L!#tHaW56W?+Vmfjk=_@@>{C;24neoZjVBXl4p zZt6U=Z13}LzhXiLT@fT{wKYr0lz@3}PlPwBw#>m~`@8t`Cdhl|)>06%pywnF-~X!#R=+_QY~8Z^(yqIHiTd`RiH z<)41HOi~J5Duak<4FI}SgL^Q#mFhKro<17DUdd4%4Tmt=0dPBvi81Cqa=mFNE`miX zw>vYHC#;Qid1Q4CMhb8pL2Lv*B@d}b)g7=d-C>{8$4~#l~dT9EPqb+O%b@AiP;4Ja#mM_C#4LIT}FaDY`t!* zyvx~Bu{5G+VU37t|D6mDCdJuG&;jG-==g)L-gWr>Svy$Mp3dIs-KqxvX7RpE5)}KM z=FR>zDA^Oc3A~9!LLcXGzL_@_>Ji$=TX0;qTC4 zyO*IG@`BG8NJQUM*6MfZ%TvZYwReoeQ61sdbBxH1ONs}!zV@Gj=fV|RkvPAOZ#3#p z3jcc+<7KxmecKpifU*RY;fmdN3AgwbSouYs$SW{p{xS_$Wm3n#Pp+vQdj5c`6@ z&3+yaPreP$JFol8!VjPE8}S1|Rmv8n#D90Hd!FE%8>dniGz*+ByFUdd9fyU_R<%uO z!? z^YVR;*rl_Be>iM~jIfp&yoay%V%4S!oT@EbWsov}QL**R*1^?=O1)>BXCIntf4WBW zR`CgF*1Le$6J6NVTI$X*@QMC~2BmaVa12;Xg@k~DnDt9j?}@9Ox;}jvU2K5j$XAxk zZ5K#ZKmD1B!krv-su-LojCD$^asoMhdSqPnRJbi=kcJHX`R!&$(n&Phl!Zf2S8?F6 zDuEB!&x~3>AOFbNYHGz73}Dd%c6b0~$Ilhpg(!Su24LoyUZQQKq^0Xqh#6q@t1{CE$d~P}aT&HFb3Qz*v zCN!1iGE$3kcht|w6l zpIJ&~Q@$ei%L!)k7##bK*ZK9H%}sb@=Iv^xPaW_H$=7JP1Y}SYV)0?I~g!$ky!P zQ#fXN(syJ z&y~;<5fo&??})bEfNOPCt5YSJXKGiBnjL*5KgPD2EKe)8KNdUxE4d9fm*$jZzH))k zMU{#b%TMv;E>kJnMbaat?mayvQi>O4a-|-5ucBOQ(zVGfSiSn%tGMdyhrGYWe=R7~ zqP~l@*AV}+0;2M`hC+~8$KnHY9w+pG1d53gGE^Wxo$m!w0HaFpj8^4ZE)l{FaZ7Gw zfmI6k1&O~m@R&)+kc;h_+wjhUqtU;p4>*E)N^IA^Ci++u-}P8U2D7jIg|1w8nz5Tj z`>3>J*fjS-HgLH96rd&p&O=G~l4;06hrBY!4dyqG0C;4@6b6|0)w11!c3a{#()23# zrT^~L7wQZ>CE_4?rKeK(VC0}&vfk)0%-z#62fu8YW)(8I2?FBT-A7s5UkE`Cq;A7+ zJ;;|G5c>IIhp<`;EZXn52t&YuxS0cRMW}I_a=abE!U0Lvk4f?>Z^5r`l_miSA|>jE zX=CX@1SVax{tOGF4Uxhw5^IBceh~Ef>X&LhmN$nOXzWs8YwP8*k1Aa>*;*BeF1Vf+Bae1=K*1-$z!*%zVuCei@+@kzLB8f$keOZ zIZuIBSt81lvy}oKPd5wx>Tz}R>M|?a4+Tjkh1KL6dXo7uU11-)4Jv|@(S4ridbh!* zVd#e4e?rEVDkhY8+0!A({e=RgmXxpzQbGGkbKeRqJPGW-?tfNB_0$N_j6aZXzxVZa z-v3O(hsnS6vFj%^6)ho^jYD~TlEBg#f$1#xVUH^?d0;WI?M3-BPLv!$@vU+~VAj{Z z8dUi0|1W__hRgIPV)KfnqwvObj`=T`U%3p$RrNPUP&sGX5_#1NF=V~PuV-ys1idS; zs?bFn-i#=bltAiFNetiRpWaisEdsSypi>c&J@+eSxbEykP7#&dJVD{uu6sC!iI0aI z7ObwgUD8d0%{+eWS0UNjJmLJatqu1M{;?sN7MBv*VJbDzeO zdYGC4hJ3~31ckz^tS7Q}a{9IRHDU~HaB&&t{NBv|8;jE=LMDlxOdEfpls)`k`K-|x zV`bd)hc8dXq%wo5bAE1WBO?Ai?n3iLgWQ^&xT)h~7Bn9VV4P}8v7v|T*r}td7fY>2 z?&B->Z`M07KA45Jh;kdLAL?)TM54k@K^CGzq4T=s6p$p)f3@d-W7k_ET>@&{xx>Qm zNH-g@)l44JPBxNmP)PhSW)2<3W{A}{&ZdMLD^!|itXKC>Ln4Oc^w}AIok~=??1?aW z(cTKXk0`YQXuWFx=Um@cH{5vrv^M*+8YBsnj#ATKT_2tA^D*g+_TLhI6Z^u)GUKck z`g4H@L}-O3#oXKV0zMWhx`mqYUZ1;knoN0|L9q((4WWq!rggAK-ESE3{KC4n#R~jS zoHDWDiyFM5v9o-C>(P~}*+1DHm7x3SN5c&9t3TH}*cNS0l29k!&uIQ&ifGD^N#0X_ zfl@YzmA3e>AfI8a^N)K# zCKFMOOq{%n^=R4ES|kpptiRU<>@4C>m*mj<67fI{a z%KWO5RnZs>*DsT4y7hF{bJqSw_VTeJHDG<+#@3F7Er<~mWa@(RL^X@2H+n#3+Yi^V z6iY52e)R%U9!o)CBx}XYp!BkoZ&N< z0k32VtDMK1U(R`2WT#Tya>0O*?jJQjZ+HePp-H5g-$^Ds`2uI!7XE!X))1#!yuzui z7kKyY2dGobR~`JqvTx7u^jKQdFl(G)yF#PY<`(8^xZtM;r26=NmMGA52F}a;6YJ+I zAdmq)^`=>{2NX8ZG!9u^$Ohjb0D2o?ghm}MHcw9h3w{z0S2;kfhGi#V;#ugWIjd9l zCt+^|g1`F|r~legO&@I8Qlj9cujY6>8PLl9y(NZCEd?(vbV74@=5C?{k3; zO~xL|ckezoupF8OF0%%*;@W07e`mw#v|*inx(gQYXlv~6C7K5T+y-TxoelV(BXM0t zdS8NR+i(IwB3zUQeD~fej^=D4?c)urr|OJ!&RnpJvbsZ@j$((`05a(yO}O(j(#u3p z8|MMt;i76P&I9c9O=t^$i^A#|{H_ke-@X3EaN5t%CoTG+OPb=Y)_ebB+NmVpq0h?J zCN{el^6L1yP0wj-Ytp4(OzP0YfvEpjjr$LVFG_EH{>s#m?ufG}B2NfzrGg>sX+e(1 z_;Mm&oh%Cf8K0j;m6B?=&nD?^qBZ63j`k&-W}a~kbwiY>;Hy81Z+pCOQr+z8Shg;T zE75r35Klf&kY=IJW35i{q>Xm=IPd<~GWRt_YnM#Emw2O-P zjCIO8RLMT!ASg1p1>`K5J}PbByf%>va(EKm0tYxD32$}||NFX7t1-^{#XGCiaz z9MpZNfspL0NG|+{O$qnh1FIJuf2wzcuLg;7vUU;Ae>zVH=?qJ{-M zfMf-2xPD6yo_~DqpPT7-hr`C{gHeOKi}7aCLUKY`h7qEiXRrG!?&qAJI7xWe%DrEq zp}sDIY=w0M z<5zzlaea*I;vlZazfnm5lNhBtFkYofXl!?#{ zuM)GzI)?~#q{E&S16`2OdO*}d$dg%>36+65Nq_rmp{c6N$+&n7I8kPL_v_m?6H&f0 z$-zqY`R*`yMDbv~$V+k%ce=;a%~0VdoG@A3r;l9yBUpKjUiTj)jTW(7yUuX&tHd3+ z%~)C*JCq(dy5Ql84(4MAqc z4)CkC=`GB`lVT^v_(s6xmuFuUTikR6W|z(}VvoEA?%?-+q>Ry47{@*acNN55@3p{N zkM6*^FV(;{M2rTIAL16m8#~8XgsrD$l}5K;Zs{mJ(2TRg)?$mSSGj*rXS)i32CJ>H zEO$rUUQc2PfptoWNAPZXy6!gfe=Fu&^XprrEo*x3LVD=zF)2f#fjyR>Jd1zNMQH5gqCSBFuW}Q-^?(gz{*C ztO|sM)M!}P!sGNracLh%{SasI!PAu~2X^6=3 z4Bce$#uk3cefbm(U6zEtgYlsccj}h>F~aMCauy|T|0M=@0c{LEUHyj3hS6ask z3-y8BpyX8a8vtqwzSoF)aEquP z0GJ0`3Q+vd*5yciSpcL%otv>RX>=E!KC@}+=29QC5pOabt2ol%A)FT5aI3#ppDt_% z->~Yj5Gqw5j2FyRK3lltR#%h{RYr*Ajt>wMTe-x5Dyt@{lNHetBFo_v6fq>f+=o&n z?XO@(L&86MeNSQad?oFO3T9L955m+MrVlLAlR*OWWVy`MCN?6XHgf2zk2F_u`ZG_j zpdS|++c5bVEB)sZWe06+Hus#_5&{>yEg0QR4}iL4Ev<4M$=}pUd3_0O;kTv6!v^@< z)>l6pP;wAM`Iaf-Vt3Zd8Q)s&MD532VHI7czw7lP-gueRVSi03*K9T^U)OK)$uqeH zD6&|hojH29Bw)CDT(CB&>{;O^=Pt=l_~5SHNN|h9y-LsJ{2`gM$RtYwYDab8gW)kJ zIw(O2vxy(2gZ){3%*~&pbMHw^bZuLOI!?%pZPN^)&#SS7$xPvpChb11bDC?v6ej-! zIPFcA>RumI4yd)ChTZ4&+a0AgDPMMq>xJi`^CC)FJ%wAnkKUS2` zxyKjbZ7$4ehqo4Id|}l}RZ)w;005$1s_3*AFT>o3!PR_ll$;^YyR!7>bRkp9(=5@E z4-(dhCKege$2`>hTfe80@4|1vZK$b;r%&k5I!fG@3a`NZopJ9I$Ocg?K=Y5xI)(ntw)G`)JYO zj(2x?)?XmEa`ieletfsakaEp%b^>xA>ALsq7C2IkSB;DuCd)o7lC~npP|W-Llf?bA zvj}VSQQq4!Z0(7=|BtOV|4TaW{1ooXN^Dh71*GnQ1envLxK7 zG%2V|i4+j5Y04=rODoe5+7uCljL2Mon#x^1r3kK2sUUmGCLnNo-#^axK7Rs_2cP#j zuh;XO7vNd)V~#vg*PR309x(UIrwl8`dJY<;-!94tb}3`-Yt0E}a%v)It(Rh=h?yAv z(f38`LMYH+Mi82^MtoFW@~-Q2TE^Cd*zBHgCiM~qzrjmh@}j?;Xr|-lGElQ+Tdao$ z2JEB%F0rrGv6nLIHY0qrl(FvXI?gU?TjFUQ62F^sQ#=|$Uj>i9*zsUgDc*Bu7U0%b zGTupYq?ZcZ3=4Q>Lsxjr)-wOXBwR%vtK`Od-m({(2APnJwsmfLk~zz^8QZfi(ZE9o zU^*8+2~@ca+wu*ZMB~hNi>rzjsM#Y`q zKj$kkUTUnYVn;cNDzSYJRYN(;gN=~`4hM(?MNlsA>ahESS02^d&yrGyUkoH>E0!5Cmu%k{KGSP; zeHBbA_XfP^yNS_ZU~?DW_R_=6^RpyFNtcRUdbUqWqIM3?JNwb*pQ3^t`{oR14g0>g z+?PP_1ZBSc8(DzQavgZK=@Xd&&8i8VRpNuqzL`92U%5+Dh{29))-F-_nFsQfV327} zV@A`PMkxO>GCDOnc4#y{GfdrH*Sp?8;q8_!5pGXQx?-LoAl!x_@CP(#aKwut7=o z<58m|*c_ezB{KAI)Kh>n8Y2um6<^?YT)w`1GB1jATxGYPH(^ZZX^5ImqH8Nh^fInWuUlN2AI2OQ12$r1CV=^)k=} zVulQX&cN2m1FIL1)pMM8(8n`_lZV9F_l1!I=G#e$A4R`mjBolUp6)op&=gbw2OG`> zZG6^lmyY@xzArXFRf5aH5g%_(S ziE96Z`TgH!LS2iRj*Rl~B(8&tl-&!I_+|K;on4ZC&5Uv#D8=772>YusQZ>Xcs_>%)omFjwzD_>0x$zZ6XT-VJPlXB0xYf4an$^Z1qR z<5wZ}?yEjYpVs32#VVZfYH@|kS6OadANhPN8UT}!ZVlc(K*X(%Bvwi$H4oiM2M0a3!IC`USHZi0807(&36CXiAyFC_w9<)| z9Q}W>76MoWefJ$QX8h_$!_x9TyZERlNuYp&GkK#kn7(9JAnQB3Bo)4yN_V+I#=JPF z%3TH!WQ|9B&h&}`CzD`nR+C(ZSvmgcd z>sJsMQ%&I0LGGcLOf1=0{O|J8I)Gw2tbL#Pmf8Gc#>t*TD^NgTzwVj5$tn8{K1v1q zvUv{2Q{aow%hzX>*Me705od&eHxsGRNC*9xDs@h|cs&KGrUL+dQJZcxvR zaf>m+&oVU4us;A|d(&{|=l* z9ZMSrb^&qj*NY4bx)AT?cememwjF%cO}TG(ySkRT=XYU$hr9l?atsFtN3#-VJNjxd z+wpFI;c=inv}-XtH{E0UxqumKRPR{1`OMs~7H4`dRvr}&CG=DaB9KcS3=qz9PJ zeonYrC*n>V@IG6OfY@%}iMFId>X`JgjTIQt`Hg0#YG|9z<^J?0v_!*?WM9S)ZaL-T zblct!-^G*1qULn)D3&_i<$w|YcQ2){5RhN4Wd5nmlPy8I-|1_R9jN8@U6PkrX!_1H zHF07;!@es@R#_G?%5Zl0lj4hsI}6ej2+?E8dX6^6)j2Fdv(a!+@#mSRyobv~pGW47 zHO?2x2F@Ni>HMxXm5cCz&P^uNOhNxveZyONm*FutKKnQuOTWusDLwE)%S?5u=UmCW zV5y;Qpjd!GBw-TA+SLf^n~LDawM$aWjsSstqqyn* zgj*P`np5aL?`{-3>w{d^nW%W=j$Wqwg(YRf}ObfyzY|1J;cm3pJNfH8ye39~up z>zt_0Rx}K7LzXbc4M6vg0>5rd(-`i`k`nNZBnOKAq!VzgN%c%E-5-VR?nZF{RK~oW zz_PHrVU(Ak2TX-i#esl2CTr`{Ovo|@%$$;m4dgSeQ~h3UZhr>@BcoZvs5j#766p8^ zxRto8^k$kRqI!nwd}&Fya#M6gJ>34J;% zB0e0NQ89fu5MLs&lX@mW#Y3t`@Ndas@ap^UL-y(1xyKuKm4SF}I+--O_9%?J_@1Ch z>iMl9J#K(8n&TN(dXISFhjHJwE%~%zk_GAbm|1XXE^%1+zYrXD^oKrKB8I>cZzvxU zH2&B0)DVLq(934SapgAKUPc<%H?ut0(yN>bUe?;!JwFi*HQ48ZS;tma)_pUfXpbP@ zkM;#0s*!o{mq`lOnVU&wKW$>^n*BKjqflJ((ZVu!8R**5p~zRMZ<}b@$tdx6yn|X; zPqHCEl^bDhBWoXAA9T1rbsSqJjU!VwP4{!^Qu8ftc0TmNp2)K9MV~Vk*34=Xdp5i` z_Y6)i{cSQg=TQgp%za`?%lqLt89kx;Eo2+6u)87kr|qsMVf4sRvPhWtt$g^AD(=0x zjTVCLcVrJnQsF6I+0G9pwN5O9OQ{?bMN;zlm;?wGH;>-c`(8POmk? zwDu3mGVYK~cpwwXCLTg#^6;zChZFuT1|TsaS}Vwd_^?k$UzOW%CN&~qfKLil@7X24 zwYs6h^0w5V)6Qj`|7ZznVwU1?2;ZmlMC` z-Y9Cb&mn!z{=0l5`9^#A*&#uI`HML9k91@1Wk==swIgt!VGoJcpG@)dk4+r?k>n}jUM zgw5ngKrR7v>hW2KSODfh-@{0Ldy9v^ttd9T%)?!^86^voJMG z!aH@_6#>;>zc#>s&>NSp>sD`t;uLe=mCNE{_oW$)0V#7G`mcH(=~`}c)rEaI*waAo zMGEobKIjjhHaDJ?Sj*^q1`CQR+jWf>^z>6t9%0#{5!NHB&ASmnTqqmJyX8VLpe^BM z;r{HKPLRz zRmjXgpw#sYy971EFrfs)w|r`BXrt5$wQv1KZjYaC!s!@w=Xm@*}*}rkHv`;wCl>H4~@MmBVpZeHr-tI*LVY z)X9gIt{aHR^G?1b*`Jb5p|$*lG`_Z9iORX;o^;O8zJ%G%T8(wPZQ(B6F}Nwgn--5r z+=tG^)e4GV_v@lWpX4NaxaqWiuO!PcIcEbBtybJT@Ydyfpat`~{_Nn#{#)qI3|PU| z0?YRJn^hXIEkuuAds zsKLNpk>5;m{^w78FXj|nED>Pd_ReoO7vNU=>313Xn4fXW#jC^6>gxtm{A7AP^`qTR zXx!xsE%AHmBjCI|SrSwkBo?8oj|ZKzUAEcn4A46sX$yJbagqXv;5czT$OsHCkb`o% z<^?^KcP&QiY$`5I7`~j41rZTxwq)Li-(NZ(_4Les@zp(zgsnZSn zc;ea_n`s9=RvlNW%b9AJ`!p^dj^njdC9hKR|D*I(PyQ_Y5p9ifaw3Wc?wYwMa=A?B zw7z@UZ|V(wSNO*^_Z#BN>1}kjZay#qYp*ZJjC#j&aKU&w{`#Qu5&A3*vzLmP`X8LJV_QD* znaH~9#2S_9;BSLl-09+d3=UncH6Ingy+g?ljry9|w(mNRH3+rGy80ixPMgYkeF-cU znb)GQ!{acsGBko)#oTNOeed{ogdM-Cd3Ot?Fef*g_^)!neHlG8#tsVg+#{6+zYIRp z*Vpvc2QkB=G& zxT=CB>LdSkuTp=!Bw5@mK1#70du}x|19xD~uHL7slE7MH(7=dFf17Pa$?H+3d=>dl z*Y~65GXzBDm(N(g_*S(?rUnC&+nXMd$WLHavr!ol^jsd9%t?(9U!OmG{Ki0JfSC^$ zsc9(Ir z8W>91!c8DA(9BR>Dd{eFk+yv+z`4kE=!tONNApKAao>(9D&7Wj2{Pf+Z?$(hG6eVB z0L>eZQHPd+b}%MRG8ULWZ|QLeX2`y`_i0RyAKG#9Brl3R5`i$4fD_Tc`UjUMY1@Qk zoy-Mxu7tcMMGuRLUx&H;ciUb>>yXh?+Xc^|n+j-@N2AsCvX8Ih>O9k-;jG){K`_|N z&pj(%_M*~HJ!B7<6)vGNP58HK#$Xs-{lsS>{@`#2N&8WO`G8FjdOm#91SHtMG&}O2 z&e|PMNriv*`P|r*`&3%qB+NRu{tgi{(HLNB$+krW%b3*p5u6&O<#tymuNtc43PLM~ zcP<;x-hyS7RSFcn-9z-V3v?yebwiEJZ~TGb1;ej^%L&CthBfc&0$geTc z`8BGxncOVwh5R^H=|r4KNk}zC_Qp3;MFE==g3*1mr}t24=6SmuYI#c?qLFM1 zO&yZH5bs}#(k{bOokgE)_7o>o1F&%>2a)GBrY9 z69Y^a3eMPw<%`m>UF8Iv4h_=}vu7lTdPT%X!6KHYV>^n{8v&aka zrzK5OrYES^3dk1ds=s=}3t)wHtq2I&k=YX1`R|^jJ!ft9_9DiSbP1#9M&va$tJN7e zH$@13yeVhoTvQK3c)C-Z?!S-R3RAsUYK(YdH$!6g4lu}8%n|Cm3fm9h7#uxS8ia=c zfAw}_hBB0R23)u%*+A2Lt?s_)HV;vnT#Gj?dhw_Iv-QAl5ftOuhdl*)^--Q>ghn^EBBWiaIG7W%O&6A99}uY$symn1ERa4ld(2KNXWO4? zUC|5JyG!itIe|s#$zLb^HFojb(ATXCyu<&WprHSC)pPvZin{c(czE*ukXgHxKjF+7 z)x+7OJgD;s)K0IjQ+Iy;Auxqk=asedBi?q;R{3qHXwF`bt&lAqDcg^X5HI@tkq=&g zzA2Dk4#P2>>RWV_nSa?+zRsCHt7|r$9%G#Di;tTgN*MK3opskb{r`ZgCGNo>c^VM- z3!rMn$kHp?(z;Z=?Hu6lp3V{z*==cj$tx51&LzY@J?@>LKThL@lZ6j4mR8}OfaI-f z#fm}r+p6n_q1=1ND_-oU5$mf-0iewq@9kjkshHezbl<4M3Ipf$(&+2R*~f5}DEOavskl|$(taA~4T5IN5w!9jfvHS2No1c$2KKrQ2% zv*9hZvama}G?`9j?~p&v5m%FO`-IF+;OF8yOKUI(`+4A(;3dLv({b3UeIH zY2iaH_jCxsVYjAk!*@Fd)O8D8z$iP-V_&}6e%79rgOE6VY2a>{D>^l2vf@(U^gX(JK`HwE z^RM7R$tTTzyXid`e|qDqehGt-j2S{;?3`Uq6T+#=QTKq!RRm1cf1xXJge{|QpltS9 zB2uq->Ja&uWm&V1;*CT)X>73?ZNJ%3mzxHyFy+4@Qk{_hQin_(V3lDxe^Epa)qK%% zmgi~3W7QoX+u6&7>I4RS=ATUUSF9RUy!ar=g5}&Jf0zTR;7z^un&HlX{N3N2U)skE zxElUz&`0c6RXcorK1EhBPk%(*_FcOyh);fI;U#LS>{KvB@Of0X?4NSYPVQ#Ehuj|W$eB>05vt|f? zB*^IgYG3{zN(~QT9Wy0w@a}u7k3^B~AgrMnF#5XuqJzuWt=xjJP_h2^q zTME6gZ(9?FYRl5H7EUzU}9S%KW^AVEnh~OQH8~$2`HUdtB z6D=K66Mdmx*q3V|#ks(=4&xxy{3HlnyH(WHte%ArH#XD;#HMtMwWjBq+2iPIV4c0TBsj@6(=bb*Xtuj2( zx-!`JS&vO$cB{gy@%{!1k@dx&!d5KoML&336kEX{v))a05Xu)K2+9ccvdvN4Lcv~) zEzwsc9)jcERd6xCbe3N1hpPJ;4waU*6EJeBlW!SfsQ2BY>Wie&L*4!nI%`Z6PR7G| z4=_R)1Qm;iIlsfM$vP6@rXSsaN4TgawihL)Cc4r@yWY0Lm5(%KRz1qB>!39Cv$Ykg zp<9%FkzL!W_bl79PTfXeB$RVtm=DMU3)nl=4)JbhE_|xnJLU4^>_TjqyLhu~F>pv>2|^RI<}RUc%==Gbo!6!%T@pniY&BHyJ+QhZyeSQLYll9YO~lVl(|=AJaz z2kQ`65mBs&@hNZjvz2jQ*v}@8m+LTJj{LVMa^1JXfB3RMIQiqt_-?w}XG#-@2)W;s zRMDIsW2OY9iP5N3@9rh4@mTR}M=anTnt=fFRNLvNnT$YZx zKTpz-7$@OuOH;NcW@_HU%zise=DwSw{Bz-{$_ZYQYE6>aT0%L2^@Z}&_p5Y+l(1Av z5%6$~Z1%bSk)TK?J82hsucpC=Z;-WF!L}2;OP~%2(ga-rEleMjCdyq@Io;#DDKFwL zLD}nLKk0>e1ccj)jIUq#lzEMMd!S!8YRc3x1IC&^c}{pn^zy7)&cQ-x$@@4)Krkj! znGe5dJ;STI`ATd;%?3JO6_H zN?u&+pU2vzztoiT@mzvy58C`p7<~PTb$>w1V#GOFm!1kaHSqHGd!8^W3KFk4-3VWt>OUnAS@7nB?${; zcNSSCw`x+F(%=2i_K3o$%pQHG#=kEnq@}?ndTS5!nRU&HQDK@Sgn@^{$T z{mf6qrVG6>bF>L9gPg`8#68Y>n=X!`itJ~1(wK`6I=%bk(~-^Czl$c8ubvmFxRpfUQbt{Kcj@E7?$x6K z(K7NmL8`=e>UDXfK$Oz*pzhp%OmX&?Cns*@G8dm&i5aAlzDMMIMt$yDL_ZtYpt?G+ zf_z&J$r)W^W35vyMcn@`TdF%j&%(YME~?0`5J@0u*baW!4kFj^&x@K4=*MOA3WU3X z{Zm8Ma9q=-9J1sFkcX5#8U-_0ma;J5s{f()BXDW>r-tHX-AWOsvE^o}HDQ_{9iX{V z90rIr-N?E$QALq>|1#fCu8_vXPe+WXQGb&|U-#9y-hlF)Zy-`g?s&wbamN7>0TOVa zQ9Tnk0h7VgRr;O~v*dLUg%XW_eqCPDgW1SfhOx5&+dy?eoVvvOj$=`ijoEwo`Xe@| zm3>COfFkD_Jog#Iq!OR&+8@Du2^`Tme@BeVwmeOuJ~6MwhW~rZf+DnUvbsb-JV{SebiZhomlk$6Bj#Ib$@m9_=OG0PVDD`@T8_n{CE4 z9>t3uPqnYWWv4oOPTF=+c&$$KKTo`(Vi-6eDM+X-E4Y2iI`HT0Kz7oQ9P*wHW`J0P z1S`UPFp8|=Scg;t7=YjZC}a4eo*QptEx3iS_l8n0Nt)E^dxiuGMmrIMGpLNS!+xO zFhE`83Um;MUcr9wPG$!?HwOi)nK|?{$R)C_;XyWA^8yU(VWr2|_?jrUYSHTCBRHL%nlZvks{U_W60n6JAysn3tvQ;~hD- z{>aNJ7AfFH@y?b&>FBmK4E0@JzT?sn#E%kDsxkDTiW6a(S)U#IJL&XFTU*YV6+t55 z5r{FOM!WCLxg%W5=si;9AzYrQ0jh_m-{COutKP6`)~mIL?9xEjqkAT$lzjrYTAg*g zcfXuk-WqmB6z39oW+3tjk`LO*-L;tB8iD=H0}suVuf*pQTV{}xPz862t=Ozn_kN(v zfG!bQD=9#7>xqM5s=a}v1X<>~9x$R>RE((Mn!?9;cZv^iNc-*qvm`P5plcp61h!(L z&A5!WM9uRMcrtxM*3l1##t)nN`YjgPWI}XRCZ4paZ@v~~MA_-!VerKy%xUZp|4Xu* zy73)IRh1N>(I`IR`X`DhtsMs-a|P;U1?Hf{}XH9*c6s1mT(ZavMy z9b64ik#D=s2Ss!~4g|lH-(9dTY-%=?2K3N%OZ}g04R88$JL8JkYQEMltjQ76UYp2< zN4EWgf@zcLA6ak1r|QtvCDY0q6n3BKeH)H>UaYf>{IMqobD(+pn@w) zZegQsfM;WXN_`@RBC&?_sB}}ePXcdfnfg+2zbLcgscFCySZiF4u4xM{NM972(LtN0 zi^6&DesO(%wFb9FRaSo&IzF$*k5us!^f6YPvn*oEHT*sd6x{72W%t~}D*$&JI{0Yg z)vCmXWoCU&;K^!%;bx9;@l4E-VV}@{LWMB!Y)GKY6v`j!n{)6RTeOKfQw!IMy5{jg-}wjo0S>r?q`l2e?piWS0w$K&{936)ZCZ`BZwz+6vRbUBz zo{s8+-HSnEqS3;)C7s72vpbNDxX6YuE^T^+J?+!l5z&_QW+@FIo?3)8Y=fB+r)eRg z!Etwh^jqfSLnqCwE4IhT>G62O1ZI6%+TXgIQ}ViJl;?`@s5`-+?AAz!jm$6p;nVT+ zJ#>&UViznX!!svcdsuOiKQ??);MEu7&lEXDFg0LTxny*Kp-zAfvL+k9n z0R(uIIj!AuwVz2$6;Eg&8I02WP8YB^f(Y#yE$vvUAuw?6 zK0KF|?mcT_XfNP5sL!)XAQVi_UUqJO!XHtER))*$+P*=!T*s{nrW^Ziry95~i>Ta^ z`I5ag9{--4G!~J5|BgD&zx=_-0RA#xsYY!OITP5R<$@i~Nq=C0r6eUn_#-}dQKo|2 zvNTKPo9g?c?eVS(IqIS)l~$wD06dAhgkoFKp*W=CBwq^j-5CJzF-_7^^&0C(B`hJO zfcEuM&n{#s?FgI^RtKYd13)9j~G3re-W20nbikZ?+bU0Tpfvz&awBYtLl@O!M!@EZSAk>c4sT? z(QX@1*py&{lJ@bzZ}{7nk(W+&AQ@kFvKA0jFRA$Fnwfp=f=_CB)Z2Pq1knn@<};b~ zJ;m4weew;mtlKNFk$CS z3FJpXm&naO&$(@x+%9>r!^jUEw`|3`>unN;*lTBaKO?-8cDJ`Msp`em-;S+&jm6?S z5Ah!m4-0YY*F9b+{rr4cH^hqe4@i)u7sbB<}qKG>Rv=k1VJr@f1p28m;X(SHDUK)>f*0#8O7 zzsj>2q5Sbh$0d@lAxzH*gztG%ubT)i;B=B)qkSSN+?sLv$6`J~Svt_0P)<4+W$Ot< zkM)aD?_cgkoR1 zFF{E1r$`SBX%g!tTNJ(-1O!T0McrR-TL}HUD8f=x`>h?;SS1o~-xP!OwbRQUm|}2N zUESeJ{`Y;yblEoa^LyHTNeY$?7mwG6S6ymkQaIl2+6UMP&p{LaOTh>UZBD1tyZCpz zL7rN6tbdg(D^A16!~?tOrL?{mI>fu#W&S;494EA?)ZJ5*N|=|SJ%2auS2YCp@x*Dt z2JlEum5;NK?J3v%GCKpRj+@s~28)u%UKf&D-L&pf>E^dGt}Q&4=Ku8)I&OnfP4vZs zRyRe~J}>7P{;_Y+Z5n7WIW)s<=jikCFJWTp;-*GQC##dBIizT^m)nkOt;9gBr4p|c zu*ernI~Z2RNa7%{U>b7DI+yx!4yxgWg>@07V+;{^6CXS7fH7a{@C#$Ds)X@GSE8Ct zsbBB`Cz+ub*ApJT`Fk^oDaK%Xc4`j`7C#P-vmZzGNIRM&-fKs7 zSGn)o6G&rUH(6F@in)y>r}iL*yzq8AYKfbXG5KvU@Nc}fI44JoUj(N*B4L;7a9Bs? zXc`3JS$YR3n;dNCGh+OTr}WeO)&zf3EAX`UK@i}{z7zJVkJSoy9mat z^UWx?!$h=VLi}IyxVA^nYoBMA)WUZhTY!0;cS>^0S;wtE7~^>uplf3dWriB(+}1U4 zN_#JYpq=T*3Q8&}rlN!0%gq8_*wMDXOYC!+u-9QT{XZ-0{6aQgY+k9pC_M&@&rDrR63$rPr8v2jf%w?>I$_zmF+KF)LEDzXYN%T z_v$`xb|#f@+2f8prQPI8FvFU54}dwDouXl7V$Rcq2MZRRZJbm*qDsc}Y`t@o3ptzE zzI&;dUcJv;d>=uo$teXB@;hLrIr}nRn^{-2$jm05BHUk!_JA|LuZCL4zF!;35%o|-qu zvR)j=dl!-?d}+{=oxk%AVj)LWL`WqvZ<8vTM;9t&Hx2OY5~hKF=K3l^YO$e^P?sw1l^FzZ{5 zLh>jcYs16nI88(xjCO7Rz?m57NziaTrp0iq8UuEzg@s_{s0_ z)%B|qQ-Xif{6d%K7sJSVVXiU;Xkq!fWlL-jdBP%jocZ9gL&$N{Cf{Cr{9H4Y@yJ-Y z=y58kzxZ=UdIBLRzxf;9AuJThVXXU>AIcVX%yiMcKa|BM#`3h0rySNjh)t0_3&Gv6 zgpoOrN4I>!GbqJo>L}dw+M%J_#=V>W_c)N9Qf@!j<8!^VdWMYlI<7_i=inyxFBoJz zFx&_tTQ!bdqxvGyZ0lpg@Zc45jZEai?BNaz3)vL%Pt_t!z$a%27TCuI53xTv@{iGv zIGR8&)PK8RJy%W{7(n}=XWblF<>|36s26LBx1ETsGhIwc#%W&nL9Ki*qO#1{lib{g zte1e3b(nRVc1#Zw+e{4CMewtjZ6}YOCY|Y^fnL>_?C0&<1`)xAL>+Z(>g!TseeV9;M6PR|==KZi_g_}Q}HhLAS9JhQ})hEXG%Z29t%rf4K zr0#BE=}Om?Qr4xZyf2B!BPLv7Tx?^7B>bt<*JnB7b(QeCKovR`1`jbo>=IQw2tppO zr?Ln+zGLCmfIGG4itMu_tsU>X7tkRD5@m!LI_tZ5?8o(;Ee_vPKO1tuNK)R&=3e*tqq9!%->t%sF zzt%WQ`-)E`;yZ${WxXM|j zDh*E0Q5x1v)uqY*tYL<4mV}1b|1uH(NwEDn<-Q()pB8189_Z#HMwHJ1T*^hHm^7&8*ZG7OZX%aZSu)lOe9$s%R3lom{aWd+jzxHdm?`UR;cT;o>`&!OSBo4J-R!TG&)TZ7-XQ)$&cM@7F^*Jyi8 zQP}x-)p&YpB_=MZ9i;j~TUBueNiF|>xz$*=%RxH#73SU^#Cy2fO1sZrud@!nUCKcf zJj-w=MR6|Fx7ixb$-d@XHZ@p(fIHd)8OOm z22;1|@OlBB5ps7)R#k3bfwFIQNY=!8>&)>@7>~xU^kSG?Ua+{~oGwB)$lk@fEhbG6 zCaXiwP)Xk1W_?h1AVjI0KKk<+Rsv197Pa48%#r;Q@j5%!?2qi}dKJoGg2=;%qo1y} zB7#7P?GKbpT~GgleJ@%kEf?C56l&B<)`|KZJ%0jGm95UYoVa^t`&V~!CT7^o!aa10 z04~mLX9ZGa8m|WFazuRC6)xQ3O#_X>l7AgWDCd`kF-!watECq=%J($3OH-~VDYFw9 z3bFKm29On@tIBG*;0g@Ls$xs=u;sH5NfWo)t!?+iB%JBgq*6fxL6FNZZWON;y&a5f z*4nRwIU}^bP1)w3DWK#;c}~S|J&~5PzRuBa`jQoWNgJT~TS&XH=Dyxx4l8_5faLI6 zC?giE2BF1Vx3n&|WTx<#YD;GkQtLF*V3^CcIOc+&mRbg3t(q*GJ~mkhsIz04zA1Ao zp$yY6DPC!8erfLD=uIVKzVM562P!GldW77vRCa(%dFj;5lvPK-!Z*66)gALX9uISu ze_&nR#Lv!?%Q~oqOIoPEsz1*`B%!>|fW^0b)bzTeZxI+um{R%Z@0&TK>)pN`n0fiE ziw;=I+G!906>|?1czgbT_;)7zX40L1kH<7@*s-*C6y7Bbf-=Rufp%6IK85$q!3Z$I zWhwLA08h{F1ZCV6Mu?*|wAEi}D+(M!IR8)ougnEdtErv|`D^t?z?yT-F1ANF%NWP1 z(Q>M7Kk$tTzaG!HVM?%-Syku8g2t-QM0H<3Es(rYRfsyON4LW_c_YplJe z8HOMy7rM&oW#2;FgRg5rv=AF$u0v3F%pBRkU6>Ep=e3ODU;KpBTc%MQeUkJ%*gNT) z0{~$5jBEe3;TDeT`gZ;{$h5LCcSe^%6RO#ip0R3)`}b4Y3YhvpbC_N9POhWX98b$| zSNsplJN6ND+h#1L^z4glv{8JvF1?0g?)V2{k|_+B^}vmEjpa-|ngQ0JgwFNLbbe2B zUDGr-S{D$Tz~(>w5)6`j!)Y@52gQKqx7)7}6x)2wAN=Ct2PyuaeuYXQ7wd(CAouUK zhu8T$cDJEmdN1>AB0RUXxluP_j${}k=bdtX=QE686IC^Lz&OJz;nVAfM8)Mghfe-a z=}{oSE`Q_>5@oLl3=*Yc(-v+8Hf2}DN`=omt5ZSfCy4CA_)HlK1g%}vrwxGy8b^w|loVDHeb>Zk&~h{CQAW_?}5 z_$1F+I3n%im5kSeNWV5=6OHWCr+h|lCLuzyGfYA1BWZJSl8%ytRjT<|N-O8lS;+=d zv;w+`IbNbpsF{X%ry#x|!XGjB=tfklV@_NKEQYk|jpYdwBV&dyaCcleIAyuav6eGO zN}wJ5CE|cD+3AFlGL42SsoG)04N)I7-1!`VNj5=ebRj-9Enz)nf3So<87( zNcFO?W3)rS9fjHFV3grvp<#v*C4@T(fD3Y8W8XT+L<4a|j5e#RPi-nI(hjd}v|PAq zrF4SQjv|uIGx)X+M&?g{BmoJpgwsD1<_HfE3}TFuq-s~&!F5aSDnnb|vnB35hprGa zq3`b^A0Z46G7dQ1myil#)62VA64Zv&Wfu5C1Mz!k{xksgm8uc950Y&A{-{0iIYV@~ zjB047(h+mnr6uJ5!`#^~0trSS%ZB-5ngkI22>$$-m5^im4Xh-U=CrxVoyl{0%{OD3 z*#%>oZ$OO93vIQR`CjA?l=tmG*KTFfUd8|_J_O0?yV9erGp7Gx--9ZK{-|r5sh;?I zFbN6>Ma0Wjivw@4DH;%iCp$J*K{)5%vLxHx0YWz=Y*CKZs(tK=3lwYu@q)MVj7VBp z1bHoe0{H8DF2-%`;~izrW0B4PrC`zBsHYOlj0HU9BRz^`9+di_Wh8! zI_wqoZb|<^yrBWDq1BBE{rkH4?DS;4p>?(t+H|kw>}-MrSrir>32o2wG)2B zM=l6T?m?FmB%U{xplENuyfnB)A=w%Zp5F3N>=W}<_e=@xwNs{E8Awc5VU2=ohk%{= zPXrPF4_j~kmt?|+ZBOHr)3n&sU5+hS)1)(FMP^i}V9S)1DWxf{P+C$_SrQ>2&~A%M zW#)#^=8lpQnF~-;?#fk)pr%+Zpn#Gf5Fq&SJnt{>=f2;6LHWRSeb4ha&ZnK-GeeBk z+~X|LwD*0Siy_HP@Ol9@s%4atZJ#nq9`*jhm-Y7DhAMabE#Y+6DD$MNFr%YB42~mb zMW)*8QYx5>rFD~$G41$GZjHTfUZS~mjqF7&7LQLf!xyggWoQnm5dnvGW!&m z!!a#2z?X&i$#LOww=?um!__`z7ZnyG4p_4j=u|}>gF)Z*ruD`0cl6!TRK^_w#xMMhp5y${OKi> zScf70PvA=|=>)?V9)yjIdY0Bbv*t5?*Jg5ulk$8JPMXi7BrqUa@p61)l{g11JN&k{ zr=DXPb-Z{WpU3e2B2+`jo7KzJ_8)R2nYFy6iVrS|259bNSsL#o?5nLY>zRDfb~0K4 zbRlmm{CePU`=oY^&o`Aq9n>J4y8R&zIZ!ZsI{(f} z^q%wGH;UX#Q%-Gy8ZN9+Q?3O}V(>S`QEc2%IEJOpOC%uW`ih9_0gQOgW-7yDLuSbg~S~$Hk;ygQX zRN4E2V2X{ulmx>#e{`GOd^WNloE|0VQ*?PCZSn#2-_-buP~&us`5s3f_pH9kDx5I< zu1?|Mj>Is!6Q5;41%i(|v68ip)0NIv{S~6{4gR1Nw%cdiEc!)7DL}@Nq_V#ndvki& zYCsY$Z_SG^QtZ_PEBMZ+mL}dME*kuwOaYzDtQ?X1Y)l#%>IJw<6A(-%8w>8!wk`{1 zvwbvpYdJ48Dd@5ZX79D#*m@9}jI$-V-4Tg7t(Th24P`*V;Hl=oWvh=3d%t7 zou{|RSAP>pysRR>;%c>eXd%at1Pbyn-`5&;M^A`;oH}WZj3rI|IaA|uUt$i5KszIN z374_FLC#S={Dv2O#x*7m8j{-EQ&hSf+|i6| zNt;wG%VBqA81ZD`_YqiSvaWwYx!`Equ$+8sF%#~FuG!SF^Gjtk8NJglzbqDb9~sdY zCp7xM%-4OFwcqE~H)~tji;7J%`-3l~iX2G$%! zS|69qAJZ7-ai7R8@-wk10OgEMK|IwXI`AM_<2C5_w#+2*?uyXlOrI?vm&T;u$TW(5 z9`}&QrA1aNDB#mgqi0sKNNvy>3!GmXU~ivc&MUwy^96S;L{fam=?rk*LX{2~dlK4LbKe)Y99A9UC?KgwUxNGpAy5EaZviQT^K zTh69p3Fl&=)?i1T@eHXTCGL;x^Hiwme&l>zE9Ncirbod@J-Q(f2Uq_yVDi`)cg15J zSzKe<88qIu;;Sq3)Z%D(`1dA^onPagvjdU_qAf zU{)Sed0@)TH45LcmO7x|U==m6Qa}Ys;+er0^&YMvJ=^b16FvQ!peK%Cn#0GSChbAE z_FTH2U;XRz&B`DL#zc_vmu}2UiIiV)Ev+ZTRi?>-8~bsRBo{`R1M2)lBCuH#oUC;Z~@NXSv_7gl`xmkPW?b`aYKQEpriy`kLlsB&B4*f;B z2M4nkn1av@nWTyzb&RDUz9Vktn*QZ~C`G7CCX(}jr}8C~9~L#~S-J5dUTE10ib?s- z&Aihdj43zrpEqJS^#lMr1oIO{8NSUG2V|$vLG`VeCU!ljAmET7E?&*}b&?oAh%2n4 zHucJ*cBkVPZvtbgWXMO8Nz4hnq31%8D{wcnBGwjA*shD;Tt6s>!&qpai$ZP_nS71c z>Sl@p^N7FFa>LXlm-5Q}QA44Tdd5dvpz zCl=Jn$b61jAtWgBBR=SRA5|i5m!?rlzURbJ`o=W zxAi~eqy^8OBa2qC4ZNQ!GP>pel1`bB{A+DHNSO1&rf`o-71+Ba>?FQ`oPAFVGF$5O z#fLrvzfYO7UrO%PcDrfrlXlsO;kv7k-rRx~4|7+YeC;Hz7-U&kxg`rL^grCAgsQ_U zsf^%a)fND6+&^QX%+>T-Vl*n z%JgVUa(PmH!6k~4f5H_k!puIa$GXDm5@X9L-NuEfV0QVbyp>;hAK9`$&MC$-xm^#r?H1S(L2e$IL5$rBFgKPsT{W^OP~GK^EpHe8epUH^Ehvq;O76I zkiz|Y??=QFW7L2kb8za*@E`CXjmN7Q`dQ1_ShZXp@#Hm1E)PcTyR&_{TWgVqDx1q{ zkF+K59XfdeS9@ArBDcb{f2utMM;nI3b7M zHuSG2N>*<_au)8R-UxN*H^IE*e~+UKKOhhLU_W?eFkl7se%hbZd&RZ+Kr`lNmcGI$ z%=TO>2Fi~(utt_)Webs`s0A2`czaG86>qrfzL;!tw^YeC@i6EctSz#93aI`=z2T9l zN)AzTNzf1YK;RxuPOtfh3#`2B<#6f)vV(6Q8V@#nAdXTr&}UQpgF1ygbIg@)3Geoz zoZ$*3jr7XCVKj9NSecDVy7*zu(2v2-`JiJmGLTDrDZnNO#SrBJykx9E<{8CS%@0CU56!!uSdC2;KHn8zT75VdFO@Q@@WAN!R%wL2fuQCJo=_DC*l=g?#7<>8``j zQTwoWNdkuHGHV;fb!gPX++G{6o!REhYcH70v&X`pCsh=i?FA5r&+$MPo!{kyBzbo{ zvPlq(W~`}F$Zt{EAv_PDyAXW2&)L6g9V+`Gl-8K@rbz5VQZ`T94kD65)Hqq4^U%F% zyW#PhKSfQt1`&jx_#^r9+ee-IrgPlIHV9uYtDQJ{b@ZGyT1+?Uxdu+fN37H_igcwi za<>E245!6ko&Ev1K`$uprBilKj35O~wmv@&^ySg)uHh2domRuZr=t-j&UP4PVTzm? z_3fBLV@7)oEtbYCaxGFmnT`A!0Tel5nY=ROR&r9F7tp&NyA(1KJE3YBpa7}wSi84U z2Cicg6|S=5;*A!r&_^JmwDXbJc!yz0?Z(Yp9XKId7mJs}5Dh~Huks4d#L^DXL%xY_ zshvEt*_gOkQbSWe@uKwF%HgEuqqz2ukVZlI69;eIgD@;u40klCx~|J``xAO;ji(e} z=p`lt?vG9mMakRxSwf-C=D>p%(C2@>v*QH*Pm86!cO_;gW}U%8y$_pMM=zrpf6MD@ zbrj}hBPbIFgFHK5`Rbrq>*o{D0cy$ zptrTgjVZ_)GXukT8Z)5GQ(NeUxP0DH^UQw;;J67_hCFh*+d^ zH90GVlB!*B976j)&j;QfKJgD`ShCMlO;j>bJZ&6QSR~?hfW8#Bm22cI-N;PRc=#uj zEW@;RqiP;+61*ym-e+j2!@jdr!|&IO6!k=olh3Jv@9#i3?qY_%WZ7$v*eK~}1bckZ z_*_mkz9k3&5y!Vg`5rP z@qM}!rA!Q>bQs!^Ba=6iQLN(?ukb?elRh}b3DUy|pP92QFvp3|tft`gy;-D7l-GP+ zcNq{D##?6W)Jd+bU~me>x#%=4SJSbVM~Q1B%@PZWxN(LlX(FGjGPH5ZV81}jZ<=Rz z(4WToiFY(a(QF0EX}&EN?|yIQ{Ak`3p$?VcL4!$mYGg@#{fT^5&g=bEkC9d@DSR1r zvX4@Nm){P{>YL`JRR^R;R0GFZ=3@gRU4qF|yp>Pj!}ksCiKNGk+?}S0nm;AXB%K%U z5MeTkl5?E}L0c5wVaBKVI=>w<-=G=`+4zy1RT^ca$VQzUw4y7#FhtZuhRAc(%L;8N zwiszAwBvxa*=11i<)@9=we(ZhT;v34(x$;R2zF$7RNq80RoJXvv<<1y$IN}DG6%1O zb-y!#Ly;2&Jr)*B{&B$_oHVjh@6BBUZr^P_=C31I!}ChLX0HYd*lyL67e`-%b^7Dw zd>y`#j}1q|+>j>4DCec)n61K@!0Z^{{+cEFIbyhXnfPQxe0zADNaLeOxhHM+s0k#j zVc*Rs9HbX*TONc#%cjT+FvB@$ImP)UzdmlWdq^(I=@x7!LSI{zk16EM&cmNhdN+Nd zJT%BcFTj~ba6iO;P1#=FnUxP4M+7(w1rI_F^j>C)`+Sf?B$vi%NII1?ew6oE<-+R@ z&2T?}R)(f7z@X>*Mu+w-3puN1cTF1mBM^`(jaNu+7e=>JbCV&AUkuiV$+ee)>$(=; zI$^p=`6esqFw>QujMOi|?UV6*^Q&HCdV#UlU-!24)*F6*Of$6QOuYL=nr}T$Y4Qs) z-L1hy^+mnEXG*#pTqn7`S9ngKxy5lUu0~>~XlZ2dQ=s!aTM+>xrRl#BU$~OhXFz{O z8Tv8uOic+FSHP|jvcbc_5|jsuO`Ysd^`>ikhwnz^-bHR!M{hE-5P|PQQXvm@8&8j) zvi#3wf*_XfoFcY$Vg8Qek0va~_RoHGi1Gmt(jxth9swStH-;@QGtR7TbHw=I!j<@n zTBGsUcz5D0{qbANYke?5b|X7Eo_?QTrI^8t-}>AVL~q!9(+gi9>&a*^9xtTk`>8eI zbrXKs-6+Pp7}5 zMGA^r%j>qwy|H>c#fwd)I~~l^N3|_Ng=J*BvH91@Vii|UcH!Q)-nx_No8MBSm{@Qd z+J+CWoKJk>E57P+;0%JPa$T+40)6Sx>o*`&O?79{NBPq3X>bdZU@El8UCYhohV`U;*A|# zM0vjn8#a4<+wAPrXYW-j?Ic?_=Ih=En)Iw2;uzh3@lHD zlLBK?AY{1Z`Q`-0*D9VR>JtXsLefX~L%xO*yoh%XN@=E}@|5!Ny1eVw_qNty3j~t` zYf0RmY*nF+nsIHib_;w{K<>LuaSPkwdB!$mMBTs3+qCzapP`P!jw^zitnRyAwZuL_eU=Pdy+@e#Hr+c z#~6M8Fi%(hDX^TacEOxcYoU(vb`|AmOHBeJv#3dmP%(9ypfsnes6ohox17M>j+xbW z%9&wKXy%=BcidL`BwsW2mxgS!dN*W)X27xPhh~qj*lJ;y(&{}q$=l(0)(u%Hs)}vb zxvCbOg=XoBd>LUpI}WQCT0WHP-wM!0d{aKDxH6FQ8mnH|El}i_Y#V5UV7BW;WX7jQ z=j}IZppiQUnE@f_SO(v(8W7i9!zk|$H8{nU*PmwZfOdXAK+Hq~9~t$f`g(%Ujw|ks zY>-qvVe}u&H{(WK)D9-0bci*-Z*iv7liO7``B`1^mwCuTCt>@xLnqwje^2nyBR?Ai zlrqCSjqpP##z(04KNLZZ!&YeMmD4|&YeV=k!rvPo%a_}xg%no{4BY4rA!s9RKX<0C z+O`rV!5J*LTk)Z7tz`lqq>YQl$jT5Kkco30?Cw@HF8=4>%0T&*D``934Kypx`~#UH z>S=>beXv%HMV8LBqM*xiNr`4)GI=mdExiPvTj7Vw7#dTQs~`I5<-x``rs~% zKrrGRRt6S4`&D-(O&&=hZC?9AKzo{{YN?f$QG_T0wW-rKa;IMuk0Lf@4l;H*JuY#? z5`UEO$1Bk3PD^bT<0o@MBxXOIefSl>Mln=deJmLG*9iv%(KEkN}SI+xtmdhlp0%c=M0Cr5?8ZwoB5HiVah0qN}xs;6^#`+7*%uV z+6J63u>%c=NvMw=*=1p(o!Dn$SkHRy_iqZdeWqcv=Wd^h;+I4q*N4HDay7V5*{%#u4jgt!m^(HHJg-%aSolLY^LY}7MV-c7)4l> zBN^jH8Mw)vb#$ZNBE@MLPtXfwjt6)skgFY=VceeH#sq;f=tYi`-zJ|w8Z=M$| zah;uB_%XXJnC*mkStOOv*{0w~#83w7`g0(&v`^d)ePS|zJ`Uj2QYL!?uVpotH63da zXE`o;GTDTVG2AvuJgV9yEJ!_bm_M@<`NYRv!Lbkfjn6#-{wHnvy_Y9ZR0a=7G1 zPc?9d-yJq=9oz~8qF4ItSf<<>@@jB~#iB?OGHP|Wn|{06f$p)dg4s&-jqes{e+BX} z(|A=HmT~bCQX#}!9+q1oTP|*!cQ$|Sbo7MRF~M@dFQr)w40^n888$)feZz3MA%FaC znpUno0nz7cDqYJ&6f6^Eu*v+0pp3hYql1KEqarB~W9r7Pkx;GwXD&@L-lx1LT)mFs zS};x&y?jZCZH5UF_S?M6G&zK!8)7^Jq@$xVTp(9}k=@iXjwHXLWO)%9Lft}E3cr_D zH{sYMnwIx_;Wli&??t#5X2~nr+nh*Ubcg(KT^Mo-CeOwAd@d7`Lfq%=_W3FzhnZisV(P`JqnbYUK$>fi-KYe%G#Wubs9DKqQY4x7{BG{Ki$S~|e0r}L zS*fy2&j4my-38_F$p=vn&=UNCLY%H#1J4|7y>Z^ehX%QQSw{W)(v%dW&Bc7D# zDVKV+s6_|k3fb)|PoINfl+0`ZRFw`#PN!XEl-%sX*ys|D5SDl=#eX6wpM2Cq@c4sw zc1(`?6WiocG6xup{Xt{vLurAX2beW|MK3Ilo?5qBNDU(X+hJN#A^fir+q-=~$EFJ& z(=3kW5kp8FZ>ZnKyU<$YEAQN*#KumHUI@vl^yVacOZ0~NuPy7D?-4+tX=Vm8kKTQ1 zV-EjgpH7MFm}cg-h%N-w@4yyTZN_fZ!vLev8kDyZmO6UYD7_Daik-5UaqG;xO}j}x z<(+biT*I}!a5^$M`{EviAK=-fK&q)1$;O4d%R_M!6_Q>hG~~A~M@CYpe6`l{Af7Qe zq`y`|EX{Kd+2YeuGk#N*Vj;!mSPE~QGTjX~?4vm#d@eLH8D3+Vy2f2TZ?suWGvKlD z449}Lx;4xF`*sgZb8ckERY=XG=y&WDPIwNb0kj3T#nuQ(HAkLm#DKQi%LLt3GG6TY z##__62q>Of+ zxQ)dGRP?6sZ}hU_yh>MxEqX6?Z%_(eymT3)g~dDxiW6*AZWNc+{VpkkjO1^^wAb#% zQVA0w644?~<&q7kk_>HsE>9pBoAL}@C_SC+! ze|CANevJP1pQf0_KD-U&KStXscw)2w=CW`p2zX- z?g-NbF5qmpas8BcMr} z;Cn76faBa!E(1Y^}L+so1{Lw!p=!rLVW) zg#T9C-Vde?yhEKHmdp2US^~XzDtB_BYgv0@m|+H)1-TAeXIYC|hM9NiKpCRrRC#TR zr1qH`l0LYDh56)|3MqN;JWZQM+**`|hci>k4~Sl2n=&+~BsJsqdImYicufl(+=0f% zrl-jH%-za_Owl{hAx19~k9T-2y}H7WFxN7;MTaugC2PZgP-Le}DVNqN!Ve5``snkC0mEO%qKN8xh7Vo=IpdWL1ItNhYN$|C(HTDTF zw2YE*OlM^ct#i(2TS*vuhat$4hvQz$ZOWJ=^+$27cW6w2oFmkpj4P+*x?@^$bG$I# zsi*Dv<53Z%}|9YWI*fh>eFI6vTIQYEKCUjXB4J5KO?wQ*hfk=}?`usJ1sb z@><#vqh4}Y3~TsRGoukzm}wJ%7tP-`KVWz+q300gj=pO1MA6UQd^27C#h*2 zWg_ol+-)Q7l?p5Hx?E0O)aU0fv};@j(F?=%TA?CAeW(WmMV@8G$x*jA$XDxc$p)HPLD3i*&>%9YhD@Glu4Z@kvGd0$v3q7oVKsI_e!>AYTBlA1 z1_ZB2d!>HUtXRNtZKkJfGs8XOfJnyW_rhJzbxgB~kopbmM45%O@6$ z7bR=Gcf&E9baISD{V@;#VQf!(BxC$ zSnK;xlI$!_82_YAnzYEtuX(WcW8F2}#tE*NBW-!tIzb`Qq}O+%_rk$Uu4l7##Aa<& ze#~VvKJ-10Ztq90KjMk~+g|vTdC^>1o27Xpj&cjKpCIbz;-W&J-W(whQ(V(C@g1YA zYxGK#Y#7vixZCxFq`QmibCugV(fnv2X_5%0+{O$Z6wWzRUM`_Bn$8XgNIhk+PbcHG zcf#f6xoZU5S#GUM9Hku=^&TFl55PwY8QO&$p$%tl&&D6$NC~?NLs^MA4BL;t4CPEQ z@=q*s19cDMD*P@si8eFc_g;fQ>OXouhqFrN$gidm4yzz!{(oQOXUxMGPwK5OF6P$GYg8&G5g6%fJ*CyS@P28r2YG(9%LVk9Uzj~q?*(QdCuuTH2*uE?fS8o z1FHpjG9ERq#+8q8tG5q-nL(UPWy|RHeBF{EES&j?dY&cwc1o>1tO81@#t9C!rE`ME z2xEG8%YHen!9u1`-=Aqw^D(sjr_Fi=k@Q;g(c!V$9Xn7ETgJoC_$*)t{T=4?EaUmM zi}ir`*{M^YW@yq1M#SgHr=J(F{OY}QL+!^ApWb_qslERtDpUYf9M)>uh9wdP=ve*Z z_FoBB`o4aS=9jirxIxVa1w8*BWv)Td`+AVEiBcz_0!_F%ko(*#&QP&y)#Glt$2$qJ zTh3wi|Kbd6XWF%Em-k|UKz!JsROy@&Vs``f&*H}?L46`h`Qk;&z&|RGqzEL>{4Tg& z*)4^ydaVzy86ze%B4>Gy@>=r^WJlMGg03A~AO(}>*YRm&aro5qzC3B%Qc5@yOL|n{ zt(b9Ql0s08f1}9Qw?w0V$V%_eY#|3tTw?p0>6dZ~5eaRZSrl<_Kov%7tiKV{U`{E5 zW#s`&otWrK^w9;IF{2{O81C~lRG^rW&PIvD)nXL8X$Y`h>i zVo8K{GM9q}42ziiNC!y6PiH$L-7@tT=Jw^wHLu_RZjv>;7^i0uHlrpHibzN~8#GWP z#DKAZS>Lm&=*b(@BA&u&2^;SAANM42g6K-$Kk=~?z*t5Iq)0#H6|FXqkVR3@-345T9{oU9Rm5FaZaT51XZ<{=+aG z>;~l6dSSI>!xXSzXk_IdY|c_IjvRYW`YWVeTH@BxSMD)ZJ^dWmkzGW}eSygBFO#K}h8X*LzKYvaYoe?TA-aTH^GZ+d#oYozI!9oJh){|jTAG*IMZ zp`dY>#dfb7b~k>jHBYR}_E>F+pZ#s^+PJ8|%F<7Owf|;tDl{8wIxt%6vM%I*E^f2D zuO3U`Sr2Aris0!}oGj}`mr9hsCP)Y*GzX{S>#-y8?g&bnF4@%Eac(N?IZdzisES0M zHylncW#`C&JGrJAg(?`bCqSKon7&^z&Rn-uEsDx?E4sCI-zx%(tryLN6I!jK2m!PhVq{ zf9v;1lFqNsf=;J%(BN&iddb4@;XrBTbq%_XA~bPXTKUWa!4TBrgT7+jjbs!@HosH4 z_j}D6dGGb@iUcv;sr0qkXTV>TA;p3ITvMrqUC}buxHbZt+sE&LBFhivR~E^C`|Mjx zXawp+Ggv|cW&1agpL6pY$PsPngvU#XBsZ6BW@-EI6x*+P-;5!KzqE5_R4wRBQQLe| z{ryWBtw$Ytp35E9ELJ^u%C%oft|9%3yOHH^)jl?Wxrg1#_Sy)f5nY|Bz-9iNBM^Cx z_fjl9Idq)oYk4=%n9?z|=X}S9UYWG^r}X;t9<lEvbb52|s~ zKclT4ly8Mua6LOxH%1xs!QJPNJcKh>qQ||ExG_~*DRN?g(DJ@d@!XNK6yre87fg2; zbu1<&WydHDUKcdHaLwL4O3Q=&a+uNn$C49dQ$oecb?L&|PKh)dE3N_9dzn%2m@gkZ z{tYi@uSTT1X1ke(<6v$Wb!j^1LM#Hs)WN2{*c#q+4}wLm*Wpivz;#3D*3OKZSsr`D zzhYdb;QPwOL_Q+Ro)S4Rzdah=683e*{@Ccd8kw?A%cxb8D<40mbRSz&W_X!~d=}ey zHJf2ly*AVfukMFwU!Ft{@mp=Fy#*)ja@JpbD#Y(eCGL6(eCSmyWqFb zwsOhBPZ6pp1KUZYDAs`L&ef2HiV4^W6otbw* zk9(A~yIcoNlb7UBgRUEb5L!eHP3bLquj%dkkR;xa_}$oFK42bog2C!c#LyVNI-Br= zk~lh0d~uLlWMg7}%bihmn3MXkWcMIum}Cmh#OZL&pmA&}F<5j(w{IfLP*C(ZN!XTa zQJq=?uKV)I$OxNmG5&&S4eeMunwLu37rRX@Dk^iq$UWXm@M47{XF;bW=wIuyLXcO5uJIwwOGdf6N z{pD=I@-=G1Ks`p@F%!&{Ox}x4XeT9VBj^t<9OVHy1N1o3Zlu{ad1~j7!Q)c=y!V^0e zL|htA-OnF5BR(Z43N=+#Q%%BN+Gr+mj}$C%^*OM{A&sP`%XXYe(9`kA5n%_)E6GDX z&aT9JYAW>CQ+ijC7zfV?lbUwXv>psIH1CD|_Mqp6F7Lr4-6aP`Mm&@^ebk;(0U?(q zv#zr83|EM;Wro)?cVSFMLrQOq_)WE=(bZW|?hn?Mc(@LF2L_#5V{Vb~PA>YaT341f z;|Rvy_>N>AWqRsymvLLTP6Vs+m3RikB*A2y2PJvLG;zsImih7U^o(4Hff?S^uDO^4 zoR$g5A*u>NbbC+<;NvkivxD<${)=&}tb8x#kJo%#^~wmO7-i1eg)yRU_Q zGg5zFbrT2z*%Hi*8b;A^q`JGB>fg|FYPDMNK(OPj37Tvs5|EXSSYbZb$?tYX3z1q{ za-`vuu4ZX*kI$Ja%}KY43{C*K%3(YT0}gowC6n5{Hk9NUCxb4U+rt`my6Y>P>>d}@ zRGk+tRvaf?=hj>^jtA%BJ-z>N*du;dE#DxfXdlHBy#8XV9L9a*Eg(c_9tgoT$><5< z3LF2Yc~MzC5@u257~>82!kS#W;mHlywMscITX|AwkDzjplVPJRt_Cd6+oCSI(8PR2 zzL`S+QVxiAH!@yH&aeUg+-r(K{LRWDj5pG|5)V$?)gVNj_LB556Si1z^I}xcrL(df z6j>PKQcdA(wE&Bnt-;KMm=|#oNo}x(JG}pT*_a{x3;6OWoA*c~C)xkUSOllB|3Chs z!JMLPA7+SmmiWoM%VKHg@ky^QPuP$nax1jyE(>?jnzE6+q%4=^V_2<*?(w0l#cjn> zea+s^wLo7OPB?9w3Ta;7Qn$+hHzYK|eU{x)9i)ruKL;_p>JEU9Wc`*0d|Z99BWPjl z8nZ|N)-EieY4SW6>L^JEMKh97J3dG8WhO_)a_y>&yvirvQ(3E5jmV=$rq#AJGp{$Z zE0zKJ<=86|UD|T|Uz3TZ7s*M=ecr^o6nGvmSS02a4o~i0Ge$OLxOMni!{xxkrRG!M zEt7D{gNLnfg5apS)S4&wzd~`v>;|5{|L;PV6?KOiIU(PEi1u5ycMchR3E(2lS@!X# z9i&P6(RxyO*ZB2UsDknD8HR#7O(!Q*AbHLgeCy29(%Jfnn;@_NlwteGuiM zVQh}a5_?#ZlUrP{9Sb24eEUG&wdpYJJQTRxp2!=sZyd18WgU#i`Rjg< zPxU;KM-_irpdwGez}Q0e1sQkKq~SV9KM()mJC7r_2b(pAM8L`;pYa8|YpFlb2J0@Q z^*`s*IvgT6)Cs2-risBFUw4ex1ZZ+(-f_5mKK(YbBD#Snc}6}7j>Fxu!Dtj^Kc^*1 z0CblPza*i|1$BDT9+MMhLyGUGi_i#F`=lh|TDyO(pD4-k+WDVqV#;E?Ciiz`r{^^8${zk8ZY zaelxtLCi1Wk}K9==9;TaTWRetZLwKl0CPSFam4%qs$M)#G^&Ey@7#gy5EG@~m^&z8 zA4vHdXvA|K)Q-&gL^PENif-k`gOV4ey&@aEg2_v%LuKXbms z#yObY6#*rul61Z^(WX6c=ev~sZ>3(vZK2oV2a@4MV5+u0q94Dnyiqkexadw0L9CJ| zo@vcWJmUw{kRk}OyLHHsMCcAT&7Zv{%FnkEf*a3y9iufU<@c*3F&(Ik6Dk(8Z^_}T z!#hmsh@?}KNXUo(%>lOf>?py}tnU>V&o6T5+yBpQsP(b-#g3J*^4d1ArnjG!WE{a@ zSs!M0EQhYT@VE{${d;3CRZ=oDna%P2)R;T7dJ|bfbY4NyMGCR!MwK{UAK(w!f^5%AK&Gbwp3!e!rMp7} zhe8bXu+OA`&$g()7T^HPR?OeG}DC3_|_ zw(>aOo#_T&s^>O6moK#SDt5IyejETP>oF%gdQ*`5jDJ`gZY0Tyr^5PS)oe<_%@V&< zXh^5YM<+t0oclZ%FJ9KvIHPd1J<*>Bc1`RRbTWa<*Y=wn_5>`i_I>93)drq*`^TNf zXc_-8lkZDZ&&A!KCsr55`Pl_Xit4K*M#%rYEsK)tBM|Jl{f6H*EY`32b}nk71NOk< zs>jQf%eb!P>+>uhmA?I}HLf;x7cxL#vim*HIbd6d>0Q}l`7hv~oCCY2G`}M)ZgJ`L zP0Pfgg2~tZDH6U0aacJ@EEj!|yM2x1`EfpqIxu&Ssb5=Z0VgHS6bz5>Uz& z#+j&lR@{+vRfNjL(TJI&ynAj9a4gcI+5fo(a?T% zYIK!ZbgE(;C!R`(pW!@~XH03sF6=PZ8JvW@Z<8wY1kjh6ZGM3eu3E5aJ45}gfMWX} z`#1=p3y!JUD|es_Ya3U)@v;rR>RdzeG$bq3{1bP)dnCz1*Hs0y2W6}rb}e#PgFEDTJmZ?t;D4 zIQ@34UTj)@W*;)ZS}*Kg=1*JW4M6e6g#2asBE*f6WiWD2h9aKeyXTY5WN{}%1 z{KW9)?jqAc{RtgtGP6ov(_^0$a74-jxTK16x;n*oXZi0TxjgW=XW3N^n|z>wb^5m1 zNZ|?Osw=5BB?(N6jqcbo$?z~nYKYA#;~Ca#7+tX!O&ExFG-_MNgLF5EG5GzQv>iRr z=O)qEa35~FH1NU!}zO97ANsB0Aj*Ett#OA_2KgMxeQ#P=(?f# zw^vOij?s8RfV}?KTo|CIr8}D@GWs$gz^oi*|Q=a>Eh-4eH23n2&w~>a8 zsa)fuX@B~s$hherqV+$9#IXlF{Tl9SDu|~@0raPFV+6fyhXd{SPC`SRgXky|bEK`8 zmxzhhW9I5)JSM0FI_aYp7vl)AUS1)MtlO5R`cV^wdtBZ)k>rn?Ye2H8&XjltviGaJ_R+2BdPoLr9DbNqSR8-o3w=M1*00G z;|yqqwx1vLFX72LsLA_Zvmjb-BkTD}E z1ya90*~N_b7}nNm{sBun*YWiIR_1K&Ah*M5b_TdYs+Eu%F_|3}| zRnDluO7YImzfb02hnVp>nC(avrXSkQ(JY-VIl&*Fa$_N??2WFeEU4j74y8A!iAYMU z2o)f$`G-60fSGT5a=7+&i$7kIi#7vF;)bp^qACW?q%@GFuJrZFAJA$ftkwSZ(+;Sc zm~!Z|C(Rj^qr(~$Cca;Hb)o!NOnz}Ww03dvUw=3KwOm%BgT6@So#`h6(8=)!r6X zo%+?YeG(?;LPey{s$wfVuXJ65aeXzmlt0Y+?=KVZEMXY4D+%=Idrsg@v$i%wCl4?h z!>GmGAnN7di@ML6T})iX(r|5^b3`yO2_Bs~W5as}4K>FHJq#F~{{&Y2Z+&YK4w=uw7rc~)B?j}A16~~URqa|2 z^jS6~`2#8BqhE^Ml*o&-QZA&BT*Y$WX+C=JV55XGG#c?1E-#+pYT#DE?BHyzkh%Bh z%fov9mn8T?JPuOb7wHQVy+Ne7o=$kJ1HUFDnMRzVtS>!v52Yi84wu%{bh+s!zm6{q ziuZPBgp+XI%I0cyz3-U-LCS8EclRHwDGpl=FCg1t>wqqMRvV@9N$cN@JpY3KYnH*N zBi9Lp;vE43+2y2)5~GTse^3$w^?uIC`3oisAJ@-hpE0|Vge#kg2^BZKv#xfsn|(LQ zZ++LUsas5Gg2r4Fzmk&FKi5DFxo_1hp9AoDRd$dPm!8q16R{*TryIU9t zmt$8L&xPX z`sR9=_Nn7m&9cV`#b|yj3SPE4j)AGgvKv^|@ z;ZS1NeI6a2S7JQbb&6Io&JS~bScRSJ6B~P_Su60SP_K38VOTe~F*<{0{$3vvcW$dV z-NO=H8-xC7nldtvidXc%M#~h7B&nd=0%EC5ZCH5t1Mfe?qyNhZO@iO<`ay~h+L=9V zOMw0PHZO3r!A;~30e)FFs=GH_cP+_oIw&rYP*hq6IUNyqxG#wQ1J3nLfZ+;24(DGU z!CzNho}M~L41+eKwL?s-5h9&-2pvKCJfk4+-XaaAw6$XEs48>+Cl61+$7I;zHx{) z$990j)A_|mQ+wNsdUrmwgADAazd^Wav?QS}wbOjQXN3#~ld>GzLCQ(yFfbWwR|UwQ z;U9@yrjk{hPv@Yey(UETweaoBhYscg3j)>k*@!SwB^X zZG>Z91M-F^oS0KxTMI>wh51}l9ylCI29N*w7<7x;WXzu<+V-_g)#MsCfU|=#zGZM1 zd5Qv&?auwrzz*+ixgs?btF(KeClkPupNUJPGfa{10zdFT*%j z_14Nee*dunawH{w+=W-+G^qwU_OBkkAf8A?l?6gw0;Dy3x(4MhY`V%MR{KOflIXU` zD&}W3A8zh{5h3in<(C%`K>h_^fr#^plPQ&yAK07Le-! zLR=qPlT2&+$(oUxWoY|<9iiXUYHzO?^F2X+iKM+7_yMF$j&Fjb5%$oA%}25!<1^+d zS97NsJz&4XW@hu7tCQONb!qFuXG;Qvh9qHFmXlfhYNcB%(`7{zE}+nlFl@_5k1dzy zw`wQKUb+ZcyIZQmMdgo$PN}yS7?H-CqEhRNFOoovTtw~`P_Z}6TkdazT8bkkk`q2u zWO;1tb=@h06f&h1t(xJum(9pAfAE@r0yVGDx5WIrj-8Xgxei@5H6_AR9i25ft~^1+^cP}D58(G8GFg7=Awt({9cAYsb+&dk(ld<7KPVyJPxiL3SB@;(SxDyM z|GiG}6^w;KKACNd>pal(w=w*(KjufN{WLZVswz8ehjAk}%uFX9230sQt6|(3a2`kB zO{Wl~(YqAtj)t8N;~T!bv!Brg?|`0f@CWWpLDv$wAlB<&OT|O-eJ{KFPhiI`+hlS0ZK8_j!<4h)$T8*mB*C-8=`l$ zsKib)VBDWI>FQ#%Dei5LF=CLX9KJ*M)Z*4tT?8nt7*`ZKUjR8~kl>2p5o z`0PC%%QVgZH-tXiKev%falITa+2o37IAu- z(zOI*yr1 z{@lEu=OMgck&iV!KK7PqTdzI-$N9lcoLA{b9U4M^2{5RaZlsNj)B$eSVLgQIB|ME_ z@7!D4{-)Vz!S|^yLH(+9U$9m2r#x(p%Rz_F@nRK&RG%pyFWa4)kxY*Qhr#bi?lvCM zqfBIflz;WGrL&os`FJyJN@0*Qho}hdV|HbH#;NT!eo32-+bTElZg8OqF&{HuuXdnk zGq4VuIVCg6utLQbhXA!4sZ;lR5GKwc)u=qm`ALV=9F(jBw?$E(`(r|Zq^KOKikrOl zJO8J#=Xil>V6L_}%5|DkuwC)-9O8TA__>qfw&x-oYjsNf=GUw=W&r@giBmF1g1D`1 zFa5qoeOR?p`tx?+FsSJ@dOY^X6-FTc{5c*D{93PcIEQr)5n0iG|23EJ&16LKPNS0N zm&D6wAtTaa@+)WWTs1Cp>O8VL2??B;e5qKb4Uuhx?JsJZT){e%v*Q_l*Kp`UGTkpA zBNL@lQ+tMr!{`-q*wbT)$J(Z4?*V6mj8>#{*Veg4jt~rfZyo91nOH=$_w=+ug48|*WKI}cw_uCfbO9? z_xYMfH?4}UESWi2GJ3`u`B+eoUBT;3>XsO(={qsUI9aw)zJj&J3|fjPh1jsvQD8WwYl+?K_GI`ab#rK%rafcTZt> zRP+qkXVPxNc<|?^i{Gj(X&0Vj+TV|Tn;xWYmxjw$)V0=C;cSxW!Gt5#`|42eusKLc z-uu0R)ASW}J_VASYuGE|LO2PMVcW44VvCup!>AW zPQ+8fto~qJevKp3KK6`K>mF(um#f+=Ul>h+2(`L+1wYcyl7yc{ROf08gx zmHF@hhJO#5(^e@bM!H6rT1C-l`rq}l)4jOgA4_;yKo@8UwZ7W zMvu4@V~_)7w81K4La6P8prgH@9W*HqZ*J-&(lOU_{Kmjga)abTS0+nOSbiF$hg@-b z+ajq6#0i+N!Y(H9iCO+8e=t`~P1>wI7o@Ip9CjdkaS7b}vN{Avl0aoT6=g_A9eu)C zXO>f)-rZlFQkJM{aqvDuI7pK(d}Y^cArF^||P*cE1(D9iutM<7B;ruiAXz z?tS!)Yr$)7;L>NKyFpt?WI;ueIZ}D5=B)moPj5Q~hAUkU#&=~aA)eliTFxw$%sN8P z8{j!LdKri6)&4u^YMWM7^}EPf7WoFkPDWxkioGh7axy4!%ES8g0OR%!Np>PoB=z=M=G`&8rzrMV)F-6__SPfGytls9-GeXV2mZJC=$Pch~!uT#{!;P|zffcqKryjC;+V{ONwz(#V z+D{3lk5wQ9KkR1-FmdP)(eowg!0(%ywA2s<+5ZBY*`cr^s?{`h3#tLb-9~5WDRq8T z4%IORH3ps+>B;<^ziV=UWq>>n!URoz2i{EwISCsD;3ms$f8=Oq!q!ew7@5fSDCrot zDVZ7a+c$~vOEVQ82dxhhggJ8!f)JJv zc*Vu>N>)UO)YSc)I_AJ(1~f8#4eBg!D%(5|Hb3AngY2KA->W(uwfTMIILr{l`!=fc zGm%|L`72l3aLHU4?1S7KgP7YL2L~G@;oK%wDp|WU;TbWtfpB^g`lNW6zLD;{@(aI} z>mpbry4(}(0;Hh77Wei?{D#$lA~lA8m!TA##+~$M^q(>8?Ckzf-o*o+5u+GBYVeXy#oQ7||SJ zBidI5eRZPVrGaq|=B`r-EQD3)`d!T%i*tcS~X!qcX(vlZJwdeir% z^njk0wwqe%cJo{1+;_BXFP=8~9vp&$dpCF5V>66cIg0Kgk!NoMwp69-M^lF$yBi*9 zzzh{?dnoZXXIG+-O70&swTs>_t}*1GF_uixgY%QwL@te)uo_lgP+RZ25c4Qj349F= zndI0KQ6fw%4Jlfu%LiYJ!9EBtzi@5TfUS|_5pg5%pC_d3!g-O9)Z8 zbyJ0zzWxX05q{*0?82)4 zqdn2xY+;lNQQLhA-vo>(-KU?quycthYfVQ-E^f9TZO#C2f{Kq~ze-0C#3h`+p;=bkh0;deP-eYSK2ZH@womfP z#`A*H=(o?GlvLsF_(44T!UcfyVS0yw|5W9^Z&|oq=<`kqA~#P@n;VSgzHS;B#U@BN zS$ick!Ei5h!oY(v4<}l)6bM?-q@L*h`Ani9nAu^~WH>Ku<<4fR4$(&>y7u@kx$>%i z_z2GXah#y(AL{O{nu&EamL^jAB|@oVmq1@PZ0mYk>E%;Mv2c6-Dp48A@SQ_db_$2~ zl8giWEf*(Z?FKPjZp7-#(}O^f57=61AsoQ_)jx&UO)Zt|i_t&44sG4s{)sMjr6*+d zEGmPKYvslP2Z;e}(6E-bX=>Yf6mCddSvUZbp5hL+7mP)CM__W-U#yp9#yyir@pn{*T-gv`D(9w0 zq6P*)%vpxYI67sfh9zW#$PT(>7^aLrUGZnZ*;fnA?2lw{c$e!R;)P=JqLJov0FmN* zzR%z1qJ&1r5=uPs()J(qg%S~_5L<-BnogBneUfUP!avXRcz9m2;MliHI&9zBuawLF z!SdYCsYm2VR1fL3DQ(247|A+P3!euULxQI;E=p{EhXJ8oxhF*V)0HY%zCY0DMbCtF zA2cl-Erj6pooyGRJR^MR&+<}v*S!sWvN8g_$6gOYMZ9Q>0zFu{+4SFy2YM+?eCawE z2*Z+AF4Rk^-Ye#?#W~AZ;HoCOMbS~3u zTmHg^DskgIcu`V{L63lv`T)Nfi*pM4i~Jp1OcCgRPEQjK(F*Tj-T(ak(>koh^$u0HxSlzjOLoUsk0~1g}LC5L<)7&?h@G4$}eA00Ys?0g0WAFdF z#ijLcvFzC@49_ZJP)AAI8BmA~Tco;%X9;yAx;<8}d99o(PU)N`P4}?4M?5_y`lM}| z&_<1*SgB*cL%cf7wVCZph(KHgAA3i!&yvH5eNUmv?P`|d9<;Ehe?_;-{m!i%Bf2;j~GK8m^-l3ZJn$mZQ-Z# zl2zV{=n|#N3Yqlr=*$!QpLD?aJ18Zw>|HnUbT-R4Vf+cLeFu60FT05w5KTRbKWJYt zvi}JU`970wR!Z|pg5&hJDrtCe030*DMz)Yy@}IP@GA)4?UDIm9VpM;sS@pU*BZa>& z9=6SuJq{zy?cIM#9bOAOO647;m#c>($TpC9U+BV%n6VIv;g-uSC(NY`mXAFHAA8<% zc^N)tMLkQ`w5@?ghkFdMK31D^NPm2V0FIAC455jERZn`a-m{X4w5MnI>Z$UeEcPeAy+jQZOa9bjeWPa}+9j)ku5BrtmHaE% z;PA(d{$l=39O2ObXr#KKWin~xZfE&MbklFyGXo1FGLp}s`h08ByOy+RGQ1bPEK~c( z>na8Lc+)_kl;Ya#!A_WoQNaxN?>C2m0j<>*tapr-q4XD}9;f3(y+fi7YMp|elS|lw z?#&ne_WU%>4Kr&i{~aZgG`u*-odD!)#Eq!Y4;DtGq2WgS4&%{Bz#ZS#Bd%Eff_Fm1 z+t2kLXAtTBKwyAmU zFLvrlZ&(C@kiAXbRJg)$Z4IRQkHIUMQ_u9(G;Jq_2l(|g!UGxF2uCgT z(uRgGrU&$Kv&E5Rm?sG+(l>!)H668*j{TD*BeGM|{GX(@z&L*>y*B8R-7H6UF6)OKOyvW^Zdr+LF?ivBNDtisU&i0yB!o-S!HwyU{q$({Qf zGzV#VmUQxcAh#zE32P5@#YUTZBGoSruu587286m@b*MU#PW>ukCS-X`={sa)?qNmJ zrK%bquZM#cSY69l`lHB0>!*;TyimpKahuokjm@TYixuKd-q&(PB>Ud-Wt_0~4;_f9 zMj5%Q?4<$KwBpyw!qZ?|(ru`6@$vC6jGhA8%uh5}fPGM}mr%RAz{|)G@PU~Z#;I3Q zeNOg56qVbhRN!7=xOL5-ZS>`xDY3ulysrwZ=KWLqAGqz9@;t>>4j~pA{t-#P8bsFn zheH;o^`CD?+u6z7Jg57OfQb$W1@+~t}q?SSc{QX$DgEu|hxBlIB-X#`yr6s~d1v}v{ z!=LFh@L|pTxxj4S^b5Hn!0u!c{o7RX^h3R7kq+L!^zY4r7)43RwNIpl1Dq*>e>{HC>4M42k9+cgpQY9wl&}Zx>ojuZ zT5_0iWQAa6P<)zZI$UF994gcOwv0+9xWg^#Nol0v&n7~&=X~9QW*}}7*%1Ht>@X1d zLmd*6IiNg<_PKuk$hmCdw!DTUs9OcF4@-bpc{cUA{iZrr$a+3-j*e-Gg`wAXkY#3g@ z4vKZj2x!4hOQXB$=cC0!qQIbCZoHJ_8SdWsRe4s0dvX!wFId2k~=uW5c#Lg2VdfUQ2DRo;@V8 zI2-xNm!>Pc-wk4Q4EgKihT__scZ?sfkWw{cA_W##;~hLcEMiNM#*Ii9C>p+zcZy0i_jCqMR)HuCVqWX0VBKx=+ z%PjGfX7vPG`N#l~2x84Ft4F8OA{Dzf0SDVU%}=jQVuuDx_7!Cdr&hoDs&dIDjAc=K$4$2_^% z_cH$S6P$$wSW#K6y<45u()!5LYN$#b1I$tj$(X1RvXTcXvMCZ3*5uKV_b!B^Jo8>T<6iQ>|XCMShOtw36Ny00zGb}Elf|JvBlHO_|a{eLC7ykq= zJqZW;l+%rVF{77e9raiyL}8B*HJmiEKxtr28U@Aqo8#fhBMb$Ua&EON!tqpWGgJBb zd1eVU58PPqQHXD{dq@w@GYHDS$=P;jy_M7ocXVE9l83m23blt54GeU7{I#Sclm=ar z8*W~IK+_xdK2x1B*+QVm`MA~ekDTAgyh_RFw+P%8 zzu7#MRiNggk8*H5x$3%d&^Ngs1wXq^7X2)6Q?86^o?8~S_;L7vWB|@thn;)a8@-3b z`*R-?3C1m|HubB{oMoD5bDpj~JN%~Bi+PU1xM`POw9pmxTMr$AaL%e?zQEr^jDm1l>q0wNnL^osOBl z*8vl2`Ttl_sAXWMc(%swv>o#3ctmBop$at@V3}Q%Iz2FrEp<`gUkc2}pYxunw2ECX z6z|>uNpX2YNiW}??gSHN@+_S)v_Fp{ag5JOgt_i6G|dh{GUq)K_muhNCAD%ZzoE`g z{?`W{Kw6e+=53i~$v=9JWe>%9 z4n=gs=`K1C4z<-%ylS^&zLGP1zCn|@?_C)P*PWcO2?1`gHSBmPsZO~#XgEsvB#uu6 zJ-GZnKTNnA2>Jv5Y)ky8f4wBe4IC?{P;S#a^&bk2e^p>!SACimoPC+Xo5~|zdfi`i z+IeweDOCvxgy;Rto>0YJ)AfCb>d$Z0R2-vIs+zI<`R{x^d<$S=NfJ3AHWne2poctY+2lbEs#Sq_=sRzi0Sv%ftN^bkrVRP!_h~7BR@x za=QnAxbX&=FzLUJruAON{fH^kmY@WPe*2nzS2oehL<6uFJW7SEh~2uRSGB!RTJ@fP z*$2Py%bPOVQvr}auZiHg80kBeY_lW^NU;dzqGrr;&NdK2T%Dd3?A#cvATAeyMI2ee zz7U1(4x@vOFPtg#-8Boy)4Opz*NN41;7Rjhn`Y@e?dvytX-Imw`HsK#gJV{PD7C*6 z*>i+h!CA;UhO79RCvqOJx41PW@RYBxJt5y!ChhGo+vYZOi{57m71A+fq|*3zk_mZz%-^0FE~76hU{RikPC|SRSs%~1Fl8t-pK(48kh-XE zi@xBVXnd*+(YML6DVLP%t$+JNZMRn)IS!ZRZTwhROJ_-)AM)kqZA{3e*T@cYmKRxA zbGtS!mGBVe7rf~3oqnbr45$Ed{K@2&|(uwslXpU~2DvY9~V55hol; zb7!K3rZ?vhN8>2zxu_S^j~S|Ov=NxaQe@Y0MaLEyABum*K)flk>@NO++g=XW^y<;- z%lz*{N@=$`@4<>)w&EbJzhd}j=uwAE{^dRe#^{ehd4M0wge>{*EuXn>0$3%LI+AMd z&=W1=yZ)XXW9SfUSp!nAm?%kxlLb0OgKwhN@zIe-%T+(m0AWg&|50hecb(*KCPjgt z=j%$MQtK_MCB_f1gb6dC=x^RUoQR1E^4>3RyTp!Sr9Cy76|D0Y{)TS3;fR&jkLlhgGo$C$}e0%Dh$Zl2O|=goVKF84}L zf6Z!)oDo%a)%pHt##8s@6AInqsZZx4*Fk{8aYS`pbt z`xMiceRi6 zPD6dm=P_QX@|@BA3n_Tb@=m!LDt0-E5LkY-BG7Tc<<+}VX86#f=~6uMl}R5@iFz5y zMb&AA4sm=@E9ROG3-C^vHvrOMd6Hsw+!$bOp&`Z0>=?(#gXO?h*$YP%;6=WXyb{+H z4RCenIeKII6DE6FUIlNa4r$h?J9om#i2@KV2u&4bK<7ibhIhV5lCPyvk-B`I?AUe0 zI3#ZfdX!t&7kvzMX~D=yQ~&a)YfYNh$+2>m@4XYbd3+uA)7jr~ve{&=p==Wq6pan) zM(ph{TbFyf7>C+G-M?j*D<6B}u27CsfU-`AvLYIfvma+fC`iFWUgG-u@apc)#pd(y zxov1XKj5!EEAqvJXH?OUlj66-j|x+J;VluR{^4yu^g=DP=KxAqMkqJ(%$V$E{&sEu zG;yfUG*!s;P&BQi(x)FGr|J%Dmf7=f_=g!{%h*$)>9@c1RX4ZK^}f8!GJhTwtg*pp+pVR#QpF#p9AZm+zn?$m!VoRrwJ zTalL3OW^=X|F`nsz7VgB?cb61i7;Q@HuLh^VS9e_e&VF`A8h{3rg4+!1yzxs(ryl zB-5y=JQ4KU_#XUKr%w$wE)e@hMAA5;Z`VN%r9uG{CCc}XuMfcS1IKowwZhz%+`2PU z^jjYLq2jo_wowQjx(>^rKxaye3?W6(6!7(Uz(SuD3+V6G?kgMGP54R8o;0XT*5!V? zY--<*G_AAJr6&W*AuKzlXNEyZ?v?pmc)=SyPUFF%Ce)b)nLKN?g z??Z=)B+=0lcFY&s$Ed$z#sKRj9jdr}&%ZThCf(4V$0%>hQ;g70{xu^5GFjG#HaBZ*b6kUL9nzG~ zBu@!%YBgmRg~xB`Cge-cZz9YpSuWu@rW1NavE|SkNx*A%hlWsgjS$PI7|qC3y)taT zo>!e@=4ooweWSMLkgQN=gz>#RqPClsto5?Ajqkn9qnQUlE0IIienQj8vNzvXb>S%) z3xJDO!5fx@1wT91u4rHODASo&qoRMlMd>D zVOr>E)A3E&E_pMYjuynHv80P=7ui@HhFlM^wDCA2>ZVai?%U1q%kLE@l@W(fosd*o zwwn%TwbJ-zf9X=f(e*M}tM-<7HK9=4+Fd2Vlqrj3C?jRSx?_DwN1jggI)5=_)4b~+ zKY~<0Y1+D2v=eZ6<8~syb9U0$8a4G+k6B&Pu4qmz>m&B*IEwt5U5$DazJ@aNs%^z+ zs?Z^r=PrnUzbd>c>A6WM^v`+mxfjMPfxQ?;c0w0jUTc$+p4Tm`s3v}l;@s~b=gvcu zCkx@M3#08`BL$jBjEFYYS|`!N`X6NbhxLT(hgZL=-5Y|K+)DWsxe15i8sC(p(#h0X zz0`1S+51jU@x*P8KhX`6O6X^`4VH7er%~fB$jyKY`74|KY#i87N8*mwLWvdP7lfk) zN|5-8EO(hrJ=3hIL4zUWl!n(sl!8hJB6%%)Fezba#wiwSe?7)gMOvm$^M6y}Hb~cPz3`D3+ z(`ya?2KEqy5IA?*h4DAgUoEcE_J_ukc~mvQK1Apn`aV)&mGGgjsTrsz=2)UEE}%>5+IMfUXy>5eqf*9(f&{iRp@qWXS;_+m77Ynbg9 z-y1G8WX}5(!e+O^j86kW(*8Z*Ly39OuUR1SK&D$BEpD}+A_I2!W&T~_iLZyAL-iGY zI@!Aa?<3iSw}bb4S(>NAuq`0+qrWupC6C4LxofKwY8asImlF?>B78xh_tg^hF6TROHe#nDk9(lwnH! zxoMmi7yObSF}-Z*Q(Lz3K#+isIi+06srom3SQp4oZ!dVq*WfY}^c}T+CufV&LC=pF%}0p4&|S`)W*l{Tyg@s^(s~)9zZ`^)PGLa^GOz*Q0#JgmPc=#xZiLI zx#gQL7WnyAg(-*?FK(vx*6|)O8;>e4FguujX#lm3O!N;V zbS+>TI+6NPE7^@IPaoNj2M4{$+(AVsWdQiS411Gnn!ES0SlLHIRF`Tys@|EDIfAAJ zG52B})tYL(=$-QiRX%4UPkeIB4nZ(fv`{@! zrNdx}0O^Ipz_Y#h(P!#%e0N^K;JZ3*BhGU%xQk)4-|)hl{!yy#jIs``eDTat8d-i3 zZ5#t>w7O;`BLfgGtxnfNnwmWeU{PB?w{Fn#23e%(ugku;ylHfb^P;`hl15WL&fwt- zR8^Flo!`kML(>xC^t@jS!EQ#DW_^q)g<_X;(#l@7yI(q*LQH~l2%_0gP9f}k?V+GJ)(6-i|c7_9IkDMcMfvCl1)F|U`Wg*uhba5 z^i(I{3-*hj%OA%b*8fk~XzU~FTbOSTnD+uaNlT&dV!ecm-?_`!XStx=K}J%rGGx}< z7x7&B#~)E**c#&^k+FE&Dt_Zj!MP-sj5XRx;JcO_gRI$8Q z-vhCYA&3$Ro0`7khW29qb_WhQfK1iMcCsh|k8% zk-B}C2oloWaBIm!JxzP3*ixls+crVE`O{y+huRP7kH>qBpY-;dVVNtQ&^X+J#ol)w z^o)6k4A-ITIzyMUP@p9}7*ay?C!_mt6aV*Uj$LzBGtH6UnAi^O_q zeUUJ!7V(zju7lbkIHOeyJ;UuvK?&Xe(!zP?+t}rE+Fi16Rj8Hx5Q8`YQQOPp^gh@_ zWlq;y=*uHqBk|d*))r*f{TwlQtr((*?3W93_q%G3k|D_VzOsc*!UVJUXi4nQx$K7* zJ6(Gm|5_8l)l4WUbqL12^!Zj$G?V&;_k8B-!L$SwVIeu6u{2@8gNzN9w?OMoH%Qi} zcBOb#-w`~eI=t$q%*oGZaDK%hf_Z~}R510c2CAK#*V;|Etf(^r8T zCk4OFjsob#SHQVDehH_##-!53uFIR}tHANK&u$Zcmk9BWrl`j9 zd8rE)@e{R|BFVNoWMSC!Ny)p6c^-dOR&FA?6t!87`^vN|NnuJ?!)Nscm*ezsnM;HS zE*pV^Ag7NdX{Y*a5>q%=Al*Ucv8$Z52C~L9v#uBc|8ST<=;80NaOYt)@+Tv$H)+B& ziV`$`F(}P$6b&0>H}ra!75T+4$}&jfme(Nc)cDB_*&D8 zpf8u%Ax%;%Rx15%~LEN4)MZh0RZXZ>7wU-6T_5J;JJ zzk5c6f9ldO0C>DdgVhLEi*H4mj3D39Z#ZN6yT*=O36{tnCFi%tGym#}*qv0ZUqJL% z)K2=>`k9-~a|a-YwJR~VewcM6xcl)eP7p{KJ0I>HZe- zEUG0*eN@pFyBA1QHxO49wn}?a3H#vFDX^oxktNE`5W@sg(HvJXJnxzGo%}cA0$({1 zIGQp?vc6Y&T%I0A?w>vkMe5IN!U`6iAoBo8h{sjvgB{$(xXKC3usqM z{b!+6&cS_NnyvlUMx_Bal;|2p!!gScE_+h5UHFec$9AMyf7@5${LIu<03+Sgjsh~9 zD9_e(!BA_5#<>Anhh@G~3nT_4R?B?_BW>oFC%a=fzGC=*{+XLk_lOZx$UHkzVyV`8 z*Yp(!l;2U=uOeSTSwNEJ4vyF6mHaW_uOugq>f=253}W0A$poX*Y%W|v%-ru@$aLIk zJIY5=JeWjsS8W%SWub#v>_LyES#=kM_v}ASwvZo~ZZh(pG~sdrf`4Ht_!Gi$n@_y! zx&G7Cs$X*X6Yzoc1*i{Dh9|dnhrrNaj}4Ngo;<3HoS&HY>MXCV=TP1&Y%ouWdcab< z7}`VkI-M1gM8(ma?X|5Eu0}qHQTLJih0u|~z!ME|#pMySnzT>Vtsl<0(q>AHWzGfX zrP?RAqk8KBb&sKE5WezEMf3Dvdn|8Kd6y-AsJBpqtF$~H>C#wD(azk~=>FXT%pgTH zru^^5L7b^nX2R3a%?RE{-mDQke7^zko;H_lCFv=1NO))6efMIl|5Xp*Gje|>3IqdmEO#%ou;4BGBu@rWGIVYw31*v0+O z>cA8*sQ0$}Tm6x0vQWB-VTf9#mA8FI48#en6U3ag<`1RH#%}|l6$aY;>FaMNzhiuv z<98ZPbO0qM@8>$n{vvA$6a*=E%#gdXBb~EsCX_NnhbBW4(44n~>wZW2u2jZf$XTfT z=9aTs*a`J)`P9C>CcK^|t1CuxZ_0W$c5RRjcqr9e`AFc9lsY5p$jPj!q5Z)mzc<`` z?{p(^F`7p*RIGHppMFA2>u05D4i)V{erDdry|3GL$;tlW1dP)hFHGi*Oj&)d)|zoG z*trkuCkr{>f}e+*yKf38+Gv^s@4go}*-{$w?z|4Iv(ZmOv1Es^I9d0{Azj%h?PxO; z@jx)_D?x1(utxT7et12!?DPICTJaT}*x1moTds|Iyj>v}FATBP#X79)yHi-P^fpYi{|EpJt#&eLt({ z(6SF45)+#CO)YIj3!Jd4d#tRxsLsC{YW_-0KE?)bMM1r6$n?j&7Y7CA*|YK;{4KrR zWjD~d^U=(?k5LBy5Tq*Ldo1J2)9Dq8C6DN8expah|IRxdBIq>?F!BrIVeBXAFZuAA zcYvkv!4BoV$xEf1o0UgP=}|##_tn_S8Y{zrvlwt%dTduc5nr2HSu6`+oS7^6+0Ie>mkQ;~_ zdY7uWUXPN+v|@SdX(`KgosxjlI`XxT=dVS2}XsU zUZbKmpf8_7dn2kOWr|bt)W-C%&3;;Ladu6=zodl_AdH=ADYLRtT8ieNa z>s!<-#DzZGo^u`u!JGk*X7Swq>D=r0X5yJWTit)E`10*f{>F~Hh_c=rZijnE%)XTq zVzzPHu>==;s(q5*${^L z;`lCAP*L~cmm^6~f8uH0u!zw5JDvIzAht~|)#i3LwdJ6%%D&s&*cCWfApdm@wLtgB z)QOMYu>P?kp#BSLu$33NO218~Gkw77X>$8BY@G6gjqwI+0?yA#$z91#FfO1snJ*~(SPEtFMciDR@B4h$|x?Am(gtPm| z`lMEIwrz4m^{jxyU!x7qCRi5r0V7u^roV_d!~_qMe!cS=T<7Jh)xJr38_l}>kZ#d3 zuasS~hhijO{exw^VnOU<6jfsPou3#Oo_&eOB~N(Ky225Ok$C>UHGoFaFVb)l&-puc z=g?u}Ib!hFrY;`pBOOg~Tq)6aBpnC4rYrg?x@Lf-tKM|Oz?X5*NiEA8=G`E(jaG2c^7WjOJ$Qe6YlkW^jPt_Tu(f9R#s8UOO76{H{5Nxl6#m;vreMzi zHD5O1djX8U-aCKd2)8F_o@pf~!H@8t5M>B%gIfLk4_s+(%8?h4%)Q1Ow7e@j4J{{z@hb0{TG|*=~{nk1D3mk57V6~KFd3-sKh)m0gZ8b(F(_BvGbr|#1oW8S*!uEqb$_<%o_NP`6gQ2R z@HkoQBs&T|qr7(gEdX8H-_jBE$iS&-p;FVBGJ7bLL5&#YBwe zRD{OzqvOmY>3GI;a3yg??{N$TtkFKb4XdBVNR+S>Od8$H zB4Xo~dkFH=A(QXa73pZiHht~;ijCF&s3q!Gd-SFavq)7K!qKYLVh(CkDIL9CqEB<| zr_l<{weGbwdnIAJ*+RHqK&SAK@KF3|-L*3G)^f-*9Z3+)Y6O4W4WDQ5g!48*xGQd; zuNqgoV*kv64_#qZOFCU+v%pYOqzvc0#3~utD@m_R#F@PDQDXj@-IP3EXbbjKVJ+zZ z9n+l04ulVYiXD^Ppx~2modk|GhL3q|NT84V_A)~z24p{V!MW~M5jUR95~l7(TwmQ` zFn#@2qgq_Pl}sQmD4#i{ww4^}4sMtwfVg<#_w@$Y6;@_j0~v|0@a47DFI)g0gQj%; zCd1vPV6j4`e%#8b2e|8Ar>Wb(9Funk0$U}}Kf#RGp^RT_99|_D4`94iE8<bli)P1p?~^-Uf@Zt8Nh?rien zB*R(2FCkX?%t#m=1;vgRgv*ve*=tN1vqj-swX zc_Tt=y5MK&D{z_o?@a=>0-Skt{=x9w#9By+R5Yv4v$cC#Xj*e4u^>_)sDJ6pv?w(Z zgMkT*__xS_+6g<>5^}1BGPFhjK-R+X6ZYlMic;BSib{>kXwJ{g(0U(SUL}2iw-kMk z69PpBlv@BKqlz^^%b!i9JZ*zlmprn%BEOyptKur)2?;CY~&G)i@58#nEx( zmT$ZE$QLQI%jUXxENu9M96lMGH2s?lXmRdLlDgM2MO?SX8_`jzgX4 zKCvA>x7F4vdWpm#tTpld#)DJu)Pc}Elscmm^|7vLUlc#9x5*kew+}!pA5=tjKhaRL zF!x~_-#Ki$)+fa164fEuPpR#cUGAzEgLA719pi+Zh$>O}g;HmjQFeb5R%r9kU?0z- zfCBc(PL2FEaT*g@PC8amimPc_(>gG4NVJm0K*XbNhuK0cK(x?Xo3C=}O{5-j4U3pj zncuBxgBUip06SwXOX5^sP8MJU|GSADW7@}45!(^*oe= zuTmO*TOr^u#y@XyMH@!->c1r4SV|itO$~ zqVAzEX#w{lG8!|xgfA?naNtp=cp>jKA6`_?pVUfHqXf7;a(SxP>z!__Xu?DeFm@ZX zpp4^Q0@XFUug1;Zz%0oS`dWYI?2_n$y7bKD7Xe`3-UNCev^zUdl%HA~d@m5B{;=R!dIIX2G{%cD{9D5>{9=-0W=M}9E= zw_RAX0kUGo{VoMeX&$ICkJe`hj#iZlhzva?z`DmIQ>&I)8%C%8HXCvN3=UuYvzO>ba35oI;r^1l}btj}zUx3>r2=oL={nSBa z*T@%@$Iqs{wr9z!&*&-LUL=aEfXg3o^jP?ff_rHq6TXUb9_#;Y5R`DqLgBp$(k6-B zs6pdpBDU71mE$WODiMP;W}T&eE&ii}-oiQm>27smjD0WwDcu|!*i>QP%~cgAkhjP} zy3|h+rF?FQfw^F8x8mBI7GMj!;zTRzinXK>te5!~ylgq3xeUlHC{Cu;Cq{nEyX>!A zGcyuD!tqdyogYXNIFYQtRgWKwBLbOmm_>+2> zsYoeap?U&9MfZC(O{}MuN?dS`Uu@Dbg6@h|av0U|Quv0*wt!Nn8IEIe zGR&T@l6_v<-&K~hL(O0Ok@Taz><5vH(0eUP_vgaOI+Z28glE;YpN&%aZmJdJJ9m4* z7#}|j=dDUaew_McN0msUU5;5*jxnuYDkEPw9NZ9#Cv!t*ZAP0p^wXiC74TmK zYXst3R^}vJSZ1G6t&`)C!iBZ0C0n2As94Tftmi^<{}Z9sD&nd15q`%yDwL^OPfzaP znKKHCUh^aA^i42=h(I^1ziUeh1D(?sP5uW+kb!VBtmf7|U< zh_B#I<$50Q*%2}lB;$m<){P(*>khN{{k8;C|LnMGa#r6)PQ%CFjEr&H6PBI#;_9Tl z#^f2xD?5Mn6d*@^>Vw5%ND}!@((@gpKdZ9NrjK%@>$NLC-vMzlTLOufm&~daHr><3 zM8oSN9*S>X5hh;)okSFI0+)WnNBr%-5}8N+Q6rPASt+figSTf69iI*}1Trl)K(U=Tnv1uqJCGXsYWJ z?{&y$cM9(5vE%B2>|P0${Cq-<|7TL0p}V)(-n7zwJ2k1ffqID*4I)wWPeO?@^+f?` zBc}kL79ldTBw_t%!5dRS*(-EXBZp%6v);O(OCEX@etAcU4jaBvzZ3TwCXyQZhB$Xz zCWEL3(l*8T?y2ls1D&)GC;Ea3QI79377M)N>c^D7(b0h(h<``*>61VfOr? z9^6P1sI4T;`x9_DOiMA7Rtei43RX_`!7_<%pAOO8tz|zK;bu&ABL+vtI}-TIP&ExB zPSID0 zE1F1R0=TWq1T|MjMOznPZ818-k#?-KqfC_%Ez`!DZ=9O=?fQG%oAt3Nb7wb3|r_Aqyd`>`v z;Ym9b-Yzv)MTIr|pxLPaK$L13xt@!7`Z_8*G(E z4z_m{KSj!~)yfpk{mBo}Hp$pK(c|}~>TB-L5502YInq#{5IP;RHaX$jc;sLW=Cjxf zw}^_qOujiJZz>pI_d9(Vb9yv=n(3^{c7OwC?cL=z{1DL9=|8q5Xq?M@gc_!xEOAHz zdEDkj+=RGA$1@m++x-x!PS((y?IM%ccQ=$D`@HbrSbG@GeAW;h&3b~=s=@HV6@Y$l z>PAVBVIlIBv>s0F`Sm?TU!F23)<>&rpfgv5ZXqalX_SZh3-l6JRprFvc@P@=B(T_& z%Z#uV&xlX6=6?ZG$Q>J`xZ@8Z5K$9d$LUz0DIFL z!I;Me3+Kq%1Dl#P5qO@jeS8M~jYnKv_0So&eT^MB)q@h3yc<{_LX_{(YMi_#V`=sI zyMqAHJ8%x`DR18c79Y5RmoTlt-5M2npgwjIFEDcOTE&`cwLenZ(Ti#qE=-MXh3y3# z(r?|aP`0X8=4=X1l2!XVrD}IxUFfU)E5d$ay8it)8wzI{=EM+QeMnf5Z0vRb+pL?}Z4`g-L{aS(o*|@g06J59!|+^hMs?axE9SsV4r(#z&bc>n2U@pr zeRj8gn>w?ds-{M;wgo*)piK3l4&q9@M{YT9^%HIWIIS)MUHH!{C)yG)2Rw}b{XP5_ z!tWz82Liu?l0oaTTs%a-Vumx$CkBQElC-t&VVB4cHSP|{-aj@idl=IC*Q6nz7s+(e zTkgS$xK%kw{|*73P&$eY0P|08--U>|xi*=aKsoFdN=~X4)r1`nZYR$QtE6k_5)aL8 zd&KQY?WLd>8Azow++t$YO>2#zqVS{#YknC`Re7J z2ygdXHh(F>54gfst;b$yAdZQWUp%oLJXIgt9lU@%g8cZqo*Vy-|Bk&~75>hs)!WVs zCe$bEE5YBCC**c~D{kjrC5;LWl1co&b7jkLm4xlNx1AI_wIuB$rEdnZ@h6-{{~guL z+F@pnpoY@!cSaVvR$IcBw3L-L&Mof!_U`u4bhu+5mH5ZYjr{0!dlf}@L)&)=&LfyE zxID{`;j$EC>vrL#K;FznKmC=VzC!AniPWuA>o}oZg`9CYwDT^$2q^kNl2iXW|CBx8 z1KDtoiJ}z62B5bmC%oY>(y0TrgAx*+Jas5z4??75UTWxS#ZUGW3(%gjW!67^DC}CO zf?BGhpK;WIJ{WRyn`t($}_bbPK0T?m2KUbHbu0^Y)smzeE@JXiqtAcE$ z4+EZ=U!AG{QW*Vod7D>_z|#i?KS><15jGAa0#(!XE`R+>H_L{s#6WWL~f zw6JQT^{-KKjJdFetW_7GLuCi;PB@`fQt@&xTdD*lJdn8b2HnpI&RL%kP4bFj`15C=kp|1ggE>Y*lqy z$?aR&1v?kW5vEkEY!+rWLQ?qf>_tS;q;BWDics zfQXcN_q(&oMMJja)b`41{ZE55un8=Dne_VzlG`@(KQqNwP?TtZY+3@lRg{jg$Gt1ZR zEVv~+__#+LCGt}pMY`X*+w6}$At1j_J{=7kIjmCYb9dkh9e)Tb5^IZ7I}AKK+8R8q zDLbbr6su1iv~e|Kr7`}GKvz#MkRUna85CIGT^}rov7l35Ijv@c5g?|P&z$)kJD_F; z$_gz7bLu9ruE_Q42UY_*v!ph@KBVoacR`{0n51|ZWIujr{pHc5-(UVC_>@m_Lf?2NjY6^Dmz>=N;Nt2+h03i1#s1buzfS+2BVA?xL7a z%+p%expJMrV(z0HRFtTHJPKL9BlAN8x)AkWnj-i;Ijv+gC7MYD_Um86CsMf zLA@c(JuI75+slD;o(dnntxgr4iBoz-)_xYPGw6e{qxIhlzG%6HfdaCJLSy`$iPv`K zrq!>#;ahhWfHXXNXX7z4NJ8ENnTI-jsv6Nhg-)l~&RTg~YXsz&OE^NjCJ6?rxXM3) z*RG9r4R*{jl}L~tiB%b*5y|y`7Pw`*f>k!v)5`V770WdRL4J9?8t82?m=eV5~LmxMSAAERzt+(=!Du+xy?j*8M|9+GV8&%EBP=uawAV zwm_VJdX|8MZMK|G-ix3?g0ZSPjO|hLX58FD=MFZl5Jx57E2b~TATDlt7<)K9J4hfYu|J(jOjC zcL!>A%Ax}n=vHd&1rLb6Q2mxPh}SuD$M(r{xp&=vCVR#PAuSCr341Q`l(}`@H!5pO zmw2-}CFr>2RcXaeB*2&rYgMm+onpj<_legUWsRQe$*#$BB5%o_+J)-U+nB54N9;x$ zrg-#}_sYeAHd1%l2`E=R_5P}^tXk;`#(gM9NF%d`PNI}i5Y_p}-In4?FrNGx1;#;D zk>4)B0PHvj5M@<}89Ck+_zoWs!>q)4Z!psSIqF|s$6W`tkc=M zz>^e{a$}$kFi=OEHFDjyLM|ps({a73mps6q;XaN$`HM8q<~M9LpZ3^F*@`wt2Fe_j zm8~jupx{`e_=6ICjv;IC#q#GW<{q_roJcPgoHahKj=LH5BBT>_*mywpId_hFQE|g^pAorygfn9;-*!GfE`-*f( zkzBwb$L(1HYzlK5>(Z=oV%JhqyFfjc=SkoGQ=c3YqzV3*5`;NIY=MALGMKk>FS~_^ zc8blCsc=`}J3=@VtheD6%uB)S5pYIXI&}u->aFs8?(}asD?VDdUzes_sv}#<0}tH= zKLSsWZc#6Ts=rIBRx6i5@%Pp4f_pD6a6m}%z#*evL^$UOPURZRql3tOSXe9l%&oHM zV_0aF^bPFeAf){zyhseey(D&?eg-#|G?6yubK>mA^{<_wpu?AX=*^z1#=&rIhU*ff zW72ZeY_Yg(4ABlnl37pX;PM+X0(*k#RO#YZv{Wq@aO1+BdAS5;>e&&Mnz%yr?}%3? zVT6^5_OUrGU{SxU0NrApp6~P2EzCpzKSSy8+6$#w!@J$qkNQroYoFLnzBr2SH3O#XV#JDnSGiF%5i* zTIT3I^3KyxzGTjCap)aI?4UdXiOK9fCUq`RpuhY0h3|l$T$DlusNAjdAO)Twim1ge zQO}JoYgo&fys<+STFFO3UJ{^cl$)ul;taj->;fsHmhR`>-{tO#4OO6=Dd@$D;7bkY zj@aF@qj_RxK2`mS5iP1{D$7BO%K(I)8E?GZMD$>GXb+k57AWPe?8zJePX_S{?sByK z!$+X-R`BFI<@u1g*c}sXE6r1yyij{xyZ#|-0}2W@Sv3*qB@|SsqL2!@zWVDG74rsp zH*Rj+m+VQjbLFES5{~gVHBO)N=b6eMYcsvHrXgSP2GnC!sqMrSv2s zqkFp{#tIa?Z`Nj#0J;VojB2M#9sw%4Ui1=l%k6RZwfi%+Bif^Yf*>@vOY{AR_jBGq zTp<8HK*VI?g8U>P&H=wi4)~~7hCyIf4`c2{4LXaIE&ByWI0}P900_%>v?Rue&gi@Dye}ZaGvk zULNF&->=yn3>a(j+LPnZlCO;(TdVt63mfzG;w4yVKNknPyqv+cT8(%YBCMz#sQl*G z`(or5aigg&V94;{m#R))nzcX{EA*OoR}>F;gcyK`&>yKOstKzs%|{=0@A?(#31Poq{0*k}Gz_ znOW{`>J!I$*0|Zn9M|fi+eYVUS=D2rlvT~v4>+H*>dHqrbB#w##5lQ0zW`%XogKZcW;aJiC zy?%7V?Ng<1;SMASq~8Oe&A+GUg0CE%zj$soa4IH4g>Cpfcckxz0^ z5xW!5VZ&k}8-?qGOpdpMDyYDyY%EojY_o@p~>1 zIlEni8^+bYlYkXYi!Uxh@V_^%qHiLbgg-0LNZAe;r=^~0b%jEH^Dl*T)0CYqZ!*sR z>P>FgY^s7uR?%|pgONL?SN*B_NwGtW5X5ogL<-CkjfXa;HIyE)79Z8+%W*W`pq?!P z;@+(}#LBQ8rJ)^#njM4T%Ln(3-vD#oLjK0y7W>2tqtIiTA2i)bapZ7U*-zH|AKVjS zhZ>?bKx7p_PiVRp6l)ThAe=~75%T93k1p$)*LbsjAA89Cct^@y`?-8mw^qh29||z3 zl@Ep=oKDsK8Z-0(FGQx%)Q(wyDQ2S>wK}k*hqP*9VAmd5{bQhjAnVZcEL7fdQqcwT zyK@vPR7Mg-4BwSdWV-v%I1xO!0^1B~VyBdmOW?b$O%vzl!0eOI)#<98L=_)hoQA)( zZrAK-ejZkm>q(5Fr|O}1qW)#W<&Hh@p39+?b@#h#zZZ%>gr9*fTj_chKXiC<^FnTX z023;l!-vjGD4y0BIu?nD&@DM|$~|7o~#Y$2D*-d44jXf{YU4%YL}D|lI`h3EPnDwijo zfU$j(c~HJVn*>sE6-}b2v%<&%gtcw|-Wu{Djt=sY_q)aL<)TB~?U;#jb;Y>^n^hR* zVs&(cB4gl|`>f)=`*DL1^yr@cB8}}v>7xK%8Q19}dMnxsS^}c_9zQ0S)@#+|!F`fdwW&U8&;;Gz1CG}{ zT}NU67<@4sB;u`IJ-V!QV!ZN+Y1z#Tb(Cb6s&RxX^)S8j*wH`@jcqW7wBb+<`LgF6 z=YjRf{kY110L|wHobcXn!dC$-KF!O1lpgY-q6UX* zvC@sdx_u#`#~Cd-P29V{Ff|MgZ_n@Pa6!goj(VqEWl~5S1UDQ>(4YSy9TN-(yZjZE z6h~{1mb;ZDTuPjE`x^Dm;hE5Mj!zaB;&oxD`XiSla^>ML@}ljtnl@~+Lo&XMz3p=u zyoh>v$K*b!(47Jn9x*mLpuQGpHD8y#julLZTD=iH`gszDw3Tz(Y_qDNddIQ#Ujmzh z{CbRqi`yLU;-_OKYssm6{Yg}bpf8)gmh1hSpW|FxDLMOoBo4KcWrk zn2-+NPFYJK2mi?sk}5l=JJ&8*nvyKkw1Zx*G8IF-d+1!7VPtT}NdLw2iUC!O^p+!n zi#QxBP;MW^r0MJHPUf;-y`F*dhBeA)A&c?F&+vLlGUeykz1HcB;c;o|b)Zzg}BYI*{rM+JhF=96xxMwXfR z6EhdrLVyQ){iQ0XfA+(Ymh|R_T@O3Q5`qMHqz;-RpvH zL5`k*f+gxS6^h}Y8{4Q0kiA$1dJ_`=QDq0;MA>F9n#^&()#F*l3y&{4^<_M;Afvvn z=1IZf*#T6sq|!hpT61TjmakhoHQ3mNp>8q$ldy1k` z(^lm9)Y0ir0h_b1oRS)U6KTQMpz+UTmnialB-TX|768_Ij}`qfa(?DS)xPnu3CaD4 zI4B>n<#$l9pC%Oj=E~dwA@M^brjqI~U36j!!)ySh%!2o~At!(=GE3j!o!-aA#k0z& zGsRfuU?RcfwxDw&zIr?QE+MXA$;m_Qf!>0WZ_8LA!dgmYU9%^{J?MXOnG3*o-ABmfqII9W6c-L zbvaf^5BR zLLoY4mtXG&wmujm7&}abO;GCPC9$9pxF9jQd=dY28xTnWKuwyRdsRz?ex=TWFO}gu z1HaBi6BD(t`byIV6~j5iV}h6hnaDTX6HeXFOcjC!OITOAiOH-brRbs#5{F{!>v9k( z%LRR)l(1ZfJXMD~;usj;)dfmnM3+E`u}I3Ux!NhYfJ(qNtQD6E5uotC?!bKRA zF+u(Z@=-WE#1^@by_`HN{VLx!smJIW5Ll8)8#_mOnXRFix<=+X`zgQ`v^v)*N>l*R zG?m(ui5jE?nrp1v}txNGXeb&6K-?N@LdmZ!p z$XMX0HA@=$G(X_t&IbY{v$b)=6f9-80A|U#|oE_jot?Dp2&KIA$rqC zcO51gLP$BWKCcX2`j`LL+95o_PHG}nZ2gQDwg&oP=*{@*tGXP`Ww$a_Ei>niN!KH5 zahIi3;5^HkXkLgfL4={T>jN_FjcwDpip=O9F|?;X-e6?h`2sEq{KMTzD8R{T@JLz#Tlx3UF=jY2tQzV%y8c_?@_CTW?9gS?ML%(nx%=NC7BNPZ$g-9~*cnJ+x8cHVrHxvD{MevX zPRXWoxk~}MS9)NC;n60B3?wT#a8-gAJaz=KiubjV%n6d05E->E(IB@G9uSr~wIPkK zm^&fficbB7A_5dJOBVv$4ot*dob@YIufE}8f6Pr*_goaXE2UzeUL%V!Kd2myT!9ma zWjIgN%T8uowAZ~I(sk#r#&6Z@Ho)7sjWWlH0rPz@kxH5GmSxia5AHPfEArO-$D4xH ze+6r50Wk@}xB3A%6FMnLCN~Nw&fV9nuFigV#K%tNtP;1p!!`EwI;rf9>s1A0fqM=7 zv17$&a(r7$An&iOk_w+LFkDcu$nKd^=4cgFVjy}0v2D2U_vZ5a@UQ-@=iimiHV0EC zbL%wqYST6-2DD=KRCS%6=RVv$M4P5VZwZ(<;TuY*isV(7`k?-x?jS@FKh?EQ@i5p7 zBpPVrpYO6*$F=Ft2koZFGUKSHd%u$$9PNL zP}kA`STx(x1+iH6@nU0#*FE6?cYJ)sUZtfeR*5Fhth+PQ_AT_?JKBMz>(bRfGuRf% z(%=Rwp!|H7O-O^Z+=z5Oa22~>8(kmO+C@B7zZVw2gGaIgS~y?g(y69W{dh^L zz)Lpx>*s)_EPJhyx&zm>y(5nxbii zY_9BcGcjP}o5;Pbs!V0Nh=2-txXS9 zi#17Z)&=gAd!24D5h&A4587wiB3)rcCQR-_2x=#ySHzP9z~rD!13xyWX{VfE_qDNs zm}Gckw0w*19ICN&o>b=H*I48>O_`Uj=!Oxk9zflo4f4>2(?Ur8!3cMQ^viNNTD-afi*7*@n!92`t8>NjiEg zKbnT;J7ihiFWuu{qUTo(;DP#o zqxW;RnwzOfhqJl!k;C4^p{$6R62lleKA}eiOm>!iYZ$ghoQ=wdneHhrmo3E&{5M+3 z&RbJ=E4JIqTERd`U(Ueiw{N0cQYy!#Vfc-KU~3ExAdvyF$hza|RkKEq;_eSc>0V=Q(tvOa26rOL9ul%-Fl8p{E z>(&QC5FO{z@u5=#(dtD{NWY|(K|}Tb{g6Xef|r&He2nVNF$CvfO#EBHwW`~{$ub8R zez$R$8>HZF`KPkh%d6foMuqvk)X#j%dkuQ%W?&K!dz$HIcNR_A1 z<6#@rUsHFgJ|2P~j>63{QjQ9z_2ykTAWMRQpaEriZAbVts%T7j+vT%SZqv#ReG3^+VUeuCIgn zYYwTyLV6`8X1x!H`YL4A@B0G#W#Lr5arajcM9X!Ka1bczi!>iqn5)}ymClNL7VPy4 zrihUfS>W?D3Tr9Pzho#!wNi_i+T|d774}aQUFcUK0`f9dZ>}JK4V|nBh51+gMSfx` z;MM!`+LxH0a6hVF-cSNI)=XUK-8${I$gYx`g#v|%??yXyS) z2G-9AiL8&7y(YGOb%fdVNW13E9+5cgt%C^1lVoa*(HSNEWp{ULyJeBd`n#{p%{`(r zl!3iJ&`{96@=L{{38;XvD`A(gr*#mN7dTE`A{B6JJ# zv{idT>>R9Qm5Tu%0wrr@ZZwKk%+leZ|I1sJa-A?LG`$|C`>TCTm#yHV{)_4bc6M&L zh#++%_Lk0WsjlgVjI$ra}QN=7t%Y-M$@me=ZV5ZmWllrv-4j6 z#MlEykIAz~+$AKLjk2Med8$8U9X_2ui#p531)~o^(%~Zs_8G`{;9QC)#NSr z>x7TH$!7&tY5~_K1eC2IOq@%vRer-=(^_&Fy5Vid;-%jEA9zD0i$PFJ^glDCQ!qsv z=!`dF9`G=Fbh3m3Q_I5~*Q-T#$LvL$)vt_GwbS|LYh-U}BnQg3X+`QUwEyUMzW8j< zjV4&@wx%YQ`IF(M28-U+D7=;sIPVBpm zcMG2Ay!A9jy)`)#V+4BAA?EFrF;UXDbt^{BtE@q@$@LVAKH?XjT%@|yXCn9C=<$#^ z4SfjLW<{SKsCBMU1vPc4VU_gjI=a=A469qu-QaArPH*g)XZd7;QdQeXYL0W_SY;MN zqw8p&)XXjLixTro1gQnneUPCOE?V!A3;qK4AA9KjVd9X$HS$uQ&*ZEtMlL7bst_s{l(KDAyY(33RlM+jDtV3GsX|x*cGYloOi(WSZbw;z`fH#% zM2Y4h$=e5>$_0|25FuvEK)a{Dryc?yiPTpJc4n7|0YSu{NN6Wv)$wXtvKGwm^!(al zmU;{R84wsZz>|s0+(wddp7e9%M!b8*Vz>k#o4w?;F%n%R@Q?I17u{38uMo2WeK^+J zjq;qbZ<0MnDw*X6cDLzz_HhzT?|^!sKv@L0!X-M5j#ASG*}%2*U00-cf>PJJeQr&8 zglF{cdT(ZbSzBR6`G8pZwh7u)yV!=d%N7`@rz0mwfp)G2nk`D`si-?Jw+LwAq!V3& zQC^r1wdS~I>>x9~7<)L%n;VNd|Iw@J-`a+*AAZ~_q{uFKdu3kcM+4VB7~$9KHH}6G zyjTSvCQlOMUsU${hQMBYW<4+CN)C;M`T8z1XTTPaW=qhIKm2>gzxCx~+n!ery_Xxa zH83*nP1sUNawr3ZD4_9lTFTrla$>`0Nx}U-N_1^ma5@`|;jM{{iyd0|V9_o!-UB{R z@6w7xC~e11nGBhCG=Hf)Kg|35G{}TMB;9%gFyxAd*S|##o$HByh6rnO&_6QYQ%B7x zr~7cQU?dh>ouG3r(lTbZ??~}n6^5E4n{`D(##fS7L}cJUwH_*YSx@e-nfgX1;qu(| z-iu8cIXu0eRR7GuTognJV_t2XEKeL-+Nv4+HsY`59y1qwaXh9UM;GnV(ST@1SdE5S zH6<@VCNayb1(W9sT8cd__7tljEp61C%(>dMj1)3;ukz8z86iWA?ybF-`vk9G{Hczd z!G}jkx+YnY#j=&0zqxBQv};1nKNp!Z{#3@W&mf!6^m&90P7+il*Y9P&Zq^1c98QYR znZ2Dtu`Nk8kK(esJ6$(UMPi!dKYr94^N8bz&o~+*V0A|FxcY-2Z4%!J*TmCe+ga%0 zJXXrSD?0Ydz6q1uh9>XQ0`B)!C~>QK7S=0g&VGoaE^KL|HOE=lGURQ_sSoBKeBcuM zRb2b|h4fD+JSaC8Ksqy~iwcmLHwcvYfEzA(^?xWL-T(21{}40PaxSy4CK`sAs|_~= zRmI3vwqD8-(ABSh5c#a|SSP(Nj?NFO{A?8pOhg2t-kyNgayZDTnPgS=&ZV?9I!EC$ zlVjWYsEJ_Z@v?o%!IDFa>>%P9yUZcsYTGLxMMqb~XNTqDflS<_2i5plWr|vxe41Hd zeS!5lu5_aS13A2C=3wVAQs5b{d1UeYCo#T|dmn(P_8q@>J1E^8mhXbtz@rEX%+Yz@ zI*($@>{l1MItbpc3BEshfS_GQ8eyCx(=oFv5y|wuW4UY+{*F4bpF;)@**d+%$J)Jd zzNs7upJB{YQsB=T#bM|x<~z%M5#)KZ`R}%JR5fj1uqsCI3Q+C`yUhO=t&?D}}A1a1pN$ znYvqz!aX0ArvDz75MNn0vB^YopiE{Dg-R_04jCMXpxlI%w(x4)pHP6mST6*yT`yC{ z)b8<$`s%PgbJ%0oy3Xo-Ks{~ziL~!5e71e6KGxdKx=IIWTh#aH1r-9^ z<{s9TvY8#n@_hfD67wUhQv*!~ptHK&=lN#a@RS(BUOf9JAjJW=H*9byYGpMWK zejQ*_=*;&Z zk>#FOQ{bMjU|4Q^b4~DmTg-ox#(LMh|!)M6|*Qs3eavkDjZ!s=H>T@tcm3r~WV&yM-UcPnE%D zvxVyr&*S1<#BQ8-=<}1B6N#69*FS>Yhjl{67+omFz?#G&EfjQC$b#armCuJw;=J%? z4#7p%mNkUDrF<8D&Wz7HVUMY^KcOmbX#i|1cefhmu!P3kk%}$$Q1;goQcw!IK@PwJZvaeh@&H!f-bPtL?OzB8`#BReb$~*v%6q@}Wabm{TLYtE^08`uZE&9tm!54bZ}g&0ulFCDTKMBn%x-f#2@N zQr{QfV4__T>AptQ$3G;M#?yQ6 zf9aBJJUBtYf~8DU)VJXajtX~MWun(MuI96mpRF*plTUVbp479d)fDrc8hdzgc_A4( z)aVVN>wX>1BJ31gHvV>Ta_f013E00`%M_LR%+c% zIg_PRWQDTSIOUWnQ|7)12{twr6Uf22k9-q(Qk{UO;Y-0b82c((#x&Pr{&Ry>>wGk%P)A{mmX8-XH z@|mD5{@M}s?rUVY>ToUTZGv|=Cy*Dk2Oy$=VRC%3Ao&R^j&kbWj$Qmex`>A)+LDZ} zQg0Bp{38G{8p#8~ceqXe)rgbczJm+&bCB5Um%!^`Xx*?#0QeP;l#u=GV6 zgwB6e5$7m5dG?liuC=|;&_Uo{RC+hJ51t_98~!riWm-IcI^BUZhL0)&tdWc3H{JnD`7w0DUv1%O)?%HGK{=m zAg4to1ou=%glF*zkSGyEWU;R9uH! zfr;aUGx-_hd>TR!hcq8!)nJu_)~v)M9zdQr!iK&!H(6B^OGFo%O^&+AI$5*P z#`&mae~BUZNwA=O$)Xyrwz+0tJJ|N>ia;zxjEWI~pw7*K|%X3;S)%5ivGnK_X(ns6gGQ^Z*-Sx{3Fq;vey=SBC~J+X*$0 zZKxi7)7=}eqmArnA7v+DUknrpT!_%YfQWYviD29F1j`vo!M_2r2eaEw{oW;jZ82c| zNh>xw2?W87L<-8g)U020iloLWSdY=oBTsIWI8ggb!pONdQn!cADn<~0VLdE+bFfF{ zWC|*Y-~%vyH$`XCWJ37REPQTt>Ki%dmc;tf=FdaCEvz?9>n1x?Xv?0E8_%VIocLW3 zS-}Y9q&kr4-q0GQdjO}>`ao!kcinVDExq5*rJ|tJ`*D$v-^3J@fg*&fFrp9jxoBruSTEf#z#M$$S za6($~Qj?Iio%e=9gN1+vmI;&q|28mrNUyREz#PHKDZXp_UALNHD_Og3|A=2}h~rD2 z04$0-|GF%T^TY8JQpzh-HSaQWB(YI(*kOG*Z>e{C!$sS-v77B}!_s}mgt3_F=9s>c z;I2cQo2%j(eew_w*+eWEypf}b3)Pi)2AxH?iNH*|Hgbuq1f;IxZDbUYssr*@@)na@ zG;N?S>;d|)lkYp1nS(DizE$o9g(*#xkMepfj1@5~q}Mnr!w*n#z_dt^!L1w&^Dd*~cA zf#p$HIMhUrs-3+up7DJ89BlqXz_M(=xeIxjVl1!4wQ0RkSETsL4dYvKQu*9?8~Hn9 z-%=bSD$7}XF)!TwWg?NlEmnjAeasFi*0PqN{D^?{Mb#Y6M}ODd{qtRDZ@%dqev$Fg zPs>N6*vjKmO6XW1*9SB)1SS{1M0LklFFKYDLSpXqZbIixzXR{T-E87xHu|(+ol}BM zvP53(*8-Gi;b;~OGYsBJ;yZ}yp4&@=GcBWjr(hDms0sXJVg=RoSGxpy&#?_+EN(#^#Y-On1Mg1OasHz?otweA>rK<(3 znvj@h;}(tZe{Ega%YU??&pJ@WB61y+Ve>=DmeC>#5+Wb!v z*5pER?76zn0^D&$oA~3mzUqSxc=aUb;cX1wuCQW8)5 zR?_o)*O^z4jlr(OhBRIjhi0Z;fV^Om#E;Z{eHmi2u?kz%vKHYj;O1Ni4l;CN(21@1 zt2ook@c~>Sys$)1O({2}$@<`~q9sa{4Q)b+^oWDIa+#lcw2hHe2yEQ?{gmSBL2YjT z9IVt*9)4BA48WSsS^PeZJegN;oX(>2dnU!1os_*@0C^f2H>wr)G~ zx06cp0}}j#08>@jj<|CTj+yR@_qd{3;1h0Ant0EUf*h?q{cD6#6r8Ku&ZhfnmrpA* z=22J99oh8w>|^YB-o+}vEuyrM#xMHGOmg$+nZDC;8TaG(*mTw7y*E<8S&vy^MP(>v zt+o#h!A*m9jC_VDl*>Ai+OPB~jxOkZGLMBE8EpM!!tW1l`i)V}QryTJ7ub|)PqY0$ z!B@VS#>d8Fd79k6-#n3PTEGVeoFaRehT|MLL)N%|z{PY!&wmdLy|`@vJ1UDoN6;m(0p-|%VJV`{w`+D&|`^RkS+|Ab2Ga0yhZkda7Bg?B7rUSGgQ zddwED{u-tO!Neq*EYb=VQEW zIp@1ym|BaRC?I);P*<{e?>ab`ufMW4qAA1w&%$Dx&>#CKjlZmoj@Hm$S9y9qT3cNy zxpWYmqD&`mHzh`Jt`{nycg%2pulUz6+sDd`mCD;uw8b~sjHjgTem2NO7k2`xL&ue` zdntO5$A#l4fFD`h`Of!PY7(Iskt(Pc++%%nhCd43Qp-RLK}-#VW0eO}w;1_d5R~x{ zjCA+S^w3+@impRNl@5;frG7JK3&2f%SE8s0;N{K66`dyMVkf8E9%x(0)wimfS6PLM zk;CsLALegnxH^v=t(3GqkpmG9!;rZGj&W=Rdj)!t%S&sccQPJ6P1)kcxjpb07CYRK zh$P{#@>N`!QP5Z8Bh|1m>XPTNpL*!#ePIw`G!;ZM8PhZC_J_RlMszdgcm{glW zat1PPNK@}&3vehGQjeU1CW5a4%$*J2-kF2Y2X)p%a5f8$>xyYhE#>Jh(v4qSDAUhq zqd@Q<%!$a)LaNTzJgp@k@&WddQl~}c7Tqrpc+PE0lZ{-2(^nlIl8dnhTRqIpaNP2 zTn)-e&@c5(?e+tWbG74%R+LDGd4d9FpV&+4N2jn`w|QHn{lr%7r$4WXqnR|D&$) zK+gH<>gP*CcT$e1=~oLJlrqFAGjMfAWv3IdBB;i$l-g+9xhMSVGC(_#pKG_{h9tEm zWXV0Gw9skt+I*bRB0o}oIWpw4P|brifM(aH{>nHbSv5VY_xh5@2V&m(W~VWFXfq-zQZQuHEDkkBA)hWXV-wLYBEiK6V4Hm@=E-qC>{N?Tzt05_w!ryPn_J z)ej362zUs3l0?_P>exalUmA9zz?9x|X4%daw7ChTkGxm|&_KeqnnEn0XW`zf)%vUY z-yY4~GiTaHptIb0@60RLehzG2<@{4Zj&J9w>P2@#|9aG#vc}>&VQ0e8ev0q`k5LxKa*be{1W*UxAGAvjN z>nq*`yeheci0WF;hVUz$@h{r)Q#ztVv$${3O7E3oEN<`TeoWsvn4QExyd#cx*?GZ- z-rA`BuoG1IA7IR}95;JD#F-@0}YUx6lv+?zx+5`lAf@zsv*CaPH96d~i+O zl#xyeg-1A`(vVp`1ZV963&`-_wqoy-r;&n;VrHccXhi{a^yZ~D!-g0j-sD2>T!Z*E z8%J)L@zpj~FfsQ{Iq#`!P(0 ztQj9Jauc@_`_wL#@b)1*f6b^huCShIshF_nPh|%@nE#JD>U`QRc%xb}ONx3#d++Sf2UOX$z{QT+Kh5dI}Y8ZULpybNLG zv2k%9qnm=`x5rw4A8XvQ@e$F($=<%iZ}=DBHRnAnU!p@%axCXwlUE`)E9Hg0)p0>~ zwu=dLymyEL=@kfSvTjM{@R#Ul5^xZWdNA8{mLPfwjrZ5OI8s0FQDnNCkyQ3R&=e?~ z@DG9iCQ=YX&4>Zi)^+Bf_~jT#Yr1S%I1LXqOpbb5%8QVqaj_eKSiry27<-T zhow`9!k=90g3H;U3BkxV;GU%`#A2|+cmnFf@cQ~~iEDn!RW?Uu1j`!mW68m-JhtD#ky-Z? z{Yy^Cx7nP->A4kbzHL=Vf_tRyg@$5$-kcch{-;uJfQTw|^hXWId2{dv9)~3^x_+l_Y=L zKkm(kwGDIyjve--2_!L3{HYx881|oO=N8B{4jZ)3v6k|d z#ap~z)S^z&A}RgOdvg}P1leg5evs<>NE24$cPOgHqo|O4lqsF7)!tyH$nBqSOyu&u z(IO$4TAn`gIf;X@BC zA8k66N}SZR#op>YoHQR7Ve5-25=V|Bmg8rC#w)YzeJf0K;>kdb?_E*Nw@a~!Sp{_t z`B%$Vjbg70=`OX`ZN1>Y=oBN!C!qZ_?mtt*8SW^pEyj>wXKDA+JfG+$m_R+APV~$8 zC;>?05>=(=`663S-Qj1N49z@`sx+Wk(Fq#M1`E^o0Ryc4I-OEymoMy>9LzguS#%=&}~wsBE% zRsh8o)fa*Sb?@nbST-9O>7@BLE)Vjw&Ya`FsQ4P$&1KA#}W#+St z|6dj89l9WOMs=EWepC)8h55%8N zQe!`Ciye&rwCzzEDQh-rLS6_cInU2+C_!xPUX`l_?v+bsOEXjpTq|=6V>*C&^rI7Y|a@x zBj0z+`-rRo`1spn-tF)E<8y<}+jOoi`AfDAyrk!m6eW@9R{XLy+ zl2lhf!6(NAHQK>A!#4)w$<_4&{C3=3`%;KQA|@>{+Oqp%I05D=^)LjUZB>Z>JKU5p zrWhm!y|uk{A@|v8=Dzi{A+JxHh_a1V3*nbU%7cHUy zZMXJSRG9QARXJV1?ftaA^sXy{u*GbPMh-m{STDSGVNOG(KFY$%G3DSz5_=-#0#g7X zYfTUSaXe;X&<)a0j}3#JB8{0ig}>AI!?-OJ}n zJ>NDhA*@b0afjcqwHCj9z5*=&^`;qOSF9a{oly3hFXdj~2ieOv!iQm;TiOSUfP4^= zWTN8(4O@dk)`BC{0nG^-zn@BrPFIaDj4bxBjH*KDF4u$KMb=ytCqiu<@*^dcFuq8O zo9lPc@3(J`2Bxc;&Q*R6A>V(2PdRAv7>ydq*g4Ym&~(93Wi!{k4BxKSm+9D277K35 zY_1%YK)%>IN64&1iyYG)-r*X)sdp2q!9@K3Re}yp>au3f#WM^I@4jy^V{gtrY#J10 z%N|B-A_=fF+Ykf|rfRaE30eAny!VLlkAk^-xHMv$zIFN&5Q-?I22>NR%a+_~DAuxz zP|OkgmXM8n6gw;@USX68KJ0YB#Lfr=Ac3FWHFAh~M77_Yvsrnqiajya(JyGI5xaiI zTVI&GxOwE)pM+US1K7)!WXiop@Hb=aW6&{dYLZUTM&H z%g>^1j2CPp+UpCx(Q;4~b!+>OI@+)=ZhL*@nmP1hm9<_UsjO7 zSP+xACjBq5_+8*$!^ptZs7Xp}xKFDb|Lif_eFrO zxRJm2jOVNR=hZ7?bZ*8NsFWE>?rZo5EU0nZy9$ate41_ngmxF_36G5VpRo$*PqG_~ ze^Z|gE2{P!>{zkA*?xVwMR-qJsvI1kE6x5S@K)8;;M6#4ZhN`O6k?ymc(VV3TD$fl zO}+%Rqh+@_Ziyl_p;k5(Dkzk+75$1rJ>vHj>W264u@Rri%KEtUhy5cREfM_uAE-9! zmTK>e@!|l*lT&tGj+DowpE(Lpw_M|ba&VSA|BF?f;;>t15|Gqc$$l3U=kzB3tq_q_wk{DlH-lKThmP$>h3(RDe zx9Dpz{0Md_0Cc3_3P9h)o>ALUjGanFpqm z38&QQIAV`Ma}5kJ`+PCW0;DuS@go7>?DkETM6`dRQvjfk7#7NJ2f;@?0I~vmSdxMt z;KIjjgN)%-yDax$*QT21|5#oL=CWNL(DM{S*~u;kl?sr~Cz zIgX=bkW+TT9{CZ4_$SX`eb=h_`jH#xF_|=ljG1Xh;DXD_2L?QZll?oVh+9{Pwy?4| zSYh!Y$6C+2_}_f6FsuST=M-P0{V7aP%+L}_ABoskni6K-^{!V?H}GRFn4&$*dVl|I z^KL1YOWJpPA9A_GbCF+BW9>G!Z-xTtKnL+p#C-S+dnD~~QIg{56Kc9g zP2D%AyEdI_asHYKcM9*86IL32LysPwo7e<-5-)Ee-CDK z{g`KPK3ivZ{CBg9q{1^Fxv-avqssN=9qaersNC_J#tn3J#|DiGz<{+eyPTRp`P(IX zj#MFjH?x1;D)$3uAqZc>M>O=W5$jGb48`F47-oms2X?f_;3*7@Ber&Ns=)8`6O|v~ z6$VWBy+-oqdT6u0Y|Z=kPBs+Kdd2OQgwEe#HKW=KP(e2OLN6PK#@s`3U_p z3Lw^r6J83y`{Ag`UA^RZgLychlrv1Z%0nF~U3Y>|%AZro z1ta#4?0+9ZUMS*Mm{4f1N2>emR_+*B+2RI@&I4gz=?lPLXlv6eIxU&83Z#@3+`THq zQ!24{C@dZA3mgMdeQl>Lqb><_!B{tz|K1#RJ}9J+ys9Qnm7|3DeqGiE@^4F&>cD1D z5pr`6`pY?jNw9u=M|`T$EQvQhh}`2-025NU2HUyyskO<-iD~Og5fFg;3#AU*CVv-7 zk$v2Q_y8xgQBQpV$~)Xdqb?S~Y2`&>)jJ6kdz5ATT&!2NH@Wrrca5~~*7dhHmp#VK ztcEe|Q%MlVt4@hE=02dz$NGQJ)MUGKMLY+KUh{KFwrr?bS@%d!?Buz-3 zMawz_Ntf~)GGB*KJ=A7QpSoZi0EHETYcw4W!f2(hb}`KXP1TVqHxaiZ9f8(5O335+ z)%%#`xtW4URbI-w^&oZ88UB)jJrqi>_I;e3;sgOF#)2c=XElb3kU$O;a%divto=v+Z=CkJ~t^cdmnc1slm*p(%-PdBcqi2(* zNA_F)z$Rs@mtt=YQmx zHxwIv>Odcc*vfA_PZuE1i*t z#VqAW#0vMy{g z##pTg>aEHg`@oU^D)K#z%l!DWvBM!r@K@t$bIkXM$yuO@EyW5F>7EsBl5S%pbTw|F zo2c4h8y57KhiCj!IAGYOtluZ-j}j!7EjNEej@5q9u?MS5QYEyP>E;#PsKwh}{>l@{ z{NERNjj3}k7&V7T9DAMzX*k66(0Z)sKBI03!;1>q`z;zUQWE*gd?tE(ifAIzG4vGsEM5O@gB9^94qi0Nh}ZT)k6&TaH((Npf3&v znaMskWSWoI*L!|tQmBz4BD1g9+Lyy7a{NdV-Y-d20H(k`b?g^oUA34!VkNZhF8UY| z0oN$cjUB}}409db*ndt&XwTtGv(a3tUf?TM^p}ZQ&Ex&m^pgUB;RR09=j-;TYf0T& z94<|i*~gN$L-GQ|?<;5?w+Lz1dzq)A)2zaf9Y!#cs#~$jHn*ObBS*Bk`9qidVe*Oo6JEd)>&>e6o=GNT6zvF7Kq>7PCaZsk9Jq(2d) zVjWzwH^5MqzZZbjF1Kv92&2{-)zae((f2!=?d)Ykd~CbfGS#E^`%M6m_M6WqUN31b zQSkFmGi*iK*bVshcY!(bTR=pRyGjh+%HHru`(5Jd5q_WcQXlk!5X71G(vrTp_*VEc zxwle^JnF*{G?nab-*SX_s=Mo`()I^b>z~ESGYg$p2% zQHo}Rz>Q;C@x$k<^fR6QLm_bOWwDkR&NfCs>^*!-QFJqZ_F9Izyoo2~o7zo3?RY`t zw-yZ8uV(!;lDd;Movy+(E1xEQ7W=IpD24U)HNFYtF48p_!6Yo9o48d@UdCf7|9al`LGxJk( zUX&XmO-si*e^nk>_87>*H5WPHhEN(e8>&X`Km>mq+$K9$sWDFM#mOTnrXxQ#?S>>8 zPDmkRzp|XIKU=Y3RP?U5^NKf573VTu8-VLPN^iWNIabY}f6sy_CdyW1I8!{p0VW5+ zE6HDyr%gs;tOp=0$_kb%UBT8+!TUN`caFa3leW7}yK#8D8ITQW%jr?IcvlCOU&cDw z8m6){B zO2P7tCGMU=oTAm`BlIb?9?kz5{Q#3nwQa4fU8==NH@*}O6ocX!fpsF!WL}S~$v4IA zG-A0j>U?HPNRaF#WlV!LdAWKbq(Qg=hpvSwwQV)4g(*MFsNvP9yYDfsPgT)Yiagr= z6s!btv&_2?ZA#NrT2=bleoU;P!hGK9 z7d9DeN@K}@8HKkAGI|O$-1Z+Z)|$8YUlWvh{8ye;SMUevpw1k5sgNf4e)h;$J7eeb z@OhZP0Q|FvW_mv;pZIKu+|)X^QYVz3feCrt<8B6x2!uB*w*B)86WG0PalufhG^kYjCQ3)f5u+R*W zx}HsM`)0y7Bvnk2{3B{kao=U92abTdoOV9a9eQgzS?pa|;xYbJA$=N5dgoHQOTyyY z9Pa|fcDJy6Uqzi~iJfxG-hmVm<*(TIJ{Q?w`Yno3$Q@x%$16SNz+R*08m^e~*OsRf zU{=g}baqd)eF7Cy4|fv-bjDr$!

yezHda7`znmzJg>#ClM0I-{QOc8tY_wC9tNA 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�TW)}BN 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⁢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

=sSp2tJpUjT^P}z!Hyv?sgb3UA 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 z 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%0D1##)(h!XmpQ)}mEzkR3e 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

JIeo#PAj2N1#Q)Q?u-`P@8J(PwYPRX ztcuN4vet(5ECEpLl>I-Sg^_J3`x~&e)6oNp{@QpFd84bke( z$LlG3A|EiIfTu;pzonm+yc#u5_ezRElRT-rjImNq@l5|w74}b`@cv?mdO?$Qgd4-R z1FJzZC!H_q@ViHBwAzZV1sG)qhbj-oyT7`3X>lb~gNX{-HVBVRS=?!g&0qWsLsX2I zS}12M_Z4oMbgK1Yu=T)Mlv+=!twwP;KhzPJ$;J}M(Twv>l^I=XwgBM_rT418n&(<~ zN@v6I2Co-A@3L2KsfjnEJ1NY-p_LO5Hb=fMPJV7l*Ku~>X6}i(y^vh2qqH^T0^$ra zCRzKst8K;e2XTco{;0JhgG>(AZLGck_mOeTVY-3gfYrHUQkBG#*_mLULR{g88a;3n z6_40KI|k|=vGv1p81b)RY!Ge(Fh8_RpSuIK&KKU`F;P6$Eti9TFjS^_W^jRO25B1& z-ccXQl3_rBDIzgC9kq#aO$m`oL}<|N)HB6}z(@M|SZBUFp* zS+;!8l$JKCjP)G+(Z94l_aX)E&sDoZ&;AbjsHpT;;FU|KD6*|!ZT*d|T{QYo*C_9~ z#F2P~fd@V}mJ`;k#B~r6A?~%Tc*UCNCWl0(GzH@j4PB?K5zBmbKxrba{z&yT(*F%m zeLn@}we)cKa6!6$fYk;DsN#fQ>ow>p7;T350;M5js0?oOrZ!cR+kQT1o$Q;Kmxhq! zNUs{`j@7PFMl^b`8;EIWXnZR?{(-yB_6>PG@N`5f)R#=eZGlVCqSB$-t;4pwg{q0#vx4Zw{X_7l zvDvj~!3dVKO7`QI1sO!&d#2U)L`(D{;Xw8?^VSSJJ(JV>#RP@Sk-U8z?W%mg#LjnA z++%-dJ5uVx0o#UJleR`Uc%zdLS=2SlxnNJ4SEUD_N1Zbo1;s9IloWSW&IVYfVt1!C zeQWzo6y$ek(?r@I$lHH-@!rve9?QOmJtyuAz(%$no&75BAW6Y+Q29-LUHg_3i-)

OgRRZltB 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

wU68rVJWg&5|%MvIYc#Ud1Mde}R~w;C7ziEa1# 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 z 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

>1r%4h7#)r)Di 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�JI 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

Yt5NEOEnKj%$|!gEB@Q2e^$h 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

;T4^IbJ!;mCXzN>gzO=L3^a(V zyQ8JiFT8c4a;b$+QOv#^e4uZCa^_cV$N2c)eE#HtoH9ZKkZXd>ff^3NXB`_@LRvPl zg_P08r4N1;eRs{n#w`P_>?JDwK4+*jA}igx7OZTQDITzjb_HG+v#R%=bjSzbp(1dB zGif}{E!$*i>DZlaQ^k)AWbXZo!aS08@Lxy^0*x1H_Ngly_Ns|=0elL)ETiVljWhYW z+a5xA*_g@qt~*mj%~N(=_l6Af^u1pZDS1XdjVd&u0(%R!3IAM&gQ82*Z{;y4aHc@m z1u@58BhVhgEd(>3y6igeK+wr_Ud!qpi~aF@$IUa&J`0V-7IZ=*_?g%1ShWE72e89x z8MEh2CBv>=a^{VB{)7<+n;z!h6+dllpq`}xG3VS3H&$v3hT5W#Pp}b3-u{QjRYWOm zUWy`IwT!5bM3?x!cBre^R{21lD`D$-4;Qj{qA>nyymM`@+BDUEr2V=+#@mqdptk}& z0lJvmk%B;KyT$sL565JvsDcKcK#mDYLs9+~$vgz&z?)Q|&jcsxuznJvtf7wR>aZ+t z{jGRh+h@9Be^R^qOxo(m2Z{Iv59EIh@TqICH5$+ZUCS&9Ms~oriYK@y3VJ1=&hm*| zJ^twEU@DMX{E8<+x|7jWhh`T<$JNyYD~3>Rkr-jA-u{>Z+Ci*#$pE+*uMym^V!0@a zp8~%UFFAEt&9C8|jPPllq-w)?ClOq(5Dv;Uc3Rp%k3@`AVlPGf(lhTjh#$Uy#(bz| z6>ocFh%shTPzk4Zjc`bZuxSc2UcYhl!Phy9NiK)qxhmyWKRMysc34y%YJmC4_?Ot1 zagO)iydOb4HV7P1B;PMt)H{(*Sz7K+`H<8P7 z5x#QGw`=#x(q%B%wu5N0f43F*NB%kd^u8I#sP2APyMA}IaIZFz?(q#_8C!Sikg1?Z zqEbjV)8Wf-+P-A*@8xMXp1dAnRlehkesIal`P_m8pIsZ(c)1kz!*~nxp!L*|Yw!HR z)z0mxqU=^5BS*JzITE@pilVvUWe7YA#{Tu-TkSB62RWXq1XcB!H6i?{4ev;|r!uo0 zAl?GYXFI$DOWsvB{H(;P#ci~2Tv5O+oK(@H{Giu+vyA&X8gq=!>CZiHVgUO0H5i&YD2*ZBQ`(g^@^)UnpzUZ6WsFKZ4zq!fY7A|r z2du0cdgC$ZxTI=Po+{3OjJk`Ilkc)!so2CqnyR1T*7x=z#BI{>_-Ss>qGKL!^IWDz zOuB|$WmJ^wsfQ0sc2`Vn&CB2S=~kmJ3O`!Osm^JBwhrVfS-=ZpMd$vN;zM>MT5Ht( z#`i8!n3}CYa6cexotb4Fl=92a*Y17m_Jnr2yLOI_7 z5?m>Y2^LB-RGX2jbP9bu`2~J*98_TwTl+DwBM1xkNM}`XlM2L74Q5Dk8S&35#n`BIU0Ka%HSB7L_?H@yXf61q#m&!M zVdkV(-HzLUXnD&vdO5+YM

i(#>>XnFPG=>P}#aZU97=I}SFub-SVw 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 z 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�!`ZS7Y@iAo8G8hR82EL4$B5)}apf{02_XcDDE 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

qGFD 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

    YX}kQ1G|#2y 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

    &5t7SLFX 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 z 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

    shg`a{TMVBt{16A-cY%vdDQo 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 wQhsf|*v()w%ugS@!yn2d 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­cBuOKjV~wbEQni$ge5vTwxw>fooAJt|8lk+)XEqegLYQv95t^#)VC>@CI#4Sy>A=5;-c0JKr3_`Y@?11nQ4DI z-9NqA?wqNq%du6ZG|2+Ewk3{u`}`e=q-9=xDlAEaELB!jc)wdRyyiTODpP|<+iW_L zc{xRVlB@J?iJU$<`$%fVbsn*ll;EbXnqA7K9;!I=*6ZFGoll>8v{JXlKn*=$`kvtt zaWu9FRe5?A=^X*<8o3n)Dywi`bu<&%c<)%Eb0S^#$(0@ZmON^)Fz$;lF=#s?^+4fD zF6gX?R>^=pZ}5@#&%_tz6x!ts{H}GZ9zW>Tl*g4^Os2ffkc>9B`cjsw?Ch^_Y2Fy@ zx4pYn;@N>2v~jfgsy?nBn>L@LauA-=uNY{WHA5|WxYp7FUFkY8HGFak74{Q1Cuj_R z@^V?ob)Gf83WC4lj>x)46dwwP^Aq4J_mYFrm#9-R=(E0|lzU7ps)@**pU3(v-f1=O z(B`KFVX9F|RQ$dawl9_4AkdpY{OY-b?=Mux_AZmX4nK{3_N*05ONKRc{zjI#pbo5_ zEX05+>48o=7k@Zf!JbMNX?!u-dH|%HZ;!9(lPMO^)UN4z{?_b@j+ggGzw^E3YM8xn zFlvsi_qeD{BxbA6{rP8v6MGxM_K0i^yJ>xAaz%{zhws}YYl((S++|+ts){sOloi+B zkcV5K8Tgg6PyuaT-ujy(m2fVPw{C&mfMdw?g zanCLsZykYt`Fyq}M)s&;LHe(~JO8-vUr_D*tGd}4&8rKycy`7$AjevcD0N*;=-;)0 z*Qb2N&8i8i+_9adzIQ!A;!Y-9A-Z#k@0t&DirvG~2(WHg^fLOlI`-8l`;f%lSOa2q z)F1rsNH^)wPPV=?eXzR&4KkQrTtNDi;r{IOJ%zY);z9no;1AI*PeLhJ_1h45Sg)S! zsd!-12$no4`uZ<1#NG=Ie;2tZTR&q9b=Fv@*nNG`Pf#;-wS0DruQJ5_;KxYl+=! zRzbffFc}qRb6%E29*$BC%aSh?YwC}F|7E_qu(vRtg`b{4{-&56$(4DnJq#**5}Sz< zoHq4X`?r|9Xx@e=&Ed5y(js?3LdniT`^AR8N2}xCJo_e4-(XFuU|;>S2wxC3LIH~U z$B|EFEU}&8(zJ8~2wCBEVTMDk8pAv~WwS&@6y_Xi9O`zLHR?6-I$8HqMD`VyOgAkV z`>wEoE4{+niCA*+;h?eXLZ5|HBGS{Dmv`ECSZ#xvJpSws?>mQ7UQVLpo}c=9uf)tnoA*i)Oj-grA+ z3Y*cCr<7$sH%G?!#;y4V3{ss$l#e9p>1imn#*B?8hFwqu_8O&IL;}36q~2$w!p~|f z&~Jz?j9E;kBavsLf1NfGg=$%hDekA|Kbn)D4t}wAyqx8*aCNxz$We1R0X(3927$wQK7C5Mlah8f|rM3ibtAx_2!hq#BF1Ixo2OSrNCLtD|vG zN^H$A8HvTqdOuo+=l((HD00UQ3s^xSJ57ZxHNEDd3}774OshhGzzE z_^eGQX~Q;ok|g}S9_1YfZ-Mk^(Kc}OHhSKOn`9Q&kTqq(HVp8qd6k?7xZ=TTemV*56q^2qGLNlO-{b>4FH`reZvZKJ0}GJ#ixDN>&92ghe1#KqyL6Mp^& z-Fp3H*=8j<3UN3hs3|TUxGqwo=SnyKF3|K69R&tynysS&J;9jp8xecz{w!h6g6iP2 z4=vY&JY*gZ3+Z3NlPRySu5D8br>M*;%TwBpyqC>(K4$IfJ?>sOy`J_xvLpN!$!2A) zGH;A-k~zLInmS!X3%QvDn6iqu;f7dxpovj3P&2+y7)O1UFc1sS5t<~7hMXJws z3pjd_A^3xSxVqIog#h83c)ilM-%!2~vd&S{%cJ2M{z)DV-3uzw{J;4s@_t5(UEG@z zS$m8#i@Ue~QuL9%=XY;P=Sr(>IXo&wDlpn%wTWp0Q5gexip5kH3G9ed7NSd1GYo>y zXXyxf@jKq_Ij-yuASAvQPFD+31mA%@ z$(Ag5O3(;@8!P4hH~y>+GHTS$^XZp^uHPs0zH{I{Yq)p26w*ZKhA%|UD_qwWJvSJ% zf!mFsR|s*R7r}8}80}UFwYu2MV;c?~XjV^|uH#uLNqaqpg3476l3iSXb_%wL2g#h2 za?JmPA2|FBI{9!5r;f-$n?lTYL>Ru{tIU^zm^}$Ygm7pm0f!qQk$WYy!Z--}UMiRX zZe2laq+qAWwCG{bV7MM+9H)I!VIy^)4~f@?QZjB_;kuWxfBLz%j@+8@nWxA*YP`tJ zO=rRx6@NjIpR=pSzKz`7S~^_;X>0m35pvOsEPu01zo-9hcmJsb+lc*?UDyMWxo!o2 zB;1FRWO5mYl$R^^4>ikuqOh8Fp$QV)``U$`&wojFTO))18SS;b--#66Dw<^wpR0#D znk$i`1a{%{fhuYkoxR%G6n~3#mEGEmm=i8ITHdY6GRDz9mLaahhhyq^8925Q&woQe zkk$j>{n*nlGs@dKcDH9m7mEr}CludljCH>@2%xonqJ`Obp2xZL=M;^|URNj#+fwkf zGU{E&a1S`_|7fyn`x>Ay9^jqvkuP-@ZtlQOM?D`#c+cA=Ww%0h;*IC^Qr^7&B`HME zFD`%CAQZG#zZb16SUvfyqG0We?&+7OWgS4&U)!goEQEfRd)GfoaC)s&(P1O970Xb> zp6J0k@VxrAOsq7ulyGbrNtS8621HcJh?h8ye6AP*Xt*VSKUb}@Z>p5YpaR#|wu$U~ zFTtj^bDe!gF_YNs!~R|DrN+HeHYm20(7XKE1>G8TBk zTj_>_X)(U z54Bl_jXAruwu*s;l7RHKyxaxbS4+xRz}|L;^tCZY&nB^fY`miQw?TUW~&ZP zn6UlfDK^UUj3&%0KBv`pzG^bbl_Tl+AN8R?11=gDeA(ovm_NmLI=X=@7&{Iq!3UQ0 z%m3yYJun_>lMQADl5ske+RE$>_y^aO%#7x)m_(?iH|)>6{t} z_Dh;g+403`xkP-VAsW*kV3}0ZtkF!1J0EGK&Y!*!slD5MK(cx{y6K~0UaAIQv~BY ztA#P$AzRf|K⪚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�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

    KRJ) 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

    HV`&)oU*`V?K1Kbmh(yx;tJGTac5I4ZJ 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

    (e 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

    jWH|j+Ka4M9u4+*p(`5)r`VZ7;JZ=VQh$SW~* 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

  1. 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 z zq5!u8!52QYXW_E<*RI*EOqW^d)+muvrwWgR&iYEIjxpF^sCfXgLO4=Nl60Ao2v3l}CJopAnaG3A_Mv@pvE0oT^a{XZ*Le8gAz0PJJQ74&6>F!f ziSF-q<2IY@t1&vukD@bamjn9wR7jm@s{Of#rl7cNSBbK7)%#XgXVmJ1UeA{B?c7_} z6?d_a?$UaiNQUODHatE_{Zm>CRLSyr>ckeoj?8yp}twMT4= zlVn&_3Mxi%bL$r6ZNl562d(f zS!Lz)7}w3)b7`yD>vZim*=B_0^vve)GtIO3;t?FPw3gB6V7}e|k=^=F(GXVRjtf7e z!*+{a?_atq;knjr;o_TLr+0u@YwFqc6unvmhR~Oq($;d{WQzX-zObe-fLR5>nbzJu z9d(>19N__gXLF|gNop$qvT#av2`HnN-cV*38l$}PcR5DfD14!>qowImC@Al_tToyN z2mG9!_2ykL7K1fi&{LNC+kcDmLXo>!3@+>53BYs$Z8Zl$-8U(Ohl{76`hUL9MP$kfRoYZqQhETgAe(Tx_l(d9~uykQ#c>TvZN z?8V}hqqlvZo;o@EPElzzUHVBtf2R`lDS0;U^7hMVDkEzwJt zc1?V8lC3+&(_685oLzezhqhIj*2c)fSVeASr%@;EA%0<|o*$n29`Fu4seF17=tP}} zZt9o5C{g6gdi>w+3Fj!$#E^l0sT^JE4b3}Q9abi(wufS>gXDR#j6EKr&+Q3^KYn-o zgi=jl(3FUtNWSzp7H4x-uSv{uts=p~l&@KNrmg=vBtD@P^oQSk0O_CjpEz!%!=pV? zRA5#E@(MR!@1T!FDGQVBMvL=0rCl}S%l=q-D~htH*-?2b{Z$a>Hd5WtD0e9l95JQ1 zxP%IQp!SWs_c=Z@uk`bx)kg`7Wa!N9NWy~m<3kVkk(Ul}z+u$rH=!1lRy_k;Nb|KFn|jsWc%d)p&l_yr z1|A}ic+jjg8j^AcMziTrK!B;b4=p_XP04oj+%~C31+fza3r++5jOc;
      RLP^?X1 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

      Ic<`!rXqAjOq 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%0Awqt!Md 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ˬ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

      b;9pVC6SIy{ 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 literal 0 HcmV?d00001 diff --git a/GUI/QtQuick/images/RPK_template.png b/GUI/QtQuick/images/RPK_template.png deleted file mode 100644 index 6ccd22350d1f4a58fc2be6cccd4b25fc0442e1a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271241 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

      1XQZ}0lT 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≦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%0Ay))o;JCD2S5Xq!56~sathSifw>m< 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/Plugins/SideSwap/SideSwapPegOut.qml qml/Plugins/SideSwap/SideSwapPegIn.qml images/import_icon.svg - images/RPK_template.png + images/RPK12.png + images/RPK24.png From 89b820c1a460dbdf3f1d7421629a5760a724f879 Mon Sep 17 00:00:00 2001 From: yz Date: Thu, 27 Apr 2023 16:58:14 +0300 Subject: [PATCH 379/436] Using spaces everywhere --- GUI/QtQuick/QtQuickAdapter.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 90af5b261..a0afcea06 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1859,7 +1859,7 @@ bs::message::ProcessingResult QtQuickAdapter::processWalletDeleted(const std::st emit successDeleteWallet(); if (walletBalances_->rowCount() > 0) { - emit requestWalletSelection(0); + emit requestWalletSelection(0); } return bs::message::ProcessingResult::Success; @@ -2471,13 +2471,13 @@ void QtQuickAdapter::notifyNewTransaction(const bs::TXEntry& tx) QString QtQuickAdapter::makeExportTransactionFilename(QTXSignRequest* request) { if (request->txReq().walletIds.empty()) { - emit transactionExportFailed(tr("TX request doesn't contain wallets")); - return QString(); + emit transactionExportFailed(tr("TX request doesn't contain wallets")); + return QString(); } const auto& timestamp = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); auto walletId = hdWalletIdByLeafId(*request->txReq().walletIds.cbegin()); if (walletId.empty()) { - walletId = *request->txReq().walletIds.cbegin(); + walletId = *request->txReq().walletIds.cbegin(); } const std::string filename = "BlockSettle_" + walletId + "_" + std::to_string(timestamp) + "_unsigned.bin"; return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + QString::fromLatin1("/") + QString::fromStdString(filename); From e37b82b6b09f543fec2d9e68d8fc760dab197fa4 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 27 Apr 2023 21:31:36 +0300 Subject: [PATCH 380/436] initial jade signing support --- BlockSettleHW/hwdeviceinterface.h | 2 +- BlockSettleHW/hwdevicemanager.cpp | 23 +-- BlockSettleHW/hwdevicemanager.h | 4 +- BlockSettleHW/jade/jadeDevice.cpp | 219 ++++++++++++++++++++------ BlockSettleHW/jade/jadeDevice.h | 6 +- BlockSettleHW/trezor/trezorDevice.cpp | 12 +- BlockSettleHW/trezor/trezorDevice.h | 2 +- common | 2 +- 8 files changed, 194 insertions(+), 76 deletions(-) diff --git a/BlockSettleHW/hwdeviceinterface.h b/BlockSettleHW/hwdeviceinterface.h index 9f07989ec..99144634e 100644 --- a/BlockSettleHW/hwdeviceinterface.h +++ b/BlockSettleHW/hwdeviceinterface.h @@ -61,7 +61,7 @@ namespace bs { virtual void setMatrixPin(const SecureBinaryData& pin) {} virtual void setPassword(const SecureBinaryData& password, bool enterOnDevice) {} - virtual void setSupportingTX(const Tx&) {} + virtual void setSupportingTXs(const std::vector&) {} // State virtual bool isBlocked() const = 0; diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index df354cfa3..97972cc8e 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -274,7 +274,7 @@ bs::message::ProcessingResult bs::hww::DeviceManager::processTransactions(const continue; } tx.setTxHeight(txData.height()); - device->setSupportingTX(tx); + //FIXME: device->setSupportingTX(tx); } return bs::message::ProcessingResult::Success; } @@ -288,21 +288,9 @@ bs::message::ProcessingResult DeviceManager::processImport(const bs::message::En } const auto& device = getDevice(devKey); if (!device) { - devKey.id = "C23C03585A8E444C242A70C4"; - devKey.label = "BlockSettleTest"; - devKey.vendor = "trezor.io"; - devKey.walletId = "2xSX1rAcN"; - bs::core::HwWalletInfo wltInfo{ bs::wallet::HardwareEncKey::WalletType::Trezor - , devKey.vendor, devKey.label, devKey.id }; - wltInfo.xpubRoot = "tpubD8JgFtY4RtgMN1ba5HLyJnkZizAggcspF6A4cqykeBEdf7z922uS9JdMK3CXwTNorLM3Rq19r4qYY3MCD38BRdSwipAjQ2G9uK2iUwXbn8Q"; - wltInfo.xpubNativeSegwit = "tpubDDSj2fiYBbr6pNzRfPddHhaQN96cfqhJxNLtixXLP1arWRGZspMSX9yoqSXzvCdG9F9giaXzkj4VMCam2FZsWYYX9Yy5RFVGUrzPGS5xKkA"; - wltInfo.xpubNestedSegwit = "tpubDDjriaSUoYgTyky2bypKVFkktRDUufKkJUgEsCgHyTo8NpfdMyAW2w3ByHNY4Dgrmq6z45rSuPikrmBLhaM5sXxS1cHnHNzuTQyZxE2AbFq"; - wltInfo.xpubLegacy = "tpubDCdDNLh6H5vqcSAAXKh5MSPLp8Jvt6eoxwFrNRBf8erJ46DPmcZB2FgDPbWcAq5WiLPE9qw5DWBWRWAikSpiZ25YNumeu2sew9FMzFNxLoD"; - walletInfoReady(devKey, wltInfo); - return bs::message::ProcessingResult::Success; - /*logger_->error("[hww::DeviceManager::processImport] no device found for id {}" + logger_->error("[hww::DeviceManager::processImport] no device found for id {}" , devKey.id); - return bs::message::ProcessingResult::Error;*/ //TODO: uncomment after debugging is done + return bs::message::ProcessingResult::Error; } device->getPublicKeys(); return bs::message::ProcessingResult::Success; @@ -463,6 +451,9 @@ bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::S else if (bs::wallet::HardwareEncKey::WalletType::Trezor == hwEncType.deviceType()) { trezorClient_->listDevices(); } + else if (bs::wallet::HardwareEncKey::WalletType::Jade == hwEncType.deviceType()) { + jadeClient_->scanDevices(); + } return bs::message::ProcessingResult::Success; } @@ -687,7 +678,7 @@ void DeviceManager::deviceTxStatusChanged(const std::string& status) } void bs::hww::DeviceManager::needSupportingTXs(const DeviceKey& key - , const std::set& txHashes) + , const std::vector& txHashes) { if (txHashes.empty()) { logger_->warn("[{}] no TX hashes from {}", __func__, key.label); diff --git a/BlockSettleHW/hwdevicemanager.h b/BlockSettleHW/hwdevicemanager.h index fe7c7f50c..49f450d4d 100644 --- a/BlockSettleHW/hwdevicemanager.h +++ b/BlockSettleHW/hwdevicemanager.h @@ -62,7 +62,7 @@ namespace bs { virtual void deviceReady(const std::string& deviceId) = 0; virtual void deviceTxStatusChanged(const std::string& status) = 0; - virtual void needSupportingTXs(const DeviceKey&, const std::set& txHashes) = 0; + virtual void needSupportingTXs(const DeviceKey&, const std::vector& txHashes) = 0; virtual void txSigned(const DeviceKey&, const SecureBinaryData& signData) = 0; virtual void scanningDone() = 0; @@ -92,7 +92,7 @@ namespace bs { void deviceNotFound(const std::string& deviceId) override; void deviceReady(const std::string& deviceId) override; void deviceTxStatusChanged(const std::string& status) override; - void needSupportingTXs(const DeviceKey&, const std::set& txHashes) override; + void needSupportingTXs(const DeviceKey&, const std::vector& txHashes) override; void txSigned(const DeviceKey&, const SecureBinaryData& signData) override; void scanningDone() override; void operationFailed(const std::string& deviceId, const std::string& reason) override; diff --git a/BlockSettleHW/jade/jadeDevice.cpp b/BlockSettleHW/jade/jadeDevice.cpp index f50f6ae0e..88a188162 100644 --- a/BlockSettleHW/jade/jadeDevice.cpp +++ b/BlockSettleHW/jade/jadeDevice.cpp @@ -56,53 +56,12 @@ std::shared_ptr JadeDevice::worker(const std::shared_ptr&) return std::make_shared(handlers_); } -void bs::hww::JadeDevice::operationFailed(const std::string& reason) +void JadeDevice::operationFailed(const std::string& reason) { releaseConnection(); cb_->operationFailed(key().id, reason); } -void JadeDevice::releaseConnection() -{ - WorkerPool::cancel(); -} - -std::string bs::hww::JadeDevice::idFromSerial(const QSerialPortInfo& serial) -{ - return serial.hasProductIdentifier() ? std::to_string(serial.productIdentifier()) - : serial.portName().toStdString(); -} - -DeviceKey JadeDevice::key() const -{ - std::string status; - if (walletId_.empty()) { - if (!xpubRoot_.empty()) { - try { - const auto& seed = bs::core::wallet::Seed::fromXpub(xpubRoot_ - , testNet_ ? NetworkType::TestNet : NetworkType::MainNet); - walletId_ = seed.getWalletId(); - } - catch (const std::exception& e) { - logger_->error("[{}] failed to get walletId from {}: {}", __func__, xpubRoot_.toBinStr(), e.what()); - } - } - else { - status = "not inited"; - } - } - return { "Jade @" + endpoint_.portName().toStdString() - , idFromSerial(endpoint_) - , endpoint_.hasVendorIdentifier() ? std::to_string(endpoint_.vendorIdentifier()) : endpoint_.manufacturer().toStdString() - , walletId_, type() }; - return {}; -} - -DeviceType JadeDevice::type() const -{ - return DeviceType::HWJade; -} - static std::string dump(const QCborMap&); static std::string dump(const QCborValueRef&); static std::string dump(const QCborArray& ary) @@ -172,6 +131,122 @@ static std::string dump(const QCborValueRef& val) return "???"; } +void JadeDevice::setSupportingTXs(const std::vector& txs) +{ + if (!awaitingTXreq_.isValid()) { + logger_->error("[JadeDevice::setSupportingTXs] awaiting TX request is invalid"); + return; + } + if (awaitingTXreq_.armorySigner_.getTxInCount() != txs.size()) { + logger_->error("[JadeDevice::setSupportingTXs] awaiting TX request inputs" + " count mismatch: {} vs {}", awaitingTXreq_.armorySigner_.getTxInCount(), txs.size()); + return; + } + for (const auto& tx : txs) { + awaitingTXreq_.armorySigner_.addSupportingTx(tx); + } + for (uint32_t i = 0; i < awaitingTXreq_.armorySigner_.getTxInCount(); ++i) { + const auto& spender = awaitingTXreq_.armorySigner_.getSpender(i); + if (!spender) { + logger_->warn("[JadeDevice::signTX] no spender at {}", __func__, i); + continue; + } + auto bip32Paths = spender->getBip32Paths(); + if (bip32Paths.size() != 1) { + logger_->error("[TrezorDevice::handleTxRequest] TXINPUT {} BIP32 paths", bip32Paths.size()); + throw std::logic_error("unexpected pubkey count for spender"); + } + const auto& path = bip32Paths.begin()->second.getDerivationPathFromSeed(); + QCborArray paramPath; + for (unsigned i = 0; i < path.size(); i++) { + //skip first index, it's the wallet root fingerprint + paramPath.append(path.at(i)); + } + QCborMap params = { {QLatin1Literal("script"), QByteArray::fromStdString(spender->getOutputScript().toBinStr())} + , {QLatin1Literal("input_tx"), QByteArray::fromStdString(spender->getUtxo().getTxHash().copySwapEndian().toBinStr())} + , {QLatin1Literal("satoshi"), (qint64)spender->getValue()} + , {QLatin1Literal("is_witness"), true}, {QLatin1Literal("path"), paramPath}}; + auto inInput = std::make_shared(); + inInput->request = getRequest(++seqId_, QLatin1Literal("tx_input"), params); + inInput->needResponse = false; + processQueued(inInput, [](const std::shared_ptr&) {}); + } + + auto bw = std::make_shared(); + bw->put_var_int(awaitingTXreq_.armorySigner_.getTxInCount()); + + for (uint32_t i = 0; i < awaitingTXreq_.armorySigner_.getTxInCount(); ++i) { + const auto& cbResponse = [this, i, bw](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data) { + logger_->error("[JadeDevice::tx_input] invalid data"); + cb_->publicKeyReady(key()); + return; + } + if (data->futResponse.wait_for(std::chrono::seconds{ 5 }) != std::future_status::ready) { + logger_->error("[JadeDevice::tx_input] data timeout"); + cb_->publicKeyReady(key()); + return; + } + const auto& msg = data->futResponse.get(); + logger_->debug("[JadeDevice::tx_input] #{} response: {}", i, dump(msg)); + + const auto binSignedData = BinaryData::fromString(msg[QLatin1Literal("result")].toByteArray().toStdString()); + bw->put_uint32_t(i); + bw->put_var_int(binSignedData.getSize()); + bw->put_BinaryData(binSignedData); + + if ((i + 1) >= awaitingTXreq_.armorySigner_.getTxInCount()) { + cb_->txSigned(key(), bw->getData()); + } + }; + auto inResponse = std::make_shared(); + processQueued(inResponse, cbResponse); + } +} + +void JadeDevice::releaseConnection() +{ + WorkerPool::cancel(); +} + +std::string bs::hww::JadeDevice::idFromSerial(const QSerialPortInfo& serial) +{ + return serial.hasProductIdentifier() ? std::to_string(serial.productIdentifier()) + : serial.portName().toStdString(); +} + +DeviceKey JadeDevice::key() const +{ + std::string status; + if (walletId_.empty()) { + if (!xpubRoot_.empty()) { + try { + const auto& seed = bs::core::wallet::Seed::fromXpub(xpubRoot_ + , testNet_ ? NetworkType::TestNet : NetworkType::MainNet); + walletId_ = seed.getWalletId(); + } + catch (const std::exception& e) { + logger_->error("[{}] failed to get walletId from {}: {}", __func__, xpubRoot_.toBinStr(), e.what()); + } + } + else { + status = "not inited"; + } + } + return { "Jade @" + endpoint_.portName().toStdString() + , idFromSerial(endpoint_) + , endpoint_.hasVendorIdentifier() ? std::to_string(endpoint_.vendorIdentifier()) : endpoint_.manufacturer().toStdString() + , walletId_, type() }; + return {}; +} + +DeviceType JadeDevice::type() const +{ + return DeviceType::HWJade; +} + static QCborArray convertPath(const bs::hd::Path& path) { QCborArray pathArray; @@ -245,6 +320,9 @@ void JadeDevice::init() inXpub->request = getRequest(++seqId_, QLatin1Literal("get_xpub"), params); if (msg[QLatin1Literal("result")][QLatin1Literal("JADE_STATE")].toString().toStdString() == "LOCKED") { + if (cb_) { + cb_->requestHWPass(key(), true); + } const QCborMap authParams{ {QLatin1Literal("network"), network()}, {QLatin1Literal("epoch"), epoch()} }; auto inAuth = std::make_shared(); inAuth->request = getRequest(++seqId_, QLatin1Literal("auth_user"), authParams); @@ -427,6 +505,47 @@ void JadeDevice::getPublicKeys() void JadeDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX) { logger_->debug("[JadeDevice::signTX]"); + + const auto& tx = reqTX.armorySigner_.toPSBT(); + const QCborMap params = { {QLatin1Literal("network"), network()}, {QLatin1Literal("txn") + , QByteArray::fromStdString(tx.toBinStr())}, {QLatin1Literal("use_ae_signatures"), true} + , {QLatin1Literal("num_inputs"), reqTX.armorySigner_.getTxInCount()} }; + auto inReq = std::make_shared(); + inReq->request = getRequest(++seqId_, QLatin1Literal("sign_tx"), params); + + const auto& cbSign = [this, reqTX](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data) { + logger_->error("[JadeDevice::signTX] invalid data"); + cb_->operationFailed(key().id, "Invalid data"); + return; + } + if (data->futResponse.wait_for(std::chrono::seconds{ 15 }) != std::future_status::ready) { + logger_->error("[JadeDevice::signTX] data timeout"); + cb_->operationFailed(key().id, "Device timeout"); + return; + } + const auto& msg = data->futResponse.get(); + logger_->debug("[JadeDevice::signTX] response: {}", dump(msg)); + if (msg[QLatin1Literal("result")].isFalse()) { + cb_->operationFailed(key().id, "Device refused to sign"); + return; + } + + std::vector txHashes; + for (uint32_t i = 0; i < reqTX.armorySigner_.getTxInCount(); ++i) { + const auto& spender = reqTX.armorySigner_.getSpender(i); + if (!spender) { + logger_->warn("[JadeDevice::signTX] no spender at {}", i); + continue; + } + txHashes.push_back(spender->getUtxo().getTxHash()); + } + cb_->needSupportingTXs(key(), txHashes); + awaitingTXreq_ = reqTX; + }; + processQueued(inReq, cbSign); } void JadeDevice::retrieveXPubRoot() @@ -436,7 +555,7 @@ void JadeDevice::retrieveXPubRoot() void JadeDevice::reset() { - awaitingSignedTX_.clear(); + awaitingTXreq_ = {}; awaitingWalletInfo_ = {}; } @@ -471,12 +590,16 @@ std::shared_ptr JadeSerialHandler::processData(const std::shared_ return nullptr; } auto out = std::make_shared(); - auto prom = std::make_shared>(); - out->futResponse = prom->get_future(); - requests_.push_back(prom); + if (in->needResponse) { + auto prom = std::make_shared>(); + out->futResponse = prom->get_future(); + requests_.push_back(prom); + } logger_->debug("[JadeSerialHandler] sending: {}", dump(in->request)); - const auto bytes = in->request.toCborValue().toCbor(); - write(bytes); + if (!in->request.empty()) { + const auto bytes = in->request.toCborValue().toCbor(); + write(bytes); + } return out; } diff --git a/BlockSettleHW/jade/jadeDevice.h b/BlockSettleHW/jade/jadeDevice.h index 9f2421d40..1b336638b 100644 --- a/BlockSettleHW/jade/jadeDevice.h +++ b/BlockSettleHW/jade/jadeDevice.h @@ -37,6 +37,7 @@ namespace bs { { ~JadeSerialIn() override = default; QCborMap request; + bool needResponse{ true }; }; struct JadeSerialOut : public bs::OutData { @@ -136,6 +137,7 @@ namespace bs { void deviceTxStatusChanged(const std::string& status) override {} //TODO: implement void operationFailed(const std::string& reason) override; void requestForRescan() override {} //TODO: implement + void setSupportingTXs(const std::vector&) override; // Management void cancelledOnDevice() override {} //TODO: implement @@ -153,8 +155,8 @@ namespace bs { int seqId_{ 0 }; mutable std::string walletId_; const std::vector> handlers_; - bs::core::HwWalletInfo awaitingWalletInfo_; - std::string awaitingSignedTX_; + bs::core::HwWalletInfo awaitingWalletInfo_; + bs::core::wallet::TXSignRequest awaitingTXreq_; }; } //hw diff --git a/BlockSettleHW/trezor/trezorDevice.cpp b/BlockSettleHW/trezor/trezorDevice.cpp index 67108a3aa..659225fe3 100644 --- a/BlockSettleHW/trezor/trezorDevice.cpp +++ b/BlockSettleHW/trezor/trezorDevice.cpp @@ -302,14 +302,16 @@ void TrezorDevice::clearSession() makeCall(message); } -void TrezorDevice::setSupportingTX(const Tx& tx) +void TrezorDevice::setSupportingTXs(const std::vector& txs) { if (!currentTxSignReq_) { logger_->warn("[{}] no current sign TX operation in progress", __func__); return; } - currentTxSignReq_->armorySigner_.addSupportingTx(tx); - logger_->debug("[{}] added supporting TX {}", __func__, tx.getThisHash().toHexStr(true)); + for (const auto& tx : txs) { + currentTxSignReq_->armorySigner_.addSupportingTx(tx); + logger_->debug("[{}] added supporting TX {}", __func__, tx.getThisHash().toHexStr(true)); + } } void TrezorDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX) @@ -317,14 +319,14 @@ void TrezorDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX) currentTxSignReq_ = std::make_unique(reqTX); logger_->debug("[TrezorDevice::signTX] {}", features_->label()); - std::set txHashes; + std::vector txHashes; for (uint32_t i = 0; i < currentTxSignReq_->armorySigner_.getTxInCount(); ++i) { const auto& spender = currentTxSignReq_->armorySigner_.getSpender(i); if (!spender) { logger_->warn("[{}] no spender at {}", __func__, i); continue; } - txHashes.insert(spender->getUtxo().getTxHash()); + txHashes.push_back(spender->getUtxo().getTxHash()); } cb_->needSupportingTXs(key(), txHashes); diff --git a/BlockSettleHW/trezor/trezorDevice.h b/BlockSettleHW/trezor/trezorDevice.h index 2ece48cce..7a8e44d16 100644 --- a/BlockSettleHW/trezor/trezorDevice.h +++ b/BlockSettleHW/trezor/trezorDevice.h @@ -66,7 +66,7 @@ namespace bs { void signTX(const bs::core::wallet::TXSignRequest& reqTX) override; void retrieveXPubRoot() override; - void setSupportingTX(const Tx&) override; + void setSupportingTXs(const std::vector&) override; // Management void setMatrixPin(const SecureBinaryData& pin) override; diff --git a/common b/common index 30d1d48d7..55fbee41e 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 30d1d48d734dd7fc288268e07600573e5e9cf957 +Subproject commit 55fbee41e8c9bf5c690f97e16f5046012983d68d From 6b6f170e0d79be966dbfa4e8821b7a75d901fcdb Mon Sep 17 00:00:00 2001 From: yz Date: Sun, 30 Apr 2023 23:01:42 +0300 Subject: [PATCH 381/436] Import transaction with editing; temporary pdf updates --- GUI/QtQuick/AddressFilterModel.cpp | 11 +-- GUI/QtQuick/QtQuickAdapter.cpp | 53 +++++++++++++-- GUI/QtQuick/QtQuickAdapter.h | 4 +- GUI/QtQuick/TxInputsModel.cpp | 14 ++++ GUI/QtQuick/TxInputsModel.h | 1 + GUI/QtQuick/qml/CreateWallet/WalletSeed.qml | 4 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 67 ++++++++++++------- GUI/QtQuick/qml/Send/SendPopup.qml | 7 ++ GUI/QtQuick/qml/Send/SimpleDetails.qml | 9 +-- .../WalletPropertiesPopup.qml | 2 + .../qml/WalletProperties/WalletSeed.qml | 12 +++- 11 files changed, 138 insertions(+), 46 deletions(-) diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp index 3a200e301..dbcda38a8 100644 --- a/GUI/QtQuick/AddressFilterModel.cpp +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -86,14 +86,17 @@ bool AddressFilterModel::lessThan(const QModelIndex& left, const QModelIndex& ri , QmlAddressListModel::TableRoles::TableDataRole).toDouble(); const auto leftIndex = sourceModel()->data(sourceModel()->index(left.row(), 0) , QmlAddressListModel::TableRoles::AddressTypeRole).toString().remove(0, 2).toInt(); + const auto leftType = sourceModel()->data(sourceModel()->index(left.row(), 0) + , QmlAddressListModel::TableRoles::AddressTypeRole).toString().at(0); const auto rightAmount = sourceModel()->data(sourceModel()->index(right.row(), 2) , QmlAddressListModel::TableRoles::TableDataRole).toDouble(); const auto rightIndex = sourceModel()->data(sourceModel()->index(right.row(), 0) , QmlAddressListModel::TableRoles::AddressTypeRole).toString().remove(0, 2).toInt(); - if (qFuzzyIsNull(leftAmount) != qFuzzyIsNull(rightAmount)) { - return qFuzzyIsNull(rightAmount); - } - return leftIndex < rightIndex; + const auto rightType = sourceModel()->data(sourceModel()->index(right.row(), 0) + , QmlAddressListModel::TableRoles::AddressTypeRole).toString().at(0); + return (!qFuzzyIsNull(leftAmount) && qFuzzyIsNull(rightAmount)) + || (qFuzzyIsNull(leftAmount) == qFuzzyIsNull(rightAmount) && leftIndex < rightIndex) + || (qFuzzyIsNull(leftAmount) == qFuzzyIsNull(rightAmount) && leftIndex == rightIndex && leftType < rightType); } catch (...) {} return false; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index a0afcea06..512b74a38 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2014,6 +2014,7 @@ bs::message::ProcessingResult QtQuickAdapter::processTransactions(bs::message::S std::set inHashes; for (const auto& txData : response.transactions()) { Tx tx(BinaryData::fromString(txData.tx())); + tx.setTxHeight(txData.height()); for (int i = 0; i < tx.getNumTxIn(); ++i) { const auto& in = tx.getTxInCopy(i); @@ -2612,11 +2613,15 @@ bool QtQuickAdapter::broadcastSignedTX(const QUrl& path) bool QtQuickAdapter::isRequestReadyToSend(QTXSignRequest* request) { + if (request == nullptr) { + return false; + } + const auto& walletIds = request->txReq().walletIds; for (const auto& id : walletIds) { bool isInWallets = false; for (const auto [walletId, wallet] : hdWallets_) { - if ((id == walletId || wallet.hasLeaf(id)) && !wallet.watchOnly) { + if ((id == walletId || wallet.hasLeaf(id))) { isInWallets = true; break; } @@ -2628,16 +2633,52 @@ bool QtQuickAdapter::isRequestReadyToSend(QTXSignRequest* request) return true; } -QString QtQuickAdapter::exportPRK() +void QtQuickAdapter::prepareTransactionForEditing(QTXSignRequest* request) +{ + txOutputsModel_->clearOutputs(); + txInputsModel_->clear(); + + const auto& walletIds = request->txReq().walletIds; + for (const auto& id : walletIds) { + for (const auto [walletId, wallet] : hdWallets_) { + if ((id == walletId || wallet.hasLeaf(id))) { + WalletsMessage msg; + auto msgReq = msg.mutable_get_utxos(); + msgReq->set_wallet_id(walletId); + msgReq->set_confirmed_only(false); + pushRequest(user_, userWallets_, msg.SerializeAsString()); + request->setWatchingOnly(wallet.watchOnly); + break; + } + } + } + + const auto addresses = request->outputAddresses(); + const auto values = request->outputAmounts(); + for (auto i = 0; i < addresses.size(); ++i) { + txOutputsModel_->addOutput(addresses[i], values[i].toDouble(), false); + } + + txInputsModel_->setSelection(request->inputsModel()); +} + +QString QtQuickAdapter::exportCurrentWalletPRK() +{ + return exportPRK( + walletPropertiesModel_->walletName(), + walletPropertiesModel_->walletId(), + walletPropertiesModel_->seed()); +} + +QString QtQuickAdapter::exportPRK(const QString & walletName, const QString & walletId, const QStringList & seed) { const auto& path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + QString::fromLatin1("/") - + QString::fromLatin1("BlockSettle_%1_%2.pdf").arg(walletPropertiesModel_->walletId()).arg(walletPropertiesModel_->walletName()); - const auto& seed = walletPropertiesModel_->seed(); + + QString::fromLatin1("BlockSettle_%1_%2.pdf").arg(walletId).arg(walletName); WalletBackupPdfWriter writer( - walletPropertiesModel_->walletId(), + walletId, seed, - QRImageProvider().requestPixmap(walletPropertiesModel_->walletId(), nullptr, QSize(200, 200))); + QRImageProvider().requestPixmap(walletId, nullptr, QSize(200, 200))); writer.write(path); return path; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 9655c5f60..5b937a87a 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -195,7 +195,9 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void exportSignedTX(const QUrl& path, QTXSignRequest* request, const QString& password); Q_INVOKABLE bool broadcastSignedTX(const QUrl& path); Q_INVOKABLE bool isRequestReadyToSend(QTXSignRequest* request); - Q_INVOKABLE QString exportPRK(); + Q_INVOKABLE void prepareTransactionForEditing(QTXSignRequest* request); + Q_INVOKABLE QString exportCurrentWalletPRK(); + Q_INVOKABLE QString exportPRK(const QString& walletName, const QString& walletId, const QStringList& seed); signals: void walletsListChanged(); diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 30d29eb44..e52bd44da 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -514,3 +514,17 @@ void TxInputsModel::clearSelection() emit selectionChanged(); emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); } + +void TxInputsModel::setSelection(TxInputsModel* other) +{ + selectedBalance_ = 0; + for (const auto [address, utxos] : other->utxos_) { + selectionAddresses_.insert(address); + for (const auto& utxo : utxos) { + selectionUtxos_.insert({ utxo.getTxHash(), utxo.getTxOutIndex() }); + selectedBalance_ += utxo.getValue(); + } + } + emit selectionChanged(); + emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); +} diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index e804d1354..e4a15b0a5 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -85,6 +85,7 @@ class TxInputsModel : public QAbstractTableModel void clear(); void addUTXOs(const std::vector&); void setTopBlock(uint32_t topBlock) { topBlock_ = topBlock; } + void setSelection(TxInputsModel* other); struct Entry { bs::Address address; diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml index 9b401b4d0..0cf725b38 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml @@ -65,13 +65,13 @@ ColumnLayout { CustomButton { id: copy_seed_but - text: qsTr("Copy Seed") + text: qsTr("Save PDF") width: BSSizes.applyScale(261) preferred: false function click_enter() { - bsApp.copySeedToClipboard(phrase) + bsApp.exportPRK("New wallet", "", phrase) } } diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 239b78717..097031365 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -27,6 +27,7 @@ ColumnLayout { property var tx: null property bool isRBF: false property bool isCPFP: false + property bool isImported: false property bool is_ready_broadcast: (txOutputsModel.rowCount > 1) && rec_addr_input.input_text.length === 0 && amount_input.input_text.length === 0 property bool is_ready_output: (rec_addr_input.isValid && rec_addr_input.input_text.length && parseFloat(amount_input.input_text) !== 0 && amount_input.input_text.length) @@ -108,13 +109,7 @@ ColumnLayout { selectFolder: false selectExisting: true onAccepted: { - tempRequest = bsApp.importTransaction(importTransactionFileDialog.fileUrl) - if (bsApp.isRequestReadyToSend(tempRequest)) { - sig_continue(tempRequest) - } - else { - import_error() - } + layout.import_transaction(importTransactionFileDialog.fileUrl) } } } @@ -184,7 +179,7 @@ ColumnLayout { border.color: BSStyle.defaultBorderColor border.width: 1 - ColumnLayout { + Column { id: inputs_layout anchors.fill: parent @@ -193,12 +188,13 @@ ColumnLayout { ColumnLayout { width: parent.width - height: parent.height * 0.6 + height: parent.height * 0.7 spacing: 0 RowLayout { id: input_header_layout Layout.fillWidth: true + Layout.fillHeight: false Layout.topMargin: BSSizes.applyScale(16) Layout.preferredHeight: BSSizes.applyScale(19) Layout.alignment: Qt.AlignTop @@ -207,7 +203,7 @@ ColumnLayout { id: inputs_title Layout.leftMargin: BSSizes.applyScale(16) - Layout.fillHeight: true + Layout.fillHeight: false Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter text: qsTr("Inputs") @@ -252,7 +248,7 @@ ColumnLayout { Layout.leftMargin: BSSizes.applyScale(16) Layout.topMargin: BSSizes.applyScale(16) Layout.alignment: Qt.AlignLeft | Qt.AlingTop - visible: !isRBF && !isCPFP + visible: !isRBF && !isCPFP && !isImported width: BSSizes.applyScale(504) height: BSSizes.applyScale(70) @@ -313,11 +309,16 @@ ColumnLayout { } } } + + Item { + Layout.fillWidth: true + Layout.fillHeight: true + } } ColumnLayout { width: parent.width - height: parent.height * 0.4 + height: parent.height * 0.3 spacing: 0 Rectangle { @@ -325,7 +326,6 @@ ColumnLayout { height: BSSizes.applyScale(1) Layout.fillWidth: true - Layout.topMargin: BSSizes.applyScale((!isRBF && !isCPFP) ? 196 : 274) Layout.alignment: Qt.AlignLeft | Qt.AlingTop color: BSStyle.defaultGreyColor @@ -449,7 +449,7 @@ ColumnLayout { border.color: BSStyle.defaultBorderColor border.width: BSSizes.applyScale(1) - ColumnLayout { + Column { id: outputs_layout anchors.fill: parent @@ -458,7 +458,7 @@ ColumnLayout { ColumnLayout { width: parent.width - height: parent.height * 0.6 + height: parent.height * 0.7 spacing: 0 Label { @@ -466,7 +466,7 @@ ColumnLayout { Layout.leftMargin: BSSizes.applyScale(16) Layout.topMargin: BSSizes.applyScale(16) - Layout.alignment: Qt.AlignLeft | Qt.AlingTop + Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter text: qsTr("Outputs") @@ -589,11 +589,16 @@ ColumnLayout { } } } + + Item { + Layout.fillWidth: true + Layout.fillHeight: true + } } ColumnLayout { width: parent.width - height: parent.height * 0.4 + height: parent.height * 0.3 spacing: 0 Rectangle { @@ -601,7 +606,6 @@ ColumnLayout { height: 1 Layout.fillWidth: true - Layout.topMargin: BSSizes.applyScale(30) Layout.alignment: Qt.AlignLeft | Qt.AlingTop color: BSStyle.defaultGreyColor @@ -797,15 +801,28 @@ ColumnLayout { rec_addr_input.input_text = "" checkbox_rbf.checked = true - txOutputsModel.clearOutputs() - if (!isRBF && !isCPFP) { - bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) - } - else { - if (isRBF) { - txOutputsModel.setOutputsFrom(tx) + if (!layout.isImported) { + txOutputsModel.clearOutputs() + if (!isRBF && !isCPFP) { + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) + } + else { + if (isRBF) { + txOutputsModel.setOutputsFrom(tx) + } } } bsApp.requestFeeSuggestions() } + + function import_transaction(path) { + tempRequest = bsApp.importTransaction(path) + if (bsApp.isRequestReadyToSend(tempRequest)) { + layout.isImported = true + bsApp.prepareTransactionForEditing(tempRequest) + } + else { + import_error() + } + } } diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index a22f61479..cb7714d47 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -40,6 +40,11 @@ CustomPopup { failImportDialog.raise() failImportDialog.requestActivate() } + + onSig_advanced_with_import: (path) => { + _stack_view.replace(advanced_details) + advanced_details.import_transaction(path) + } } SignTransaction { @@ -166,6 +171,7 @@ CustomPopup { root.tx = null root.isRBF = false root.isCPFP = false + advanced_details.isImported = false } function open(txId: string, isRBF: bool, isCPFP: bool) @@ -174,6 +180,7 @@ CustomPopup { root.tx = bsApp.getTXDetails(txId) root.isRBF = isRBF root.isCPFP = isCPFP + root.isImported = false advanced_details.init() } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index e3c9b9d3b..e84944837 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -16,6 +16,7 @@ ColumnLayout { signal sig_continue(signature: var) signal sig_advanced() + signal sig_advanced_with_import(path: var) signal import_error() height: BSSizes.applyWindowHeightScale(554) @@ -88,13 +89,7 @@ ColumnLayout { selectFolder: false selectExisting: true onAccepted: { - tempRequest = bsApp.importTransaction(importTransactionFileDialog.fileUrl) - if (bsApp.isRequestReadyToSend(tempRequest)) { - sig_continue(tempRequest) - } - else { - import_error() - } + layout.sig_advanced_with_import(importTransactionFileDialog.fileUrl) } } } diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 78f7329fa..0c5773e2e 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -77,6 +77,8 @@ CustomPopup { visible: false wallet_properties_vm: root.wallet_properties_vm + + onClose: root.close_click() } DeleteWalletWarn { diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml index 35d382e82..d35189a43 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml @@ -9,6 +9,8 @@ import "../StyledControls" ColumnLayout { id: layout + signal close(); + height: BSSizes.applyScale(608) width: BSSizes.applyScale(580) @@ -58,7 +60,8 @@ ColumnLayout { width: BSSizes.applyScale(530) onClicked: { - var printedPath = bsApp.exportPRK() + var printedPath = bsApp.exportCurrentWalletPRK() + successPrintPdf.latestExportPath = printedPath successPrintPdf.details_text = qsTr("PDF successfully saved to ") + printedPath successPrintPdf.show() @@ -70,5 +73,12 @@ ColumnLayout { CustomSuccessDialog { id: successPrintPdf visible: false + + property string latestExportPath + + onSig_finish: { + Qt.openUrlExternally(latestExportPath); + layout.close() + } } } From f3493838bad90909f248e51af4f807c7b6e55adb Mon Sep 17 00:00:00 2001 From: yz Date: Mon, 1 May 2023 10:52:16 +0300 Subject: [PATCH 382/436] Postponing transaction export feature --- GUI/QtQuick/QtQuickAdapter.cpp | 53 +++++-------------- GUI/QtQuick/QtQuickAdapter.h | 5 +- GUI/QtQuick/TxInputsModel.cpp | 14 ----- GUI/QtQuick/TxInputsModel.h | 1 - GUI/QtQuick/qml/CreateWallet/WalletSeed.qml | 2 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 40 ++++++-------- GUI/QtQuick/qml/Send/SendPopup.qml | 7 --- GUI/QtQuick/qml/Send/SimpleDetails.qml | 11 ++-- .../qml/WalletProperties/WalletSeed.qml | 2 +- 9 files changed, 40 insertions(+), 95 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 512b74a38..4325ed6c0 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2014,7 +2014,6 @@ bs::message::ProcessingResult QtQuickAdapter::processTransactions(bs::message::S std::set inHashes; for (const auto& txData : response.transactions()) { Tx tx(BinaryData::fromString(txData.tx())); - tx.setTxHeight(txData.height()); for (int i = 0; i < tx.getNumTxIn(); ++i) { const auto& in = tx.getTxInCopy(i); @@ -2621,7 +2620,7 @@ bool QtQuickAdapter::isRequestReadyToSend(QTXSignRequest* request) for (const auto& id : walletIds) { bool isInWallets = false; for (const auto [walletId, wallet] : hdWallets_) { - if ((id == walletId || wallet.hasLeaf(id))) { + if ((id == walletId || wallet.hasLeaf(id)) && !wallet.watchOnly) { isInWallets = true; break; } @@ -2633,52 +2632,24 @@ bool QtQuickAdapter::isRequestReadyToSend(QTXSignRequest* request) return true; } -void QtQuickAdapter::prepareTransactionForEditing(QTXSignRequest* request) +QString QtQuickAdapter::exportWallet(const QStringList& seed) { - txOutputsModel_->clearOutputs(); - txInputsModel_->clear(); + const auto params = walletInfoFromSeed(seed); + const auto& walletId = params.first; + const auto& walletPrivateRootKey = params.second; - const auto& walletIds = request->txReq().walletIds; - for (const auto& id : walletIds) { - for (const auto [walletId, wallet] : hdWallets_) { - if ((id == walletId || wallet.hasLeaf(id))) { - WalletsMessage msg; - auto msgReq = msg.mutable_get_utxos(); - msgReq->set_wallet_id(walletId); - msgReq->set_confirmed_only(false); - pushRequest(user_, userWallets_, msg.SerializeAsString()); - request->setWatchingOnly(wallet.watchOnly); - break; - } - } - } - - const auto addresses = request->outputAddresses(); - const auto values = request->outputAmounts(); - for (auto i = 0; i < addresses.size(); ++i) { - txOutputsModel_->addOutput(addresses[i], values[i].toDouble(), false); - } - - txInputsModel_->setSelection(request->inputsModel()); -} - -QString QtQuickAdapter::exportCurrentWalletPRK() -{ - return exportPRK( - walletPropertiesModel_->walletName(), - walletPropertiesModel_->walletId(), - walletPropertiesModel_->seed()); -} - -QString QtQuickAdapter::exportPRK(const QString & walletName, const QString & walletId, const QStringList & seed) -{ const auto& path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + QString::fromLatin1("/") - + QString::fromLatin1("BlockSettle_%1_%2.pdf").arg(walletId).arg(walletName); + + QString::fromLatin1("BlockSettle_%1.pdf").arg(walletId); WalletBackupPdfWriter writer( walletId, seed, - QRImageProvider().requestPixmap(walletId, nullptr, QSize(200, 200))); + QRImageProvider().requestPixmap(walletPrivateRootKey, nullptr, QSize(200, 200))); writer.write(path); return path; } + +std::pair QtQuickAdapter::walletInfoFromSeed(const QStringList& seed) +{ + return std::make_pair(QString::fromLatin1("walletId"), QString::fromLatin1("privateRootKey")); +} diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 5b937a87a..08232b15f 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -195,9 +195,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void exportSignedTX(const QUrl& path, QTXSignRequest* request, const QString& password); Q_INVOKABLE bool broadcastSignedTX(const QUrl& path); Q_INVOKABLE bool isRequestReadyToSend(QTXSignRequest* request); - Q_INVOKABLE void prepareTransactionForEditing(QTXSignRequest* request); - Q_INVOKABLE QString exportCurrentWalletPRK(); - Q_INVOKABLE QString exportPRK(const QString& walletName, const QString& walletId, const QStringList& seed); + Q_INVOKABLE QString exportWallet(const QStringList& seed); + std::pair walletInfoFromSeed(const QStringList& seed); signals: void walletsListChanged(); diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index e52bd44da..30d29eb44 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -514,17 +514,3 @@ void TxInputsModel::clearSelection() emit selectionChanged(); emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); } - -void TxInputsModel::setSelection(TxInputsModel* other) -{ - selectedBalance_ = 0; - for (const auto [address, utxos] : other->utxos_) { - selectionAddresses_.insert(address); - for (const auto& utxo : utxos) { - selectionUtxos_.insert({ utxo.getTxHash(), utxo.getTxOutIndex() }); - selectedBalance_ += utxo.getValue(); - } - } - emit selectionChanged(); - emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); -} diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index e4a15b0a5..e804d1354 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -85,7 +85,6 @@ class TxInputsModel : public QAbstractTableModel void clear(); void addUTXOs(const std::vector&); void setTopBlock(uint32_t topBlock) { topBlock_ = topBlock; } - void setSelection(TxInputsModel* other); struct Entry { bs::Address address; diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml index 0cf725b38..3db826c4e 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml @@ -71,7 +71,7 @@ ColumnLayout { preferred: false function click_enter() { - bsApp.exportPRK("New wallet", "", phrase) + bsApp.exportWallet(phrase) } } diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 097031365..e4a053d8b 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -27,7 +27,6 @@ ColumnLayout { property var tx: null property bool isRBF: false property bool isCPFP: false - property bool isImported: false property bool is_ready_broadcast: (txOutputsModel.rowCount > 1) && rec_addr_input.input_text.length === 0 && amount_input.input_text.length === 0 property bool is_ready_output: (rec_addr_input.isValid && rec_addr_input.input_text.length && parseFloat(amount_input.input_text) !== 0 && amount_input.input_text.length) @@ -109,7 +108,13 @@ ColumnLayout { selectFolder: false selectExisting: true onAccepted: { - layout.import_transaction(importTransactionFileDialog.fileUrl) + tempRequest = bsApp.importTransaction(importTransactionFileDialog.fileUrl) + if (bsApp.isRequestReadyToSend(tempRequest)) { + sig_continue(tempRequest) + } + else { + import_error() + } } } } @@ -248,7 +253,7 @@ ColumnLayout { Layout.leftMargin: BSSizes.applyScale(16) Layout.topMargin: BSSizes.applyScale(16) Layout.alignment: Qt.AlignLeft | Qt.AlingTop - visible: !isRBF && !isCPFP && !isImported + visible: !isRBF && !isCPFP width: BSSizes.applyScale(504) height: BSSizes.applyScale(70) @@ -800,29 +805,16 @@ ColumnLayout { comment_input.input_text = "" rec_addr_input.input_text = "" checkbox_rbf.checked = true - - if (!layout.isImported) { - txOutputsModel.clearOutputs() - if (!isRBF && !isCPFP) { - bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) - } - else { - if (isRBF) { - txOutputsModel.setOutputsFrom(tx) - } - } - } - bsApp.requestFeeSuggestions() - } - - function import_transaction(path) { - tempRequest = bsApp.importTransaction(path) - if (bsApp.isRequestReadyToSend(tempRequest)) { - layout.isImported = true - bsApp.prepareTransactionForEditing(tempRequest) + + txOutputsModel.clearOutputs() + if (!isRBF && !isCPFP) { + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) } else { - import_error() + if (isRBF) { + txOutputsModel.setOutputsFrom(tx) + } } + bsApp.requestFeeSuggestions() } } diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index cb7714d47..a22f61479 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -40,11 +40,6 @@ CustomPopup { failImportDialog.raise() failImportDialog.requestActivate() } - - onSig_advanced_with_import: (path) => { - _stack_view.replace(advanced_details) - advanced_details.import_transaction(path) - } } SignTransaction { @@ -171,7 +166,6 @@ CustomPopup { root.tx = null root.isRBF = false root.isCPFP = false - advanced_details.isImported = false } function open(txId: string, isRBF: bool, isCPFP: bool) @@ -180,7 +174,6 @@ CustomPopup { root.tx = bsApp.getTXDetails(txId) root.isRBF = isRBF root.isCPFP = isCPFP - root.isImported = false advanced_details.init() } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index e84944837..9f4fda693 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -16,7 +16,6 @@ ColumnLayout { signal sig_continue(signature: var) signal sig_advanced() - signal sig_advanced_with_import(path: var) signal import_error() height: BSSizes.applyWindowHeightScale(554) @@ -88,8 +87,14 @@ ColumnLayout { folder: shortcuts.documents selectFolder: false selectExisting: true - onAccepted: { - layout.sig_advanced_with_import(importTransactionFileDialog.fileUrl) + onAccepted: { + tempRequest = bsApp.importTransaction(importTransactionFileDialog.fileUrl) + if (bsApp.isRequestReadyToSend(tempRequest)) { + sig_continue(tempRequest) + } + else { + import_error() + } } } } diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml index d35189a43..5dbb5d985 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml @@ -60,7 +60,7 @@ ColumnLayout { width: BSSizes.applyScale(530) onClicked: { - var printedPath = bsApp.exportCurrentWalletPRK() + var printedPath = bsApp.exportWallet(wallet_properties_vm.seed) successPrintPdf.latestExportPath = printedPath successPrintPdf.details_text = qsTr("PDF successfully saved to ") + printedPath From ff87de14be9a7a1baccf0e2ae89b6da3c31940d6 Mon Sep 17 00:00:00 2001 From: yz Date: Mon, 1 May 2023 20:45:56 +0300 Subject: [PATCH 383/436] Upated message dialog; rescan wallet; save pdf button state --- GUI/QtQuick/QtQuickAdapter.cpp | 5 + GUI/QtQuick/QtQuickAdapter.h | 1 + GUI/QtQuick/qml/BsStyles/BSStyle.qml | 2 + .../qml/CreateWallet/ConfirmPassword.qml | 2 +- GUI/QtQuick/qml/CreateWallet/WalletSeed.qml | 19 ++- GUI/QtQuick/qml/Send/SimpleDetails.qml | 2 +- .../StyledControls/CustomMessageDialog.qml | 122 ++++++++++-------- .../WalletPropertiesPopup.qml | 41 +++++- GUI/QtQuick/qml/main.qml | 2 + 9 files changed, 139 insertions(+), 57 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 4325ed6c0..78d15f2c3 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2365,6 +2365,11 @@ int QtQuickAdapter::rescanWallet(const QString& walletId) WalletsMessage msg; msg.set_wallet_rescan(walletId.toStdString()); const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); + + QTimer::singleShot(5000, [this]() { + emit rescanCompleted(); + }); + return (msgId == 0) ? -1 : 0; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 08232b15f..f4ef75d13 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -226,6 +226,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void successTx(); void failedTx(const QString&); void showSuccess(const QString&); + void rescanCompleted(); private slots: void onArmoryServerChanged(const QModelIndex&, const QVariant&); diff --git a/GUI/QtQuick/qml/BsStyles/BSStyle.qml b/GUI/QtQuick/qml/BsStyles/BSStyle.qml index 139fddde0..157cf55da 100644 --- a/GUI/QtQuick/qml/BsStyles/BSStyle.qml +++ b/GUI/QtQuick/qml/BsStyles/BSStyle.qml @@ -146,4 +146,6 @@ QtObject { readonly property color exportWalletLabelNameColor: "#45A6FF" readonly property color smallButtonBackgroundColor: "#020817" + + readonly property color loadingPanelBackgroundColor: "#AA191E2A" } diff --git a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml index 7bd75f551..5e99392cd 100644 --- a/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml +++ b/GUI/QtQuick/qml/CreateWallet/ConfirmPassword.qml @@ -152,7 +152,7 @@ ColumnLayout { function click_enter() { if (!confirm_but.enabled) return - if(password.input_text === confirm_password.input_text) + if(password.input_text === confirm_password.input_text && checkPasswordLength()) { bsApp.createWallet(layout.wallet_name, phrase, password.input_text) layout.sig_confirm() diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml index 3db826c4e..8f972b7a1 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml @@ -67,11 +67,29 @@ ColumnLayout { id: copy_seed_but text: qsTr("Save PDF") width: BSSizes.applyScale(261) + + icon.height: BSSizes.applyScale(12) + icon.width: BSSizes.applyScale(12) preferred: false function click_enter() { bsApp.exportWallet(phrase) + copy_seed_but.text = qsTr("Saved to Documents") + copy_seed_but.icon.source = "qrc:/images/check.svg" + savingEndTimer.start() + } + + Timer { + id: savingEndTimer + interval: 5000 + repeat: false + running: false + + onTriggered: { + copy_seed_but.text = qsTr("Save PDF") + copy_seed_but.icon.source = "" + } } } @@ -85,7 +103,6 @@ ColumnLayout { function click_enter() { layout.sig_continue() } - } } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 9f4fda693..e3c9b9d3b 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -87,7 +87,7 @@ ColumnLayout { folder: shortcuts.documents selectFolder: false selectExisting: true - onAccepted: { + onAccepted: { tempRequest = bsApp.importTransaction(importTransactionFileDialog.fileUrl) if (bsApp.isRequestReadyToSend(tempRequest)) { sig_continue(tempRequest) diff --git a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml index 99c1a21aa..d2cc679dc 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomMessageDialog.qml @@ -5,28 +5,24 @@ import QtQuick.Layouts 1.15 import "../BsStyles" -Window { +Window { id: root - property alias error: errorLabel.text + property alias header: title.text + property alias error: details.text + property alias action: finish_but.text visible: true flags: Qt.WindowCloseButtonHint | Qt.FramelessWindowHint | Qt.Dialog modality: Qt.WindowModal - maximumHeight: BSSizes.applyScale(200) - maximumWidth: BSSizes.applyScale(300) - - minimumHeight: BSSizes.applyScale(200) - minimumWidth: BSSizes.applyScale(300) - - height: BSSizes.applyScale(250) - width: BSSizes.applyScale(300) + height: BSSizes.applyScale(375) + width: BSSizes.applyScale(380) color: "transparent" - x: mainWindow.x + (mainWindow.width - width) / 2 - y: mainWindow.y + (mainWindow.height - height) / 2 + x: mainWindow.x + (mainWindow.width - width)/2 + y: mainWindow.y + (mainWindow.height - height)/2 Rectangle { id: rect @@ -40,61 +36,81 @@ Window { border.color : BSStyle.defaultBorderColor border.width : BSSizes.applyScale(1) - Label { - id: tytleLabel + Image { + id: close_button - anchors.top: rect.top - anchors.topMargin: BSSizes.applyScale(16) - anchors.horizontalCenter: rect.horizontalCenter - - color: "#E2E7FF" - font.pixelSize: BSSizes.applyScale(20) - font.family: "Roboto" - font.weight: Font.Medium + anchors.top: parent.top + anchors.topMargin: BSSizes.applyScale(20) + anchors.right: parent.right + anchors.rightMargin: BSSizes.applyScale(22) + + source: "qrc:/images/close_button.svg" + width: BSSizes.applyScale(16) + height: BSSizes.applyScale(16) + MouseArea { + anchors.fill: parent + onClicked: { + root.close() + } + } + } - text: "Error" + ColumnLayout { + id: layout + + anchors.fill: parent + + CustomTitleLabel { + Layout.topMargin: BSSizes.applyScale(36) + id: title + Layout.alignment: Qt.AlignCenter + Layout.preferredHeight : title.height + } - horizontalAlignment: Text.AlignHCenter - } + Image { + Layout.topMargin: BSSizes.applyScale(24) + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.preferredHeight : BSSizes.applyScale(120) + Layout.preferredWidth : BSSizes.applyScale(120) - Label { - id: errorLabel + source: "qrc:/images/try_icon.png" + width: BSSizes.applyScale(120) + height: BSSizes.applyScale(120) + } - anchors.top: tytleLabel.bottom - anchors.topMargin: BSSizes.applyScale(20) - anchors.horizontalCenter: rect.horizontalCenter - color: "#E2E7FF" - font.pixelSize: BSSizes.applyScale(16) - font.family: "Roboto" - font.weight: Font.Medium + Label { + id: details - text: "Test Description" + Layout.topMargin: BSSizes.applyScale(16) + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + font.pixelSize: BSSizes.applyScale(14) + font.family: "Roboto" + font.weight: Font.Normal + color: "#E2E7FF" + } - horizontalAlignment: Text.AlignHCenter - width: ApplicationWindow.width - BSSizes.applyScale(10); - wrapMode: Label.WordWrap - } + Label { + Layout.fillWidth: true + Layout.fillHeight: true + } - CustomButton { - id: ok_but - text: qsTr("Ok") + CustomButton { + id: finish_but + text: qsTr("OK") - anchors.bottom: rect.bottom - anchors.bottomMargin: BSSizes.applyScale(24) - anchors.horizontalCenter: rect.horizontalCenter + width: BSSizes.applyScale(186) - width: BSSizes.applyScale(250) - height: BSSizes.applyScale(40) + Layout.bottomMargin: BSSizes.applyScale(40) + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter - preferred: true - focus:true + preferred: true + focus:true - function click_enter() { - root.close() + function click_enter() { + root.close() + } } } } - } - diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 0c5773e2e..5a6d710ea 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -390,7 +390,10 @@ CustomPopup { icon_add_source: "qrc:/images/arrow.png" title_text: qsTr("Rescan wallet") - onClicked: bsApp.rescanWallet(wallet_properties_vm.walletId) + onClicked: { + rescanWalletBlockingPanel.visible = true + bsApp.rescanWallet(wallet_properties_vm.walletId) + } } CustomListItem { @@ -406,6 +409,42 @@ CustomPopup { } } + Rectangle { + id: rescanWalletBlockingPanel + anchors.fill: parent + visible: false + color: BSStyle.loadingPanelBackgroundColor + + Column { + anchors.centerIn: parent + + BusyIndicator { + running: true + palette.dark: BSStyle.wildBlueColor + } + + } + + MouseArea { + anchors.fill: parent + } + } + + CustomSuccessDialog { + id: messageDialog + details_text: qsTr("Rescan wallet completed") + visible: false + } + + Connections { + target: bsApp + + function onRescanCompleted() { + rescanWalletBlockingPanel.visible = false + messageDialog.show() + } + } + function show_popup(success_) { success_dialog.details_text = success_ diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 033b97c88..5497c1268 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -92,6 +92,8 @@ ApplicationWindow { CustomMessageDialog { id: error_dialog + header: qsTr("Error") + action: qsTr("OK") visible: false } From f4cddfe5ae31c6fe87a65f8185b68aceb237440c Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 2 May 2023 22:35:28 +0300 Subject: [PATCH 384/436] Wallet rescan fixes --- Core/SignerAdapter.cpp | 11 +++- GUI/QtQuick/QtQuickAdapter.cpp | 101 +++++++++++++++++++++++++-------- GUI/QtQuick/QtQuickAdapter.h | 7 ++- GUI/QtQuick/TxListModel.cpp | 2 +- common | 2 +- 5 files changed, 94 insertions(+), 29 deletions(-) diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index afa0d9825..8f637aaae 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -548,11 +548,13 @@ ProcessingResult SignerAdapter::processSignTx(const bs::message::Envelope& env pushResponse(user_, env, msg.SerializeAsString()); }; const auto& txReq = bs::signer::pbTxRequestToCore(request.tx_request(), logger_); + logger_->debug("[{}] ({} wallet id[s])", __func__, txReq.walletIds.size()); bs::core::WalletsManager::HDWalletPtr hdWallet; if ((txReq.walletIds.size() == 1)) { hdWallet = walletsMgr_->getHDWalletById(txReq.walletIds.at(0)); if (hdWallet) { if (!hdWallet->isHardwareWallet()) { + logger_->warn("[{}] {} not a hardware wallet", __func__, txReq.walletIds.at(0)); hdWallet.reset(); } } @@ -567,6 +569,10 @@ ProcessingResult SignerAdapter::processSignTx(const bs::message::Envelope& env auto msgResp = msg.mutable_sign_tx_response(); try { const auto& signedTX = hdWallet->signTXRequestWithWallet(txReq); + if (signedTX.empty()) { + throw std::runtime_error("signer returned empty TX"); + } + logger_->debug("[{}] signed TX: {}", __func__, signedTX.toHexStr()); msgResp->set_signed_tx(signedTX.toBinStr()); } catch (const std::exception& e) { @@ -576,6 +582,7 @@ ProcessingResult SignerAdapter::processSignTx(const bs::message::Envelope& env pushResponse(user_, env, msg.SerializeAsString()); } else { + logger_->debug("[{}] multi-leaf signing ({} leaves)", __func__, txReq.walletIds.size()); passphrase_ = SecureBinaryData::fromString(request.passphrase()); signer_->signTXRequest(txReq, cbSigned , static_cast(request.sign_mode()) @@ -863,13 +870,13 @@ bs::message::ProcessingResult SignerAdapter::processImportWoWallet(const bs::mes catch (const std::exception& e) { logger_->error("[{}] failed to copy {} to wallets dir {}: {}", __func__ , filename, walletsDir_, e.what()); - msgResp->set_error_msg("failed to copy"); + msgResp->set_error_msg("failed to copy " + fn); pushResponse(user_, env, msg.SerializeAsString()); return bs::message::ProcessingResult::Error; } const auto& wallet = signer_->importWoWallet(netType_, targetFile); if (!wallet) { - msgResp->set_error_msg("failed to import"); + msgResp->set_error_msg("failed to import " + fn); pushResponse(user_, env, msg.SerializeAsString()); return bs::message::ProcessingResult::Error; } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 78d15f2c3..b9987e007 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "ArmoryServersModel.h" #include "bip39/bip39.h" @@ -61,6 +62,7 @@ using namespace BlockSettle; using namespace BlockSettle::Common; using namespace BlockSettle::Terminal; using namespace bs::message; +using json = nlohmann::json; namespace { @@ -355,6 +357,9 @@ QStringList QtQuickAdapter::txWalletsList() const ProcessingResult QtQuickAdapter::process(const Envelope &env) { + if (env.isRequest() && (env.sender->value() == user_->value())) { + return processOwnRequest(env); + } if (std::dynamic_pointer_cast(env.sender)) { switch (env.sender->value()) { case TerminalUsers::Settings: @@ -370,7 +375,6 @@ ProcessingResult QtQuickAdapter::process(const Envelope &env) default: break; } } - return ProcessingResult::Ignored; } @@ -648,11 +652,16 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) case SignerMessage::kWalletDeleted: return processWalletDeleted(msg.wallet_deleted()); case SignerMessage::kCreatedWallet: - createdWalletId_ = msg.created_wallet().wallet_id(); - walletBalances_->clear(); - addrModel_->reset(createdWalletId_); - walletBalances_->setCreatedWalletId(createdWalletId_); - emit showSuccess(tr("Your wallet has successfully been created")); + if (msg.created_wallet().error_msg().empty()) { + createdWalletId_ = msg.created_wallet().wallet_id(); + walletBalances_->clear(); + addrModel_->reset(createdWalletId_); + walletBalances_->setCreatedWalletId(createdWalletId_); + emit showSuccess(tr("Your wallet has successfully been created")); + } + else { + emit showError(QString::fromStdString(msg.created_wallet().error_msg())); + } break; case SignerMessage::kWalletPassChanged: if (!msg.wallet_pass_changed()) { @@ -792,6 +801,16 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) case WalletsMessage::kReservedUtxos: return processReservedUTXOs(msg.reserved_utxos()); case WalletsMessage::kWalletChanged: + if (scanningWallets_.find(msg.wallet_changed()) != scanningWallets_.end()) { + scanningWallets_.erase(msg.wallet_changed()); + emit rescanCompleted(QString::fromStdString(msg.wallet_changed())); + } + { //TODO: remove temporary code + if (!scanningWallets_.empty()) { + emit rescanCompleted(QString::fromStdString(*scanningWallets_.cbegin())); + scanningWallets_.clear(); + } + } if (walletsReady_) { logger_->debug("ledger entries"); WalletsMessage msg; @@ -836,6 +855,26 @@ bs::message::ProcessingResult QtQuickAdapter::processHWW(const bs::message::Enve return bs::message::ProcessingResult::Ignored; } +bs::message::ProcessingResult QtQuickAdapter::processOwnRequest(const bs::message::Envelope& env) +{ + try { + const auto& msg = json::parse(env.message); + if (msg.contains("hw_wallet_timeout")) { + const auto& walletId = msg["hw_wallet_timeout"].get(); + if (readyWallets_.find(walletId) == readyWallets_.end()) { + emit showError(tr("Wallet %1 ready timeout - please connect the device") + .arg(QString::fromStdString(walletId))); + return bs::message::ProcessingResult::Success; + } + } + } + catch (const json::exception& e) { + logger_->error("[{}] failed to parse {}: {}", env.message, e.what()); + return bs::message::ProcessingResult::Error; + } + return bs::message::ProcessingResult::Ignored; +} + void QtQuickAdapter::updateStates() { //TODO @@ -1381,20 +1420,24 @@ void QtQuickAdapter::copySeedToClipboard(const QStringList& seed) QGuiApplication::clipboard()->setText(str); } -void QtQuickAdapter::createWallet(const QString& name, const QStringList& seed - , const QString& password) +SecureBinaryData binSeedFromWords(const QStringList& seed) { - const auto walletName = name.isEmpty() ? generateWalletName() : name.toStdString(); - logger_->debug("[{}] {}", __func__, walletName); BIP39::word_list words; for (const auto& w : seed) { words.add(w.toStdString()); } + return BIP39::seed_from_mnemonic(words); +} + +void QtQuickAdapter::createWallet(const QString& name, const QStringList& seed + , const QString& password) +{ + const auto walletName = name.isEmpty() ? generateWalletName() : name.toStdString(); + logger_->debug("[{}] {}", __func__, walletName); SignerMessage msg; auto msgReq = msg.mutable_create_wallet(); msgReq->set_name(walletName); - //msgReq->set_xpriv_key(seedData.xpriv); - const auto binSeed = BIP39::seed_from_mnemonic(words); + const auto& binSeed = binSeedFromWords(seed); msgReq->set_seed(binSeed.toBinStr()); msgReq->set_password(password.toStdString()); pushRequest(user_, userSigner_, msg.SerializeAsString()); @@ -2121,10 +2164,15 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq qReq->setHWW(true); logger_->debug("[{}] noReqAmt: {} for {}", __func__, noReqAmount, walletId); if (!noReqAmount) { + readyWallets_.erase(walletId); HW::DeviceMgrMessage msg; msg.set_prepare_wallet_for_tx_sign(walletId); pushRequest(user_, userHWW_, msg.SerializeAsString()); hwwReady_[walletId] = qReq; + + const json msgTO{ {"hw_wallet_timeout", walletId} }; + pushRequest(user_, user_, msgTO.dump() + , bs::message::bus_clock::now() + std::chrono::seconds{15}); } } else if (wallet.watchOnly) { @@ -2222,7 +2270,7 @@ bs::message::ProcessingResult QtQuickAdapter::processHWDevices(const HW::DeviceM HW::DeviceMgrMessage msg; msg.mutable_startscan(); pushRequest(user_, userHWW_, msg.SerializeAsString() - , bs::message::bus_clock::now() + std::chrono::seconds{ 1 }); + , bs::message::bus_clock::now() + std::chrono::seconds{ 3 }); } else { hwDevicesPolling_ = false; @@ -2236,12 +2284,19 @@ bs::message::ProcessingResult QtQuickAdapter::processHWDevices(const HW::DeviceM bs::message::ProcessingResult QtQuickAdapter::processHWWready(const std::string& walletId) { - logger_->debug("[{}] wallet {}", __func__, walletId); const auto& it = hwwReady_.find(walletId); if (it == hwwReady_.end()) { + logger_->debug("[{}] wallet {} - ignored", __func__, walletId); return bs::message::ProcessingResult::Ignored; } + logger_->debug("[{}] wallet {}", __func__, walletId); + readyWallets_.insert(walletId); it->second->setHWWready(); + { + HW::DeviceMgrMessage msg; + *msg.mutable_sign_tx() = bs::signer::coreTxRequestToPb(it->second->txReq()); + pushRequest(user_, userHWW_, msg.SerializeAsString()); + } hwwReady_.erase(it); return bs::message::ProcessingResult::Success; } @@ -2312,9 +2367,9 @@ void QtQuickAdapter::signAndBroadcast(QTXSignRequest* txReq, const QString& pass auto txSignReq = txReq->txReq(); logger_->debug("[{}] HW sign: {}", __func__, txReq->isHWW()); if (txReq->isHWW()) { - HW::DeviceMgrMessage msg; +/* HW::DeviceMgrMessage msg; //FIXME *msg.mutable_sign_tx() = bs::signer::coreTxRequestToPb(txSignReq); - pushRequest(user_, userHWW_, msg.SerializeAsString()); + pushRequest(user_, userHWW_, msg.SerializeAsString());*/ } else { SignerMessage msg; @@ -2362,14 +2417,10 @@ qtquick_gui::WalletPropertiesVM* QtQuickAdapter::walletProperitesVM() const int QtQuickAdapter::rescanWallet(const QString& walletId) { logger_->debug("[{}] {}", __func__, walletId.toStdString()); + scanningWallets_.insert(walletId.toStdString()); WalletsMessage msg; msg.set_wallet_rescan(walletId.toStdString()); const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); - - QTimer::singleShot(5000, [this]() { - emit rescanCompleted(); - }); - return (msgId == 0) ? -1 : 0; } @@ -2654,7 +2705,11 @@ QString QtQuickAdapter::exportWallet(const QStringList& seed) return path; } -std::pair QtQuickAdapter::walletInfoFromSeed(const QStringList& seed) +std::pair QtQuickAdapter::walletInfoFromSeed(const QStringList& bip39Seed) { - return std::make_pair(QString::fromLatin1("walletId"), QString::fromLatin1("privateRootKey")); + const auto& binSeed = binSeedFromWords(bip39Seed); + const bs::core::wallet::Seed seed(binSeed, netType_); + const auto& rootNode = seed.getNode(); + return { QString::fromStdString(seed.getWalletId()) + , QString::fromStdString(rootNode.getBase58().toBinStr()) }; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index f4ef75d13..f54dccec3 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -226,7 +226,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void successTx(); void failedTx(const QString&); void showSuccess(const QString&); - void rescanCompleted(); + void rescanCompleted(const QString& walletId); private slots: void onArmoryServerChanged(const QModelIndex&, const QVariant&); @@ -243,6 +243,7 @@ private slots: bs::message::ProcessingResult processSigner(const bs::message::Envelope &); bs::message::ProcessingResult processWallets(const bs::message::Envelope &); bs::message::ProcessingResult processHWW(const bs::message::Envelope&); + bs::message::ProcessingResult processOwnRequest(const bs::message::Envelope&); void requestInitialSettings(); void requestPostLoadingSettings(); @@ -310,7 +311,9 @@ private slots: int signerState_{ -1 }; std::string signerDetails_; bool walletsReady_{ false }; - std::string createdWalletId_; + std::unordered_set readyWallets_; + std::unordered_set scanningWallets_; + std::string createdWalletId_; std::unordered_map hdWallets_; std::unordered_map walletNames_; diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 97aca6ba8..f39dd20f5 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -223,7 +223,7 @@ void TxListModel::addRows(const std::vector& entries) } } if (row != -1) { - logger_->debug("[{}] updating entry #{} {}", __func__, row, entry.txHash.toHexStr(true)); + //logger_->debug("[{}] updating entry #{} {}", __func__, row, entry.txHash.toHexStr(true)); emit dataChanged(createIndex(row, 0), createIndex(row, 0)); } else { diff --git a/common b/common index 55fbee41e..1ee4ff49b 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 55fbee41e8c9bf5c690f97e16f5046012983d68d +Subproject commit 1ee4ff49b8e33a59375b0d5a531baf7780cde139 From b13d81871169ffb0460a201e36939ca488e9027b Mon Sep 17 00:00:00 2001 From: yz Date: Wed, 3 May 2023 10:17:36 +0300 Subject: [PATCH 385/436] PDF export updates; connection indicator --- GUI/QtQuick/PaperBackupWriter.cpp | 6 +-- GUI/QtQuick/QtQuickAdapter.cpp | 16 +++++--- GUI/QtQuick/QtQuickAdapter.h | 3 +- GUI/QtQuick/ScaleController.cpp | 14 +++---- GUI/QtQuick/qml/CreateWallet/WalletSeed.qml | 37 +++++++++---------- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 3 +- GUI/QtQuick/qml/Send/SimpleDetails.qml | 3 +- .../WalletPropertiesPopup.qml | 2 +- .../qml/WalletProperties/WalletSeed.qml | 36 ++++++++---------- GUI/QtQuick/qml/main.qml | 37 +++++++++++++++++-- 10 files changed, 94 insertions(+), 63 deletions(-) diff --git a/GUI/QtQuick/PaperBackupWriter.cpp b/GUI/QtQuick/PaperBackupWriter.cpp index 7857db9c7..8eccae4aa 100644 --- a/GUI/QtQuick/PaperBackupWriter.cpp +++ b/GUI/QtQuick/PaperBackupWriter.cpp @@ -138,9 +138,9 @@ void WalletBackupPdfWriter::draw(QPainter &p, qreal width, qreal height) const auto topLeftY = 2415; const auto deltaX = 480; const auto deltaY = 93; - for (auto i = 0; i < 3; ++i) { - for (auto j = 0; j < seed_.size() / 3; ++j) { - p.drawText(QPointF((topLeftX + i * deltaX) * relWidth, (topLeftY + j * deltaY) * relHeight), seed_.at(i * 3 + j)); + for (auto i = 0; i < seed_.size() / 3; ++i) { + for (auto j = 0; j < 3; ++j) { + p.drawText(QPointF((topLeftX + j * deltaX) * relWidth, (topLeftY + i * deltaY) * relHeight), seed_.at(i * 3 + j)); } } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index b9987e007..56fd7f999 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2688,21 +2688,27 @@ bool QtQuickAdapter::isRequestReadyToSend(QTXSignRequest* request) return true; } -QString QtQuickAdapter::exportWallet(const QStringList& seed) +QString QtQuickAdapter::makeExportWalletToPdfPath(const QStringList& seed) { const auto params = walletInfoFromSeed(seed); const auto& walletId = params.first; - const auto& walletPrivateRootKey = params.second; - const auto& path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + QString::fromLatin1("/") + QString::fromLatin1("BlockSettle_%1.pdf").arg(walletId); +} + +void QtQuickAdapter::exportWalletToPdf(const QUrl& path, const QStringList& seed) +{ + const auto params = walletInfoFromSeed(seed); + const auto& walletId = params.first; + const auto& walletPrivateRootKey = params.second; + WalletBackupPdfWriter writer( walletId, seed, QRImageProvider().requestPixmap(walletPrivateRootKey, nullptr, QSize(200, 200))); - writer.write(path); - return path; + writer.write(path.toLocalFile()); } std::pair QtQuickAdapter::walletInfoFromSeed(const QStringList& bip39Seed) diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index f54dccec3..4494077f2 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -195,7 +195,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void exportSignedTX(const QUrl& path, QTXSignRequest* request, const QString& password); Q_INVOKABLE bool broadcastSignedTX(const QUrl& path); Q_INVOKABLE bool isRequestReadyToSend(QTXSignRequest* request); - Q_INVOKABLE QString exportWallet(const QStringList& seed); + Q_INVOKABLE QString makeExportWalletToPdfPath(const QStringList& seed); + Q_INVOKABLE void exportWalletToPdf(const QUrl& path, const QStringList& seed); std::pair walletInfoFromSeed(const QStringList& seed); signals: diff --git a/GUI/QtQuick/ScaleController.cpp b/GUI/QtQuick/ScaleController.cpp index bf5a94e76..68e1bf93d 100644 --- a/GUI/QtQuick/ScaleController.cpp +++ b/GUI/QtQuick/ScaleController.cpp @@ -30,12 +30,12 @@ void ScaleController::update() const auto screen = QGuiApplication::screens()[QApplication::desktop()->screenNumber(QApplication::activeWindow())]; connect(screen, &QScreen::logicalDotsPerInchChanged, this, &ScaleController::update); - qreal dpi = screen->logicalDotsPerInch(); - scaleRatio_ = dpi / defaultDpi; - QRect rect = screen->geometry(); - screenWidth_ = rect.width(); - screenHeight_ = rect.height(); - - emit changed(); + qreal scaleRatio = screen->logicalDotsPerInch() / defaultDpi; + if (scaleRatio_ != scaleRatio || screenWidth_ != rect.width() || screenHeight_ != rect.height()) { + scaleRatio_ = scaleRatio; + screenWidth_ = rect.width(); + screenHeight_ = rect.height(); + emit changed(); + } } diff --git a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml index 8f972b7a1..4e7b32cda 100644 --- a/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml +++ b/GUI/QtQuick/qml/CreateWallet/WalletSeed.qml @@ -2,6 +2,7 @@ import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 +import Qt.labs.platform 1.1 as QLP import "../BsStyles" import "../StyledControls" @@ -62,34 +63,30 @@ ColumnLayout { //Layout.leftMargin: 24 Layout.bottomMargin: BSSizes.applyScale(40) Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + + QLP.FileDialog { + id: exportFileDialog + title: qsTr("Please choose folder to export pdf") + folder: QLP.StandardPaths.writableLocation(QLP.StandardPaths.DocumentsLocation) + defaultSuffix: "pdf" + fileMode: QLP.FileDialog.SaveFile + onAccepted: { + bsApp.exportWalletToPdf(exportFileDialog.currentFile, phrase) + Qt.openUrlExternally(exportFileDialog.currentFile); + } + } CustomButton { id: copy_seed_but - text: qsTr("Save PDF") + text: qsTr("Export PDF") width: BSSizes.applyScale(261) - - icon.height: BSSizes.applyScale(12) - icon.width: BSSizes.applyScale(12) preferred: false function click_enter() { - bsApp.exportWallet(phrase) - copy_seed_but.text = qsTr("Saved to Documents") - copy_seed_but.icon.source = "qrc:/images/check.svg" - savingEndTimer.start() - } - - Timer { - id: savingEndTimer - interval: 5000 - repeat: false - running: false - - onTriggered: { - copy_seed_but.text = qsTr("Save PDF") - copy_seed_but.icon.source = "" - } + exportFileDialog.currentFile = "file:///" + bsApp.makeExportWalletToPdfPath(phrase) + exportFileDialog.open() } } diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index e4a053d8b..efaaae514 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -662,6 +662,7 @@ ColumnLayout { title: qsTr("Please choose folder to export transaction") defaultSuffix: "bin" fileMode: QLP.FileDialog.SaveFile + folder: QLP.StandardPaths.writableLocation(QLP.StandardPaths.DocumentsLocation) onAccepted: { bsApp.exportTransaction(exportFileDialog.currentFile, continue_but.prepare_transaction()) } @@ -721,7 +722,7 @@ ColumnLayout { if (tempRequest.isWatchingOnly) { - exportFileDialog.currentFile = "file:////" + bsApp.makeExportTransactionFilename(tempRequest) + exportFileDialog.currentFile = "file:///" + bsApp.makeExportTransactionFilename(tempRequest) exportFileDialog.open() } else diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index e3c9b9d3b..4d8567634 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -253,6 +253,7 @@ ColumnLayout { id: exportFileDialog title: qsTr("Please choose folder to export transaction") defaultSuffix: "bin" + folder: QLP.StandardPaths.writableLocation(QLP.StandardPaths.DocumentsLocation) fileMode: QLP.FileDialog.SaveFile onAccepted: { bsApp.exportTransaction(exportFileDialog.currentFile, continue_but.prepare_transaction()) @@ -290,7 +291,7 @@ ColumnLayout { if (tempRequest.isWatchingOnly) { - exportFileDialog.currentFile = "file:////" + bsApp.makeExportTransactionFilename(tempRequest) + exportFileDialog.currentFile = "file:///" + bsApp.makeExportTransactionFilename(tempRequest) exportFileDialog.open() } else diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index 5a6d710ea..e1a6aab78 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -432,7 +432,7 @@ CustomPopup { CustomSuccessDialog { id: messageDialog - details_text: qsTr("Rescan wallet completed") + details_text: qsTr("Rescan successful") visible: false } diff --git a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml index 5dbb5d985..c5b891f08 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletSeed.qml @@ -2,6 +2,7 @@ import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.15 +import Qt.labs.platform 1.1 as QLP import "../BsStyles" import "../StyledControls" @@ -49,9 +50,21 @@ ColumnLayout { } } + QLP.FileDialog { + id: exportFileDialog + title: qsTr("Please choose folder to export transaction") + defaultSuffix: "pdf" + fileMode: QLP.FileDialog.SaveFile + folder: QLP.StandardPaths.writableLocation(QLP.StandardPaths.DocumentsLocation) + onAccepted: { + var exportPath = bsApp.exportWalletToPdf(exportFileDialog.currentFile, wallet_properties_vm.seed) + Qt.openUrlExternally(exportFileDialog.currentFile); + } + } + CustomButton { id: confirm_but - text: qsTr("Save PDF") + text: qsTr("Export PDF") preferred: true Layout.bottomMargin: BSSizes.applyScale(40) @@ -60,25 +73,8 @@ ColumnLayout { width: BSSizes.applyScale(530) onClicked: { - var printedPath = bsApp.exportWallet(wallet_properties_vm.seed) - successPrintPdf.latestExportPath = printedPath - successPrintPdf.details_text = qsTr("PDF successfully saved to ") + printedPath - - successPrintPdf.show() - successPrintPdf.raise() - successPrintPdf.requestActivate() - } - } - - CustomSuccessDialog { - id: successPrintPdf - visible: false - - property string latestExportPath - - onSig_finish: { - Qt.openUrlExternally(latestExportPath); - layout.close() + exportFileDialog.currentFile = "file:///" + bsApp.makeExportWalletToPdfPath(wallet_properties_vm.seed) + exportFileDialog.open() } } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 5497c1268..b9a051593 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -232,12 +232,41 @@ ApplicationWindow { color: BSStyle.titleTextColor } - Image { - id: imgEnvKind + Rectangle { + id: animatedConnectionStateArea width: BSSizes.applyScale(16) - source: (bsApp.armoryState !== 7) ? "qrc:/images/bitcoin-disabled.png" : - ((bsApp.networkType === 0) ? "qrc:/images/bitcoin-main-net.png" : "qrc:/images/bitcoin-test-net.png") + height: BSSizes.applyScale(16) + color: "transparent" Layout.rightMargin: BSSizes.applyScale(12) + + Image { + id: imgEnvKind + anchors.fill: parent + source: (bsApp.armoryState !== 7) ? "qrc:/images/bitcoin-disabled.png" : + ((bsApp.networkType === 0) ? "qrc:/images/bitcoin-main-net.png" : "qrc:/images/bitcoin-test-net.png") + } + + RotationAnimation on rotation { + id: connectionAnomation + loops: Animation.Infinite + from: 0 + to: 360 + running: bsApp.armoryState !== 7 + duration: 1000 + } + + Connections { + target: bsApp + function onArmoryStateChanged() { + if (bsApp.armoryState === 7) { + connectionAnomation.complete() + animatedConnectionStateArea.rotation = 0 + } + else { + connectionAnomation.start() + } + } + } } CustomTitleToolButton { From 921463da8e370080fded338b4d7ae84fa2e082de Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 3 May 2023 20:17:43 +0300 Subject: [PATCH 386/436] HW wallet import fixes --- BlockSettleHW/hwdevicemanager.cpp | 31 +++- BlockSettleHW/jade/jadeClient.cpp | 11 ++ BlockSettleHW/jade/jadeClient.h | 1 + BlockSettleHW/jade/jadeDevice.cpp | 267 +++++++++++++++++++----------- Core/SignerAdapter.cpp | 6 +- GUI/QtQuick/QtQuickAdapter.cpp | 17 +- common | 2 +- 7 files changed, 227 insertions(+), 108 deletions(-) diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index 97972cc8e..a4312e121 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -253,7 +253,7 @@ bs::message::ProcessingResult bs::hww::DeviceManager::processBlockchain(const bs return bs::message::ProcessingResult::Ignored; } -bs::message::ProcessingResult bs::hww::DeviceManager::processTransactions(const bs::message::SeqId msgId +bs::message::ProcessingResult DeviceManager::processTransactions(const bs::message::SeqId msgId , const ArmoryMessage_Transactions& transactions) { const auto& itReq = supportingTxReq_.find(msgId); @@ -267,15 +267,23 @@ bs::message::ProcessingResult bs::hww::DeviceManager::processTransactions(const logger_->warn("[{}] device not found", __func__); return bs::message::ProcessingResult::Error; } + logger_->debug("[DeviceManager::processTransactions] received {} txs", transactions.transactions_size()); + std::vector txs; for (const auto& txData : transactions.transactions()) { - Tx tx(BinaryData::fromString(txData.tx())); - if (!tx.isInitialized()) { - logger_->warn("[{}] invalid TX at {}", __func__, txData.height()); - continue; + try { + Tx tx(BinaryData::fromString(txData.tx())); + if (!tx.isInitialized()) { + logger_->warn("[{}] invalid TX at {}", __func__, txData.height()); + continue; + } + tx.setTxHeight(txData.height()); + txs.push_back(tx); + } + catch (const std::exception& e) { + logger_->error("[{}] invalid TX: {}", __func__, e.what()); } - tx.setTxHeight(txData.height()); - //FIXME: device->setSupportingTX(tx); } + device->setSupportingTXs(txs); return bs::message::ProcessingResult::Success; } @@ -407,6 +415,7 @@ bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::S bool isDeviceReady = false; DeviceKey deviceKey{}; for (const auto& device : devices_) { + logger_->debug("[{}] device {}/{} vs {}", __func__, device.id, device.walletId, hdWallet.wallet_id()); if (device.walletId == hdWallet.wallet_id()) { isDeviceReady = true; deviceKey = device; @@ -420,6 +429,10 @@ bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::S pushBroadcast(user_, msg.SerializeAsString()); }; if (isDeviceReady) { + if ((deviceKey.type == bs::hww::DeviceType::HWJade) && !jadeClient_->isConnected(deviceKey.id)) { + operationFailed(deviceKey.id, "device not connected"); + return bs::message::ProcessingResult::Error; + } logger_->debug("[{}] device {}/{} was ready", __func__, deviceKey.id, deviceKey.walletId); walletReady(deviceKey.walletId); return bs::message::ProcessingResult::Success; @@ -449,9 +462,11 @@ bs::message::ProcessingResult DeviceManager::prepareDeviceForSign(bs::message::S } } else if (bs::wallet::HardwareEncKey::WalletType::Trezor == hwEncType.deviceType()) { + nbScanning_ = 1; trezorClient_->listDevices(); } else if (bs::wallet::HardwareEncKey::WalletType::Jade == hwEncType.deviceType()) { + nbScanning_ = 1; jadeClient_->scanDevices(); } return bs::message::ProcessingResult::Success; @@ -696,7 +711,7 @@ void bs::hww::DeviceManager::needSupportingTXs(const DeviceKey& key void DeviceManager::txSigned(const DeviceKey& device, const SecureBinaryData& signData) { - if (device.type != DeviceType::HWLedger) { + if (device.type == DeviceType::HWTrezor) { HW::DeviceMgrMessage msg; auto msgResp = msg.mutable_signed_tx(); msgResp->set_signed_tx(signData.toBinStr()); diff --git a/BlockSettleHW/jade/jadeClient.cpp b/BlockSettleHW/jade/jadeClient.cpp index baaa016df..c03febcd3 100644 --- a/BlockSettleHW/jade/jadeClient.cpp +++ b/BlockSettleHW/jade/jadeClient.cpp @@ -74,3 +74,14 @@ void JadeClient::scanDevices() cb_->scanningDone(); }); } + +bool bs::hww::JadeClient::isConnected(const std::string& reqId) const +{ + for (const auto& serial : QSerialPortInfo::availablePorts()) { + const auto& id = JadeDevice::idFromSerial(serial); + if (id == reqId) { + return true; + } + } + return false; +} diff --git a/BlockSettleHW/jade/jadeClient.h b/BlockSettleHW/jade/jadeClient.h index 2a6db004e..c7c3fd06e 100644 --- a/BlockSettleHW/jade/jadeClient.h +++ b/BlockSettleHW/jade/jadeClient.h @@ -36,6 +36,7 @@ namespace bs { void initConnection(); void scanDevices(); + bool isConnected(const std::string& id) const; std::vector deviceKeys() const; std::shared_ptr getDevice(const std::string& deviceId); diff --git a/BlockSettleHW/jade/jadeDevice.cpp b/BlockSettleHW/jade/jadeDevice.cpp index 88a188162..fe1fafca3 100644 --- a/BlockSettleHW/jade/jadeDevice.cpp +++ b/BlockSettleHW/jade/jadeDevice.cpp @@ -128,7 +128,7 @@ static std::string dump(const QCborValueRef& val) if (val.isRegularExpression()) { return val.toRegularExpression().pattern().toStdString(); } - return "???"; + return ""; } void JadeDevice::setSupportingTXs(const std::vector& txs) @@ -142,68 +142,131 @@ void JadeDevice::setSupportingTXs(const std::vector& txs) " count mismatch: {} vs {}", awaitingTXreq_.armorySigner_.getTxInCount(), txs.size()); return; } + logger_->debug("[JadeDevice::setSupportingTXs] {}, lock time: {}", txs.size(), awaitingTXreq_.armorySigner_.getLockTime()); for (const auto& tx : txs) { awaitingTXreq_.armorySigner_.addSupportingTx(tx); } - for (uint32_t i = 0; i < awaitingTXreq_.armorySigner_.getTxInCount(); ++i) { - const auto& spender = awaitingTXreq_.armorySigner_.getSpender(i); - if (!spender) { - logger_->warn("[JadeDevice::signTX] no spender at {}", __func__, i); - continue; + const auto& tx = awaitingTXreq_.armorySigner_.serializeUnsignedTx(); + const QCborMap params = { {QLatin1Literal("network"), network()}, {QLatin1Literal("txn") + , QByteArray::fromStdString(tx.toBinStr())}, {QLatin1Literal("use_ae_signatures"), false} + , {QLatin1Literal("num_inputs"), awaitingTXreq_.armorySigner_.getTxInCount()} }; + auto inReq = std::make_shared(); + inReq->request = getRequest(++seqId_, QLatin1Literal("sign_tx"), params); + + const auto& cbSign = [this, txs](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data) { + logger_->error("[JadeDevice::signTX] invalid data"); + cb_->operationFailed(key().id, "Invalid data"); + return; } - auto bip32Paths = spender->getBip32Paths(); - if (bip32Paths.size() != 1) { - logger_->error("[TrezorDevice::handleTxRequest] TXINPUT {} BIP32 paths", bip32Paths.size()); - throw std::logic_error("unexpected pubkey count for spender"); + if (data->futResponse.wait_for(std::chrono::seconds{ 15 }) != std::future_status::ready) { + logger_->error("[JadeDevice::signTX] data timeout"); + cb_->operationFailed(key().id, "Device timeout"); + return; } - const auto& path = bip32Paths.begin()->second.getDerivationPathFromSeed(); - QCborArray paramPath; - for (unsigned i = 0; i < path.size(); i++) { - //skip first index, it's the wallet root fingerprint - paramPath.append(path.at(i)); + const auto& msg = data->futResponse.get(); + logger_->debug("[JadeDevice::signTX] response: {}", dump(msg)); + if (msg.contains(QLatin1Literal("error"))) { + cb_->operationFailed(key().id, msg[QLatin1Literal("error")][QLatin1Literal("message")].toString().toStdString()); + return; + } + if (msg[QLatin1Literal("result")].isFalse()) { + cb_->operationFailed(key().id, "Device refused to sign"); + return; } - QCborMap params = { {QLatin1Literal("script"), QByteArray::fromStdString(spender->getOutputScript().toBinStr())} - , {QLatin1Literal("input_tx"), QByteArray::fromStdString(spender->getUtxo().getTxHash().copySwapEndian().toBinStr())} - , {QLatin1Literal("satoshi"), (qint64)spender->getValue()} - , {QLatin1Literal("is_witness"), true}, {QLatin1Literal("path"), paramPath}}; - auto inInput = std::make_shared(); - inInput->request = getRequest(++seqId_, QLatin1Literal("tx_input"), params); - inInput->needResponse = false; - processQueued(inInput, [](const std::shared_ptr&) {}); - } - - auto bw = std::make_shared(); - bw->put_var_int(awaitingTXreq_.armorySigner_.getTxInCount()); - for (uint32_t i = 0; i < awaitingTXreq_.armorySigner_.getTxInCount(); ++i) { - const auto& cbResponse = [this, i, bw](const std::shared_ptr& out) + auto bw = std::make_shared(); + bw->put_var_int(awaitingTXreq_.armorySigner_.getTxInCount()); + const auto& addSignedInput = [this, bw, txs](uint32_t i, const BinaryData& signedData) { - const auto& data = std::static_pointer_cast(out); - if (!data) { - logger_->error("[JadeDevice::tx_input] invalid data"); - cb_->publicKeyReady(key()); - return; - } - if (data->futResponse.wait_for(std::chrono::seconds{ 5 }) != std::future_status::ready) { - logger_->error("[JadeDevice::tx_input] data timeout"); - cb_->publicKeyReady(key()); - return; - } - const auto& msg = data->futResponse.get(); - logger_->debug("[JadeDevice::tx_input] #{} response: {}", i, dump(msg)); - - const auto binSignedData = BinaryData::fromString(msg[QLatin1Literal("result")].toByteArray().toStdString()); bw->put_uint32_t(i); - bw->put_var_int(binSignedData.getSize()); - bw->put_BinaryData(binSignedData); + bw->put_var_int(signedData.getSize()); + bw->put_BinaryData(signedData); + logger_->debug("[JadeDevice::setSupportingTXs::addSignedInput] {} of {}", i + 1, awaitingTXreq_.armorySigner_.getTxInCount()); if ((i + 1) >= awaitingTXreq_.armorySigner_.getTxInCount()) { cb_->txSigned(key(), bw->getData()); + logger_->debug("[JadeDevice::setSupportingTXs::addSignedInput] done"); } }; - auto inResponse = std::make_shared(); - processQueued(inResponse, cbResponse); - } + + for (uint32_t i = 0; i < awaitingTXreq_.armorySigner_.getTxInCount(); ++i) { + const auto& spender = awaitingTXreq_.armorySigner_.getSpender(i); + if (!spender) { + logger_->warn("[JadeDevice::signTX] no spender at {}", __func__, i); + continue; + } + auto bip32Paths = spender->getBip32Paths(); + if (bip32Paths.size() != 1) { + logger_->error("[TrezorDevice::handleTxRequest] TXINPUT {} BIP32 paths", bip32Paths.size()); + throw std::logic_error("unexpected pubkey count for spender"); + } + const auto& path = bip32Paths.begin()->second.getDerivationPathFromSeed(); + QCborArray paramPath; + for (unsigned i = 0; i < path.size(); i++) { + //skip first index, it's the wallet root fingerprint + paramPath.append(path.at(i)); + } + QCborMap params = { {QLatin1Literal("script"), QByteArray::fromStdString(spender->getOutputScript().toBinStr())} + //, {QLatin1Literal("input_tx"), QByteArray::fromStdString(txs.at(i).serialize().toBinStr())} + , {QLatin1Literal("input_tx"), {} } + , {QLatin1Literal("satoshi"), (qint64)spender->getValue()} + , {QLatin1Literal("is_witness"), true}, {QLatin1Literal("path"), paramPath} }; + auto inInput = std::make_shared(); + inInput->request = getRequest(++seqId_, QLatin1Literal("tx_input"), params); + + const auto& cbInput = [this, i, addSignedInput](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data) { + return; + } + if (data->futResponse.wait_for(std::chrono::milliseconds{ 15000 }) != std::future_status::ready) { + return; //FIXME^ + } + const auto& msg = data->futResponse.get(); + logger_->debug("[JadeDevice::tx_input] #{} response1: {}", i, dump(msg)); + if (msg.contains(QLatin1Literal("error"))) { + cb_->operationFailed(key().id, msg[QLatin1Literal("error")][QLatin1Literal("message")].toString().toStdString()); + return; + } + const auto binSignedData = BinaryData::fromString(msg[QLatin1Literal("result")].toByteArray().toStdString()); + addSignedInput(i, binSignedData); + }; + processQueued(inInput, cbInput); + } +#if 0 //temporarily + for (uint32_t i = 0; i < awaitingTXreq_.armorySigner_.getTxInCount(); ++i) { + const auto& cbResponse = [this, i, addSignedInput](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data) { + logger_->warn("[JadeDevice::tx_input] invalid data"); + //cb_->operationFailed(key().id, "tx_input invalid data"); + return; + } + if (data->futResponse.wait_for(std::chrono::seconds{ 15 }) != std::future_status::ready) { + logger_->error("[JadeDevice::tx_input] data timeout"); + //cb_->operationFailed(key().id, "tx_input data timeout"); + return; + } + const auto& msg = data->futResponse.get(); + logger_->debug("[JadeDevice::tx_input] #{} response2: {}", i, dump(msg)); + if (msg.contains(QLatin1Literal("error"))) { + cb_->operationFailed(key().id, msg[QLatin1Literal("error")][QLatin1Literal("message")].toString().toStdString()); + return; + } + const auto binSignedData = BinaryData::fromString(msg[QLatin1Literal("result")].toByteArray().toStdString()); + addSignedInput(i, binSignedData); + }; + auto inResponse = std::make_shared(); + processQueued(inResponse, cbResponse); + } +#endif + }; + processQueued(inReq, cbSign); } void JadeDevice::releaseConnection() @@ -223,9 +286,9 @@ DeviceKey JadeDevice::key() const if (walletId_.empty()) { if (!xpubRoot_.empty()) { try { - const auto& seed = bs::core::wallet::Seed::fromXpub(xpubRoot_ - , testNet_ ? NetworkType::TestNet : NetworkType::MainNet); - walletId_ = seed.getWalletId(); + /*const auto& seed = bs::core::wallet::Seed::fromXpub(xpubRoot_ + , testNet_ ? NetworkType::TestNet : NetworkType::MainNet);*/ + walletId_ = bs::core::wallet::computeID(xpubRoot_).toBinStr(); } catch (const std::exception& e) { logger_->error("[{}] failed to get walletId from {}: {}", __func__, xpubRoot_.toBinStr(), e.what()); @@ -263,6 +326,11 @@ static uint32_t epoch() void JadeDevice::init() { + if (inited()) { + logger_->debug("[JadeDevice::init] already inited"); + cb_->publicKeyReady(key()); + return; + } logger_->debug("[JadeDevice::init] start"); auto in = std::make_shared(); in->request = getRequest(++seqId_, QLatin1Literal("get_version_info")); @@ -312,10 +380,8 @@ void JadeDevice::init() auto inXpub = std::make_shared(); bs::hd::Path path; - path.append(/*bs::hd::Purpose::Native +*/ bs::hd::hardFlag); + path.append(bs::hd::hardFlag); path.append(testNet_ ? bs::hd::CoinType::Bitcoin_test : bs::hd::CoinType::Bitcoin_main); - //path.append(bs::hd::hardFlag); - //path.append(0); const QCborMap params = { {QLatin1Literal("network"), network()}, {QLatin1Literal("path"), convertPath(path)}}; inXpub->request = getRequest(++seqId_, QLatin1Literal("get_xpub"), params); @@ -505,47 +571,46 @@ void JadeDevice::getPublicKeys() void JadeDevice::signTX(const bs::core::wallet::TXSignRequest &reqTX) { logger_->debug("[JadeDevice::signTX]"); - - const auto& tx = reqTX.armorySigner_.toPSBT(); - const QCborMap params = { {QLatin1Literal("network"), network()}, {QLatin1Literal("txn") - , QByteArray::fromStdString(tx.toBinStr())}, {QLatin1Literal("use_ae_signatures"), true} - , {QLatin1Literal("num_inputs"), reqTX.armorySigner_.getTxInCount()} }; - auto inReq = std::make_shared(); - inReq->request = getRequest(++seqId_, QLatin1Literal("sign_tx"), params); - - const auto& cbSign = [this, reqTX](const std::shared_ptr& out) - { - const auto& data = std::static_pointer_cast(out); - if (!data) { - logger_->error("[JadeDevice::signTX] invalid data"); - cb_->operationFailed(key().id, "Invalid data"); - return; - } - if (data->futResponse.wait_for(std::chrono::seconds{ 15 }) != std::future_status::ready) { - logger_->error("[JadeDevice::signTX] data timeout"); - cb_->operationFailed(key().id, "Device timeout"); - return; + std::vector txHashes; + for (uint32_t i = 0; i < reqTX.armorySigner_.getTxInCount(); ++i) { + const auto& spender = reqTX.armorySigner_.getSpender(i); + if (!spender) { + logger_->warn("[JadeDevice::signTX] no spender at {}", i); + continue; } - const auto& msg = data->futResponse.get(); - logger_->debug("[JadeDevice::signTX] response: {}", dump(msg)); - if (msg[QLatin1Literal("result")].isFalse()) { - cb_->operationFailed(key().id, "Device refused to sign"); - return; + txHashes.push_back(spender->getUtxo().getTxHash()); + + auto bip32Paths = spender->getBip32Paths(); + if (bip32Paths.size() != 1) { + logger_->error("[TrezorDevice::signTX] {} BIP32 paths", bip32Paths.size()); + continue; } + const auto& path = bip32Paths.begin()->second.getDerivationPathFromSeed(); + const QCborMap params = { {QLatin1Literal("network"), network()}, {QLatin1Literal("path"), convertPath(path)} }; + auto inXpub = std::make_shared(); + inXpub->request = getRequest(++seqId_, QLatin1Literal("get_xpub"), params); - std::vector txHashes; - for (uint32_t i = 0; i < reqTX.armorySigner_.getTxInCount(); ++i) { - const auto& spender = reqTX.armorySigner_.getSpender(i); - if (!spender) { - logger_->warn("[JadeDevice::signTX] no spender at {}", i); - continue; + const auto& cbXPub = [this](const std::shared_ptr& out) + { + const auto& data = std::static_pointer_cast(out); + if (!data) { + logger_->error("[JadeDevice::signTX] invalid data"); + cb_->publicKeyReady(key()); + return; } - txHashes.push_back(spender->getUtxo().getTxHash()); - } - cb_->needSupportingTXs(key(), txHashes); - awaitingTXreq_ = reqTX; - }; - processQueued(inReq, cbSign); + if (data->futResponse.wait_for(std::chrono::milliseconds{ 1500 }) != std::future_status::ready) { + logger_->error("[JadeDevice::signTX] data timeout"); + cb_->publicKeyReady(key()); + return; + } + const auto& msg = data->futResponse.get(); + logger_->debug("[JadeDevice::init] xpub response: {}", dump(msg)); + }; + processQueued(inXpub, cbXPub); + } + logger_->debug("[JadeDevice::signTX] {} prevOuts requested", txHashes.size()); + cb_->needSupportingTXs(key(), txHashes); + awaitingTXreq_ = reqTX; } void JadeDevice::retrieveXPubRoot() @@ -659,7 +724,8 @@ void bs::hww::JadeSerialHandler::parsePortion(const QByteArray& data) for (bool readNextObj = true; readNextObj; /*nothing - set in loop*/) { QCborParserError err; const QCborValue cbor = QCborValue::fromCbor(unparsed_, &err); - // qDebug() << "Read Type:" << cbor.type() << "and error: " << err.error; + //logger_->debug("[{}] read type {}, result={}", __func__, cbor.type() + // , err.error.toString().toStdString()); readNextObj = false; // In most cases we don't read another object if (err.error == QCborError::NoError && cbor.isMap()) { @@ -670,8 +736,14 @@ void bs::hww::JadeSerialHandler::parsePortion(const QByteArray& data) .toByteArray().toStdString()); } else { - requests_.front()->set_value(msg); - requests_.pop_front(); + //logger_->debug("[{}] ready: {}", __func__, dump(msg)); + if (requests_.empty()) { + logger_->error("[{}] unexpected response", __func__); + } + else { + requests_.front()->set_value(msg); + requests_.pop_front(); + } } // Remove read object from m_data buffer @@ -681,8 +753,10 @@ void bs::hww::JadeSerialHandler::parsePortion(const QByteArray& data) else { // We successfully read an object and there are still bytes left in the buffer - this // is the one case where we loop and read again - make sure to preserve the remaining bytes. - unparsed_ = unparsed_.right(static_cast(unparsed_.length() - err.offset)); + const int remainder = static_cast(unparsed_.length() - err.offset); + unparsed_ = unparsed_.right(remainder); readNextObj = true; + logger_->debug("[{}] {} more data after the message", __func__, remainder); } } else if (err.error == QCborError::EndOfFile) { @@ -712,7 +786,6 @@ void bs::hww::JadeSerialHandler::parsePortion(const QByteArray& data) void JadeSerialHandler::onSerialDataReady() { - logger_->debug("[{}]", __func__); assert(serial_); const auto& data = serial_->readAll(); logger_->debug("[{}] {} bytes", __func__, data.size()); diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 8f637aaae..6b8f01f51 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -547,7 +547,7 @@ ProcessingResult SignerAdapter::processSignTx(const bs::message::Envelope& env msgResp->set_error_text(errorReason); pushResponse(user_, env, msg.SerializeAsString()); }; - const auto& txReq = bs::signer::pbTxRequestToCore(request.tx_request(), logger_); + auto txReq = bs::signer::pbTxRequestToCore(request.tx_request(), logger_); logger_->debug("[{}] ({} wallet id[s])", __func__, txReq.walletIds.size()); bs::core::WalletsManager::HDWalletPtr hdWallet; if ((txReq.walletIds.size() == 1)) { @@ -568,11 +568,15 @@ ProcessingResult SignerAdapter::processSignTx(const bs::message::Envelope& env SignerMessage msg; auto msgResp = msg.mutable_sign_tx_response(); try { + logger_->debug("[{}] lock time: {}", __func__, txReq.armorySigner_.getLockTime()); const auto& signedTX = hdWallet->signTXRequestWithWallet(txReq); if (signedTX.empty()) { throw std::runtime_error("signer returned empty TX"); } logger_->debug("[{}] signed TX: {}", __func__, signedTX.toHexStr()); + if (!txReq.armorySigner_.verify()) { + logger_->error("[{}] verification failed", __func__); + } msgResp->set_signed_tx(signedTX.toBinStr()); } catch (const std::exception& e) { diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index b9987e007..9af8acd32 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1752,6 +1752,18 @@ void QtQuickAdapter::pollHWWallets() HW::DeviceMgrMessage msg; msg.mutable_startscan(); pushRequest(user_, userHWW_, msg.SerializeAsString()); +#if 0 // remove me + SignerMessage msg; + auto msgReq = msg.mutable_import_hw_wallet(); + msgReq->set_type(3); + msgReq->set_vendor("4292"); + msgReq->set_label("Jade @COM3"); + msgReq->set_device_id("60000"); + msgReq->set_xpub_root("xpub6B43s2ygXy4bwcYbj2b3x1oJK3VNH91kS3g1StvhAnLB542Jj56Leck9GuTWBF8wyhZP4aV3ipuuj6LZtfRwnqnqtPrhqDCogfP4Dft7Uxy"); + msgReq->set_xpub_nested_segwit("xpub6CU61Bny1t3y7eeFZoZVftv1W9bu4yjirFwiWSXJRZPFSoagnWauY3rJftKEkT4xfrtTvJzzeGHSfiKGwszrnkFQVBVePtqfBm7Kdp9eWDn"); + msgReq->set_xpub_native_segwit("xpub6Cm7TgtEtzTqUdGbMt6bfryQGqU5KxzD8rALpE6urikpKXCd44NfLwCEmbLFBS4zzw1gbMLnPRZ142NydpFHuSwTGdr2zViPx1A2VqRj5KU"); + pushRequest(user_, userSigner_, msg.SerializeAsString()); +#endif } void QtQuickAdapter::stopHWWalletsPolling() @@ -2292,11 +2304,14 @@ bs::message::ProcessingResult QtQuickAdapter::processHWWready(const std::string& logger_->debug("[{}] wallet {}", __func__, walletId); readyWallets_.insert(walletId); it->second->setHWWready(); + auto txReq = it->second->txReq(); + txReq.armorySigner_.setLockTime(blockNum_); { HW::DeviceMgrMessage msg; - *msg.mutable_sign_tx() = bs::signer::coreTxRequestToPb(it->second->txReq()); + *msg.mutable_sign_tx() = bs::signer::coreTxRequestToPb(txReq); pushRequest(user_, userHWW_, msg.SerializeAsString()); } + logger_->debug("[{}] lock time: {} ({})", __func__, txReq.armorySigner_.getLockTime(), blockNum_); hwwReady_.erase(it); return bs::message::ProcessingResult::Success; } diff --git a/common b/common index 1ee4ff49b..0ddfe272e 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 1ee4ff49b8e33a59375b0d5a531baf7780cde139 +Subproject commit 0ddfe272e4f7de7327c2e64668efed9bb7b77469 From bec4422ad5971e6f020d58ca96c825263ca5b74c Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 3 May 2023 23:03:49 +0300 Subject: [PATCH 387/436] Allow wallet import while armory is not available --- GUI/QtQuick/QtQuickAdapter.cpp | 12 ------------ common | 2 +- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 517786f33..e09d52e41 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1752,18 +1752,6 @@ void QtQuickAdapter::pollHWWallets() HW::DeviceMgrMessage msg; msg.mutable_startscan(); pushRequest(user_, userHWW_, msg.SerializeAsString()); -#if 0 // remove me - SignerMessage msg; - auto msgReq = msg.mutable_import_hw_wallet(); - msgReq->set_type(3); - msgReq->set_vendor("4292"); - msgReq->set_label("Jade @COM3"); - msgReq->set_device_id("60000"); - msgReq->set_xpub_root("xpub6B43s2ygXy4bwcYbj2b3x1oJK3VNH91kS3g1StvhAnLB542Jj56Leck9GuTWBF8wyhZP4aV3ipuuj6LZtfRwnqnqtPrhqDCogfP4Dft7Uxy"); - msgReq->set_xpub_nested_segwit("xpub6CU61Bny1t3y7eeFZoZVftv1W9bu4yjirFwiWSXJRZPFSoagnWauY3rJftKEkT4xfrtTvJzzeGHSfiKGwszrnkFQVBVePtqfBm7Kdp9eWDn"); - msgReq->set_xpub_native_segwit("xpub6Cm7TgtEtzTqUdGbMt6bfryQGqU5KxzD8rALpE6urikpKXCd44NfLwCEmbLFBS4zzw1gbMLnPRZ142NydpFHuSwTGdr2zViPx1A2VqRj5KU"); - pushRequest(user_, userSigner_, msg.SerializeAsString()); -#endif } void QtQuickAdapter::stopHWWalletsPolling() diff --git a/common b/common index 0ddfe272e..103f38ac3 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 0ddfe272e4f7de7327c2e64668efed9bb7b77469 +Subproject commit 103f38ac3380a7fdf9b0637071a7fcbe3d816313 From 3629e79f1e2c7517baa5323b68b1d9df6d10d211 Mon Sep 17 00:00:00 2001 From: yz Date: Thu, 4 May 2023 01:38:01 +0300 Subject: [PATCH 388/436] Fee editing --- GUI/QtQuick/FeeSuggModel.cpp | 13 ++++++- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 7 ++++ GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 37 +++++++++++-------- .../qml/StyledControls/CustomComboBox.qml | 3 +- 4 files changed, 42 insertions(+), 18 deletions(-) diff --git a/GUI/QtQuick/FeeSuggModel.cpp b/GUI/QtQuick/FeeSuggModel.cpp index cb3f10b5d..2649049b5 100644 --- a/GUI/QtQuick/FeeSuggModel.cpp +++ b/GUI/QtQuick/FeeSuggModel.cpp @@ -29,7 +29,7 @@ FeeSuggestionModel::FeeSuggestionModel(const std::shared_ptr& lo int FeeSuggestionModel::rowCount(const QModelIndex &) const { - return data_.size(); + return data_.size() + 1; } int FeeSuggestionModel::columnCount(const QModelIndex &) const @@ -39,6 +39,17 @@ int FeeSuggestionModel::columnCount(const QModelIndex &) const QVariant FeeSuggestionModel::data(const QModelIndex& index, int role) const { + if (index.row() == data_.size()) { + switch (role) { + case TextRole: + return tr("Manual Fee Selection"); + case BlocksRole: + case TimeRole: + case ValueRole: + return QString::fromLatin1("1.0 s/b"); + default: break; + } + } switch (role) { case TextRole: return tr("%1 blocks (%2): %3 s/b").arg(data_.at(index.row()).nbBlocks) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index efaaae514..fd639d42d 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -313,6 +313,13 @@ ColumnLayout { txOutputsModel.clearOutputs() } } + + function setup_fee() { + if (tx !== null && (isRBF || isCPFP)) { + fee_suggest_combo.currentIndex = feeSuggestions.rowCount - 1 + fee_suggest_combo.input_item.text = Qt.binding(function() { return tx.feePerByte + " s\/b" }) + } + } } Item { diff --git a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml index bda1c3d03..73d3d6872 100644 --- a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml +++ b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml @@ -15,18 +15,17 @@ import "../BsStyles" import "../StyledControls" CustomComboBox { - id: fee_suggest_combo model: feeSuggestions - editable: true + editable: currentIndex == (feeSuggestions.rowCount - 1) //aliases title_text: qsTr("Fee Suggestions") height: BSSizes.applyScale(70) - textRole: "text" + textRole: (currentIndex == (feeSuggestions.rowCount - 1) && !popup.visible) ? "value" : "text" valueRole: "value" validator: RegExpValidator {regExp: new RegExp(create_regexp())} @@ -41,6 +40,9 @@ CustomComboBox { { change_index_handler() } + if (typeof setup_fee === "function") { + setup_fee() + } validator.regExp = new RegExp(create_regexp()) } @@ -52,31 +54,34 @@ CustomComboBox { change_index_handler() } validator.regExp = new RegExp(create_regexp()) + + if (currentIndex == (feeSuggestions.rowCount - 1)) { + fee_suggest_combo.input_item.forceActiveFocus() + fee_suggest_combo.input_item.cursorPosition = 0 + } } function create_regexp() { - var res = fee_suggest_combo.currentText - var index = res.indexOf(":") - res = res.slice(0, index+2) - res = res.replace("(", "\\(").replace(")", "\\)") - res = res + "\\d*\\.?\\d? s\/b" - return res + return "\\d*\\.?\\d?( s\/b)?" } function edit_value() { - var res = fee_suggest_combo.input_text - var index = res.indexOf(":") - res = res.slice(index+2) + var res; + if (currentIndex != (feeSuggestions.rowCount - 1)) { + res = fee_suggest_combo.currentText + var index = res.indexOf(":") + res = res.slice(index+2) + } + else { + res = fee_suggest_combo.input_text + } res = res.replace(" s/b", "") return res } onEditingFinished : { - if (!edit_value()) - { - fee_suggest_combo.input_text = fee_suggest_combo.currentText - } + fee_suggest_combo.input_item.text = edit_value() + " s/b" } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml index a254b8494..ab8a0b3f4 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml @@ -24,6 +24,7 @@ ComboBox { property alias input_accept_input: input.acceptableInput property alias input_text: input.text + property alias input_item: input signal textEdited() signal editingFinished() @@ -101,7 +102,7 @@ ComboBox { onTextEdited : { control.textEdited() } - + onEditingFinished : { control.editingFinished() } From d39ec6f1353a106da545a1ea7962120a0c1f02f2 Mon Sep 17 00:00:00 2001 From: yz Date: Thu, 4 May 2023 11:34:19 +0300 Subject: [PATCH 389/436] Review fix --- GUI/QtQuick/FeeSuggModel.cpp | 5 +++-- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 +- GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml | 9 +++------ GUI/QtQuick/qml/StyledControls/CustomComboBox.qml | 13 ++++++++++++- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/GUI/QtQuick/FeeSuggModel.cpp b/GUI/QtQuick/FeeSuggModel.cpp index 2649049b5..67f4af4ec 100644 --- a/GUI/QtQuick/FeeSuggModel.cpp +++ b/GUI/QtQuick/FeeSuggModel.cpp @@ -45,14 +45,15 @@ QVariant FeeSuggestionModel::data(const QModelIndex& index, int role) const return tr("Manual Fee Selection"); case BlocksRole: case TimeRole: + return 0; case ValueRole: - return QString::fromLatin1("1.0 s/b"); + return QString(); default: break; } } switch (role) { case TextRole: - return tr("%1 blocks (%2): %3 s/b").arg(data_.at(index.row()).nbBlocks) + return tr("%1 blocks (%2): %3").arg(data_.at(index.row()).nbBlocks) .arg(data_.at(index.row()).estTime).arg(QString::number(data_.at(index.row()).satoshis, 'f', 1)); case BlocksRole: return data_.at(index.row()).nbBlocks; diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index fd639d42d..53772e824 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -317,7 +317,7 @@ ColumnLayout { function setup_fee() { if (tx !== null && (isRBF || isCPFP)) { fee_suggest_combo.currentIndex = feeSuggestions.rowCount - 1 - fee_suggest_combo.input_item.text = Qt.binding(function() { return tx.feePerByte + " s\/b" }) + fee_suggest_combo.input_item.text = Qt.binding(function() { return tx.feePerByte }) } } } diff --git a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml index 73d3d6872..952ab626a 100644 --- a/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml +++ b/GUI/QtQuick/qml/Send/FeeSuggestComboBox.qml @@ -27,6 +27,7 @@ CustomComboBox { textRole: (currentIndex == (feeSuggestions.rowCount - 1) && !popup.visible) ? "value" : "text" valueRole: "value" + suffix_text: qsTr("s/b") validator: RegExpValidator {regExp: new RegExp(create_regexp())} @@ -63,7 +64,7 @@ CustomComboBox { function create_regexp() { - return "\\d*\\.?\\d?( s\/b)?" + return "\\d*\\.?\\d?" } function edit_value() @@ -73,15 +74,11 @@ CustomComboBox { res = fee_suggest_combo.currentText var index = res.indexOf(":") res = res.slice(index+2) + res = res.replace(" " + fee_suggest_combo.suffix_text, "") } else { res = fee_suggest_combo.input_text } - res = res.replace(" s/b", "") return res } - - onEditingFinished : { - fee_suggest_combo.input_item.text = edit_value() + " s/b" - } } diff --git a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml index ab8a0b3f4..50a29995b 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomComboBox.qml @@ -25,6 +25,7 @@ ComboBox { property alias input_accept_input: input.acceptableInput property alias input_text: input.text property alias input_item: input + property alias suffix_text: input_suffix_text.text signal textEdited() signal editingFinished() @@ -102,7 +103,7 @@ ComboBox { onTextEdited : { control.textEdited() } - + onEditingFinished : { control.editingFinished() } @@ -111,6 +112,16 @@ ComboBox { target: control onCurrentTextChanged: input.text = control.currentText } + + Text { + id: input_suffix_text + anchors.bottom: parent.bottom + leftPadding: input.contentWidth + BSSizes.applyScale(4) + font.pixelSize: control.fontSize + font.family: "Roboto" + font.weight: Font.Normal + color: control.fontColor + } } } From 688a04285a73954c0d95cf7ce27765b02557224c Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 4 May 2023 19:03:50 +0300 Subject: [PATCH 390/436] test commit --- GUI/QtQuick/QtQuickAdapter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index e09d52e41..a59647463 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1798,7 +1798,7 @@ void QtQuickAdapter::importWOWallet(const QString& filename) emit showError(tr("Invalid or non-existing wallet file %1").arg(filename)); return; } - logger_->debug("[{}] {}", __func__, filename.toStdString()); + //logger_->debug("[{}] {}", __func__, filename.toStdString()); SignerMessage msg; msg.set_import_wo_wallet(filename.toStdString()); pushRequest(user_, userSigner_, msg.SerializeAsString()); @@ -1811,7 +1811,7 @@ void QtQuickAdapter::importHWWallet(int deviceIndex) emit showError(tr("Invalid device #%1").arg(deviceIndex)); return; } - logger_->debug("[{}] {}", __func__, deviceIndex); + //logger_->debug("[{}] {}", __func__, deviceIndex); HW::DeviceMgrMessage msg; bs::hww::deviceKeyToMsg(devKey, msg.mutable_import_device()); pushRequest(user_, userHWW_, msg.SerializeAsString()); From c34284a9699a32d4e2215ed8158cdd85989deb01 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Sat, 6 May 2023 00:05:38 +0300 Subject: [PATCH 391/436] RBF fixes --- GUI/QtQuick/AddressListModel.cpp | 42 +++---- GUI/QtQuick/QTXSignRequest.cpp | 41 +++---- GUI/QtQuick/QtQuickAdapter.cpp | 149 +++++++++++++---------- GUI/QtQuick/QtQuickAdapter.h | 16 +-- GUI/QtQuick/TxListModel.cpp | 57 ++++++--- GUI/QtQuick/TxListModel.h | 45 ++++--- GUI/QtQuick/qml/OverviewPage.qml | 2 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 98 +++++++-------- GUI/QtQuick/qml/Send/SelectInputs.qml | 14 +-- GUI/QtQuick/qml/Send/SendPopup.qml | 5 +- GUI/QtQuick/qml/Send/SimpleDetails.qml | 8 +- GUI/QtQuick/qml/TransactionDetails.qml | 4 +- common | 2 +- 13 files changed, 260 insertions(+), 223 deletions(-) diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index 3a2468196..f1667eb63 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -121,35 +121,33 @@ void QmlAddressListModel::addRows(const std::string& walletId, const QVectordebug("[{}] {} rows / {} addresses", __func__, rows.size(), addresses_.size()); - QMetaObject::invokeMethod(this, [this, rows] { - QVector> newRows; - for (const auto& row : rows) { - bool found = false; - for (const auto& r : table_) { + QVector> newRows; + for (const auto& row : rows) { + bool found = false; + for (const auto& r : table_) { + if (r.at(0) == row.at(0)) { + found = true; + break; + } + } + if (!found) { + for (const auto& r : newRows) { if (r.at(0) == row.at(0)) { found = true; break; } } - if (!found) { - for (const auto& r : newRows) { - if (r.at(0) == row.at(0)) { - found = true; - break; - } - } - } - if (!found) { - newRows.append(row); - } } - bool found = false; - if (!newRows.empty()) { - beginInsertRows(QModelIndex(), rowCount(), rowCount() + newRows.size() - 1); - table_.append(newRows); - endInsertRows(); + if (!found) { + newRows.append(row); } - }); + } + bool found = false; + if (!newRows.empty()) { + beginInsertRows(QModelIndex(), rowCount(), rowCount() + newRows.size() - 1); + table_.append(newRows); + endInsertRows(); + } } void QmlAddressListModel::updateRow(const BinaryData& addrPubKey, uint64_t bal, uint32_t nbTx) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index c130d1624..4e5cca76e 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -22,24 +22,22 @@ void QTXSignRequest::setTxSignReq(const bs::core::wallet::TXSignRequest& txReq) { txReq_ = txReq; - QMetaObject::invokeMethod(this, [this] { - if (outputsModel_) { - outputsModel_->clearOutputs(); - } - else { - outputsModel_ = new TxOutputsModel(logger_, this, true); - } - for (const auto& recip : txReq_.getRecipients([](const bs::Address&) { return true; })) { - try { - const auto& addr = bs::Address::fromRecipient(recip); - outputsModel_->addOutput(QString::fromStdString(addr.display()) - , recip->getValue() / BTCNumericTypes::BalanceDivider - , addr == txReq_.change.address); - } - catch (const std::exception& ) {} + if (outputsModel_) { + outputsModel_->clearOutputs(); + } + else { + outputsModel_ = new TxOutputsModel(logger_, this, true); + } + for (const auto& recip : txReq_.getRecipients([](const bs::Address&) { return true; })) { + try { + const auto& addr = bs::Address::fromRecipient(recip); + outputsModel_->addOutput(QString::fromStdString(addr.display()) + , recip->getValue() / BTCNumericTypes::BalanceDivider + , addr == txReq_.change.address); } - emit txSignReqChanged(); - }); + catch (const std::exception& ) {} + } + emit txSignReqChanged(); std::vector inputs; inputs.reserve(txReq.armorySigner_.getTxInCount()); @@ -58,17 +56,16 @@ void QTXSignRequest::setError(const QString& err) void QTXSignRequest::setInputs(const std::vector& utxos) { + logger_->debug("[{}] {} UTXO[s]", __func__, utxos.size()); if (inputsModel_) { inputsModel_->clear(); inputsModel_->addUTXOs(utxos); emit txSignReqChanged(); } else { - QMetaObject::invokeMethod(this, [this, utxos] { - inputsModel_ = new TxInputsModel(logger_, nullptr, this); - inputsModel_->addUTXOs(utxos); - emit txSignReqChanged(); - }); + inputsModel_ = new TxInputsModel(logger_, nullptr, this); + inputsModel_->addUTXOs(utxos); + emit txSignReqChanged(); } } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index a59647463..5704fb8e9 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -45,6 +45,8 @@ #include "WalletBalancesModel.h" #include "TransactionFilterModel.h" #include "TransactionForAddressFilterModel.h" +#include "TxInputsModel.h" +#include "TxInputsSelectedModel.h" #include "viewmodels/WalletPropertiesVM.h" #include "PendingTransactionFilterModel.h" #include "Utils.h" @@ -168,10 +170,6 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) addrModel_ = new QmlAddressListModel(logger, this); txModel_ = new TxListModel(logger, this); expTxByAddrModel_ = new TxListForAddr(logger, this); - txOutputsModel_ = new TxOutputsModel(logger, this); - txInputsModel_ = new TxInputsModel(logger, txOutputsModel_, this); - txInputsSelectedModel_ = new TxInputsSelectedModel(this); - txInputsSelectedModel_->setSourceModel(txInputsModel_); hwDeviceModel_ = new HwDeviceModel(logger, this); walletBalances_ = new WalletBalancesModel(logger, this); feeSuggModel_ = new FeeSuggestionModel(logger, this); @@ -276,13 +274,15 @@ void QtQuickAdapter::run(int &argc, char **argv) qmlRegisterInterface("QUTXOList"); qmlRegisterInterface("QTxDetails"); qmlRegisterInterface("ArmoryServersModel"); + qmlRegisterInterface("QTxOutputsModel"); + qmlRegisterInterface("QTxInputsModel"); + qmlRegisterInterface("QTxInputsSelectedModel"); qmlRegisterUncreatableMetaObject(WalletBalance::staticMetaObject, "wallet.balance" , 1, 0, "WalletBalance", tr("Error: only enums")); qmlRegisterType("terminal.models", 1, 0, "TransactionForAddressFilterModel"); qmlRegisterType("terminal.models", 1, 0, "PendingTransactionFilterModel"); qmlRegisterUncreatableMetaObject(qtquick_gui::WalletPropertiesVM::staticMetaObject, "terminal.models" , 1, 0, "WalletPropertiesVM", tr("Error: only enums")); -// qmlRegisterType("terminal.models", 1, 0, "WalletPropertiesVM"); qmlRegisterUncreatableMetaObject(Transactions::staticMetaObject, "terminal.models" , 1, 0, "Transactions", tr("Error: only enums")); qmlRegisterUncreatableMetaObject(TxListModel::staticMetaObject, "terminal.models" @@ -304,9 +304,6 @@ void QtQuickAdapter::run(int &argc, char **argv) rootCtxt_->setContextProperty(QLatin1Literal("addressListModel"), addrModel_); rootCtxt_->setContextProperty(QLatin1Literal("txListModel"), txModel_); rootCtxt_->setContextProperty(QLatin1Literal("txListByAddrModel"), expTxByAddrModel_); - rootCtxt_->setContextProperty(QLatin1Literal("txInputsModel"), txInputsModel_); - rootCtxt_->setContextProperty(QLatin1Literal("txInputsSelectedModel"), txInputsSelectedModel_); - rootCtxt_->setContextProperty(QLatin1Literal("txOutputsModel"), txOutputsModel_); rootCtxt_->setContextProperty(QLatin1Literal("hwDeviceModel"), hwDeviceModel_); rootCtxt_->setContextProperty(QLatin1Literal("walletBalances"), walletBalances_); rootCtxt_->setContextProperty(QLatin1Literal("feeSuggestions"), feeSuggModel_); @@ -797,7 +794,7 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) case WalletsMessage::kWalletsListResponse: return processWalletsList(msg.wallets_list_response()); case WalletsMessage::kUtxos: - return processUTXOs(msg.utxos()); + return processUTXOs(env.responseId(), msg.utxos()); case WalletsMessage::kReservedUtxos: return processReservedUTXOs(msg.reserved_utxos()); case WalletsMessage::kWalletChanged: @@ -880,12 +877,14 @@ void QtQuickAdapter::updateStates() //TODO } -void QtQuickAdapter::setTopBlock(uint32_t topBlock) +void QtQuickAdapter::setTopBlock(uint32_t curBlock) { - blockNum_ = topBlock; + if (curBlock > blockNum_) { + emit topBlock(curBlock); + } + blockNum_ = curBlock; txModel_->setCurrentBlock(blockNum_); expTxByAddrModel_->setCurrentBlock(blockNum_); - txInputsModel_->setTopBlock(topBlock); } void QtQuickAdapter::loadPlugins(QQmlApplicationEngine& engine) @@ -1200,7 +1199,9 @@ ProcessingResult QtQuickAdapter::processWalletData(bs::message::SeqId msgId , QString::fromStdString(addr.index()) , assetTypeToString(static_cast(addr.asset_type()))}); } - addrModel_->addRows(response.wallet_id(), addresses); + QMetaObject::invokeMethod(this, [this, response, addresses] { + addrModel_->addRows(response.wallet_id(), addresses); + }); return ProcessingResult::Success; } @@ -1313,7 +1314,7 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId else { QMetaObject::invokeMethod(this, [this, details = itTxDet->second, txDet] { details->setDetails(txDet); - details->setCurBlock(blockNum_); + details->onTopBlock(blockNum_); }); // shouldn't be more than one entry txDetailReqs_.erase(itTxDet); } @@ -1493,15 +1494,13 @@ bool QtQuickAdapter::validateAddress(const QString& addr) { const auto& addrStr = addr.toStdString(); try { - bs::Address::fromAddressString(addrStr); - return QRegularExpression(QString::fromLatin1("^(?:[13]{1}[a-km-zA-HJ-NP-Z1-9]{26,33}|bc1[a-z0-9]{39,59}|tb1[a-z0-9]{39,59})$") - ).match(addr).hasMatch(); + const auto& addr = bs::Address::fromAddressString(addrStr); + return (addr.getType() != AddressEntryType_Default); } catch (const std::exception& e) { logger_->warn("[{}] invalid address {}: {}", __func__, addrStr, e.what()); return false; } - return true; } ArmoryServersModel* QtQuickAdapter::getArmoryServers() @@ -1610,7 +1609,7 @@ void QtQuickAdapter::requestFeeSuggestions() feeSuggModel_->clear(); } -QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStringList& recvAddrs +QTXSignRequest* QtQuickAdapter::newTXSignRequest(int walletIndex, const QStringList& recvAddrs , const QList& recvAmounts, double fee, const QString& comment, bool isRbf, QUTXOList* utxos) { WalletsMessage msg; @@ -1620,23 +1619,7 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri } bool isMaxAmount = false; if (recvAddrs.isEmpty()) { - const auto& recipients = txOutputsModel_->recipients(); - for (const auto& recip : recipients) { - try { - const auto& addr = bs::Address::fromRecipient(recip); - auto msgOut = msgReq->add_outputs(); - msgOut->set_address(addr.display()); - if (recip->getValue()) { - msgOut->set_amount(recip->getValue() / BTCNumericTypes::BalanceDivider); - } - else { - isMaxAmount = true; - } - } - catch (const std::exception& e) { - logger_->error("[{}] recipient {}", __func__, e.what()); - } - } + return nullptr; } else { int idx = 0; @@ -1659,15 +1642,19 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri } } msgReq->set_rbf(isRbf); - msgReq->set_fee_per_byte(fee); + if (fee < 1.0) { + msgReq->set_fee(fee * BTCNumericTypes::BalanceDivider); + } + else { + msgReq->set_fee_per_byte(fee); + } if (!comment.isEmpty()) { msgReq->set_comment(comment.toStdString()); } - QTXSignRequest* txReq = nullptr; + auto txReq = new QTXSignRequest(logger_, this); std::vector inputs; if (utxos) { if (walletIndex < 0) { - txReq = new QTXSignRequest(logger_, this); for (const auto& qUtxo : utxos->data()) { txReq->addInput(qUtxo->input()); } @@ -1702,47 +1689,74 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, const QStri } else { for (const auto& qUtxo : utxos->data()) { - msgReq->add_utxos(qUtxo->utxo().serialize().toBinStr()); - inputs.push_back(qUtxo->utxo()); + if (qUtxo->utxo().getValue()) { + logger_->debug("[{}] UTXO {} @ {}", __func__, qUtxo->utxo().getValue(), qUtxo->utxo().getTxHash().toHexStr(true)); + msgReq->add_utxos(qUtxo->utxo().serialize().toBinStr()); + inputs.push_back(qUtxo->utxo()); + } + else { + logger_->warn("[{}] UTXO not found, input {} @ {} is ignored", __func__ + , qUtxo->input().amount, qUtxo->input().txHash.toHexStr(true)); + } } } } const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); - if (!txReq) { - txReq = new QTXSignRequest(logger_, this); - } if (!inputs.empty()) { - txReq->setInputs(inputs); + QMetaObject::invokeMethod(this, [txReq, inputs] { + txReq->setInputs(inputs); + }); } txReqs_[msgId] = { txReq, isMaxAmount }; return txReq; } -void QtQuickAdapter::getUTXOsForWallet(int walletIndex) +QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, QTxDetails* txDet + , double fee, const QString& comment, bool isRbf, QUTXOList* utxos) { - txInputsModel_->clear(); + if (!txDet) { + logger_->error("[{}] TX details object cannot be null", __func__); + return nullptr; + } + return newTXSignRequest(walletIndex, txDet->outputsModel()->getOutputAddresses() + , txDet->outputsModel()->getOutputAmounts(), fee, comment, isRbf, utxos); +} + +void QtQuickAdapter::getUTXOsForWallet(int walletIndex, QTxDetails* txDet) +{ + if (txDet) { + txDet->inputsModel()->clear(); + } WalletsMessage msg; auto msgReq = msg.mutable_get_utxos(); msgReq->set_wallet_id(hdWalletIdByIndex(walletIndex)); msgReq->set_confirmed_only(false); - pushRequest(user_, userWallets_, msg.SerializeAsString()); + const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); + + if (msgId && txDet) { + txDetailReqs_[msgId] = txDet; + } } QTxDetails* QtQuickAdapter::getTXDetails(const QString& txHash) { auto txBinHash = BinaryData::CreateFromHex(txHash.trimmed().toStdString()); txBinHash.swapEndian(); - if (txBinHash.getSize() != 32) { - logger_->warn("[{}] invalid TX hash size {}", __func__, txBinHash.getSize()); - return new QTxDetails(logger_, {}, this); - } - WalletsMessage msg; - auto msgReq = msg.mutable_tx_details_request(); - auto txReq = msgReq->add_requests(); - txReq->set_tx_hash(txBinHash.toBinStr()); - const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); const auto txDet = new QTxDetails(logger_, txBinHash, this); - txDetailReqs_[msgId] = txDet; + connect(this, &QtQuickAdapter::topBlock, txDet, &QTxDetails::onTopBlock); + + if (!txBinHash.empty()) { + if (txBinHash.getSize() != 32) { + logger_->warn("[{}] invalid TX hash size {}", __func__, txBinHash.getSize()); + return txDet; + } + WalletsMessage msg; + auto msgReq = msg.mutable_tx_details_request(); + auto txReq = msgReq->add_requests(); + txReq->set_tx_hash(txBinHash.toBinStr()); + const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); + txDetailReqs_[msgId] = txDet; + } return txDet; } @@ -1919,10 +1933,14 @@ bs::message::ProcessingResult QtQuickAdapter::processWalletSeed(const BlockSettl return bs::message::ProcessingResult::Success; } -ProcessingResult QtQuickAdapter::processUTXOs(const WalletsMessage_UtxoListResponse& response) +ProcessingResult QtQuickAdapter::processUTXOs(bs::message::SeqId msgId, const WalletsMessage_UtxoListResponse& response) { logger_->debug("[{}] {} UTXOs for {}", __func__, response.utxos_size(), response.wallet_id()); - walletPropertiesModel_->setNbUTXOs(response.wallet_id(), response.utxos_size()); + const auto& itReq = txDetailReqs_.find(msgId); + if (itReq == txDetailReqs_.end()) { + walletPropertiesModel_->setNbUTXOs(response.wallet_id(), response.utxos_size()); + return ProcessingResult::Success; + } std::vector utxos; for (const auto& serUtxo : response.utxos()) { @@ -1930,7 +1948,8 @@ ProcessingResult QtQuickAdapter::processUTXOs(const WalletsMessage_UtxoListRespo utxo.unserialize(BinaryData::fromString(serUtxo)); utxos.push_back(std::move(utxo)); } - txInputsModel_->addUTXOs(utxos); + itReq->second->inputsModel()->addUTXOs(utxos); + txDetailReqs_.erase(itReq); return ProcessingResult::Success; } @@ -2183,7 +2202,9 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq logger_->error("[{}] unknown walletId {}", __func__, walletId); } } - qReq->setTxSignReq(txReq); + QMetaObject::invokeMethod(this, [qReq, txReq] { + qReq->setTxSignReq(txReq); + }); return bs::message::ProcessingResult::Success; } @@ -2238,7 +2259,9 @@ bs::message::ProcessingResult QtQuickAdapter::processUTXOs(bs::message::SeqId ms } } } - itReq->second.txReq->setInputs(inputs); + QMetaObject::invokeMethod(this, [txReq = itReq->second.txReq, inputs] { + txReq->setInputs(inputs); + }); logger_->debug("[{}] matched {} UTXOs of {}", __func__, msgReq->utxos_size(), dummyUTXOs.size()); if (msgReq->utxos_size() != dummyUTXOs.size()) { itReq->second.txReq->setError(tr("Failed to obtain UTXO[s]")); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 4494077f2..7d3f10790 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -21,8 +21,6 @@ #include "ApplicationSettings.h" #include "hwdevicemodel.h" #include "ThreadSafeClasses.h" -#include "TxInputsModel.h" -#include "TxInputsSelectedModel.h" #include "TxListModel.h" #include "UiUtils.h" #include "Wallets/SignContainer.h" @@ -74,8 +72,6 @@ class QQmlContext; class QmlWalletsList; class QTxDetails; class QTXSignRequest; -class TxInputsModel; -class TxOutputsModel; class WalletBalancesModel; class AddressFilterModel; class TransactionFilterModel; @@ -172,9 +168,11 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE bool delArmoryServer(ArmoryServersModel*, int idx); Q_INVOKABLE void requestFeeSuggestions(); - Q_INVOKABLE QTXSignRequest* createTXSignRequest(int walletIndex, const QStringList& recvAddrs + Q_INVOKABLE QTXSignRequest* newTXSignRequest(int walletIndex, const QStringList& recvAddrs , const QList& recvAmounts, double fee, const QString& comment = {}, bool isRbf = true, QUTXOList* utxos = nullptr); - Q_INVOKABLE void getUTXOsForWallet(int walletIndex); + Q_INVOKABLE QTXSignRequest* createTXSignRequest(int walletIndex, QTxDetails* + , double fee, const QString& comment = {}, bool isRbf = true, QUTXOList* utxos = nullptr); + Q_INVOKABLE void getUTXOsForWallet(int walletIndex, QTxDetails*); Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); Q_INVOKABLE int getSearchInputType(const QString&); Q_INVOKABLE void startAddressSearch(const QString&); @@ -228,6 +226,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void failedTx(const QString&); void showSuccess(const QString&); void rescanCompleted(const QString& walletId); + void topBlock(quint32); private slots: void onArmoryServerChanged(const QModelIndex&, const QVariant&); @@ -272,7 +271,7 @@ private slots: bs::message::ProcessingResult processWalletsList(const BlockSettle::Common::WalletsMessage_WalletsListResponse&); bs::message::ProcessingResult processWalletDeleted(const std::string& walletId); bs::message::ProcessingResult processWalletSeed(const BlockSettle::Common::SignerMessage_WalletSeed&); - bs::message::ProcessingResult processUTXOs(const BlockSettle::Common::WalletsMessage_UtxoListResponse&); + bs::message::ProcessingResult processUTXOs(bs::message::SeqId, const BlockSettle::Common::WalletsMessage_UtxoListResponse&); bs::message::ProcessingResult processSignTX(bs::message::SeqId, const BlockSettle::Common::SignerMessage_SignTxResponse&); bs::message::ProcessingResult processZC(const BlockSettle::Common::ArmoryMessage_ZCReceived&); bs::message::ProcessingResult processZCInvalidated(const BlockSettle::Common::ArmoryMessage_ZCInvalidated&); @@ -325,9 +324,6 @@ private slots: QmlAddressListModel* addrModel_{ nullptr }; TxListModel* txModel_{ nullptr }; TxListForAddr* expTxByAddrModel_{ nullptr }; - TxInputsModel* txInputsModel_{ nullptr }; - TxInputsSelectedModel * txInputsSelectedModel_{ nullptr }; - TxOutputsModel* txOutputsModel_{ nullptr }; HwDeviceModel* hwDeviceModel_{ nullptr }; WalletBalancesModel* walletBalances_{ nullptr }; FeeSuggestionModel* feeSuggModel_{ nullptr }; diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index f39dd20f5..18d5554ec 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -14,6 +14,7 @@ #include #include "ColorScheme.h" #include "StringUtils.h" +#include "TxInputsSelectedModel.h" #include "TxOutputsModel.h" #include "Utils.h" @@ -651,53 +652,67 @@ QString TxListForAddr::balance() const } +QTxDetails::QTxDetails(const std::shared_ptr& logger, const BinaryData& txHash, QObject* parent) + : QObject(parent), logger_(logger), txHash_(txHash) +{ + outputsModel_ = new TxOutputsModel(logger_, this); + inputsModel_ = new TxInputsModel(logger_, outputsModel_, this); + selInputsModel_ = new TxInputsSelectedModel(this); + selInputsModel_->setSourceModel(inputsModel_); + ownOutputs_ = new TxInputsModel(logger_, outputsModel_, this); + inputs_ = new TxInOutModel(tr("Input"), this); + outputs_ = new TxInOutModel(tr("Output"), this); +} + void QTxDetails::setDetails(const bs::sync::TXWalletDetails& details) { details_ = details; if (details.changeAddress.address.isValid()) { details_.outputAddresses.push_back(details.changeAddress); } - inputsModel_ = new TxInOutModel(details_.inputAddresses, tr("Input"), this); - outputsModel_ = new TxInOutModel(details_.outputAddresses, tr("Output"), this); - auto outputsModel = new TxOutputsModel(logger_, this); + for (const auto& entry : details_.outputAddresses) { + logger_->debug("[{}] out: {} {}", __func__, entry.address.display(), entry.value); + } + inputs_->setData(details_.inputAddresses); + outputs_->setData(details_.outputAddresses); + outputsModel_->clearOutputs(); + inputsModel_->clear(); + ownOutputs_->clear(); for (const auto& out : details.outputAddresses) { - outputsModel->addOutput(QString::fromStdString(out.address.display()) + outputsModel_->addOutput(QString::fromStdString(out.address.display()) , out.value / BTCNumericTypes::BalanceDivider); } - ownInputs_ = new TxInputsModel(logger_, outputsModel, this); std::vector inputs; inputs.reserve(details.inputAddresses.size()); for (const auto& in : details.inputAddresses) { inputs.push_back({ in.address, in.outHash, in.outIndex, in.value }); } - ownOutputs_ = new TxInputsModel(logger_, outputsModel, this); - outputs_.clear(); - outputs_.reserve(details.inputAddresses.size()); + outs_.clear(); + outs_.reserve(details.inputAddresses.size()); const auto& txId = details_.tx.isInitialized() ? details_.tx.getThisHash() : BinaryData{}; for (const auto& out : details.outputAddresses) { - outputs_.push_back({ out.address, txId, out.outIndex, out.value }); + outs_.push_back({ out.address, txId, out.outIndex, out.value }); } - - ownInputs_->addEntries(inputs); - ownOutputs_->addEntries(outputs_); + inputsModel_->addEntries(inputs); + ownOutputs_->addEntries(outs_); emit updated(); } std::vector> QTxDetails::outputData() const { std::vector> result; - for (const auto& out : outputs_) { + for (const auto& out : outs_) { result.push_back({out.address, out.amount / BTCNumericTypes::BalanceDivider}); } return result; } -void QTxDetails::setCurBlock(uint32_t curBlock) +void QTxDetails::onTopBlock(quint32 curBlock) { if (curBlock_ != curBlock) { curBlock_ = curBlock; - if (ownInputs_) { - ownInputs_->setTopBlock(curBlock); + if (inputsModel_) { + inputsModel_->setTopBlock(curBlock); } if (ownOutputs_) { ownOutputs_->setTopBlock(curBlock); @@ -792,13 +807,19 @@ bs::sync::Transaction::Direction QTxDetails::direction() const return details_.direction; } -TxInOutModel::TxInOutModel(const std::vector& data, const QString& type, QObject* parent) +TxInOutModel::TxInOutModel(const QString& type, QObject* parent) : QAbstractTableModel(parent) - , data_(data) , type_(type) , header_{ tr("Type"), tr("Address"), tr("Amount"), tr("Wallet") } {} +void TxInOutModel::setData(const std::vector& data) +{ + beginResetModel(); + data_ = data; + endResetModel(); +} + int TxInOutModel::rowCount(const QModelIndex&) const { return data_.size(); diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index f30c0e4fa..2ba45f5a4 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -138,8 +138,9 @@ class TxInOutModel : public QAbstractTableModel enum TableRoles { TableDataRole = Qt::UserRole + 1, ColorRole, TxHashRole }; - TxInOutModel(const std::vector& data, const QString& type, QObject* parent = nullptr); + TxInOutModel(const QString& type, QObject* parent = nullptr); + void setData(const std::vector& data); int rowCount(const QModelIndex & = QModelIndex()) const override; int columnCount(const QModelIndex & = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role) const override; @@ -153,7 +154,7 @@ class TxInOutModel : public QAbstractTableModel private: const QString type_; const QStringList header_; - const std::vector data_; + std::vector data_; }; namespace Transactions { @@ -167,17 +168,18 @@ namespace Transactions { Q_ENUM_NS(Direction) } +class TxInputsSelectedModel; +class TxOutputsModel; + class QTxDetails : public QObject { Q_OBJECT public: QTxDetails(const std::shared_ptr& logger, const BinaryData& txHash - , QObject* parent = nullptr) - : QObject(parent), logger_(logger), txHash_(txHash) - {} + , QObject* parent = nullptr); + ~QTxDetails() override = default; void setDetails(const bs::sync::TXWalletDetails&); - void setCurBlock(uint32_t); Q_PROPERTY(QString txId READ txId NOTIFY updated) QString txId() const { return QString::fromStdString(txHash_.toHexStr(true)); } @@ -202,14 +204,18 @@ class QTxDetails : public QObject Q_PROPERTY(QString timestamp READ timestamp NOTIFY updated) QString timestamp() const; - Q_PROPERTY(TxInOutModel* inputs READ inputs NOTIFY updated) - TxInOutModel* inputs() const { return inputsModel_; } - Q_PROPERTY(TxInOutModel* outputs READ outputs NOTIFY updated) - TxInOutModel* outputs() const { return outputsModel_; } - Q_PROPERTY(TxInputsModel* ownInputs READ ownInputs NOTIFY updated) - TxInputsModel* ownInputs() const { return ownInputs_; } - Q_PROPERTY(TxInputsModel* ownOutputs READ ownOutputs NOTIFY updated) + Q_PROPERTY(TxInOutModel* inputs READ inputs CONSTANT) + TxInOutModel* inputs() const { return inputs_; } + Q_PROPERTY(TxInOutModel* outputs READ outputs CONSTANT) + TxInOutModel* outputs() const { return outputs_; } + Q_PROPERTY(TxInputsModel* inputsModel READ inputsModel CONSTANT) + TxInputsModel* inputsModel() const { return inputsModel_; } + Q_PROPERTY(TxInputsSelectedModel* selectedInputsModel READ selInputsModel CONSTANT) + TxInputsSelectedModel* selInputsModel() const { return selInputsModel_; } + Q_PROPERTY(TxInputsModel* ownOutputs READ ownOutputs CONSTANT) TxInputsModel* ownOutputs() const { return ownOutputs_; } + Q_PROPERTY(TxOutputsModel* outputsModel READ outputsModel CONSTANT) + TxOutputsModel* outputsModel() const { return outputsModel_; } std::vector> outputData() const; bs::sync::Transaction::Direction direction() const; @@ -218,15 +224,20 @@ class QTxDetails : public QObject void updated(); void newBlock(); +public slots: + void onTopBlock(quint32); + private: std::shared_ptr logger_; const BinaryData txHash_; bs::sync::TXWalletDetails details_; - TxInOutModel* inputsModel_{ nullptr }; - TxInOutModel* outputsModel_{ nullptr }; - TxInputsModel* ownInputs_{ nullptr }; + TxInOutModel* inputs_{ nullptr }; + TxInOutModel* outputs_{ nullptr }; + TxInputsModel* inputsModel_{ nullptr }; + TxInputsSelectedModel* selInputsModel_{ nullptr }; TxInputsModel* ownOutputs_{ nullptr }; - std::vector outputs_; + TxOutputsModel* outputsModel_{ nullptr }; + std::vector outs_; uint32_t curBlock_{ 0 }; }; diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index f8b389d82..01d3afe26 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -52,7 +52,7 @@ Rectangle { anchors.fill: parent onRequestWalletProperties: { - bsApp.getUTXOsForWallet(walletIndex) + bsApp.getUTXOsForWallet(walletIndex, null) walletProperties.show() walletProperties.raise() walletProperties.requestActivate() diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 53772e824..523c76056 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -27,21 +27,10 @@ ColumnLayout { property var tx: null property bool isRBF: false property bool isCPFP: false - property bool is_ready_broadcast: (txOutputsModel.rowCount > 1) && rec_addr_input.input_text.length === 0 && amount_input.input_text.length === 0 + property bool is_ready_broadcast: (tx.outputsModel.rowCount > 1) && rec_addr_input.input_text.length === 0 && amount_input.input_text.length === 0 property bool is_ready_output: (rec_addr_input.isValid && rec_addr_input.input_text.length && parseFloat(amount_input.input_text) !== 0 && amount_input.input_text.length) - Connections - { - target:tx - function onUpdated () - { - if (isRBF) { - txOutputsModel.setOutputsFrom(tx) - } - } - } - RowLayout { Layout.fillWidth: true @@ -277,7 +266,7 @@ ColumnLayout { amount_input.input_text = tempRequest.maxAmount } - bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex, tx) } Connections { @@ -308,16 +297,16 @@ ColumnLayout { else if (isCPFP) { } else { - txInputsModel.fee = parseFloat(fee_suggest_combo.edit_value()) - bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) - txOutputsModel.clearOutputs() + tx.inputsModel.fee = parseFloat(fee_suggest_combo.edit_value()) + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex, tx) + tx.outputsModel.clearOutputs() } } function setup_fee() { if (tx !== null && (isRBF || isCPFP)) { fee_suggest_combo.currentIndex = feeSuggestions.rowCount - 1 - fee_suggest_combo.input_item.text = Qt.binding(function() { return tx.feePerByte }) + fee_suggest_combo.input_item.text = Qt.binding(function() { return tx.feePerByte * 2 }) } } } @@ -353,7 +342,7 @@ ColumnLayout { Layout.rightMargin: BSSizes.applyScale(16) Layout.preferredHeight: BSSizes.applyScale(300) - model: isRBF ? tx.ownInputs : isCPFP ? tx.ownOutputs : txInputsSelectedModel + model: isRBF ? tx.inputsModel : isCPFP ? tx.ownOutputs : tx.selectedInputsModel columnWidths: [0.7, 0.1, 0, 0.2] copy_button_column_index: -1 @@ -531,12 +520,8 @@ ColumnLayout { height: BSSizes.applyScale(70) function getMax() { - if (!isRBF && !isCPFP && txInputsSelectedModel.rowCount > 1) { - var maxValue = parseFloat(tempRequest.maxAmount) - txOutputsModel.totalAmount - return (maxValue >= 0 ? maxValue : 0).toFixed(8) - } - return tempRequest.maxAmount - + var maxValue = parseFloat(tempRequest.maxAmount) - tx.outputsModel.totalAmount + return (maxValue >= 0 ? maxValue : 0).toFixed(8) } onEnterPressed: { @@ -591,13 +576,14 @@ ColumnLayout { function click_enter() { if (!include_output_but.enabled) return - txOutputsModel.addOutput(rec_addr_input.input_text, amount_input.input_text) + //txOutputsModel.addOutput(rec_addr_input.input_text, amount_input.input_text) + tx.outputsModel.addOutput(rec_addr_input.input_text, amount_input.input_text) rec_addr_input.input_text = "" amount_input.input_text = "" if (!isRBF && !isCPFP) { - txInputsModel.updateAutoselection() + tx.inputsModel.updateAutoselection() } } } @@ -631,7 +617,7 @@ ColumnLayout { Layout.leftMargin: BSSizes.applyScale(16) Layout.rightMargin: BSSizes.applyScale(16) - model: txOutputsModel + model: tx.outputsModel //txOutputsModel columnWidths: [0.544, 0.2, 0.20, 0.056] copy_button_column_index: -1 @@ -640,12 +626,13 @@ ColumnLayout { onDeleteRequested: (row) => { - txOutputsModel.delOutput(row) - if (txOutputsModel.rowCount <= 1 && !isRBF && !isCPFP) { - txInputsModel.clearSelection() + //txOutputsModel.delOutput(row) + model.delOutput(row) + if (model.rowCount <= 1 && !isRBF && !isCPFP) { + tx.inputsModel.clearSelection() } - else if (txOutputsModel.rowCount > 1 && !isRBF && !isCPFP) { - txInputsModel.updateAutoselection() + else if (model.rowCount > 1 && !isRBF && !isCPFP) { + tx.inputsModel.updateAutoselection() } } @@ -680,7 +667,7 @@ ColumnLayout { activeFocusOnTab: continue_but.enabled - enabled: (txOutputsModel.rowCount > 1) + enabled: (tx.outputsModel.rowCount > 1) //(txOutputsModel.rowCount > 1) preferred: isRBF || is_ready_broadcast width: BSSizes.applyScale(1084) @@ -691,28 +678,27 @@ ColumnLayout { text: (tempRequest !== null && tempRequest.isWatchingOnly) ? qsTr("Export transaction") : qsTr("Continue") function prepare_transaction() { + var fee = /*tempRequest ? tempRequest.fee :*/ parseFloat(fee_suggest_combo.edit_value()) + console.log("fee: " + fee) if (isRBF) { return bsApp.createTXSignRequest(-1 //special index for RBF mode - , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() - , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text - , checkbox_rbf.checked, tx.ownInputs.zcInputs()) + , tx, fee, comment_input.input_text + , checkbox_rbf.checked, tx.inputsModel.zcInputs()) } else if (isCPFP) { return bsApp.createTXSignRequest(-2 //special index for CPFP mode - , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() - , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text + , tx, fee, comment_input.input_text , checkbox_rbf.checked, tx.ownOutputs.zcInputs()) } else { // normal operation if (table_sel_inputs.model.rowCount) { return bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() - , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text - , checkbox_rbf.checked, txInputsModel.getSelection()) + , tx, parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text + , checkbox_rbf.checked, tx.inputsModel.getSelection()) } else { return bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , txOutputsModel.getOutputAddresses(), txOutputsModel.getOutputAmounts() + , tx.outputsModel.getOutputAddresses(), tx.outputsModel.getOutputAmounts() , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text) } } @@ -727,13 +713,12 @@ ColumnLayout { fee_suggest_combo.input_text = fee_suggest_combo.currentText } - if (tempRequest.isWatchingOnly) + if (tempRequest && tempRequest.isWatchingOnly) { exportFileDialog.currentFile = "file:///" + bsApp.makeExportTransactionFilename(tempRequest) exportFileDialog.open() } - else - { + else { layout.sig_continue(prepare_transaction()) } } @@ -765,17 +750,21 @@ ColumnLayout { { if (rec_addr_input.isValid && rec_addr_input.input_text.length) { var fpb = parseFloat(fee_suggest_combo.edit_value()) - if (!isRBF && !isCPFP && txInputsSelectedModel.rowCount > 1) { - var outputAddresses = txOutputsModel.getOutputAddresses() + var outputAddresses = tx.outputsModel.getOutputAddresses() + if (rec_addr_input.input_text.length > 0) { outputAddresses.push(rec_addr_input.input_text) - var outputAmounts = txOutputsModel.getOutputAmounts() - tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex + } + var outputAmounts = tx.outputsModel.getOutputAmounts() + + if (!isRBF && !isCPFP/* && tx.selectedInputsModel.rowCount > 1*/) { + tempRequest = bsApp.newTXSignRequest(from_wallet_combo.currentIndex , outputAddresses, outputAmounts, (fpb > 0) ? fpb : 1.0) } else { - tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) + tempRequest = bsApp.newTXSignRequest(-1 + , outputAddresses, outputAmounts, (fpb > 0) ? fpb : 1.0 + , "", true, table_sel_inputs.model.zcInputs()) } } } @@ -814,13 +803,14 @@ ColumnLayout { rec_addr_input.input_text = "" checkbox_rbf.checked = true - txOutputsModel.clearOutputs() + tx.outputsModel.clearOutputs() if (!isRBF && !isCPFP) { - bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex) + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex, tx) } else { + create_temp_request() if (isRBF) { - txOutputsModel.setOutputsFrom(tx) + tx.outputsModel.setOutputsFrom(tx) } } bsApp.requestFeeSuggestions() diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml index a06563b6f..e948e2aeb 100644 --- a/GUI/QtQuick/qml/Send/SelectInputs.qml +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -17,7 +17,7 @@ import "../BsStyles" import "../StyledControls" ColumnLayout { - + property var inputsModel: null id: layout property int text_header_size: BSSizes.applyScale(11) @@ -56,7 +56,7 @@ ColumnLayout { height: parent.height - BSSizes.applyScale(12) anchors.centerIn: parent - model: txInputsModel + model: inputsModel columnWidths: [0.7, 0.1, 0.1, 0.1] copy_button_column_index: -1 @@ -80,7 +80,7 @@ ColumnLayout { checkable: true onClicked: { - txInputsModel.toggleSelection(model_row) + inputsModel.toggleSelection(model_row) } } @@ -108,7 +108,7 @@ ColumnLayout { onClicked: { if (model_row !== 0) - txInputsModel.toggle(model_row) + inputsModel.toggle(model_row) } } } @@ -134,7 +134,7 @@ ColumnLayout { onClicked: { if (model_row !== 0) - txInputsModel.toggle(model_row) + inputsModel.toggle(model_row) } } } @@ -235,7 +235,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: BSSizes.applyScale(20) - text: txInputsModel.nbTx + text: inputsModel.nbTx color: "#FFFFFF" @@ -253,7 +253,7 @@ ColumnLayout { anchors.right: parent.right anchors.rightMargin: BSSizes.applyScale(20) - text: txInputsModel.balance + text: inputsModel.balance color: "#FFFFFF" diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index a22f61479..38fb53c2a 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -16,13 +16,14 @@ CustomPopup { _stack_view.initialItem: simple_details _arrow_but_visibility: !simple_details.visible && !advanced_details.visible - property var tx: null + property var tx: bsApp.getTXDetails("") property bool isRBF: false property bool isCPFP: false SimpleDetails { id: simple_details visible: false + tx: root.tx onSig_continue: (signature) => { sign_trans.txSignRequest = signature @@ -89,6 +90,7 @@ CustomPopup { } SelectInputs { + inputsModel: tx.inputsModel id: select_inputs visible: false } @@ -163,7 +165,6 @@ CustomPopup { { advanced_details.init() } - root.tx = null root.isRBF = false root.isCPFP = false } diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 4d8567634..0c974e6ad 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -11,6 +11,7 @@ import "../StyledControls" import wallet.balance 1.0 ColumnLayout { + property var tx: null id: layout @@ -116,7 +117,6 @@ ColumnLayout { text: qsTr("Advanced") - icon.color: "transparent" icon.source: "qrc:/images/advanced_icon.png" icon.width: BSSizes.applyScale(16) @@ -135,7 +135,7 @@ ColumnLayout { } onClicked: { - layout.sig_advanced() + layout.sig_advanced(tx) } } } @@ -278,7 +278,7 @@ ColumnLayout { preferred: true function prepare_transaction() { - return bsApp.createTXSignRequest(from_wallet_combo.currentIndex + return bsApp.newTXSignRequest(from_wallet_combo.currentIndex , [rec_addr_input.input_text], [parseFloat(amount_input.input_text)] , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text) } @@ -330,7 +330,7 @@ ColumnLayout { { if (rec_addr_input.isValid && rec_addr_input.input_text.length) { var fpb = parseFloat(fee_suggest_combo.edit_value()) - tempRequest = bsApp.createTXSignRequest(from_wallet_combo.currentIndex + tempRequest = bsApp.newTXSignRequest(from_wallet_combo.currentIndex , [rec_addr_input.input_text], [], (fpb > 0) ? fpb : 1.0) } } diff --git a/GUI/QtQuick/qml/TransactionDetails.qml b/GUI/QtQuick/qml/TransactionDetails.qml index 26d7d2ec4..248d6da44 100644 --- a/GUI/QtQuick/qml/TransactionDetails.qml +++ b/GUI/QtQuick/qml/TransactionDetails.qml @@ -272,7 +272,7 @@ Popup { width: parent.width - BSSizes.applyScale(20) height: parent.height anchors.centerIn: parent - model: tx !== null ? tx.inputs : [] + model: tx.inputs copy_button_column_index: 1 columnWidths: [0.1, 0.5, 0.2, 0.2] @@ -300,7 +300,7 @@ Popup { width: parent.width - BSSizes.applyScale(20) height: parent.height anchors.centerIn: parent - model: tx !== null ? tx.outputs : [] + model: tx.outputs copy_button_column_index: 1 columnWidths: [0.1, 0.5, 0.2, 0.2] diff --git a/common b/common index 103f38ac3..03e3000ca 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 103f38ac3380a7fdf9b0637071a7fcbe3d816313 +Subproject commit 03e3000ca255a505db8223a87c5c022b0c400b09 From 87771bbe4438ecaee31d230ff13c7d9820e8fda0 Mon Sep 17 00:00:00 2001 From: yz Date: Mon, 8 May 2023 00:54:33 +0300 Subject: [PATCH 392/436] Bugfix --- GUI/QtQuick/AddressListModel.cpp | 8 +- GUI/QtQuick/ArmoryServersModel.cpp | 8 ++ GUI/QtQuick/ArmoryServersModel.h | 3 + GUI/QtQuick/QtQuickAdapter.cpp | 10 +- GUI/QtQuick/ScaleController.h | 3 +- GUI/QtQuick/TxListModel.h | 1 + GUI/QtQuick/TxOutputsModel.cpp | 15 ++- GUI/QtQuick/WalletBalancesModel.cpp | 6 +- GUI/QtQuick/WalletBalancesModel.h | 2 +- GUI/QtQuick/qml/ExplorerTX.qml | 7 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 5 +- GUI/QtQuick/qml/Settings/SettingsPopup.qml | 6 + .../qml/StyledControls/CustomContextMenu.qml | 9 +- .../StyledControls/InputOutputTableView.qml | 4 +- .../WalletPropertiesPopup.qml | 2 + GUI/QtQuick/qml/main.qml | 108 +++++++++++------- 16 files changed, 127 insertions(+), 70 deletions(-) diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index f1667eb63..e87230b9c 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -86,11 +86,9 @@ void QmlAddressListModel::addRow(const std::string& walletId, const QVectorwarn("[{}] {} invalid address {}", __func__, walletId, row.at(0).toStdString()); addresses_.push_back(bs::Address{}); } - QMetaObject::invokeMethod(this, [this, row] { - beginInsertRows(QModelIndex(), rowCount(), rowCount()); - table_.append(row); - endInsertRows(); - }); + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + table_.append(row); + endInsertRows(); } void QmlAddressListModel::addRows(const std::string& walletId, const QVector>& rows) diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index db9f24490..225b2a264 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -190,3 +190,11 @@ bool ArmoryServersModel::isEditable(int row) const { return !data(index(row), DefaultServerRole).toBool(); } + +QString ArmoryServersModel::currentNetworkName() const +{ + if (current_ >= 0 && current_ < data_.size()) { + return data_.at(current_).name; + } + return QString::fromLatin1(""); +} diff --git a/GUI/QtQuick/ArmoryServersModel.h b/GUI/QtQuick/ArmoryServersModel.h index 77140cb75..c4fc83570 100644 --- a/GUI/QtQuick/ArmoryServersModel.h +++ b/GUI/QtQuick/ArmoryServersModel.h @@ -25,6 +25,7 @@ class ArmoryServersModel: public QAbstractListModel Q_PROPERTY(int current READ current WRITE setCurrent NOTIFY currentChanged) Q_PROPERTY(int connected READ connected NOTIFY connectedChanged) Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) + Q_PROPERTY(QString currentNetworkName READ currentNetworkName NOTIFY currentChanged) public: enum TableRoles { @@ -51,6 +52,8 @@ class ArmoryServersModel: public QAbstractListModel bool isEditable(int row) const; + QString currentNetworkName() const; + signals: void changed(const QModelIndex&, const QVariant&); void currentChanged(int index); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 5704fb8e9..b0c60de79 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -291,6 +291,8 @@ void QtQuickAdapter::run(int &argc, char **argv) , 1, 0, "QmlAddressListModel", tr("Error: only enums")); qmlRegisterUncreatableMetaObject(ArmoryServersModel::staticMetaObject, "terminal.models" , 1, 0, "ArmoryServersModel", tr("Error: only enums")); + qmlRegisterUncreatableMetaObject(TxInOutModel::staticMetaObject, "terminal.models" + , 1, 0, "TxInOutModel", tr("Error: only enums")); //need to read files in qml qputenv("QML_XHR_ALLOW_FILE_READ", QByteArray("1")); @@ -2134,8 +2136,12 @@ void QtQuickAdapter::processWalletAddresses(const std::string& walletId const auto lastAddr = addresses.at(addresses.size() - 1); logger_->debug("[{}] {} last address: {}", __func__, hdWalletId, lastAddr.address.display()); addressCache_[lastAddr.address] = hdWalletId; - addrModel_->addRow(hdWalletId, { QString::fromStdString(lastAddr.address.display()) - , QString(), QString::fromStdString(lastAddr.index), assetTypeToString(lastAddr.assetType)}); + + QMetaObject::invokeMethod(this, [this, hdWalletId, lastAddr]() { + addrModel_->addRow(hdWalletId, { QString::fromStdString(lastAddr.address.display()) + , QString(), QString::fromStdString(lastAddr.index), assetTypeToString(lastAddr.assetType) }); + }); + generatedAddress_ = lastAddr.address; emit addressGenerated(); } diff --git a/GUI/QtQuick/ScaleController.h b/GUI/QtQuick/ScaleController.h index 6d0a95844..3b227c3fc 100644 --- a/GUI/QtQuick/ScaleController.h +++ b/GUI/QtQuick/ScaleController.h @@ -23,8 +23,7 @@ class ScaleController : public QObject int screenWidth() const { return screenWidth_; } int screenHeight() const { return screenHeight_; } -private slots: - void update(); + Q_INVOKABLE void update(); signals: void changed(); diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 2ba45f5a4..9ee57a07f 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -138,6 +138,7 @@ class TxInOutModel : public QAbstractTableModel enum TableRoles { TableDataRole = Qt::UserRole + 1, ColorRole, TxHashRole }; + Q_ENUM(TableRoles) TxInOutModel(const QString& type, QObject* parent = nullptr); void setData(const std::vector& data); diff --git a/GUI/QtQuick/TxOutputsModel.cpp b/GUI/QtQuick/TxOutputsModel.cpp index 833b4a40f..f4aa07520 100644 --- a/GUI/QtQuick/TxOutputsModel.cpp +++ b/GUI/QtQuick/TxOutputsModel.cpp @@ -147,12 +147,19 @@ void TxOutputsModel::addOutput(const QString& address, double amount, bool isCha void TxOutputsModel::delOutput(int row) { - if (readOnly_ || (row == 0)) { + if (readOnly_) { return; } - beginRemoveRows(QModelIndex(), row, row); - data_.erase(data_.cbegin() + row - 1); - endRemoveRows(); + if (row == 0) { + beginResetModel(); + data_.clear(); + endResetModel(); + } + else { + beginRemoveRows(QModelIndex(), row, row); + data_.erase(data_.cbegin() + row - 1); + endRemoveRows(); + } } QVariant TxOutputsModel::getData(int row, int col) const diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index ff2a8d8e9..845bfa4f8 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -67,11 +67,11 @@ QVariant WalletBalancesModel::data(const QModelIndex& index, int role) const } QString WalletBalancesModel::getBalance(const std::string& walletId - , const FieldFunc& ff) const + , const FieldFunc& ff, const QString defaultValue) const { const auto& itBal = balances_.find(walletId); if (itBal == balances_.end()) { - return QLatin1String("0.00000000"); + return defaultValue; } return ff(itBal->second); } @@ -221,7 +221,7 @@ QString WalletBalancesModel::numberAddresses() const { if (selectedWallet_ >= 0 && selectedWallet_ < wallets_.size()) { return getBalance(wallets_.at(selectedWallet_).walletId - , [](const Balance& bal) { return QString::number(bal.nbAddresses); }); + , [](const Balance& bal) { return QString::number(bal.nbAddresses); }, QString::fromLatin1("0")); } return tr("-"); } diff --git a/GUI/QtQuick/WalletBalancesModel.h b/GUI/QtQuick/WalletBalancesModel.h index a77229cfa..3198032f5 100644 --- a/GUI/QtQuick/WalletBalancesModel.h +++ b/GUI/QtQuick/WalletBalancesModel.h @@ -86,7 +86,7 @@ class WalletBalancesModel : public QAbstractTableModel private: using FieldFunc = std::function; - QString getBalance(const std::string& walletId, const FieldFunc&) const; + QString getBalance(const std::string& walletId, const FieldFunc&, const QString defaultValue = QLatin1String("0.00000000")) const; int getWalletIndex(const std::string& walletId) const; private: diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index 6370e6f71..79632c53b 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -12,6 +12,7 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 import QtQml.Models 2 +import terminal.models 1.0 import "StyledControls" import "BsStyles" @@ -234,9 +235,8 @@ Item { columnWidths: [0.0, 0.7, 0.2, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) - // TODO: change constant 259 with C++ defined enum onCellClicked: (row, column, data) => { - var address = model.data(model.index(row, 0), 259) + var address = model.data(model.index(row, 1), TxInOutModel.TableDataRole) requestPageChange(address) } } @@ -282,9 +282,8 @@ Item { columnWidths: [0.0, 0.7, 0.2, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) - // TODO: change constant 257 with C++ defined enum onCellClicked: (row, column, data) => { - var address = model.data(model.index(row, 1), 257) + var address = model.data(model.index(row, 1), TxInOutModel.TableDataRole) requestPageChange(address) } } diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 523c76056..63b875dfe 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -216,6 +216,7 @@ ColumnLayout { CustomCheckBox { id: checkbox_rbf + focusPolicy: Qt.NoFocus activeFocusOnTab: false implicitHeight: BSSizes.applyScale(18) @@ -708,10 +709,6 @@ ColumnLayout { if (!continue_but.enabled) { return } - if (!fee_suggest_combo.edit_value()) - { - fee_suggest_combo.input_text = fee_suggest_combo.currentText - } if (tempRequest && tempRequest.isWatchingOnly) { diff --git a/GUI/QtQuick/qml/Settings/SettingsPopup.qml b/GUI/QtQuick/qml/Settings/SettingsPopup.qml index 7d4d18ab3..215b5f9cd 100644 --- a/GUI/QtQuick/qml/Settings/SettingsPopup.qml +++ b/GUI/QtQuick/qml/Settings/SettingsPopup.qml @@ -16,6 +16,12 @@ CustomPopup { property var armoryServersModel: null + function open_network_menu() { + _stack_view.push(settings_network) + root.updateServersModel() + settings_network.init() + } + SettingsMenu { id: settings_menu visible: false diff --git a/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml b/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml index e966694c0..555f7ae96 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomContextMenu.qml @@ -23,8 +23,9 @@ Menu { delegate: MenuItem { id: menuItem - implicitWidth: BSSizes.applyScale(200) - implicitHeight: BSSizes.applyScale(40) + visible: menuItem.enabled + width: BSSizes.applyScale(200) + height: menuItem.visible ? BSSizes.applyScale(40) : 0 contentItem: Text { leftPadding: menuItem.indicator.width @@ -44,8 +45,8 @@ Menu { } background: Rectangle { - implicitWidth: BSSizes.applyScale(200) - implicitHeight: BSSizes.applyScale(40) + width: parent.width - menu.leftPadding - menu.rightPadding + height: parent.height radius: BSSizes.applyScale(14) color: menuItem.highlighted ? BSStyle.menuItemHoveredColor : BSStyle.menuItemColor diff --git a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml index d6d00cb45..52c804d68 100644 --- a/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/InputOutputTableView.qml @@ -35,8 +35,8 @@ CustomTableView { onEntered: component.selected_row_index = row onExited: component.selected_row_index = -1 - onClicked: component.cellClicked(row, column, tableData) - onDoubleClicked: component.cellDoubleClicked(row, column, tableData) + onClicked: component.cellClicked(row, column, tableData, mouse) + onDoubleClicked: component.cellDoubleClicked(row, column, tableData, mouse) } Item { diff --git a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml index e1a6aab78..fc30086ac 100644 --- a/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml +++ b/GUI/QtQuick/qml/WalletProperties/WalletPropertiesPopup.qml @@ -434,6 +434,8 @@ CustomPopup { id: messageDialog details_text: qsTr("Rescan successful") visible: false + + onSig_finish: root.close_click() } Connections { diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index b9a051593..5049ecd7e 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -38,8 +38,10 @@ ApplicationWindow { property var currentDialog: ({}) property bool isNoWalletsWizard: false readonly property int resizeAnimationDuration: 25 + property var armoryServers: bsApp.getArmoryServers() - onScreenChanged: scaleController.update() + onXChanged: scaleController.update() + onYChanged: scaleController.update() FontLoader { source: "qrc:/fonts/Roboto-Regular.ttf" @@ -223,50 +225,78 @@ ApplicationWindow { Layout.fillWidth: true } - Label { - width: BSSizes.applyScale(35) - text: qsTr("Connection: ") - font.pixelSize: BSSizes.applyScale(12) - font.family: "Roboto" - font.weight: Font.Normal - color: BSStyle.titleTextColor - } - Rectangle { - id: animatedConnectionStateArea - width: BSSizes.applyScale(16) - height: BSSizes.applyScale(16) - color: "transparent" - Layout.rightMargin: BSSizes.applyScale(12) - - Image { - id: imgEnvKind - anchors.fill: parent - source: (bsApp.armoryState !== 7) ? "qrc:/images/bitcoin-disabled.png" : - ((bsApp.networkType === 0) ? "qrc:/images/bitcoin-main-net.png" : "qrc:/images/bitcoin-test-net.png") - } - - RotationAnimation on rotation { - id: connectionAnomation - loops: Animation.Infinite - from: 0 - to: 360 - running: bsApp.armoryState !== 7 - duration: 1000 - } + color: hoverArea.containsMouse ? BSStyle.buttonsHoveredColor : "transparent" + width: BSSizes.applyScale(166) + Layout.fillHeight: true + + RowLayout { + anchors.centerIn: parent + spacing: BSSizes.applyScale(5) + + Item { + Layout.fillWidth: true + Layout.fillHeight: true + } - Connections { - target: bsApp - function onArmoryStateChanged() { - if (bsApp.armoryState === 7) { - connectionAnomation.complete() - animatedConnectionStateArea.rotation = 0 + Label { + text: bsApp.armoryState === 7 ? armoryServers.currentNetworkName + : bsApp.armoryState === 0 ? qsTr("Offline") : qsTr("Connecting") + font.pixelSize: BSSizes.applyScale(12) + font.family: "Roboto" + font.weight: Font.Normal + color: BSStyle.titleTextColor + horizontalAlignment: Qt.AlignRight + } + + Rectangle { + id: animatedConnectionStateArea + width: BSSizes.applyScale(16) + height: BSSizes.applyScale(16) + color: "transparent" + + Image { + id: imgEnvKind + anchors.fill: parent + source: (bsApp.armoryState !== 7 ? "qrc:/images/bitcoin-disabled.png" : + (bsApp.networkType === 0 ? "qrc:/images/bitcoin-main-net.png" : "qrc:/images/bitcoin-test-net.png")) + } + + RotationAnimation on rotation { + id: connectionAnimation + loops: Animation.Infinite + from: 0 + to: 360 + running: bsApp.armoryState === 1 + duration: 1000 } - else { - connectionAnomation.start() + + Connections { + target: bsApp + function onArmoryStateChanged() { + if (bsApp.armoryState === 0 || bsApp.armoryState === 7) { + connectionAnimation.complete() + animatedConnectionStateArea.rotation = 0 + } + else if (!connectionAnimation.running) { + connectionAnimation.start() + } + armoryServers = bsApp.getArmoryServers() + } } } } + + MouseArea { + id: hoverArea + hoverEnabled: true + anchors.fill: parent + + onClicked: { + show_popup(settings_popup) + settings_popup.open_network_menu() + } + } } CustomTitleToolButton { From 848b848dcf72666739be1f5a3d41053838df9d8e Mon Sep 17 00:00:00 2001 From: yz Date: Mon, 8 May 2023 16:02:24 +0300 Subject: [PATCH 393/436] Networks fix --- GUI/QtQuick/QtQuickAdapter.cpp | 75 +++++++------------ GUI/QtQuick/QtQuickAdapter.h | 11 ++- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 3 +- GUI/QtQuick/qml/Settings/AddArmoryServer.qml | 2 +- .../qml/Settings/DeleteArmoryServer.qml | 2 +- GUI/QtQuick/qml/Settings/SettingsPopup.qml | 2 +- GUI/QtQuick/qml/main.qml | 10 +-- 7 files changed, 46 insertions(+), 59 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index b0c60de79..b00865b79 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -173,6 +173,7 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) hwDeviceModel_ = new HwDeviceModel(logger, this); walletBalances_ = new WalletBalancesModel(logger, this); feeSuggModel_ = new FeeSuggestionModel(logger, this); + armoryServersModel_ = new ArmoryServersModel(logger, this); walletPropertiesModel_ = std::make_unique(logger); addressFilterModel_->setSourceModel(addrModel_); @@ -195,6 +196,10 @@ QtQuickAdapter::QtQuickAdapter(const std::shared_ptr &logger) { walletSelected(index); }); + + + connect(armoryServersModel_, &ArmoryServersModel::changed, this, &QtQuickAdapter::onArmoryServerChanged); + connect(armoryServersModel_, &ArmoryServersModel::currentChanged, this, &QtQuickAdapter::onArmoryServerSelected); } QtQuickAdapter::~QtQuickAdapter() @@ -291,8 +296,6 @@ void QtQuickAdapter::run(int &argc, char **argv) , 1, 0, "QmlAddressListModel", tr("Error: only enums")); qmlRegisterUncreatableMetaObject(ArmoryServersModel::staticMetaObject, "terminal.models" , 1, 0, "ArmoryServersModel", tr("Error: only enums")); - qmlRegisterUncreatableMetaObject(TxInOutModel::staticMetaObject, "terminal.models" - , 1, 0, "TxInOutModel", tr("Error: only enums")); //need to read files in qml qputenv("QML_XHR_ALLOW_FILE_READ", QByteArray("1")); @@ -339,6 +342,7 @@ void QtQuickAdapter::run(int &argc, char **argv) } updateStates(); + updateArmoryServers(); requestInitialSettings(); loadPlugins(engine); @@ -405,16 +409,10 @@ void QtQuickAdapter::onArmoryServerSelected(int index) return; } armoryServerIndex_ = index; - auto model = qobject_cast(sender()); - if (!model) { - logger_->error("[{}] invalid sender", __func__); - return; - } - armoryState_ = 0; emit armoryStateChanged(); - const auto newNetType = model->data(index).netType; + const auto newNetType = armoryServersModel_->data(index).netType; if (netType_ != newNetType) { if (txModel_) { txModel_->clear(); @@ -427,6 +425,8 @@ void QtQuickAdapter::onArmoryServerSelected(int index) SettingsMessage msg; msg.set_set_armory_server(index); pushRequest(user_, userSettings_, msg.SerializeAsString()); + + updateArmoryServers(); } ProcessingResult QtQuickAdapter::processSettings(const Envelope &env) @@ -519,11 +519,6 @@ ProcessingResult QtQuickAdapter::processArmoryServers(bs::message::SeqId msgId armoryServerIndex_ = response.idx_current(); logger_->debug("[{}] current={}, connected={}", __func__, response.idx_current() , response.idx_connected()); - const auto& itReq = armoryServersReq_.find(msgId); - if (itReq == armoryServersReq_.end()) { - logger_->warn("[{}] unknown request #{}", __func__, msgId); - return ProcessingResult::Error; - } std::vector servers; for (const auto& server : response.servers()) { servers.push_back({ QString::fromStdString(server.server_name()) @@ -533,8 +528,7 @@ ProcessingResult QtQuickAdapter::processArmoryServers(bs::message::SeqId msgId , SecureBinaryData::fromString(server.password()) , server.run_locally(), server.one_way_auth() }); } - itReq->second->setData(response.idx_current(), response.idx_connected(), servers); - armoryServersReq_.erase(itReq); + armoryServersModel_->setData(response.idx_current(), response.idx_connected(), servers); return ProcessingResult::Success; } @@ -1505,22 +1499,17 @@ bool QtQuickAdapter::validateAddress(const QString& addr) } } -ArmoryServersModel* QtQuickAdapter::getArmoryServers() +void QtQuickAdapter::updateArmoryServers() { SettingsMessage msg; msg.mutable_armory_servers_get(); - const auto msgId = pushRequest(user_, userSettings_, msg.SerializeAsString()); - auto model = new ArmoryServersModel(logger_, this); - armoryServersReq_[msgId] = model; - connect(model, &ArmoryServersModel::changed, this, &QtQuickAdapter::onArmoryServerChanged); - connect(model, &ArmoryServersModel::currentChanged, this, &QtQuickAdapter::onArmoryServerSelected); - return model; + pushRequest(user_, userSettings_, msg.SerializeAsString()); } -bool QtQuickAdapter::addArmoryServer(ArmoryServersModel* model, const QString& name +bool QtQuickAdapter::addArmoryServer(const QString& name , int netType, const QString& ipAddr, const QString& ipPort, const QString& key) { - for (const auto& srv : model->data()) { + for (const auto& srv : armoryServersModel_->data()) { if (srv.name == name) { logger_->debug("[{}] armory server {} already exists", __func__, name.toStdString()); return false; @@ -1534,40 +1523,36 @@ bool QtQuickAdapter::addArmoryServer(ArmoryServersModel* model, const QString& n msgReq->set_server_port(ipPort.toStdString()); msgReq->set_server_key(key.toStdString()); pushRequest(user_, userSettings_, msg.SerializeAsString()); - QMetaObject::invokeMethod(this, [model, name, netType, ipAddr, ipPort, key] { - model->add({ name, static_cast(netType), ipAddr, ipPort.toInt(), key }); + QMetaObject::invokeMethod(this, [this, name, netType, ipAddr, ipPort, key] { + armoryServersModel_->add({ name, static_cast(netType), ipAddr, ipPort.toInt(), key }); }); + + updateArmoryServers(); + return true; } -bool QtQuickAdapter::delArmoryServer(ArmoryServersModel* model, int idx) +bool QtQuickAdapter::delArmoryServer(int idx) { logger_->debug("[{}] #{}", __func__, idx); - if (!model->isEditable(idx)) { - return false; - } SettingsMessage msg; msg.set_del_armory_server(idx); pushRequest(user_, userSettings_, msg.SerializeAsString()); - model->del(idx); + armoryServersModel_->del(idx); + updateArmoryServers(); return true; } void QtQuickAdapter::onArmoryServerChanged(const QModelIndex& index, const QVariant& value) { - auto model = qobject_cast(sender()); - if (!model) { - logger_->error("[{}] invalid sender", __func__); - return; - } - auto srv = model->data(index.row()); + auto srv = armoryServersModel_->data(index.row()); switch (index.column()) { case 0: - for (int i = 0; i < model->rowCount(); ++i) { + for (int i = 0; i < armoryServersModel_->rowCount(); ++i) { if (i == index.row()) { continue; } - if (model->data(i).name == value.toString()) { + if (armoryServersModel_->data(i).name == value.toString()) { return; } } @@ -1597,6 +1582,8 @@ void QtQuickAdapter::onArmoryServerChanged(const QModelIndex& index, const QVari msgSrv->set_server_key(srv.armoryDBKey.toStdString()); msgSrv->set_network_type((int)srv.netType); pushRequest(user_, userSettings_, msg.SerializeAsString()); + + updateArmoryServers(); } void QtQuickAdapter::requestFeeSuggestions() @@ -2136,12 +2123,8 @@ void QtQuickAdapter::processWalletAddresses(const std::string& walletId const auto lastAddr = addresses.at(addresses.size() - 1); logger_->debug("[{}] {} last address: {}", __func__, hdWalletId, lastAddr.address.display()); addressCache_[lastAddr.address] = hdWalletId; - - QMetaObject::invokeMethod(this, [this, hdWalletId, lastAddr]() { - addrModel_->addRow(hdWalletId, { QString::fromStdString(lastAddr.address.display()) - , QString(), QString::fromStdString(lastAddr.index), assetTypeToString(lastAddr.assetType) }); - }); - + addrModel_->addRow(hdWalletId, { QString::fromStdString(lastAddr.address.display()) + , QString(), QString::fromStdString(lastAddr.index), assetTypeToString(lastAddr.assetType)}); generatedAddress_ = lastAddr.address; emit addressGenerated(); } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 7d3f10790..070468d7d 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -144,6 +144,9 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_PROPERTY(qtquick_gui::WalletPropertiesVM* walletProperitesVM READ walletProperitesVM CONSTANT) qtquick_gui::WalletPropertiesVM* walletProperitesVM() const; + Q_PROPERTY(ArmoryServersModel* armoryServersModel READ armoryServersModel CONSTANT) + ArmoryServersModel* armoryServersModel() const { return armoryServersModel_; } + // QML-invokable methods Q_INVOKABLE QStringList newSeedPhrase(); Q_INVOKABLE QStringList completeBIP39dic(const QString& prefix); @@ -162,10 +165,10 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void copyAddressToClipboard(const QString& addr); Q_INVOKABLE QString pasteTextFromClipboard(); Q_INVOKABLE bool validateAddress(const QString& addr); - Q_INVOKABLE ArmoryServersModel* getArmoryServers(); - Q_INVOKABLE bool addArmoryServer(ArmoryServersModel*, const QString& name + Q_INVOKABLE void updateArmoryServers(); + Q_INVOKABLE bool addArmoryServer(const QString& name , int netType, const QString& ipAddr, const QString& ipPort, const QString& key = {}); - Q_INVOKABLE bool delArmoryServer(ArmoryServersModel*, int idx); + Q_INVOKABLE bool delArmoryServer(int idx); Q_INVOKABLE void requestFeeSuggestions(); Q_INVOKABLE QTXSignRequest* newTXSignRequest(int walletIndex, const QStringList& recvAddrs @@ -327,6 +330,7 @@ private slots: HwDeviceModel* hwDeviceModel_{ nullptr }; WalletBalancesModel* walletBalances_{ nullptr }; FeeSuggestionModel* feeSuggModel_{ nullptr }; + ArmoryServersModel* armoryServersModel_{ nullptr }; std::unique_ptr walletPropertiesModel_; bs::Address generatedAddress_; bool hwDevicesPolling_{ false }; @@ -346,7 +350,6 @@ private slots: std::set expTxAddrReqs_, expTxAddrInReqs_; std::map addressCache_; std::set rmTxOnInvalidation_; - std::map armoryServersReq_; int nWalletsLoaded_ {-1}; std::shared_ptr settingsController_; diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 63b875dfe..ed1524014 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -756,7 +756,8 @@ ColumnLayout { if (!isRBF && !isCPFP/* && tx.selectedInputsModel.rowCount > 1*/) { tempRequest = bsApp.newTXSignRequest(from_wallet_combo.currentIndex , outputAddresses, outputAmounts, - (fpb > 0) ? fpb : 1.0) + (fpb > 0) ? fpb : 1.0, comment_input.input_text + , checkbox_rbf.checked, tx.inputsModel.getSelection()) } else { tempRequest = bsApp.newTXSignRequest(-1 diff --git a/GUI/QtQuick/qml/Settings/AddArmoryServer.qml b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml index 275cefe39..36c5fbbf7 100644 --- a/GUI/QtQuick/qml/Settings/AddArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/AddArmoryServer.qml @@ -166,7 +166,7 @@ ColumnLayout { var port = parseInt(port_text_input.input_text) var db_key = db_key_text_input.input_text - bsApp.addArmoryServer(armoryServersModel, name, networkType, ip_dns, port, db_key) + bsApp.addArmoryServer(name, networkType, ip_dns, port, db_key) clear() diff --git a/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml b/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml index d20e4483f..8f349784e 100644 --- a/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/DeleteArmoryServer.qml @@ -88,7 +88,7 @@ ColumnLayout { preferred: true function click_enter() { - bsApp.delArmoryServer(armoryServersModel, server_index) + bsApp.delArmoryServer(server_index) sig_delete() } } diff --git a/GUI/QtQuick/qml/Settings/SettingsPopup.qml b/GUI/QtQuick/qml/Settings/SettingsPopup.qml index 215b5f9cd..f5a32e772 100644 --- a/GUI/QtQuick/qml/Settings/SettingsPopup.qml +++ b/GUI/QtQuick/qml/Settings/SettingsPopup.qml @@ -123,6 +123,6 @@ CustomPopup { function updateServersModel() { - root.armoryServersModel = bsApp.getArmoryServers() + root.armoryServersModel = bsApp.armoryServersModel } } diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 5049ecd7e..0b6b64a32 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -38,7 +38,7 @@ ApplicationWindow { property var currentDialog: ({}) property bool isNoWalletsWizard: false readonly property int resizeAnimationDuration: 25 - property var armoryServers: bsApp.getArmoryServers() + property var armoryServers: bsApp.armoryServersModel onXChanged: scaleController.update() onYChanged: scaleController.update() @@ -163,7 +163,6 @@ ApplicationWindow { running: false repeat: false onTriggered: { - bsApp.getArmoryServers() show_popup(create_wallet) } } @@ -227,11 +226,13 @@ ApplicationWindow { Rectangle { color: hoverArea.containsMouse ? BSStyle.buttonsHoveredColor : "transparent" - width: BSSizes.applyScale(166) + width: BSSizes.applyScale(120) + Layout.rightMargin: BSSizes.applyScale(10) Layout.fillHeight: true RowLayout { - anchors.centerIn: parent + id: innerStatusLayout + anchors.fill: parent spacing: BSSizes.applyScale(5) Item { @@ -281,7 +282,6 @@ ApplicationWindow { else if (!connectionAnimation.running) { connectionAnimation.start() } - armoryServers = bsApp.getArmoryServers() } } } From c65e7c6a6a301074f386703dd647309b41072a42 Mon Sep 17 00:00:00 2001 From: yz Date: Mon, 8 May 2023 16:17:56 +0300 Subject: [PATCH 394/436] Padding fix --- GUI/QtQuick/qml/main.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 0b6b64a32..9d93230c0 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -227,7 +227,6 @@ ApplicationWindow { Rectangle { color: hoverArea.containsMouse ? BSStyle.buttonsHoveredColor : "transparent" width: BSSizes.applyScale(120) - Layout.rightMargin: BSSizes.applyScale(10) Layout.fillHeight: true RowLayout { @@ -254,6 +253,7 @@ ApplicationWindow { id: animatedConnectionStateArea width: BSSizes.applyScale(16) height: BSSizes.applyScale(16) + Layout.rightMargin: BSSizes.applyScale(10) color: "transparent" Image { From 516f5c38c03419cb592e4c2dc9c62786c89991ee Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 8 May 2023 18:16:58 +0300 Subject: [PATCH 395/436] RBF fee suggestion fixes --- GUI/QtQuick/FeeSuggModel.cpp | 16 ++++++++++++---- GUI/QtQuick/FeeSuggModel.h | 14 +++++++++----- GUI/QtQuick/QtQuickAdapter.cpp | 8 ++++---- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 6 ++++-- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/GUI/QtQuick/FeeSuggModel.cpp b/GUI/QtQuick/FeeSuggModel.cpp index 67f4af4ec..51248bfb1 100644 --- a/GUI/QtQuick/FeeSuggModel.cpp +++ b/GUI/QtQuick/FeeSuggModel.cpp @@ -54,13 +54,13 @@ QVariant FeeSuggestionModel::data(const QModelIndex& index, int role) const switch (role) { case TextRole: return tr("%1 blocks (%2): %3").arg(data_.at(index.row()).nbBlocks) - .arg(data_.at(index.row()).estTime).arg(QString::number(data_.at(index.row()).satoshis, 'f', 1)); + .arg(data_.at(index.row()).estTime).arg(QString::number(data_.at(index.row()).fpb, 'f', 1)); case BlocksRole: return data_.at(index.row()).nbBlocks; case TimeRole: return data_.at(index.row()).estTime; case ValueRole: - return data_.at(index.row()).satoshis; + return data_.at(index.row()).fpb; default: break; } return QVariant(); @@ -109,7 +109,7 @@ void FeeSuggestionModel::addRows(const std::map& feeLevels) beginInsertRows(QModelIndex(), rowCount(), rowCount() + newRows.size() - 1); data_.insert(data_.cend(), newRows.begin(), newRows.end()); endInsertRows(); - emit rowCountChanged(); + emit changed(); }); } @@ -119,6 +119,14 @@ void FeeSuggestionModel::clear() beginResetModel(); data_.clear(); endResetModel(); - emit rowCountChanged(); + emit changed(); }); } + +float FeeSuggestionModel::fastestFee() const +{ + if (!data_.empty()) { + return data_.at(0).fpb; + } + return 0.0; +} diff --git a/GUI/QtQuick/FeeSuggModel.h b/GUI/QtQuick/FeeSuggModel.h index 868a58199..dee23ae2d 100644 --- a/GUI/QtQuick/FeeSuggModel.h +++ b/GUI/QtQuick/FeeSuggModel.h @@ -24,8 +24,9 @@ namespace spdlog { class FeeSuggestionModel : public QAbstractTableModel { Q_OBJECT + Q_PROPERTY(int rowCount READ rowCount NOTIFY changed) + Q_PROPERTY(float fastestFee READ fastestFee NOTIFY changed) - Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) public: enum TableRoles { TextRole = Qt::DisplayRole, BlocksRole = Qt::UserRole, TimeRole, ValueRole }; FeeSuggestionModel(const std::shared_ptr&, QObject* parent = nullptr); @@ -39,17 +40,20 @@ class FeeSuggestionModel : public QAbstractTableModel struct FeeSuggestion { uint32_t nbBlocks; QString estTime; - float satoshis; + float fpb; }; void addRows(const std::map&); void clear(); +signals: + void changed(); + +private: + float fastestFee() const; + private: std::shared_ptr logger_; std::vector data_; - -signals: - void rowCountChanged(); }; #endif // FEE_SUGG_MODEL_H diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index b00865b79..c4bb55d87 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1491,6 +1491,7 @@ bool QtQuickAdapter::validateAddress(const QString& addr) const auto& addrStr = addr.toStdString(); try { const auto& addr = bs::Address::fromAddressString(addrStr); + logger_->debug("[{}] type={}", __func__, (int)addr.getType()); return (addr.getType() != AddressEntryType_Default); } catch (const std::exception& e) { @@ -2401,16 +2402,15 @@ void QtQuickAdapter::signAndBroadcast(QTXSignRequest* txReq, const QString& pass int QtQuickAdapter::getSearchInputType(const QString& s) { const auto& trimmed = s.trimmed().toStdString(); - if (validateAddress(s)) { - return 1; - } - if (trimmed.length() == 64) { // potential TX hash in hex const auto& txId = BinaryData::CreateFromHex(trimmed); if (txId.getSize() == 32) { // valid TXid return 2; } } + if (validateAddress(s)) { + return 1; + } return 0; } diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index ed1524014..3cae881b6 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -307,7 +307,9 @@ ColumnLayout { function setup_fee() { if (tx !== null && (isRBF || isCPFP)) { fee_suggest_combo.currentIndex = feeSuggestions.rowCount - 1 - fee_suggest_combo.input_item.text = Qt.binding(function() { return tx.feePerByte * 2 }) + fee_suggest_combo.input_item.text = Qt.binding(function() { + return Math.max(feeSuggestions.fastestFee, tx.feePerByte + 3) + }) } } } @@ -379,7 +381,7 @@ ColumnLayout { Button { id: sel_inputs_button - enabled: !isRBF && !isCPFP + enabled: true //!isRBF && !isCPFP activeFocusOnTab: false From ac924a249795f356094d8202f64961eb34e1bcd7 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 9 May 2023 13:18:55 +0300 Subject: [PATCH 396/436] update common --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index 03e3000ca..e34da2982 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 03e3000ca255a505db8223a87c5c022b0c400b09 +Subproject commit e34da298223d5742a58a5ce80a391e58e3f06d6f From 434f276ca0aa1eaf026bcc23a738d2eafeff7574 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 9 May 2023 13:29:09 +0300 Subject: [PATCH 397/436] update common --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index e34da2982..4379f36b9 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit e34da298223d5742a58a5ce80a391e58e3f06d6f +Subproject commit 4379f36b951a36319d518c476f1a93dd1ed2a6bf From 34961e45928bbd592c5f69fe3a0b00b359bc6979 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 9 May 2023 13:41:40 +0300 Subject: [PATCH 398/436] update common --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index 4379f36b9..9fdb53e4c 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 4379f36b951a36319d518c476f1a93dd1ed2a6bf +Subproject commit 9fdb53e4c1ea4ce8b8dc15022c08a706718abc05 From ca69a50c82cd59c449d1158413b65ad44bf30c76 Mon Sep 17 00:00:00 2001 From: yz Date: Tue, 9 May 2023 15:11:21 +0300 Subject: [PATCH 399/436] Network switch; explorer --- GUI/QtQuick/QtQuickAdapter.cpp | 18 +++++------------- GUI/QtQuick/qml/ExplorerTX.qml | 4 ++-- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index c4bb55d87..f6eaabc13 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -296,6 +296,8 @@ void QtQuickAdapter::run(int &argc, char **argv) , 1, 0, "QmlAddressListModel", tr("Error: only enums")); qmlRegisterUncreatableMetaObject(ArmoryServersModel::staticMetaObject, "terminal.models" , 1, 0, "ArmoryServersModel", tr("Error: only enums")); + qmlRegisterUncreatableMetaObject(TxInOutModel::staticMetaObject, "terminal.models" + , 1, 0, "TxInOutModel", tr("Error: only enums")); //need to read files in qml qputenv("QML_XHR_ALLOW_FILE_READ", QByteArray("1")); @@ -409,24 +411,17 @@ void QtQuickAdapter::onArmoryServerSelected(int index) return; } armoryServerIndex_ = index; - armoryState_ = 0; + armoryState_ = 1; emit armoryStateChanged(); - const auto newNetType = armoryServersModel_->data(index).netType; - if (netType_ != newNetType) { - if (txModel_) { - txModel_->clear(); - } - netType_ = newNetType; - emit networkTypeChanged(); + if (txModel_) { + txModel_->clear(); } logger_->debug("[{}] #{}", __func__, index); SettingsMessage msg; msg.set_set_armory_server(index); pushRequest(user_, userSettings_, msg.SerializeAsString()); - - updateArmoryServers(); } ProcessingResult QtQuickAdapter::processSettings(const Envelope &env) @@ -1540,7 +1535,6 @@ bool QtQuickAdapter::delArmoryServer(int idx) msg.set_del_armory_server(idx); pushRequest(user_, userSettings_, msg.SerializeAsString()); armoryServersModel_->del(idx); - updateArmoryServers(); return true; } @@ -1583,8 +1577,6 @@ void QtQuickAdapter::onArmoryServerChanged(const QModelIndex& index, const QVari msgSrv->set_server_key(srv.armoryDBKey.toStdString()); msgSrv->set_network_type((int)srv.netType); pushRequest(user_, userSettings_, msg.SerializeAsString()); - - updateArmoryServers(); } void QtQuickAdapter::requestFeeSuggestions() diff --git a/GUI/QtQuick/qml/ExplorerTX.qml b/GUI/QtQuick/qml/ExplorerTX.qml index 79632c53b..2f2191d43 100644 --- a/GUI/QtQuick/qml/ExplorerTX.qml +++ b/GUI/QtQuick/qml/ExplorerTX.qml @@ -235,7 +235,7 @@ Item { columnWidths: [0.0, 0.7, 0.2, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) - onCellClicked: (row, column, data) => { + onCellClicked: (row, column, data, mouse) => { var address = model.data(model.index(row, 1), TxInOutModel.TableDataRole) requestPageChange(address) } @@ -282,7 +282,7 @@ Item { columnWidths: [0.0, 0.7, 0.2, 0.1] onCopyRequested: bsApp.copyAddressToClipboard(id) - onCellClicked: (row, column, data) => { + onCellClicked: (row, column, data, mouse) => { var address = model.data(model.index(row, 1), TxInOutModel.TableDataRole) requestPageChange(address) } From f7f2dab033db3661cb0036ae70b9e7997bda85e4 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 9 May 2023 21:47:39 +0300 Subject: [PATCH 400/436] RBF and CPFP fixes --- GUI/QtQuick/QTXSignRequest.cpp | 4 +- GUI/QtQuick/QTXSignRequest.h | 4 +- GUI/QtQuick/QtQuickAdapter.cpp | 126 +++++++---------------- GUI/QtQuick/QtQuickAdapter.h | 2 +- GUI/QtQuick/TxInputsModel.cpp | 44 ++++++++ GUI/QtQuick/TxInputsModel.h | 3 + GUI/QtQuick/TxListModel.cpp | 81 ++++++++++++--- GUI/QtQuick/TxListModel.h | 9 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 60 ++++++----- GUI/QtQuick/qml/Send/SendPopup.qml | 2 +- 10 files changed, 190 insertions(+), 145 deletions(-) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index 4e5cca76e..4ad5b29df 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -21,7 +21,7 @@ QTXSignRequest::QTXSignRequest(const std::shared_ptr& logger, QO void QTXSignRequest::setTxSignReq(const bs::core::wallet::TXSignRequest& txReq) { txReq_ = txReq; - + logger_->debug("[{}] {} outputs", __func__, txReq_.armorySigner_.getTxOutCount()); if (outputsModel_) { outputsModel_->clearOutputs(); } @@ -91,8 +91,10 @@ QStringList QTXSignRequest::outputAddresses() const QString QTXSignRequest::outputAmount() const { if (!txReq_.isValid()) { + logger_->debug("[{}] TX request is not valid", __func__); return {}; } + logger_->debug("[{}] {} outputs", __func__, txReq_.armorySigner_.getTxOutCount()); return QString::number(txReq_.amountReceived([changeAddr = txReq_.change.address] (const bs::Address& addr) { return (addr != changeAddr); }) / BTCNumericTypes::BalanceDivider , 'f', 8); diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h index 9d01d3fe6..1e0dbf851 100644 --- a/GUI/QtQuick/QTXSignRequest.h +++ b/GUI/QtQuick/QTXSignRequest.h @@ -38,7 +38,6 @@ class QTXSignRequest : public QObject void setError(const QString&); void addInput(const QUTXO::Input& input) { inputs_.push_back(input); } std::vector inputs() const { return inputs_; } - void setInputs(const std::vector&); void setHWW(bool hww) { @@ -96,6 +95,9 @@ class QTXSignRequest : public QObject void hwwReady(); void errorSet(); +private: + void setInputs(const std::vector&); + private: std::shared_ptr logger_; bs::core::wallet::TXSignRequest txReq_{}; diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index c4bb55d87..58b56feac 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1492,7 +1492,7 @@ bool QtQuickAdapter::validateAddress(const QString& addr) try { const auto& addr = bs::Address::fromAddressString(addrStr); logger_->debug("[{}] type={}", __func__, (int)addr.getType()); - return (addr.getType() != AddressEntryType_Default); + return (addr.isValid()); } catch (const std::exception& e) { logger_->warn("[{}] invalid address {}: {}", __func__, addrStr, e.what()); @@ -1642,61 +1642,23 @@ QTXSignRequest* QtQuickAdapter::newTXSignRequest(int walletIndex, const QStringL msgReq->set_comment(comment.toStdString()); } auto txReq = new QTXSignRequest(logger_, this); - std::vector inputs; if (utxos) { - if (walletIndex < 0) { - for (const auto& qUtxo : utxos->data()) { - txReq->addInput(qUtxo->input()); - } - ArmoryMessage msgSpendable; - ArmoryMessage_WalletIDs* msgWltIds = nullptr; - if (walletIndex == -1) { // RBF mode - msgWltIds = msgSpendable.mutable_get_rbf_utxos(); - } - else if (walletIndex == -2) { // CPFP mode - msgWltIds = msgSpendable.mutable_get_zc_utxos(); - } - if (msgWltIds) { - for (const auto& wallet : hdWallets_) { - for (const auto& leaf : wallet.second.leaves) { - auto leafId = leaf.first; - msgWltIds->add_wallet_ids(leafId); - for (auto& c : leafId) { - c = std::toupper(c); - } - msgWltIds->add_wallet_ids(leafId); - } - } - const auto msgId = pushRequest(user_, userBlockchain_, msgSpendable.SerializeAsString()); - txReqs_[msgId] = { txReq, isMaxAmount, msg }; - logger_->debug("[{}] {}", __func__, msgSpendable.DebugString()); - return txReq; + std::set uniqueUTXOs; + for (const auto& qUtxo : utxos->data()) { + if (qUtxo->utxo().getValue()) { + uniqueUTXOs.insert(qUtxo->utxo()); } else { - emit showError(tr("Unknown TX mode")); - return txReq; + logger_->warn("[{}] UTXO not found, input {} @ {} is ignored", __func__ + , qUtxo->input().amount, qUtxo->input().txHash.toHexStr(true)); } } - else { - for (const auto& qUtxo : utxos->data()) { - if (qUtxo->utxo().getValue()) { - logger_->debug("[{}] UTXO {} @ {}", __func__, qUtxo->utxo().getValue(), qUtxo->utxo().getTxHash().toHexStr(true)); - msgReq->add_utxos(qUtxo->utxo().serialize().toBinStr()); - inputs.push_back(qUtxo->utxo()); - } - else { - logger_->warn("[{}] UTXO not found, input {} @ {} is ignored", __func__ - , qUtxo->input().amount, qUtxo->input().txHash.toHexStr(true)); - } - } + for (const auto& utxo : uniqueUTXOs) { + logger_->debug("[{}] UTXO {} @ {}", __func__, utxo.getValue(), utxo.getTxHash().toHexStr(true)); + msgReq->add_utxos(utxo.serialize().toBinStr()); } } const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); - if (!inputs.empty()) { - QMetaObject::invokeMethod(this, [txReq, inputs] { - txReq->setInputs(inputs); - }); - } txReqs_[msgId] = { txReq, isMaxAmount }; return txReq; } @@ -1708,6 +1670,9 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, QTxDetails* logger_->error("[{}] TX details object cannot be null", __func__); return nullptr; } + if (!utxos) { + utxos = txDet->inputsModel()->getSelection(); + } return newTXSignRequest(walletIndex, txDet->outputsModel()->getOutputAddresses() , txDet->outputsModel()->getOutputAmounts(), fee, comment, isRbf, utxos); } @@ -1728,13 +1693,31 @@ void QtQuickAdapter::getUTXOsForWallet(int walletIndex, QTxDetails* txDet) } } -QTxDetails* QtQuickAdapter::getTXDetails(const QString& txHash) +QTxDetails* QtQuickAdapter::getTXDetails(const QString& txHash, bool rbf, bool cpfp) { auto txBinHash = BinaryData::CreateFromHex(txHash.trimmed().toStdString()); txBinHash.swapEndian(); + logger_->debug("[{}] {} RBF:{} CPFP: {}", __func__, txBinHash.toHexStr(true), rbf, cpfp); const auto txDet = new QTxDetails(logger_, txBinHash, this); connect(this, &QtQuickAdapter::topBlock, txDet, &QTxDetails::onTopBlock); + if (rbf || cpfp) { + ArmoryMessage msgSpendable; + auto msgWltIds = rbf ? msgSpendable.mutable_get_rbf_utxos() : msgSpendable.mutable_get_zc_utxos(); + for (const auto& wallet : hdWallets_) { + for (const auto& leaf : wallet.second.leaves) { + auto leafId = leaf.first; + msgWltIds->add_wallet_ids(leafId); + for (auto& c : leafId) { + c = std::toupper(c); + } + msgWltIds->add_wallet_ids(leafId); + } + } + const auto msgId = pushRequest(user_, userBlockchain_, msgSpendable.SerializeAsString()); + txDetailReqs_[msgId] = txDet; + } + if (!txBinHash.empty()) { if (txBinHash.getSize() != 32) { logger_->warn("[{}] invalid TX hash size {}", __func__, txBinHash.getSize()); @@ -2213,8 +2196,8 @@ std::string QtQuickAdapter::hdWalletIdByLeafId(const std::string& walletId) cons bs::message::ProcessingResult QtQuickAdapter::processUTXOs(bs::message::SeqId msgId , const ArmoryMessage_UTXOs& response) { - const auto& itReq = txReqs_.find(msgId); - if (itReq == txReqs_.end()) { + const auto& itReq = txDetailReqs_.find(msgId); + if (itReq == txDetailReqs_.end()) { logger_->error("[{}] unknown request #{}", __func__, msgId); return bs::message::ProcessingResult::Error; } @@ -2230,45 +2213,10 @@ bs::message::ProcessingResult QtQuickAdapter::processUTXOs(bs::message::SeqId ms catch (const std::exception& e) { logger_->error("[{}] failed to deser UTXO: {}", __func__, e.what()); } - const auto& dummyUTXOs = itReq->second.txReq->inputs(); - auto msgReq = itReq->second.msg.mutable_tx_request(); - std::vector inputs; - std::set inputAddrs; - for (const auto& u : dummyUTXOs) { - for (const auto& utxo : utxos) { - logger_->debug("[{}] {}:{} vs {}:{}", __func__, u.txHash.toHexStr(true), u.txOutIndex - , utxo.getTxHash().toHexStr(true), utxo.getTxOutIndex()); - if ((u.txHash == utxo.getTxHash()) && (u.txOutIndex == utxo.getTxOutIndex())) { - try { - inputAddrs.insert(bs::Address::fromUTXO(utxo)); - } - catch (const std::exception&) {} - msgReq->add_utxos(utxo.serialize().toBinStr()); - inputs.push_back(utxo); - break; - } - } - } - QMetaObject::invokeMethod(this, [txReq = itReq->second.txReq, inputs] { - txReq->setInputs(inputs); + QMetaObject::invokeMethod(this, [txDet = itReq->second, utxos] { + txDet->setImmutableUTXOs(utxos); }); - logger_->debug("[{}] matched {} UTXOs of {}", __func__, msgReq->utxos_size(), dummyUTXOs.size()); - if (msgReq->utxos_size() != dummyUTXOs.size()) { - itReq->second.txReq->setError(tr("Failed to obtain UTXO[s]")); - txReqs_.erase(itReq); - return bs::message::ProcessingResult::Error; - } - for (const auto& addr : inputAddrs) { - const auto& itAddr = addressCache_.find(addr); - if (itAddr != addressCache_.end()) { - msgReq->set_hd_wallet_id(itAddr->second); - logger_->debug("[{}] set HD wallet id {} from {}", __func__, msgReq->hd_wallet_id(), addr.display()); - break; - } - } - msgId = pushRequest(user_, userWallets_, itReq->second.msg.SerializeAsString()); - txReqs_[msgId] = { itReq->second.txReq, itReq->second.isMaxAmount }; - txReqs_.erase(itReq); + txDetailReqs_.erase(itReq); return bs::message::ProcessingResult::Success; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 070468d7d..02872cc0b 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -179,7 +179,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); Q_INVOKABLE int getSearchInputType(const QString&); Q_INVOKABLE void startAddressSearch(const QString&); - Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash); + Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash, bool rbf = false, bool cpfp = false); Q_INVOKABLE int changePassword(const QString& walletId, const QString& oldPassword, const QString& newPassword); Q_INVOKABLE bool isWalletNameExist(const QString& walletName); Q_INVOKABLE bool isWalletPasswordValid(const QString& walletId, const QString& password); diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 30d29eb44..cbc3f57c9 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -110,6 +110,7 @@ void TxInputsModel::clear() preSelected_.clear(); selectedBalance_ = 0; nbTx_ = 0; + fixedEntries_.clear(); endResetModel(); emit selectionChanged(); emit rowCountChanged(); @@ -160,6 +161,25 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) }); } +int TxInputsModel::setFixedUTXOs(const std::vector& utxos) +{ + int nbTX = 0; + for (const auto& utxo : utxos) { + for (const auto& entry : fixedEntries_) { + if ((entry.txId == utxo.getTxHash()) && (entry.txOutIndex == utxo.getTxOutIndex())) { + selectionUtxos_.insert({ utxo.getTxHash(), utxo.getTxOutIndex() }); + selectedBalance_ += utxo.getValue(); + nbTX++; + } + } + } + nbTx_ += nbTX; + emit selectionChanged(); + emit dataChanged(createIndex(0, 0), createIndex(fixedEntries_.size() - 1, 0), {SelectedRole}); + logger_->debug("[{}] nbTX: {}, balance: {}", __func__, nbTx_, selectedBalance_); + return nbTX; +} + void TxInputsModel::addEntries(const std::vector& entries) { if (entries.empty()) { @@ -171,9 +191,30 @@ void TxInputsModel::addEntries(const std::vector& entries) emit rowCountChanged(); } +void TxInputsModel::setFixedInputs(const std::vector& entries) +{ + if (entries.empty()) { + return; + } + logger_->debug("[{}] {} entries", __func__, entries.size()); + if (!fixedEntries_.empty()) { + beginRemoveRows(QModelIndex(), 0, fixedEntries_.size() - 1); + data_.erase(data_.cbegin(), data_.cbegin() + fixedEntries_.size()); + endRemoveRows(); + } + fixedEntries_ = entries; + beginInsertRows(QModelIndex(), 0, entries.size() - 1); + data_.insert(data_.cbegin(), entries.cbegin(), entries.cend()); + endInsertRows(); + emit rowCountChanged(); +} + void TxInputsModel::toggle(int row) { --row; + if (row < fixedEntries_.size()) { + return; + } auto& entry = data_[row]; if (!entry.txId.empty()) { return; @@ -228,6 +269,9 @@ void TxInputsModel::toggleSelection(int row) } else { for (int iRow = 1; iRow < rowCount(); iRow ++) { + if (iRow <= fixedEntries_.size()) { + continue; + } const auto& entry = data_.at(iRow-1); if (entry.txId.empty()) { selectionAddresses_.insert(entry.address); diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index e804d1354..fcc6c7887 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -84,6 +84,7 @@ class TxInputsModel : public QAbstractTableModel void clear(); void addUTXOs(const std::vector&); + int setFixedUTXOs(const std::vector&); void setTopBlock(uint32_t topBlock) { topBlock_ = topBlock; } struct Entry { @@ -94,6 +95,7 @@ class TxInputsModel : public QAbstractTableModel bool expanded{ false }; }; void addEntries(const std::vector&); + void setFixedInputs(const std::vector&); Q_PROPERTY(int nbTx READ nbTx NOTIFY selectionChanged) int nbTx() const { return nbTx_; } @@ -130,6 +132,7 @@ class TxInputsModel : public QAbstractTableModel std::map> utxos_; std::vector data_; + std::vector fixedEntries_; std::set> selectionUtxos_; std::set selectionAddresses_; bool selectionRoot_ {false}; diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 18d5554ec..1f82a411e 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -659,7 +659,6 @@ QTxDetails::QTxDetails(const std::shared_ptr& logger, const Bina inputsModel_ = new TxInputsModel(logger_, outputsModel_, this); selInputsModel_ = new TxInputsSelectedModel(this); selInputsModel_->setSourceModel(inputsModel_); - ownOutputs_ = new TxInputsModel(logger_, outputsModel_, this); inputs_ = new TxInOutModel(tr("Input"), this); outputs_ = new TxInOutModel(tr("Output"), this); } @@ -670,34 +669,85 @@ void QTxDetails::setDetails(const bs::sync::TXWalletDetails& details) if (details.changeAddress.address.isValid()) { details_.outputAddresses.push_back(details.changeAddress); } - for (const auto& entry : details_.outputAddresses) { - logger_->debug("[{}] out: {} {}", __func__, entry.address.display(), entry.value); - } inputs_->setData(details_.inputAddresses); outputs_->setData(details_.outputAddresses); outputsModel_->clearOutputs(); inputsModel_->clear(); - ownOutputs_->clear(); - for (const auto& out : details.outputAddresses) { - outputsModel_->addOutput(QString::fromStdString(out.address.display()) - , out.value / BTCNumericTypes::BalanceDivider); + if (!needInputsFromOutputs_) { + for (const auto& out : details.outputAddresses) { + outputsModel_->addOutput(QString::fromStdString(out.address.display()) + , out.value / BTCNumericTypes::BalanceDivider); + } } - std::vector inputs; - inputs.reserve(details.inputAddresses.size()); + ins_.clear(); + ins_.reserve(details.inputAddresses.size()); for (const auto& in : details.inputAddresses) { - inputs.push_back({ in.address, in.outHash, in.outIndex, in.value }); + logger_->debug("[{}] in: {} {}@{} = {}", __func__, in.address.display() + , in.outHash.toHexStr(true), in.outIndex, in.value); + ins_.push_back({ in.address, in.outHash, in.outIndex, in.value }); + } + if (!fixedInputs_.empty()) { + setImmutableUTXOs(fixedInputs_); + fixedInputs_.clear(); } + outs_.clear(); - outs_.reserve(details.inputAddresses.size()); + outs_.reserve(details.outputAddresses.size()); const auto& txId = details_.tx.isInitialized() ? details_.tx.getThisHash() : BinaryData{}; for (const auto& out : details.outputAddresses) { outs_.push_back({ out.address, txId, out.outIndex, out.value }); } - inputsModel_->addEntries(inputs); - ownOutputs_->addEntries(outs_); + if (needInputsFromOutputs_) { + setInputsFromOutputs(); + } + else { + inputsModel_->addEntries(ins_); + } emit updated(); } +void QTxDetails::setImmutableUTXOs(const std::vector& utxos) +{ + if (ins_.empty()) { + fixedInputs_ = utxos; + return; + } + logger_->debug("[{}] {}", __func__, utxos.size()); + inputsModel_->setFixedInputs(ins_); + if (!inputsModel_->setFixedUTXOs(utxos)) { + fixedInputs_ = utxos; + } +} + +void QTxDetails::setInputsFromOutputs() +{ + if (outs_.empty()) { + logger_->info("[{}] no outputs received [yet]"); + needInputsFromOutputs_ = true; + return; + } + decltype(outs_) outs; + outs.reserve(details_.outputAddresses.size()); + const auto& txId = details_.tx.isInitialized() ? details_.tx.getThisHash() : BinaryData{}; + for (const auto& out : details_.outputAddresses) { + outs.push_back({ out.address, txId, out.outIndex, out.value }); + } + + logger_->debug("[{}] {} outs", __func__, outs.size()); + for (const auto& out : outs) { + logger_->debug("[{}] {} {}@{} = {}", __func__, out.address.display() + , out.txId.toHexStr(true), out.txOutIndex, out.amount); + } + inputsModel_->setFixedInputs(outs); + ins_ = std::move(outs); + needInputsFromOutputs_ = false; + + if (!fixedInputs_.empty()) { + setImmutableUTXOs(fixedInputs_); + fixedInputs_.clear(); + } +} + std::vector> QTxDetails::outputData() const { std::vector> result; @@ -714,9 +764,6 @@ void QTxDetails::onTopBlock(quint32 curBlock) if (inputsModel_) { inputsModel_->setTopBlock(curBlock); } - if (ownOutputs_) { - ownOutputs_->setTopBlock(curBlock); - } QMetaObject::invokeMethod(this, [this] { emit newBlock(); }); diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 9ee57a07f..ea08d2f92 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -181,6 +181,8 @@ class QTxDetails : public QObject ~QTxDetails() override = default; void setDetails(const bs::sync::TXWalletDetails&); + void setImmutableUTXOs(const std::vector&); + Q_INVOKABLE void setInputsFromOutputs(); Q_PROPERTY(QString txId READ txId NOTIFY updated) QString txId() const { return QString::fromStdString(txHash_.toHexStr(true)); } @@ -213,8 +215,6 @@ class QTxDetails : public QObject TxInputsModel* inputsModel() const { return inputsModel_; } Q_PROPERTY(TxInputsSelectedModel* selectedInputsModel READ selInputsModel CONSTANT) TxInputsSelectedModel* selInputsModel() const { return selInputsModel_; } - Q_PROPERTY(TxInputsModel* ownOutputs READ ownOutputs CONSTANT) - TxInputsModel* ownOutputs() const { return ownOutputs_; } Q_PROPERTY(TxOutputsModel* outputsModel READ outputsModel CONSTANT) TxOutputsModel* outputsModel() const { return outputsModel_; } std::vector> outputData() const; @@ -236,10 +236,11 @@ public slots: TxInOutModel* outputs_{ nullptr }; TxInputsModel* inputsModel_{ nullptr }; TxInputsSelectedModel* selInputsModel_{ nullptr }; - TxInputsModel* ownOutputs_{ nullptr }; TxOutputsModel* outputsModel_{ nullptr }; - std::vector outs_; + std::vector ins_, outs_; uint32_t curBlock_{ 0 }; + bool needInputsFromOutputs_{ false }; + std::vector fixedInputs_; }; #endif // TX_LIST_MODEL_H diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 3cae881b6..dbfee1ada 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -308,7 +308,8 @@ ColumnLayout { if (tx !== null && (isRBF || isCPFP)) { fee_suggest_combo.currentIndex = feeSuggestions.rowCount - 1 fee_suggest_combo.input_item.text = Qt.binding(function() { - return Math.max(feeSuggestions.fastestFee, tx.feePerByte + 3) + var fpb = parseFloat(tx.feePerByte) + 3.0 + return Math.max(feeSuggestions.fastestFee, fpb) }) } } @@ -345,7 +346,7 @@ ColumnLayout { Layout.rightMargin: BSSizes.applyScale(16) Layout.preferredHeight: BSSizes.applyScale(300) - model: isRBF ? tx.inputsModel : isCPFP ? tx.ownOutputs : tx.selectedInputsModel + model: tx.selectedInputsModel columnWidths: [0.7, 0.1, 0, 0.2] copy_button_column_index: -1 @@ -381,7 +382,7 @@ ColumnLayout { Button { id: sel_inputs_button - enabled: true //!isRBF && !isCPFP + enabled: true activeFocusOnTab: false @@ -494,6 +495,11 @@ ColumnLayout { wallets_current_index: from_wallet_combo.currentIndex + onTextChanged: { + console.log("recv address changed") + create_temp_request() + } + onEnterPressed: { if (!processEnterKey()) { amount_input.setActiveFocus() @@ -620,7 +626,7 @@ ColumnLayout { Layout.leftMargin: BSSizes.applyScale(16) Layout.rightMargin: BSSizes.applyScale(16) - model: tx.outputsModel //txOutputsModel + model: tx.outputsModel columnWidths: [0.544, 0.2, 0.20, 0.056] copy_button_column_index: -1 @@ -631,12 +637,12 @@ ColumnLayout { { //txOutputsModel.delOutput(row) model.delOutput(row) - if (model.rowCount <= 1 && !isRBF && !isCPFP) { + /*if (model.rowCount <= 1 && !isRBF && !isCPFP) { tx.inputsModel.clearSelection() } else if (model.rowCount > 1 && !isRBF && !isCPFP) { tx.inputsModel.updateAutoselection() - } + }*/ } function get_text_left_padding(row, column) @@ -681,29 +687,18 @@ ColumnLayout { text: (tempRequest !== null && tempRequest.isWatchingOnly) ? qsTr("Export transaction") : qsTr("Continue") function prepare_transaction() { - var fee = /*tempRequest ? tempRequest.fee :*/ parseFloat(fee_suggest_combo.edit_value()) - console.log("fee: " + fee) + var fpb = parseFloat(fee_suggest_combo.edit_value()) if (isRBF) { return bsApp.createTXSignRequest(-1 //special index for RBF mode - , tx, fee, comment_input.input_text - , checkbox_rbf.checked, tx.inputsModel.zcInputs()) + , tx, fpb, comment_input.input_text, checkbox_rbf.checked) } else if (isCPFP) { return bsApp.createTXSignRequest(-2 //special index for CPFP mode - , tx, fee, comment_input.input_text - , checkbox_rbf.checked, tx.ownOutputs.zcInputs()) + , tx, fpb, comment_input.input_text, checkbox_rbf.checked) } else { // normal operation - if (table_sel_inputs.model.rowCount) { - return bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , tx, parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text - , checkbox_rbf.checked, tx.inputsModel.getSelection()) - } - else { - return bsApp.createTXSignRequest(from_wallet_combo.currentIndex - , tx.outputsModel.getOutputAddresses(), tx.outputsModel.getOutputAmounts() - , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text) - } + return bsApp.createTXSignRequest(from_wallet_combo.currentIndex + , tx, fpb, comment_input.input_text, checkbox_rbf.checked) } } @@ -755,16 +750,17 @@ ColumnLayout { } var outputAmounts = tx.outputsModel.getOutputAmounts() - if (!isRBF && !isCPFP/* && tx.selectedInputsModel.rowCount > 1*/) { + if (!isRBF && !isCPFP) { tempRequest = bsApp.newTXSignRequest(from_wallet_combo.currentIndex , outputAddresses, outputAmounts, (fpb > 0) ? fpb : 1.0, comment_input.input_text - , checkbox_rbf.checked, tx.inputsModel.getSelection()) + , checkbox_rbf.checked + , (tx.selectedInputsModel.rowCount > 1) ? tx.inputsModel.getSelection() : null) } else { - tempRequest = bsApp.newTXSignRequest(-1 + tempRequest = bsApp.newTXSignRequest(from_wallet_combo.currentIndex , outputAddresses, outputAmounts, (fpb > 0) ? fpb : 1.0 - , "", true, table_sel_inputs.model.zcInputs()) + , "", true, tx.inputsModel.getSelection()) } } } @@ -804,15 +800,17 @@ ColumnLayout { checkbox_rbf.checked = true tx.outputsModel.clearOutputs() - if (!isRBF && !isCPFP) { - bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex, tx) - } - else { + bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex, tx) + bsApp.requestFeeSuggestions() + + if (isRBF || isCPFP) { create_temp_request() if (isRBF) { tx.outputsModel.setOutputsFrom(tx) } + else if (isCPFP) { + tx.setInputsFromOutputs() + } } - bsApp.requestFeeSuggestions() } } diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 38fb53c2a..b7122f5bf 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -172,7 +172,7 @@ CustomPopup { function open(txId: string, isRBF: bool, isCPFP: bool) { _stack_view.replace(advanced_details) - root.tx = bsApp.getTXDetails(txId) + root.tx = bsApp.getTXDetails(txId, isRBF, isCPFP) root.isRBF = isRBF root.isCPFP = isCPFP advanced_details.init() From 18f507170d19dfc7849bbab98e93292ea3738c6b Mon Sep 17 00:00:00 2001 From: yz Date: Wed, 10 May 2023 11:33:35 +0300 Subject: [PATCH 401/436] Make fixed input selected and muted --- GUI/QtQuick/TxInputsModel.cpp | 27 ++++++++++++++----- GUI/QtQuick/TxInputsModel.h | 3 ++- GUI/QtQuick/qml/Send/SelectInputs.qml | 1 + .../qml/StyledControls/CustomTableView.qml | 1 + 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index cbc3f57c9..d7ed1577b 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -24,7 +24,8 @@ namespace { {TxInputsModel::ColorRole, "dataColor"}, {TxInputsModel::SelectedRole, "selected"}, {TxInputsModel::ExpandedRole, "expanded"}, - {TxInputsModel::CanBeExpandedRole, "is_expandable"} + {TxInputsModel::CanBeExpandedRole, "is_expandable"}, + {TxInputsModel::EditableRole, "is_editable"} }; } @@ -73,6 +74,8 @@ QVariant TxInputsModel::data(const QModelIndex& index, int role) const return (index.row() > 0 && index.column() == 0) ? data_[index.row() - 1].txId.empty() : false; case ColorRole: return dataColor(index.row(), index.column()); + case EditableRole: + return !isFixedInput(index.row()); default: break; } return QVariant(); @@ -166,11 +169,9 @@ int TxInputsModel::setFixedUTXOs(const std::vector& utxos) int nbTX = 0; for (const auto& utxo : utxos) { for (const auto& entry : fixedEntries_) { - if ((entry.txId == utxo.getTxHash()) && (entry.txOutIndex == utxo.getTxOutIndex())) { - selectionUtxos_.insert({ utxo.getTxHash(), utxo.getTxOutIndex() }); - selectedBalance_ += utxo.getValue(); - nbTX++; - } + selectionUtxos_.insert({ utxo.getTxHash(), utxo.getTxOutIndex() }); + selectedBalance_ += utxo.getValue(); + nbTX++; } } nbTx_ += nbTX; @@ -517,7 +518,7 @@ QVariant TxInputsModel::getData(int row, int col) const return QString::fromStdString(entry.address.display()); } case ColumnTx: - if (itUTXOs == utxos_.end()) { + if (itUTXOs == utxos_.end() || isFixedInput(row)) { return QString::number(1); } else { @@ -558,3 +559,15 @@ void TxInputsModel::clearSelection() emit selectionChanged(); emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); } + +bool TxInputsModel::isFixedInput(int row) const +{ + if (row == 0) { + return true; + } + auto right = data_[row - 1]; + return std::find_if(fixedEntries_.begin(), fixedEntries_.end(), [this, right](const auto& value) + { + return right.address == value.address && right.txId == value.txId && right.txOutIndex == value.txOutIndex; + }) != fixedEntries_.end(); +} diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index fcc6c7887..69152f84a 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -72,7 +72,7 @@ class TxInputsModel : public QAbstractTableModel public: enum TableRoles { TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole, - SelectedRole, ExpandedRole, CanBeExpandedRole }; + SelectedRole, ExpandedRole, CanBeExpandedRole, EditableRole }; TxInputsModel(const std::shared_ptr&, TxOutputsModel* , QObject* parent = nullptr); @@ -122,6 +122,7 @@ class TxInputsModel : public QAbstractTableModel QVariant getData(int row, int col) const; QColor dataColor(int row, int col) const; QList collectUTXOsFor(double amount); + bool isFixedInput(int row) const; private: enum Columns {ColumnAddress, ColumnTx, ColumnComment, ColumnBalance}; diff --git a/GUI/QtQuick/qml/Send/SelectInputs.qml b/GUI/QtQuick/qml/Send/SelectInputs.qml index e948e2aeb..b4ee1f7a9 100644 --- a/GUI/QtQuick/qml/Send/SelectInputs.qml +++ b/GUI/QtQuick/qml/Send/SelectInputs.qml @@ -71,6 +71,7 @@ ColumnLayout { CustomCheckBox { id: checkbox_address + enabled: model_is_editable anchors.left: parent.left anchors.leftMargin: inputs_table.get_text_left_padding(model_row, model_column, model_is_expandable) diff --git a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml index 060331223..dae89875b 100644 --- a/GUI/QtQuick/qml/StyledControls/CustomTableView.qml +++ b/GUI/QtQuick/qml/StyledControls/CustomTableView.qml @@ -118,6 +118,7 @@ Column { property bool model_selected: (typeof selected !== "undefined") ? selected : ({}) property bool model_expanded: (typeof expanded !== "undefined") ? expanded : ({}) property bool model_is_expandable: (typeof is_expandable !== "undefined") ? is_expandable : ({}) + property bool model_is_editable: (typeof is_editable !== "undefined") ? is_editable : ({}) function get_text_left_padding(row, column, isExpandable) { From a43e0471dd4765a0fe59499f7e0571eaf6508f09 Mon Sep 17 00:00:00 2001 From: yz Date: Wed, 10 May 2023 18:28:54 +0300 Subject: [PATCH 402/436] Review fixes --- GUI/QtQuick/TxInputsModel.cpp | 24 +++++++++++++----------- GUI/QtQuick/TxInputsModel.h | 2 +- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index d7ed1577b..2d8484af5 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -75,7 +75,7 @@ QVariant TxInputsModel::data(const QModelIndex& index, int role) const case ColorRole: return dataColor(index.row(), index.column()); case EditableRole: - return !isFixedInput(index.row()); + return isInputSelectable(index.row()); default: break; } return QVariant(); @@ -169,9 +169,11 @@ int TxInputsModel::setFixedUTXOs(const std::vector& utxos) int nbTX = 0; for (const auto& utxo : utxos) { for (const auto& entry : fixedEntries_) { - selectionUtxos_.insert({ utxo.getTxHash(), utxo.getTxOutIndex() }); - selectedBalance_ += utxo.getValue(); - nbTX++; + if ((entry.txId == utxo.getTxHash()) && (entry.txOutIndex == utxo.getTxOutIndex())) { + selectionUtxos_.insert({ utxo.getTxHash(), utxo.getTxOutIndex() }); + selectedBalance_ += utxo.getValue(); + nbTX++; + } } } nbTx_ += nbTX; @@ -518,7 +520,7 @@ QVariant TxInputsModel::getData(int row, int col) const return QString::fromStdString(entry.address.display()); } case ColumnTx: - if (itUTXOs == utxos_.end() || isFixedInput(row)) { + if (itUTXOs == utxos_.end() || !isInputSelectable(row)) { return QString::number(1); } else { @@ -560,14 +562,14 @@ void TxInputsModel::clearSelection() emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); } -bool TxInputsModel::isFixedInput(int row) const +bool TxInputsModel::isInputSelectable(int row) const { if (row == 0) { return true; } - auto right = data_[row - 1]; - return std::find_if(fixedEntries_.begin(), fixedEntries_.end(), [this, right](const auto& value) - { - return right.address == value.address && right.txId == value.txId && right.txOutIndex == value.txOutIndex; - }) != fixedEntries_.end(); + if (row > 0 && row <= fixedEntries_.size()) { + return false; + } + + return true; } diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index 69152f84a..6106bca60 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -122,7 +122,7 @@ class TxInputsModel : public QAbstractTableModel QVariant getData(int row, int col) const; QColor dataColor(int row, int col) const; QList collectUTXOsFor(double amount); - bool isFixedInput(int row) const; + bool isInputSelectable(int row) const; private: enum Columns {ColumnAddress, ColumnTx, ColumnComment, ColumnBalance}; From 3917cc3505872e5ed1ba8fe40e00d1cb1b3d5336 Mon Sep 17 00:00:00 2001 From: yz Date: Thu, 11 May 2023 11:31:47 +0300 Subject: [PATCH 403/436] Fixed network modification --- GUI/QtQuick/ArmoryServersModel.cpp | 6 ++-- GUI/QtQuick/ArmoryServersModel.h | 2 +- GUI/QtQuick/QtQuickAdapter.cpp | 34 +++---------------- GUI/QtQuick/QtQuickAdapter.h | 2 +- .../qml/Settings/ModifyArmoryServer.qml | 8 +++++ 5 files changed, 17 insertions(+), 35 deletions(-) diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index 225b2a264..1f2eeb5c3 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -150,11 +150,10 @@ bool ArmoryServersModel::setData(const QModelIndex& index, const QVariant& value } int row = index.row(); - if (role == CurrentServerRole) { setCurrent(row); } - else if (!isEditable(index.row())) { + else if (isEditable(index.row())) { switch (role) { case NameRole: @@ -177,7 +176,8 @@ bool ArmoryServersModel::setData(const QModelIndex& index, const QVariant& value } } - emit changed(index, value); + emit changed(index.row()); + emit dataChanged(index, index, { role }); return true; } diff --git a/GUI/QtQuick/ArmoryServersModel.h b/GUI/QtQuick/ArmoryServersModel.h index c4fc83570..f03294624 100644 --- a/GUI/QtQuick/ArmoryServersModel.h +++ b/GUI/QtQuick/ArmoryServersModel.h @@ -55,7 +55,7 @@ class ArmoryServersModel: public QAbstractListModel QString currentNetworkName() const; signals: - void changed(const QModelIndex&, const QVariant&); + void changed(int); void currentChanged(int index); void connectedChanged(); void rowCountChanged(); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 04e467714..6fffc4bce 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1538,38 +1538,12 @@ bool QtQuickAdapter::delArmoryServer(int idx) return true; } -void QtQuickAdapter::onArmoryServerChanged(const QModelIndex& index, const QVariant& value) -{ - auto srv = armoryServersModel_->data(index.row()); - switch (index.column()) { - case 0: - for (int i = 0; i < armoryServersModel_->rowCount(); ++i) { - if (i == index.row()) { - continue; - } - if (armoryServersModel_->data(i).name == value.toString()) { - return; - } - } - srv.name = value.toString(); - break; - case 1: - srv.netType = static_cast(value.toInt()); - break; - case 2: - srv.armoryDBIp = value.toString(); - break; - case 3: - srv.armoryDBPort = value.toInt(); - break; - case 4: - srv.armoryDBKey = value.toString(); - break; - default: break; - } +void QtQuickAdapter::onArmoryServerChanged(int index) +{ + auto srv = armoryServersModel_->data(index); SettingsMessage msg; auto msgReq = msg.mutable_upd_armory_server(); - msgReq->set_index(index.row()); + msgReq->set_index(index); auto msgSrv = msgReq->mutable_server(); msgSrv->set_server_name(srv.name.toStdString()); msgSrv->set_server_address(srv.armoryDBIp.toStdString()); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 02872cc0b..7aa5c73dc 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -232,7 +232,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void topBlock(quint32); private slots: - void onArmoryServerChanged(const QModelIndex&, const QVariant&); + void onArmoryServerChanged(int index); void onArmoryServerSelected(int index); private: diff --git a/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml b/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml index 9f801feb4..1d0892bdd 100644 --- a/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml +++ b/GUI/QtQuick/qml/Settings/ModifyArmoryServer.qml @@ -117,6 +117,8 @@ ColumnLayout { armoryServersModel.setData(armoryServersModel.index(server_index, 0) , name_text_input.input_text, ArmoryServersModel.NameRole) } + + onTabNavigated: ip_dns_text_input.setActiveFocus() } CustomTextInput { @@ -133,6 +135,8 @@ ColumnLayout { armoryServersModel.setData(armoryServersModel.index(server_index, 0) , ip_dns_text_input.input_text, ArmoryServersModel.AddressRole) } + + onTabNavigated: port_text_input.setActiveFocus() } CustomTextInput { @@ -151,6 +155,8 @@ ColumnLayout { armoryServersModel.setData(armoryServersModel.index(server_index, 0) , port_text_input.input_text, ArmoryServersModel.PortRole) } + + onTabNavigated: db_key_text_input.setActiveFocus() } CustomTextInput { @@ -167,6 +173,8 @@ ColumnLayout { armoryServersModel.setData(armoryServersModel.index(server_index, 0) , db_key_text_input.input_text, ArmoryServersModel.KeyRole) } + + onTabNavigated: name_text_input.setActiveFocus() } Label { From 2211780e3df03289dc9035e51cb3ddcc76fa9539 Mon Sep 17 00:00:00 2001 From: yz Date: Thu, 11 May 2023 18:30:20 +0300 Subject: [PATCH 404/436] Add fee in max evaluation; inverted tx list for address search --- GUI/QtQuick/TxListModel.cpp | 2 +- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 1f82a411e..30455b292 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -555,7 +555,7 @@ void TxListForAddr::addRows(const std::vector& entries) if (!entries.empty()) { QMetaObject::invokeMethod(this, [this, entries] { beginInsertRows(QModelIndex(), rowCount(), rowCount() + entries.size() - 1); - data_.insert(data_.end(), entries.cbegin(), entries.cend()); + data_.insert(data_.end(), entries.rbegin(), entries.rend()); endInsertRows(); emit changed(); }); diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index dbfee1ada..e16283514 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -529,7 +529,7 @@ ColumnLayout { height: BSSizes.applyScale(70) function getMax() { - var maxValue = parseFloat(tempRequest.maxAmount) - tx.outputsModel.totalAmount + var maxValue = parseFloat(tempRequest.maxAmount) - tx.outputsModel.totalAmount - parseFloat(tx.fee) return (maxValue >= 0 ? maxValue : 0).toFixed(8) } From 115fb066be82e453e5b52fa93c8920f92e75e4f1 Mon Sep 17 00:00:00 2001 From: yz Date: Thu, 11 May 2023 18:51:48 +0300 Subject: [PATCH 405/436] const iterators --- GUI/QtQuick/TxListModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 30455b292..9f1ea0859 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -555,7 +555,7 @@ void TxListForAddr::addRows(const std::vector& entries) if (!entries.empty()) { QMetaObject::invokeMethod(this, [this, entries] { beginInsertRows(QModelIndex(), rowCount(), rowCount() + entries.size() - 1); - data_.insert(data_.end(), entries.rbegin(), entries.rend()); + data_.insert(data_.end(), entries.crbegin(), entries.crend()); endInsertRows(); emit changed(); }); From b06c40e749f42164350a6204a580c62e69796c70 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Sat, 13 May 2023 00:25:00 +0300 Subject: [PATCH 406/436] some input selection fixes --- GUI/QtQuick/QTXSignRequest.cpp | 15 +++ GUI/QtQuick/QTXSignRequest.h | 2 +- GUI/QtQuick/QtQuickAdapter.cpp | 16 +++- GUI/QtQuick/TxInputsModel.cpp | 115 ++++++++++++++--------- GUI/QtQuick/TxInputsModel.h | 12 ++- GUI/QtQuick/TxListModel.cpp | 36 ++++++- GUI/QtQuick/TxListModel.h | 5 + GUI/QtQuick/qml/Send/AdvancedDetails.qml | 51 +++++----- common | 2 +- 9 files changed, 174 insertions(+), 80 deletions(-) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index 4ad5b29df..c9c61d330 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -168,6 +168,21 @@ bool QTXSignRequest::isWatchingOnly() const return isWatchingOnly_; } +bool QTXSignRequest::isValid() const +{ + if (!error_.isEmpty() || !txReq_.isValid()) { + return false; + } + const int64_t inAmount = txReq_.armorySigner_.getTotalInputsValue(); + int64_t outAmount = 0; + for (const auto& recip : txReq_.getRecipients([](const bs::Address&) { return true; })) { + outAmount += recip->getValue(); + } + const int64_t fee = txReq_.getFee(); + logger_->debug("[QTXSignRequest::isValid] in={}, out={}, fee={}", inAmount, outAmount, fee); + return ((inAmount - outAmount - fee) >= 0); +} + void QTXSignRequest::setWatchingOnly(bool watchingOnly) { isWatchingOnly_ = watchingOnly; diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h index 1e0dbf851..69af33042 100644 --- a/GUI/QtQuick/QTXSignRequest.h +++ b/GUI/QtQuick/QTXSignRequest.h @@ -71,7 +71,7 @@ class QTXSignRequest : public QObject Q_PROPERTY(QString errorText READ errorText NOTIFY errorSet) QString errorText() const { return error_; } Q_PROPERTY(bool isValid READ isValid NOTIFY txSignReqChanged) - bool isValid() const { return (error_.isEmpty() && txReq_.isValid()); } + bool isValid() const; Q_PROPERTY(QString maxAmount READ outputAmount NOTIFY txSignReqChanged) Q_PROPERTY(bool isHWW READ isHWW NOTIFY hwwChanged) bool isHWW() const { return isHWW_; } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 6fffc4bce..6d391cf63 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1619,11 +1619,16 @@ QTXSignRequest* QtQuickAdapter::newTXSignRequest(int walletIndex, const QStringL , qUtxo->input().amount, qUtxo->input().txHash.toHexStr(true)); } } + logger_->debug("[{}] {} UTXOs", __func__, uniqueUTXOs.size()); for (const auto& utxo : uniqueUTXOs) { - logger_->debug("[{}] UTXO {} @ {}", __func__, utxo.getValue(), utxo.getTxHash().toHexStr(true)); + logger_->debug("[{}] UTXO {}@{} = {}", __func__, utxo.getTxHash().toHexStr(true) + , utxo.getTxOutIndex(), utxo.getValue()); msgReq->add_utxos(utxo.serialize().toBinStr()); } } + else { + logger_->debug("[{}] no UTXOs", __func__); + } const auto msgId = pushRequest(user_, userWallets_, msg.SerializeAsString()); txReqs_[msgId] = { txReq, isMaxAmount }; return txReq; @@ -1638,6 +1643,10 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, QTxDetails* } if (!utxos) { utxos = txDet->inputsModel()->getSelection(); + for (const auto& utxo : utxos->data()) { + logger_->debug("[{}] UTXO {}@{} = {}", __func__, utxo->utxo().getTxHash().toHexStr(true) + , utxo->utxo().getTxOutIndex(), utxo->utxo().getValue()); + } } return newTXSignRequest(walletIndex, txDet->outputsModel()->getOutputAddresses() , txDet->outputsModel()->getOutputAmounts(), fee, comment, isRbf, utxos); @@ -2082,12 +2091,12 @@ void QtQuickAdapter::processWalletAddresses(const std::string& walletId bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::SeqId msgId , const WalletsMessage_TxResponse& response) { - logger_->debug("[{}] {}", __func__, response.DebugString()); + //logger_->debug("[{}] {}", __func__, response.DebugString()); const auto& itReq = txReqs_.find(msgId); auto txReq = bs::signer::pbTxRequestToCore(response.tx_sign_request(), logger_); if (itReq == txReqs_.end()) { if (txSaveReqs_.empty()) { - logger_->error("[{}] unknown request #{}", __func__, msgId); + //logger_->error("[{}] unknown request #{}", __func__, msgId); return bs::message::ProcessingResult::Error; } const auto exportPath = *txSaveReqs_.rbegin(); @@ -2173,6 +2182,7 @@ bs::message::ProcessingResult QtQuickAdapter::processUTXOs(bs::message::SeqId ms for (const auto& serUtxo : response.utxos()) { UTXO utxo; utxo.unserialize(BinaryData::fromString(serUtxo)); + logger_->debug("[{}] {}@{}", __func__, utxo.getTxHash().toHexStr(true), utxo.getTxOutIndex()); utxos.emplace_back(std::move(utxo)); } } diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 2d8484af5..11ce8638a 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -157,9 +157,9 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) continue; } } - if (collectUTXOsForAmount_ > 0) { - collectUTXOsFor(collectUTXOsForAmount_); - collectUTXOsForAmount_ = 0; + if (collectUTXOsForAmount_) { + collectUTXOsFor(); + collectUTXOsForAmount_ = false; } }); } @@ -170,9 +170,13 @@ int TxInputsModel::setFixedUTXOs(const std::vector& utxos) for (const auto& utxo : utxos) { for (const auto& entry : fixedEntries_) { if ((entry.txId == utxo.getTxHash()) && (entry.txOutIndex == utxo.getTxOutIndex())) { + logger_->debug("[{}] UTXO selection: {}@{}", __func__, utxo.getTxHash().toHexStr(true), utxo.getTxOutIndex()); selectionUtxos_.insert({ utxo.getTxHash(), utxo.getTxOutIndex() }); selectedBalance_ += utxo.getValue(); nbTX++; + const auto& addr = bs::Address::fromUTXO(utxo); + utxos_[addr].push_back(utxo); + break; } } } @@ -282,6 +286,7 @@ void TxInputsModel::toggleSelection(int row) const auto& itAddr = utxos_.find(entry.address); if (itAddr != utxos_.end()) { for (const auto& u : itAddr->second) { + logger_->debug("[{}:1] UTXO selection: {}@{}", __func__, u.getTxHash().toHexStr(true), u.getTxOutIndex()); selectionUtxos_.insert({u.getTxHash(), u.getTxOutIndex()}); selectedBalance_ += u.getValue(); nbTx_++; @@ -326,6 +331,7 @@ void TxInputsModel::toggleSelection(int row) nbTx_++; selectedBalance_ += utxo.getValue(); selectionUtxos_.insert({utxo.getTxHash(), utxo.getTxOutIndex()}); + logger_->debug("[{}:2] UTXO selection: {}@{}", __func__, utxo.getTxHash().toHexStr(true), utxo.getTxOutIndex()); } else { selectionAddresses_.insert(entry.address); @@ -335,6 +341,7 @@ void TxInputsModel::toggleSelection(int row) == selectionUtxos_.end()) { selectedBalance_ += utxo_addr.getValue(); selectionUtxos_.insert({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()}); + logger_->debug("[{}:3] UTXO selection: {}@{}", __func__, utxo_addr.getTxHash().toHexStr(true), utxo_addr.getTxOutIndex()); nbTx_++; } } @@ -376,12 +383,12 @@ void TxInputsModel::toggleSelection(int row) emit dataChanged(createIndex(selStart, 0), createIndex(selEnd, 0), {SelectedRole}); } -QUTXOList* TxInputsModel::getSelection() +QUTXOList* TxInputsModel::getSelection(const QString& address, double amount) { QList result; - const double amount = outsModel_ ? outsModel_->totalAmount() : 0; - logger_->debug("[{}] total amount: {}", __func__, amount); - if (static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider)) > selectedBalance_) { // auto selection + if (!address.isEmpty() && (amount > 0) && fixedEntries_.empty() && // auto selection + selectionUtxos_.empty() && selectionAddresses_.empty()) { + //(static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider)) > selectedBalance_)) { const auto& it = preSelected_.find(static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider))); if (it != preSelected_.end()) { return new QUTXOList(it->second, (QObject*)this); @@ -390,15 +397,20 @@ QUTXOList* TxInputsModel::getSelection() collectUTXOsForAmount_ = amount; return nullptr; } - result = collectUTXOsFor(amount); + result = collectUTXOsFor(bs::Address::fromAddressString(address.toStdString()), amount); + logger_->debug("[{}] auto-selected {} inputs", __func__, result.size()); preSelected_[static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider))] = result; } else { - for (auto sel_utxo : selectionUtxos_) { - bool added = false; + selectedBalance_ = 0; + logger_->debug("[{}] {} UTXOs, {} addresses", __func__, selectionUtxos_.size(), selectionAddresses_.size()); + for (const auto& sel : selectionUtxos_) { for (const auto& byAddr : utxos_) { + bool added = false; for (const auto& utxo : byAddr.second) { - if ((sel_utxo.first == utxo.getTxHash()) && (sel_utxo.second == utxo.getTxOutIndex())) { + if ((sel.first == utxo.getTxHash()) && (sel.second == utxo.getTxOutIndex())) { + logger_->debug("[{}] adding {} {}", __func__, sel.first.toHexStr(true), sel.second); + selectedBalance_ += utxo.getValue(); result.push_back(new QUTXO(utxo, (QObject*)this)); added = true; break; @@ -408,55 +420,59 @@ QUTXOList* TxInputsModel::getSelection() break; } } - emit selectionChanged(); } - selectedBalance_ = 0; - for (auto sel_addr : selectionAddresses_) { - const auto& itUTXO = utxos_.find(sel_addr); + for (const auto& sel : selectionAddresses_) { + const auto& itUTXO = utxos_.find(sel); if (itUTXO != utxos_.end()) { for (const auto& utxo : itUTXO->second) { + if (selectionUtxos_.find({utxo.getTxHash(), utxo.getTxOutIndex()}) + != selectionUtxos_.end()) { + continue; + } + logger_->debug("[{}] adding {} {}", __func__, utxo.getTxHash().toHexStr(true), utxo.getTxOutIndex()); selectedBalance_ += utxo.getValue(); result.push_back(new QUTXO(utxo, (QObject*)this)); } } - nbTx_ = result.size(); - emit selectionChanged(); } + nbTx_ = result.size(); + logger_->debug("[{}] {} UTXOs selected", __func__, nbTx_); } return new QUTXOList(result, (QObject*)this); } void TxInputsModel::updateAutoselection() { - const double amount = outsModel_ ? outsModel_->totalAmount() : 0; - - if (static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider)) <= selectedBalance_) { - return; - } - - for (int i = data_.size() - 1; i >= 0; --i) { - const auto& entry = data_[i]; - if (!entry.expanded) { - toggle(i + 1); - } - } - - if (utxos_.empty()) { - collectUTXOsForAmount_ = amount; - return; - } - auto result = collectUTXOsFor(amount); - selectionUtxos_.clear(); - selectedBalance_ = 0; - nbTx_ = 0; - for (const auto utxo : result) { - selectionUtxos_.insert({ utxo->utxo().getTxHash(), utxo->utxo().getTxOutIndex() }); - selectedBalance_ += utxo->utxo().getValue(); - nbTx_++; - } + //if (static_cast(std::floor(amount * BTCNumericTypes::BalanceDivider)) <= selectedBalance_) { + //return; + //} + if (!selectionUtxos_.empty() || !selectionAddresses_.empty()) { + return; + } + for (int i = data_.size() - 1; i >= 0; --i) { + const auto& entry = data_[i]; + if (!entry.expanded) { + toggle(i + 1); + } + } - emit selectionChanged(); - emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); + if (utxos_.empty()) { + collectUTXOsForAmount_ = true; + return; + } + auto result = collectUTXOsFor(); + selectionUtxos_.clear(); + selectedBalance_ = 0; + nbTx_ = 0; + for (const auto utxo : result) { + selectionUtxos_.insert({ utxo->utxo().getTxHash(), utxo->utxo().getTxOutIndex() }); + logger_->debug("[{}] UTXO selection: {}@{}", __func__, utxo->utxo().getTxHash().toHexStr(true), utxo->utxo().getTxOutIndex()); + selectedBalance_ += utxo->utxo().getValue(); + nbTx_++; + } + + emit selectionChanged(); + emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); } QUTXOList* TxInputsModel::zcInputs() const @@ -470,7 +486,7 @@ QUTXOList* TxInputsModel::zcInputs() const return new QUTXOList(result, (QObject*)this); } -QList TxInputsModel::collectUTXOsFor(double amount) +QList TxInputsModel::collectUTXOsFor(const bs::Address& addr, double amount) { QList result; std::vector allUTXOs; @@ -483,6 +499,13 @@ QList TxInputsModel::collectUTXOsFor(double amount) for (unsigned i = 0; i < recipients.size(); ++i) { recipientsMap[i] = { recipients.at(i) }; } + if (!addr.empty() && (amount > 0)) { + recipientsMap[recipients.size()] = { addr.getRecipient(bs::XBTAmount{amount}) }; + } + if (recipientsMap.empty()) { + logger_->error("[TxInputsModel::collectUTXOsFor] no recipients found"); + return result; + } float feePerByte = fee_.isEmpty() ? 1.0 : std::stof(fee_.toStdString()); auto payment = Armory::CoinSelection::PaymentStruct(recipientsMap, 0, feePerByte, 0); Armory::CoinSelection::CoinSelection coinSelection([allUTXOs](uint64_t) { return allUTXOs; } diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index 6106bca60..f024aca3a 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -61,6 +61,9 @@ class QUTXOList : public QObject {} QList data() const { return data_; } + Q_PROPERTY(int rowCount READ rowCount CONSTANT) + int rowCount() const { return data_.size(); } + private: QList data_; }; @@ -100,7 +103,8 @@ class TxInputsModel : public QAbstractTableModel Q_PROPERTY(int nbTx READ nbTx NOTIFY selectionChanged) int nbTx() const { return nbTx_; } Q_PROPERTY(QString balance READ balance NOTIFY selectionChanged) - QString balance() const { return QString::number(selectedBalance_ / BTCNumericTypes::BalanceDivider, 'f', 8); } + double balanceValue() const { return selectedBalance_ / BTCNumericTypes::BalanceDivider; } + QString balance() const { return QString::number(balanceValue(), 'f', 8); } Q_PROPERTY(QString fee READ fee WRITE setFee NOTIFY feeChanged) QString fee() const { return fee_; } @@ -108,7 +112,7 @@ class TxInputsModel : public QAbstractTableModel Q_INVOKABLE void toggle(int row); Q_INVOKABLE void toggleSelection(int row); - Q_INVOKABLE QUTXOList* getSelection(); + Q_INVOKABLE QUTXOList* getSelection(const QString& address = {}, double amt = 0); Q_INVOKABLE QUTXOList* zcInputs() const; Q_INVOKABLE void updateAutoselection(); Q_INVOKABLE void clearSelection(); @@ -121,7 +125,7 @@ class TxInputsModel : public QAbstractTableModel private: QVariant getData(int row, int col) const; QColor dataColor(int row, int col) const; - QList collectUTXOsFor(double amount); + QList collectUTXOsFor(const bs::Address& = {}, double amount = 0); bool isInputSelectable(int row) const; private: @@ -143,7 +147,7 @@ class TxInputsModel : public QAbstractTableModel uint64_t selectedBalance_{ 0 }; QString fee_; uint32_t topBlock_{ 0 }; - double collectUTXOsForAmount_{ 0 }; + bool collectUTXOsForAmount_{ false }; }; #endif // TX_INPUTS_MODEL_H diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 9f1ea0859..904eca608 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -757,6 +757,25 @@ std::vector> QTxDetails::outputData() const return result; } +bool QTxDetails::amountsMatch(float fpb) const +{ + if (outputsModel_->rowCount() <= 1) { + return false; + } + const auto inBalance = inputsModel_->balanceValue(); + if (inBalance < 0.0000001) { + return true; + } + const float fpbCur = feePerByteValue(); + logger_->debug("[{}] fpb={}/{}, feeVal={}", __func__, fpb, fpbCur, feeValue()); + const auto outBalance = outputsModel_->totalAmount(); + const float fee = fpb ? (feeValue() * fpb / (fpbCur ? fpbCur : 1)) : feeValue(); + double diff = inBalance - outBalance - fee; + logger_->debug("[{}] in:{:.8f}, out:{:.8f}, fee:{:.8f}, diff={} fpb={}", __func__, inBalance + , outBalance, fee, diff, fpb); + return ((diff > 0) || (std::abs(diff) < 0.000003)); +} + void QTxDetails::onTopBlock(quint32 curBlock) { if (curBlock_ != curBlock) { @@ -809,7 +828,7 @@ QString QTxDetails::outputAmount() const return displayBTC(amount / BTCNumericTypes::BalanceDivider); } -QString QTxDetails::fee() const +float QTxDetails::feeValue() const { int64_t amount = 0; for (const auto& in : details_.inputAddresses) { @@ -818,10 +837,15 @@ QString QTxDetails::fee() const for (const auto& out : details_.outputAddresses) { amount -= out.value; } - return displayBTC(amount / BTCNumericTypes::BalanceDivider); + return amount / BTCNumericTypes::BalanceDivider; } -QString QTxDetails::feePerByte() const +QString QTxDetails::fee() const +{ + return displayBTC(feeValue()); +} + +float QTxDetails::feePerByteValue() const { int64_t amount = 0; for (const auto& in : details_.inputAddresses) { @@ -834,7 +858,11 @@ QString QTxDetails::feePerByte() const if (!txWeight) { txWeight = -1; } - return displayBTC(amount / txWeight, 1); + return amount / txWeight; +} +QString QTxDetails::feePerByte() const +{ + return displayBTC(feePerByteValue(), 1); } QString QTxDetails::timestamp() const diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index ea08d2f92..265d65413 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -201,6 +201,7 @@ class QTxDetails : public QObject Q_PROPERTY(QString fee READ fee NOTIFY updated) QString fee() const; Q_PROPERTY(QString feePerByte READ feePerByte NOTIFY updated) + float feePerByteValue() const; QString feePerByte() const; Q_PROPERTY(QString height READ height NOTIFY updated) QString height() const; @@ -218,6 +219,7 @@ class QTxDetails : public QObject Q_PROPERTY(TxOutputsModel* outputsModel READ outputsModel CONSTANT) TxOutputsModel* outputsModel() const { return outputsModel_; } std::vector> outputData() const; + Q_INVOKABLE bool amountsMatch(float fpb) const; bs::sync::Transaction::Direction direction() const; @@ -228,6 +230,9 @@ class QTxDetails : public QObject public slots: void onTopBlock(quint32); +private: + float feeValue() const; + private: std::shared_ptr logger_; const BinaryData txHash_; diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index e16283514..72491f4c2 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -31,6 +31,13 @@ ColumnLayout { property bool is_ready_output: (rec_addr_input.isValid && rec_addr_input.input_text.length && parseFloat(amount_input.input_text) !== 0 && amount_input.input_text.length) + Connections { + target: tx.inputsModel + onSelectionChanged: { + create_temp_request() + } + } + RowLayout { Layout.fillWidth: true @@ -529,7 +536,7 @@ ColumnLayout { height: BSSizes.applyScale(70) function getMax() { - var maxValue = parseFloat(tempRequest.maxAmount) - tx.outputsModel.totalAmount - parseFloat(tx.fee) + var maxValue = parseFloat(tempRequest.maxAmount) - tx.outputsModel.totalAmount return (maxValue >= 0 ? maxValue : 0).toFixed(8) } @@ -594,6 +601,7 @@ ColumnLayout { if (!isRBF && !isCPFP) { tx.inputsModel.updateAutoselection() } + create_temp_request() } } @@ -643,6 +651,7 @@ ColumnLayout { else if (model.rowCount > 1 && !isRBF && !isCPFP) { tx.inputsModel.updateAutoselection() }*/ + create_temp_request() } function get_text_left_padding(row, column) @@ -676,7 +685,7 @@ ColumnLayout { activeFocusOnTab: continue_but.enabled - enabled: (tx.outputsModel.rowCount > 1) //(txOutputsModel.rowCount > 1) + enabled: tempRequest && tempRequest.isValid && tx.amountsMatch(parseFloat(fee_suggest_combo.edit_value())) preferred: isRBF || is_ready_broadcast width: BSSizes.applyScale(1084) @@ -742,26 +751,26 @@ ColumnLayout { function create_temp_request() { + var fpb = parseFloat(fee_suggest_combo.edit_value()) + var outputAddresses = tx.outputsModel.getOutputAddresses() + var outputAmounts = tx.outputsModel.getOutputAmounts() + var selectedInputs = tx.inputsModel.getSelection() + if (rec_addr_input.isValid && rec_addr_input.input_text.length) { - var fpb = parseFloat(fee_suggest_combo.edit_value()) - var outputAddresses = tx.outputsModel.getOutputAddresses() - if (rec_addr_input.input_text.length > 0) { - outputAddresses.push(rec_addr_input.input_text) - } - var outputAmounts = tx.outputsModel.getOutputAmounts() - - if (!isRBF && !isCPFP) { - tempRequest = bsApp.newTXSignRequest(from_wallet_combo.currentIndex - , outputAddresses, outputAmounts, - (fpb > 0) ? fpb : 1.0, comment_input.input_text - , checkbox_rbf.checked - , (tx.selectedInputsModel.rowCount > 1) ? tx.inputsModel.getSelection() : null) - } - else { - tempRequest = bsApp.newTXSignRequest(from_wallet_combo.currentIndex - , outputAddresses, outputAmounts, (fpb > 0) ? fpb : 1.0 - , "", true, tx.inputsModel.getSelection()) - } + outputAddresses.push(rec_addr_input.input_text) + } + + if (!isRBF && !isCPFP) { + tempRequest = bsApp.newTXSignRequest(from_wallet_combo.currentIndex + , outputAddresses, outputAmounts, + (fpb > 0) ? fpb : 1.0, comment_input.input_text + , checkbox_rbf.checked + , (selectedInputs.rowCount > 0) ? selectedInputs : null) + } + else { + tempRequest = bsApp.newTXSignRequest(from_wallet_combo.currentIndex + , outputAddresses, outputAmounts, (fpb > 0) ? fpb : 1.0 + , "", true, selectedInputs) } } diff --git a/common b/common index 9fdb53e4c..a57ab43ad 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 9fdb53e4c1ea4ce8b8dc15022c08a706718abc05 +Subproject commit a57ab43ad2fb321e2b97abd88253f9055f33e0ed From 636146c5f3d219d82461152f22f5ffb64fc95abb Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 15 May 2023 19:10:15 +0300 Subject: [PATCH 407/436] [QT-171] change address fix --- GUI/QtQuick/QTXSignRequest.cpp | 4 ---- GUI/QtQuick/QtQuickAdapter.cpp | 15 +++++++++------ GUI/QtQuick/QtQuickAdapter.h | 3 ++- GUI/QtQuick/qml/Send/SimpleDetails.qml | 3 ++- common | 2 +- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index c9c61d330..83533ac1c 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -90,10 +90,6 @@ QStringList QTXSignRequest::outputAddresses() const QString QTXSignRequest::outputAmount() const { - if (!txReq_.isValid()) { - logger_->debug("[{}] TX request is not valid", __func__); - return {}; - } logger_->debug("[{}] {} outputs", __func__, txReq_.armorySigner_.getTxOutCount()); return QString::number(txReq_.amountReceived([changeAddr = txReq_.change.address] (const bs::Address& addr) { return (addr != changeAddr); }) / BTCNumericTypes::BalanceDivider diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 6d391cf63..1cf93d501 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -53,9 +53,10 @@ #include "AddressFilterModel.h" #include "viewmodels/plugins/PluginsListModel.h" #include "LeverexPlugin.h" +#include "PaperBackupWriter.h" #include "SideshiftPlugin.h" #include "SideswapPlugin.h" -#include "PaperBackupWriter.h" +#include "StringUtils.h" #include "hardware_wallet.pb.h" #include "terminal.pb.h" @@ -685,7 +686,6 @@ ProcessingResult QtQuickAdapter::processSigner(const Envelope &env) return ProcessingResult::Success; } -#include "StringUtils.h" ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) { WalletsMessage msg; @@ -1486,8 +1486,9 @@ bool QtQuickAdapter::validateAddress(const QString& addr) const auto& addrStr = addr.toStdString(); try { const auto& addr = bs::Address::fromAddressString(addrStr); - logger_->debug("[{}] type={}", __func__, (int)addr.getType()); - return (addr.isValid()); + logger_->debug("[{}] type={}, format={}", __func__, (int)addr.getType(), (int)addr.format()); + return (addr.isValid() && (addr.format() != bs::Address::Format::Binary) + && (addr.format() != bs::Address::Format::String)); } catch (const std::exception& e) { logger_->warn("[{}] invalid address {}: {}", __func__, addrStr, e.what()); @@ -1566,13 +1567,15 @@ void QtQuickAdapter::requestFeeSuggestions() } QTXSignRequest* QtQuickAdapter::newTXSignRequest(int walletIndex, const QStringList& recvAddrs - , const QList& recvAmounts, double fee, const QString& comment, bool isRbf, QUTXOList* utxos) + , const QList& recvAmounts, double fee, const QString& comment, bool isRbf + , QUTXOList* utxos, bool newChangeAddr) { WalletsMessage msg; auto msgReq = msg.mutable_tx_request(); if (walletIndex >= 0) { msgReq->set_hd_wallet_id(hdWalletIdByIndex(walletIndex)); } + msgReq->set_new_change(newChangeAddr); bool isMaxAmount = false; if (recvAddrs.isEmpty()) { return nullptr; @@ -1649,7 +1652,7 @@ QTXSignRequest* QtQuickAdapter::createTXSignRequest(int walletIndex, QTxDetails* } } return newTXSignRequest(walletIndex, txDet->outputsModel()->getOutputAddresses() - , txDet->outputsModel()->getOutputAmounts(), fee, comment, isRbf, utxos); + , txDet->outputsModel()->getOutputAmounts(), fee, comment, isRbf, utxos, true); } void QtQuickAdapter::getUTXOsForWallet(int walletIndex, QTxDetails* txDet) diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 7aa5c73dc..fbf156068 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -172,7 +172,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void requestFeeSuggestions(); Q_INVOKABLE QTXSignRequest* newTXSignRequest(int walletIndex, const QStringList& recvAddrs - , const QList& recvAmounts, double fee, const QString& comment = {}, bool isRbf = true, QUTXOList* utxos = nullptr); + , const QList& recvAmounts, double fee, const QString& comment = {} + , bool isRbf = true, QUTXOList* utxos = nullptr, bool newChangeAddr = false); Q_INVOKABLE QTXSignRequest* createTXSignRequest(int walletIndex, QTxDetails* , double fee, const QString& comment = {}, bool isRbf = true, QUTXOList* utxos = nullptr); Q_INVOKABLE void getUTXOsForWallet(int walletIndex, QTxDetails*); diff --git a/GUI/QtQuick/qml/Send/SimpleDetails.qml b/GUI/QtQuick/qml/Send/SimpleDetails.qml index 0c974e6ad..0e3590f81 100644 --- a/GUI/QtQuick/qml/Send/SimpleDetails.qml +++ b/GUI/QtQuick/qml/Send/SimpleDetails.qml @@ -280,7 +280,8 @@ ColumnLayout { function prepare_transaction() { return bsApp.newTXSignRequest(from_wallet_combo.currentIndex , [rec_addr_input.input_text], [parseFloat(amount_input.input_text)] - , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text) + , parseFloat(fee_suggest_combo.edit_value()), comment_input.input_text + , true, null, true) } function click_enter() { diff --git a/common b/common index a57ab43ad..e6b7dc1fe 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit a57ab43ad2fb321e2b97abd88253f9055f33e0ed +Subproject commit e6b7dc1fe331a3d7853ade4f1078cc0924fbc4c1 From 5d6d5abb5e017e21eb0e797ebd93b9004ab7edb9 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 15 May 2023 20:30:29 +0300 Subject: [PATCH 408/436] address validation fixes --- GUI/QtQuick/QtQuickAdapter.cpp | 3 ++- common | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 1cf93d501..d27bc764c 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1486,7 +1486,8 @@ bool QtQuickAdapter::validateAddress(const QString& addr) const auto& addrStr = addr.toStdString(); try { const auto& addr = bs::Address::fromAddressString(addrStr); - logger_->debug("[{}] type={}, format={}", __func__, (int)addr.getType(), (int)addr.format()); + logger_->debug("[{}] type={}, format={} ({})", __func__, (int)addr.getType() + , (int)addr.format(), addrStr); return (addr.isValid() && (addr.format() != bs::Address::Format::Binary) && (addr.format() != bs::Address::Format::String)); } diff --git a/common b/common index e6b7dc1fe..3235a0921 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit e6b7dc1fe331a3d7853ade4f1078cc0924fbc4c1 +Subproject commit 3235a09211ed14f8a491156f585eff2b6b97e9e8 From c83fdd1e2a2e9d09072d255f3f3834e76cdf8f5b Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 16 May 2023 20:28:20 +0300 Subject: [PATCH 409/436] [QT-169] fix input selection when last output is removed" --- GUI/QtQuick/TxInputsModel.cpp | 26 ++++++++++-------------- GUI/QtQuick/TxInputsModel.h | 1 + GUI/QtQuick/qml/Send/AdvancedDetails.qml | 10 ++++----- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 11ce8638a..32f7cc897 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -104,18 +104,16 @@ QHash TxInputsModel::roleNames() const void TxInputsModel::clear() { + decltype(fixedEntries_) fixedEntries; + fixedEntries.swap(fixedEntries_); beginResetModel(); utxos_.clear(); data_.clear(); - selectionUtxos_.clear(); - selectionAddresses_.clear(); selectionRoot_ = false; preSelected_.clear(); - selectedBalance_ = 0; - nbTx_ = 0; - fixedEntries_.clear(); endResetModel(); - emit selectionChanged(); + setFixedInputs(fixedEntries); + clearSelection(); emit rowCountChanged(); } @@ -166,6 +164,7 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) int TxInputsModel::setFixedUTXOs(const std::vector& utxos) { + fixedUTXOs_ = utxos; int nbTX = 0; for (const auto& utxo : utxos) { for (const auto& entry : fixedEntries_) { @@ -286,7 +285,6 @@ void TxInputsModel::toggleSelection(int row) const auto& itAddr = utxos_.find(entry.address); if (itAddr != utxos_.end()) { for (const auto& u : itAddr->second) { - logger_->debug("[{}:1] UTXO selection: {}@{}", __func__, u.getTxHash().toHexStr(true), u.getTxOutIndex()); selectionUtxos_.insert({u.getTxHash(), u.getTxOutIndex()}); selectedBalance_ += u.getValue(); nbTx_++; @@ -331,7 +329,6 @@ void TxInputsModel::toggleSelection(int row) nbTx_++; selectedBalance_ += utxo.getValue(); selectionUtxos_.insert({utxo.getTxHash(), utxo.getTxOutIndex()}); - logger_->debug("[{}:2] UTXO selection: {}@{}", __func__, utxo.getTxHash().toHexStr(true), utxo.getTxOutIndex()); } else { selectionAddresses_.insert(entry.address); @@ -341,7 +338,6 @@ void TxInputsModel::toggleSelection(int row) == selectionUtxos_.end()) { selectedBalance_ += utxo_addr.getValue(); selectionUtxos_.insert({utxo_addr.getTxHash(), utxo_addr.getTxOutIndex()}); - logger_->debug("[{}:3] UTXO selection: {}@{}", __func__, utxo_addr.getTxHash().toHexStr(true), utxo_addr.getTxOutIndex()); nbTx_++; } } @@ -378,7 +374,6 @@ void TxInputsModel::toggleSelection(int row) selEnd = row + 1 + itAddr->second.size(); } } - emit selectionChanged(); emit dataChanged(createIndex(selStart, 0), createIndex(selEnd, 0), {SelectedRole}); } @@ -578,11 +573,12 @@ QVariant TxInputsModel::getData(int row, int col) const void TxInputsModel::clearSelection() { - selectionUtxos_.clear(); - selectionAddresses_.clear(); - selectedBalance_ = 0.0f; - emit selectionChanged(); - emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); + selectionUtxos_.clear(); + selectionAddresses_.clear(); + selectedBalance_ = 0.0f; + nbTx_ = 0; + setFixedUTXOs(fixedUTXOs_); + emit dataChanged(createIndex(0, 0), createIndex(rowCount() - 1, 0), { SelectedRole }); } bool TxInputsModel::isInputSelectable(int row) const diff --git a/GUI/QtQuick/TxInputsModel.h b/GUI/QtQuick/TxInputsModel.h index f024aca3a..f1cd555ed 100644 --- a/GUI/QtQuick/TxInputsModel.h +++ b/GUI/QtQuick/TxInputsModel.h @@ -138,6 +138,7 @@ class TxInputsModel : public QAbstractTableModel std::vector data_; std::vector fixedEntries_; + std::vector fixedUTXOs_; std::set> selectionUtxos_; std::set selectionAddresses_; bool selectionRoot_ {false}; diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 72491f4c2..d5ac9060c 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -503,8 +503,9 @@ ColumnLayout { wallets_current_index: from_wallet_combo.currentIndex onTextChanged: { - console.log("recv address changed") - create_temp_request() + if (rec_addr_input.input_text.length && bsApp.validateAddress(rec_addr_input.input_text)) { + create_temp_request() + } } onEnterPressed: { @@ -645,12 +646,9 @@ ColumnLayout { { //txOutputsModel.delOutput(row) model.delOutput(row) - /*if (model.rowCount <= 1 && !isRBF && !isCPFP) { + if (model.rowCount <= 1) { tx.inputsModel.clearSelection() } - else if (model.rowCount > 1 && !isRBF && !isCPFP) { - tx.inputsModel.updateAutoselection() - }*/ create_temp_request() } From bcf8cabea6c9b6089efb6d68121a0fba956b374d Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 17 May 2023 10:00:10 +0300 Subject: [PATCH 410/436] [QT-141] export WO wallet from WO as a file copy --- Core/SignerAdapter.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 6b8f01f51..50235e3f1 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -723,9 +723,21 @@ ProcessingResult SignerAdapter::processExportWoWallet(const bs::message::Envelop return ProcessingResult::Error; } if (hdWallet->isWatchingOnly()) { - logger_->error("[{}] can't export {} (already watching only)", __func__, request.wallet().wallet_id()); + const auto& srcPathName = hdWallet->getFileName(); + const auto& fileName = SystemFileUtils::getFileName(srcPathName); + const auto& dstPathName = request.output_dir() + "/" + fileName; + try { + std::filesystem::copy(srcPathName, dstPathName); + } + catch (const std::exception& e) { + logger_->error("[{}] failed to copy {} -> {}: {}", __func__, srcPathName, dstPathName, e.what()); + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Error; + } + logger_->debug("[{}] copied {} to {}", __func__, request.wallet().wallet_id(), dstPathName); + msg.set_export_wo_wallet_response(fileName); pushResponse(user_, env, msg.SerializeAsString()); - return ProcessingResult::Error; + return ProcessingResult::Success; } auto woWallet = hdWallet->createWatchingOnly(); if (!woWallet) { From 7dbe99a198bfe58dcf5598a0873da7a7769e8b89 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 17 May 2023 13:11:37 +0300 Subject: [PATCH 411/436] [QT-165,170] offline signing fixes --- GUI/QtQuick/QTXSignRequest.cpp | 20 ++++-- GUI/QtQuick/QTXSignRequest.h | 2 +- GUI/QtQuick/QtQuickAdapter.cpp | 121 +++++++++++++++++++++++++++++++-- GUI/QtQuick/QtQuickAdapter.h | 5 +- common | 2 +- 5 files changed, 133 insertions(+), 17 deletions(-) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index 83533ac1c..e718cfa0f 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -18,7 +18,8 @@ QTXSignRequest::QTXSignRequest(const std::shared_ptr& logger, QO : QObject(parent), logger_(logger) {} -void QTXSignRequest::setTxSignReq(const bs::core::wallet::TXSignRequest& txReq) +void QTXSignRequest::setTxSignReq(const bs::core::wallet::TXSignRequest& txReq + , const std::vector& utxos) { txReq_ = txReq; logger_->debug("[{}] {} outputs", __func__, txReq_.armorySigner_.getTxOutCount()); @@ -39,13 +40,18 @@ void QTXSignRequest::setTxSignReq(const bs::core::wallet::TXSignRequest& txReq) } emit txSignReqChanged(); - std::vector inputs; - inputs.reserve(txReq.armorySigner_.getTxInCount()); - for (unsigned int i = 0; i < txReq.armorySigner_.getTxInCount(); ++i) { - const auto& spender = txReq.armorySigner_.getSpender(i); - inputs.push_back(spender->getUtxo()); + if (utxos.empty()) { + std::vector inputs; + inputs.reserve(txReq.armorySigner_.getTxInCount()); + for (unsigned int i = 0; i < txReq.armorySigner_.getTxInCount(); ++i) { + const auto& spender = txReq.armorySigner_.getSpender(i); + inputs.push_back(spender->getUtxo()); + } + setInputs(inputs); + } + else { + setInputs(utxos); } - setInputs(inputs); } void QTXSignRequest::setError(const QString& err) diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h index 69af33042..9c4745ee8 100644 --- a/GUI/QtQuick/QTXSignRequest.h +++ b/GUI/QtQuick/QTXSignRequest.h @@ -34,7 +34,7 @@ class QTXSignRequest : public QObject QTXSignRequest(const std::shared_ptr&, QObject* parent = nullptr); bs::core::wallet::TXSignRequest txReq() const { return txReq_; } - void setTxSignReq(const bs::core::wallet::TXSignRequest&); + void setTxSignReq(const bs::core::wallet::TXSignRequest&, const std::vector & = {}); void setError(const QString&); void addInput(const QUTXO::Input& input) { inputs_.push_back(input); } std::vector inputs() const { return inputs_; } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index d27bc764c..88266d7cd 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -406,6 +406,19 @@ bool QtQuickAdapter::processBroadcast(const bs::message::Envelope& env) return false; } +bool QtQuickAdapter::processTimeout(const bs::message::Envelope& env) +{ + if (env.receiver && (env.receiver->value() == userBlockchain_->value())) { + const auto& itTxSave = txSaveReq_.find(env.foreignId()); + if (itTxSave != txSaveReq_.end()) { + emit transactionExportFailed(tr("Failed to get supporting TXs for exporting %1") + .arg(QString::fromStdString(std::get<0>(itTxSave->second)))); + txSaveReq_.erase(itTxSave); + } + } + return false; +} + void QtQuickAdapter::onArmoryServerSelected(int index) { if (armoryServerIndex_ == index) { @@ -2054,6 +2067,15 @@ bs::message::ProcessingResult QtQuickAdapter::processTransactions(bs::message::S expTxAddrInReqs_.erase(itExpTxAddrIn); expTxByAddrModel_->setInputs(result); } + const auto& itTxSave = txSaveReq_.find(msgId); + if (itTxSave != txSaveReq_.end()) { + auto txReq = std::get<1>(itTxSave->second); + for (const auto& tx : result) { + txReq.armorySigner_.addSupportingTx(tx); + } + saveTransaction(std::get<0>(itTxSave->second), txReq, std::get<2>(itTxSave->second)); + txSaveReq_.erase(itTxSave); + } return bs::message::ProcessingResult::Success; } @@ -2096,8 +2118,8 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq , const WalletsMessage_TxResponse& response) { //logger_->debug("[{}] {}", __func__, response.DebugString()); - const auto& itReq = txReqs_.find(msgId); auto txReq = bs::signer::pbTxRequestToCore(response.tx_sign_request(), logger_); + const auto& itReq = txReqs_.find(msgId); if (itReq == txReqs_.end()) { if (txSaveReqs_.empty()) { //logger_->error("[{}] unknown request #{}", __func__, msgId); @@ -2105,7 +2127,31 @@ bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::Seq } const auto exportPath = *txSaveReqs_.rbegin(); txSaveReqs_.pop_back(); - saveTransaction(txReq, exportPath); + std::vector utxos; + std::set txHashes; + utxos.reserve(response.utxos_size()); + for (const auto& u : response.utxos()) { + try { + UTXO utxo; + const auto utxoSer = BinaryData::fromString(u); + utxo.unserialize(utxoSer); + if (!utxo.isInitialized()) { + throw std::runtime_error("invalid UTXO in wallets response"); + } + utxos.emplace_back(std::move(utxo)); + txHashes.insert(utxo.getTxHash()); + } + catch (const std::exception&) {} + } + + ArmoryMessage msg; + auto msgReq = msg.mutable_get_txs_by_hash(); + for (const auto& txHash : txHashes) { + msgReq->add_tx_hashes(txHash.toBinStr()); + } + const auto msgReqId = pushRequest(user_, userBlockchain_, msg.SerializeAsString() + , {}, 3, std::chrono::milliseconds{ 1000 }); + txSaveReq_[msgReqId] = {exportPath, txReq, utxos}; return bs::message::ProcessingResult::Success; } auto qReq = itReq->second.txReq; @@ -2487,9 +2533,20 @@ void QtQuickAdapter::exportTransaction(const QUrl& path, QTXSignRequest* request txSaveReqs_.push_back(path.toLocalFile().toStdString()); } -void QtQuickAdapter::saveTransaction(const bs::core::wallet::TXSignRequest& txReq, const std::string& exportPath) +void QtQuickAdapter::saveTransaction(const std::string& exportPath, const bs::core::wallet::TXSignRequest& txReq + , const std::vector& utxos) { - const auto& txSer = bs::signer::coreTxRequestToPb(txReq, false).SerializeAsString(); + //const auto& txSer = bs::signer::coreTxRequestToPb(txReq, false).SerializeAsString(); + WalletsMessage_TxOfflineExport msg; + for (const auto& walletId : txReq.walletIds) { + msg.add_wallet_id(walletId); + } + msg.set_tx(txReq.armorySigner_.serializeState().SerializeAsString()); + msg.set_psbt(txReq.armorySigner_.toPSBT().toBinStr()); + for (const auto& utxo : utxos) { + msg.add_utxos(utxo.serialize().toBinStr()); + } + const auto& txSer = msg.SerializeAsString(); auto f = fopen(exportPath.c_str(), "wb"); if (!f) { emit transactionExportFailed(tr("Failed to open %1 for writing").arg(QString::fromStdString(exportPath))); @@ -2526,20 +2583,70 @@ QTXSignRequest* QtQuickAdapter::importTransaction(const QUrl& path) .arg(QString::fromStdString(pathName))); return nullptr; } - Blocksettle::Communication::headless::SignTxRequest msg; + //Blocksettle::Communication::headless::SignTxRequest msg; + WalletsMessage_TxOfflineExport msg; if (!msg.ParseFromString(txSer)) { emit transactionImportFailed(tr("Failed to parse %1 bytes from %2") .arg(txSer.size()).arg(QString::fromStdString(pathName))); return nullptr; } - const auto& txReq = bs::signer::pbTxRequestToCore(msg); + //const auto& txReq = bs::signer::pbTxRequestToCore(msg); + bs::core::wallet::TXSignRequest txReq; + for (const auto& walletId : msg.wallet_id()) { + bool walletLoaded = false; + for (const auto& hdWallet : hdWallets_) { + if (hdWallet.first == walletId) { + walletLoaded = true; + break; + } + else { + for (const auto& leaf : hdWallet.second.leaves) { + if (leaf.first == walletId) { + walletLoaded = true; + break; + } + } + } + } + if (!walletLoaded) { + emit transactionImportFailed(tr("Wallet %1 is not loaded - signing is not possible") + .arg(QString::fromStdString(walletId))); + return nullptr; + } + txReq.walletIds.push_back(walletId); + } +/* try { // PSBT doesn't seem to be properly implemented in Armory atm + txReq.armorySigner_ = Armory::Signer::Signer::fromPSBT(BinaryData::fromString(msg.psbt())); + } + catch (const std::exception& e) { + logger_->error("[{}] invalid PSBT: {}", __func__, e.what());*/ + { + Codec_SignerState::SignerState state; + if (state.ParseFromString(msg.tx())) { + txReq.armorySigner_.deserializeState(state); + } + } if (!txReq.isValid()) { emit transactionImportFailed(tr("Failed to obtain valid data from %1") .arg(QString::fromStdString(pathName))); return nullptr; } + std::vector utxos; + for (const auto& u : msg.utxos()) { + try { + UTXO utxo; + utxo.unserialize(BinaryData::fromString(u)); + if (!utxo.isInitialized()) { + throw std::runtime_error("not inited"); + } + utxos.emplace_back(std::move(utxo)); + } + catch (const std::exception& e) { + logger_->error("[{}] failed to deser UTXO: {}", __func__, e.what()); + } + } auto txSignRequest = new QTXSignRequest(logger_, this); - txSignRequest->setTxSignReq(txReq); + txSignRequest->setTxSignReq(txReq, utxos); return txSignRequest; } diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index fbf156068..f920e90a2 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -88,6 +88,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop bs::message::ProcessingResult process(const bs::message::Envelope &) override; bool processBroadcast(const bs::message::Envelope&) override; + bool processTimeout(const bs::message::Envelope&) override; Users supportedReceivers() const override { return { user_ }; } std::string name() const override { return "QtQuick"; } @@ -256,7 +257,8 @@ private slots: void updateStates(); void setTopBlock(uint32_t); void loadPlugins(QQmlApplicationEngine&); - void saveTransaction(const bs::core::wallet::TXSignRequest&, const std::string& pathName); + void saveTransaction(const std::string& pathName, const bs::core::wallet::TXSignRequest& + , const std::vector&); void notifyNewTransaction(const bs::TXEntry& tx); void createWallet(bool primary); @@ -344,6 +346,7 @@ private slots: }; std::map txReqs_; std::vector txSaveReqs_; + std::map>> txSaveReq_; std::map exportTxReqs_; std::unordered_map hwwReady_; std::map txDetailReqs_; diff --git a/common b/common index 3235a0921..dbde995f9 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 3235a09211ed14f8a491156f585eff2b6b97e9e8 +Subproject commit dbde995f9b40c2cd34cf545e36529951f55fba76 From 71e0e2aff4970417de860995e3710eef67f3ca7e Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 18 May 2023 23:10:42 +0300 Subject: [PATCH 412/436] [QT-155] CPFP mostly working as expected --- GUI/QtQuick/QTXSignRequest.cpp | 12 ++++++++---- GUI/QtQuick/QTXSignRequest.h | 3 ++- GUI/QtQuick/TxInputsModel.cpp | 3 ++- GUI/QtQuick/TxListModel.cpp | 20 ++++++++++---------- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 +- common | 2 +- 6 files changed, 24 insertions(+), 18 deletions(-) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index e718cfa0f..efcb51ca5 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -94,12 +94,16 @@ QStringList QTXSignRequest::outputAddresses() const return result; } -QString QTXSignRequest::outputAmount() const +double QTXSignRequest::outputAmountValue() const { logger_->debug("[{}] {} outputs", __func__, txReq_.armorySigner_.getTxOutCount()); - return QString::number(txReq_.amountReceived([changeAddr = txReq_.change.address] - (const bs::Address& addr) { return (addr != changeAddr); }) / BTCNumericTypes::BalanceDivider - , 'f', 8); + return txReq_.amountReceived([changeAddr = txReq_.change.address] + (const bs::Address& addr) { return (addr != changeAddr); }) / BTCNumericTypes::BalanceDivider; +} + +QString QTXSignRequest::outputAmount() const +{ + return QString::number(outputAmountValue(), 'f', 8); } QStringList QTXSignRequest::outputAmounts() const diff --git a/GUI/QtQuick/QTXSignRequest.h b/GUI/QtQuick/QTXSignRequest.h index 9c4745ee8..d44e73eb7 100644 --- a/GUI/QtQuick/QTXSignRequest.h +++ b/GUI/QtQuick/QTXSignRequest.h @@ -55,6 +55,7 @@ class QTXSignRequest : public QObject Q_PROPERTY(QStringList outputAddresses READ outputAddresses NOTIFY txSignReqChanged) QStringList outputAddresses() const; Q_PROPERTY(QString outputAmount READ outputAmount NOTIFY txSignReqChanged) + double outputAmountValue() const; QString outputAmount() const; Q_PROPERTY(QStringList outputAmounts READ outputAmounts NOTIFY txSignReqChanged) QStringList outputAmounts() const; @@ -72,7 +73,7 @@ class QTXSignRequest : public QObject QString errorText() const { return error_; } Q_PROPERTY(bool isValid READ isValid NOTIFY txSignReqChanged) bool isValid() const; - Q_PROPERTY(QString maxAmount READ outputAmount NOTIFY txSignReqChanged) + Q_PROPERTY(double maxAmount READ outputAmountValue NOTIFY txSignReqChanged) Q_PROPERTY(bool isHWW READ isHWW NOTIFY hwwChanged) bool isHWW() const { return isHWW_; } Q_PROPERTY(bool isHWWready READ isHWWready NOTIFY hwwReady) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 32f7cc897..0911fd8c1 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -203,7 +203,8 @@ void TxInputsModel::setFixedInputs(const std::vector& entries) return; } logger_->debug("[{}] {} entries", __func__, entries.size()); - if (!fixedEntries_.empty()) { + if (!fixedEntries_.empty() && (data_.size() >= fixedEntries_.size())) { + logger_->debug("[{}] removing {} fixed entries", __func__, fixedEntries_.size()); beginRemoveRows(QModelIndex(), 0, fixedEntries_.size() - 1); data_.erase(data_.cbegin(), data_.cbegin() + fixedEntries_.size()); endRemoveRows(); diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 904eca608..3068ade87 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -686,10 +686,11 @@ void QTxDetails::setDetails(const bs::sync::TXWalletDetails& details) , in.outHash.toHexStr(true), in.outIndex, in.value); ins_.push_back({ in.address, in.outHash, in.outIndex, in.value }); } - if (!fixedInputs_.empty()) { + if (!needInputsFromOutputs_ && !fixedInputs_.empty()) { setImmutableUTXOs(fixedInputs_); fixedInputs_.clear(); } + inputsModel_->addEntries(ins_); outs_.clear(); outs_.reserve(details.outputAddresses.size()); @@ -700,9 +701,6 @@ void QTxDetails::setDetails(const bs::sync::TXWalletDetails& details) if (needInputsFromOutputs_) { setInputsFromOutputs(); } - else { - inputsModel_->addEntries(ins_); - } emit updated(); } @@ -714,7 +712,11 @@ void QTxDetails::setImmutableUTXOs(const std::vector& utxos) } logger_->debug("[{}] {}", __func__, utxos.size()); inputsModel_->setFixedInputs(ins_); - if (!inputsModel_->setFixedUTXOs(utxos)) { + if (inputsModel_->setFixedUTXOs(utxos) > 0) { + needInputsFromOutputs_ = false; + } + else { + logger_->debug("[{}] {} UTXOs discarded, saving for later user", __func__, utxos.size()); fixedInputs_ = utxos; } } @@ -733,17 +735,15 @@ void QTxDetails::setInputsFromOutputs() outs.push_back({ out.address, txId, out.outIndex, out.value }); } - logger_->debug("[{}] {} outs", __func__, outs.size()); + logger_->debug("[{}] {} outs, {} fixed UTXOs saved", __func__, outs.size(), fixedInputs_.size()); for (const auto& out : outs) { logger_->debug("[{}] {} {}@{} = {}", __func__, out.address.display() , out.txId.toHexStr(true), out.txOutIndex, out.amount); } inputsModel_->setFixedInputs(outs); - ins_ = std::move(outs); - needInputsFromOutputs_ = false; - if (!fixedInputs_.empty()) { - setImmutableUTXOs(fixedInputs_); + inputsModel_->setFixedUTXOs(fixedInputs_); + needInputsFromOutputs_ = false; fixedInputs_.clear(); } } diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index d5ac9060c..551c15c7a 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -250,7 +250,7 @@ ColumnLayout { Layout.leftMargin: BSSizes.applyScale(16) Layout.topMargin: BSSizes.applyScale(16) Layout.alignment: Qt.AlignLeft | Qt.AlingTop - visible: !isRBF && !isCPFP + visible: true //!isRBF && !isCPFP width: BSSizes.applyScale(504) height: BSSizes.applyScale(70) diff --git a/common b/common index dbde995f9..7f3431efc 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit dbde995f9b40c2cd34cf545e36529951f55fba76 +Subproject commit 7f3431efcb5f2e053de40286b1fbd88fc6e96bde From 31651cec416ec46e05f6f9d5cc3c8b7446374df3 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 19 May 2023 18:53:27 +0300 Subject: [PATCH 413/436] fix wallet reloading after offline state --- BlockSettleHW/hwdevicemanager.cpp | 35 ++++++++++++----- BlockSettleHW/jade/jadeDevice.cpp | 64 +++++++++++++++++++++++++------ Core/SettingsAdapter.cpp | 2 +- GUI/QtQuick/QtQuickAdapter.cpp | 10 +++-- 4 files changed, 85 insertions(+), 26 deletions(-) diff --git a/BlockSettleHW/hwdevicemanager.cpp b/BlockSettleHW/hwdevicemanager.cpp index a4312e121..3dbb20dd9 100644 --- a/BlockSettleHW/hwdevicemanager.cpp +++ b/BlockSettleHW/hwdevicemanager.cpp @@ -307,28 +307,43 @@ bs::message::ProcessingResult DeviceManager::processImport(const bs::message::En bs::message::ProcessingResult bs::hww::DeviceManager::processSignTX(const bs::message::Envelope& env , const Blocksettle::Communication::headless::SignTxRequest& request) { - logger_->debug("[{}] {}", __func__, request.DebugString()); + logger_->debug("[{}] [{}] {}", __func__, request.unsigned_state().size(), request.DebugString()); HW::DeviceMgrMessage msg; auto msgResp = msg.mutable_signed_tx(); - if (envReqSign_.sender || txSignReq_.isValid()) { - logger_->error("[{}] another sign request is already in progress", __func__); - msgResp->set_error_msg("another sign request is already in progress"); - pushResponse(user_, env, msg.SerializeAsString()); - return bs::message::ProcessingResult::Error; - } const auto& txSignReq = bs::signer::pbTxRequestToCore(request); - if (!txSignReq.isValid() || (txSignReq.walletIds.size() != 1)) { +#if 0 + if (/*!txSignReq.isValid() ||*/ (txSignReq.walletIds.size() != 1)) { logger_->error("[{}] invalid TX sign request (nb wallets: {})", __func__ , txSignReq.walletIds.size()); msgResp->set_error_msg("invalid TX sign request"); pushResponse(user_, env, msg.SerializeAsString()); return bs::message::ProcessingResult::Error; } +#endif + if (!txSignReq.isValid()) { + logger_->error("[{}] invalid TX sign request: {} inputs, {} outputs" + , __func__, txSignReq.armorySigner_.getTxInCount(), txSignReq.armorySigner_.getTxOutCount()); + } envReqSign_ = env; - txSignReq_ = txSignReq; + bool newSign = false; + if (!txSignReq_.isValid() && txSignReq.isValid()) { + txSignReq_ = txSignReq; + newSign = true; + } + if (txSignReq_.walletIds.empty() && !txSignReq.walletIds.empty()) { + newSign = true; + txSignReq_.walletIds = txSignReq.walletIds; + } + if (txSignReq_.walletIds.empty()) { + logger_->debug("[{}] skipping - waiting for wallet[s] ready", __func__); + return bs::message::ProcessingResult::Ignored; + } + if (!newSign) { + return bs::message::ProcessingResult::Success; + } DeviceKey foundDevice; for (const auto& device : devices_) { - if (device.walletId == txSignReq.walletIds.at(0)) { + if (device.walletId == txSignReq_.walletIds.at(0)) { foundDevice = device; break; } diff --git a/BlockSettleHW/jade/jadeDevice.cpp b/BlockSettleHW/jade/jadeDevice.cpp index fe1fafca3..4e0f09498 100644 --- a/BlockSettleHW/jade/jadeDevice.cpp +++ b/BlockSettleHW/jade/jadeDevice.cpp @@ -128,9 +128,36 @@ static std::string dump(const QCborValueRef& val) if (val.isRegularExpression()) { return val.toRegularExpression().pattern().toStdString(); } + if (val.isNull()) { + return ""; + } + if (val.isUndefined()) { + return ""; + } return ""; } +static std::string addrType(AddressEntryType aet) +{ + switch (aet) { + case AddressEntryType_P2PKH: return "pkh(k)"; + case AddressEntryType_P2WPKH: return "wpkh(k)"; + case AddressEntryType_P2SH: return "sh(k)"; + case AddressEntryType_P2WSH: return "sh(wpkh(k))"; + default: break; + } + return "unknown"; +} + +static QCborArray convertPath(const bs::hd::Path& path) +{ + QCborArray pathArray; + for (const auto val : path) { + pathArray.append((quint32)val); + } + return pathArray; +} + void JadeDevice::setSupportingTXs(const std::vector& txs) { if (!awaitingTXreq_.isValid()) { @@ -147,9 +174,31 @@ void JadeDevice::setSupportingTXs(const std::vector& txs) awaitingTXreq_.armorySigner_.addSupportingTx(tx); } const auto& tx = awaitingTXreq_.armorySigner_.serializeUnsignedTx(); + QCborArray change; + for (int i = 0; i < awaitingTXreq_.armorySigner_.getTxOutCount() - 1; ++i) { + change.push_back(nullptr); + } + if (awaitingTXreq_.change.address.empty()) { + change.push_back(nullptr); + } + else { + const auto changePath = bs::hd::Path::fromString(awaitingTXreq_.change.index); + bs::hd::Path path; + path.append(bs::hd::Purpose::Native + bs::hd::hardFlag); + path.append(testNet_ ? bs::hd::CoinType::Bitcoin_test : bs::hd::CoinType::Bitcoin_main); + path.append(bs::hd::hardFlag); + path.append(changePath.get(-2)); + path.append(changePath.get(-1)); + + change.push_back(QCborMap{ {QLatin1Literal("variant"), QString::fromStdString(addrType(awaitingTXreq_.change.address.getType()))} + , {QLatin1Literal("path"), convertPath(path)} }); + } const QCborMap params = { {QLatin1Literal("network"), network()}, {QLatin1Literal("txn") , QByteArray::fromStdString(tx.toBinStr())}, {QLatin1Literal("use_ae_signatures"), false} - , {QLatin1Literal("num_inputs"), awaitingTXreq_.armorySigner_.getTxInCount()} }; + , {QLatin1Literal("num_inputs"), awaitingTXreq_.armorySigner_.getTxInCount()} + , {QLatin1Literal("change"), change} }; + if (!awaitingTXreq_.change.address.empty()) { + } auto inReq = std::make_shared(); inReq->request = getRequest(++seqId_, QLatin1Literal("sign_tx"), params); @@ -210,8 +259,8 @@ void JadeDevice::setSupportingTXs(const std::vector& txs) paramPath.append(path.at(i)); } QCborMap params = { {QLatin1Literal("script"), QByteArray::fromStdString(spender->getOutputScript().toBinStr())} - //, {QLatin1Literal("input_tx"), QByteArray::fromStdString(txs.at(i).serialize().toBinStr())} - , {QLatin1Literal("input_tx"), {} } + , {QLatin1Literal("input_tx"), QByteArray::fromStdString(txs.at(i).serialize().toBinStr())} + //, {QLatin1Literal("input_tx"), nullptr } , {QLatin1Literal("satoshi"), (qint64)spender->getValue()} , {QLatin1Literal("is_witness"), true}, {QLatin1Literal("path"), paramPath} }; auto inInput = std::make_shared(); @@ -310,15 +359,6 @@ DeviceType JadeDevice::type() const return DeviceType::HWJade; } -static QCborArray convertPath(const bs::hd::Path& path) -{ - QCborArray pathArray; - for (const auto val : path) { - pathArray.append((quint32)val); - } - return pathArray; -} - static uint32_t epoch() { return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); diff --git a/Core/SettingsAdapter.cpp b/Core/SettingsAdapter.cpp index 379afeef9..dde27c271 100644 --- a/Core/SettingsAdapter.cpp +++ b/Core/SettingsAdapter.cpp @@ -160,8 +160,8 @@ void SettingsAdapter::sendSettings(const ArmorySettings& armorySettings, bool ne } if (netTypeChanged) { logger_->debug("[{}] network type changed - reloading wallets", __func__); - processSignerSettings({}); } + processSignerSettings({}); } ProcessingResult SettingsAdapter::processRemoteSettings(uint64_t msgId) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 88266d7cd..2a31f8dff 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2276,17 +2276,21 @@ bs::message::ProcessingResult QtQuickAdapter::processHWWready(const std::string& logger_->debug("[{}] wallet {} - ignored", __func__, walletId); return bs::message::ProcessingResult::Ignored; } - logger_->debug("[{}] wallet {}", __func__, walletId); readyWallets_.insert(walletId); it->second->setHWWready(); auto txReq = it->second->txReq(); txReq.armorySigner_.setLockTime(blockNum_); { HW::DeviceMgrMessage msg; - *msg.mutable_sign_tx() = bs::signer::coreTxRequestToPb(txReq); + auto msgReq = msg.mutable_sign_tx(); + *msgReq = bs::signer::coreTxRequestToPb(txReq); + logger_->debug("[{}] {} TX request valid: {}, unsigned state: {}", __func__ + , walletId, txReq.isValid(), msgReq->unsigned_state().size()); + if (!msgReq->walletid_size()) { + msgReq->add_walletid(walletId); + } pushRequest(user_, userHWW_, msg.SerializeAsString()); } - logger_->debug("[{}] lock time: {} ({})", __func__, txReq.armorySigner_.getLockTime(), blockNum_); hwwReady_.erase(it); return bs::message::ProcessingResult::Success; } From 6906db3ed84d275a8f79eb8b026566c00da5ec12 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 22 May 2023 20:40:18 +0300 Subject: [PATCH 414/436] fixup --- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 551c15c7a..a70c40249 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -537,7 +537,7 @@ ColumnLayout { height: BSSizes.applyScale(70) function getMax() { - var maxValue = parseFloat(tempRequest.maxAmount) - tx.outputsModel.totalAmount + var maxValue = tempRequest.maxAmount - tx.outputsModel.totalAmount return (maxValue >= 0 ? maxValue : 0).toFixed(8) } From b1037f98785ad26f5a03dae4c971c3a8be720c1a Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 23 May 2023 15:03:32 +0300 Subject: [PATCH 415/436] [QT-143] import/rescan fixes --- GUI/QtQuick/AddressListModel.cpp | 3 +++ GUI/QtQuick/QtQuickAdapter.cpp | 2 +- common | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index e87230b9c..771bd4479 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -75,6 +75,7 @@ QHash QmlAddressListModel::roleNames() const void QmlAddressListModel::addRow(const std::string& walletId, const QVector& row) { + logger_->debug("[{}] {} {}", __func__, walletId, row.at(0).toStdString()); if (walletId != expectedWalletId_) { logger_->warn("[QmlAddressListModel::addRow] wallet {} not expected ({})", walletId, expectedWalletId_); return; @@ -93,6 +94,7 @@ void QmlAddressListModel::addRow(const std::string& walletId, const QVector>& rows) { + logger_->debug("[{}] {} {} rows", __func__, walletId, rows.size()); if (walletId != expectedWalletId_) { logger_->warn("[QmlAddressListModel::addRows] wallet {} not expected ({})", walletId, expectedWalletId_); return; @@ -163,6 +165,7 @@ void QmlAddressListModel::updateRow(const BinaryData& addrPubKey, uint64_t bal, void QmlAddressListModel::reset(const std::string& expectedWalletId) { + logger_->debug("[{}] {}", __func__, expectedWalletId); expectedWalletId_ = expectedWalletId; beginResetModel(); addresses_.clear(); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 2a31f8dff..d81aecd53 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1112,7 +1112,7 @@ std::string QtQuickAdapter::generateWalletName() const void QtQuickAdapter::walletSelected(int index) { if (index < 0 || index >= walletBalances_->wallets().size()) { - addrModel_->reset(""); + addrModel_->reset({}); txModel_->clear(); return; } diff --git a/common b/common index 7f3431efc..37beee6af 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 7f3431efcb5f2e053de40286b1fbd88fc6e96bde +Subproject commit 37beee6af1eb3fae00018114d5425b393ed64ef3 From e374c824c1172470f175bdc74d9e5aec964dc277 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 24 May 2023 22:32:09 +0300 Subject: [PATCH 416/436] [QT-178] fix CPFP/RBF inputs selection --- GUI/QtQuick/QTXSignRequest.cpp | 2 +- GUI/QtQuick/TxInputsModel.cpp | 13 +-- GUI/QtQuick/TxInputsSelectedModel.cpp | 104 ++++++++++++++++++++--- GUI/QtQuick/TxInputsSelectedModel.h | 30 +++++-- GUI/QtQuick/TxListModel.cpp | 39 ++++----- GUI/QtQuick/qml/Send/AdvancedDetails.qml | 3 +- 6 files changed, 143 insertions(+), 48 deletions(-) diff --git a/GUI/QtQuick/QTXSignRequest.cpp b/GUI/QtQuick/QTXSignRequest.cpp index efcb51ca5..82c02be0a 100644 --- a/GUI/QtQuick/QTXSignRequest.cpp +++ b/GUI/QtQuick/QTXSignRequest.cpp @@ -186,7 +186,7 @@ bool QTXSignRequest::isValid() const } const int64_t fee = txReq_.getFee(); logger_->debug("[QTXSignRequest::isValid] in={}, out={}, fee={}", inAmount, outAmount, fee); - return ((inAmount - outAmount - fee) >= 0); + return (std::abs(inAmount - outAmount - fee) < 100); } void QTXSignRequest::setWatchingOnly(bool watchingOnly) diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 0911fd8c1..3fbaa55fe 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -165,25 +165,26 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) int TxInputsModel::setFixedUTXOs(const std::vector& utxos) { fixedUTXOs_ = utxos; - int nbTX = 0; + nbTx_ = 0; + selectedBalance_ = 0; + selectionUtxos_.clear(); for (const auto& utxo : utxos) { for (const auto& entry : fixedEntries_) { if ((entry.txId == utxo.getTxHash()) && (entry.txOutIndex == utxo.getTxOutIndex())) { logger_->debug("[{}] UTXO selection: {}@{}", __func__, utxo.getTxHash().toHexStr(true), utxo.getTxOutIndex()); selectionUtxos_.insert({ utxo.getTxHash(), utxo.getTxOutIndex() }); selectedBalance_ += utxo.getValue(); - nbTX++; + nbTx_++; const auto& addr = bs::Address::fromUTXO(utxo); utxos_[addr].push_back(utxo); break; } } } - nbTx_ += nbTX; emit selectionChanged(); emit dataChanged(createIndex(0, 0), createIndex(fixedEntries_.size() - 1, 0), {SelectedRole}); logger_->debug("[{}] nbTX: {}, balance: {}", __func__, nbTx_, selectedBalance_); - return nbTX; + return nbTx_; } void TxInputsModel::addEntries(const std::vector& entries) @@ -539,8 +540,8 @@ QVariant TxInputsModel::getData(int row, int col) const return QString::fromStdString(entry.address.display()); } case ColumnTx: - if (itUTXOs == utxos_.end() || !isInputSelectable(row)) { - return QString::number(1); + if (itUTXOs == utxos_.end()) { + return QString::number(entry.txOutIndex); } else { return QString::number(itUTXOs->second.size()); diff --git a/GUI/QtQuick/TxInputsSelectedModel.cpp b/GUI/QtQuick/TxInputsSelectedModel.cpp index 3b4dc9bae..d2a976211 100644 --- a/GUI/QtQuick/TxInputsSelectedModel.cpp +++ b/GUI/QtQuick/TxInputsSelectedModel.cpp @@ -1,23 +1,103 @@ #include "TxInputsSelectedModel.h" +#include "ColorScheme.h" +#include "Utils.h" -TxInputsSelectedModel::TxInputsSelectedModel (QObject *parent) - : QSortFilterProxyModel (parent) +namespace { + static const QHash kRoles{ + { TxInputsSelectedModel::TableDataRole, "tableData"}, + { TxInputsSelectedModel::HeadingRole, "heading" }, + { TxInputsSelectedModel::ColorRole, "dataColor" } + }; +} + +TxInputsSelectedModel::TxInputsSelectedModel(TxInputsModel* source) + : QAbstractTableModel(source), source_(source) + , header_{ {ColumnTxId, tr("TX Hash")}, {ColumnTxOut, tr("OutNdx")}, + {ColumnBalance, tr("Balance (BTC)")} } { - connect (this, &TxInputsSelectedModel::rowsInserted, this, &TxInputsSelectedModel::rowCountChanged); - connect (this, &TxInputsSelectedModel::rowsRemoved, this, &TxInputsSelectedModel::rowCountChanged); + selection_ = source_->getSelection(); + connect(source_, &TxInputsModel::selectionChanged, this, &TxInputsSelectedModel::onSelectionChanged); } -bool TxInputsSelectedModel::filterAcceptsRow (int sourceRow, const QModelIndex & /*sourceParent*/) const +void TxInputsSelectedModel::onSelectionChanged() { - const auto inputsModel = qobject_cast (sourceModel ()); - if (!inputsModel) { - return false; + beginResetModel(); + selection_ = source_->getSelection(); + endResetModel(); + emit rowCountChanged(); +} + +int TxInputsSelectedModel::rowCount(const QModelIndex&) const +{ + return (selection_ == nullptr) ? 1 : selection_->rowCount() + 1; +} + +int TxInputsSelectedModel::columnCount(const QModelIndex&) const +{ + return header_.size(); +} + +QVariant TxInputsSelectedModel::data(const QModelIndex& index, int role) const +{ + switch (role) { + case TableDataRole: + return getData(index.row(), index.column()); + case HeadingRole: + return (index.row() == 0); + case ColorRole: + return dataColor(index.row(), index.column()); + default: break; } + return {}; +} + +QHash TxInputsSelectedModel::roleNames() const +{ + return kRoles; +} - const auto isHeader = (sourceRow == 0); +QVariant TxInputsSelectedModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + return header_[section]; +} - const auto selected = inputsModel->data (inputsModel->index (sourceRow, 0), - static_cast (TxInputsModel::SelectedRole)).toBool (); +QVariant TxInputsSelectedModel::getData(int row, int col) const +{ + if (row == 0) { + return header_[col]; + } + if (!selection_) { + return {}; + } + if (selection_->rowCount() < row) { + return {}; + } + const auto& entry = selection_->data().at(row - 1); + switch (col) { + case ColumnTxId: { + const auto& txId = entry->utxo().getTxHash().toHexStr(true); + std::string str; + if (txId.size() > 40) { + str = txId.substr(0, 20) + "..." + txId.substr(txId.size() - 21, 20); + } + else { + str = txId; + } + return QString::fromStdString(str); + } + case ColumnTxOut: + return QString::number(entry->utxo().getTxOutIndex()); + case ColumnBalance: + return gui_utils::satoshiToQString(entry->utxo().getValue()); + default: break; + } + return {}; +} - return isHeader || selected; +QColor TxInputsSelectedModel::dataColor(int row, int col) const +{ + if (row == 0) { + return ColorScheme::tableHeaderColor; + } + return ColorScheme::tableTextColor; } diff --git a/GUI/QtQuick/TxInputsSelectedModel.h b/GUI/QtQuick/TxInputsSelectedModel.h index 6d2eb6da6..215b92e85 100644 --- a/GUI/QtQuick/TxInputsSelectedModel.h +++ b/GUI/QtQuick/TxInputsSelectedModel.h @@ -11,22 +11,40 @@ #ifndef TX_INPUTS_SELECTED_MODEL_H #define TX_INPUTS_SELECTED_MODEL_H -#include - #include "TxInputsModel.h" -class TxInputsSelectedModel : public QSortFilterProxyModel +class TxInputsSelectedModel : public QAbstractTableModel { Q_OBJECT Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged) public: - explicit TxInputsSelectedModel (QObject *parent = nullptr); + enum TableRoles { + TableDataRole = Qt::UserRole + 1, HeadingRole, ColorRole + }; + explicit TxInputsSelectedModel(TxInputsModel* source); - bool filterAcceptsRow (int sourceRow, const QModelIndex &sourceParent) const; + int rowCount(const QModelIndex & = QModelIndex()) const override; + int columnCount(const QModelIndex & = QModelIndex()) const override; + QVariant data(const QModelIndex& index, int role) const override; + QHash roleNames() const override; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; signals: - void rowCountChanged (); + void rowCountChanged(); + +private slots: + void onSelectionChanged(); + +private: + QVariant getData(int row, int col) const; + QColor dataColor(int row, int col) const; + +private: + enum Columns { ColumnTxId, ColumnTxOut, ColumnBalance }; + TxInputsModel* source_{ nullptr }; + const QMap header_; + QUTXOList* selection_{ nullptr }; }; diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 3068ade87..245521356 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -657,8 +657,7 @@ QTxDetails::QTxDetails(const std::shared_ptr& logger, const Bina { outputsModel_ = new TxOutputsModel(logger_, this); inputsModel_ = new TxInputsModel(logger_, outputsModel_, this); - selInputsModel_ = new TxInputsSelectedModel(this); - selInputsModel_->setSourceModel(inputsModel_); + selInputsModel_ = new TxInputsSelectedModel(inputsModel_); inputs_ = new TxInOutModel(tr("Input"), this); outputs_ = new TxInOutModel(tr("Output"), this); } @@ -678,19 +677,19 @@ void QTxDetails::setDetails(const bs::sync::TXWalletDetails& details) outputsModel_->addOutput(QString::fromStdString(out.address.display()) , out.value / BTCNumericTypes::BalanceDivider); } + ins_.clear(); + ins_.reserve(details.inputAddresses.size()); + for (const auto& in : details.inputAddresses) { + logger_->debug("[{}] in: {} {}@{} = {}", __func__, in.address.display() + , in.outHash.toHexStr(true), in.outIndex, in.value); + ins_.push_back({ in.address, in.outHash, in.outIndex, in.value }); + } + if (!fixedInputs_.empty()) { + setImmutableUTXOs(fixedInputs_); + fixedInputs_.clear(); + } + inputsModel_->addEntries(ins_); } - ins_.clear(); - ins_.reserve(details.inputAddresses.size()); - for (const auto& in : details.inputAddresses) { - logger_->debug("[{}] in: {} {}@{} = {}", __func__, in.address.display() - , in.outHash.toHexStr(true), in.outIndex, in.value); - ins_.push_back({ in.address, in.outHash, in.outIndex, in.value }); - } - if (!needInputsFromOutputs_ && !fixedInputs_.empty()) { - setImmutableUTXOs(fixedInputs_); - fixedInputs_.clear(); - } - inputsModel_->addEntries(ins_); outs_.clear(); outs_.reserve(details.outputAddresses.size()); @@ -712,10 +711,7 @@ void QTxDetails::setImmutableUTXOs(const std::vector& utxos) } logger_->debug("[{}] {}", __func__, utxos.size()); inputsModel_->setFixedInputs(ins_); - if (inputsModel_->setFixedUTXOs(utxos) > 0) { - needInputsFromOutputs_ = false; - } - else { + if (inputsModel_->setFixedUTXOs(utxos) <= 0) { logger_->debug("[{}] {} UTXOs discarded, saving for later user", __func__, utxos.size()); fixedInputs_ = utxos; } @@ -743,7 +739,6 @@ void QTxDetails::setInputsFromOutputs() inputsModel_->setFixedInputs(outs); if (!fixedInputs_.empty()) { inputsModel_->setFixedUTXOs(fixedInputs_); - needInputsFromOutputs_ = false; fixedInputs_.clear(); } } @@ -771,9 +766,9 @@ bool QTxDetails::amountsMatch(float fpb) const const auto outBalance = outputsModel_->totalAmount(); const float fee = fpb ? (feeValue() * fpb / (fpbCur ? fpbCur : 1)) : feeValue(); double diff = inBalance - outBalance - fee; - logger_->debug("[{}] in:{:.8f}, out:{:.8f}, fee:{:.8f}, diff={} fpb={}", __func__, inBalance - , outBalance, fee, diff, fpb); - return ((diff > 0) || (std::abs(diff) < 0.000003)); + logger_->debug("[{}] in:{:.8f}, out:{:.8f}, fee:{:.8f}, diff={} (ok:{}) fpb={}", __func__, inBalance + , outBalance, fee, diff, (std::abs(diff) < 0.00001), fpb); + return ((diff > 0) || (std::abs(diff) < 0.00001)); } void QTxDetails::onTopBlock(quint32 curBlock) diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index a70c40249..7b19ccb19 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -354,7 +354,7 @@ ColumnLayout { Layout.preferredHeight: BSSizes.applyScale(300) model: tx.selectedInputsModel - columnWidths: [0.7, 0.1, 0, 0.2] + columnWidths: [0.7, 0.1, 0.2] copy_button_column_index: -1 has_header: false @@ -603,6 +603,7 @@ ColumnLayout { tx.inputsModel.updateAutoselection() } create_temp_request() + console.log("valid: " + tempRequest.isValid + ", amounts match: " + tx.amountsMatch(parseFloat(fee_suggest_combo.edit_value()))) } } From 0464b9a89b323530fa72534f77bee5e05fecf0bb Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 31 May 2023 19:54:00 +0300 Subject: [PATCH 417/436] BIP39 backup support from Armory --- BlockSettleUILib/TransactionDetailsWidget.cpp | 1 - Core/SignerAdapter.cpp | 34 ++++++++----------- GUI/QtQuick/QtQuickAdapter.cpp | 19 +++-------- UnitTests/CMakeLists.txt | 22 ++++++------ common | 2 +- 5 files changed, 32 insertions(+), 46 deletions(-) diff --git a/BlockSettleUILib/TransactionDetailsWidget.cpp b/BlockSettleUILib/TransactionDetailsWidget.cpp index 7cf9d920e..70056f111 100644 --- a/BlockSettleUILib/TransactionDetailsWidget.cpp +++ b/BlockSettleUILib/TransactionDetailsWidget.cpp @@ -11,7 +11,6 @@ #include "TransactionDetailsWidget.h" #include "ui_TransactionDetailsWidget.h" #include "BTCNumericTypes.h" -#include "BlockObj.h" #include "CheckRecipSigner.h" #include "UiUtils.h" #include "Wallets/SyncWallet.h" diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 50235e3f1..42d3d12c7 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -647,7 +647,7 @@ ProcessingResult SignerAdapter::processCreateWallet(const bs::message::Envelope& SignerMessage msg; auto msgResp = msg.mutable_created_wallet(); try { - const auto& seed = w.xpriv_key().empty() ? bs::core::wallet::Seed(SecureBinaryData::fromString(w.seed()), netType_) + const auto& seed = w.xpriv_key().empty() ? bs::core::wallet::Seed(w.seed(), netType_) : bs::core::wallet::Seed::fromXpriv(SecureBinaryData::fromString(w.xpriv_key()), netType_); const auto& wallet = walletsMgr_->createWallet(w.name(), w.description(), seed @@ -807,6 +807,9 @@ bool SignerAdapter::isPasswordValid(const std::string& walletId try { const bs::core::WalletPasswordScoped lock(hdWallet, password); const auto& seed = hdWallet->getDecryptedSeed(); + if (seed.empty()) { + throw std::runtime_error("seed is empty"); + } logger_->debug("[{}] seed id: {}, walletId: {}, pass size: {}", __func__, seed.getWalletId(), walletId, password.getSize()); return (seed.getWalletId() == walletId); } @@ -816,6 +819,9 @@ bool SignerAdapter::isPasswordValid(const std::string& walletId catch (const Armory::Wallets::Encryption::DecryptedDataContainerException&) { logger_->error("[{}] failed to decrypt wallet {}", __func__, walletId); } + catch (const std::exception& e) { + logger_->error("[{}] {}: {}", __func__, walletId, e.what()); + } return false; } @@ -840,25 +846,11 @@ bs::message::ProcessingResult SignerAdapter::processGetWalletSeed(const bs::mess try { const bs::core::WalletPasswordScoped lock(hdWallet, password); const auto& seed = hdWallet->getDecryptedSeed(); - msgResp->set_xpriv(seed.toXpriv().toBinStr()); - msgResp->set_seed(seed.seed().toBinStr()); - - if (seed.hasPrivateKey()) { - const auto& privKey = seed.privateKey(); - std::vector privData; - for (int i = 0; i < (int)privKey.getSize(); ++i) { - privData.push_back(privKey.getPtr()[i]); - } - const auto& words = BIP39::create_mnemonic(privData); - std::string bip39Seed; - for (const auto& w : words) { - bip39Seed += w + " "; - } - bip39Seed.pop_back(); - msgResp->set_bip39_seed(bip39Seed); - logger_->debug("[{}] bip39 seed: {} [{}] from [{}]", __func__ - , bip39Seed, words.size(), privData.size()); + if (seed.empty()) { + logger_->warn("[{}] empty seed", __func__); } + msgResp->set_xpriv(seed.toXpriv().toBinStr()); + msgResp->set_bip39_seed(seed.seed().toBinStr()); //TODO: check that seed.seed() has spaces } catch (const Armory::Wallets::WalletException& e) { logger_->error("[{}] failed to decrypt wallet {}: {}", __func__, request.wallet_id(), e.what()); @@ -869,6 +861,10 @@ bs::message::ProcessingResult SignerAdapter::processGetWalletSeed(const bs::mess pushResponse(user_, env, msg.SerializeAsString()); return ProcessingResult::Error; } + catch (const std::exception&) { + pushResponse(user_, env, msg.SerializeAsString()); + return ProcessingResult::Error; + } pushResponse(user_, env, msg.SerializeAsString()); return bs::message::ProcessingResult::Success; } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index d81aecd53..a222e16e4 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1425,13 +1425,13 @@ void QtQuickAdapter::copySeedToClipboard(const QStringList& seed) QGuiApplication::clipboard()->setText(str); } -SecureBinaryData binSeedFromWords(const QStringList& seed) +static std::string seedFromWords(const QStringList& seed) { BIP39::word_list words; for (const auto& w : seed) { words.add(w.toStdString()); } - return BIP39::seed_from_mnemonic(words); + return words.to_string(); } void QtQuickAdapter::createWallet(const QString& name, const QStringList& seed @@ -1442,8 +1442,7 @@ void QtQuickAdapter::createWallet(const QString& name, const QStringList& seed SignerMessage msg; auto msgReq = msg.mutable_create_wallet(); msgReq->set_name(walletName); - const auto& binSeed = binSeedFromWords(seed); - msgReq->set_seed(binSeed.toBinStr()); + msgReq->set_seed(seedFromWords(seed)); msgReq->set_password(password.toStdString()); pushRequest(user_, userSigner_, msg.SerializeAsString()); walletBalances_->clear(); @@ -1454,17 +1453,10 @@ void QtQuickAdapter::importWallet(const QString& name, const QStringList& seed { const auto walletName = name.isEmpty() ? generateWalletName() : name.toStdString(); logger_->debug("[{}] {}", __func__, walletName); - BIP39::word_list words; - for (const auto& w : seed) { - words.add(w.toStdString()); - } SignerMessage msg; auto msgReq = msg.mutable_import_wallet(); msgReq->set_name(walletName); - //msgReq->set_description(seedData.description); - //msgReq->set_xpriv_key(seedData.xpriv); - const auto binSeed = BIP39::seed_from_mnemonic(words); - msgReq->set_seed(binSeed.toBinStr()); + msgReq->set_seed(seedFromWords(seed)); msgReq->set_password(password.toStdString()); pushRequest(user_, userSigner_, msg.SerializeAsString()); walletBalances_->clear(); @@ -2767,8 +2759,7 @@ void QtQuickAdapter::exportWalletToPdf(const QUrl& path, const QStringList& seed std::pair QtQuickAdapter::walletInfoFromSeed(const QStringList& bip39Seed) { - const auto& binSeed = binSeedFromWords(bip39Seed); - const bs::core::wallet::Seed seed(binSeed, netType_); + const bs::core::wallet::Seed seed(seedFromWords(bip39Seed), netType_); const auto& rootNode = seed.getNode(); return { QString::fromStdString(seed.getWalletId()) , QString::fromStdString(rootNode.getBase58().toBinStr()) }; diff --git a/UnitTests/CMakeLists.txt b/UnitTests/CMakeLists.txt index c13094af2..34da09f6c 100644 --- a/UnitTests/CMakeLists.txt +++ b/UnitTests/CMakeLists.txt @@ -22,25 +22,25 @@ LIST (APPEND SOURCES ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BDM_mainthread.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BDM_Server.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BitcoinP2P.cpp - ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/Blockchain.cpp - ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockchainScanner.cpp - ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockchainScanner_Super.cpp - ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockDataMap.cpp + ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockchainDatabase/Blockchain.cpp + ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockchainDatabase/BlockchainScanner.cpp + ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockchainDatabase/BlockchainScanner_Super.cpp + ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockchainDatabase/BlockDataMap.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockDataViewer.cpp - ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockObj.cpp - ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockUtils.cpp + ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockchainDatabase/BlockObj.cpp + ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockchainDatabase/BlockUtils.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BtcWallet.cpp - ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/DatabaseBuilder.cpp + ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockchainDatabase/DatabaseBuilder.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/HistoryPager.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/LedgerEntry.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/nodeRPC.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/Progress.cpp - ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/ScrAddrFilter.cpp + ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockchainDatabase/ScrAddrFilter.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/ScrAddrObj.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/Server.cpp - ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/SshParser.cpp - ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/StoredBlockObj.cpp - ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/txio.cpp + ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockchainDatabase/SshParser.cpp + ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockchainDatabase/StoredBlockObj.cpp + ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/BlockchainDatabase/txio.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/ZeroConf.cpp ${TERMINAL_GUI_ROOT}/common/ArmoryDB/cppForSwig/gtest/NodeUnitTest.cpp ${TERMINAL_GUI_ROOT}/common/WalletsLib/WalletBackupFile.cpp diff --git a/common b/common index 37beee6af..0566f8197 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 37beee6af1eb3fae00018114d5425b393ed64ef3 +Subproject commit 0566f8197a6773fd105858612e83ee2bfd649d75 From abdc252ff9677621b8ae8900feee9f1aa4e10beb Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 6 Jun 2023 21:56:19 +0300 Subject: [PATCH 418/436] BIP39 import fixes --- common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common b/common index 0566f8197..453f460a5 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 0566f8197a6773fd105858612e83ee2bfd649d75 +Subproject commit 453f460a5c1db7e82057b7cc3f00c801c9f4cc51 From 1cc5b342482bd6d59f136c9f7cb08bbc5981b473 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 7 Jun 2023 22:50:02 +0300 Subject: [PATCH 419/436] [QT-185] wallet selection after creation/import --- Core/SettingsAdapter.cpp | 2 +- Core/SignerAdapter.cpp | 4 ++-- GUI/QtQuick/QtQuickAdapter.cpp | 15 ++++++++++++++- GUI/QtQuick/SideshiftPlugin.cpp | 2 +- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Core/SettingsAdapter.cpp b/Core/SettingsAdapter.cpp index dde27c271..22d77eff3 100644 --- a/Core/SettingsAdapter.cpp +++ b/Core/SettingsAdapter.cpp @@ -512,7 +512,7 @@ ProcessingResult SettingsAdapter::processArmoryServer(const BlockSettle::Termina selIndex++; } if (selIndex >= armoryServersProvider_->servers().size()) { - logger_->error("[{}] failed to find Armory server {}", __func__, request.server_name()); + logger_->error("[{}] failed to find Armory server {} #{}", __func__, request.server_name(), selIndex); return ProcessingResult::Error; } armoryServersProvider_->setupServer(selIndex); diff --git a/Core/SignerAdapter.cpp b/Core/SignerAdapter.cpp index 42d3d12c7..7425d8cef 100644 --- a/Core/SignerAdapter.cpp +++ b/Core/SignerAdapter.cpp @@ -137,7 +137,7 @@ ProcessingResult SignerAdapter::processOwnRequest(const bs::message::Envelope &e case SignerMessage::kDialogRequest: return processDialogRequest(env, request.dialog_request()); case SignerMessage::kCreateWallet: - return processCreateWallet(env, false, request.create_wallet()); + return processCreateWallet(env, true, request.create_wallet()); case SignerMessage::kImportWallet: return processCreateWallet(env, true, request.import_wallet()); case SignerMessage::kDeleteWallet: @@ -654,7 +654,7 @@ ProcessingResult SignerAdapter::processCreateWallet(const bs::message::Envelope& , walletsDir_, pwdData, w.primary()); msgResp->set_wallet_id(wallet->walletId()); walletsChanged(rescan); - logger_->debug("[{}] wallet {} created", __func__, wallet->walletId()); + logger_->debug("[{}] wallet {} created (rescan: {})", __func__, wallet->walletId(), rescan); } catch (const std::exception& e) { logger_->error("[{}] failed to create wallet: {}", __func__, e.what()); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index a222e16e4..ab28a2c34 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -724,18 +724,22 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) if (settingsController_->hasParam(ApplicationSettings::Setting::SelectedWallet)) { const int lastIdx = settingsController_->getParam(ApplicationSettings::Setting::SelectedWallet).toInt(); if ((lastIdx >= 0) && (lastIdx < nWalletsLoaded_)) { + logger_->debug("[walletReady] lastIdx={}", lastIdx); emit requestWalletSelection(lastIdx); } else if (nWalletsLoaded_ > 0) { + logger_->debug("[walletReady] nWallets:{}", nWalletsLoaded_); emit requestWalletSelection(0); } } } else { - auto index = walletBalances_->wallets().indexOf(QString::fromStdString(createdWalletId_)); + const int index = walletBalances_->wallets().indexOf(QString::fromStdString(createdWalletId_)); if (index != -1) { emit requestWalletSelection(index); } + logger_->debug("[walletReady] index={} of {}", index, createdWalletId_); + createdWalletId_.clear(); } } break; @@ -1145,6 +1149,7 @@ void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) const auto& walletId = *wi.ids.cbegin(); hdWallets_[walletId] = wi; logger_->debug("[QtQuickAdapter::processWalletLoaded] {} {}", wi.name, walletId); + QMetaObject::invokeMethod(this, [this, isInitialLoad, walletId, walletName = wi.name] { hwDeviceModel_->setLoaded(walletId); walletBalances_->addWallet({ walletId, walletName }); @@ -1218,6 +1223,14 @@ ProcessingResult QtQuickAdapter::processWalletBalances(bs::message::SeqId respon , response.total_balance(), response.nb_addresses() }; walletBalances_->setWalletBalance(response.wallet_id(), bal); + if (!createdWalletId_.empty()) { + const int index = walletBalances_->wallets().indexOf(QString::fromStdString(createdWalletId_)); + if (index != -1) { + emit requestWalletSelection(index); + } + createdWalletId_.clear(); + } + QMetaObject::invokeMethod(this, [this, response]() { for (const auto& addrBal : response.address_balances()) { diff --git a/GUI/QtQuick/SideshiftPlugin.cpp b/GUI/QtQuick/SideshiftPlugin.cpp index 8f8b22187..ee0b6ce05 100644 --- a/GUI/QtQuick/SideshiftPlugin.cpp +++ b/GUI/QtQuick/SideshiftPlugin.cpp @@ -383,7 +383,7 @@ std::string SideshiftPlugin::get(const std::string& request) { std::unique_lock lock(curlMtx_); if (!curl_) { - logger_->error("[{}] curl not inited"); + logger_->error("[{}] curl not inited", __func__); return {}; } curl_easy_setopt(curl_, CURLOPT_POST, 0); From 45d859c8b8e250b9619af11c1f85991bcc6a2d43 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Fri, 9 Jun 2023 21:22:20 +0300 Subject: [PATCH 420/436] [QT-183] UTXOs after wallet selection --- GUI/QtQuick/QtQuickAdapter.cpp | 2 ++ GUI/QtQuick/qml/Send/AdvancedDetails.qml | 13 ++++++------- GUI/QtQuick/qml/Send/SendPopup.qml | 2 ++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index ab28a2c34..473db7a11 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -1329,6 +1329,7 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId } } else { + logger_->debug("[{}] {} inputs", __func__, txDet.inputAddresses.size()); QMetaObject::invokeMethod(this, [this, details = itTxDet->second, txDet] { details->setDetails(txDet); details->onTopBlock(blockNum_); @@ -1679,6 +1680,7 @@ void QtQuickAdapter::getUTXOsForWallet(int walletIndex, QTxDetails* txDet) if (txDet) { txDet->inputsModel()->clear(); } + logger_->debug("[{}] #{} txDet={}", __func__, walletIndex, (void*)txDet); WalletsMessage msg; auto msgReq = msg.mutable_get_utxos(); msgReq->set_wallet_id(hdWalletIdByIndex(walletIndex)); diff --git a/GUI/QtQuick/qml/Send/AdvancedDetails.qml b/GUI/QtQuick/qml/Send/AdvancedDetails.qml index 7b19ccb19..8eb1f2731 100644 --- a/GUI/QtQuick/qml/Send/AdvancedDetails.qml +++ b/GUI/QtQuick/qml/Send/AdvancedDetails.qml @@ -244,7 +244,6 @@ ColumnLayout { } WalletsComboBox { - id: from_wallet_combo Layout.leftMargin: BSSizes.applyScale(16) @@ -268,11 +267,11 @@ ColumnLayout { //I dont understand why but acceptableInput dont work... var cur_value = parseFloat(amount_input.input_text) var bottom = 0 - var top = tempRequest.maxAmount - if(cur_value < bottom || cur_value > top) - { - amount_input.input_text = tempRequest.maxAmount - } + //var top = tempRequest.maxAmount + //if(cur_value < bottom || cur_value > top) + //{ + // amount_input.input_text = tempRequest.maxAmount + //} bsApp.getUTXOsForWallet(from_wallet_combo.currentIndex, tx) } @@ -281,7 +280,7 @@ ColumnLayout { target: walletBalances function onChanged() { if (layout.visible) { - prepareRequest() + from_wallet_combo.prepareRequest() } } } diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index b7122f5bf..7299144ff 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -33,6 +33,7 @@ CustomPopup { onSig_advanced: { _stack_view.replace(advanced_details) + root.tx = bsApp.getTXDetails("") advanced_details.init() } @@ -155,6 +156,7 @@ CustomPopup { } function init() { + root.tx = bsApp.getTXDetails("") _stack_view.replace(bsApp.settingAdvancedTX ? advanced_details : simple_details) if (_stack_view.currentItem === simple_details) From dc9fc351ba6fc9998ab1959bffa0be5f046e30de Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 14 Jun 2023 12:38:55 +0300 Subject: [PATCH 421/436] [QT-182] proper UTXOs selection for CPFP --- GUI/QtQuick/AddressListModel.cpp | 3 ++ GUI/QtQuick/QtQuickAdapter.cpp | 48 +++++++++++++++++++++-------- GUI/QtQuick/QtQuickAdapter.h | 6 ++-- GUI/QtQuick/TxInputsModel.cpp | 45 ++++++++++++++------------- GUI/QtQuick/TxListModel.cpp | 14 ++++++++- GUI/QtQuick/TxListModel.h | 2 ++ GUI/QtQuick/WalletBalancesModel.cpp | 2 +- GUI/QtQuick/WalletBalancesModel.h | 4 ++- GUI/QtQuick/qml/OverviewPage.qml | 4 +-- GUI/QtQuick/qml/Send/SendPopup.qml | 4 +-- GUI/QtQuick/qml/main.qml | 4 +-- GUI/QtWidgets/QtGuiAdapter.cpp | 8 ++--- common | 2 +- 13 files changed, 96 insertions(+), 50 deletions(-) diff --git a/GUI/QtQuick/AddressListModel.cpp b/GUI/QtQuick/AddressListModel.cpp index 771bd4479..0e4a2d4b5 100644 --- a/GUI/QtQuick/AddressListModel.cpp +++ b/GUI/QtQuick/AddressListModel.cpp @@ -40,6 +40,9 @@ int QmlAddressListModel::columnCount(const QModelIndex&) const QVariant QmlAddressListModel::data(const QModelIndex& index, int role) const { const int row = index.row(); + if (row < 0) { + return {}; + } try { switch (role) { diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 473db7a11..ee0db1101 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -357,7 +357,7 @@ void QtQuickAdapter::run(int &argc, char **argv) QStringList QtQuickAdapter::txWalletsList() const { QStringList result = { tr("All wallets") }; - result.append(walletBalances_->wallets()); + result.append(walletBalances_->walletNames()); return result; } @@ -734,7 +734,7 @@ ProcessingResult QtQuickAdapter::processWallets(const Envelope &env) } } else { - const int index = walletBalances_->wallets().indexOf(QString::fromStdString(createdWalletId_)); + const int index = walletIndexById(createdWalletId_); if (index != -1) { emit requestWalletSelection(index); } @@ -1080,13 +1080,13 @@ void QtQuickAdapter::createWallet(bool primary) logger_->debug("[{}] primary: {}", __func__, primary); } -std::string QtQuickAdapter::hdWalletIdByIndex(int index) +std::string QtQuickAdapter::hdWalletIdByIndex(int index) const { const auto& walletsList = walletBalances_->wallets(); if ((index < 0) || (index >= walletsList.size())) { return {}; } - const auto& walletName = walletsList.at(index).toStdString(); + const auto& walletName = walletsList.at(index).walletName; for (const auto& wallet : hdWallets_) { if (wallet.second.name == walletName) { return wallet.first; @@ -1095,6 +1095,17 @@ std::string QtQuickAdapter::hdWalletIdByIndex(int index) return {}; } +int QtQuickAdapter::walletIndexById(const std::string& walletId) const +{ + const auto& walletsList = walletBalances_->wallets(); + for (int i = 0; i < walletsList.size(); ++i) { + if (walletsList.at(i).walletId == walletId) { + return i; + } + } + return -1; +} + std::string QtQuickAdapter::generateWalletName() const { int index = walletBalances_->rowCount(); @@ -1124,7 +1135,7 @@ void QtQuickAdapter::walletSelected(int index) logger_->debug("[{}] {}", __func__, index); QMetaObject::invokeMethod(this, [this, index] { try { - const auto& walletName = walletBalances_->wallets().at(index).toStdString(); + const auto& walletName = walletBalances_->walletNames().at(index).toStdString(); const auto& walletId = hdWalletIdByIndex(index); addrModel_->reset(walletId); @@ -1224,7 +1235,7 @@ ProcessingResult QtQuickAdapter::processWalletBalances(bs::message::SeqId respon walletBalances_->setWalletBalance(response.wallet_id(), bal); if (!createdWalletId_.empty()) { - const int index = walletBalances_->wallets().indexOf(QString::fromStdString(createdWalletId_)); + const int index = walletIndexById(createdWalletId_); if (index != -1) { emit requestWalletSelection(index); } @@ -1280,7 +1291,7 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId for (const auto &inAddr : resp.input_addresses()) { try { txDet.inputAddresses.push_back({ bs::Address::fromAddressString(inAddr.address()) - , inAddr.value(), inAddr.value_string(), inAddr.wallet_name() + , inAddr.value(), inAddr.value_string(), inAddr.wallet_id(), inAddr.wallet_name() , static_cast(inAddr.script_type()) , BinaryData::fromString(inAddr.out_hash()), (uint32_t)inAddr.out_index() }); } catch (const std::exception &e) { @@ -1290,12 +1301,12 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId for (const auto &outAddr : resp.output_addresses()) { try { txDet.outputAddresses.push_back({ bs::Address::fromAddressString(outAddr.address()) - , outAddr.value(), outAddr.value_string(), outAddr.wallet_name() + , outAddr.value(), outAddr.value_string(), outAddr.wallet_id(), outAddr.wallet_name() , static_cast(outAddr.script_type()) , BinaryData::fromString(outAddr.out_hash()), (uint32_t)outAddr.out_index() }); } catch (const std::exception &) { // OP_RETURN data for valueStr txDet.outputAddresses.push_back({ bs::Address{} - , outAddr.value(), outAddr.address(), outAddr.wallet_name() + , outAddr.value(), outAddr.address(), outAddr.wallet_id(), outAddr.wallet_name() , static_cast(outAddr.script_type()), ownTxHash , (uint32_t)outAddr.out_index() }); } @@ -1303,7 +1314,7 @@ ProcessingResult QtQuickAdapter::processTXDetails(bs::message::SeqId msgId try { txDet.changeAddress = { bs::Address::fromAddressString(resp.change_address().address()) , resp.change_address().value(), resp.change_address().value_string() - , resp.change_address().wallet_name() + , resp.change_address().wallet_id(), resp.change_address().wallet_name() , static_cast(resp.change_address().script_type()) , BinaryData::fromString(resp.change_address().out_hash()) , (uint32_t)resp.change_address().out_index() }; @@ -1692,14 +1703,27 @@ void QtQuickAdapter::getUTXOsForWallet(int walletIndex, QTxDetails* txDet) } } -QTxDetails* QtQuickAdapter::getTXDetails(const QString& txHash, bool rbf, bool cpfp) +QTxDetails* QtQuickAdapter::getTXDetails(const QString& txHash, bool rbf + , bool cpfp, int selWalletIdx) { auto txBinHash = BinaryData::CreateFromHex(txHash.trimmed().toStdString()); txBinHash.swapEndian(); - logger_->debug("[{}] {} RBF:{} CPFP: {}", __func__, txBinHash.toHexStr(true), rbf, cpfp); + logger_->debug("[{}] {} RBF:{} CPFP: {}, idx: {}", __func__, txBinHash.toHexStr(true) + , rbf, cpfp, selWalletIdx); const auto txDet = new QTxDetails(logger_, txBinHash, this); connect(this, &QtQuickAdapter::topBlock, txDet, &QTxDetails::onTopBlock); + if (selWalletIdx >= 0) { + const auto& hdWalletId = hdWalletIdByIndex(selWalletIdx); + if (!hdWalletId.empty()) { + txDet->addWalletFilter(hdWalletId); + const auto& hdWallet = hdWallets_.at(hdWalletId); + for (const auto& leaf : hdWallet.leaves) { + txDet->addWalletFilter(leaf.first); + } + } + } + if (rbf || cpfp) { ArmoryMessage msgSpendable; auto msgWltIds = rbf ? msgSpendable.mutable_get_rbf_utxos() : msgSpendable.mutable_get_zc_utxos(); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index f920e90a2..7a16ab8ca 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -181,7 +181,8 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop Q_INVOKABLE void signAndBroadcast(QTXSignRequest*, const QString& password); Q_INVOKABLE int getSearchInputType(const QString&); Q_INVOKABLE void startAddressSearch(const QString&); - Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash, bool rbf = false, bool cpfp = false); + Q_INVOKABLE QTxDetails* getTXDetails(const QString& txHash, bool rbf = false + , bool cpfp = false, int selWalletIdx = -1); Q_INVOKABLE int changePassword(const QString& walletId, const QString& oldPassword, const QString& newPassword); Q_INVOKABLE bool isWalletNameExist(const QString& walletName); Q_INVOKABLE bool isWalletPasswordValid(const QString& walletId, const QString& password); @@ -262,7 +263,8 @@ private slots: void notifyNewTransaction(const bs::TXEntry& tx); void createWallet(bool primary); - std::string hdWalletIdByIndex(int); + std::string hdWalletIdByIndex(int) const; + int walletIndexById(const std::string&) const; std::string generateWalletName() const; std::string hdWalletIdByLeafId(const std::string&) const; diff --git a/GUI/QtQuick/TxInputsModel.cpp b/GUI/QtQuick/TxInputsModel.cpp index 3fbaa55fe..dea7ac8f9 100644 --- a/GUI/QtQuick/TxInputsModel.cpp +++ b/GUI/QtQuick/TxInputsModel.cpp @@ -130,7 +130,7 @@ void TxInputsModel::addUTXOs(const std::vector& utxos) utxos_[addr].push_back(utxo); int addrIndex = -1; - for (int i = 0; i < data_.size(); ++i) { + for (int i = fixedEntries_.size(); i < data_.size(); ++i) { if (data_.at(i).address == addr) { addrIndex = i; break; @@ -210,9 +210,23 @@ void TxInputsModel::setFixedInputs(const std::vector& entries) data_.erase(data_.cbegin(), data_.cbegin() + fixedEntries_.size()); endRemoveRows(); } - fixedEntries_ = entries; - beginInsertRows(QModelIndex(), 0, entries.size() - 1); - data_.insert(data_.cbegin(), entries.cbegin(), entries.cend()); + std::vector treeEntries; + for (const auto& entry : entries) { + auto it = std::find_if(treeEntries.cbegin(), treeEntries.cend(), [entry](const Entry& e) + { return e.address == entry.address; }); + if (it == treeEntries.end()) { + auto addrEntry = entry; + addrEntry.txId.clear(); + addrEntry.expanded = true; + treeEntries.push_back(addrEntry); + } + auto txEntry = entry; + txEntry.address.clear(); + treeEntries.push_back(txEntry); + } + fixedEntries_ = treeEntries; + beginInsertRows(QModelIndex(), 0, treeEntries.size() - 1); + data_.insert(data_.cbegin(), treeEntries.cbegin(), treeEntries.cend()); endInsertRows(); emit rowCountChanged(); } @@ -261,25 +275,10 @@ void TxInputsModel::toggleSelection(int row) selectionRoot_ = !selectionRoot_; if (!selectionRoot_) { - selectionUtxos_.clear(); - selectionAddresses_.clear(); - for (int iRow = 1; iRow < rowCount(); iRow ++) { - const auto& entry = data_.at(iRow-1); - const auto& itAddr = utxos_.find(entry.address); - if (itAddr != utxos_.end()) { - for (const auto& u : itAddr->second) { - selectionUtxos_.erase({u.getTxHash(), u.getTxOutIndex()}); - selectedBalance_ -= u.getValue(); - nbTx_--; - } - } - } + clearSelection(); } else { - for (int iRow = 1; iRow < rowCount(); iRow ++) { - if (iRow <= fixedEntries_.size()) { - continue; - } + for (int iRow = fixedEntries_.size() + 1; iRow < rowCount(); iRow ++) { const auto& entry = data_.at(iRow-1); if (entry.txId.empty()) { selectionAddresses_.insert(entry.address); @@ -300,6 +299,9 @@ void TxInputsModel::toggleSelection(int row) } --row; + if (row < fixedEntries_.size()) { + return; + } const auto& entry = data_.at(row); const auto& itAddr = utxos_.find(entry.address); UTXO utxo{}; @@ -591,6 +593,5 @@ bool TxInputsModel::isInputSelectable(int row) const if (row > 0 && row <= fixedEntries_.size()) { return false; } - return true; } diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 245521356..74991770b 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -682,6 +682,9 @@ void QTxDetails::setDetails(const bs::sync::TXWalletDetails& details) for (const auto& in : details.inputAddresses) { logger_->debug("[{}] in: {} {}@{} = {}", __func__, in.address.display() , in.outHash.toHexStr(true), in.outIndex, in.value); + if (!walletIdFilter_.empty() && (walletIdFilter_.find(in.walletId) == walletIdFilter_.end())) { + continue; + } ins_.push_back({ in.address, in.outHash, in.outIndex, in.value }); } if (!fixedInputs_.empty()) { @@ -717,10 +720,15 @@ void QTxDetails::setImmutableUTXOs(const std::vector& utxos) } } +void QTxDetails::addWalletFilter(const std::string& walletId) +{ + walletIdFilter_.insert(walletId); +} + void QTxDetails::setInputsFromOutputs() { if (outs_.empty()) { - logger_->info("[{}] no outputs received [yet]"); + logger_->info("[{}] no outputs received [yet]", __func__); needInputsFromOutputs_ = true; return; } @@ -728,6 +736,10 @@ void QTxDetails::setInputsFromOutputs() outs.reserve(details_.outputAddresses.size()); const auto& txId = details_.tx.isInitialized() ? details_.tx.getThisHash() : BinaryData{}; for (const auto& out : details_.outputAddresses) { + if (!walletIdFilter_.empty() && (walletIdFilter_.find(out.walletId) == walletIdFilter_.end())) { + logger_->debug("[{}] {} from {} filtered out", __func__, out.address.display(), out.walletId); + continue; + } outs.push_back({ out.address, txId, out.outIndex, out.value }); } diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 265d65413..6bf40b1a7 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -182,6 +182,7 @@ class QTxDetails : public QObject void setDetails(const bs::sync::TXWalletDetails&); void setImmutableUTXOs(const std::vector&); + void addWalletFilter(const std::string& walletId); Q_INVOKABLE void setInputsFromOutputs(); Q_PROPERTY(QString txId READ txId NOTIFY updated) @@ -246,6 +247,7 @@ public slots: uint32_t curBlock_{ 0 }; bool needInputsFromOutputs_{ false }; std::vector fixedInputs_; + std::unordered_set walletIdFilter_; }; #endif // TX_LIST_MODEL_H diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index 845bfa4f8..53cfe5fa1 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -144,7 +144,7 @@ void WalletBalancesModel::rename(const std::string& walletId, const std::string& emit dataChanged(createIndex(idx, 0), createIndex(idx, 0), { WalletBalance::NameRole }); } -QStringList WalletBalancesModel::wallets() const +QStringList WalletBalancesModel::walletNames() const { QStringList result; for (const auto& w : wallets_) { diff --git a/GUI/QtQuick/WalletBalancesModel.h b/GUI/QtQuick/WalletBalancesModel.h index 3198032f5..3711d1e45 100644 --- a/GUI/QtQuick/WalletBalancesModel.h +++ b/GUI/QtQuick/WalletBalancesModel.h @@ -52,14 +52,16 @@ class WalletBalancesModel : public QAbstractTableModel QVariant data(const QModelIndex& index, int role) const override; QHash roleNames() const override; - QStringList wallets() const; + QStringList walletNames() const; void clear(); struct Wallet { std::string walletId; std::string walletName; }; void addWallet(const Wallet&); + std::vector wallets() const { return wallets_; } void deleteWallet(const std::string& walletId); + void rename(const std::string& walletId, const std::string& newName); struct Balance { diff --git a/GUI/QtQuick/qml/OverviewPage.qml b/GUI/QtQuick/qml/OverviewPage.qml index 01d3afe26..d0fd8b520 100644 --- a/GUI/QtQuick/qml/OverviewPage.qml +++ b/GUI/QtQuick/qml/OverviewPage.qml @@ -29,7 +29,7 @@ Rectangle { signal newWalletClicked(); signal curWalletIndexChanged(index : int) - signal openSend (string txId, bool isRBF, bool isCPFP) + signal openSend (string txId, bool isRBF, bool isCPFP, int selWallet) signal openExplorer (string txId) MouseArea { @@ -74,7 +74,7 @@ Rectangle { addressDetails.open() } - onOpenSend: (txId, isRBF, isCPFP) => overview.openSend(txId, isRBF, isCPFP) + onOpenSend: (txId, isRBF, isCPFP) => overview.openSend(txId, isRBF, isCPFP, walletIndex) onOpenExplorer: (txId) => overview.openExplorer(txId) } } diff --git a/GUI/QtQuick/qml/Send/SendPopup.qml b/GUI/QtQuick/qml/Send/SendPopup.qml index 7299144ff..08eb9e993 100644 --- a/GUI/QtQuick/qml/Send/SendPopup.qml +++ b/GUI/QtQuick/qml/Send/SendPopup.qml @@ -171,10 +171,10 @@ CustomPopup { root.isCPFP = false } - function open(txId: string, isRBF: bool, isCPFP: bool) + function open(txId: string, isRBF: bool, isCPFP: bool, selWalletIdx: int) { _stack_view.replace(advanced_details) - root.tx = bsApp.getTXDetails(txId, isRBF, isCPFP) + root.tx = bsApp.getTXDetails(txId, isRBF, isCPFP, selWalletIdx) root.isRBF = isRBF root.isCPFP = isCPFP advanced_details.init() diff --git a/GUI/QtQuick/qml/main.qml b/GUI/QtQuick/qml/main.qml index 9d93230c0..08707f3c4 100644 --- a/GUI/QtQuick/qml/main.qml +++ b/GUI/QtQuick/qml/main.qml @@ -368,8 +368,8 @@ ApplicationWindow { onCurWalletIndexChanged: (ind) => { //overviewWalletIndex = ind } - onOpenSend: (txId, isRBF, isCPFP) => { - send_popup.open(txId, isRBF, isCPFP) + onOpenSend: (txId, isRBF, isCPFP, selWalletIdx) => { + send_popup.open(txId, isRBF, isCPFP, selWalletIdx) show_popup(send_popup, true) } diff --git a/GUI/QtWidgets/QtGuiAdapter.cpp b/GUI/QtWidgets/QtGuiAdapter.cpp index 6de27906f..3fffe4611 100644 --- a/GUI/QtWidgets/QtGuiAdapter.cpp +++ b/GUI/QtWidgets/QtGuiAdapter.cpp @@ -1349,7 +1349,7 @@ ProcessingResult QtGuiAdapter::processTXDetails(uint64_t msgId, const WalletsMes for (const auto &inAddr : resp.input_addresses()) { try { txDet.inputAddresses.push_back({ bs::Address::fromAddressString(inAddr.address()) - , inAddr.value(), inAddr.value_string(), inAddr.wallet_name() + , inAddr.value(), inAddr.value_string(), inAddr.wallet_id(), inAddr.wallet_name() , static_cast(inAddr.script_type()) , BinaryData::fromString(inAddr.out_hash()), (uint32_t)inAddr.out_index() }); } catch (const std::exception &e) { @@ -1359,12 +1359,12 @@ ProcessingResult QtGuiAdapter::processTXDetails(uint64_t msgId, const WalletsMes for (const auto &outAddr : resp.output_addresses()) { try { txDet.outputAddresses.push_back({ bs::Address::fromAddressString(outAddr.address()) - , outAddr.value(), outAddr.value_string(), outAddr.wallet_name() + , outAddr.value(), outAddr.value_string(), outAddr.wallet_id(), outAddr.wallet_name() , static_cast(outAddr.script_type()) , BinaryData::fromString(outAddr.out_hash()), (uint32_t)outAddr.out_index() }); } catch (const std::exception &) { // OP_RETURN data for valueStr txDet.outputAddresses.push_back({ bs::Address{} - , outAddr.value(), outAddr.address(), outAddr.wallet_name() + , outAddr.value(), outAddr.address(), outAddr.wallet_id(), outAddr.wallet_name() , static_cast(outAddr.script_type()), ownTxHash , (uint32_t)outAddr.out_index() }); } @@ -1372,7 +1372,7 @@ ProcessingResult QtGuiAdapter::processTXDetails(uint64_t msgId, const WalletsMes try { txDet.changeAddress = { bs::Address::fromAddressString(resp.change_address().address()) , resp.change_address().value(), resp.change_address().value_string() - , resp.change_address().wallet_name() + , resp.change_address().wallet_id(), resp.change_address().wallet_name() , static_cast(resp.change_address().script_type()) , BinaryData::fromString(resp.change_address().out_hash()) , (uint32_t)resp.change_address().out_index() }; diff --git a/common b/common index 453f460a5..393322a0f 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 453f460a5c1db7e82057b7cc3f00c801c9f4cc51 +Subproject commit 393322a0f728e5c51c6ad464a885fc7d805a3f98 From 994b5366c3c59b73a7f7720c9bcaab7a6ecd2395 Mon Sep 17 00:00:00 2001 From: Marek Bronowicki Date: Thu, 15 Jun 2023 21:52:33 +0200 Subject: [PATCH 422/436] QtQuick app quickfix --- BlockSettleApp/macosapp.cpp | 26 ++++++++++++++++++++++++++ BlockSettleApp/macosapp.h | 26 ++++++++++++++++++++++++++ BlockSettleApp/main.cpp | 5 ++++- CMakeLists.txt | 34 +++++++++++++++++----------------- GUI/QtWidgets/QtGuiAdapter.cpp | 10 +++++++--- generate.py | 2 +- 6 files changed, 81 insertions(+), 22 deletions(-) create mode 100644 BlockSettleApp/macosapp.cpp create mode 100644 BlockSettleApp/macosapp.h diff --git a/BlockSettleApp/macosapp.cpp b/BlockSettleApp/macosapp.cpp new file mode 100644 index 000000000..728f06af7 --- /dev/null +++ b/BlockSettleApp/macosapp.cpp @@ -0,0 +1,26 @@ +#include +#include +#include "macosapp.h" + +MacOsApp::MacOsApp(int &argc, char **argv) : QApplication(argc, argv) +{ + // EMPTY CONSTRUCTOR +} +bool MacOsApp::event(QEvent* ev) +{ + if (ev->type() == QEvent::ApplicationStateChange) { + auto appStateEvent = static_cast(ev); + + if (appStateEvent->applicationState() == Qt::ApplicationActive) { + if (activationRequired_) { + emit reactivateTerminal(); + } else { + activationRequired_ = true; + } + } else { + activationRequired_ = false; + } + } + + return QApplication::event(ev); + } diff --git a/BlockSettleApp/macosapp.h b/BlockSettleApp/macosapp.h new file mode 100644 index 000000000..cecaa550e --- /dev/null +++ b/BlockSettleApp/macosapp.h @@ -0,0 +1,26 @@ +#ifndef __MACOSAPP_H__ +#define __MACOSAPP_H__ + +#include +#include +#include + +class MacOsApp : public QApplication +{ + Q_OBJECT +public: + using QApplication::QApplication; + MacOsApp(int &argc, char **argv); // : QApplication(argc, argv) {} +// ~MacOsApp() override = default; + +signals: + void reactivateTerminal(); + +protected: + bool event(QEvent* ev) override; + +private: + bool activationRequired_ = false; +}; + +#endif diff --git a/BlockSettleApp/main.cpp b/BlockSettleApp/main.cpp index 83b202d1b..b26271030 100644 --- a/BlockSettleApp/main.cpp +++ b/BlockSettleApp/main.cpp @@ -37,6 +37,8 @@ #include #include +#include "macosapp.h" + //#include "AppNap.h" #ifdef USE_QWindowsIntegrationPlugin @@ -90,7 +92,7 @@ Q_DECLARE_METATYPE(UTXO) #include #include - +/* class MacOsApp : public QApplication { Q_OBJECT @@ -124,6 +126,7 @@ class MacOsApp : public QApplication private: bool activationRequired_ = false; }; +*/ static void checkStyleSheet(QApplication &app) { diff --git a/CMakeLists.txt b/CMakeLists.txt index 6023e0605..bd2a570b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,7 +64,7 @@ ENDIF (PRODUCTION_BUILD) # Force 64-bit builds and min target for macOS. If the min target changes, # update generate.py too. if(APPLE) - set(CMAKE_OSX_DEPLOYMENT_TARGET 10.12 CACHE STRING "" FORCE) + set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15 CACHE STRING "" FORCE) set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "macOS architecture to build; 64-bit is expected" FORCE) endif(APPLE) @@ -341,22 +341,22 @@ IF( NOT LIBCP_LIB) ENDIF() INCLUDE_DIRECTORIES( ${LIBCP_INCLUDE_DIR} ) -SET(MPIR_PACKAGE_ROOT ${THIRD_PARTY_COMMON_DIR}/mpir) -SET(MPIR_LIB_DIR ${MPIR_PACKAGE_ROOT}/lib) -IF (WIN32) - SET(MPIR_LIB_NAME mpir) -ELSE(WIN32) -# SET(MPIR_LIB_DIR ${MPIR_PACKAGE_ROOT}/lib) - IF(BSTERMINAL_SHARED_LIBS) - SET(MPIR_LIB_NAME libgmp.so) - ELSE() - SET(MPIR_LIB_NAME libgmp.a) - ENDIF() -ENDIF(WIN32) -FIND_LIBRARY(MPIR_LIB NAMES ${MPIR_LIB_NAME} PATHS ${MPIR_LIB_DIR}) -IF( NOT MPIR_LIB) - MESSAGE( FATAL_ERROR "Could not find MPIR lib in ${MPIR_LIB_DIR}") -ENDIF() +#SET(MPIR_PACKAGE_ROOT ${THIRD_PARTY_COMMON_DIR}/mpir) +#SET(MPIR_LIB_DIR ${MPIR_PACKAGE_ROOT}/lib) +#IF (WIN32) +# SET(MPIR_LIB_NAME mpir) +#ELSE(WIN32) +## SET(MPIR_LIB_DIR ${MPIR_PACKAGE_ROOT}/lib) +# IF(BSTERMINAL_SHARED_LIBS) +# SET(MPIR_LIB_NAME libgmp.so) +# ELSE() +# SET(MPIR_LIB_NAME libgmp.a) +# ENDIF() +#ENDIF(WIN32) +#FIND_LIBRARY(MPIR_LIB NAMES ${MPIR_LIB_NAME} PATHS ${MPIR_LIB_DIR}) +#IF( NOT MPIR_LIB) +# MESSAGE( FATAL_ERROR "Could not find MPIR lib in ${MPIR_LIB_DIR}") +#ENDIF() SET(CURL_ROOT ${THIRD_PARTY_COMMON_DIR}/curl) diff --git a/GUI/QtWidgets/QtGuiAdapter.cpp b/GUI/QtWidgets/QtGuiAdapter.cpp index 3fffe4611..f0a275dce 100644 --- a/GUI/QtWidgets/QtGuiAdapter.cpp +++ b/GUI/QtWidgets/QtGuiAdapter.cpp @@ -11,6 +11,7 @@ #include "CommonTypes.h" #include "QtGuiAdapter.h" #include +#include #include #include #include @@ -35,10 +36,13 @@ #include "common.pb.h" #include "terminal.pb.h" +#include "../../BlockSettleApp/macosapp.h" + using namespace BlockSettle::Common; using namespace BlockSettle::Terminal; using namespace bs::message; +/* #if defined (Q_OS_MAC) class MacOsApp : public QApplication { @@ -74,7 +78,7 @@ class MacOsApp : public QApplication bool activationRequired_ = false; }; #endif // Q_OS_MAC - +*/ static void checkStyleSheet(QApplication &app) { @@ -212,8 +216,8 @@ void QtGuiAdapter::run(int &argc, char **argv) logger_->debug("[QtGuiAdapter::run] initial setup done"); #if defined (Q_OS_MAC) - MacOsApp *macApp = (MacOsApp*)(app); - QObject::connect(macApp, &MacOsApp::reactivateTerminal, mainWindow +// MacOsApp *macApp = &app; + QObject::connect(&app, &MacOsApp::reactivateTerminal, mainWindow_ , &bs::gui::qt::MainWindow::onReactivate); #endif bs::disableAppNap(); diff --git a/generate.py b/generate.py index c45d6002d..a40b6dfcf 100644 --- a/generate.py +++ b/generate.py @@ -1,4 +1,4 @@ -# +∑# # # *********************************************************************************** # * Copyright (C) 2018 - 2021, BlockSettle AB From dde0c077c1bdcde8f989183dad25065fb1609dc6 Mon Sep 17 00:00:00 2001 From: Marek Bronowicki Date: Fri, 16 Jun 2023 10:31:50 +0200 Subject: [PATCH 423/436] Suggestions from sergey fixed --- CMakeLists.txt | 20 ++++++++++---------- generate.py | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bd2a570b3..0a831fe8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -341,22 +341,22 @@ IF( NOT LIBCP_LIB) ENDIF() INCLUDE_DIRECTORIES( ${LIBCP_INCLUDE_DIR} ) -#SET(MPIR_PACKAGE_ROOT ${THIRD_PARTY_COMMON_DIR}/mpir) -#SET(MPIR_LIB_DIR ${MPIR_PACKAGE_ROOT}/lib) -#IF (WIN32) -# SET(MPIR_LIB_NAME mpir) +IF (WIN32) + SET(MPIR_PACKAGE_ROOT ${THIRD_PARTY_COMMON_DIR}/mpir) + SET(MPIR_LIB_DIR ${MPIR_PACKAGE_ROOT}/lib) + SET(MPIR_LIB_NAME mpir) + FIND_LIBRARY(MPIR_LIB NAMES ${MPIR_LIB_NAME} PATHS ${MPIR_LIB_DIR}) + IF( NOT MPIR_LIB) + MESSAGE( FATAL_ERROR "Could not find MPIR lib in ${MPIR_LIB_DIR}") + ENDIF() #ELSE(WIN32) -## SET(MPIR_LIB_DIR ${MPIR_PACKAGE_ROOT}/lib) +# SET(MPIR_LIB_DIR ${MPIR_PACKAGE_ROOT}/lib) # IF(BSTERMINAL_SHARED_LIBS) # SET(MPIR_LIB_NAME libgmp.so) # ELSE() # SET(MPIR_LIB_NAME libgmp.a) # ENDIF() -#ENDIF(WIN32) -#FIND_LIBRARY(MPIR_LIB NAMES ${MPIR_LIB_NAME} PATHS ${MPIR_LIB_DIR}) -#IF( NOT MPIR_LIB) -# MESSAGE( FATAL_ERROR "Could not find MPIR lib in ${MPIR_LIB_DIR}") -#ENDIF() +ENDIF(WIN32) SET(CURL_ROOT ${THIRD_PARTY_COMMON_DIR}/curl) diff --git a/generate.py b/generate.py index a40b6dfcf..c45d6002d 100644 --- a/generate.py +++ b/generate.py @@ -1,4 +1,4 @@ -∑# +# # # *********************************************************************************** # * Copyright (C) 2018 - 2021, BlockSettle AB From 901178b4e671fcbb44383776f1e3c53ac8fe4667 Mon Sep 17 00:00:00 2001 From: slava-gen <102287844+slava-gen@users.noreply.github.com> Date: Fri, 16 Jun 2023 08:34:56 +0000 Subject: [PATCH 424/436] update script for windows installer creation --- Deploy/Windows/bsterminal.nsi | 504 +++++++++++++++------------------- 1 file changed, 221 insertions(+), 283 deletions(-) diff --git a/Deploy/Windows/bsterminal.nsi b/Deploy/Windows/bsterminal.nsi index 7f1452401..15885ed1a 100644 --- a/Deploy/Windows/bsterminal.nsi +++ b/Deploy/Windows/bsterminal.nsi @@ -1,283 +1,221 @@ -Name "BlockSettle Terminal" -SetCompressor /SOLID lzma - -# General Symbol Definitions -!define COMPANY "BlockSettle AB" -!define URL http://blocksettle.com/ -!define VERSION "0.91.2" -!define PRODUCT_NAME "BlockSettle Terminal" - -# MultiUser Symbol Definitions -!define MULTIUSER_EXECUTIONLEVEL Highest -!define MULTIUSER_INSTALLMODE_COMMANDLINE -!define MULTIUSER_INSTALLMODE_INSTDIR BlockSettle -!define MULTIUSER_USE_PROGRAMFILES64 - -# MUI Symbol Definitions -!define MUI_ICON bs.ico -!define MUI_FINISHPAGE_NOAUTOCLOSE -!define MUI_STARTMENUPAGE_DEFAULTFOLDER BlockSettle -!define MUI_FINISHPAGE_RUN $INSTDIR\blocksettle.exe -!define MUI_UNICON bs.ico -!define MUI_UNFINISHPAGE_NOAUTOCLOSE - -# Included files -!include MultiUser.nsh -!include Sections.nsh -!include MUI2.nsh -!include logiclib.nsh -!include x64.nsh -!include "WordFunc.nsh" - -#BlockSettle Branding -!define MUI_UNWELCOMEFINISHPAGE_BITMAP "resources\nsis3-banner.bmp" ; -!define MUI_WELCOMEFINISHPAGE_BITMAP "resources\nsis3-banner.bmp" ; - -#language settings -!define MUI_LANGDLL_REGISTRY_ROOT SHELL_CONTEXT -!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language" -!define MUI_LANGDLL_ALLLANGUAGES -!define MUI_LANGDLL_ALWAYSSHOW - -# Variables -Var StartMenuGroup - -# Installer pages -!insertmacro MUI_PAGE_WELCOME -!insertmacro MUI_PAGE_LICENSE LICENSE -#!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "ComponentsLeave" -#!insertmacro MUI_PAGE_COMPONENTS -!insertmacro MUI_PAGE_DIRECTORY -!insertmacro MUI_PAGE_STARTMENU Application $StartMenuGroup -!insertmacro MUI_PAGE_INSTFILES -!insertmacro MUI_PAGE_FINISH -!insertmacro MUI_UNPAGE_CONFIRM -!insertmacro MUI_UNPAGE_INSTFILES - -# Installer languages -!insertmacro MUI_LANGUAGE English - -# Installer attributes -OutFile bsterminal_installer.exe -# No need to set InstallDir here, MultiUser init will set it ($PROGRAMFILES64 for admins, local app data for regular users) -# InstallDir "$PROGRAMFILES64\BlockSettle" -CRCCheck on -XPStyle on -Icon bs.ico -ShowInstDetails show -AutoCloseWindow true -LicenseData LICENSE -VIProductVersion "${VERSION}.0" -VIAddVersionKey ProductName "${PRODUCT_NAME}" -VIAddVersionKey ProductVersion "${VERSION}" -VIAddVersionKey CompanyName "${COMPANY}" -VIAddVersionKey CompanyWebsite "${URL}" -VIAddVersionKey Comments "" -VIAddVersionKey FileVersion "${VERSION}" -VIAddVersionKey FileDescription "BlockSettle Terminal Installer" -VIAddVersionKey LegalCopyright "Copyright (C) 2016-2019 BlockSettle AB" -UninstallIcon bs.ico -ShowUninstDetails show - -#registry key for unisntalling -!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" - -!macro CREATE_SMGROUP_SHORTCUT NAME PATH ARGS - Push "${ARGS}" - Push "${NAME}" - Push "${PATH}" - Call CreateSMGroupShortcut -!macroend - -# Component selection stuff -Section "Terminal" SEC_TERM -SectionEnd - -Section "Signer" SEC_SIGN -SectionEnd - -#LangString DESC_SEC_TERM ${LANG_ENGLISH} "Main terminal binary" -#LangString DESC_SEC_SIGN ${LANG_ENGLISH} "Signer process binary" - -!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${SEC_TERM} "Main terminal binary" - !insertmacro MUI_DESCRIPTION_TEXT ${SEC_SIGN} "Signer process binary" -!insertmacro MUI_FUNCTION_DESCRIPTION_END - -Function ComponentsLeave - SectionGetFlags ${SEC_TERM} $0 - StrCmp $0 1 End - SectionGetFlags ${SEC_SIGN} $0 - StrCmp $0 1 End - MessageBox MB_OK "You should select at least one component" - Abort - End: -FunctionEnd - -Section "install" - ${If} ${RunningX64} - SetOutPath $INSTDIR - RmDir /r $INSTDIR - SetOverwrite on - File ..\..\build_terminal\RelWithDebInfo\bin\RelWithDebInfo\libzmq-v141-mt-4_3_2.dll - File "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC\14.16.27012\x64\Microsoft.VC141.CRT\concrt140.dll" - File "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC\14.16.27012\x64\Microsoft.VC141.CRT\msvcp140.dll" - File "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC\14.16.27012\x64\Microsoft.VC141.CRT\msvcp140_1.dll" - File "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC\14.16.27012\x64\Microsoft.VC141.CRT\msvcp140_2.dll" - File "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC\14.16.27012\x64\Microsoft.VC141.CRT\vccorlib140.dll" - File "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC\14.16.27012\x64\Microsoft.VC141.CRT\vcruntime140.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-console-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-datetime-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-debug-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-errorhandling-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-file-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-file-l1-2-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-file-l2-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-handle-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-heap-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-interlocked-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-libraryloader-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-localization-l1-2-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-memory-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-namedpipe-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-processenvironment-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-processthreads-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-processthreads-l1-1-1.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-profile-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-rtlsupport-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-string-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-synch-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-synch-l1-2-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-sysinfo-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-timezone-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-core-util-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-conio-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-convert-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-environment-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-filesystem-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-heap-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-locale-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-math-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-multibyte-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-private-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-process-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-runtime-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-stdio-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-string-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-time-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\api-ms-win-crt-utility-l1-1-0.dll" - File "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64\ucrtbase.dll" -# ${If} ${SectionIsSelected} ${SEC_TERM} - File ..\..\build_terminal\RelWithDebInfo\bin\RelWithDebInfo\blocksettle.exe -# ${Endif} -# ${If} ${SectionIsSelected} ${SEC_SIGN} - File ..\..\build_terminal\RelWithDebInfo\bin\RelWithDebInfo\blocksettle_signer.exe -# ${Endif} - SetOutPath $INSTDIR\scripts -# File ..\..\Scripts\DealerAutoQuote.qml -# File ..\..\Scripts\RFQBot.qml - SetOutPath $INSTDIR - CreateShortcut "$DESKTOP\BlockSettle Terminal.lnk" $INSTDIR\blocksettle.exe - CreateShortcut "$DESKTOP\BlockSettle Signer.lnk" $INSTDIR\blocksettle_signer.exe - !insertmacro CREATE_SMGROUP_SHORTCUT "BlockSettle Terminal" "$INSTDIR\blocksettle.exe" "" - !insertmacro CREATE_SMGROUP_SHORTCUT "BlockSettle Signer" "$INSTDIR\blocksettle_signer.exe" "" - - WriteUninstaller $INSTDIR\uninstall.exe - !insertmacro MUI_STARTMENU_WRITE_BEGIN Application - SetOutPath $SMPROGRAMS\$StartMenuGroup - CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall.lnk" $INSTDIR\uninstall.exe - !insertmacro MUI_STARTMENU_WRITE_END - ${Else} - # 32 bit code - MessageBox MB_OK "You cannot install this version on a 32-bit system" - ${EndIf} -SectionEnd -#post install registry handling -Section -Post - #To be used when running the uninstaller - WriteRegStr SHELL_CONTEXT "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" - WriteRegStr SHELL_CONTEXT "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninstall.exe" -SectionEnd - - -# Uninstaller sections -!macro DELETE_SMGROUP_SHORTCUT NAME - Push "${NAME}" - Call un.DeleteSMGroupShortcut -!macroend - -Section "Uninstall" - Delete /REBOOTOK "$DESKTOP\BlockSettle Terminal.lnk" - Delete /REBOOTOK "$DESKTOP\BlockSettle Signer.lnk" - !insertmacro DELETE_SMGROUP_SHORTCUT "BlockSettle Terminal" - !insertmacro DELETE_SMGROUP_SHORTCUT "BlockSettle Signer" - Delete /REBOOTOK $INSTDIR\blocksettle.exe - Delete /REBOOTOK $INSTDIR\blocksettle_signer.exe - Delete /REBOOTOK $INSTDIR\libzmq-v141-mt-4_3_2.dll - Delete /REBOOTOK $INSTDIR\msvcp140.dll - Delete /REBOOTOK $INSTDIR\vcruntime140.dll - RmDir /r /REBOOTOK $INSTDIR - - Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall.lnk" - Delete /REBOOTOK $INSTDIR\uninstall.exe - RmDir /r /REBOOTOK $SMPROGRAMS\$StartMenuGroup - RmDir /r /REBOOTOK $INSTDIR - Push $R0 - StrCpy $R0 $StartMenuGroup 1 - StrCmp $R0 ">" no_smgroup - - DeleteRegKey SHELL_CONTEXT "${PRODUCT_UNINST_KEY}" -no_smgroup: - Pop $R0 -SectionEnd - -# Installer functions -Function .onInit - ; Avoid running the installer if BlockSettle Terminal Installer is already running, - System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${PRODUCT_NAME}InstMutex") i .r1 ?e' - Pop $R0 - StrCmp $R0 0 +3 - MessageBox MB_OK|MB_ICONEXCLAMATION \ - "The ${PRODUCT_NAME} Installer is already running." - Abort - - ClearErrors - - InitPluginsDir - !insertmacro MULTIUSER_INIT - -FunctionEnd - -Function CreateSMGroupShortcut - Exch $R0 ;PATH - Exch - Exch $R1 ;NAME - Exch 2 - Exch $R3 - Push $R2 - StrCpy $R2 $StartMenuGroup 1 - StrCmp $R2 ">" no_smgroup - SetOutPath $SMPROGRAMS\$StartMenuGroup - CreateShortcut "$SMPROGRAMS\$StartMenuGroup\$R1.lnk" $R0 $R3 -no_smgroup: - Pop $R2 - Pop $R1 - Pop $R0 -FunctionEnd - -# Uninstaller functions -Function un.onInit - !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup - !insertmacro MULTIUSER_UNINIT -FunctionEnd - -Function un.DeleteSMGroupShortcut - Exch $R1 ;NAME - Push $R2 - StrCpy $R2 $StartMenuGroup 1 - StrCmp $R2 ">" no_smgroup - Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\$R1.lnk" -no_smgroup: - Pop $R2 - Pop $R1 -FunctionEnd +Name "BlockSettle Terminal" +SetCompressor /SOLID lzma + +# General Symbol Definitions +!define COMPANY "BlockSettle AB" +!define URL http://blocksettle.com/ +!define VERSION "0.91.2" +!define PRODUCT_NAME "BlockSettle Terminal" + +# MultiUser Symbol Definitions +!define MULTIUSER_EXECUTIONLEVEL Highest +!define MULTIUSER_INSTALLMODE_COMMANDLINE +!define MULTIUSER_INSTALLMODE_INSTDIR BlockSettle +!define MULTIUSER_USE_PROGRAMFILES64 + +# MUI Symbol Definitions +!define MUI_ICON bs.ico +!define MUI_FINISHPAGE_NOAUTOCLOSE +!define MUI_STARTMENUPAGE_DEFAULTFOLDER BlockSettle +!define MUI_FINISHPAGE_RUN $INSTDIR\blocksettle.exe +!define MUI_UNICON bs.ico +!define MUI_UNFINISHPAGE_NOAUTOCLOSE + +# Included files +!include MultiUser.nsh +!include Sections.nsh +!include MUI2.nsh +!include logiclib.nsh +!include x64.nsh +!include "WordFunc.nsh" + +#BlockSettle Branding +!define MUI_UNWELCOMEFINISHPAGE_BITMAP "resources\nsis3-banner.bmp" ; +!define MUI_WELCOMEFINISHPAGE_BITMAP "resources\nsis3-banner.bmp" ; + +#language settings +!define MUI_LANGDLL_REGISTRY_ROOT SHELL_CONTEXT +!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language" +!define MUI_LANGDLL_ALLLANGUAGES +!define MUI_LANGDLL_ALWAYSSHOW + +# Variables +Var StartMenuGroup + +# Installer pages +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE LICENSE +#!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "ComponentsLeave" +#!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_STARTMENU Application $StartMenuGroup +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_PAGE_FINISH +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES + +# Installer languages +!insertmacro MUI_LANGUAGE English + +# Installer attributes +OutFile bsterminal_installer.exe +# No need to set InstallDir here, MultiUser init will set it ($PROGRAMFILES64 for admins, local app data for regular users) +# InstallDir "$PROGRAMFILES64\BlockSettle" +CRCCheck on +XPStyle on +Icon bs.ico +ShowInstDetails show +AutoCloseWindow true +LicenseData LICENSE +VIProductVersion "${VERSION}.0" +VIAddVersionKey ProductName "${PRODUCT_NAME}" +VIAddVersionKey ProductVersion "${VERSION}" +VIAddVersionKey CompanyName "${COMPANY}" +VIAddVersionKey CompanyWebsite "${URL}" +VIAddVersionKey Comments "" +VIAddVersionKey FileVersion "${VERSION}" +VIAddVersionKey FileDescription "BlockSettle Terminal Installer" +VIAddVersionKey LegalCopyright "Copyright (C) 2016-2023 BlockSettle AB" +UninstallIcon bs.ico +ShowUninstDetails show + +#registry key for unisntalling +!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" + +!macro CREATE_SMGROUP_SHORTCUT NAME PATH ARGS + Push "${ARGS}" + Push "${NAME}" + Push "${PATH}" + Call CreateSMGroupShortcut +!macroend + +# Component selection stuff +Section "Terminal" SEC_TERM +SectionEnd + + +#LangString DESC_SEC_TERM ${LANG_ENGLISH} "Main terminal binary" + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${SEC_TERM} "Main terminal binary" +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +Function ComponentsLeave + SectionGetFlags ${SEC_TERM} $0 + StrCmp $0 1 End + MessageBox MB_OK "You should select at least one component" + Abort + End: +FunctionEnd + +Section "install" + ${If} ${RunningX64} + SetOutPath $INSTDIR + RmDir /r $INSTDIR + SetOverwrite on +# ${If} ${SectionIsSelected} ${SEC_TERM} + File ..\..\build_terminal\RelWithDebInfo\bin\RelWithDebInfo\blocksettle.exe +# ${Endif} + SetOutPath $INSTDIR\scripts +# File ..\..\Scripts\DealerAutoQuote.qml +# File ..\..\Scripts\RFQBot.qml + SetOutPath $INSTDIR + CreateShortcut "$DESKTOP\BlockSettle Terminal.lnk" $INSTDIR\blocksettle.exe + !insertmacro CREATE_SMGROUP_SHORTCUT "BlockSettle Terminal" "$INSTDIR\blocksettle.exe" "" + + WriteUninstaller $INSTDIR\uninstall.exe + !insertmacro MUI_STARTMENU_WRITE_BEGIN Application + SetOutPath $SMPROGRAMS\$StartMenuGroup + CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall.lnk" $INSTDIR\uninstall.exe + !insertmacro MUI_STARTMENU_WRITE_END + ${Else} + # 32 bit code + MessageBox MB_OK "You cannot install this version on a 32-bit system" + ${EndIf} +SectionEnd +#post install registry handling +Section -Post + #To be used when running the uninstaller + WriteRegStr SHELL_CONTEXT "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" + WriteRegStr SHELL_CONTEXT "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninstall.exe" +SectionEnd + + +# Uninstaller sections +!macro DELETE_SMGROUP_SHORTCUT NAME + Push "${NAME}" + Call un.DeleteSMGroupShortcut +!macroend + +Section "Uninstall" + Delete /REBOOTOK "$DESKTOP\BlockSettle Terminal.lnk" + !insertmacro DELETE_SMGROUP_SHORTCUT "BlockSettle Terminal" + Delete /REBOOTOK $INSTDIR\blocksettle.exe + #Delete /REBOOTOK $INSTDIR\libzmq-v141-mt-4_3_2.dll + #Delete /REBOOTOK $INSTDIR\msvcp140.dll + #Delete /REBOOTOK $INSTDIR\vcruntime140.dll + RmDir /r /REBOOTOK $INSTDIR + + Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall.lnk" + Delete /REBOOTOK $INSTDIR\uninstall.exe + RmDir /r /REBOOTOK $SMPROGRAMS\$StartMenuGroup + RmDir /r /REBOOTOK $INSTDIR + Push $R0 + StrCpy $R0 $StartMenuGroup 1 + StrCmp $R0 ">" no_smgroup + + DeleteRegKey SHELL_CONTEXT "${PRODUCT_UNINST_KEY}" +no_smgroup: + Pop $R0 +SectionEnd + +# Installer functions +Function .onInit + ; Avoid running the installer if BlockSettle Terminal Installer is already running, + System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${PRODUCT_NAME}InstMutex") i .r1 ?e' + Pop $R0 + StrCmp $R0 0 +3 + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "The ${PRODUCT_NAME} Installer is already running." + Abort + + ClearErrors + + InitPluginsDir + !insertmacro MULTIUSER_INIT + +FunctionEnd + +Function CreateSMGroupShortcut + Exch $R0 ;PATH + Exch + Exch $R1 ;NAME + Exch 2 + Exch $R3 + Push $R2 + StrCpy $R2 $StartMenuGroup 1 + StrCmp $R2 ">" no_smgroup + SetOutPath $SMPROGRAMS\$StartMenuGroup + CreateShortcut "$SMPROGRAMS\$StartMenuGroup\$R1.lnk" $R0 $R3 +no_smgroup: + Pop $R2 + Pop $R1 + Pop $R0 +FunctionEnd + +# Uninstaller functions +Function un.onInit + !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup + !insertmacro MULTIUSER_UNINIT +FunctionEnd + +Function un.DeleteSMGroupShortcut + Exch $R1 ;NAME + Push $R2 + StrCpy $R2 $StartMenuGroup 1 + StrCmp $R2 ">" no_smgroup + Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\$R1.lnk" +no_smgroup: + Pop $R2 + Pop $R1 +FunctionEnd From 87c20e3d9c3bbd63c4b7e5a5247c30aa990eb82e Mon Sep 17 00:00:00 2001 From: slava-gen <102287844+slava-gen@users.noreply.github.com> Date: Fri, 16 Jun 2023 16:04:46 +0000 Subject: [PATCH 425/436] update dockerfile and deb package creation script --- Deploy/deploy.sh | 2 -- ubuntu.Dockerfile | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Deploy/deploy.sh b/Deploy/deploy.sh index 0c09acc77..0694a4a9d 100755 --- a/Deploy/deploy.sh +++ b/Deploy/deploy.sh @@ -19,7 +19,6 @@ rm -rf Ubuntu/usr/share/blocksettle/scripts mkdir -p Ubuntu/usr/share/blocksettle/scripts cp $binpath/blocksettle Ubuntu/usr/bin/ -cp $binpath/blocksettle_signer Ubuntu/usr/bin/ #cp $scriptpath/DealerAutoQuote.qml Ubuntu/usr/share/blocksettle/scripts/ #cp $scriptpath/RFQBot.qml Ubuntu/usr/share/blocksettle/scripts/ @@ -27,6 +26,5 @@ dpkg -b Ubuntu bsterminal.deb echo "deb package generated" rm -f Ubuntu/usr/bin/blocksettle -rm -f Ubuntu/usr/bin/blocksettle_signer rm -f Ubuntu/usr/share/blocksettle/scripts/* rm -f Ubuntu/lib/x86_64-linux-gnu/* diff --git a/ubuntu.Dockerfile b/ubuntu.Dockerfile index 254206be5..6d68d7c2b 100644 --- a/ubuntu.Dockerfile +++ b/ubuntu.Dockerfile @@ -32,3 +32,5 @@ RUN cd terminal.release \ RUN ls -la /app/build_terminal/RelWithDebInfo/bin +RUN cd Deploy \ + && ./deploy.sh From 2d8fc1d3f5f8c348ba49a29216693f9cda0d06ff Mon Sep 17 00:00:00 2001 From: Marek Bronowicki Date: Fri, 23 Jun 2023 18:04:29 +0200 Subject: [PATCH 426/436] Signature add --- BlockSettleApp/CMakeLists.txt | 25 ++++++++++++++++++++++++- generate.py | 10 ++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/BlockSettleApp/CMakeLists.txt b/BlockSettleApp/CMakeLists.txt index 576c70b33..c4edf5638 100644 --- a/BlockSettleApp/CMakeLists.txt +++ b/BlockSettleApp/CMakeLists.txt @@ -13,6 +13,8 @@ PROJECT( ${BLOCKSETTLE_APP_NAME} ) FILE(GLOB SOURCES *.cpp) FILE(GLOB HEADERS *.h) +include(CodeSign) + INCLUDE_DIRECTORIES( ${COMMON_UI_LIB_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${COMMON_LIB_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${BLOCKSETTLE_UI_INCLUDE_DIR} ) @@ -26,6 +28,8 @@ INCLUDE_DIRECTORIES( ${BOTAN_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${Qt5Svg_INCLUDE_DIRS} ) IF ( APPLE ) + include(Notarize) + SET( BUNDLE_NAME "BlockSettle Terminal" ) SET( MACOSX_BUNDLE_BUNDLE_NAME ${BUNDLE_NAME} ) @@ -41,12 +45,31 @@ IF ( APPLE ) SET_SOURCE_FILES_PROPERTIES( ${BS_TERMINAL_ICNS_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) ADD_EXECUTABLE( ${BLOCKSETTLE_APP_NAME} MACOSX_BUNDLE ${SOURCES} ${HEADERS} ${BS_TERMINAL_ICNS_FILE}) SET_TARGET_PROPERTIES( ${BLOCKSETTLE_APP_NAME} PROPERTIES OUTPUT_NAME "${BUNDLE_NAME}" ) -ELSEIF ( WIN32 ) + + code_sign_is_enabled(can_sign) + if (can_sign) + set(FILES_TO_SIGN "${EXECUTABLE_OUTPUT_PATH}/${BUNDLE_NAME}.app") + configure_file(../common/build_scripts/CMakeModules/CodeSignScript.cmake.in sign_app.cmake) + list(APPEND postpkg + COMMAND "${CMAKE_COMMAND}" -E echo "Code signing ${BUNDLE_NAME}.app" + COMMAND "${CMAKE_COMMAND}" -P "sign_app.cmake" + ) + add_custom_target(sign + ${postpkg} + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + VERBATIM + USES_TERMINAL + ) + endif () + + ELSEIF ( WIN32 ) ADD_EXECUTABLE( ${BLOCKSETTLE_APP_NAME} WIN32 ${SOURCES} ${HEADERS} blocksettle.rc ) ELSE () ADD_EXECUTABLE( ${BLOCKSETTLE_APP_NAME} ${SOURCES} ${HEADERS} ) ENDIF () + + TARGET_LINK_LIBRARIES( ${BLOCKSETTLE_APP_NAME} ${TERMINAL_CORE_NAME} ${BLOCKSETTLE_HW_LIBRARY_NAME} diff --git a/generate.py b/generate.py index c45d6002d..2471d5fae 100644 --- a/generate.py +++ b/generate.py @@ -43,7 +43,7 @@ from build_scripts.curl_settings import CurlSettings from build_scripts.websockets_settings import WebsocketsSettings -def generate_project(build_mode, link_mode, build_production, hide_warnings, cmake_flags, build_tests, build_tracker): +def generate_project(build_mode, link_mode, build_production, hide_warnings, cmake_flags, build_tests, build_tracker, signature_cert_name): project_settings = Settings(build_mode, link_mode) print('Build mode : {} ( {} )'.format(project_settings.get_build_mode(), ('Production' if build_production else 'Development'))) @@ -146,6 +146,8 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma if build_tracker: command.append('-DBUILD_TRACKER=1') + if signature_cert_name != None: + command.append(f'-DM_SIGN_CERT_NAME={signature_cert_name}') if cmake_flags != None: for flag in cmake_flags.split(): command.append(flag) @@ -202,6 +204,10 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma action='store', type=str, help='Additional CMake flags. Example: "-DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_FLAGS=-fuse-ld=gold"') + input_parser.add_argument('--signature-cert-name', + action='store', + type=str, + help='Signature certificate name Example: "Apple Distribution: FirstName LastName (XXXXXXXXXX)') input_parser.add_argument('--test', help='Select to also build tests', action='store_true') @@ -211,4 +217,4 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma args = input_parser.parse_args() - sys.exit(generate_project(args.build_mode, args.link_mode, args.build_production, args.hide_warnings, args.cmake_flags, args.test, args.tracker)) + sys.exit(generate_project(args.build_mode, args.link_mode, args.build_production, args.hide_warnings, args.cmake_flags, args.test, args.tracker, args.signature_cert_name)) From 34f1696644467ebbf5b23f3e43886f91f4a547b8 Mon Sep 17 00:00:00 2001 From: Marek Bronowicki Date: Sat, 24 Jun 2023 13:56:39 +0200 Subject: [PATCH 427/436] Linux AppImage generation and unordered_map fix for macos Monterey --- BlockSettleApp/CMakeLists.txt | 12 +++++++++++- CMakeLists.txt | 4 ++++ GUI/QtQuick/WalletBalancesModel.h | 1 + common | 2 +- generate.py | 13 ++++++++++--- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/BlockSettleApp/CMakeLists.txt b/BlockSettleApp/CMakeLists.txt index c4edf5638..7f0e1c78f 100644 --- a/BlockSettleApp/CMakeLists.txt +++ b/BlockSettleApp/CMakeLists.txt @@ -64,11 +64,21 @@ IF ( APPLE ) ELSEIF ( WIN32 ) ADD_EXECUTABLE( ${BLOCKSETTLE_APP_NAME} WIN32 ${SOURCES} ${HEADERS} blocksettle.rc ) + ELSE () ADD_EXECUTABLE( ${BLOCKSETTLE_APP_NAME} ${SOURCES} ${HEADERS} ) ENDIF () - +IF(UNIX AND NOT APPLE) + IF(BUILD_APPIMAGE) + configure_file(../common/build_scripts/CMakeModules/AppImageScript.cmake.in appimage.cmake) + ADD_CUSTOM_COMMAND(TARGET ${BLOCKSETTLE_APP_NAME} POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E echo "Building ${BUNDLE_NAME}.AppImage" + COMMAND "${CMAKE_COMMAND}" -P "appimage.cmake" + ) + ENDIF() +ENDIF() +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath='$ORIGIN'") TARGET_LINK_LIBRARIES( ${BLOCKSETTLE_APP_NAME} ${TERMINAL_CORE_NAME} diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a831fe8b..f97dd5a1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,10 @@ add_definitions(-DSTATIC_BUILD) add_definitions(-DSPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_DEBUG) add_definitions(-DBUILD_WALLETS) +IF(UNIX AND NOT APPLE) +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath='$ORIGIN'") +ENDIF() + IF(CMAKE_BUILD_TYPE STREQUAL "Debug") IF(BSTERMINAL_SHARED_LIBS) SET(THIRD_PARTY_BUILD_MODE "debug-shared") diff --git a/GUI/QtQuick/WalletBalancesModel.h b/GUI/QtQuick/WalletBalancesModel.h index 3711d1e45..06ad30ec1 100644 --- a/GUI/QtQuick/WalletBalancesModel.h +++ b/GUI/QtQuick/WalletBalancesModel.h @@ -16,6 +16,7 @@ #include #include #include +#include namespace spdlog { class logger; diff --git a/common b/common index 393322a0f..0b557fd21 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 393322a0f728e5c51c6ad464a885fc7d805a3f98 +Subproject commit 0b557fd211088a350ecaa431bd84881d549b666d diff --git a/generate.py b/generate.py index 2471d5fae..13c418d32 100644 --- a/generate.py +++ b/generate.py @@ -17,7 +17,7 @@ # Set the minimum macOS target environment. Applies to prereqs and to BS code. # If the min target changes, update CMakeLists.txt too. if sys.platform == "darwin": - os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.12' + os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.15' sys.path.insert(0, os.path.join('common')) sys.path.insert(0, os.path.join('common', 'build_scripts')) @@ -43,7 +43,7 @@ from build_scripts.curl_settings import CurlSettings from build_scripts.websockets_settings import WebsocketsSettings -def generate_project(build_mode, link_mode, build_production, hide_warnings, cmake_flags, build_tests, build_tracker, signature_cert_name): +def generate_project(build_mode, link_mode, build_production, hide_warnings, cmake_flags, build_tests, build_tracker, signature_cert_name, build_appimage): project_settings = Settings(build_mode, link_mode) print('Build mode : {} ( {} )'.format(project_settings.get_build_mode(), ('Production' if build_production else 'Development'))) @@ -143,6 +143,9 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma if build_tests: command.append('-DBUILD_TESTS=1') + if build_appimage: + command.append('-DBUILD_APPIMAGE=1') + if build_tracker: command.append('-DBUILD_TRACKER=1') @@ -208,6 +211,10 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma action='store', type=str, help='Signature certificate name Example: "Apple Distribution: FirstName LastName (XXXXXXXXXX)') + input_parser.add_argument('--appimage', + action='store_true', + dest='build_appimage', + help='Linux build AppImage file') input_parser.add_argument('--test', help='Select to also build tests', action='store_true') @@ -217,4 +224,4 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma args = input_parser.parse_args() - sys.exit(generate_project(args.build_mode, args.link_mode, args.build_production, args.hide_warnings, args.cmake_flags, args.test, args.tracker, args.signature_cert_name)) + sys.exit(generate_project(args.build_mode, args.link_mode, args.build_production, args.hide_warnings, args.cmake_flags, args.test, args.tracker, args.signature_cert_name, args.build_appimage)) From ea9521a98fdd3164fe70d1c4b8838e4adb0f1d00 Mon Sep 17 00:00:00 2001 From: Marek Bronowicki Date: Mon, 26 Jun 2023 16:35:19 +0200 Subject: [PATCH 428/436] libfuse add to dockerfile and nproc to make for faster compile --- ubuntu.Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ubuntu.Dockerfile b/ubuntu.Dockerfile index 254206be5..89939f358 100644 --- a/ubuntu.Dockerfile +++ b/ubuntu.Dockerfile @@ -11,7 +11,7 @@ RUN sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list \ # main libs && apt install -y python3 \ python3-pip cmake libmysqlclient-dev autoconf libtool yasm nasm libgmp3-dev libdouble-conversion-dev \ - qttools5-dev-tools libfreetype-dev libfontconfig-dev libcups2-dev xcb \ + qttools5-dev-tools libfreetype-dev libfontconfig-dev libcups2-dev xcb libfuse2 \ libx11-xcb-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-sync-dev libxcb-render-util0-dev libxcb-xfixes0-dev \ libxcb-xinerama0-dev libxcb-randr0-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-icccm4-dev libxcb-glx0-dev libxkbcommon-x11-dev \ libudev-dev libxi-dev libsm-dev libxrender-dev libdbus-1-dev \ @@ -25,10 +25,10 @@ WORKDIR app COPY . . -RUN python generate.py release +RUN python generate.py release --appimage RUN cd terminal.release \ - && make + && make -j$(nproc) RUN ls -la /app/build_terminal/RelWithDebInfo/bin From 8f12993e6816e92064bd1ba98f0a71f3a6d3f8f7 Mon Sep 17 00:00:00 2001 From: Marek Bronowicki Date: Mon, 26 Jun 2023 20:02:37 +0200 Subject: [PATCH 429/436] Building witch docker run, not docker build --- build.sh | 4 ++++ ubuntu.Dockerfile | 14 +++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100755 build.sh diff --git a/build.sh b/build.sh new file mode 100755 index 000000000..d8fa74f99 --- /dev/null +++ b/build.sh @@ -0,0 +1,4 @@ +#!/bin/bash +python generate.py release --appimage +cd terminal.release +make -j$(nproc) diff --git a/ubuntu.Dockerfile b/ubuntu.Dockerfile index 89939f358..4561babea 100644 --- a/ubuntu.Dockerfile +++ b/ubuntu.Dockerfile @@ -11,7 +11,7 @@ RUN sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list \ # main libs && apt install -y python3 \ python3-pip cmake libmysqlclient-dev autoconf libtool yasm nasm libgmp3-dev libdouble-conversion-dev \ - qttools5-dev-tools libfreetype-dev libfontconfig-dev libcups2-dev xcb libfuse2 \ + qttools5-dev-tools libfreetype-dev libfontconfig-dev libcups2-dev xcb fuse libfuse2 \ libx11-xcb-dev libxcb-xkb-dev libxcb-xinput-dev libxcb-sync-dev libxcb-render-util0-dev libxcb-xfixes0-dev \ libxcb-xinerama0-dev libxcb-randr0-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-icccm4-dev libxcb-glx0-dev libxkbcommon-x11-dev \ libudev-dev libxi-dev libsm-dev libxrender-dev libdbus-1-dev \ @@ -25,10 +25,14 @@ WORKDIR app COPY . . -RUN python generate.py release --appimage +CMD ["/app/build.sh"] -RUN cd terminal.release \ - && make -j$(nproc) -RUN ls -la /app/build_terminal/RelWithDebInfo/bin +### OLD STYLE BUILDING +#RUN python generate.py release --appimage +# +#RUN cd terminal.release \ +# && make -j$(nproc) +# +#RUN ls -la /app/build_terminal/RelWithDebInfo/bin From d8267635da44dd492709e07b70d3e40c5884fd4c Mon Sep 17 00:00:00 2001 From: Marek Bronowicki Date: Tue, 27 Jun 2023 08:54:35 +0200 Subject: [PATCH 430/436] sergey comment fix https://github.com/BlockSettle/terminal/pull/1105#discussion_r1242644942 --- BlockSettleApp/CMakeLists.txt | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/BlockSettleApp/CMakeLists.txt b/BlockSettleApp/CMakeLists.txt index 7f0e1c78f..b09622a0f 100644 --- a/BlockSettleApp/CMakeLists.txt +++ b/BlockSettleApp/CMakeLists.txt @@ -61,15 +61,9 @@ IF ( APPLE ) USES_TERMINAL ) endif () - - ELSEIF ( WIN32 ) - ADD_EXECUTABLE( ${BLOCKSETTLE_APP_NAME} WIN32 ${SOURCES} ${HEADERS} blocksettle.rc ) -ELSE () +ELSEIF(UNIX AND NOT APPLE) ADD_EXECUTABLE( ${BLOCKSETTLE_APP_NAME} ${SOURCES} ${HEADERS} ) -ENDIF () - -IF(UNIX AND NOT APPLE) IF(BUILD_APPIMAGE) configure_file(../common/build_scripts/CMakeModules/AppImageScript.cmake.in appimage.cmake) ADD_CUSTOM_COMMAND(TARGET ${BLOCKSETTLE_APP_NAME} POST_BUILD @@ -77,7 +71,15 @@ IF(UNIX AND NOT APPLE) COMMAND "${CMAKE_COMMAND}" -P "appimage.cmake" ) ENDIF() -ENDIF() + +ELSEIF ( WIN32 ) + ADD_EXECUTABLE( ${BLOCKSETTLE_APP_NAME} WIN32 ${SOURCES} ${HEADERS} blocksettle.rc ) + +ELSE () + ADD_EXECUTABLE( ${BLOCKSETTLE_APP_NAME} ${SOURCES} ${HEADERS} ) + +ENDIF () + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath='$ORIGIN'") TARGET_LINK_LIBRARIES( ${BLOCKSETTLE_APP_NAME} From edcdd16f2975ee4d3f08c28499df08fc2089675a Mon Sep 17 00:00:00 2001 From: slava-gen <102287844+slava-gen@users.noreply.github.com> Date: Tue, 27 Jun 2023 08:47:34 +0000 Subject: [PATCH 431/436] fix cicd in part of deb package creations --- ubuntu.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ubuntu.Dockerfile b/ubuntu.Dockerfile index 94b2f058f..2976caa54 100644 --- a/ubuntu.Dockerfile +++ b/ubuntu.Dockerfile @@ -36,5 +36,5 @@ CMD ["/app/build.sh"] # #RUN ls -la /app/build_terminal/RelWithDebInfo/bin -RUN cd Deploy \ - && ./deploy.sh +#RUN cd Deploy \ +# && ./deploy.sh From 2cc2a05e8bfa927560e7c6c876281e93387aaa21 Mon Sep 17 00:00:00 2001 From: slava-gen <102287844+slava-gen@users.noreply.github.com> Date: Thu, 20 Jul 2023 09:38:13 +0000 Subject: [PATCH 432/436] make CodeSign APPLE exclusive --- BlockSettleApp/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/BlockSettleApp/CMakeLists.txt b/BlockSettleApp/CMakeLists.txt index b09622a0f..d92582688 100644 --- a/BlockSettleApp/CMakeLists.txt +++ b/BlockSettleApp/CMakeLists.txt @@ -13,8 +13,6 @@ PROJECT( ${BLOCKSETTLE_APP_NAME} ) FILE(GLOB SOURCES *.cpp) FILE(GLOB HEADERS *.h) -include(CodeSign) - INCLUDE_DIRECTORIES( ${COMMON_UI_LIB_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${COMMON_LIB_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${BLOCKSETTLE_UI_INCLUDE_DIR} ) @@ -28,6 +26,7 @@ INCLUDE_DIRECTORIES( ${BOTAN_INCLUDE_DIR} ) INCLUDE_DIRECTORIES( ${Qt5Svg_INCLUDE_DIRS} ) IF ( APPLE ) + include(CodeSign) include(Notarize) SET( BUNDLE_NAME "BlockSettle Terminal" ) From 9d94b784df17dcd4aac387b19d616db914ec8697 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Tue, 21 Nov 2023 18:08:22 +0300 Subject: [PATCH 433/436] merged common/bs_dev --- .../Settings/ArmoryServersViewModel.cpp | 10 ++-- .../Settings/ArmoryServersWidget.cpp | 34 +++++------ .../Settings/NetworkSettingsPage.cpp | 6 +- Core/ArmoryServersProvider.cpp | 59 ++++++++++--------- Core/SettingsAdapter.cpp | 42 +++++++------ GUI/QtQuick/AddressFilterModel.cpp | 10 ++-- GUI/QtQuick/ArmoryServersModel.cpp | 45 +++++++------- GUI/QtQuick/QtQuickAdapter.cpp | 47 ++++++++++----- GUI/QtQuick/QtQuickAdapter.h | 5 +- GUI/QtWidgets/QtGuiAdapter.cpp | 21 ++++--- UnitTests/MockTerminal.cpp | 20 +++---- UnitTests/TestEnv.cpp | 6 +- common | 2 +- 13 files changed, 165 insertions(+), 142 deletions(-) diff --git a/BlockSettleUILib/Settings/ArmoryServersViewModel.cpp b/BlockSettleUILib/Settings/ArmoryServersViewModel.cpp index a3ec241f4..c0c174186 100644 --- a/BlockSettleUILib/Settings/ArmoryServersViewModel.cpp +++ b/BlockSettleUILib/Settings/ArmoryServersViewModel.cpp @@ -56,19 +56,19 @@ QVariant ArmoryServersViewModel::data(const QModelIndex &index, int role) const switch (index.column()) { case ColumnName: if (singleColumnMode_) { - return QStringLiteral("%1 (%2)").arg(server.name).arg(serverNetType); + return QStringLiteral("%1 (%2)").arg(QString::fromStdString(server.name)).arg(serverNetType); } else { - return server.name; + return QString::fromStdString(server.name); } case ColumnType: return serverNetType; case ColumnAddress: - return server.armoryDBIp; + return QString::fromStdString(server.armoryDBIp); case ColumnPort: - return server.armoryDBPort; + return QString::fromStdString(server.armoryDBPort); case ColumnKey: - return server.armoryDBKey; + return QString::fromStdString(server.armoryDBKey); default: break; } diff --git a/BlockSettleUILib/Settings/ArmoryServersWidget.cpp b/BlockSettleUILib/Settings/ArmoryServersWidget.cpp index 89a7eb477..03aba190b 100644 --- a/BlockSettleUILib/Settings/ArmoryServersWidget.cpp +++ b/BlockSettleUILib/Settings/ArmoryServersWidget.cpp @@ -198,11 +198,11 @@ void ArmoryServersWidget::onAddServer() return; ArmoryServer server; - server.name = ui_->lineEditName->text(); + server.name = ui_->lineEditName->text().toStdString(); server.netType = static_cast(ui_->comboBoxNetworkType->currentIndex() - 1); - server.armoryDBIp = ui_->lineEditAddress->text(); - server.armoryDBPort = ui_->spinBoxPort->value(); - server.armoryDBKey = ui_->lineEditKey->text(); + server.armoryDBIp = ui_->lineEditAddress->text().toStdString(); + server.armoryDBPort = std::to_string(ui_->spinBoxPort->value()); + server.armoryDBKey = ui_->lineEditKey->text().toStdString(); if (armoryServersProvider_) { bool ok = armoryServersProvider_->add(server); @@ -261,11 +261,11 @@ void ArmoryServersWidget::onEdit() ui_->stackedWidgetAddSave->setCurrentWidget(ui_->pageSaveServerButton); - ui_->lineEditName->setText(server.name); + ui_->lineEditName->setText(QString::fromStdString(server.name)); ui_->comboBoxNetworkType->setCurrentIndex(static_cast(server.netType) + 1); - ui_->lineEditAddress->setText(server.armoryDBIp); - ui_->spinBoxPort->setValue(server.armoryDBPort); - ui_->lineEditKey->setText(server.armoryDBKey); + ui_->lineEditAddress->setText(QString::fromStdString(server.armoryDBIp)); + ui_->spinBoxPort->setValue(std::stoi(server.armoryDBPort)); + ui_->lineEditKey->setText(QString::fromStdString(server.armoryDBKey)); } void ArmoryServersWidget::onSelect() @@ -290,11 +290,11 @@ void ArmoryServersWidget::onSave() } ArmoryServer server; - server.name = ui_->lineEditName->text(); + server.name = ui_->lineEditName->text().toStdString(); server.netType = static_cast(ui_->comboBoxNetworkType->currentIndex() - 1); - server.armoryDBIp = ui_->lineEditAddress->text(); - server.armoryDBPort = ui_->spinBoxPort->value(); - server.armoryDBKey = ui_->lineEditKey->text(); + server.armoryDBIp = ui_->lineEditAddress->text().toStdString(); + server.armoryDBPort = std::to_string(ui_->spinBoxPort->value()); + server.armoryDBKey = ui_->lineEditKey->text().toStdString(); if (armoryServersProvider_) { bool ok = armoryServersProvider_->replace(index, server); @@ -397,14 +397,14 @@ void ArmoryServersWidget::onFormChanged() bool valid = false; if (acceptable) { ArmoryServer armoryHost; - armoryHost.name = ui_->lineEditName->text(); - armoryHost.armoryDBIp = ui_->lineEditAddress->text(); - armoryHost.armoryDBPort = ui_->spinBoxPort->value(); - armoryHost.armoryDBKey = ui_->lineEditKey->text(); + armoryHost.name = ui_->lineEditName->text().toStdString(); + armoryHost.armoryDBIp = ui_->lineEditAddress->text().toStdString(); + armoryHost.armoryDBPort = std::to_string(ui_->spinBoxPort->value()); + armoryHost.armoryDBKey = ui_->lineEditKey->text().toStdString(); valid = armoryHost.isValid(); if (valid) { if (armoryServersProvider_) { - exists = armoryServersProvider_->indexOf(armoryHost.name) != -1 + exists = armoryServersProvider_->indexOf(QString::fromStdString(armoryHost.name)) != -1 || armoryServersProvider_->indexOf(armoryHost) != -1; } else { diff --git a/BlockSettleUILib/Settings/NetworkSettingsPage.cpp b/BlockSettleUILib/Settings/NetworkSettingsPage.cpp index 7ed6defc2..999a2b33c 100644 --- a/BlockSettleUILib/Settings/NetworkSettingsPage.cpp +++ b/BlockSettleUILib/Settings/NetworkSettingsPage.cpp @@ -199,9 +199,9 @@ void NetworkSettingsPage::displayArmorySettings() // display info of connected server ui_->labelArmoryServerNetwork->setText(connectedServerSettings.netType == NetworkType::MainNet ? tr("MainNet") : tr("TestNet")); - ui_->labelArmoryServerAddress->setText(connectedServerSettings.armoryDBIp); - ui_->labelArmoryServerPort->setText(QString::number(connectedServerSettings.armoryDBPort)); - ui_->labelArmoryServerKey->setText(connectedServerSettings.armoryDBKey); + ui_->labelArmoryServerAddress->setText(QString::fromStdString(connectedServerSettings.armoryDBIp)); + ui_->labelArmoryServerPort->setText(QString::fromStdString(connectedServerSettings.armoryDBPort)); + ui_->labelArmoryServerKey->setText(QString::fromStdString(connectedServerSettings.armoryDBKey)); // display tip if configuration was changed if (selectedServerIndex != connectedServerIndex diff --git a/Core/ArmoryServersProvider.cpp b/Core/ArmoryServersProvider.cpp index 8f49e1858..5eddd63c0 100644 --- a/Core/ArmoryServersProvider.cpp +++ b/Core/ArmoryServersProvider.cpp @@ -29,8 +29,8 @@ namespace { } // namespace const std::vector ArmoryServersProvider::defaultServers_ = { - ArmoryServer::fromTextSettings(QStringLiteral(ARMORY_BLOCKSETTLE_NAME":0:mainnet.blocksettle.com:9003:")), - ArmoryServer::fromTextSettings(QStringLiteral(ARMORY_BLOCKSETTLE_NAME":1:testnet.blocksettle.com:19003:")), + ArmoryServer::fromTextSettings(ARMORY_BLOCKSETTLE_NAME":0:mainnet.blocksettle.com:9003:"), + ArmoryServer::fromTextSettings(ARMORY_BLOCKSETTLE_NAME":1:testnet.blocksettle.com:19003:"), /* ArmoryServer::fromTextSettings(kEnableLocalAutostart ? QStringLiteral("%1:0:127.0.0.1::").arg(QObject::tr("Local Auto-launch Node")) : QStringLiteral("%1:0:127.0.0.1::").arg(QObject::tr("Local BlockSettleDB Node"))), @@ -74,7 +74,7 @@ std::vector ArmoryServersProvider::servers() const servers.push_back(localTestNet);*/ for (const QString &srv : userServers) { - servers.push_back(ArmoryServer::fromTextSettings(srv)); + servers.push_back(ArmoryServer::fromTextSettings(srv.toStdString())); } return servers; } @@ -84,8 +84,8 @@ ArmorySettings ArmoryServersProvider::getArmorySettings() const ArmorySettings settings; settings.netType = appSettings_->get(ApplicationSettings::netType); - settings.armoryDBIp = appSettings_->get(ApplicationSettings::armoryDbIp); - settings.armoryDBPort = appSettings_->GetArmoryRemotePort(); + settings.armoryDBIp = appSettings_->get(ApplicationSettings::armoryDbIp); + settings.armoryDBPort = std::to_string(appSettings_->GetArmoryRemotePort()); settings.runLocally = appSettings_->get(ApplicationSettings::runArmoryLocally); const int serverIndex = indexOf(static_cast(settings)); @@ -95,10 +95,10 @@ ArmorySettings ArmoryServersProvider::getArmorySettings() const settings.socketType = appSettings_->GetArmorySocketType(); - settings.armoryExecutablePath = QDir::cleanPath(appSettings_->get(ApplicationSettings::armoryPathName)); - settings.dbDir = appSettings_->GetDBDir(); - settings.bitcoinBlocksDir = appSettings_->GetBitcoinBlocksDir(); - settings.dataDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + settings.armoryExecutablePath = QDir::cleanPath(appSettings_->get(ApplicationSettings::armoryPathName)).toStdString(); + settings.dbDir = appSettings_->GetDBDir().toStdString(); + settings.bitcoinBlocksDir = appSettings_->GetBitcoinBlocksDir().toStdString(); + settings.dataDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation).toStdString(); return settings; } @@ -118,7 +118,7 @@ int ArmoryServersProvider::indexOf(const QString &name) const // naive implementation const auto& s = servers(); for (int i = 0; i < s.size(); ++i) { - if (s.at(i).name == name) { + if (s.at(i).name == name.toStdString()) { return i; } } @@ -134,7 +134,7 @@ int ArmoryServersProvider::indexOf(const ArmoryServer &server) const , i, s.name.toStdString(), server.name.toStdString(), (int)s.netType , (int)server.netType, s.armoryDBIp.toStdString() , server.armoryDBIp.toStdString(), s.armoryDBPort, server.armoryDBPort);*/ - if ((server.name.isEmpty() || (s.name == server.name)) && (s.netType == server.netType) + if ((server.name.empty() || (s.name == server.name)) && (s.netType == server.netType) && (s.armoryDBIp == server.armoryDBIp) && (s.armoryDBPort == server.armoryDBPort)) { return i; } @@ -151,7 +151,8 @@ int ArmoryServersProvider::indexOfIpPort(const std::string &srvIPPort) const } for (int i = 0; i < servers().size(); ++i) { - if (servers().at(i).armoryDBIp == ipPortList.at(0) && servers().at(i).armoryDBPort == ipPortList.at(1).toInt()) { + if ((servers().at(i).armoryDBIp == ipPortList.at(0).toStdString()) + && (servers().at(i).armoryDBPort == ipPortList.at(1).toStdString())) { return i; } } @@ -170,10 +171,14 @@ int ArmoryServersProvider::getIndexOfTestNetServer() bool ArmoryServersProvider::add(const ArmoryServer &server) { - if (server.armoryDBPort < 1 || server.armoryDBPort > USHRT_MAX) { + if (server.armoryDBPort.empty()) { return false; } - if (server.name.isEmpty()) { + const int armoryPort = std::stoi(server.armoryDBPort); + if (armoryPort < 1 || armoryPort > USHRT_MAX) { + return false; + } + if (server.name.empty()) { return false; } @@ -192,17 +197,14 @@ bool ArmoryServersProvider::add(const ArmoryServer &server) QStringList serversTxt = appSettings_->get(ApplicationSettings::armoryServers); - serversTxt.append(server.toTextSettings()); + serversTxt.append(QString::fromStdString(server.toTextSettings())); appSettings_->set(ApplicationSettings::armoryServers, serversTxt); return true; } bool ArmoryServersProvider::replace(int index, const ArmoryServer &server) { - if (server.armoryDBPort < 1 || server.armoryDBPort > USHRT_MAX) { - return false; - } - if (server.name.isEmpty()) { + if (server.armoryDBPort.empty() || server.name.empty()) { return false; } if (index < kDefaultServersCount) { @@ -234,7 +236,7 @@ bool ArmoryServersProvider::replace(int index, const ArmoryServer &server) return false; } - serversTxt.replace(index - kDefaultServersCount, server.toTextSettings()); + serversTxt.replace(index - kDefaultServersCount, QString::fromStdString(server.toTextSettings())); appSettings_->set(ApplicationSettings::armoryServers, serversTxt); return true; } @@ -262,10 +264,10 @@ NetworkType ArmoryServersProvider::setupServer(int index) NetworkType netType{ NetworkType::Invalid }; const auto& srvList = servers(); if (index >= 0 && index < srvList.size()) { - ArmoryServer server = srvList.at(index); - appSettings_->set(ApplicationSettings::armoryDbName, server.name); - appSettings_->set(ApplicationSettings::armoryDbIp, server.armoryDBIp); - appSettings_->set(ApplicationSettings::armoryDbPort, server.armoryDBPort); + const auto& server = srvList.at(index); + appSettings_->set(ApplicationSettings::armoryDbName, QString::fromStdString(server.name)); + appSettings_->set(ApplicationSettings::armoryDbIp, QString::fromStdString(server.armoryDBIp)); + appSettings_->set(ApplicationSettings::armoryDbPort, QString::fromStdString(server.armoryDBPort)); appSettings_->set(ApplicationSettings::netType, static_cast(server.netType)); appSettings_->set(ApplicationSettings::runArmoryLocally, server.runLocally); netType = server.netType; @@ -279,7 +281,8 @@ int ArmoryServersProvider::addKey(const QString &address, int port, const QStrin // find server int index = -1; for (int i = 0; i < servers().size(); ++i) { - if (servers().at(i).armoryDBIp == address && servers().at(i).armoryDBPort == port) { + if ((servers().at(i).armoryDBIp == address.toStdString()) + && (servers().at(i).armoryDBPort == std::to_string(port))) { index = i; break; } @@ -295,9 +298,9 @@ int ArmoryServersProvider::addKey(const QString &address, int port, const QStrin QStringList servers = appSettings_->get(ApplicationSettings::armoryServers); QString serverTxt = servers.at(index - ArmoryServersProvider::kDefaultServersCount); - ArmoryServer server = ArmoryServer::fromTextSettings(serverTxt); - server.armoryDBKey = key; - servers[index - ArmoryServersProvider::kDefaultServersCount] = server.toTextSettings(); + ArmoryServer server = ArmoryServer::fromTextSettings(serverTxt.toStdString()); + server.armoryDBKey = key.toStdString(); + servers[index - ArmoryServersProvider::kDefaultServersCount] = QString::fromStdString(server.toTextSettings()); appSettings_->set(ApplicationSettings::armoryServers, servers); return index; diff --git a/Core/SettingsAdapter.cpp b/Core/SettingsAdapter.cpp index 22d77eff3..d432d86be 100644 --- a/Core/SettingsAdapter.cpp +++ b/Core/SettingsAdapter.cpp @@ -146,17 +146,18 @@ void SettingsAdapter::sendSettings(const ArmorySettings& armorySettings, bool ne armoryServersProvider_->setConnectedArmorySettings(armorySettings); msgResp->set_socket_type(armorySettings.socketType); msgResp->set_network_type((int)armorySettings.netType); - msgResp->set_host(armorySettings.armoryDBIp.toStdString()); - msgResp->set_port(std::to_string(armorySettings.armoryDBPort)); - msgResp->set_bip15x_key(armorySettings.armoryDBKey.toStdString()); + msgResp->set_host(armorySettings.armoryDBIp); + msgResp->set_port(armorySettings.armoryDBPort); + msgResp->set_bip15x_key(armorySettings.armoryDBKey); msgResp->set_run_locally(armorySettings.runLocally); - msgResp->set_data_dir(armorySettings.dataDir.toStdString()); - msgResp->set_executable_path(armorySettings.armoryExecutablePath.toStdString()); - msgResp->set_bitcoin_dir(armorySettings.bitcoinBlocksDir.toStdString()); - msgResp->set_db_dir(armorySettings.dbDir.toStdString()); + msgResp->set_data_dir(armorySettings.dataDir); + msgResp->set_executable_path(armorySettings.armoryExecutablePath); + msgResp->set_bitcoin_dir(armorySettings.bitcoinBlocksDir); + msgResp->set_db_dir(armorySettings.dbDir); msgResp->set_cache_file_name(appSettings_->get(ApplicationSettings::txCacheFileName)); pushRequest(user_, bs::message::UserTerminal::create(bs::message::TerminalUsers::Blockchain) , msg.SerializeAsString(), {}, 3, std::chrono::seconds{10}); + logger_->debug("[{}] {}", __func__, msg.DebugString()); } if (netTypeChanged) { logger_->debug("[{}] network type changed - reloading wallets", __func__); @@ -505,7 +506,7 @@ ProcessingResult SettingsAdapter::processArmoryServer(const BlockSettle::Termina { int selIndex = 0; for (const auto &server : armoryServersProvider_->servers()) { - if ((server.name == QString::fromStdString(request.server_name())) + if ((server.name == request.server_name()) && (server.netType == static_cast(request.network_type()))) { break; } @@ -532,10 +533,13 @@ ProcessingResult SettingsAdapter::processSetArmoryServer(const bs::message::Enve logger_->error("[{}] Failed to setup server #{}", __func__, index); return ProcessingResult::Error; } - appSettings_->selectNetwork(); - logger_->debug("[{}] net {} selected", __func__ - , (int)appSettings_->get(ApplicationSettings::Setting::netType)); - sendSettings(armoryServersProvider_->getArmorySettings(), (prevNetType != newNetType)); + const bool netTypeChanged = newNetType != prevNetType; + if (netTypeChanged) { + appSettings_->selectNetwork(); + logger_->debug("[{}] net {} selected", __func__ + , (int)appSettings_->get(ApplicationSettings::Setting::netType)); + } + sendSettings(armoryServersProvider_->getArmorySettings(), netTypeChanged); return ProcessingResult::Success; } @@ -548,10 +552,10 @@ ProcessingResult SettingsAdapter::processGetArmoryServers(const bs::message::Env for (const auto& server : armoryServersProvider_->servers()) { auto msgSrv = msgResp->add_servers(); msgSrv->set_network_type((int)server.netType); - msgSrv->set_server_name(server.name.toStdString()); - msgSrv->set_server_address(server.armoryDBIp.toStdString()); - msgSrv->set_server_port(std::to_string(server.armoryDBPort)); - msgSrv->set_server_key(server.armoryDBKey.toStdString()); + msgSrv->set_server_name(server.name); + msgSrv->set_server_address(server.armoryDBIp); + msgSrv->set_server_port(server.armoryDBPort); + msgSrv->set_server_key(server.armoryDBKey); msgSrv->set_run_locally(server.runLocally); msgSrv->set_one_way_auth(server.oneWayAuth_); msgSrv->set_password(server.password.toBinStr()); @@ -563,11 +567,11 @@ ProcessingResult SettingsAdapter::processGetArmoryServers(const bs::message::Env static ArmoryServer fromMessage(const SettingsMessage_ArmoryServer& msg) { ArmoryServer result; - result.name = QString::fromStdString(msg.server_name()); + result.name = msg.server_name(); result.netType = static_cast(msg.network_type()); - result.armoryDBIp = QString::fromStdString(msg.server_address()); + result.armoryDBIp = msg.server_address(); result.armoryDBPort = std::stoi(msg.server_port()); - result.armoryDBKey = QString::fromStdString(msg.server_key()); + result.armoryDBKey = msg.server_key(); result.password = SecureBinaryData::fromString(msg.password()); result.runLocally = msg.run_locally(); result.oneWayAuth_ = msg.one_way_auth(); diff --git a/GUI/QtQuick/AddressFilterModel.cpp b/GUI/QtQuick/AddressFilterModel.cpp index dbcda38a8..a1585bd3b 100644 --- a/GUI/QtQuick/AddressFilterModel.cpp +++ b/GUI/QtQuick/AddressFilterModel.cpp @@ -86,14 +86,16 @@ bool AddressFilterModel::lessThan(const QModelIndex& left, const QModelIndex& ri , QmlAddressListModel::TableRoles::TableDataRole).toDouble(); const auto leftIndex = sourceModel()->data(sourceModel()->index(left.row(), 0) , QmlAddressListModel::TableRoles::AddressTypeRole).toString().remove(0, 2).toInt(); - const auto leftType = sourceModel()->data(sourceModel()->index(left.row(), 0) - , QmlAddressListModel::TableRoles::AddressTypeRole).toString().at(0); + const auto leftTypeStr = sourceModel()->data(sourceModel()->index(left.row(), 0) + , QmlAddressListModel::TableRoles::AddressTypeRole).toString(); const auto rightAmount = sourceModel()->data(sourceModel()->index(right.row(), 2) , QmlAddressListModel::TableRoles::TableDataRole).toDouble(); const auto rightIndex = sourceModel()->data(sourceModel()->index(right.row(), 0) , QmlAddressListModel::TableRoles::AddressTypeRole).toString().remove(0, 2).toInt(); - const auto rightType = sourceModel()->data(sourceModel()->index(right.row(), 0) - , QmlAddressListModel::TableRoles::AddressTypeRole).toString().at(0); + const auto rightTypeStr = sourceModel()->data(sourceModel()->index(right.row(), 0) + , QmlAddressListModel::TableRoles::AddressTypeRole).toString(); + const auto leftType = leftTypeStr.isEmpty() ? 0 : leftTypeStr.at(0); + const auto rightType = rightTypeStr.isEmpty() ? 0 : rightTypeStr.at(0); return (!qFuzzyIsNull(leftAmount) && qFuzzyIsNull(rightAmount)) || (qFuzzyIsNull(leftAmount) == qFuzzyIsNull(rightAmount) && leftIndex < rightIndex) || (qFuzzyIsNull(leftAmount) == qFuzzyIsNull(rightAmount) && leftIndex == rightIndex && leftType < rightType); diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index 1f2eeb5c3..e1fe4e2dd 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -81,10 +81,10 @@ void ArmoryServersModel::add(const ArmoryServer& srv) void ArmoryServersModel::add(QString name, QString armoryDBIp, int armoryDBPort, int netType, QString armoryDBKey) { ArmoryServer server; - server.name = name; - server.armoryDBPort = armoryDBPort; - server.armoryDBIp = armoryDBIp; - server.armoryDBKey = armoryDBKey; + server.name = name.toStdString(); + server.armoryDBPort = std::to_string(armoryDBPort); + server.armoryDBIp = armoryDBIp.toStdString(); + server.armoryDBKey = armoryDBKey.toStdString(); if (netType == 0) { server.netType = NetworkType::MainNet; } @@ -129,13 +129,14 @@ QVariant ArmoryServersModel::data(const QModelIndex& index, int role) const int row = index.row(); switch (role) { - case Qt::DisplayRole: return (data_.at(row).netType == NetworkType::MainNet) ? (data_.at(row).name + QLatin1String(" (Mainnet)")) - : (data_.at(row).name + QLatin1String(" (Testnet)")); - case NameRole: return data_.at(row).name; + case Qt::DisplayRole: return (data_.at(row).netType == NetworkType::MainNet) + ? (QString::fromStdString(data_.at(row).name) + QLatin1String(" (Mainnet)")) + : (QString::fromStdString(data_.at(row).name) + QLatin1String(" (Testnet)")); + case NameRole: return QString::fromStdString(data_.at(row).name); case NetTypeRole: return (int)data_.at(row).netType; - case AddressRole: return data_.at(row).armoryDBIp; - case PortRole: return QString::number(data_.at(row).armoryDBPort); - case KeyRole: return data_.at(row).armoryDBKey; + case AddressRole: return QString::fromStdString(data_.at(row).armoryDBIp); + case PortRole: return QString::fromStdString(data_.at(row).armoryDBPort); + case KeyRole: return QString::fromStdString(data_.at(row).armoryDBKey); case DefaultServerRole: return (index.row() < ArmoryServersProvider::kDefaultServersCount) && (index.row() < rowCount()); case CurrentServerRole: return (index.row() == current()); default: return QVariant(); @@ -157,25 +158,23 @@ bool ArmoryServersModel::setData(const QModelIndex& index, const QVariant& value switch (role) { case NameRole: - data_.at(row).name = value.toString(); - break; + data_.at(row).name = value.toString().toStdString(); + break; case NetTypeRole: data_.at(row).netType = static_cast(value.toInt()); - break; + break; case AddressRole: - data_.at(row).armoryDBIp = value.toString(); - break; + data_.at(row).armoryDBIp = value.toString().toStdString(); + break; case PortRole: - data_.at(row).armoryDBPort = value.toInt(); - break; + data_.at(row).armoryDBPort = value.toString().toStdString(); + break; case KeyRole: - data_.at(row).armoryDBKey = value.toString(); - break; - default: - break; + data_.at(row).armoryDBKey = value.toString().toStdString(); + break; + default: break; } } - emit changed(index.row()); emit dataChanged(index, index, { role }); return true; @@ -194,7 +193,7 @@ bool ArmoryServersModel::isEditable(int row) const QString ArmoryServersModel::currentNetworkName() const { if (current_ >= 0 && current_ < data_.size()) { - return data_.at(current_).name; + return QString::fromStdString(data_.at(current_).name); } return QString::fromLatin1(""); } diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index ee0db1101..d5a26d3b9 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include "ArmoryServersModel.h" @@ -209,6 +210,7 @@ QtQuickAdapter::~QtQuickAdapter() void QtQuickAdapter::run(int &argc, char **argv) { logger_->debug("[QtQuickAdapter::run]"); + curl_global_init(CURL_GLOBAL_ALL); Q_INIT_RESOURCE(armory); Q_INIT_RESOURCE(qtquick); @@ -425,7 +427,7 @@ void QtQuickAdapter::onArmoryServerSelected(int index) return; } armoryServerIndex_ = index; - armoryState_ = 1; + armoryState_ = ArmoryState::Connecting; emit armoryStateChanged(); if (txModel_) { @@ -530,10 +532,9 @@ ProcessingResult QtQuickAdapter::processArmoryServers(bs::message::SeqId msgId , response.idx_connected()); std::vector servers; for (const auto& server : response.servers()) { - servers.push_back({ QString::fromStdString(server.server_name()) + servers.push_back({ server.server_name() , static_cast(server.network_type()) - , QString::fromStdString(server.server_address()) - , std::stoi(server.server_port()), QString::fromStdString(server.server_key()) + , server.server_address(), server.server_port(), server.server_key() , SecureBinaryData::fromString(server.password()) , server.run_locally(), server.one_way_auth() }); } @@ -571,6 +572,16 @@ ProcessingResult QtQuickAdapter::processAdminMessage(const Envelope &env) return ProcessingResult::Success; } +void QtQuickAdapter::rescanAllWallets() +{ + logger_->debug("[{}]", __func__); + WalletsMessage msg; + for (const auto& hdWallet : hdWallets_) { + msg.set_wallet_rescan(hdWallet.first); + pushRequest(user_, userWallets_, msg.SerializeAsString()); + } +} + ProcessingResult QtQuickAdapter::processBlockchain(const Envelope &env) { ArmoryMessage msg; @@ -588,10 +599,15 @@ ProcessingResult QtQuickAdapter::processBlockchain(const Envelope &env) updateSplashProgress(); break; case ArmoryMessage::kStateChanged: - armoryState_ = msg.state_changed().state(); - netType_ = static_cast(msg.state_changed().net_type()); setTopBlock(msg.state_changed().top_block()); - emit armoryStateChanged(); + netType_ = static_cast(msg.state_changed().net_type()); + if ((int)armoryState_ != msg.state_changed().state()) { + armoryState_ = static_cast(msg.state_changed().state()); + emit armoryStateChanged(); + if (armoryState_ == ArmoryState::Ready) { + rescanAllWallets(); + } + } break; case ArmoryMessage::kNewBlock: setTopBlock(msg.new_block().top_block()); @@ -1538,7 +1554,7 @@ bool QtQuickAdapter::addArmoryServer(const QString& name , int netType, const QString& ipAddr, const QString& ipPort, const QString& key) { for (const auto& srv : armoryServersModel_->data()) { - if (srv.name == name) { + if (srv.name == name.toStdString()) { logger_->debug("[{}] armory server {} already exists", __func__, name.toStdString()); return false; } @@ -1552,11 +1568,10 @@ bool QtQuickAdapter::addArmoryServer(const QString& name msgReq->set_server_key(key.toStdString()); pushRequest(user_, userSettings_, msg.SerializeAsString()); QMetaObject::invokeMethod(this, [this, name, netType, ipAddr, ipPort, key] { - armoryServersModel_->add({ name, static_cast(netType), ipAddr, ipPort.toInt(), key }); + armoryServersModel_->add({ name.toStdString(), static_cast(netType) + , ipAddr.toStdString(), ipPort.toStdString(), key.toStdString()}); }); - updateArmoryServers(); - return true; } @@ -1577,10 +1592,10 @@ void QtQuickAdapter::onArmoryServerChanged(int index) auto msgReq = msg.mutable_upd_armory_server(); msgReq->set_index(index); auto msgSrv = msgReq->mutable_server(); - msgSrv->set_server_name(srv.name.toStdString()); - msgSrv->set_server_address(srv.armoryDBIp.toStdString()); - msgSrv->set_server_port(std::to_string(srv.armoryDBPort)); - msgSrv->set_server_key(srv.armoryDBKey.toStdString()); + msgSrv->set_server_name(srv.name); + msgSrv->set_server_address(srv.armoryDBIp); + msgSrv->set_server_port(srv.armoryDBPort); + msgSrv->set_server_key(srv.armoryDBKey); msgSrv->set_network_type((int)srv.netType); pushRequest(user_, userSettings_, msg.SerializeAsString()); } @@ -1713,7 +1728,7 @@ QTxDetails* QtQuickAdapter::getTXDetails(const QString& txHash, bool rbf const auto txDet = new QTxDetails(logger_, txBinHash, this); connect(this, &QtQuickAdapter::topBlock, txDet, &QTxDetails::onTopBlock); - if (selWalletIdx >= 0) { + if (cpfp && (selWalletIdx >= 0)) { const auto& hdWalletId = hdWalletIdByIndex(selWalletIdx); if (!hdWalletId.empty()) { txDet->addWalletFilter(hdWalletId); diff --git a/GUI/QtQuick/QtQuickAdapter.h b/GUI/QtQuick/QtQuickAdapter.h index 7a16ab8ca..3e638afdf 100644 --- a/GUI/QtQuick/QtQuickAdapter.h +++ b/GUI/QtQuick/QtQuickAdapter.h @@ -132,7 +132,7 @@ class QtQuickAdapter : public QObject, public ApiBusAdapter, public bs::MainLoop void setExportDir(const QString& str) {setSetting(ApplicationSettings::Setting::ExportDir, str); } Q_PROPERTY(int armoryState READ armoryState NOTIFY armoryStateChanged) - int armoryState() const { return armoryState_; } + int armoryState() const { return (int)armoryState_; } Q_PROPERTY(int networkType READ networkType NOTIFY networkTypeChanged) int networkType() const { return (int)netType_; } @@ -298,6 +298,7 @@ private slots: QVariant getSetting(ApplicationSettings::Setting) const; QString getSettingStringAt(ApplicationSettings::Setting, int idx); void setSetting(ApplicationSettings::Setting, const QVariant&); + void rescanAllWallets(); private: std::shared_ptr logger_; @@ -312,7 +313,7 @@ private slots: std::recursive_mutex mutex_; std::set createdComponents_; std::set loadingComponents_; - int armoryState_{ -1 }; + ArmoryState armoryState_{ ArmoryState::Offline }; int armoryServerIndex_{ -1 }; NetworkType netType_{ NetworkType::Invalid }; uint32_t blockNum_{ 0 }; diff --git a/GUI/QtWidgets/QtGuiAdapter.cpp b/GUI/QtWidgets/QtGuiAdapter.cpp index 3fffe4611..4c77119ca 100644 --- a/GUI/QtWidgets/QtGuiAdapter.cpp +++ b/GUI/QtWidgets/QtGuiAdapter.cpp @@ -373,10 +373,9 @@ ProcessingResult QtGuiAdapter::processArmoryServers(const SettingsMessage_Armory { QList servers; for (const auto& server : response.servers()) { - servers << ArmoryServer{ QString::fromStdString(server.server_name()) + servers << ArmoryServer{ server.server_name() , static_cast(server.network_type()) - , QString::fromStdString(server.server_address()) - , std::stoi(server.server_port()), QString::fromStdString(server.server_key()) + , server.server_address(), server.server_port(), server.server_key() , SecureBinaryData::fromString(server.password()) , server.run_locally(), server.one_way_auth() }; } @@ -873,10 +872,10 @@ void QtGuiAdapter::onAddArmoryServer(const ArmoryServer& server) SettingsMessage msg; auto msgReq = msg.mutable_add_armory_server(); msgReq->set_network_type((int)server.netType); - msgReq->set_server_name(server.name.toStdString()); - msgReq->set_server_address(server.armoryDBIp.toStdString()); - msgReq->set_server_port(std::to_string(server.armoryDBPort)); - msgReq->set_server_key(server.armoryDBKey.toStdString()); + msgReq->set_server_name(server.name); + msgReq->set_server_address(server.armoryDBIp); + msgReq->set_server_port(server.armoryDBPort); + msgReq->set_server_key(server.armoryDBKey); msgReq->set_run_locally(server.runLocally); msgReq->set_one_way_auth(server.oneWayAuth_); msgReq->set_password(server.password.toBinStr()); @@ -897,10 +896,10 @@ void QtGuiAdapter::onUpdArmoryServer(int index, const ArmoryServer& server) msgReq->set_index(index); auto msgSrv = msgReq->mutable_server(); msgSrv->set_network_type((int)server.netType); - msgSrv->set_server_name(server.name.toStdString()); - msgSrv->set_server_address(server.armoryDBIp.toStdString()); - msgSrv->set_server_port(std::to_string(server.armoryDBPort)); - msgSrv->set_server_key(server.armoryDBKey.toStdString()); + msgSrv->set_server_name(server.name); + msgSrv->set_server_address(server.armoryDBIp); + msgSrv->set_server_port(server.armoryDBPort); + msgSrv->set_server_key(server.armoryDBKey); msgSrv->set_run_locally(server.runLocally); msgSrv->set_one_way_auth(server.oneWayAuth_); msgSrv->set_password(server.password.toBinStr()); diff --git a/UnitTests/MockTerminal.cpp b/UnitTests/MockTerminal.cpp index f102d05db..16058a05b 100644 --- a/UnitTests/MockTerminal.cpp +++ b/UnitTests/MockTerminal.cpp @@ -87,20 +87,20 @@ class SettingsMockAdapter : public bs::message::Adapter ArmoryMessage msgReply; auto msgResp = msgReply.mutable_settings_response(); ArmorySettings armorySettings; - armorySettings.name = QLatin1Literal("test"); + armorySettings.name = "test"; armorySettings.netType = NetworkType::TestNet; - armorySettings.armoryDBIp = QLatin1String("127.0.0.1"); - armorySettings.armoryDBPort = 82; + armorySettings.armoryDBIp = "127.0.0.1"; + armorySettings.armoryDBPort = "82"; msgResp->set_socket_type(armorySettings.socketType); msgResp->set_network_type((int)armorySettings.netType); - msgResp->set_host(armorySettings.armoryDBIp.toStdString()); - msgResp->set_port(std::to_string(armorySettings.armoryDBPort)); - msgResp->set_bip15x_key(armorySettings.armoryDBKey.toStdString()); + msgResp->set_host(armorySettings.armoryDBIp); + msgResp->set_port(armorySettings.armoryDBPort); + msgResp->set_bip15x_key(armorySettings.armoryDBKey); msgResp->set_run_locally(armorySettings.runLocally); - msgResp->set_data_dir(armorySettings.dataDir.toStdString()); - msgResp->set_executable_path(armorySettings.armoryExecutablePath.toStdString()); - msgResp->set_bitcoin_dir(armorySettings.bitcoinBlocksDir.toStdString()); - msgResp->set_db_dir(armorySettings.dbDir.toStdString()); + msgResp->set_data_dir(armorySettings.dataDir); + msgResp->set_executable_path(armorySettings.armoryExecutablePath); + msgResp->set_bitcoin_dir(armorySettings.bitcoinBlocksDir); + msgResp->set_db_dir(armorySettings.dbDir); pushResponse(user_, env, msgReply.SerializeAsString()); return true; } diff --git a/UnitTests/TestEnv.cpp b/UnitTests/TestEnv.cpp index 7abbf3daf..ec9f3e603 100644 --- a/UnitTests/TestEnv.cpp +++ b/UnitTests/TestEnv.cpp @@ -107,9 +107,9 @@ void TestEnv::requireArmory(bool waitForReady) settings.runLocally = false; settings.socketType = appSettings()->GetArmorySocketType(); settings.netType = NetworkType::TestNet; - settings.armoryDBIp = QLatin1String("127.0.0.1"); - settings.armoryDBPort = armoryInstance_->port_; - settings.dataDir = QLatin1String("armory_regtest_db"); + settings.armoryDBIp = "127.0.0.1"; + settings.armoryDBPort = std::to_string(armoryInstance_->port_); + settings.dataDir = "armory_regtest_db"; const auto& keyCb = [](const BinaryData&, const std::string&)->bool { diff --git a/common b/common index 393322a0f..c95bdaa04 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 393322a0f728e5c51c6ad464a885fc7d805a3f98 +Subproject commit c95bdaa043338e373ee10e03c194a6c4e24e47de From 350e760639a0bf631c264837a93a180189ab3578 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Wed, 22 Nov 2023 16:13:53 +0300 Subject: [PATCH 434/436] various fixes and optimizations --- Core/ApiAdapter.cpp | 17 +++++++++++------ Core/ArmoryServersProvider.cpp | 14 +++++++++----- Core/SettingsAdapter.cpp | 4 +++- GUI/QtQuick/ArmoryServersModel.cpp | 20 +++++++++----------- GUI/QtQuick/QtQuickAdapter.cpp | 17 +++++++++++------ UnitTests/TestArmory.cpp | 13 +++++++++++++ common | 2 +- 7 files changed, 57 insertions(+), 30 deletions(-) diff --git a/Core/ApiAdapter.cpp b/Core/ApiAdapter.cpp index e2dae354e..8cfa28e28 100644 --- a/Core/ApiAdapter.cpp +++ b/Core/ApiAdapter.cpp @@ -204,21 +204,25 @@ void ApiAdapter::add(const std::shared_ptr &adapter) } } const auto userId = ++nextApiUser_; - logger_->debug("[{}] {} has id {}", __func__, adapter->name(), userId); + logger_->debug("[{}] {} has user {}", __func__, adapter->name(), userId); adapter->setUserId(userId); apiBus_->addAdapter(adapter); } ProcessingResult ApiAdapter::process(const bs::message::Envelope &env) { - if (env.message.empty()) { - return ProcessingResult::Success; - } - const auto rc = RelayAdapter::process(env); if (env.receiver->value() == user_->value()) { + if (!env.isRequest() && !queue_->isSame()) { + auto envResp = bs::message::Envelope::makeResponse(env.sender, env.receiver + , {}, env.responseId()); + queue_->pushFill(envResp); + } + if (env.message.empty()) { + return ProcessingResult::Success; + } return gwAdapter_->pushToApiBus(env); } - return rc; + return RelayAdapter::process(env); } bool ApiAdapter::processBroadcast(const bs::message::Envelope& env) @@ -238,6 +242,7 @@ bool ApiAdapter::processTimeout(const bs::message::Envelope& env) return true; } + bool ApiBusAdapter::pushFill(bs::message::Envelope& env) { if (!queue_) { diff --git a/Core/ArmoryServersProvider.cpp b/Core/ArmoryServersProvider.cpp index 5eddd63c0..4a63833fe 100644 --- a/Core/ArmoryServersProvider.cpp +++ b/Core/ArmoryServersProvider.cpp @@ -50,6 +50,7 @@ std::vector ArmoryServersProvider::servers() const { QStringList userServers = appSettings_->get(ApplicationSettings::armoryServers); std::vector servers; + servers.reserve(userServers.size() + kDefaultServersCount); // #1 add MainNet blocksettle server ArmoryServer bsMainNet = defaultServers_.at(static_cast(ServerIndices::MainNet)); @@ -74,7 +75,8 @@ std::vector ArmoryServersProvider::servers() const servers.push_back(localTestNet);*/ for (const QString &srv : userServers) { - servers.push_back(ArmoryServer::fromTextSettings(srv.toStdString())); + const auto& server = ArmoryServer::fromTextSettings(srv.toStdString()); + servers.push_back(server); } return servers; } @@ -130,10 +132,11 @@ int ArmoryServersProvider::indexOf(const ArmoryServer &server) const const auto& srvrs = servers(); for (int i = 0; i < srvrs.size(); ++i) { const auto& s = srvrs.at(i); -/* logger_->debug("[{}] {}: {} vs {}, {} vs {}, {} vs {}, {} vs {}", __func__ - , i, s.name.toStdString(), server.name.toStdString(), (int)s.netType - , (int)server.netType, s.armoryDBIp.toStdString() - , server.armoryDBIp.toStdString(), s.armoryDBPort, server.armoryDBPort);*/ +#ifdef MSG_DEBUGGING + logger_->debug("[{}] {}: {} vs {}, {} vs {}, {} vs {}, {} vs {}", __func__ + , i, s.name, server.name, (int)s.netType, (int)server.netType + , s.armoryDBIp, server.armoryDBIp, s.armoryDBPort, server.armoryDBPort); +#endif if ((server.name.empty() || (s.name == server.name)) && (s.netType == server.netType) && (s.armoryDBIp == server.armoryDBIp) && (s.armoryDBPort == server.armoryDBPort)) { return i; @@ -236,6 +239,7 @@ bool ArmoryServersProvider::replace(int index, const ArmoryServer &server) return false; } + logger_->debug("[{}] {}", __func__, server.toTextSettings()); serversTxt.replace(index - kDefaultServersCount, QString::fromStdString(server.toTextSettings())); appSettings_->set(ApplicationSettings::armoryServers, serversTxt); return true; diff --git a/Core/SettingsAdapter.cpp b/Core/SettingsAdapter.cpp index d432d86be..baba3fb9a 100644 --- a/Core/SettingsAdapter.cpp +++ b/Core/SettingsAdapter.cpp @@ -157,7 +157,9 @@ void SettingsAdapter::sendSettings(const ArmorySettings& armorySettings, bool ne msgResp->set_cache_file_name(appSettings_->get(ApplicationSettings::txCacheFileName)); pushRequest(user_, bs::message::UserTerminal::create(bs::message::TerminalUsers::Blockchain) , msg.SerializeAsString(), {}, 3, std::chrono::seconds{10}); +#ifdef MSG_DEBUGGING logger_->debug("[{}] {}", __func__, msg.DebugString()); +#endif } if (netTypeChanged) { logger_->debug("[{}] network type changed - reloading wallets", __func__); @@ -570,7 +572,7 @@ static ArmoryServer fromMessage(const SettingsMessage_ArmoryServer& msg) result.name = msg.server_name(); result.netType = static_cast(msg.network_type()); result.armoryDBIp = msg.server_address(); - result.armoryDBPort = std::stoi(msg.server_port()); + result.armoryDBPort = msg.server_port(); result.armoryDBKey = msg.server_key(); result.password = SecureBinaryData::fromString(msg.password()); result.runLocally = msg.run_locally(); diff --git a/GUI/QtQuick/ArmoryServersModel.cpp b/GUI/QtQuick/ArmoryServersModel.cpp index e1fe4e2dd..5e3619ec1 100644 --- a/GUI/QtQuick/ArmoryServersModel.cpp +++ b/GUI/QtQuick/ArmoryServersModel.cpp @@ -27,7 +27,7 @@ namespace { }; } -ArmoryServersModel::ArmoryServersModel(const std::shared_ptr & logger, QObject* parent) +ArmoryServersModel::ArmoryServersModel(const std::shared_ptr &logger, QObject* parent) : QAbstractListModel(parent) , logger_(logger) { @@ -39,10 +39,12 @@ ArmoryServersModel::ArmoryServersModel(const std::shared_ptr & l this, &ArmoryServersModel::rowCountChanged); } -void ArmoryServersModel::setCurrent (int value) +void ArmoryServersModel::setCurrent(int value) { - logger_->debug("[{}] {} -> {}", __func__, current_, value); - if (current_ == value) { + if (value < 0) { + value = connected_; + } + if ((value < 0) || (current_ == value)) { return; } current_ = value; @@ -58,15 +60,11 @@ void ArmoryServersModel::setData(int curIdx, int connIdx beginResetModel(); data_ = data; endResetModel(); - int newCur = curIdx; - if (curIdx == -1) { - newCur = 0; - } - setCurrent(newCur); if (connected_ != connIdx) { connected_ = connIdx; emit connectedChanged(); } + setCurrent(curIdx); }); } @@ -135,7 +133,7 @@ QVariant ArmoryServersModel::data(const QModelIndex& index, int role) const case NameRole: return QString::fromStdString(data_.at(row).name); case NetTypeRole: return (int)data_.at(row).netType; case AddressRole: return QString::fromStdString(data_.at(row).armoryDBIp); - case PortRole: return QString::fromStdString(data_.at(row).armoryDBPort); + case PortRole: return std::stoi(data_.at(row).armoryDBPort); case KeyRole: return QString::fromStdString(data_.at(row).armoryDBKey); case DefaultServerRole: return (index.row() < ArmoryServersProvider::kDefaultServersCount) && (index.row() < rowCount()); case CurrentServerRole: return (index.row() == current()); @@ -167,7 +165,7 @@ bool ArmoryServersModel::setData(const QModelIndex& index, const QVariant& value data_.at(row).armoryDBIp = value.toString().toStdString(); break; case PortRole: - data_.at(row).armoryDBPort = value.toString().toStdString(); + data_.at(row).armoryDBPort = std::to_string(value.toInt()); break; case KeyRole: data_.at(row).armoryDBKey = value.toString().toStdString(); diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index d5a26d3b9..7b3d7a728 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -531,12 +531,14 @@ ProcessingResult QtQuickAdapter::processArmoryServers(bs::message::SeqId msgId logger_->debug("[{}] current={}, connected={}", __func__, response.idx_current() , response.idx_connected()); std::vector servers; + servers.reserve(response.servers_size()); for (const auto& server : response.servers()) { - servers.push_back({ server.server_name() + const ArmoryServer srv{ server.server_name() , static_cast(server.network_type()) , server.server_address(), server.server_port(), server.server_key() , SecureBinaryData::fromString(server.password()) - , server.run_locally(), server.one_way_auth() }); + , server.run_locally(), server.one_way_auth() }; + servers.push_back(srv); } armoryServersModel_->setData(response.idx_current(), response.idx_connected(), servers); return ProcessingResult::Success; @@ -1185,8 +1187,11 @@ void QtQuickAdapter::processWalletLoaded(const bs::sync::WalletInfo &wi) WalletsMessage msg; msg.set_get_wallet_balances(walletId); - pushRequest(user_, userWallets_, msg.SerializeAsString(), {}, 10 - , std::chrono::milliseconds{ 500 }); + const auto& msgId = pushRequest(user_, userWallets_, msg.SerializeAsString() + , {}, 10, std::chrono::milliseconds{ 500 }); +#ifdef MSG_DEBUGGING + logger_->debug("[{}] sent #{} from {}", __func__, msgId, user_->name()); +#endif } static QString assetTypeToString(const bs::AssetType assetType) @@ -1607,8 +1612,8 @@ void QtQuickAdapter::requestFeeSuggestions() for (const auto& feeLevel : FeeSuggestionModel::feeLevels()) { msgReq->add_levels(feeLevel.first); } - pushRequest(user_, userBlockchain_, msg.SerializeAsString(), {}, 10 - , std::chrono::milliseconds{500}); + pushRequest(user_, userBlockchain_, msg.SerializeAsString() + , {}, 10, std::chrono::milliseconds{500}); feeSuggModel_->clear(); } diff --git a/UnitTests/TestArmory.cpp b/UnitTests/TestArmory.cpp index 6b2a195c7..a752d5b80 100644 --- a/UnitTests/TestArmory.cpp +++ b/UnitTests/TestArmory.cpp @@ -129,3 +129,16 @@ TEST(TestArmory, CrashOnNonExistentHashInTxBatch) armoryConn->getTXsByHash({ nonExHash }, cbTXs, true); EXPECT_TRUE(fut.get()); } + +#include "common.pb.h" +using namespace BlockSettle::Common; + +TEST(MessageBus, timed_out) +{ + ArmoryMessage msg; + + const auto& msg1 = BinaryData::CreateFromHex("8a020e0a0c0204060c18309001f803f007"); + + ASSERT_TRUE(msg.ParseFromString(msg1.toBinStr())); + StaticLogger::loggerPtr->debug(msg.DebugString()); +} diff --git a/common b/common index c95bdaa04..3be225105 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit c95bdaa043338e373ee10e03c194a6c4e24e47de +Subproject commit 3be225105896a094d2407e8d18aeab937f702421 From fd840a25a3176371b732a4a14db3c7c45f9e3849 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Thu, 23 Nov 2023 23:42:54 +0300 Subject: [PATCH 435/436] TX list deduplication --- CMakeLists.txt | 8 ++- GUI/QtQuick/QtQuickAdapter.cpp | 2 + GUI/QtQuick/TransactionFilterModel.cpp | 20 ++++---- GUI/QtQuick/TxListModel.cpp | 49 +++++++++++++------ GUI/QtQuick/TxListModel.h | 3 +- GUI/QtQuick/WalletBalancesModel.cpp | 8 +++ GUI/QtQuick/WalletBalancesModel.h | 1 + GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp | 11 +++++ GUI/QtQuick/viewmodels/WalletPropertiesVM.h | 1 + common | 2 +- 10 files changed, 75 insertions(+), 30 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f97dd5a1b..492cfa882 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -370,14 +370,18 @@ set(CURL_LIBRARY "-lcurl") find_package(CURL REQUIRED) IF (WIN32) - SET(CURL_LIB_NAME libcurl-d.lib libcurl.lib) + IF (CMAKE_BUILD_TYPE STREQUAL "Debug") + SET(CURL_LIB_NAME libcurl-d.lib) + ELSE () + SET(CURL_LIB_NAME libcurl.lib) + ENDIF () ELSE(WIN32) SET(CURL_LIB_NAME libcurl-d.a libcurl.a curl-d curl) ENDIF(WIN32) FIND_LIBRARY( CURL_LIB NAMES ${CURL_LIB_NAME} PATHS ${CURL_ROOT}/lib NO_DEFAULT_PATH ) IF( NOT CURL_LIB) - MESSAGE( FATAL_ERROR "Could not find curl lib in ${CURL_ROOT}/lib") + MESSAGE( FATAL_ERROR "Could not find curl lib ${CURL_LIB_NAME} in ${CURL_ROOT}/lib") ENDIF() diff --git a/GUI/QtQuick/QtQuickAdapter.cpp b/GUI/QtQuick/QtQuickAdapter.cpp index 7b3d7a728..8ed63834e 100644 --- a/GUI/QtQuick/QtQuickAdapter.cpp +++ b/GUI/QtQuick/QtQuickAdapter.cpp @@ -2163,6 +2163,8 @@ void QtQuickAdapter::processWalletAddresses(const std::string& walletId , QString(), QString::fromStdString(lastAddr.index), assetTypeToString(lastAddr.assetType)}); generatedAddress_ = lastAddr.address; emit addressGenerated(); + walletBalances_->incNbAddresses(hdWalletId); + walletPropertiesModel_->incNbUsedAddrs(hdWalletId); } bs::message::ProcessingResult QtQuickAdapter::processTxResponse(bs::message::SeqId msgId diff --git a/GUI/QtQuick/TransactionFilterModel.cpp b/GUI/QtQuick/TransactionFilterModel.cpp index 99ccc817f..0455ca5b0 100644 --- a/GUI/QtQuick/TransactionFilterModel.cpp +++ b/GUI/QtQuick/TransactionFilterModel.cpp @@ -19,8 +19,7 @@ TransactionFilterModel::TransactionFilterModel(std::shared_ptrhasParam(ApplicationSettings::Setting::TransactionFilterWalletName)) { @@ -40,18 +39,16 @@ bool TransactionFilterModel::filterAcceptsRow(int source_row, const auto walletNameIndex = sourceModel()->index(source_row, 1); const auto transactionTypeIndex = sourceModel()->index(source_row, 2); - if (!walletName_.isEmpty()) - { - if (sourceModel()->data(walletNameIndex, TxListModel::TableRoles::TableDataRole) != walletName_) - { + if (!walletName_.isEmpty()) { + if (sourceModel()->data(walletNameIndex, TxListModel::TableRoles::TableDataRole) + != walletName_) { return false; } } - if (!transactionType_.isEmpty()) - { - if (sourceModel()->data(transactionTypeIndex, TxListModel::TableRoles::TableDataRole) != transactionType_) - { + if (!transactionType_.isEmpty()) { + if (sourceModel()->data(transactionTypeIndex, TxListModel::TableRoles::TableDataRole) + != transactionType_) { return false; } } @@ -82,7 +79,8 @@ void TransactionFilterModel::setTransactionType(const QString& type) { if (transactionType_ != type) { transactionType_ = type; - settings_->setParam(ApplicationSettings::Setting::TransactionFilterTransactionType, transactionType_); + settings_->setParam(ApplicationSettings::Setting::TransactionFilterTransactionType + , transactionType_); emit changed(); } } diff --git a/GUI/QtQuick/TxListModel.cpp b/GUI/QtQuick/TxListModel.cpp index 74991770b..d65bcda8f 100644 --- a/GUI/QtQuick/TxListModel.cpp +++ b/GUI/QtQuick/TxListModel.cpp @@ -101,6 +101,7 @@ QColor TxListModel::dataColor(int row, int col) const } } else if (col == 2) { + std::unique_lock lock{ dataMtx_ }; const auto& itTxDet = txDetails_.find(row); if (itTxDet != txDetails_.end()) { switch (itTxDet->second.direction) { @@ -116,6 +117,7 @@ QColor TxListModel::dataColor(int row, int col) const QString TxListModel::walletName(int row) const { + std::unique_lock lock{ dataMtx_ }; const auto& itTxDet = txDetails_.find(row); if (itTxDet != txDetails_.end()) { return QString::fromStdString(itTxDet->second.walletName); @@ -125,6 +127,7 @@ QString TxListModel::walletName(int row) const bs::sync::Transaction::Direction TxListModel::txDirection(int row) const { + std::unique_lock lock{ dataMtx_ }; const auto& itTxDet = txDetails_.find(row); if (itTxDet != txDetails_.end()) { return itTxDet->second.direction; @@ -139,6 +142,7 @@ QString TxListModel::txType(int row) const QString TxListModel::txComment(int row) const { + std::unique_lock lock{ dataMtx_ }; const auto& itTxDet = txDetails_.find(row); if (itTxDet != txDetails_.end()) { return QString::fromStdString(itTxDet->second.comment); @@ -156,6 +160,7 @@ QString TxListModel::txFlag(int row) const QString TxListModel::txId(int row) const { + std::unique_lock lock{ dataMtx_ }; const auto& itTxDet = txDetails_.find(row); if (itTxDet != txDetails_.end()) { return QString::fromStdString(itTxDet->second.txHash.toHexStr(true)); @@ -165,6 +170,7 @@ QString TxListModel::txId(int row) const bool TxListModel::isRBF(int row) const { + std::unique_lock lock{ dataMtx_ }; const auto& itTxDet = txDetails_.find(row); if (itTxDet != txDetails_.end()) { return itTxDet->second.tx.isRBF(); @@ -214,13 +220,16 @@ void TxListModel::addRows(const std::vector& entries) std::vector newEntries; for (const auto& entry : entries) { int row = -1; - for (int i = 0; i < data_.size(); ++i) { - auto& de = data_.at(i); - if ((entry.txHash == de.txHash) && (de.walletIds == entry.walletIds)) { - de.txTime = entry.txTime; - de.recvTime = entry.recvTime; - row = i; - break; + { + std::unique_lock lock{ dataMtx_ }; + for (int i = 0; i < data_.size(); ++i) { + auto& de = data_.at(i); + if ((entry.txHash == de.txHash) && (de.walletIds == entry.walletIds)) { + de.txTime = entry.txTime; + de.recvTime = entry.recvTime; + row = i; + break; + } } } if (row != -1) { @@ -233,6 +242,12 @@ void TxListModel::addRows(const std::vector& entries) } } if (!newEntries.empty()) { + if (addingEntries_ == (int)newEntries.size()) { + logger_->warn("[TxListModel::addRows] already adding {} entries", addingEntries_); + return; + } + addingEntries_ = (int)newEntries.size(); + QMetaObject::invokeMethod(this, [this, newEntries] { logger_->debug("[TxListModel::addRows] {} new entries", newEntries.size()); { @@ -253,6 +268,7 @@ void TxListModel::addRows(const std::vector& entries) setDetails(txDet, false); } } + addingEntries_ = 0; }); } } @@ -269,24 +285,27 @@ void TxListModel::clear() void TxListModel::setDetails(const bs::sync::TXWalletDetails& txDet, bool usePending) { - int row = -1; + //logger_->debug("[TxListModel::setDetails] {}", txDet.txHash.toHexStr(true)); + int rowStart = -1, rowEnd = -1; std::unique_lock lock{ dataMtx_ }; for (int i = 0; i < data_.size(); ++i) { const auto& entry = data_.at(i); if ((entry.txHash == txDet.txHash) && (txDet.walletIds == entry.walletIds)) { txDetails_[i] = txDet; data_[i].addresses = txDet.ownAddresses; - row = i; - break; + if (rowStart < 0) { + rowStart = i; + } + rowEnd = i; } } - if (row != -1) { - emit dataChanged(createIndex(row, 1), createIndex(row, 7)); - //logger_->debug("[TxListModel::setDetails] {} {} found at row {}", txDet.txHash.toHexStr(), txDet.hdWalletId, row); - + if (rowStart != -1) { + emit dataChanged(createIndex(rowStart, 1), createIndex(rowEnd, 7)); + //logger_->debug("[TxListModel::setDetails] {} {} found at rows {}-{}" + // , txDet.txHash.toHexStr(), txDet.hdWalletId, rowStart, rowEnd); } else { - //logger_->warn("[TxListModel::setDetails] {} {} not found", txDet.txHash.toHexStr(), txDet.hdWalletId); + logger_->warn("[TxListModel::setDetails] {} {} not found", txDet.txHash.toHexStr(), txDet.hdWalletId); if (usePending) { pendingDetails_.push_back(txDet); } diff --git a/GUI/QtQuick/TxListModel.h b/GUI/QtQuick/TxListModel.h index 6bf40b1a7..e9a1b5f46 100644 --- a/GUI/QtQuick/TxListModel.h +++ b/GUI/QtQuick/TxListModel.h @@ -76,7 +76,8 @@ class TxListModel : public QAbstractTableModel std::map txDetails_; std::vector pendingDetails_; uint32_t curBlock_; - std::mutex dataMtx_; + mutable std::mutex dataMtx_; + std::atomic_int addingEntries_{ 0 }; }; class TxListForAddr : public QAbstractTableModel diff --git a/GUI/QtQuick/WalletBalancesModel.cpp b/GUI/QtQuick/WalletBalancesModel.cpp index 53cfe5fa1..a3c6e79dc 100644 --- a/GUI/QtQuick/WalletBalancesModel.cpp +++ b/GUI/QtQuick/WalletBalancesModel.cpp @@ -226,6 +226,14 @@ QString WalletBalancesModel::numberAddresses() const return tr("-"); } +void WalletBalancesModel::incNbAddresses(const std::string& walletId, int nb) +{ + balances_[walletId].nbAddresses += nb; + if (wallets_.at(selectedWallet_).walletId == walletId) { + emit changed(); + } +} + bool WalletBalancesModel::nameExist(const std::string& walletName) { for (int i = 0; i < wallets_.size(); ++i) { diff --git a/GUI/QtQuick/WalletBalancesModel.h b/GUI/QtQuick/WalletBalancesModel.h index 06ad30ec1..005de2488 100644 --- a/GUI/QtQuick/WalletBalancesModel.h +++ b/GUI/QtQuick/WalletBalancesModel.h @@ -79,6 +79,7 @@ class WalletBalancesModel : public QAbstractTableModel QString unconfirmedBalance() const; QString totalBalance() const; QString numberAddresses() const; + void incNbAddresses(const std::string& walletId, int nb = 1); bool nameExist(const std::string& walletName); void setCreatedWalletId(const std::string& walletId); diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp index b404a83ed..1e11d98ef 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.cpp @@ -68,6 +68,17 @@ void qtquick_gui::WalletPropertiesVM::setNbUsedAddrs(const std::string& walletId emit changed(); } +void qtquick_gui::WalletPropertiesVM::incNbUsedAddrs(const std::string& walletId, uint32_t nb) +{ + if (info_.walletId.isEmpty() || (info_.walletId.toStdString() != walletId)) { + logger_->warn("[{}] wallet id mismatch: {} vs {}", __func__ + , info_.walletId.toStdString(), walletId); + return; + } + nbUsedAddrs_ += nb; + emit changed(); +} + void qtquick_gui::WalletPropertiesVM::setNbUTXOs(const std::string& walletId, uint32_t nb) { if (info_.walletId.isEmpty() || (info_.walletId.toStdString() != walletId)) { diff --git a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h index 2d730e8d3..0d18ef146 100644 --- a/GUI/QtQuick/viewmodels/WalletPropertiesVM.h +++ b/GUI/QtQuick/viewmodels/WalletPropertiesVM.h @@ -53,6 +53,7 @@ class WalletPropertiesVM: public QObject void setWalletInfo(const QString& walletId, const bs::sync::WalletInfo& info); void setWalletSeed(const std::string& walletId, const std::string& seed); void setNbUsedAddrs(const std::string& walletId, uint32_t nb); + void incNbUsedAddrs(const std::string& walletId, uint32_t nb = 1); void setNbUTXOs(const std::string& walletId, uint32_t nb); void rename(const std::string& walletId, const std::string& newName); diff --git a/common b/common index 3be225105..7351eb6ef 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 3be225105896a094d2407e8d18aeab937f702421 +Subproject commit 7351eb6ef742c2bd448cdd0ea70b9dbad77c2798 From 89331096b01b510a571c3ac999ab70bf91bc5aa2 Mon Sep 17 00:00:00 2001 From: Sergey Chernikov Date: Mon, 27 Nov 2023 15:59:31 +0300 Subject: [PATCH 436/436] Linux build fixes --- CMakeLists.txt | 12 ++++++------ generate.py | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 492cfa882..65b05270b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -265,6 +265,7 @@ if (UNIX) endif (UNIX) # use only existing lws temporarily, don't try to build it (build fails on Windows) +ADD_DEFINITIONS(-DBUILD_LWS=1) SET(WS_PACKAGE_ROOT ${THIRD_PARTY_COMMON_DIR}/libwebsockets) SET(WS_LIB_DIR ${WS_PACKAGE_ROOT}/lib) SET(WS_INCLUDE_DIR ${WS_PACKAGE_ROOT}/include) @@ -276,14 +277,14 @@ IF (WIN32) SET(WS_LIB_NAME websockets_static) ENDIF() ELSE(WIN32) - IF(BSTERMINAL_SHARED_LIBS) +# IF(BSTERMINAL_SHARED_LIBS) SET(WS_LIB_NAME libwebsockets.so) - ELSE(BSTERMINAL_SHARED_LIBS) - SET(WS_LIB_NAME libwebsockets.a) - ENDIF() +# ELSE(BSTERMINAL_SHARED_LIBS) +# SET(WS_LIB_NAME libwebsockets.a) +# ENDIF() ENDIF(WIN32) -FIND_LIBRARY(WS_LIB NAMES ${WS_LIB_NAME} PATHS ${WS_LIB_DIR} NO_DEFAULT_PATH ) +FIND_LIBRARY(WS_LIB NAMES ${WS_LIB_NAME} PATHS ${WS_LIB_DIR}) IF(NOT WS_LIB) MESSAGE(FATAL_ERROR "Could not find libwebsockets in ${WS_LIB_DIR}") ENDIF() @@ -764,7 +765,6 @@ ELSE(WIN32) ${ZLIB_LIBRARIES} png m - double-conversion.a dl cups udev diff --git a/generate.py b/generate.py index 13c418d32..bef52068c 100644 --- a/generate.py +++ b/generate.py @@ -39,7 +39,7 @@ from build_scripts.settings import Settings from build_scripts.spdlog_settings import SpdlogSettings from build_scripts.trezor_common_settings import TrezorCommonSettings -from build_scripts.zeromq_settings import ZeroMQSettings +#from build_scripts.zeromq_settings import ZeroMQSettings from build_scripts.curl_settings import CurlSettings from build_scripts.websockets_settings import WebsocketsSettings @@ -55,6 +55,7 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma required_3rdparty = [] if project_settings._is_windows: + WebsocketsSettings(project_settings), required_3rdparty.append(JomSettings(project_settings)) required_3rdparty += [ @@ -62,7 +63,7 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma OpenSslSettings(project_settings), CurlSettings(project_settings), SpdlogSettings(project_settings), - ZeroMQSettings(project_settings), +# ZeroMQSettings(project_settings), LibQREncode(project_settings), LibBTC(project_settings), # static LibChaCha20Poly1305Settings(project_settings), # static @@ -73,7 +74,6 @@ def generate_project(build_mode, link_mode, build_production, hide_warnings, cma TrezorCommonSettings(project_settings), BipProtocolsSettings(project_settings), NLohmanJson(project_settings), - WebsocketsSettings(project_settings) ] if project_settings._is_windows:

      KH2K59`4t!Exd0D#k2jf{5Tkek&%X?dRd32SjG{n&AJCy$X{$4t zDMR>Jjq~WfkpJMzeZR{+kD4hKih0?QO9+znld76k4B*_8Zpsr9EU|$NiB)Mh-_-HK z>L9nLJD5|o3QiJ!R0QSw+u|$xB{-?ZNJHJbB(Dz~U=!Z+YC0@vZajA7>Uw9X=)lI? z`Yus@vcwPn!=|G!lO?6HO+BDUM>sllm1pW^ERZ1%=Y%PJpV9H76%keQ9O+v>aRicQ^vt_E3H&*`RkS&} zP}9Ex&a;+ps6IYep{m)0-xf^^iwN{TU+6}OAR-S3*80h<_A;*kd-3e5vZ|TUxS?Ox z1SDl*t7bp?fIWeuusBC0P~Ua7Vr2^0#Z89XrQNaE1rD17{LXuR&oamfzzzcM?E*dQFOMqu#Ss};l@i{cw%SJ zHSRIV7Wtof+(5sU_gb~Vr~;K{MIFY!Ot9~bq}6{GUAV};=9Hz(mW4jt#iU%5uGykw zPvH1KGJk1zHfH9_3|VU@V_d7Pe#FnS-N`p1YingKlvHQb9$IWD-ucXGZlLyY^ zw{r6!-gO^eP|&HLpwGau(Zd^s-w@ola zS*7a1rgscxU-2&TdmuYRK~97tVoGRQ(vhsg&Kw6q>|MOLv4b7!ct2f?!b6u|62^tv-g@+)q*f1dcb{;jUBN!O) z6;`4#z)X=&Y88g3=nE272y0#HY0ezOhcEL~*oX^){LcVMHR!yL zvRq!#$0}*#lJQMH1Ev>5D7hxYtvV~CFQm_`;@8_DN#?9m4+S^+5xw+%n`k>K`{7*y zL_~FaEzO6KK6WXNp0BznF3nsN%aOHaEV5s2sb$tsZhxG%h;PEm6@@-VRTtH3pyCo} z%~!#Nz89Y(?fdzhKiTydQ&udjsF=Vfc7sXcDwc+v@PfPl9UjOw$*H3;0C#~O|9a<# z_Bs>swGKU2tsr5$&vle)5Z^UM+Y@QUl54X{jD=MT;5Sr98hzVbn`%A8t+%5yK#zX6NA1$XUs%szGMttas@6V2&GNid6jSFnDTZ%LcT^B&5KbUJP434d= z_~G(JDRD(4g!#2*d=-Gus>%y{TCGH{_GF=D^uq+(qG1Q8Qs3zZF~b)G$E0 zS6esXAP;bLaG-yC8^8BEvsGNJ^vd-5nU1qKsn6k&`gAqKwRnyTr4@}5PJ?7<vAX3IClOCUZZjaSDJR`w7~}iSm?22P*A=L4k=m-x9689Y zrdmN`M_Y2gm^l{o&2hsGMs{*gOz^>eLNOMq!)mO0ChIe3e4EhB<6|T8u8fqC8C~E{ zv&5YSTwx{eQCHOU$n>Y=PP)h1S{3QFo*jUm%c#72_Nj5k5B;mVXSq;=+?I^}(&!zJSW9f{BW84ftAM~{SdX30hrSL8VY z(0ctGYWK7aJCgdwVgi1VI)eJZ|2F8;C|U*rK^XU$9?X87Y7#KS1+3`C#WctU{t(@A zlDyfXK^tkSF)|`r&Sf94kS{1lWT2m_DB)cdV?V-$({Ts^1IApS2Q&7-_`>eToVT%E z^=f{{UQosIsRTwy7mq2dX#yigou!NQ{*6!fr)g+{4U@46zDBi zI@u3OA9kc-Co0Z|y1KJ-v)#(q5wj{R8<$!75juF+tlY~WRzzmCV>=|FRf1imfiJ#A zI4bdGFI+8k;1^2}JfZr;oxY{kHQ%9?WP3qUmNuCuhVxFfTGJfr=y`)WX1v@NRnvUy z&0kU9+ehh@A}90B#~6zyFbZj8BwtYd$mF2aB~_c?f!O$S0Thx1u6gC^bgGaKI!D1E zC2e(AXD19}Cujja4@mad02(3U57|695l6`cVtKsoJ9>+?PbvAjMd#OQOJZjkgNj_~ zT#}SFt+#C}7kW%b{t8~n z6ZHzQ5uCSq>gH&CoomNTah%a&F(Z7os`|1u#emb`^2$1E;^+Bdf=r106T!(03MPev zN1BZ_Il~qxJMn4ex;_J%1C;Dq7%?{XbJx~|w45s`KNAs@r}HpGcmZG1lxIY}4HKFE z(@q7gvzjEU4vG}kWU}`zJ}XYO+K6%vRUe$MQA;A>FDGO8fuF=9R#p8LZz{TMvgtLD z+=kB(gs@K2bc3fy2lA|wr2e&(YOWJW5DAe-+ptw_B`XX^PI3E)3?97(xqd6Cz*T3p z3KBV#%1jzsta_8DkCBUh+|k;KILXY4HF;4Wwa2+|T%B*`Q{YlYO!hxKX*%xy7oR;> zFl_ebmFZt1eTTiX=aK(?Icp*r_JE2N&5C&((drkFf4htpgtE>nLuG;`y+7q3CL+z7 zMCWb|WbOBFf$NZa`M8y-2pL|n{+WWsrn7%XDuJ_uL%x(SO&DRl60Wfxnlz@m@vYI& z1vGzUsjK`JCOnX-^R}C*?%wkBr?9bAcLcJRcPnaRlVP*Do6j+P+^tVzrg#7h`0J6z({E0iF_m z+p4Zv6^V=xLXyG`oe!*WKF!YOQtT|Jxp-+lDJNjNrlPU`S9Sli|2LOCl{C>%mzB9M zVmjU1bt0XN{SgnlBm>8=?qAPp&~}3k13Y(siLMqEeECJz9K*6}-oZFx+NZqhZ*KqE zvJA*a3U*V(!FyyAnTA&ZXDF%hW`QB|QE${Lc5i%P$#@m6tG*;S;6uHX%zmiKUjygq z&~7zb?k%pCEIsdf>6o62(IM7c;!zOkZC7W$ZW9*>g4Crh4fHNWFNuMixfr2JqhBUHfnsk^5IYA zYA24eO~c8zi~>%Cd>LE?fBnAf=He?CBD%0(Nj$cSGq*C|8m|7YD87kk-rsLH+d)=Y z@s-rsNyu@bIFZ`KUTow&O!zP6X`CSqn!_e>?Gv_`(x_h3s8OEkxA?D;1XVw!nMzhi zIO58~^f%&2UYq0WNOMzp3{C8O>*Xb8sM;y0 zM7?nQC%?-%Zkr2q)0?BJNLJL3yc)*BWNVe8Wiy|ZLO_icr2XBPs0~$3S!mM+K~ZHO zD^S6*%(SJbRfZ_Fn3p0ZJ2;nPJ0qy@VJm8MX8QU@1f_uhhbys8-2`rX{XMVX)&8Zu zLtfr)9deTb#EYEA6vS~0&c+s53B1e4M?ft2Z~e$YqUs0L%pDt53*btw+&D=IZ`Nnb z;4a4GC2D!|4@L1`r(HLn>CZ;T)Z}TVss!az@kC{8gSf)V$+30Yk0t|FVcKIBzFpPn z_$?Z~{=T~G+o{5ZD)G_kXg8J9`uIfV5m#I@($(sOxtm!21tELm7v&HVEyEO>MZ8iN z`xN-8!63#%fBI~&iSo?Pu9X&Ca+FmnUFi@dET%x7(ZeHr{6>#(W*HQC0f>gEeN~9h0RFHlzwNtVyckZu< z*)DQvT<35_Ya46}mr{c9=xdw?uj$oE;GU>pI*1cT~si zpK7p9JztvpOOr&}t#S_kGWH(eJ8lY^MPdqBt%u#dGtyR_b;rtg=mrA4h)456PJzcC zbuDInHwBTH)B+Sf#VsJ;8B|IE7kaF`uwOzRgTJ(Q`0xcyAAVD62f{>ndG7dJod?J0SKdB8`8jT%AmFZ5#+_~FA~PC`Py%tt2&|+ zNX9lUt6FLg;qATqva=z0&4ooZ^M5ko=Nf5@18MmzxuLF-ksm5Zu>zH87_ z6lM-XB^gC4mZ(n48aXMZ4DocApRawhkTAB?@a=-8866Mz7FMBsa7yogEIT>R zq6F@34b~u&q#vDo!Yh7wFj=46Q@9{4=42mges}Q0%gwNFC)|CWd`l6KQKomq_ro8) z6nwi^8NdDbrdP6R1K)vDIqITZfS2VrgXW;L`Sd+TTLoYvpHq0@k@903o&9H`TSMh5 zL4$wsVd3*_y~RSxW1hV=KD?k^K-QHbeMu!d+N~}?pN69~?2x$oo})=-M;6nXN5r2C zvdDa7wgSY*&i!{D)Y4rX$31Sotcr7u;WR?P&&;-&U#p=tKZ*i#i1+Ax{Ps#|gfJ(p z>c`4z-9g48~(^KP2I+atA0^n{qODn$M3Z@tE`7+f&aACMkUB_xK~9n7}yim6Kb8u)H+zCl_ZEN@~_XN&<3b zqgRG@OLO`sk0?d9Z^x*us*>?nmS@Dm8=RUfj^kU%x%{Ii8* z%*5Z&mGyrn)>~PF7RN%V7%pF-OP9jEmO)n}r(WwU%4dxor<5><3636|Iw^zlFNc$2 zGY7!u$ROhe8jDJV>Z`{vr>(c@8k((WBufmdiCPb3{YzY+lr#Fy{+WLP2FA3yy`Bs= zj7l?QaGO5Y$4scDPjK!mU~u!0E-Bt+7jWEur0P3g9m!)+flHxA33fiBfIJL}vIX>Y!egyEwgr-0gvJb(osO{+g%Q7Qub}GyP}s$tQ}1&xjE?~a%t*=i zE_Pmq{M@y2Hg12c3}6J7FMf5+BP{2lTQgC~n?TN0@tCGx1kY`x>Jh?T6JRW46L$kt zP7lJDg!hE*>xE0PsoIOG;vR(qP_LypZe#3^>Q5(e(a^5Ex%unB-btwHn&VXQuTLXU zeC`;NhPAF@{d6uljNnsa=4OgAB)oShGS*zUTDs;UfLCp+*33z9`xuVkcI$26fU#>s zL-$?X!iBO>sBZ)BYzs&H09q5ObN%H+uyDz50{EXr{x2hrX zzewKqG82%cmZi;bmbYsaF_Lx;3T?%%&radadsBMxJRN!Vh2DutoHgVRPOjhT9~vZc z+Z!*{u5pJTmMY=WwAr|?D0rdh?E}}XpM^7&03&O{@Onb#Tm6pNQkUtHXE$f$LnM_# z4-f$ zm48dn9371IaIYsxwk*q+vPs3&T!sot65JRx+JjDV8Iw7GE-1;*`)!)F(gxuVBjy_= zd}&zHlL(p8+%X~x$5-UvgzYdvksoGeXW4$T3%AE(Ai(r;_rOQKK(jrgGeN@;JH7t> z{*W=%2&7ks#SZliTvjA&$wug2C%5;82VnhR$XyRW(-*@UG)dr${;9 z(z%2?xP|<-nqGV>EG>uw0f$-KIPJ$J%+tZl^4g`}5{bLE`&Z~a3++q&v;JAzT zBw+)2Ye{j?O1>=pZFuvmYaUoK3z}SQbF}m6zMLjv)VWdPlpl8KF>upHG&RRAe=q8Y z{Eiv!tKf9%4U!rk2E@V_(XI3fmEi6iuxzCyHj;c;$vRAU*+KD_xxq~ z|GKOsw*oN2!{}x!X(d5DxF@^y?k1aMB) z+&rsO(8H}x%ZENk^0JWpRm@n#u-~BZ_^aa$)B*OF#}*=-@AU1_`FWd}85E0+ zuvI|mo&4yatW2F_}`4dHQO#Fv4=Zy z8-*lPwpzq%$h1q2)1?91GzArgYP-$vhxBg7qUxzjIKq{$X;UlbFi+B84X9xVhMZ!b zrIDGX{&BJ>jXh2ryV(zzZ&~v=wR&}u#!1-wcVpeWJ~&25S};@Mk6w@m!^O?{?%3AJ z$%PK|^pL^p23v&>U&b^(?F(V-J9c-Ibd6#vGVF<`)UcaDB3?>E?b$k9;5Dfl=DFki zcAxD}1j;>-n^!XY7P)*CQH_W&50AdV;E0Xm7vzT~7r3xcvt;?w^6f{lJEucAlI+d6 z-l=N$3uzLw;}Yu@DHJp{w>z_m@9PEY6%aM4^|~tY-262w!HxVF(Xr=wC0l$>`#em^ zI&e`#DIfD4%;A#y-->+m&;+y5092Et`(D~`(1$zyr(4}1r$&*jLMrgkllZ-Q2d2$E z%FeOnuv5Gf0_9$XZhv}S8Avg+NcC7NLVur9@y&DYVz}F>>i+(+ z9wj6zexk_xi-B#Q?S{{4xX8EFq{29}`hjW`o{*zle4J~yBa8>8l60nvl=L$Ds*9*? z@{mCo@|FcSJjP#N$4+zg#Nssdx(V_w@Yb!_af)Qgt~ZpHq#0oRh8XbZAWitl^=DXr zxjb7K&lWAl(;c+oTp&y&J|6~XwwO9kt8kA7_?m>*hXMZJM}`aLfA*_(ql)@&lGgs?dz;MXo{GCpCy8`A3C;@78ELZu=MI zHI}0>_RGlMxIosQ|BipdG2Bd6RJorc&!6Di30fyNc?|q3VV~0mqv6^7a%RT@3nx9> zJ6c;Tj?Ki~t!|EGR8uPMYIq@0#CeCcV!1c){5IFb`>I06KKVI<#y@x_BNgiaP)Ai_A-#!oQ;G`!c5l z#eUlH(ePaFTJRx$HtVCcjZPY0J`1Q-$-SpYg)PvoX}@O|MxLqG(7hC#!o_WW!R^1a zAmGmFGQmzBLF`)pXY)vx@ST_reLeW>yft?DVk%xEEfhuiQ6#9c6uj(S?p3$L)vCF3 zUc$^};`8Xc?U`oVv9xGi6A!HBksE*|>=K(f!^{O=wP5RR%x?c%qSwKqj00O`kpO!O znXzsgHt!Lixw&I~Ev;zQ*1y}hA|b$q>S^>zS?-pZ9!~I7===1Yg0}PVOv~gcr!UnCzl(7`|Ww3 zb=Z~b8fE=ycUk=ZG228<6t6$rXo=>x5B?abm^t%z?`_16wm}#A+2X-Ih`Xii-y3Q3 zB{LM5Lg=b!*GHKsiH5h2UR_CnE zwz5gKuTdjWwBe(RQ3f~o#!Ed{GBwKn5s`AcGxaTJB&ouxpIMOp_h?M$@A>xNnf3lq zNK$Bku=dI2=qK2-gnHlDR9fLZXGyi5rOeBz5QDwKlk=U~STtz3>Qv z)6S!T3K}jBJ6F1pIW!bK;J0>bF!{T;a+8xzMjx$#7qT8dfe-jrBvOX{^&QlAkJvNV zwS>RB^*Or;*YVDSjdXZjKQ1>}e|q$At4pw9k*@mmQ&NgI_OVMk`>p2IJbH=YPBlFm zTqyOa6~wUp7)*|4t(}?ucbU@tLog&cA*>>s-w8gdQ$!NH79d6oChpC02XuWrwcUlJ zj|ananZwVVPI-qS2kWcPP)BSv?s&}_pD@p+Er|IB+81|>5@qW?czM}+QPw_dxFo1a z=3h)5`A+>Y*<3@T|09+3tyuWMGN0Im2{|@-yB}&o9-wEu@=YTc_1ysQ`Ds(u)Xg3u zWMQiDvAqtfR`NRePzzOsq8+Y?I}Df*)}6lQ1zQEc4o)?d2jb89KOGlx>&*!poZ**; z(Sc%W1^M;u!-1^J1+9yHmjGByLhTf!v_UcU@%Lw&c_hv#s(H8hg`zh_$_^vSqM$qWt}K^B*R@M&ov_Xw+jj+N=s=5a-bcq(2F50PyzcR+I$;I|qjU;tgk($7 z3HAsmbUC2D+tP*NZ#PC!Qo3sZ-MD$AXCMG`#*ld)Z-Fm)_NApWhXfCFR{TZuE&jxR z99=+E%#W}CcE+Az|3tv)>w3kjYM0DUUE1e+cN#>9VjzNmFz{=MR^79m4OM^-rMO}l z2#rm@G9BzCH83gF*0KUXT?$Q^fHoR2*M9*g$+M)3x`6YXMW0xosr zCah{xVkq2jGI1F|>R*Ltuh;AgUr_FeXNB_#W^joFuLLZPi!^2PyPQ?BI^6m>!_Ldx`Avu^`N)zjDv{fJ z@={81b!lo{YDi5{Yyvs*!@^x*(s$KF3h(jxxUwje!48NG?4m#p;;F(7tuip-tGG&{ z#sbMUN&D~iMU0?myN+6%;;lxbYuoSXRe?b{*JeB(DqSi&WK0@yN(jLa>rL2jafWN| z{buKxV&>e_48u#wjg#*rq8=0u{JfxwiA@Y}Ehs`5rSE=`1rZaYa)Z|`^dZhX!u<#6DJ=Hc%e*oMkgWJBa-lEGDwiB98MD&tyM2c^a z_q6g3F@gfS<32PG51Xq%jtf#9r_Z|( z8jT(+*WLP@w6qunLx-^fDk+}+ccPobv&~3tw>9^YY3E=rb_8-!$a6gDjOsJ*RK{aj zPAqPq6Zz6#aj8LXv#j*tdogluS{dtu*1WMQahuCF+Ij`+mWOE?4W0`Gk80}$+GQjZ zu-eU=sT67D(Hy4T&MyKd=ip2}G{5`djZHhZD1QMs`)r9Mw#G}e2`+m2%Vr$hPi zss&rl-nYyxZ1FgCDrXdYs!uFxvvX^poKyyn2=DBxYLiyne*ZLspPYPezJkXrR-&k= z45nwTFOz0i)cGEaUN8Q$;>36bnvCk6MCh&JyBA} z-=8(BOYJBDcr=NI)|=*owDh(@CFrxoxZ3M}Oa6;)V`2{3aEh^aH?SiOv^YPcIU{d3 zzxy;3=b27Vxg9?=Z~O+Q1JD zJ23QrJAGDmw&BtZ{mACU%U!{pNexP>6B*DkXjYnMRG0F9P4&Z@l)3T>YZPI|L#4QB#cTkM?@;(dW!{D9KpL z;jhm(Yp8C&FwZcdFEG>kVBQEI0t`U^;2Ddu30DNZ4G28ma;xVQx|)>8vpg}l#`Xkz zDCJA!!mfya-%HsRFhPDz;@CgTt5ggQS+(a-Jn`F-)3u-e-EOL!v^0(V(u@Iw8j-=^scChg`L zb9UYH%tIuu#YOhQ+VLht)5)&=sS_VG741!;i)P-zIf3P8nQy35*&cfCo< z-mOO@W=M#~F7lzP5>w1vQg_yLOoJRB<*IoDRb#IAFi}1-B`H;Rs`GAQQFu}cHm!bw z*6X$2Yd>@McP3GE$bM9`ae5-)VxuuNw{E7L^RM`-k7z~$-&u2(A7dPL49SFPo@fry zF~_wCoQsN|fs@vc-^~v>OH8R);WO+SBb@Vga$`ELM!$%?U?8I%`#UgYNn142gfo)k zl()HwK12@$73v&fs*3WBh~o@0JnW`PQxoMTaxL%ya$IuV_VrUK%674VxV$gr^w3JS zDTDr_q2SYizk9XsD#Jlz#&6dM6vDQiTI|p~=C_QDWtAN!JOM(TgQ;O2iuHF-x!9?B z6$Na59yR@nz~5)Q8t~JY=mhqhG;wY?Sg3ncsi#5fg>C?%Mg&mwk&6L0Pu@<8 z?EL^JZEKW`1{f@&yVCD@Us^d^ObOmM{K^Vgs8)e_*X(2}uQCSKOn;aGfkM9cpI7VS~s^i`xixGbxV zaB$oP;|h_(nzEU1PetWEQDo&NsDP&dN5_sHLYH9_#zHBSM_K}E( zA&zl^Z@)%;J-O{tgT2=rZPM9dnOG-MU+u~6ZQYtPJkg}KyA_#gRBNJfX329FKMnBTY8B{W&;^BogN|ON(r!_HoH1HTLw!x| zyu4(Tn|-Rs4c-d4aqD$>b3CzvRXlrg=X#xb(#j!!NtQ@5PdDX<5{DZ0hSJim{brs3 zI_s8_?>;G*#HZygm?ed%@$%Xi_IZa?4O(eERQg0RSBIt!#S}Pt2V<6I<3WazD7`KL$1`FYpmqv*7u4 z@MCRD#Vy?tc;_D&YadDOf=L{p^B14PSds)qXHfPv`=b$p?zHI^ZX^Gjl-*w7&L<*j zXD=!)TMf~;l_0A$&YM)wZ>Bzfa=1X zc>J2Lnr7FLrNvbw3fn}k+HO4ob3sCjF6o=DbP9LcT&Dx765!K2WEEK2OxC`io5KD# z8Jb=96i@A)vo4nfwZPibQeYvo^+ePvcv@RPl6c3M9{lw0dzb@_{!P)ApB8yR^et(x`f|eF`MhJ_1 zNqW6JlZ(xPxb$CH9r8q+;>>NUL(xouub5`jJSC9>dOF={thhY2ipaEI-)%~`9%8Br zV~~4@B83lY^28>#tJJioYapY#1Ml9NnS9ept0irZURP=~nb0>Q!Sao+?$c84KU}Ra zXY{gR@@*2eYc}Wj&+KjU{gArQzEZzoLX9tGy_eGVqqytdJ(EcEwjIx&yPevxMcgrm%}w$NRK6VcljigSd&WSz`Chcp{rd5f{%h zUbmIFb_RE`ENosi=Y?+#ZH3(^pipED3`|NxcFh*JcV@VOK3LUVSM(y+MLt-EdH#h9 zRkNw-82};VMPlFbYIqewYo+Eh#x7o%v2bsGwuY6rE^qSPG5Ua7hRx}V)yb(u7O!6!@_B}vtKKkpjLi}zF6}C?l`HSZ}L0e;nc{@cjlA+)?L+N z51$24?kcbRC|kYInytpPay2^J8Oc=cidX&8@nTe6JD;+ojfErKn=yf z;l>;PsybvBopUVZPbt`qS~lmtIG|M9u!pVRPTxvhe(8EMX%yZDOkUr;vNu+db;7dARQ3q2jc| zOWhRL@rKiyp?@U}RnG!zI7(gsF-S*$#5bQ8CvH%-{gau}Cq7wbnr4=1ITE#$BOFwg ztRA9B;qQrj+dZB8#Xq!_f2vyVNt{s7^p7KXC}uBJo%kaH(ekR$EN?)_VW*^P>>X!S zta1F4ezNsG@e@?p>GV8TsWjopj@GMI{$0aMRn?>HqC0y#L5W&|J{zBkw|s%6YB44PF1c#)v&Z>-bc#hxpkepQ`ykG3O^`4NStqYqnf}B z#+sK+v^3E{Tq;8CwVWaASlXj^4SRY6KiU1_6eGEje$5QBwxt>1`Yw5cD zX38ntu|$lQe`!(qZxJoaU_oJoP<`Wmkb#M@ht=jN;50))ox5m3CHlp0a&ng0?%Mcv z!`0eV15{+i_UX2zPgzP|EhBJ?-)D%$| z=KxzpOZNjMoX+@ca)i*#a)_`FHru~ky{Yd8FEqDUgHJoTSE66+wsfUI?)tKLO-W)w z^-Es&8M6WTV$NlM*9l5MH2Th6n>${MMLrMfpGw?;IEF9NTs=^RZXC_GeJIVfo+~|c z+EZ9(zhVI46SA`p^P=ciF?>GY#a=RHe@8$H=hgp`OqxFz?9;@->M5LvXnDQ4V@IzZ ztzKfgHdu`bLPPqq2Q?)vjbFGeYvb5 ztev#la{u1oE6c#vm>au{9d8tYXKz8W)TdkMU?J+!^n(ARm6ZEXo0ewLw3(KMP+hH= zBn;~hh%b>g0ObZ1I11ZS8E`Q zC&Q-GC|{wUNzOfaYNEj<&^+;ESA#=`6!W6Z6l~PLQr~^0!U=OEaD*$=Iry;Y-s2%L6TJmHj zg9H(Oi3tzu++~3S^>HF%+|RXGw!|ALEyJqa4DJ?li^MGClIX-qW>-Y4jsrW2OGmlL zS2UoQ2rklRFA2-fNA?-A=_WUMZun3|yzY1mC~H1Ad9ZTKlKI$eAg>V?Mk90a1RNrG zw>wPP3t0C{+NqW_HIzJb+S4>4sL4!%L4cQSeBe}>Ndp9w#XdJ1PBb{lhd;7OnN5tbu!3 zlqKxeGD(bhRoZ(PJ?P8e4JU}2@wD_#;VCkwyLtGzXaCHZPk)y>wI78<)CV+HXV$^S5tv62&iyFn$`i>Z zzdPkf_Nfzr;jN=7ycJpF#!n;<&3D62*uwaH4*P!UmkR5lDsGv1I~jd4=1Zj;O-wF! zZZB?&KXExjo@WAB7@Xqmlv@Qv{$CLd!GKt>@?i-mW$Wc(k?mb!q0ATOk_>hImIdef z{NbRnxqoUTAb|(#+zj*haG6VkpF$M9jiRY>-r7?#g{*@tN|yeLp{s3!BScQ5(^zYn zrsJcEKQIG5-)I;6`J`2A%G=+|i+T5Drj0EgPz~OT!9rR_1j6&9!4ZJWgZ;PCj_Rx0 zEW`_Fp^a`l(CuC@rIlhY?)eV7H2IM@sB_mn;O^q{d&d=T}CR%Ds$TZQcj}5rb z&Q|}^f4WbfV-f5O@NMZ%36l^WrI2I+op94?C;7R3>_f>`kjH^RzUIpgUO{Qb)sT$% zvGbpFn0zn8xk+Ed{}eEWgSR_mk)6O$n2U78)r`umSCI8rs#*j6JhF7n8g8k>6JjR>1dP;(xSGd{ncREIv6(>gP_eTOSwGU&P+6>RS zB2OohO-oy495zY%oWs6vHYx|B(`+`j;$^_hoFca>t}6PA4gawl(FE2}BrxFXxW4)T zChw|9^5n zHP^@4GoLLPGnL&rDsm|dWGN-G4&PFRu0u{?W>TuvueUo`-e`vg+-pXEE4qO|*{S3T zxbA5*bF>mA!v7-rlTeUXE0~qD{U}ocM)-6QpK8g)&y2Am!Mct{jZ_p=C@F9gzR3c`nAvi4*<=MU9$cp zqawCEl8awd(8O;iUkV`VnPAN?y04BaDHbm<4b7cQXnGVuy^seTJwJq4tBgedxk;Yw zzJZ~~{Q8~^7&7d|UgrN0FzkHW-s4yq^1q?V`fevXF7RZXkc3tdprhMc{>}2{gBgXPbc?^lZx_bXKGVk~+G4aOWJX=KEIfADm(P*6 zTibK`<-TcVzV_rAPtf@-JnhQY_g+_{z8H6plDmi3KggTbdNy)(Gv;I%7e9O|uDs`(##)OjnWI_AlM z_>r4nHa$^N@{p(vHC}Vhql+Q9f6|3DZ8;WND$V z?0Uu0zZ7r-`*VPAT%wq4#xGf}b7HxhIXc8m8_vxPvF+{{jRlOlX~UC{0-I`Q!MKZ? z_Zz4TzW1^E0Iu?&P-7*nw`aW~mLaJR9(spUUm1Q*tW}=v;fl93hpee{`jq7K106&g zOA^9=Ix6g_pBfkEP z9Z3rGkeEdnAn?X&3La(+$>u>H!h1t0fw-7o8(pgmfhvbc@>c}n;u{kc_huq- z+-0n$eh5LTd*(%Zq0wWo!@9khN+JtARz~%eU>m@Ks5G{Sz;pl%JB=~5q*{4ck?35Ap zc$#Y9Ud|)jfn~VAHq+z_Pt8Pgf4@XaX_LXW>YwO*_Fol4Kc5-NeD)8k5u^<8ovC;D zi0QXvndI|#Qn0vJeI;p)QwgR1TOSzw7?tO&GnX@hM=c9)=J?r40{s8U8n`Vc=>H`b z3!`k>>DSS>BExz?0>BX;T$E6(5BN*i3=h!TLnz>^d3ksLuk(x~PlrDSO~ zCrXNo{X4~vC=ZhA8^SRDZSrf82aU`zspX6a*~BXR{z^)O|mZ@+d7~k^4!k) z9|F?|q%U6%tu2-3KmqUU))a#1oDS;-$_v2*#TOX|;;F%q7dj-lGXv&q)fOEccaJmU zmZR(5z$9@8=0I)|gL{q?NLpjf4NnINB%rz%?r#YM|*Sr$!413CxEdl4MWx&fk z`_+}V`*^FvbMsWVLJ! zD^#Ns8Ok`>-HrD&xTguFb=BpXDQQ={Jrx!M6K**L;YgHa52UXRu+BrRMF;b)+8)I^ zmgU8b|2zAHe8+*0`H$m`XSW_WW5|}-GG08T%+RlvkTqUwQbwhgb;2SK8 zPWCb#!h=?yw~q+1D(PFksQp8SK4By?D%7A1+`25Ps-~*hW|rUn%GvTf?uWlNth9)Y zTiYqMbNhNaR(Ts*mlMN*7&R%UZ3Yh1?yp_u7q6x@ek`!w#Pv3Ry}otwmEH$#9Z)!< z&BboPVYsb%n)u{3A@k|-3+6{6;oz;o*>EIy(*{H=q`sQj-S)cVVROYwaPiG+$AMgm z#I*x~w`mwVH*#HFX$??()UQJF1^I5(?=ggpsP(^KqBt~voNOD_U)>yX3Hf+|s;#rW zoNtVSkC8^p#CW{8_U`uySrDBjU}vm-BTBZ!4c&sgq~V`zKLccK|KLg{iFNv({u}@5 z&H}}hp6nR9^z}qy*2s$+6oBmjmGhvxPa0~FC5RrfF@x~~NIB~B-w;UA3tLi&g$Y?f zM1$bP;+mk>if^tQzS+ZDEB+0SyldkUkVQ%f?BqUVH=+Q*;ct#EcU)w^RW-w%EZd!5 zn??e)jrPEZPP@&AqJ_#|DMD+wMOWnp7loR;l+&hs<5EYCfPFI0&8&YsioTx2jf_{`gmPh2CB+B8<&~i2$2&!?Gzc)f5t~XR*{M+m`&k3 zy3WpRb*TT

  2. 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

t6fx_D^{L%q=|dwxt&Ry{?JA?k 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

0;tHWi>x9fs3WBG%9V6h+NK$yiLGtlJ9 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 E&nF-w{DyF~$O;&5>Xv;|D~xo%6`vp~_Z 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ℑ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

8+OOp;eU>%u9~p*S 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�WCg~XJ>C-?J0~5GP(Lp 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

L-tdehwMB|3cKXZizF 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