Fix some bugs? Add getimports RPC.
This commit is contained in:
@@ -11,14 +11,19 @@ extern pthread_mutex_t staked_mutex;
|
|||||||
extern uint8_t NOTARY_PUBKEY33[33],NUM_NOTARIES;
|
extern uint8_t NOTARY_PUBKEY33[33],NUM_NOTARIES;
|
||||||
|
|
||||||
int8_t is_STAKED(const char *chain_name) {
|
int8_t is_STAKED(const char *chain_name) {
|
||||||
int STAKED = 0;
|
static int8_t STAKED,doneinit;
|
||||||
|
if (doneinit == 1)
|
||||||
|
return(STAKED);
|
||||||
if ( (strcmp(chain_name, "LABS") == 0) || (strncmp(chain_name, "LABS", 4) == 0) )
|
if ( (strcmp(chain_name, "LABS") == 0) || (strncmp(chain_name, "LABS", 4) == 0) )
|
||||||
STAKED = 1;
|
STAKED = 1;
|
||||||
else if ( (strcmp(chain_name, "LAB") == 0) || (strncmp(chain_name, "LAB", 3) == 0) )
|
else if ( (strcmp(chain_name, "LAB") == 0) || (strncmp(chain_name, "LAB", 3) == 0) )
|
||||||
STAKED = 2;
|
STAKED = 2;
|
||||||
else if ( (strcmp(chain_name, "CFEK") == 0) || (strncmp(chain_name, "CFEK", 4) == 0) )
|
else if ( (strcmp(chain_name, "CFEK") == 0) || (strncmp(chain_name, "CFEK", 4) == 0) )
|
||||||
STAKED = 3;
|
STAKED = 3;
|
||||||
|
else
|
||||||
|
STAKED = 0;
|
||||||
//fprintf(stderr, "This chain is: %s which is: %d\n", chain_name,STAKED);
|
//fprintf(stderr, "This chain is: %s which is: %d\n", chain_name,STAKED);
|
||||||
|
doneinit = 1;
|
||||||
return(STAKED);
|
return(STAKED);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -307,3 +307,108 @@ UniValue scanNotarisationsDB(const UniValue& params, bool fHelp)
|
|||||||
out.pushKV("opreturn", HexStr(E_MARSHAL(ss << nota.second)));
|
out.pushKV("opreturn", HexStr(E_MARSHAL(ss << nota.second)));
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniValue getimports(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 1)
|
||||||
|
throw runtime_error(
|
||||||
|
"getmigrates \"hash|height\"\n"
|
||||||
|
"\n\n"
|
||||||
|
"\nResult:\n"
|
||||||
|
"{\n"
|
||||||
|
" \"imports\" : [ (json array)\n"
|
||||||
|
" \"transactionid\" : { (json object)\n"
|
||||||
|
" \"value\" : (numeric)\n"
|
||||||
|
" \"address\" : (string)\n"
|
||||||
|
" \"export\" { (json object)\n"
|
||||||
|
" \"txid\" : (string)\n"
|
||||||
|
" \"value\" : (numeric)\n"
|
||||||
|
" \"chain\" : (string)\n" //TODO!
|
||||||
|
" }\n"
|
||||||
|
" }"
|
||||||
|
" ]\n"
|
||||||
|
" \"TotalImported\" : (numeric)\n"
|
||||||
|
" \"time\" : (numeric)\n"
|
||||||
|
"}\n"
|
||||||
|
"\nExamples:\n"
|
||||||
|
+ HelpExampleCli("getmigrates", "\"00000000febc373a1da2bd9f887b105ad79ddc26ac26c2b28652d64e5207c5b5\"")
|
||||||
|
+ HelpExampleRpc("getmigrates", "\"00000000febc373a1da2bd9f887b105ad79ddc26ac26c2b28652d64e5207c5b5\"")
|
||||||
|
+ HelpExampleCli("getmigrates", "12800")
|
||||||
|
+ HelpExampleRpc("getmigrates", "12800")
|
||||||
|
);
|
||||||
|
|
||||||
|
LOCK(cs_main);
|
||||||
|
|
||||||
|
std::string strHash = params[0].get_str();
|
||||||
|
|
||||||
|
// If height is supplied, find the hash
|
||||||
|
if (strHash.size() < (2 * sizeof(uint256))) {
|
||||||
|
// std::stoi allows characters, whereas we want to be strict
|
||||||
|
regex r("[[:digit:]]+");
|
||||||
|
if (!regex_match(strHash, r)) {
|
||||||
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid block height parameter");
|
||||||
|
}
|
||||||
|
|
||||||
|
int nHeight = -1;
|
||||||
|
try {
|
||||||
|
nHeight = std::stoi(strHash);
|
||||||
|
}
|
||||||
|
catch (const std::exception &e) {
|
||||||
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid block height parameter");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nHeight < 0 || nHeight > chainActive.Height()) {
|
||||||
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Block height out of range");
|
||||||
|
}
|
||||||
|
strHash = chainActive[nHeight]->GetBlockHash().GetHex();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint256 hash(uint256S(strHash));
|
||||||
|
|
||||||
|
if (mapBlockIndex.count(hash) == 0)
|
||||||
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
|
||||||
|
|
||||||
|
CBlock block;
|
||||||
|
CBlockIndex* pblockindex = mapBlockIndex[hash];
|
||||||
|
|
||||||
|
if (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0)
|
||||||
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Block not available (pruned data)");
|
||||||
|
|
||||||
|
if(!ReadBlockFromDisk(block, pblockindex,1))
|
||||||
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk");
|
||||||
|
|
||||||
|
UniValue result(UniValue::VOBJ);
|
||||||
|
CAmount TotalImported;
|
||||||
|
UniValue imports(UniValue::VARR);
|
||||||
|
BOOST_FOREACH(const CTransaction&tx, block.vtx)
|
||||||
|
{
|
||||||
|
if(tx.IsCoinImport())
|
||||||
|
{
|
||||||
|
UniValue objTx(UniValue::VOBJ);
|
||||||
|
objTx.push_back(Pair("txid",tx.GetHash().ToString()));
|
||||||
|
TxProof proof;
|
||||||
|
CTransaction burnTx;
|
||||||
|
std::vector<CTxOut> payouts;
|
||||||
|
TotalImported += tx.vout[1].nValue;
|
||||||
|
printf("nvalue.%li TotalImported.%li\n",tx.vout[1].nValue,TotalImported);
|
||||||
|
objTx.push_back(Pair("amount", ValueFromAmount(tx.vout[1].nValue)));
|
||||||
|
CTxDestination importaddress;
|
||||||
|
if (ExtractDestination(tx.vout[1].scriptPubKey, importaddress))
|
||||||
|
{
|
||||||
|
objTx.push_back(Pair("address", CBitcoinAddress(importaddress).ToString()));
|
||||||
|
}
|
||||||
|
UniValue objBurnTx(UniValue::VOBJ);
|
||||||
|
if (UnmarshalImportTx(tx, proof, burnTx, payouts)) {
|
||||||
|
objBurnTx.push_back(Pair("txid", burnTx.GetHash().ToString()));
|
||||||
|
objBurnTx.push_back(Pair("amount", ValueFromAmount(burnTx.vout.size() ? burnTx.vout.back().nValue : 0)));
|
||||||
|
// TODO: add source chain, using new data in burn OP_RETURN from upsteam.
|
||||||
|
}
|
||||||
|
objTx.push_back(Pair("export", objBurnTx));
|
||||||
|
imports.push_back(objTx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.push_back(Pair("imports", imports));
|
||||||
|
result.push_back(Pair("TotalImported", ValueFromAmount(TotalImported)));
|
||||||
|
result.push_back(Pair("time", block.GetBlockTime()));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|||||||
@@ -333,6 +333,7 @@ static const CRPCCommand vRPCCommands[] =
|
|||||||
{ "crosschain", "crosschainproof", &crosschainproof, true },
|
{ "crosschain", "crosschainproof", &crosschainproof, true },
|
||||||
{ "crosschain", "getNotarisationsForBlock", &getNotarisationsForBlock, true },
|
{ "crosschain", "getNotarisationsForBlock", &getNotarisationsForBlock, true },
|
||||||
{ "crosschain", "scanNotarisationsDB", &scanNotarisationsDB, true },
|
{ "crosschain", "scanNotarisationsDB", &scanNotarisationsDB, true },
|
||||||
|
{ "crosschain", "getimports", &getimports, true },
|
||||||
{ "crosschain", "migrate_converttoexport", &migrate_converttoexport, true },
|
{ "crosschain", "migrate_converttoexport", &migrate_converttoexport, true },
|
||||||
{ "crosschain", "migrate_createimporttransaction", &migrate_createimporttransaction, true },
|
{ "crosschain", "migrate_createimporttransaction", &migrate_createimporttransaction, true },
|
||||||
{ "crosschain", "migrate_completeimporttransaction", &migrate_completeimporttransaction, true },
|
{ "crosschain", "migrate_completeimporttransaction", &migrate_completeimporttransaction, true },
|
||||||
|
|||||||
@@ -426,6 +426,7 @@ extern UniValue assetchainproof(const UniValue& params, bool fHelp);
|
|||||||
extern UniValue crosschainproof(const UniValue& params, bool fHelp);
|
extern UniValue crosschainproof(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getNotarisationsForBlock(const UniValue& params, bool fHelp);
|
extern UniValue getNotarisationsForBlock(const UniValue& params, bool fHelp);
|
||||||
extern UniValue scanNotarisationsDB(const UniValue& params, bool fHelp);
|
extern UniValue scanNotarisationsDB(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue getimports(const UniValue& params, bool fHelp);
|
||||||
extern UniValue migrate_converttoexport(const UniValue& params, bool fHelp);
|
extern UniValue migrate_converttoexport(const UniValue& params, bool fHelp);
|
||||||
extern UniValue migrate_createimporttransaction(const UniValue& params, bool fHelp);
|
extern UniValue migrate_createimporttransaction(const UniValue& params, bool fHelp);
|
||||||
extern UniValue migrate_completeimporttransaction(const UniValue& params, bool fHelp);
|
extern UniValue migrate_completeimporttransaction(const UniValue& params, bool fHelp);
|
||||||
|
|||||||
@@ -859,7 +859,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
|
|||||||
|
|
||||||
static bool IsKeyType(string strType)
|
static bool IsKeyType(string strType)
|
||||||
{
|
{
|
||||||
return (strType== "key" || strType == "wkey" ||
|
return (strType == "key" || strType == "wkey" ||
|
||||||
strType == "hdseed" || strType == "chdseed" ||
|
strType == "hdseed" || strType == "chdseed" ||
|
||||||
strType == "zkey" || strType == "czkey" ||
|
strType == "zkey" || strType == "czkey" ||
|
||||||
strType == "sapzkey" || strType == "csapzkey" ||
|
strType == "sapzkey" || strType == "csapzkey" ||
|
||||||
@@ -922,9 +922,7 @@ DBErrors CWalletDB::LoadWallet(CWallet* pwallet)
|
|||||||
{
|
{
|
||||||
// Rescan if there is a bad transaction record..
|
// Rescan if there is a bad transaction record..
|
||||||
//SoftSetBoolArg("-rescan", true);
|
//SoftSetBoolArg("-rescan", true);
|
||||||
uint256 hash;
|
fprintf(stderr, "TX corrupted.. aborted rescan!\n");
|
||||||
ssKey >> hash;
|
|
||||||
fprintf(stderr, "TX corrupted hash: %s\n", hash.ToString().c_str());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user