add cleanwalletnotarisations RPC call for testing
This commit is contained in:
@@ -350,16 +350,16 @@ static const CRPCCommand vRPCCommands[] =
|
|||||||
#endif
|
#endif
|
||||||
/* auction */
|
/* auction */
|
||||||
{ "auction", "auctionaddress", &auctionaddress, true },
|
{ "auction", "auctionaddress", &auctionaddress, true },
|
||||||
|
|
||||||
/* lotto */
|
/* lotto */
|
||||||
{ "lotto", "lottoaddress", &lottoaddress, true },
|
{ "lotto", "lottoaddress", &lottoaddress, true },
|
||||||
|
|
||||||
/* fsm */
|
/* fsm */
|
||||||
{ "FSM", "FSMaddress", &FSMaddress, true },
|
{ "FSM", "FSMaddress", &FSMaddress, true },
|
||||||
{ "FSM", "FSMcreate", &FSMcreate, true },
|
{ "FSM", "FSMcreate", &FSMcreate, true },
|
||||||
{ "FSM", "FSMlist", &FSMlist, true },
|
{ "FSM", "FSMlist", &FSMlist, true },
|
||||||
{ "FSM", "FSMinfo", &FSMinfo, true },
|
{ "FSM", "FSMinfo", &FSMinfo, true },
|
||||||
|
|
||||||
/* rewards */
|
/* rewards */
|
||||||
{ "rewards", "rewardslist", &rewardslist, true },
|
{ "rewards", "rewardslist", &rewardslist, true },
|
||||||
{ "rewards", "rewardsinfo", &rewardsinfo, true },
|
{ "rewards", "rewardsinfo", &rewardsinfo, true },
|
||||||
@@ -368,16 +368,16 @@ static const CRPCCommand vRPCCommands[] =
|
|||||||
{ "rewards", "rewardslock", &rewardslock, true },
|
{ "rewards", "rewardslock", &rewardslock, true },
|
||||||
{ "rewards", "rewardsunlock", &rewardsunlock, true },
|
{ "rewards", "rewardsunlock", &rewardsunlock, true },
|
||||||
{ "rewards", "rewardsaddress", &rewardsaddress, true },
|
{ "rewards", "rewardsaddress", &rewardsaddress, true },
|
||||||
|
|
||||||
/* faucet */
|
/* faucet */
|
||||||
{ "faucet", "faucetinfo", &faucetinfo, true },
|
{ "faucet", "faucetinfo", &faucetinfo, true },
|
||||||
{ "faucet", "faucetfund", &faucetfund, true },
|
{ "faucet", "faucetfund", &faucetfund, true },
|
||||||
{ "faucet", "faucetget", &faucetget, true },
|
{ "faucet", "faucetget", &faucetget, true },
|
||||||
{ "faucet", "faucetaddress", &faucetaddress, true },
|
{ "faucet", "faucetaddress", &faucetaddress, true },
|
||||||
|
|
||||||
/* MofN */
|
/* MofN */
|
||||||
{ "MofN", "mofnaddress", &mofnaddress, true },
|
{ "MofN", "mofnaddress", &mofnaddress, true },
|
||||||
|
|
||||||
/* Channels */
|
/* Channels */
|
||||||
{ "channels", "channelsaddress", &channelsaddress, true },
|
{ "channels", "channelsaddress", &channelsaddress, true },
|
||||||
{ "channels", "channelsinfo", &channelsinfo, true },
|
{ "channels", "channelsinfo", &channelsinfo, true },
|
||||||
@@ -386,7 +386,7 @@ static const CRPCCommand vRPCCommands[] =
|
|||||||
{ "channels", "channelscollect", &channelscollect, true },
|
{ "channels", "channelscollect", &channelscollect, true },
|
||||||
{ "channels", "channelsstop", &channelsstop, true },
|
{ "channels", "channelsstop", &channelsstop, true },
|
||||||
{ "channels", "channelsrefund", &channelsrefund, true },
|
{ "channels", "channelsrefund", &channelsrefund, true },
|
||||||
|
|
||||||
/* Oracles */
|
/* Oracles */
|
||||||
{ "oracles", "oraclesaddress", &oraclesaddress, true },
|
{ "oracles", "oraclesaddress", &oraclesaddress, true },
|
||||||
{ "oracles", "oracleslist", &oracleslist, true },
|
{ "oracles", "oracleslist", &oracleslist, true },
|
||||||
@@ -396,7 +396,7 @@ static const CRPCCommand vRPCCommands[] =
|
|||||||
{ "oracles", "oraclessubscribe", &oraclessubscribe, true },
|
{ "oracles", "oraclessubscribe", &oraclessubscribe, true },
|
||||||
{ "oracles", "oraclesdata", &oraclesdata, true },
|
{ "oracles", "oraclesdata", &oraclesdata, true },
|
||||||
{ "oracles", "oraclessamples", &oraclessamples, true },
|
{ "oracles", "oraclessamples", &oraclessamples, true },
|
||||||
|
|
||||||
/* Prices */
|
/* Prices */
|
||||||
{ "prices", "pricesaddress", &pricesaddress, true },
|
{ "prices", "pricesaddress", &pricesaddress, true },
|
||||||
{ "prices", "priceslist", &priceslist, true },
|
{ "prices", "priceslist", &priceslist, true },
|
||||||
@@ -406,16 +406,16 @@ static const CRPCCommand vRPCCommands[] =
|
|||||||
{ "prices", "pricesbet", &pricesbet, true },
|
{ "prices", "pricesbet", &pricesbet, true },
|
||||||
{ "prices", "pricesstatus", &pricesstatus, true },
|
{ "prices", "pricesstatus", &pricesstatus, true },
|
||||||
{ "prices", "pricesfinish", &pricesfinish, true },
|
{ "prices", "pricesfinish", &pricesfinish, true },
|
||||||
|
|
||||||
/* Pegs */
|
/* Pegs */
|
||||||
{ "pegs", "pegsaddress", &pegsaddress, true },
|
{ "pegs", "pegsaddress", &pegsaddress, true },
|
||||||
|
|
||||||
/* Triggers */
|
/* Triggers */
|
||||||
{ "triggers", "triggersaddress", &triggersaddress, true },
|
{ "triggers", "triggersaddress", &triggersaddress, true },
|
||||||
|
|
||||||
/* Payments */
|
/* Payments */
|
||||||
{ "payments", "paymentsaddress", &paymentsaddress, true },
|
{ "payments", "paymentsaddress", &paymentsaddress, true },
|
||||||
|
|
||||||
/* Gateways */
|
/* Gateways */
|
||||||
{ "gateways", "gatewaysaddress", &gatewaysaddress, true },
|
{ "gateways", "gatewaysaddress", &gatewaysaddress, true },
|
||||||
{ "gateways", "gatewayslist", &gatewayslist, true },
|
{ "gateways", "gatewayslist", &gatewayslist, true },
|
||||||
@@ -494,6 +494,7 @@ static const CRPCCommand vRPCCommands[] =
|
|||||||
{ "wallet", "getaccountaddress", &getaccountaddress, true },
|
{ "wallet", "getaccountaddress", &getaccountaddress, true },
|
||||||
{ "wallet", "getaccount", &getaccount, true },
|
{ "wallet", "getaccount", &getaccount, true },
|
||||||
{ "wallet", "getaddressesbyaccount", &getaddressesbyaccount, true },
|
{ "wallet", "getaddressesbyaccount", &getaddressesbyaccount, true },
|
||||||
|
{ "wallet", "cleanwalletnotarisations", &cleanwalletnotarisations, false },
|
||||||
{ "wallet", "getbalance", &getbalance, false },
|
{ "wallet", "getbalance", &getbalance, false },
|
||||||
{ "wallet", "getbalance64", &getbalance64, false },
|
{ "wallet", "getbalance64", &getbalance64, false },
|
||||||
{ "wallet", "getnewaddress", &getnewaddress, true },
|
{ "wallet", "getnewaddress", &getnewaddress, true },
|
||||||
|
|||||||
@@ -301,6 +301,7 @@ extern UniValue signmessage(const UniValue& params, bool fHelp);
|
|||||||
extern UniValue verifymessage(const UniValue& params, bool fHelp);
|
extern UniValue verifymessage(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getreceivedbyaddress(const UniValue& params, bool fHelp);
|
extern UniValue getreceivedbyaddress(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getreceivedbyaccount(const UniValue& params, bool fHelp);
|
extern UniValue getreceivedbyaccount(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue cleanwalletnotarisations(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getbalance(const UniValue& params, bool fHelp);
|
extern UniValue getbalance(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getbalance64(const UniValue& params, bool fHelp);
|
extern UniValue getbalance64(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getunconfirmedbalance(const UniValue& params, bool fHelp);
|
extern UniValue getunconfirmedbalance(const UniValue& params, bool fHelp);
|
||||||
|
|||||||
@@ -398,7 +398,7 @@ static void SendMoney(const CTxDestination &address, CAmount nValue, bool fSubtr
|
|||||||
|
|
||||||
// Parse Zcash address
|
// Parse Zcash address
|
||||||
CScript scriptPubKey = GetScriptForDestination(address);
|
CScript scriptPubKey = GetScriptForDestination(address);
|
||||||
|
|
||||||
// Create and send the transaction
|
// Create and send the transaction
|
||||||
CReserveKey reservekey(pwalletMain);
|
CReserveKey reservekey(pwalletMain);
|
||||||
CAmount nFeeRequired;
|
CAmount nFeeRequired;
|
||||||
@@ -995,6 +995,135 @@ CAmount GetAccountBalance(const string& strAccount, int nMinDepth, const isminef
|
|||||||
return GetAccountBalance(walletdb, strAccount, nMinDepth, filter);
|
return GetAccountBalance(walletdb, strAccount, nMinDepth, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniValue cleanwalletnotarisations(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (!EnsureWalletIsAvailable(fHelp))
|
||||||
|
return NullUniValue;
|
||||||
|
|
||||||
|
if (fHelp || params.size() > 1 )
|
||||||
|
throw runtime_error(
|
||||||
|
"cleanwalletnotarisations \"txid\"\n"
|
||||||
|
"\nRemove all txs which are totally spent and all notarisations created from them, you can clear all txs bar one, by specifiying a txid.\n"
|
||||||
|
"\nPlease backup your wallet.dat before running this command.\n"
|
||||||
|
"\nArguments:\n"
|
||||||
|
"1. \"txid\" (string, optional) The transaction id to keep.\n"
|
||||||
|
"\nResult:\n"
|
||||||
|
"{\n"
|
||||||
|
" \"total_transactons\" : n, (numeric) Transactions in wallet of " + strprintf("%s",komodo_chainname()) + "\n"
|
||||||
|
" \"remaining_transactons\" : n, (numeric) Transactions in wallet after clean.\n"
|
||||||
|
" \"removed_transactons\" : n, (numeric) The number of transactions removed.\n"
|
||||||
|
"}\n"
|
||||||
|
"\nExamples:\n"
|
||||||
|
+ HelpExampleCli("cleanoldtxs", "")
|
||||||
|
+ HelpExampleCli("cleanoldtxs","\"1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d\"")
|
||||||
|
+ HelpExampleRpc("cleanoldtxs", "")
|
||||||
|
+ HelpExampleRpc("cleanoldtxs","\"1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d\"")
|
||||||
|
);
|
||||||
|
|
||||||
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
|
UniValue ret(UniValue::VOBJ);
|
||||||
|
uint256 exception; int32_t txs = 0;
|
||||||
|
std::vector<uint256> TxToRemove;
|
||||||
|
if (params.size() == 1)
|
||||||
|
{
|
||||||
|
exception.SetHex(params[0].get_str());
|
||||||
|
uint256 tmp_hash; CTransaction tmp_tx;
|
||||||
|
if (GetTransaction(exception,tmp_tx,tmp_hash,false))
|
||||||
|
{
|
||||||
|
if ( !pwalletMain->IsMine(tmp_tx) )
|
||||||
|
{
|
||||||
|
throw runtime_error("\nThe transaction is not yours!\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
|
||||||
|
{
|
||||||
|
txs++;
|
||||||
|
const CWalletTx& wtx = (*it).second;
|
||||||
|
if ( wtx.GetHash() != exception )
|
||||||
|
{
|
||||||
|
TxToRemove.push_back(wtx.GetHash());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw runtime_error("\nThe transaction could not be found!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::vector<CWalletTx> NotarisationTxs;
|
||||||
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
|
||||||
|
{
|
||||||
|
const CWalletTx& wtx = (*it).second;
|
||||||
|
if (!CheckFinalTx(wtx) || wtx.GetBlocksToMaturity() > 0 || wtx.GetDepthInMainChain() < 50 )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
CCoins coins;
|
||||||
|
if (!pcoinsTip->GetCoins(wtx.GetHash(), coins))
|
||||||
|
{
|
||||||
|
int spents = 0; int mine = 0;
|
||||||
|
for (unsigned int n = 0; n < wtx.vout.size() ; n++)
|
||||||
|
{
|
||||||
|
if ( pwalletMain->IsMine(wtx.vout[n]) )
|
||||||
|
mine++;
|
||||||
|
if ( ((unsigned int)n >= coins.vout.size() || coins.vout[n].IsNull() ) )
|
||||||
|
spents++;
|
||||||
|
}
|
||||||
|
if ( spents == mine )
|
||||||
|
{
|
||||||
|
TxToRemove.push_back(wtx.GetHash());
|
||||||
|
for (unsigned int n = 0; n < wtx.vin.size() ; n++)
|
||||||
|
{
|
||||||
|
if ( pwalletMain->IsMine(wtx.vin[n]) )
|
||||||
|
TxToRemove.push_back(wtx.vin[n].prevout.hash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CTxDestination address;
|
||||||
|
// get all notarisations
|
||||||
|
if ( ExtractDestination(wtx.vout[0].scriptPubKey, address) )
|
||||||
|
{
|
||||||
|
if ( strcmp(CBitcoinAddress(address).ToString().c_str(),CRYPTO777_KMDADDR) == 0 )
|
||||||
|
NotarisationTxs.push_back(wtx);
|
||||||
|
}
|
||||||
|
txs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Erase notarisations spending from fully spent splits.
|
||||||
|
BOOST_FOREACH (CWalletTx& tx, NotarisationTxs)
|
||||||
|
{
|
||||||
|
for (int n = 0; n < tx.vin.size(); n++)
|
||||||
|
{
|
||||||
|
BOOST_FOREACH (uint256& SpentHash, TxToRemove)
|
||||||
|
{
|
||||||
|
if ( SpentHash == tx.vin[n].prevout.hash )
|
||||||
|
{
|
||||||
|
pwalletMain->EraseFromWallet(tx.GetHash());
|
||||||
|
//fprintf(stderr, "ERASED Notarisation: %s\n",tx.GetHash().ToString().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// erase txs
|
||||||
|
BOOST_FOREACH (uint256& hash, TxToRemove)
|
||||||
|
{
|
||||||
|
pwalletMain->EraseFromWallet(hash);
|
||||||
|
//fprintf(stderr, "ERASED spent Tx: %s\n",hash.ToString().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// build return JSON for stats.
|
||||||
|
int remaining = pwalletMain->mapWallet.size();
|
||||||
|
ret.push_back(Pair("total_transactons", (int)txs));
|
||||||
|
ret.push_back(Pair("remaining_transactons", (int)remaining));
|
||||||
|
ret.push_back(Pair("removed_transactions", (int)(txs-remaining)));
|
||||||
|
return (ret);
|
||||||
|
}
|
||||||
|
|
||||||
UniValue getbalance(const UniValue& params, bool fHelp)
|
UniValue getbalance(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
@@ -5669,7 +5798,7 @@ UniValue oraclessubscribe(const UniValue& params, bool fHelp)
|
|||||||
|
|
||||||
UniValue oraclessamples(const UniValue& params, bool fHelp)
|
UniValue oraclessamples(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
UniValue result(UniValue::VOBJ); uint256 txid,batontxid; int32_t num;
|
UniValue result(UniValue::VOBJ); uint256 txid,batontxid; int32_t num;
|
||||||
if ( fHelp || params.size() != 3 )
|
if ( fHelp || params.size() != 3 )
|
||||||
throw runtime_error("oraclessamples oracletxid batonutxo num\n");
|
throw runtime_error("oraclessamples oracletxid batonutxo num\n");
|
||||||
if ( ensure_CCrequirements() < 0 )
|
if ( ensure_CCrequirements() < 0 )
|
||||||
|
|||||||
Reference in New Issue
Block a user