ObsidianDragon - DragonX ImGui Wallet

Full-node GUI wallet for DragonX cryptocurrency.
Built with Dear ImGui, SDL3, and OpenGL3/DX11.

Features:
- Send/receive shielded and transparent transactions
- Autoshield with merged transaction display
- Built-in CPU mining (xmrig)
- Peer management and network monitoring
- Wallet encryption with PIN lock
- QR code generation for receive addresses
- Transaction history with pagination
- Console for direct RPC commands
- Cross-platform (Linux, Windows)
This commit is contained in:
2026-02-26 02:31:52 -06:00
commit 3aee55b49c
306 changed files with 177789 additions and 0 deletions

179
src/rpc/rpc_client.h Normal file
View File

@@ -0,0 +1,179 @@
// DragonX Wallet - ImGui Edition
// Copyright 2024-2026 The Hush Developers
// Released under the GPLv3
#pragma once
#include "types.h"
#include <string>
#include <functional>
#include <memory>
#include <mutex>
#include <nlohmann/json.hpp>
namespace dragonx {
namespace rpc {
using json = nlohmann::json;
using Callback = std::function<void(const json&)>;
using ErrorCallback = std::function<void(const std::string&)>;
/**
* @brief JSON-RPC client for dragonxd
*
* Handles all communication with the dragonxd daemon via JSON-RPC.
*/
class RPCClient {
public:
RPCClient();
~RPCClient();
// Non-copyable
RPCClient(const RPCClient&) = delete;
RPCClient& operator=(const RPCClient&) = delete;
/**
* @brief Connect to dragonxd
* @param host RPC host (default: 127.0.0.1)
* @param port RPC port (default: 18031)
* @param user RPC username
* @param password RPC password
* @return true if connection successful
*/
bool connect(const std::string& host, const std::string& port,
const std::string& user, const std::string& password);
/**
* @brief Disconnect from dragonxd
*/
void disconnect();
/**
* @brief Check if connected
*/
bool isConnected() const { return connected_; }
/**
* @brief Make a raw RPC call
* @param method RPC method name
* @param params Method parameters (optional)
* @return JSON response or null on error
*/
json call(const std::string& method, const json& params = json::array());
/**
* @brief Make a raw RPC call and return the result field as a string
* @param method RPC method name
* @param params Method parameters (optional)
* @return Raw JSON string of the "result" field (preserves key order)
*/
std::string callRaw(const std::string& method, const json& params = json::array());
// High-level API methods - mirror the Qt version
// Info methods
void getInfo(Callback cb, ErrorCallback err = nullptr);
void getBlockchainInfo(Callback cb, ErrorCallback err = nullptr);
void getMiningInfo(Callback cb, ErrorCallback err = nullptr);
// Balance methods
void getBalance(Callback cb, ErrorCallback err = nullptr);
void z_getTotalBalance(Callback cb, ErrorCallback err = nullptr);
void listUnspent(Callback cb, ErrorCallback err = nullptr);
void z_listUnspent(Callback cb, ErrorCallback err = nullptr);
// Address methods
void getAddressesByAccount(Callback cb, ErrorCallback err = nullptr);
void z_listAddresses(Callback cb, ErrorCallback err = nullptr);
void getNewAddress(Callback cb, ErrorCallback err = nullptr);
void z_getNewAddress(Callback cb, ErrorCallback err = nullptr);
// Transaction methods
void listTransactions(int count, Callback cb, ErrorCallback err = nullptr);
void z_viewTransaction(const std::string& txid, Callback cb, ErrorCallback err = nullptr);
void getRawTransaction(const std::string& txid, Callback cb, ErrorCallback err = nullptr);
void sendToAddress(const std::string& address, double amount, Callback cb, ErrorCallback err = nullptr);
void z_sendMany(const std::string& from, const json& recipients, Callback cb, ErrorCallback err = nullptr);
// Mining methods
void setGenerate(bool generate, int threads, Callback cb, ErrorCallback err = nullptr);
void getNetworkHashPS(Callback cb, ErrorCallback err = nullptr);
void getLocalHashrate(Callback cb, ErrorCallback err = nullptr);
// Peer methods
void getPeerInfo(Callback cb, ErrorCallback err = nullptr);
void listBanned(Callback cb, ErrorCallback err = nullptr);
void setBan(const std::string& ip, const std::string& command, Callback cb, ErrorCallback err = nullptr, int bantime = 86400);
void clearBanned(Callback cb, ErrorCallback err = nullptr);
// Key management
void dumpPrivKey(const std::string& address, Callback cb, ErrorCallback err = nullptr);
void z_exportKey(const std::string& address, Callback cb, ErrorCallback err = nullptr);
void z_exportViewingKey(const std::string& address, Callback cb, ErrorCallback err = nullptr);
void importPrivKey(const std::string& key, bool rescan, Callback cb, ErrorCallback err = nullptr);
void z_importKey(const std::string& key, bool rescan, Callback cb, ErrorCallback err = nullptr);
// Utility
void validateAddress(const std::string& address, Callback cb, ErrorCallback err = nullptr);
void z_validateAddress(const std::string& address, Callback cb, ErrorCallback err = nullptr);
void getBlock(const std::string& hash_or_height, Callback cb, ErrorCallback err = nullptr);
void getBlockHash(int height, Callback cb, ErrorCallback err = nullptr);
void getTransaction(const std::string& txid, Callback cb, ErrorCallback err = nullptr);
void getWalletInfo(Callback cb, ErrorCallback err = nullptr);
void stop(Callback cb, ErrorCallback err = nullptr);
// Wallet maintenance
void rescanBlockchain(int startHeight, Callback cb, ErrorCallback err = nullptr);
// Wallet encryption & locking
void encryptWallet(const std::string& passphrase, Callback cb, ErrorCallback err = nullptr);
void walletPassphrase(const std::string& passphrase, int timeout, Callback cb, ErrorCallback err = nullptr);
void walletLock(Callback cb, ErrorCallback err = nullptr);
void walletPassphraseChange(const std::string& oldPass, const std::string& newPass,
Callback cb, ErrorCallback err = nullptr);
// Wallet export/import (for decrypt flow)
void z_exportWallet(const std::string& filename, Callback cb, ErrorCallback err = nullptr);
void z_importWallet(const std::string& filename, Callback cb, ErrorCallback err = nullptr);
// Shielding operations
void z_shieldCoinbase(const std::string& fromAddr, const std::string& toAddr,
double fee, int limit, Callback cb, ErrorCallback err = nullptr);
void z_mergeToAddress(const std::vector<std::string>& fromAddrs, const std::string& toAddr,
double fee, int limit, Callback cb, ErrorCallback err = nullptr);
// Operation status monitoring
void z_getOperationStatus(const std::vector<std::string>& opids, Callback cb, ErrorCallback err = nullptr);
void z_getOperationResult(const std::vector<std::string>& opids, Callback cb, ErrorCallback err = nullptr);
// Received transactions
void z_listReceivedByAddress(const std::string& address, int minconf, Callback cb, ErrorCallback err = nullptr);
// Unified callback versions (result + error)
using UnifiedCallback = std::function<void(const json& result, const std::string& error)>;
void getInfo(UnifiedCallback cb);
void rescanBlockchain(int startHeight, UnifiedCallback cb);
void z_shieldCoinbase(const std::string& fromAddr, const std::string& toAddr,
double fee, int limit, UnifiedCallback cb);
void z_mergeToAddress(const std::vector<std::string>& fromAddrs, const std::string& toAddr,
double fee, int limit, UnifiedCallback cb);
void z_getOperationStatus(const std::vector<std::string>& opids, UnifiedCallback cb);
void getBlock(int height, UnifiedCallback cb);
private:
json makePayload(const std::string& method, const json& params = json::array());
void doRPC(const std::string& method, const json& params, Callback cb, ErrorCallback err);
std::string host_;
std::string port_;
std::string auth_; // Base64 encoded "user:password"
bool connected_ = false;
mutable std::recursive_mutex curl_mutex_; // serializes all curl handle access
// HTTP client (implementation hidden)
class Impl;
std::unique_ptr<Impl> impl_;
};
} // namespace rpc
} // namespace dragonx