diff options
| author | Russell Yanofsky <[email protected]> | 2017-02-16 10:49:03 -0500 |
|---|---|---|
| committer | Wladimir J. van der Laan <[email protected]> | 2017-02-22 12:45:43 +0100 |
| commit | 9072395e5fddb1f2590138a179ab0868646a38a0 (patch) | |
| tree | 9006392bda89ee2458e29ffb345a5fd8c71f7c94 /src/wallet/rpcdump.cpp | |
| parent | Fix segfault crash when shutdown the GUI in disablewallet mode (diff) | |
| download | discoin-9072395e5fddb1f2590138a179ab0868646a38a0.tar.xz discoin-9072395e5fddb1f2590138a179ab0868646a38a0.zip | |
Return errors from importmulti if complete rescans are not successful
Github-Pull: #9773
Rebased-From: e2e2f4c856363bbb0e3b5ba4df225f3754c3db39
Diffstat (limited to 'src/wallet/rpcdump.cpp')
| -rw-r--r-- | src/wallet/rpcdump.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp index e95c71ac8..8a9e7d144 100644 --- a/src/wallet/rpcdump.cpp +++ b/src/wallet/rpcdump.cpp @@ -1074,11 +1074,32 @@ UniValue importmulti(const JSONRPCRequest& mainRequest) if (fRescan && fRunScan && requests.size()) { CBlockIndex* pindex = nLowestTimestamp > minimumTimestamp ? chainActive.FindEarliestAtLeast(std::max<int64_t>(nLowestTimestamp - 7200, 0)) : chainActive.Genesis(); - + CBlockIndex* scannedRange = nullptr; if (pindex) { - pwalletMain->ScanForWalletTransactions(pindex, true); + scannedRange = pwalletMain->ScanForWalletTransactions(pindex, true); pwalletMain->ReacceptWalletTransactions(); } + + if (!scannedRange || scannedRange->nHeight > pindex->nHeight) { + std::vector<UniValue> results = response.getValues(); + response.clear(); + response.setArray(); + size_t i = 0; + for (const UniValue& request : requests.getValues()) { + // If key creation date is within the successfully scanned + // range, or if the import result already has an error set, let + // the result stand unmodified. Otherwise replace the result + // with an error message. + if (GetImportTimestamp(request, now) - 7200 >= scannedRange->GetBlockTimeMax() || results.at(i).exists("error")) { + response.push_back(results.at(i)); + } else { + UniValue result = UniValue(UniValue::VOBJ); + result.pushKV("success", UniValue(false)); + result.pushKV("error", JSONRPCError(RPC_MISC_ERROR, strprintf("Failed to rescan before time %d, transactions may be missing.", scannedRange->GetBlockTimeMax()))); + response.push_back(std::move(result)); + } + } + } } return response; |