diff --git a/src/wallet/asyncrpcoperation_saplingmigration.cpp b/src/wallet/asyncrpcoperation_saplingmigration.cpp index ab44bf760..cb3f2c9d2 100644 --- a/src/wallet/asyncrpcoperation_saplingmigration.cpp +++ b/src/wallet/asyncrpcoperation_saplingmigration.cpp @@ -191,6 +191,10 @@ libzcash::SaplingPaymentAddress AsyncRPCOperation_saplingmigration::getMigration return toAddress; } +void AsyncRPCOperation_saplingmigration::cancel() { + set_state(OperationStatus::CANCELLED); +} + UniValue AsyncRPCOperation_saplingmigration::getStatus() const { UniValue v = AsyncRPCOperation::getStatus(); UniValue obj = v.get_obj(); diff --git a/src/wallet/asyncrpcoperation_saplingmigration.h b/src/wallet/asyncrpcoperation_saplingmigration.h index e077c8eca..2f790fc14 100644 --- a/src/wallet/asyncrpcoperation_saplingmigration.h +++ b/src/wallet/asyncrpcoperation_saplingmigration.h @@ -20,6 +20,8 @@ public: virtual void main(); + virtual void cancel(); + virtual UniValue getStatus() const; private: diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index cf220fcf2..07c0a105d 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -603,17 +603,20 @@ void CWallet::RunSaplingMigration(int blockHeight) { // height N, implementations SHOULD start generating the transactions at around // height N-5 if (blockHeight % 500 == 495) { - if (saplingMigrationOperation != nullptr) { - saplingMigrationOperation->cancel(); + std::shared_ptr q = getAsyncRPCQueue(); + std::shared_ptr lastOperation = q->popOperationForId(saplingMigrationOperationId); + if (lastOperation != nullptr) { + lastOperation->cancel(); } pendingSaplingMigrationTxs.clear(); - std::shared_ptr q = getAsyncRPCQueue(); std::shared_ptr operation(new AsyncRPCOperation_saplingmigration(blockHeight + 5)); - saplingMigrationOperation = operation; + saplingMigrationOperationId = operation->getId(); q->addOperation(operation); } else if (blockHeight % 500 == 499) { - if (saplingMigrationOperation != nullptr) { - saplingMigrationOperation->cancel(); + std::shared_ptr q = getAsyncRPCQueue(); + std::shared_ptr lastOperation = q->popOperationForId(saplingMigrationOperationId); + if (lastOperation != nullptr) { + lastOperation->cancel(); } for (const CTransaction& transaction : pendingSaplingMigrationTxs) { // The following is taken from z_sendmany/z_mergetoaddress diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 6e4c239d9..fa1370111 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -757,7 +757,7 @@ private: TxNullifiers mapTxSaplingNullifiers; std::vector pendingSaplingMigrationTxs; - std::shared_ptr saplingMigrationOperation = nullptr; + AsyncRPCOperationId saplingMigrationOperationId; void AddToTransparentSpends(const COutPoint& outpoint, const uint256& wtxid); void AddToSproutSpends(const uint256& nullifier, const uint256& wtxid);