You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
892 lines
34 KiB
892 lines
34 KiB
7 years ago
|
// Copyright (c) 2014-2017, The Monero Project
|
||
8 years ago
|
//
|
||
|
// All rights reserved.
|
||
|
//
|
||
|
// Redistribution and use in source and binary forms, with or without modification, are
|
||
|
// permitted provided that the following conditions are met:
|
||
|
//
|
||
|
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||
|
// conditions and the following disclaimer.
|
||
|
//
|
||
|
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||
|
// of conditions and the following disclaimer in the documentation and/or other
|
||
|
// materials provided with the distribution.
|
||
|
//
|
||
|
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||
|
// used to endorse or promote products derived from this software without specific
|
||
|
// prior written permission.
|
||
|
//
|
||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||
|
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||
|
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||
|
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||
|
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||
|
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
//
|
||
|
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
|
||
|
#include <string>
|
||
8 years ago
|
#include <vector>
|
||
7 years ago
|
#include <set>
|
||
8 years ago
|
#include <ctime>
|
||
8 years ago
|
#include <iostream>
|
||
8 years ago
|
|
||
|
// Public interface for libwallet library
|
||
8 years ago
|
namespace Monero {
|
||
8 years ago
|
|
||
8 years ago
|
namespace Utils {
|
||
|
bool isAddressLocal(const std::string &hostaddr);
|
||
|
}
|
||
8 years ago
|
|
||
|
template<typename T>
|
||
|
class optional {
|
||
|
public:
|
||
|
optional(): set(false) {}
|
||
|
optional(const T &t): t(t), set(true) {}
|
||
|
const T &operator*() const { return t; }
|
||
|
T &operator*() { return t; }
|
||
|
operator bool() const { return set; }
|
||
|
private:
|
||
|
T t;
|
||
|
bool set;
|
||
|
};
|
||
|
|
||
8 years ago
|
/**
|
||
8 years ago
|
* @brief Transaction-like interface for sending money
|
||
8 years ago
|
*/
|
||
8 years ago
|
struct PendingTransaction
|
||
8 years ago
|
{
|
||
|
enum Status {
|
||
|
Status_Ok,
|
||
8 years ago
|
Status_Error,
|
||
|
Status_Critical
|
||
8 years ago
|
};
|
||
8 years ago
|
|
||
|
enum Priority {
|
||
|
Priority_Low = 1,
|
||
|
Priority_Medium = 2,
|
||
|
Priority_High = 3,
|
||
|
Priority_Last
|
||
|
};
|
||
|
|
||
8 years ago
|
virtual ~PendingTransaction() = 0;
|
||
8 years ago
|
virtual int status() const = 0;
|
||
|
virtual std::string errorString() const = 0;
|
||
7 years ago
|
// commit transaction or save to file if filename is provided.
|
||
|
virtual bool commit(const std::string &filename = "", bool overwrite = false) = 0;
|
||
8 years ago
|
virtual uint64_t amount() const = 0;
|
||
|
virtual uint64_t dust() const = 0;
|
||
|
virtual uint64_t fee() const = 0;
|
||
8 years ago
|
virtual std::vector<std::string> txid() const = 0;
|
||
8 years ago
|
/*!
|
||
|
* \brief txCount - number of transactions current transaction will be splitted to
|
||
|
* \return
|
||
|
*/
|
||
|
virtual uint64_t txCount() const = 0;
|
||
7 years ago
|
virtual std::vector<uint32_t> subaddrAccount() const = 0;
|
||
|
virtual std::vector<std::set<uint32_t>> subaddrIndices() const = 0;
|
||
8 years ago
|
};
|
||
8 years ago
|
|
||
7 years ago
|
/**
|
||
|
* @brief Transaction-like interface for sending money
|
||
|
*/
|
||
|
struct UnsignedTransaction
|
||
|
{
|
||
|
enum Status {
|
||
|
Status_Ok,
|
||
|
Status_Error,
|
||
|
Status_Critical
|
||
|
};
|
||
|
|
||
|
enum Priority {
|
||
|
Priority_Low = 1,
|
||
|
Priority_Medium = 2,
|
||
|
Priority_High = 3,
|
||
|
Priority_Last
|
||
|
};
|
||
|
|
||
|
virtual ~UnsignedTransaction() = 0;
|
||
|
virtual int status() const = 0;
|
||
|
virtual std::string errorString() const = 0;
|
||
|
virtual std::vector<uint64_t> amount() const = 0;
|
||
|
virtual std::vector<uint64_t> fee() const = 0;
|
||
|
virtual std::vector<uint64_t> mixin() const = 0;
|
||
|
// returns a string with information about all transactions.
|
||
|
virtual std::string confirmationMessage() const = 0;
|
||
|
virtual std::vector<std::string> paymentId() const = 0;
|
||
|
virtual std::vector<std::string> recipientAddress() const = 0;
|
||
|
virtual uint64_t minMixinCount() const = 0;
|
||
|
/*!
|
||
|
* \brief txCount - number of transactions current transaction will be splitted to
|
||
|
* \return
|
||
|
*/
|
||
|
virtual uint64_t txCount() const = 0;
|
||
|
/*!
|
||
|
* @brief sign - Sign txs and saves to file
|
||
|
* @param signedFileName
|
||
|
* return - true on success
|
||
|
*/
|
||
|
virtual bool sign(const std::string &signedFileName) = 0;
|
||
|
};
|
||
|
|
||
8 years ago
|
/**
|
||
|
* @brief The TransactionInfo - interface for displaying transaction information
|
||
|
*/
|
||
|
struct TransactionInfo
|
||
|
{
|
||
|
enum Direction {
|
||
|
Direction_In,
|
||
|
Direction_Out
|
||
|
};
|
||
8 years ago
|
|
||
|
struct Transfer {
|
||
|
Transfer(uint64_t _amount, const std::string &address);
|
||
|
const uint64_t amount;
|
||
|
const std::string address;
|
||
|
};
|
||
|
|
||
8 years ago
|
virtual ~TransactionInfo() = 0;
|
||
8 years ago
|
virtual int direction() const = 0;
|
||
8 years ago
|
virtual bool isPending() const = 0;
|
||
8 years ago
|
virtual bool isFailed() const = 0;
|
||
|
virtual uint64_t amount() const = 0;
|
||
|
virtual uint64_t fee() const = 0;
|
||
8 years ago
|
virtual uint64_t blockHeight() const = 0;
|
||
7 years ago
|
virtual std::set<uint32_t> subaddrIndex() const = 0;
|
||
|
virtual uint32_t subaddrAccount() const = 0;
|
||
|
virtual std::string label() const = 0;
|
||
7 years ago
|
virtual uint64_t confirmations() const = 0;
|
||
7 years ago
|
virtual uint64_t unlockTime() const = 0;
|
||
8 years ago
|
//! transaction_id
|
||
8 years ago
|
virtual std::string hash() const = 0;
|
||
8 years ago
|
virtual std::time_t timestamp() const = 0;
|
||
|
virtual std::string paymentId() const = 0;
|
||
8 years ago
|
//! only applicable for output transactions
|
||
|
virtual const std::vector<Transfer> & transfers() const = 0;
|
||
8 years ago
|
};
|
||
8 years ago
|
/**
|
||
|
* @brief The TransactionHistory - interface for displaying transaction history
|
||
|
*/
|
||
|
struct TransactionHistory
|
||
|
{
|
||
|
virtual ~TransactionHistory() = 0;
|
||
|
virtual int count() const = 0;
|
||
|
virtual TransactionInfo * transaction(int index) const = 0;
|
||
|
virtual TransactionInfo * transaction(const std::string &id) const = 0;
|
||
|
virtual std::vector<TransactionInfo*> getAll() const = 0;
|
||
|
virtual void refresh() = 0;
|
||
|
};
|
||
|
|
||
8 years ago
|
/**
|
||
|
* @brief AddressBookRow - provides functions to manage address book
|
||
|
*/
|
||
|
struct AddressBookRow {
|
||
|
public:
|
||
8 years ago
|
AddressBookRow(std::size_t _rowId, const std::string &_address, const std::string &_paymentId, const std::string &_description):
|
||
8 years ago
|
m_rowId(_rowId),
|
||
|
m_address(_address),
|
||
|
m_paymentId(_paymentId),
|
||
|
m_description(_description) {}
|
||
|
|
||
|
private:
|
||
8 years ago
|
std::size_t m_rowId;
|
||
8 years ago
|
std::string m_address;
|
||
|
std::string m_paymentId;
|
||
|
std::string m_description;
|
||
|
public:
|
||
|
std::string extra;
|
||
|
std::string getAddress() const {return m_address;}
|
||
|
std::string getDescription() const {return m_description;}
|
||
|
std::string getPaymentId() const {return m_paymentId;}
|
||
8 years ago
|
std::size_t getRowId() const {return m_rowId;}
|
||
8 years ago
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief The AddressBook - interface for
|
||
|
Book
|
||
|
*/
|
||
|
struct AddressBook
|
||
|
{
|
||
|
enum ErrorCode {
|
||
|
Status_Ok,
|
||
|
General_Error,
|
||
|
Invalid_Address,
|
||
|
Invalid_Payment_Id
|
||
|
};
|
||
|
virtual ~AddressBook() = 0;
|
||
|
virtual std::vector<AddressBookRow*> getAll() const = 0;
|
||
|
virtual bool addRow(const std::string &dst_addr , const std::string &payment_id, const std::string &description) = 0;
|
||
8 years ago
|
virtual bool deleteRow(std::size_t rowId) = 0;
|
||
8 years ago
|
virtual void refresh() = 0;
|
||
|
virtual std::string errorString() const = 0;
|
||
|
virtual int errorCode() const = 0;
|
||
7 years ago
|
virtual int lookupPaymentID(const std::string &payment_id) const = 0;
|
||
8 years ago
|
};
|
||
8 years ago
|
|
||
7 years ago
|
struct SubaddressRow {
|
||
|
public:
|
||
|
SubaddressRow(std::size_t _rowId, const std::string &_address, const std::string &_label):
|
||
|
m_rowId(_rowId),
|
||
|
m_address(_address),
|
||
|
m_label(_label) {}
|
||
|
|
||
|
private:
|
||
|
std::size_t m_rowId;
|
||
|
std::string m_address;
|
||
|
std::string m_label;
|
||
|
public:
|
||
|
std::string extra;
|
||
|
std::string getAddress() const {return m_address;}
|
||
|
std::string getLabel() const {return m_label;}
|
||
|
std::size_t getRowId() const {return m_rowId;}
|
||
|
};
|
||
|
|
||
|
struct Subaddress
|
||
|
{
|
||
|
virtual ~Subaddress() = 0;
|
||
|
virtual std::vector<SubaddressRow*> getAll() const = 0;
|
||
|
virtual void addRow(uint32_t accountIndex, const std::string &label) = 0;
|
||
|
virtual void setLabel(uint32_t accountIndex, uint32_t addressIndex, const std::string &label) = 0;
|
||
|
virtual void refresh(uint32_t accountIndex) = 0;
|
||
|
};
|
||
|
|
||
|
struct SubaddressAccountRow {
|
||
|
public:
|
||
|
SubaddressAccountRow(std::size_t _rowId, const std::string &_address, const std::string &_label, const std::string &_balance, const std::string &_unlockedBalance):
|
||
|
m_rowId(_rowId),
|
||
|
m_address(_address),
|
||
|
m_label(_label),
|
||
|
m_balance(_balance),
|
||
|
m_unlockedBalance(_unlockedBalance) {}
|
||
|
|
||
|
private:
|
||
|
std::size_t m_rowId;
|
||
|
std::string m_address;
|
||
|
std::string m_label;
|
||
|
std::string m_balance;
|
||
|
std::string m_unlockedBalance;
|
||
|
public:
|
||
|
std::string extra;
|
||
|
std::string getAddress() const {return m_address;}
|
||
|
std::string getLabel() const {return m_label;}
|
||
|
std::string getBalance() const {return m_balance;}
|
||
|
std::string getUnlockedBalance() const {return m_unlockedBalance;}
|
||
|
std::size_t getRowId() const {return m_rowId;}
|
||
|
};
|
||
|
|
||
|
struct SubaddressAccount
|
||
|
{
|
||
|
virtual ~SubaddressAccount() = 0;
|
||
|
virtual std::vector<SubaddressAccountRow*> getAll() const = 0;
|
||
|
virtual void addRow(const std::string &label) = 0;
|
||
|
virtual void setLabel(uint32_t accountIndex, const std::string &label) = 0;
|
||
|
virtual void refresh() = 0;
|
||
|
};
|
||
|
|
||
8 years ago
|
struct WalletListener
|
||
|
{
|
||
|
virtual ~WalletListener() = 0;
|
||
8 years ago
|
/**
|
||
|
* @brief moneySpent - called when money spent
|
||
|
* @param txId - transaction id
|
||
|
* @param amount - amount
|
||
|
*/
|
||
8 years ago
|
virtual void moneySpent(const std::string &txId, uint64_t amount) = 0;
|
||
8 years ago
|
|
||
|
/**
|
||
|
* @brief moneyReceived - called when money received
|
||
|
* @param txId - transaction id
|
||
|
* @param amount - amount
|
||
|
*/
|
||
8 years ago
|
virtual void moneyReceived(const std::string &txId, uint64_t amount) = 0;
|
||
7 years ago
|
|
||
|
/**
|
||
|
* @brief unconfirmedMoneyReceived - called when payment arrived in tx pool
|
||
|
* @param txId - transaction id
|
||
|
* @param amount - amount
|
||
|
*/
|
||
|
virtual void unconfirmedMoneyReceived(const std::string &txId, uint64_t amount) = 0;
|
||
8 years ago
|
|
||
|
/**
|
||
|
* @brief newBlock - called when new block received
|
||
|
* @param height - block height
|
||
|
*/
|
||
|
virtual void newBlock(uint64_t height) = 0;
|
||
|
|
||
|
/**
|
||
|
* @brief updated - generic callback, called when any event (sent/received/block reveived/etc) happened with the wallet;
|
||
|
*/
|
||
8 years ago
|
virtual void updated() = 0;
|
||
8 years ago
|
|
||
|
|
||
|
/**
|
||
|
* @brief refreshed - called when wallet refreshed by background thread or explicitly refreshed by calling "refresh" synchronously
|
||
|
*/
|
||
8 years ago
|
virtual void refreshed() = 0;
|
||
8 years ago
|
};
|
||
|
|
||
8 years ago
|
|
||
8 years ago
|
/**
|
||
|
* @brief Interface for wallet operations.
|
||
|
* TODO: check if /include/IWallet.h is still actual
|
||
|
*/
|
||
|
struct Wallet
|
||
|
{
|
||
8 years ago
|
|
||
|
enum Status {
|
||
|
Status_Ok,
|
||
8 years ago
|
Status_Error,
|
||
|
Status_Critical
|
||
8 years ago
|
};
|
||
|
|
||
8 years ago
|
enum ConnectionStatus {
|
||
|
ConnectionStatus_Disconnected,
|
||
|
ConnectionStatus_Connected,
|
||
|
ConnectionStatus_WrongVersion
|
||
|
};
|
||
|
|
||
8 years ago
|
virtual ~Wallet() = 0;
|
||
|
virtual std::string seed() const = 0;
|
||
|
virtual std::string getSeedLanguage() const = 0;
|
||
|
virtual void setSeedLanguage(const std::string &arg) = 0;
|
||
8 years ago
|
//! returns wallet status (Status_Ok | Status_Error)
|
||
|
virtual int status() const = 0;
|
||
|
//! in case error status, returns error string
|
||
|
virtual std::string errorString() const = 0;
|
||
8 years ago
|
virtual bool setPassword(const std::string &password) = 0;
|
||
7 years ago
|
virtual std::string address(uint32_t accountIndex = 0, uint32_t addressIndex = 0) const = 0;
|
||
7 years ago
|
std::string mainAddress() const { return address(0, 0); }
|
||
8 years ago
|
virtual std::string path() const = 0;
|
||
7 years ago
|
virtual bool testnet() const = 0;
|
||
7 years ago
|
//! returns current hard fork info
|
||
|
virtual void hardForkInfo(uint8_t &version, uint64_t &earliest_height) const = 0;
|
||
|
//! check if hard fork rules should be used
|
||
|
virtual bool useForkRules(uint8_t version, int64_t early_blocks) const = 0;
|
||
8 years ago
|
/*!
|
||
|
* \brief integratedAddress - returns integrated address for current wallet address and given payment_id.
|
||
|
* if passed "payment_id" param is an empty string or not-valid payment id string
|
||
|
* (16 characters hexadecimal string) - random payment_id will be generated
|
||
|
*
|
||
|
* \param payment_id - 16 characters hexadecimal string or empty string if new random payment id needs to be
|
||
|
* generated
|
||
|
* \return - 106 characters string representing integrated address
|
||
|
*/
|
||
|
virtual std::string integratedAddress(const std::string &payment_id) const = 0;
|
||
8 years ago
|
|
||
7 years ago
|
/*!
|
||
7 years ago
|
* \brief secretViewKey - returns secret view key
|
||
|
* \return - secret view key
|
||
7 years ago
|
*/
|
||
7 years ago
|
virtual std::string secretViewKey() const = 0;
|
||
|
|
||
|
/*!
|
||
|
* \brief publicViewKey - returns public view key
|
||
|
* \return - public view key
|
||
|
*/
|
||
|
virtual std::string publicViewKey() const = 0;
|
||
|
|
||
|
/*!
|
||
|
* \brief secretSpendKey - returns secret spend key
|
||
|
* \return - secret spend key
|
||
|
*/
|
||
|
virtual std::string secretSpendKey() const = 0;
|
||
|
|
||
|
/*!
|
||
|
* \brief publicSpendKey - returns public spend key
|
||
|
* \return - public spend key
|
||
|
*/
|
||
|
virtual std::string publicSpendKey() const = 0;
|
||
7 years ago
|
|
||
8 years ago
|
/*!
|
||
|
* \brief store - stores wallet to file.
|
||
|
* \param path - main filename to store wallet to. additionally stores address file and keys file.
|
||
|
* to store to the same file - just pass empty string;
|
||
|
* \return
|
||
|
*/
|
||
8 years ago
|
virtual bool store(const std::string &path) = 0;
|
||
8 years ago
|
/*!
|
||
|
* \brief filename - returns wallet filename
|
||
|
* \return
|
||
|
*/
|
||
|
virtual std::string filename() const = 0;
|
||
|
/*!
|
||
|
* \brief keysFilename - returns keys filename. usually this formed as "wallet_filename".keys
|
||
|
* \return
|
||
|
*/
|
||
|
virtual std::string keysFilename() const = 0;
|
||
8 years ago
|
/*!
|
||
7 years ago
|
* \brief init - initializes wallet with daemon connection params.
|
||
|
* if daemon_address is local address, "trusted daemon" will be set to true forcibly
|
||
|
* startRefresh() should be called when wallet is initialized.
|
||
8 years ago
|
*
|
||
|
* \param daemon_address - daemon address in "hostname:port" format
|
||
|
* \param upper_transaction_size_limit
|
||
7 years ago
|
* \param daemon_username
|
||
|
* \param daemon_password
|
||
|
* \param lightWallet - start wallet in light mode, connect to a openmonero compatible server.
|
||
7 years ago
|
* \return - true on success
|
||
8 years ago
|
*/
|
||
7 years ago
|
virtual bool init(const std::string &daemon_address, uint64_t upper_transaction_size_limit = 0, const std::string &daemon_username = "", const std::string &daemon_password = "", bool use_ssl = false, bool lightWallet = false) = 0;
|
||
8 years ago
|
|
||
7 years ago
|
/*!
|
||
|
* \brief createWatchOnly - Creates a watch only wallet
|
||
|
* \param path - where to store the wallet
|
||
|
* \param password
|
||
|
* \param language
|
||
|
* \return - true if created successfully
|
||
|
*/
|
||
|
virtual bool createWatchOnly(const std::string &path, const std::string &password, const std::string &language) const = 0;
|
||
|
|
||
8 years ago
|
/*!
|
||
|
* \brief setRefreshFromBlockHeight - start refresh from block height on recover
|
||
|
*
|
||
|
* \param refresh_from_block_height - blockchain start height
|
||
|
*/
|
||
|
virtual void setRefreshFromBlockHeight(uint64_t refresh_from_block_height) = 0;
|
||
|
|
||
7 years ago
|
/*!
|
||
|
* \brief getRestoreHeight - get wallet creation height
|
||
|
*
|
||
|
*/
|
||
|
virtual uint64_t getRefreshFromBlockHeight() const = 0;
|
||
|
|
||
8 years ago
|
/*!
|
||
|
* \brief setRecoveringFromSeed - set state recover form seed
|
||
|
*
|
||
|
* \param recoveringFromSeed - true/false
|
||
|
*/
|
||
|
virtual void setRecoveringFromSeed(bool recoveringFromSeed) = 0;
|
||
|
|
||
8 years ago
|
/**
|
||
|
* @brief connectToDaemon - connects to the daemon. TODO: check if it can be removed
|
||
|
* @return
|
||
|
*/
|
||
8 years ago
|
virtual bool connectToDaemon() = 0;
|
||
8 years ago
|
|
||
|
/**
|
||
|
* @brief connected - checks if the wallet connected to the daemon
|
||
|
* @return - true if connected
|
||
|
*/
|
||
8 years ago
|
virtual ConnectionStatus connected() const = 0;
|
||
8 years ago
|
virtual void setTrustedDaemon(bool arg) = 0;
|
||
|
virtual bool trustedDaemon() const = 0;
|
||
7 years ago
|
virtual uint64_t balance(uint32_t accountIndex = 0) const = 0;
|
||
7 years ago
|
uint64_t balanceAll() const {
|
||
|
uint64_t result = 0;
|
||
|
for (uint32_t i = 0; i < numSubaddressAccounts(); ++i)
|
||
|
result += balance(i);
|
||
|
return result;
|
||
|
}
|
||
7 years ago
|
virtual uint64_t unlockedBalance(uint32_t accountIndex = 0) const = 0;
|
||
7 years ago
|
uint64_t unlockedBalanceAll() const {
|
||
|
uint64_t result = 0;
|
||
|
for (uint32_t i = 0; i < numSubaddressAccounts(); ++i)
|
||
|
result += unlockedBalance(i);
|
||
|
return result;
|
||
|
}
|
||
8 years ago
|
|
||
7 years ago
|
/**
|
||
|
* @brief watchOnly - checks if wallet is watch only
|
||
|
* @return - true if watch only
|
||
|
*/
|
||
|
virtual bool watchOnly() const = 0;
|
||
|
|
||
8 years ago
|
/**
|
||
8 years ago
|
* @brief blockChainHeight - returns current blockchain height
|
||
8 years ago
|
* @return
|
||
|
*/
|
||
|
virtual uint64_t blockChainHeight() const = 0;
|
||
8 years ago
|
|
||
|
/**
|
||
|
* @brief approximateBlockChainHeight - returns approximate blockchain height calculated from date/time
|
||
|
* @return
|
||
|
*/
|
||
|
virtual uint64_t approximateBlockChainHeight() const = 0;
|
||
8 years ago
|
|
||
8 years ago
|
/**
|
||
|
* @brief daemonBlockChainHeight - returns daemon blockchain height
|
||
|
* @return 0 - in case error communicating with the daemon.
|
||
|
* status() will return Status_Error and errorString() will return verbose error description
|
||
|
*/
|
||
|
virtual uint64_t daemonBlockChainHeight() const = 0;
|
||
|
|
||
8 years ago
|
/**
|
||
|
* @brief daemonBlockChainTargetHeight - returns daemon blockchain target height
|
||
|
* @return 0 - in case error communicating with the daemon.
|
||
|
* status() will return Status_Error and errorString() will return verbose error description
|
||
|
*/
|
||
|
virtual uint64_t daemonBlockChainTargetHeight() const = 0;
|
||
8 years ago
|
|
||
8 years ago
|
/**
|
||
|
* @brief synchronized - checks if wallet was ever synchronized
|
||
|
* @return
|
||
|
*/
|
||
|
virtual bool synchronized() const = 0;
|
||
|
|
||
8 years ago
|
static std::string displayAmount(uint64_t amount);
|
||
8 years ago
|
static uint64_t amountFromString(const std::string &amount);
|
||
|
static uint64_t amountFromDouble(double amount);
|
||
8 years ago
|
static std::string genPaymentId();
|
||
8 years ago
|
static bool paymentIdValid(const std::string &paiment_id);
|
||
8 years ago
|
static bool addressValid(const std::string &str, bool testnet);
|
||
7 years ago
|
static bool keyValid(const std::string &secret_key_string, const std::string &address_string, bool isViewKey, bool testnet, std::string &error);
|
||
8 years ago
|
static std::string paymentIdFromAddress(const std::string &str, bool testnet);
|
||
8 years ago
|
static uint64_t maximumAllowedAmount();
|
||
7 years ago
|
// Easylogger wrapper
|
||
7 years ago
|
static void init(const char *argv0, const char *default_log_base_name);
|
||
7 years ago
|
static void debug(const std::string &str);
|
||
8 years ago
|
|
||
8 years ago
|
/**
|
||
|
* @brief StartRefresh - Start/resume refresh thread (refresh every 10 seconds)
|
||
|
*/
|
||
|
virtual void startRefresh() = 0;
|
||
|
/**
|
||
|
* @brief pauseRefresh - pause refresh thread
|
||
|
*/
|
||
|
virtual void pauseRefresh() = 0;
|
||
|
|
||
8 years ago
|
/**
|
||
|
* @brief refresh - refreshes the wallet, updating transactions from daemon
|
||
|
* @return - true if refreshed successfully;
|
||
|
*/
|
||
8 years ago
|
virtual bool refresh() = 0;
|
||
8 years ago
|
|
||
8 years ago
|
/**
|
||
|
* @brief refreshAsync - refreshes wallet asynchronously.
|
||
|
*/
|
||
8 years ago
|
virtual void refreshAsync() = 0;
|
||
8 years ago
|
|
||
|
/**
|
||
|
* @brief setAutoRefreshInterval - setup interval for automatic refresh.
|
||
8 years ago
|
* @param seconds - interval in millis. if zero or less than zero - automatic refresh disabled;
|
||
8 years ago
|
*/
|
||
8 years ago
|
virtual void setAutoRefreshInterval(int millis) = 0;
|
||
8 years ago
|
|
||
|
/**
|
||
8 years ago
|
* @brief autoRefreshInterval - returns automatic refresh interval in millis
|
||
8 years ago
|
* @return
|
||
|
*/
|
||
|
virtual int autoRefreshInterval() const = 0;
|
||
|
|
||
7 years ago
|
/**
|
||
|
* @brief addSubaddressAccount - appends a new subaddress account at the end of the last major index of existing subaddress accounts
|
||
|
* @param label - the label for the new account (which is the as the label of the primary address (accountIndex,0))
|
||
|
*/
|
||
|
virtual void addSubaddressAccount(const std::string& label) = 0;
|
||
|
/**
|
||
|
* @brief numSubaddressAccounts - returns the number of existing subaddress accounts
|
||
|
*/
|
||
|
virtual size_t numSubaddressAccounts() const = 0;
|
||
|
/**
|
||
|
* @brief numSubaddresses - returns the number of existing subaddresses associated with the specified subaddress account
|
||
|
* @param accountIndex - the major index specifying the subaddress account
|
||
|
*/
|
||
|
virtual size_t numSubaddresses(uint32_t accountIndex) const = 0;
|
||
|
/**
|
||
|
* @brief addSubaddress - appends a new subaddress at the end of the last minor index of the specified subaddress account
|
||
|
* @param accountIndex - the major index specifying the subaddress account
|
||
|
* @param label - the label for the new subaddress
|
||
|
*/
|
||
|
virtual void addSubaddress(uint32_t accountIndex, const std::string& label) = 0;
|
||
|
/**
|
||
|
* @brief getSubaddressLabel - gets the label of the specified subaddress
|
||
|
* @param accountIndex - the major index specifying the subaddress account
|
||
|
* @param addressIndex - the minor index specifying the subaddress
|
||
|
*/
|
||
|
virtual std::string getSubaddressLabel(uint32_t accountIndex, uint32_t addressIndex) const = 0;
|
||
|
/**
|
||
|
* @brief setSubaddressLabel - sets the label of the specified subaddress
|
||
|
* @param accountIndex - the major index specifying the subaddress account
|
||
|
* @param addressIndex - the minor index specifying the subaddress
|
||
|
* @param label - the new label for the specified subaddress
|
||
|
*/
|
||
|
virtual void setSubaddressLabel(uint32_t accountIndex, uint32_t addressIndex, const std::string &label) = 0;
|
||
8 years ago
|
|
||
8 years ago
|
/*!
|
||
8 years ago
|
* \brief createTransaction creates transaction. if dst_addr is an integrated address, payment_id is ignored
|
||
8 years ago
|
* \param dst_addr destination address as string
|
||
8 years ago
|
* \param payment_id optional payment_id, can be empty string
|
||
8 years ago
|
* \param amount amount
|
||
|
* \param mixin_count mixin count. if 0 passed, wallet will use default value
|
||
7 years ago
|
* \param subaddr_account subaddress account from which the input funds are taken
|
||
|
* \param subaddr_indices set of subaddress indices to use for transfer or sweeping. if set empty, all are chosen when sweeping, and one or more are automatically chosen when transferring. after execution, returns the set of actually used indices
|
||
8 years ago
|
* \param priority
|
||
8 years ago
|
* \return PendingTransaction object. caller is responsible to check PendingTransaction::status()
|
||
|
* after object returned
|
||
|
*/
|
||
8 years ago
|
|
||
8 years ago
|
virtual PendingTransaction * createTransaction(const std::string &dst_addr, const std::string &payment_id,
|
||
8 years ago
|
optional<uint64_t> amount, uint32_t mixin_count,
|
||
7 years ago
|
PendingTransaction::Priority = PendingTransaction::Priority_Low,
|
||
|
uint32_t subaddr_account = 0,
|
||
|
std::set<uint32_t> subaddr_indices = {}) = 0;
|
||
8 years ago
|
|
||
8 years ago
|
/*!
|
||
|
* \brief createSweepUnmixableTransaction creates transaction with unmixable outputs.
|
||
|
* \return PendingTransaction object. caller is responsible to check PendingTransaction::status()
|
||
|
* after object returned
|
||
|
*/
|
||
|
|
||
|
virtual PendingTransaction * createSweepUnmixableTransaction() = 0;
|
||
7 years ago
|
|
||
|
/*!
|
||
|
* \brief loadUnsignedTx - creates transaction from unsigned tx file
|
||
|
* \return - UnsignedTransaction object. caller is responsible to check UnsignedTransaction::status()
|
||
|
* after object returned
|
||
|
*/
|
||
|
virtual UnsignedTransaction * loadUnsignedTx(const std::string &unsigned_filename) = 0;
|
||
|
|
||
|
/*!
|
||
|
* \brief submitTransaction - submits transaction in signed tx file
|
||
|
* \return - true on success
|
||
|
*/
|
||
|
virtual bool submitTransaction(const std::string &fileName) = 0;
|
||
|
|
||
8 years ago
|
|
||
8 years ago
|
/*!
|
||
|
* \brief disposeTransaction - destroys transaction object
|
||
|
* \param t - pointer to the "PendingTransaction" object. Pointer is not valid after function returned;
|
||
|
*/
|
||
8 years ago
|
virtual void disposeTransaction(PendingTransaction * t) = 0;
|
||
7 years ago
|
|
||
7 years ago
|
/*!
|
||
|
* \brief exportKeyImages - exports key images to file
|
||
|
* \param filename
|
||
|
* \return - true on success
|
||
|
*/
|
||
|
virtual bool exportKeyImages(const std::string &filename) = 0;
|
||
|
|
||
|
/*!
|
||
|
* \brief importKeyImages - imports key images from file
|
||
|
* \param filename
|
||
|
* \return - true on success
|
||
|
*/
|
||
|
virtual bool importKeyImages(const std::string &filename) = 0;
|
||
|
|
||
|
|
||
7 years ago
|
virtual TransactionHistory * history() = 0;
|
||
|
virtual AddressBook * addressBook() = 0;
|
||
|
virtual Subaddress * subaddress() = 0;
|
||
|
virtual SubaddressAccount * subaddressAccount() = 0;
|
||
8 years ago
|
virtual void setListener(WalletListener *) = 0;
|
||
8 years ago
|
/*!
|
||
|
* \brief defaultMixin - returns number of mixins used in transactions
|
||
|
* \return
|
||
|
*/
|
||
|
virtual uint32_t defaultMixin() const = 0;
|
||
|
/*!
|
||
|
* \brief setDefaultMixin - setum number of mixins to be used for new transactions
|
||
|
* \param arg
|
||
|
*/
|
||
|
virtual void setDefaultMixin(uint32_t arg) = 0;
|
||
8 years ago
|
|
||
|
/*!
|
||
|
* \brief setUserNote - attach an arbitrary string note to a txid
|
||
|
* \param txid - the transaction id to attach the note to
|
||
|
* \param note - the note
|
||
|
* \return true if succesful, false otherwise
|
||
|
*/
|
||
|
virtual bool setUserNote(const std::string &txid, const std::string ¬e) = 0;
|
||
|
/*!
|
||
|
* \brief getUserNote - return an arbitrary string note attached to a txid
|
||
|
* \param txid - the transaction id to attach the note to
|
||
|
* \return the attached note, or empty string if there is none
|
||
|
*/
|
||
|
virtual std::string getUserNote(const std::string &txid) const = 0;
|
||
8 years ago
|
virtual std::string getTxKey(const std::string &txid) const = 0;
|
||
7 years ago
|
virtual bool checkTxKey(const std::string &txid, std::string tx_key, const std::string &address, uint64_t &received, bool &in_pool, uint64_t &confirmations) = 0;
|
||
7 years ago
|
virtual std::string getTxProof(const std::string &txid, const std::string &address, const std::string &message) const = 0;
|
||
7 years ago
|
virtual bool checkTxProof(const std::string &txid, const std::string &address, const std::string &message, const std::string &signature, bool &good, uint64_t &received, bool &in_pool, uint64_t &confirmations) = 0;
|
||
7 years ago
|
virtual std::string getSpendProof(const std::string &txid, const std::string &message) const = 0;
|
||
|
virtual bool checkSpendProof(const std::string &txid, const std::string &message, const std::string &signature, bool &good) const = 0;
|
||
8 years ago
|
|
||
|
/*
|
||
|
* \brief signMessage - sign a message with the spend private key
|
||
|
* \param message - the message to sign (arbitrary byte data)
|
||
|
* \return the signature
|
||
|
*/
|
||
|
virtual std::string signMessage(const std::string &message) = 0;
|
||
|
/*!
|
||
|
* \brief verifySignedMessage - verify a signature matches a given message
|
||
|
* \param message - the message (arbitrary byte data)
|
||
|
* \param address - the address the signature claims to be made with
|
||
|
* \param signature - the signature
|
||
|
* \return true if the signature verified, false otherwise
|
||
|
*/
|
||
|
virtual bool verifySignedMessage(const std::string &message, const std::string &addres, const std::string &signature) const = 0;
|
||
7 years ago
|
|
||
|
virtual bool parse_uri(const std::string &uri, std::string &address, std::string &payment_id, uint64_t &amount, std::string &tx_description, std::string &recipient_name, std::vector<std::string> &unknown_parameters, std::string &error) = 0;
|
||
7 years ago
|
|
||
|
virtual std::string getDefaultDataDir() const = 0;
|
||
|
|
||
7 years ago
|
/*
|
||
|
* \brief rescanSpent - Rescan spent outputs - Can only be used with trusted daemon
|
||
|
* \return true on success
|
||
|
*/
|
||
|
virtual bool rescanSpent() = 0;
|
||
7 years ago
|
|
||
|
//! Light wallet authenticate and login
|
||
|
virtual bool lightWalletLogin(bool &isNewWallet) const = 0;
|
||
|
|
||
|
//! Initiates a light wallet import wallet request
|
||
|
virtual bool lightWalletImportWalletRequest(std::string &payment_id, uint64_t &fee, bool &new_request, bool &request_fulfilled, std::string &payment_address, std::string &status) = 0;
|
||
8 years ago
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief WalletManager - provides functions to manage wallets
|
||
|
*/
|
||
|
struct WalletManager
|
||
|
{
|
||
8 years ago
|
|
||
|
/*!
|
||
|
* \brief Creates new wallet
|
||
|
* \param path Name of wallet file
|
||
|
* \param password Password of wallet file
|
||
|
* \param language Language to be used to generate electrum seed memo
|
||
|
* \return Wallet instance (Wallet::status() needs to be called to check if created successfully)
|
||
|
*/
|
||
8 years ago
|
virtual Wallet * createWallet(const std::string &path, const std::string &password, const std::string &language, bool testnet = false) = 0;
|
||
8 years ago
|
|
||
8 years ago
|
/*!
|
||
|
* \brief Opens existing wallet
|
||
|
* \param path Name of wallet file
|
||
|
* \param password Password of wallet file
|
||
|
* \return Wallet instance (Wallet::status() needs to be called to check if opened successfully)
|
||
|
*/
|
||
8 years ago
|
virtual Wallet * openWallet(const std::string &path, const std::string &password, bool testnet = false) = 0;
|
||
8 years ago
|
|
||
8 years ago
|
/*!
|
||
|
* \brief recovers existing wallet using memo (electrum seed)
|
||
|
* \param path Name of wallet file to be created
|
||
|
* \param memo memo (25 words electrum seed)
|
||
8 years ago
|
* \param testnet testnet
|
||
|
* \param restoreHeight restore from start height
|
||
8 years ago
|
* \return Wallet instance (Wallet::status() needs to be called to check if recovered successfully)
|
||
|
*/
|
||
8 years ago
|
virtual Wallet * recoveryWallet(const std::string &path, const std::string &memo, bool testnet = false, uint64_t restoreHeight = 0) = 0;
|
||
8 years ago
|
|
||
7 years ago
|
/*!
|
||
|
* \brief recovers existing wallet using keys. Creates a view only wallet if spend key is omitted
|
||
|
* \param path Name of wallet file to be created
|
||
|
* \param language language
|
||
|
* \param testnet testnet
|
||
|
* \param restoreHeight restore from start height
|
||
|
* \param addressString public address
|
||
|
* \param viewKeyString view key
|
||
|
* \param spendKeyString spend key (optional)
|
||
|
* \return Wallet instance (Wallet::status() needs to be called to check if recovered successfully)
|
||
|
*/
|
||
|
virtual Wallet * createWalletFromKeys(const std::string &path,
|
||
|
const std::string &language,
|
||
|
bool testnet,
|
||
|
uint64_t restoreHeight,
|
||
|
const std::string &addressString,
|
||
|
const std::string &viewKeyString,
|
||
|
const std::string &spendKeyString = "") = 0;
|
||
|
|
||
8 years ago
|
/*!
|
||
|
* \brief Closes wallet. In case operation succeded, wallet object deleted. in case operation failed, wallet object not deleted
|
||
|
* \param wallet previously opened / created wallet instance
|
||
|
* \return None
|
||
|
*/
|
||
7 years ago
|
virtual bool closeWallet(Wallet *wallet, bool store = true) = 0;
|
||
8 years ago
|
|
||
8 years ago
|
/*
|
||
|
* ! checks if wallet with the given name already exists
|
||
|
*/
|
||
|
|
||
|
/*!
|
||
|
* @brief TODO: delme walletExists - check if the given filename is the wallet
|
||
|
* @param path - filename
|
||
7 years ago
|
* @return - true if wallet exists
|
||
8 years ago
|
*/
|
||
8 years ago
|
virtual bool walletExists(const std::string &path) = 0;
|
||
8 years ago
|
|
||
7 years ago
|
/*!
|
||
|
* @brief verifyWalletPassword - check if the given filename is the wallet
|
||
|
* @param keys_file_name - location of keys file
|
||
|
* @param password - password to verify
|
||
|
* @param watch_only - verify only view keys?
|
||
|
* @return - true if password is correct
|
||
|
*/
|
||
|
virtual bool verifyWalletPassword(const std::string &keys_file_name, const std::string &password, bool watch_only) const = 0;
|
||
|
|
||
8 years ago
|
/*!
|
||
|
* \brief findWallets - searches for the wallet files by given path name recursively
|
||
|
* \param path - starting point to search
|
||
|
* \return - list of strings with found wallets (absolute paths);
|
||
|
*/
|
||
|
virtual std::vector<std::string> findWallets(const std::string &path) = 0;
|
||
|
|
||
|
//! returns verbose error string regarding last error;
|
||
8 years ago
|
virtual std::string errorString() const = 0;
|
||
8 years ago
|
|
||
8 years ago
|
//! set the daemon address (hostname and port)
|
||
|
virtual void setDaemonAddress(const std::string &address) = 0;
|
||
|
|
||
|
//! returns whether the daemon can be reached, and its version number
|
||
|
virtual bool connected(uint32_t *version = NULL) const = 0;
|
||
|
|
||
|
//! returns current blockchain height
|
||
|
virtual uint64_t blockchainHeight() const = 0;
|
||
|
|
||
|
//! returns current blockchain target height
|
||
|
virtual uint64_t blockchainTargetHeight() const = 0;
|
||
|
|
||
|
//! returns current network difficulty
|
||
|
virtual uint64_t networkDifficulty() const = 0;
|
||
|
|
||
|
//! returns current mining hash rate (0 if not mining)
|
||
|
virtual double miningHashRate() const = 0;
|
||
7 years ago
|
|
||
7 years ago
|
//! returns current block target
|
||
|
virtual uint64_t blockTarget() const = 0;
|
||
|
|
||
7 years ago
|
//! returns true iff mining
|
||
|
virtual bool isMining() const = 0;
|
||
|
|
||
|
//! starts mining with the set number of threads
|
||
7 years ago
|
virtual bool startMining(const std::string &address, uint32_t threads = 1, bool background_mining = false, bool ignore_battery = true) = 0;
|
||
7 years ago
|
|
||
|
//! stops mining
|
||
|
virtual bool stopMining() = 0;
|
||
|
|
||
7 years ago
|
//! resolves an OpenAlias address to a monero address
|
||
|
virtual std::string resolveOpenAlias(const std::string &address, bool &dnssec_valid) const = 0;
|
||
7 years ago
|
|
||
|
//! checks for an update and returns version, hash and url
|
||
7 years ago
|
static std::tuple<bool, std::string, std::string, std::string, std::string> checkUpdates(const std::string &software, std::string subdir);
|
||
8 years ago
|
};
|
||
|
|
||
|
|
||
|
struct WalletManagerFactory
|
||
|
{
|
||
8 years ago
|
// logging levels for underlying library
|
||
|
enum LogLevel {
|
||
|
LogLevel_Silent = -1,
|
||
|
LogLevel_0 = 0,
|
||
|
LogLevel_1 = 1,
|
||
|
LogLevel_2 = 2,
|
||
|
LogLevel_3 = 3,
|
||
|
LogLevel_4 = 4,
|
||
|
LogLevel_Min = LogLevel_Silent,
|
||
|
LogLevel_Max = LogLevel_4
|
||
|
};
|
||
|
|
||
8 years ago
|
static WalletManager * getWalletManager();
|
||
8 years ago
|
static void setLogLevel(int level);
|
||
7 years ago
|
static void setLogCategories(const std::string &categories);
|
||
8 years ago
|
};
|
||
|
|
||
8 years ago
|
|
||
8 years ago
|
}
|
||
|
|
||
8 years ago
|
namespace Bitmonero = Monero;
|
||
|
|