mirror of
https://github.com/twisterarmy/twister-core.git
synced 2025-01-22 20:44:56 +00:00
- begin refactoring twister_utils.h
- new rpc commands getdefaultuser/setdefaultuser (why is it not setting default on creation?) - putdht now receives a generic json value parameter
This commit is contained in:
parent
adeeb15213
commit
ea32a5a117
@ -12,7 +12,7 @@
|
|||||||
#include "bitcoinrpc.h"
|
#include "bitcoinrpc.h"
|
||||||
#include "db.h"
|
#include "db.h"
|
||||||
|
|
||||||
#include "twister.h"
|
#include "twister_utils.h"
|
||||||
|
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
@ -252,6 +252,8 @@ static const CRPCCommand vRPCCommands[] =
|
|||||||
{ "unfollow", &unfollow, false, true },
|
{ "unfollow", &unfollow, false, true },
|
||||||
{ "getfollowing", &getfollowing, false, true },
|
{ "getfollowing", &getfollowing, false, true },
|
||||||
{ "listusernamespartial", &listusernamespartial, false, true },
|
{ "listusernamespartial", &listusernamespartial, false, true },
|
||||||
|
{ "getdefaultuser", &getdefaultuser, false, true },
|
||||||
|
{ "setdefaultuser", &setdefaultuser, false, true },
|
||||||
};
|
};
|
||||||
|
|
||||||
CRPCTable::CRPCTable()
|
CRPCTable::CRPCTable()
|
||||||
@ -1156,6 +1158,20 @@ void ConvertTo(Value& value, bool fAllowNull=false)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConvertToValue(Value& value)
|
||||||
|
{
|
||||||
|
if (value.type() == str_type)
|
||||||
|
{
|
||||||
|
// reinterpret string as unquoted json value
|
||||||
|
Value value2;
|
||||||
|
string strJSON = value.get_str();
|
||||||
|
if (!read_string(strJSON, value2))
|
||||||
|
throw runtime_error(string("Error parsing JSON:")+strJSON);
|
||||||
|
value = value2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Convert strings to command-specific RPC representation
|
// Convert strings to command-specific RPC representation
|
||||||
Array RPCConvertValues(const std::string &strMethod, const std::vector<std::string> &strParams)
|
Array RPCConvertValues(const std::string &strMethod, const std::vector<std::string> &strParams)
|
||||||
{
|
{
|
||||||
@ -1210,6 +1226,7 @@ Array RPCConvertValues(const std::string &strMethod, const std::vector<std::stri
|
|||||||
if (strMethod == "importprivkey" && n > 2) ConvertTo<bool>(params[2]);
|
if (strMethod == "importprivkey" && n > 2) ConvertTo<bool>(params[2]);
|
||||||
if (strMethod == "verifychain" && n > 0) ConvertTo<boost::int64_t>(params[0]);
|
if (strMethod == "verifychain" && n > 0) ConvertTo<boost::int64_t>(params[0]);
|
||||||
if (strMethod == "verifychain" && n > 1) ConvertTo<boost::int64_t>(params[1]);
|
if (strMethod == "verifychain" && n > 1) ConvertTo<boost::int64_t>(params[1]);
|
||||||
|
if (strMethod == "dhtput" && n > 3) ConvertToValue(params[3]);
|
||||||
if (strMethod == "dhtput" && n > 5) ConvertTo<boost::int64_t>(params[5]);
|
if (strMethod == "dhtput" && n > 5) ConvertTo<boost::int64_t>(params[5]);
|
||||||
if (strMethod == "newpostmsg" && n > 1) ConvertTo<boost::int64_t>(params[1]);
|
if (strMethod == "newpostmsg" && n > 1) ConvertTo<boost::int64_t>(params[1]);
|
||||||
if (strMethod == "newpostmsg" && n > 4) ConvertTo<boost::int64_t>(params[4]);
|
if (strMethod == "newpostmsg" && n > 4) ConvertTo<boost::int64_t>(params[4]);
|
||||||
|
@ -204,5 +204,7 @@ extern json_spirit::Value follow(const json_spirit::Array& params, bool fHelp);
|
|||||||
extern json_spirit::Value unfollow(const json_spirit::Array& params, bool fHelp);
|
extern json_spirit::Value unfollow(const json_spirit::Array& params, bool fHelp);
|
||||||
extern json_spirit::Value getfollowing(const json_spirit::Array& params, bool fHelp);
|
extern json_spirit::Value getfollowing(const json_spirit::Array& params, bool fHelp);
|
||||||
extern json_spirit::Value listusernamespartial(const json_spirit::Array& params, bool fHelp);
|
extern json_spirit::Value listusernamespartial(const json_spirit::Array& params, bool fHelp);
|
||||||
|
extern json_spirit::Value getdefaultuser(const json_spirit::Array& params, bool fHelp);
|
||||||
|
extern json_spirit::Value setdefaultuser(const json_spirit::Array& params, bool fHelp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -140,6 +140,53 @@ Value listwalletusers(const Array& params, bool fHelp)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Value setdefaultuser(const Array& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 1)
|
||||||
|
throw runtime_error(
|
||||||
|
"setdefaultuser <username>\n"
|
||||||
|
"Set default user to use (must exist)");
|
||||||
|
|
||||||
|
EnsureWalletIsUnlocked();
|
||||||
|
|
||||||
|
string strUsername = params[0].get_str();
|
||||||
|
|
||||||
|
CKeyID keyID;
|
||||||
|
if( !pwalletMain->GetKeyIdFromUsername(strUsername, keyID) )
|
||||||
|
throw JSONRPCError(RPC_WALLET_INVALID_ACCOUNT_NAME, "Error: username does not exist in wallet");
|
||||||
|
|
||||||
|
CPubKey vchPubKey;
|
||||||
|
if( !pwalletMain->GetPubKey( keyID, vchPubKey) )
|
||||||
|
throw JSONRPCError(RPC_WALLET_ERROR, "Error recovering pubkey from wallet");
|
||||||
|
|
||||||
|
if( !pwalletMain->SetDefaultKey(vchPubKey) )
|
||||||
|
throw JSONRPCError(RPC_WALLET_ERROR, "Error setting default key");
|
||||||
|
|
||||||
|
return Value();
|
||||||
|
}
|
||||||
|
|
||||||
|
Value getdefaultuser(const Array& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 0)
|
||||||
|
throw runtime_error(
|
||||||
|
"getdefaultuser\n"
|
||||||
|
"Get default user being used");
|
||||||
|
|
||||||
|
EnsureWalletIsUnlocked();
|
||||||
|
|
||||||
|
CPubKey vchPubKey = pwalletMain->vchDefaultKey;
|
||||||
|
|
||||||
|
if( !vchPubKey.IsValid() )
|
||||||
|
throw JSONRPCError(RPC_WALLET_ERROR, "Error: default user key is invalid");
|
||||||
|
|
||||||
|
CKeyID keyID = vchPubKey.GetID();
|
||||||
|
std::string username;
|
||||||
|
if( !pwalletMain->GetUsernameFromKeyId(keyID, username) )
|
||||||
|
throw JSONRPCError(RPC_WALLET_ERROR, "Error converting keyID to username");
|
||||||
|
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Value signmessage(const Array& params, bool fHelp)
|
Value signmessage(const Array& params, bool fHelp)
|
||||||
{
|
{
|
||||||
|
120
src/twister.cpp
120
src/twister.cpp
@ -1,5 +1,7 @@
|
|||||||
#include "twister.h"
|
#include "twister.h"
|
||||||
|
|
||||||
|
#include "twister_utils.h"
|
||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
#include "bitcoinrpc.h"
|
#include "bitcoinrpc.h"
|
||||||
@ -52,68 +54,6 @@ sha1_hash dhtTargetHash(std::string const &username, std::string const &resource
|
|||||||
return hasher(buf.data(), buf.size()).final();
|
return hasher(buf.data(), buf.size()).final();
|
||||||
}
|
}
|
||||||
|
|
||||||
int load_file(std::string const& filename, std::vector<char>& v, int limit)
|
|
||||||
{
|
|
||||||
FILE* f = fopen(filename.c_str(), "rb");
|
|
||||||
if (f == NULL)
|
|
||||||
return -1;
|
|
||||||
int r = fseek(f, 0, SEEK_END);
|
|
||||||
if (r != 0) {
|
|
||||||
fclose(f);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
long s = ftell(f);
|
|
||||||
if (s < 0) {
|
|
||||||
fclose(f);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s > limit) {
|
|
||||||
fclose(f);
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = fseek(f, 0, SEEK_SET);
|
|
||||||
if (r != 0) {
|
|
||||||
fclose(f);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
v.resize(s);
|
|
||||||
if (s == 0) {
|
|
||||||
fclose(f);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = fread(&v[0], 1, v.size(), f);
|
|
||||||
if (r < 0) {
|
|
||||||
fclose(f);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
if (r != s) return -3;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int save_file(std::string const& filename, std::vector<char>& v)
|
|
||||||
{
|
|
||||||
using namespace libtorrent;
|
|
||||||
|
|
||||||
// TODO: don't use internal file type here. use fopen()
|
|
||||||
file f;
|
|
||||||
error_code ec;
|
|
||||||
if (!f.open(filename, file::write_only, ec)) return -1;
|
|
||||||
if (ec) return -1;
|
|
||||||
file::iovec_t b = {&v[0], v.size()};
|
|
||||||
size_type written = f.writev(0, &b, 1, ec);
|
|
||||||
if (written != int(v.size())) return -3;
|
|
||||||
if (ec) return -3;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
torrent_handle startTorrentUser(std::string const &username)
|
torrent_handle startTorrentUser(std::string const &username)
|
||||||
{
|
{
|
||||||
if( !m_userTorrent.count(username) ) {
|
if( !m_userTorrent.count(username) ) {
|
||||||
@ -775,55 +715,6 @@ int getBestHeight()
|
|||||||
return nBestHeight;
|
return nBestHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value entryToJson(const entry &e)
|
|
||||||
{
|
|
||||||
Array lst;
|
|
||||||
Object o;
|
|
||||||
switch( e.type() ) {
|
|
||||||
case entry::int_t:
|
|
||||||
return e.integer();
|
|
||||||
case entry::string_t:
|
|
||||||
return e.string();
|
|
||||||
case entry::list_t:
|
|
||||||
for (entry::list_type::const_iterator i = e.list().begin(); i != e.list().end(); ++i) {
|
|
||||||
lst.push_back( entryToJson(*i) );
|
|
||||||
}
|
|
||||||
return lst;
|
|
||||||
case entry::dictionary_t:
|
|
||||||
for (entry::dictionary_type::const_iterator i = e.dict().begin(); i != e.dict().end(); ++i) {
|
|
||||||
o.push_back(Pair(i->first, entryToJson(i->second)));
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
default:
|
|
||||||
return string("<uninitialized>");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
entry jsonToEntry(const Value &v)
|
|
||||||
{
|
|
||||||
entry::list_type lst;
|
|
||||||
entry::dictionary_type dict;
|
|
||||||
|
|
||||||
switch( v.type() ) {
|
|
||||||
case int_type:
|
|
||||||
return v.get_int();
|
|
||||||
case str_type:
|
|
||||||
return v.get_str();
|
|
||||||
case array_type:
|
|
||||||
for (Array::const_iterator i = v.get_array().begin(); i != v.get_array().end(); ++i) {
|
|
||||||
lst.push_back( jsonToEntry(*i) );
|
|
||||||
}
|
|
||||||
return lst;
|
|
||||||
case obj_type:
|
|
||||||
for (Object::const_iterator i = v.get_obj().begin(); i != v.get_obj().end(); ++i) {
|
|
||||||
dict[ i->name_ ] = jsonToEntry(i->value_);
|
|
||||||
}
|
|
||||||
return dict;
|
|
||||||
default:
|
|
||||||
return string("<uninitialized>");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Value dhtput(const Array& params, bool fHelp)
|
Value dhtput(const Array& params, bool fHelp)
|
||||||
{
|
{
|
||||||
if (fHelp || params.size() < 5 || params.size() > 6)
|
if (fHelp || params.size() < 5 || params.size() > 6)
|
||||||
@ -836,7 +727,7 @@ Value dhtput(const Array& params, bool fHelp)
|
|||||||
string strUsername = params[0].get_str();
|
string strUsername = params[0].get_str();
|
||||||
string strResource = params[1].get_str();
|
string strResource = params[1].get_str();
|
||||||
string strMulti = params[2].get_str();
|
string strMulti = params[2].get_str();
|
||||||
string strValue = params[3].get_str();
|
entry value = jsonToEntry(params[3]);
|
||||||
string strSigUser = params[4].get_str();
|
string strSigUser = params[4].get_str();
|
||||||
|
|
||||||
// Test for private key here to avoid going into dht
|
// Test for private key here to avoid going into dht
|
||||||
@ -851,12 +742,13 @@ Value dhtput(const Array& params, bool fHelp)
|
|||||||
if( !multi && params.size() != 6 )
|
if( !multi && params.size() != 6 )
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Seq parameter required for single");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Seq parameter required for single");
|
||||||
|
|
||||||
int seq = params[5].get_int();
|
int seq = -1;
|
||||||
|
if( params.size() == 6 )
|
||||||
|
seq = params[5].get_int();
|
||||||
|
|
||||||
if( !multi && strUsername != strSigUser )
|
if( !multi && strUsername != strSigUser )
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Username must be the same as sig_user for single");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Username must be the same as sig_user for single");
|
||||||
|
|
||||||
entry value = entry::string_type(strValue);
|
|
||||||
boost::int64_t timeutc = GetAdjustedTime();
|
boost::int64_t timeutc = GetAdjustedTime();
|
||||||
|
|
||||||
ses->dht_putData(strUsername, strResource, multi, value, strSigUser, timeutc, seq);
|
ses->dht_putData(strUsername, strResource, multi, value, strSigUser, timeutc, seq);
|
||||||
|
@ -27,7 +27,4 @@ bool validatePostNumberForUser(std::string const &username, int k);
|
|||||||
|
|
||||||
int getBestHeight();
|
int getBestHeight();
|
||||||
|
|
||||||
int load_file(std::string const& filename, std::vector<char>& v, int limit = 8000000);
|
|
||||||
|
|
||||||
|
|
||||||
#endif // TWISTER_H
|
#endif // TWISTER_H
|
||||||
|
127
src/twister_utils.cpp
Normal file
127
src/twister_utils.cpp
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
#include "twister_utils.h"
|
||||||
|
|
||||||
|
#include <libtorrent/session.hpp>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
twister_utils::twister_utils()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int load_file(std::string const& filename, std::vector<char>& v, int limit)
|
||||||
|
{
|
||||||
|
FILE* f = fopen(filename.c_str(), "rb");
|
||||||
|
if (f == NULL)
|
||||||
|
return -1;
|
||||||
|
int r = fseek(f, 0, SEEK_END);
|
||||||
|
if (r != 0) {
|
||||||
|
fclose(f);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
long s = ftell(f);
|
||||||
|
if (s < 0) {
|
||||||
|
fclose(f);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s > limit) {
|
||||||
|
fclose(f);
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = fseek(f, 0, SEEK_SET);
|
||||||
|
if (r != 0) {
|
||||||
|
fclose(f);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
v.resize(s);
|
||||||
|
if (s == 0) {
|
||||||
|
fclose(f);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = fread(&v[0], 1, v.size(), f);
|
||||||
|
if (r < 0) {
|
||||||
|
fclose(f);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
if (r != s) return -3;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int save_file(std::string const& filename, std::vector<char>& v)
|
||||||
|
{
|
||||||
|
using namespace libtorrent;
|
||||||
|
|
||||||
|
// TODO: don't use internal file type here. use fopen()
|
||||||
|
file f;
|
||||||
|
error_code ec;
|
||||||
|
if (!f.open(filename, file::write_only, ec)) return -1;
|
||||||
|
if (ec) return -1;
|
||||||
|
file::iovec_t b = {&v[0], v.size()};
|
||||||
|
size_type written = f.writev(0, &b, 1, ec);
|
||||||
|
if (written != int(v.size())) return -3;
|
||||||
|
if (ec) return -3;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace json_spirit;
|
||||||
|
using namespace libtorrent;
|
||||||
|
|
||||||
|
Value entryToJson(const entry &e)
|
||||||
|
{
|
||||||
|
Array lst;
|
||||||
|
Object o;
|
||||||
|
switch( e.type() ) {
|
||||||
|
case entry::int_t:
|
||||||
|
return e.integer();
|
||||||
|
case entry::string_t:
|
||||||
|
return e.string();
|
||||||
|
case entry::list_t:
|
||||||
|
for (entry::list_type::const_iterator i = e.list().begin(); i != e.list().end(); ++i) {
|
||||||
|
lst.push_back( entryToJson(*i) );
|
||||||
|
}
|
||||||
|
return lst;
|
||||||
|
case entry::dictionary_t:
|
||||||
|
for (entry::dictionary_type::const_iterator i = e.dict().begin(); i != e.dict().end(); ++i) {
|
||||||
|
o.push_back(Pair(i->first, entryToJson(i->second)));
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
default:
|
||||||
|
return string("<uninitialized>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
entry jsonToEntry(const Value &v)
|
||||||
|
{
|
||||||
|
entry::list_type lst;
|
||||||
|
entry::dictionary_type dict;
|
||||||
|
|
||||||
|
switch( v.type() ) {
|
||||||
|
case int_type:
|
||||||
|
return v.get_int();
|
||||||
|
case str_type:
|
||||||
|
return v.get_str();
|
||||||
|
case array_type:
|
||||||
|
for (Array::const_iterator i = v.get_array().begin(); i != v.get_array().end(); ++i) {
|
||||||
|
lst.push_back( jsonToEntry(*i) );
|
||||||
|
}
|
||||||
|
return lst;
|
||||||
|
case obj_type:
|
||||||
|
for (Object::const_iterator i = v.get_obj().begin(); i != v.get_obj().end(); ++i) {
|
||||||
|
dict[ i->name_ ] = jsonToEntry(i->value_);
|
||||||
|
}
|
||||||
|
return dict;
|
||||||
|
default:
|
||||||
|
return string("<uninitialized>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
22
src/twister_utils.h
Normal file
22
src/twister_utils.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#ifndef TWISTER_UTILS_H
|
||||||
|
#define TWISTER_UTILS_H
|
||||||
|
|
||||||
|
#include "json_spirit.h"
|
||||||
|
#include "libtorrent/entry.hpp"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class twister_utils
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
twister_utils();
|
||||||
|
};
|
||||||
|
|
||||||
|
int load_file(std::string const& filename, std::vector<char>& v, int limit = 8000000);
|
||||||
|
int save_file(std::string const& filename, std::vector<char>& v);
|
||||||
|
|
||||||
|
json_spirit::Value entryToJson(const libtorrent::entry &e);
|
||||||
|
libtorrent::entry jsonToEntry(const json_spirit::Value &v);
|
||||||
|
|
||||||
|
#endif // TWISTER_UTILS_H
|
@ -110,6 +110,17 @@ bool CWallet::GetKeyIdFromUsername(std::string username, CKeyID &keyid)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CWallet::GetUsernameFromKeyId(CKeyID keyid, std::string &username)
|
||||||
|
{
|
||||||
|
for (std::map<CKeyID, CKeyMetadata>::const_iterator it = mapKeyMetadata.begin(); it != mapKeyMetadata.end(); it++) {
|
||||||
|
if (it->first == keyid) {
|
||||||
|
username = it->second.username;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool CWallet::LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret)
|
bool CWallet::LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret)
|
||||||
{
|
{
|
||||||
return CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret);
|
return CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret);
|
||||||
|
@ -133,6 +133,7 @@ public:
|
|||||||
bool LoadKeyMetadata(const CPubKey &pubkey, const CKeyMetadata &metadata);
|
bool LoadKeyMetadata(const CPubKey &pubkey, const CKeyMetadata &metadata);
|
||||||
// Search metadata for a given username
|
// Search metadata for a given username
|
||||||
bool GetKeyIdFromUsername(std::string username, CKeyID &keyid);
|
bool GetKeyIdFromUsername(std::string username, CKeyID &keyid);
|
||||||
|
bool GetUsernameFromKeyId(CKeyID keyid, std::string &username);
|
||||||
|
|
||||||
bool LoadMinVersion(int nVersion) { nWalletVersion = nVersion; nWalletMaxVersion = std::max(nWalletMaxVersion, nVersion); return true; }
|
bool LoadMinVersion(int nVersion) { nWalletVersion = nVersion; nWalletMaxVersion = std::max(nWalletMaxVersion, nVersion); return true; }
|
||||||
|
|
||||||
|
@ -197,7 +197,8 @@ HEADERS += \
|
|||||||
src/leveldb.h \
|
src/leveldb.h \
|
||||||
src/threadsafety.h \
|
src/threadsafety.h \
|
||||||
src/limitedmap.h \
|
src/limitedmap.h \
|
||||||
src/twister.h
|
src/twister.h \
|
||||||
|
src/twister_utils.h
|
||||||
|
|
||||||
# src/qt/bitcoingui.h
|
# src/qt/bitcoingui.h
|
||||||
# src/qt/transactiontablemodel.h \
|
# src/qt/transactiontablemodel.h \
|
||||||
@ -270,7 +271,8 @@ SOURCES += \ #src/qt/bitcoin.cpp \
|
|||||||
src/noui.cpp \
|
src/noui.cpp \
|
||||||
src/leveldb.cpp \
|
src/leveldb.cpp \
|
||||||
src/txdb.cpp \
|
src/txdb.cpp \
|
||||||
src/twister.cpp
|
src/twister.cpp \
|
||||||
|
src/twister_utils.cpp
|
||||||
|
|
||||||
# src/qt/guiutil.cpp \
|
# src/qt/guiutil.cpp \
|
||||||
# src/qt/bitcoingui.cpp \
|
# src/qt/bitcoingui.cpp \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user