synor/sdk/cpp/include/synor/rpc.hpp
Gulshan Yadav 74b82d2bb2 Add Synor Storage and Wallet SDKs for Swift
- Implement SynorStorage class for decentralized storage operations including upload, download, pinning, and CAR file management.
- Create supporting types and models for storage operations such as UploadOptions, Pin, and StorageConfig.
- Implement SynorWallet class for wallet operations including wallet creation, address generation, transaction signing, and balance queries.
- Create supporting types and models for wallet operations such as Wallet, Address, and Transaction.
- Introduce error handling for both storage and wallet operations.
2026-01-27 01:56:45 +05:30

219 lines
5.3 KiB
C++

/**
* @file rpc.hpp
* @brief Synor RPC SDK for C++
*
* Modern C++17 SDK for blockchain queries and real-time subscriptions.
*/
#pragma once
#include <string>
#include <vector>
#include <optional>
#include <future>
#include <memory>
#include <functional>
#include <cstdint>
#include "wallet.hpp" // For Network, Priority, SynorException
namespace synor {
namespace rpc {
/// Transaction status
enum class TransactionStatus {
Pending,
Confirmed,
Failed
};
/// RPC configuration
struct Config {
std::string api_key;
std::string endpoint = "https://rpc.synor.io/v1";
std::string ws_endpoint = "wss://rpc.synor.io/v1/ws";
Network network = Network::Mainnet;
uint32_t timeout_ms = 30000;
uint32_t retries = 3;
bool debug = false;
};
/// Block header
struct BlockHeader {
std::string hash;
int64_t height;
std::string previous_hash;
int64_t timestamp;
int32_t version;
std::string merkle_root;
int64_t nonce;
double difficulty;
};
/// Script public key
struct ScriptPubKey {
std::string asm_code;
std::string hex;
std::string type;
std::optional<std::string> address;
};
/// Transaction input
struct TransactionInput {
std::string txid;
int32_t vout;
std::optional<std::string> script_sig;
int64_t sequence;
std::vector<std::string> witness;
};
/// Transaction output
struct TransactionOutput {
int64_t value;
int32_t n;
ScriptPubKey script_pubkey;
};
/// Transaction
struct Transaction {
std::string txid;
std::string hash;
int32_t version;
int32_t size;
int32_t weight;
int64_t lock_time;
std::vector<TransactionInput> inputs;
std::vector<TransactionOutput> outputs;
int64_t fee;
int32_t confirmations;
std::optional<std::string> block_hash;
std::optional<int64_t> block_height;
std::optional<int64_t> timestamp;
TransactionStatus status = TransactionStatus::Pending;
};
/// Block
struct Block {
std::string hash;
int64_t height;
std::string previous_hash;
int64_t timestamp;
int32_t version;
std::string merkle_root;
int64_t nonce;
double difficulty;
std::vector<Transaction> transactions;
int32_t size;
int32_t weight;
};
/// Chain information
struct ChainInfo {
std::string chain;
int64_t blocks;
int64_t headers;
std::string best_block_hash;
double difficulty;
int64_t median_time;
double verification_progress;
std::string chain_work;
bool pruned;
};
/// Mempool information
struct MempoolInfo {
int32_t size;
int64_t bytes;
int64_t usage;
int64_t max_mempool;
double mempool_min_fee;
double min_relay_tx_fee;
};
/// Fee estimate
struct FeeEstimate {
Priority priority;
int64_t fee_rate;
int32_t estimated_blocks;
};
/// Transaction submission result
struct SubmitResult {
std::string txid;
bool accepted;
std::optional<std::string> reason;
};
/// Subscription handle
class Subscription {
public:
Subscription(const std::string& id, const std::string& channel,
std::function<void()> on_cancel);
~Subscription();
Subscription(const Subscription&) = delete;
Subscription& operator=(const Subscription&) = delete;
Subscription(Subscription&&) noexcept;
Subscription& operator=(Subscription&&) noexcept;
const std::string& id() const { return id_; }
const std::string& channel() const { return channel_; }
void cancel();
private:
std::string id_;
std::string channel_;
std::function<void()> on_cancel_;
};
/// RPC client
class Client {
public:
explicit Client(const Config& config);
~Client();
Client(const Client&) = delete;
Client& operator=(const Client&) = delete;
Client(Client&&) noexcept;
Client& operator=(Client&&) noexcept;
// Block operations
Block get_latest_block();
std::future<Block> get_latest_block_async();
Block get_block(const std::string& hash_or_height);
BlockHeader get_block_header(const std::string& hash_or_height);
std::vector<Block> get_blocks(int64_t start_height, int64_t end_height);
// Transaction operations
Transaction get_transaction(const std::string& txid);
std::string get_raw_transaction(const std::string& txid);
SubmitResult send_raw_transaction(const std::string& hex);
Transaction decode_raw_transaction(const std::string& hex);
std::vector<Transaction> get_address_transactions(
const std::string& address, int32_t limit = 50, int32_t offset = 0);
// Fee estimation
FeeEstimate estimate_fee(Priority priority = Priority::Medium);
std::map<Priority, FeeEstimate> get_all_fee_estimates();
// Chain information
ChainInfo get_chain_info();
MempoolInfo get_mempool_info();
std::vector<std::string> get_mempool_transactions(int32_t limit = 100);
// Subscriptions
std::unique_ptr<Subscription> subscribe_blocks(
std::function<void(const Block&)> callback);
std::unique_ptr<Subscription> subscribe_address(
const std::string& address,
std::function<void(const Transaction&)> callback);
std::unique_ptr<Subscription> subscribe_mempool(
std::function<void(const Transaction&)> callback);
private:
class Impl;
std::unique_ptr<Impl> impl_;
};
} // namespace rpc
} // namespace synor