From dcb840745779c57a5613ee877ef2bafa10182de7 Mon Sep 17 00:00:00 2001 From: woodser Date: Mon, 29 Jul 2019 21:34:16 -0400 Subject: [PATCH] ready to implement tx wallet copy() --- src/daemon/MoneroDaemonModel.cpp | 53 +++++++++++++++++++++++++++++++- src/wallet/MoneroWallet.cpp | 29 +++-------------- src/wallet/MoneroWalletModel.cpp | 8 +++++ 3 files changed, 65 insertions(+), 25 deletions(-) diff --git a/src/daemon/MoneroDaemonModel.cpp b/src/daemon/MoneroDaemonModel.cpp index 635fb5a..31e8daf 100644 --- a/src/daemon/MoneroDaemonModel.cpp +++ b/src/daemon/MoneroDaemonModel.cpp @@ -177,7 +177,58 @@ namespace monero { shared_ptr MoneroTx::copy(const shared_ptr& src, const shared_ptr& tgt) const { MTRACE("MoneroTx::copy(const shared_ptr& src, const shared_ptr& tgt)"); - throw runtime_error("MoneroTx::copy() not implemented"); + tgt->id = src->id; + tgt->version = src->version; + tgt->isCoinbase = src->isCoinbase; + tgt->paymentId = src->paymentId; + tgt->fee = src->fee; + tgt->mixin = src->mixin; + tgt->doNotRelay = src->doNotRelay; + tgt->isRelayed = src->isRelayed; + tgt->isConfirmed = src->isConfirmed; + tgt->inTxPool = src->inTxPool; + tgt->numConfirmations = src->numConfirmations; + tgt->unlockTime = src->unlockTime; + tgt->lastRelayedTimestamp = src->lastRelayedTimestamp; + tgt->receivedTimestamp = src->receivedTimestamp; + tgt->isDoubleSpendSeen = src->isDoubleSpendSeen; + tgt->key = src->key; + tgt->fullHex = src->fullHex; + tgt->prunedHex = src->prunedHex; + tgt->prunableHex = src->prunableHex; + tgt->prunableHash = src->prunableHash; + tgt->size = src->size; + tgt->weight = src->weight; + if (!src->vins.empty()) { + tgt->vins = vector>(); + for (const shared_ptr& vin : src->vins) { + shared_ptr vinCopy = vin->copy(vin, shared_ptr()); + vinCopy->tx = tgt; + tgt->vins.push_back(vinCopy); + } + } + if (!src->vouts.empty()) { + tgt->vouts = vector>(); + for (const shared_ptr& vout : src->vouts) { + shared_ptr voutCopy = vout->copy(vout, shared_ptr()); + voutCopy->tx = tgt; + tgt->vouts.push_back(voutCopy); + } + } + if (!src->outputIndices.empty()) tgt->outputIndices = vector(src->outputIndices); + tgt->metadata = src->metadata; + tgt->commonTxSets = src->commonTxSets; + if (!src->extra.empty()) throw runtime_error("extra deep copy not implemented"); // TODO: implement extra + tgt->rctSignatures = src->rctSignatures; + tgt->rctSigPrunable = src->rctSigPrunable; + tgt->isKeptByBlock = src->isKeptByBlock; + tgt->isFailed = src->isFailed; + tgt->lastFailedHeight = src->lastFailedHeight; + tgt->lastFailedId = src->lastFailedId; + tgt->maxUsedBlockHeight = src->maxUsedBlockHeight; + tgt->maxUsedBlockId = src->maxUsedBlockId; + if (!src->signatures.empty()) tgt->signatures = vector(src->signatures); + return tgt; } boost::property_tree::ptree MoneroTx::toPropertyTree() const { diff --git a/src/wallet/MoneroWallet.cpp b/src/wallet/MoneroWallet.cpp index b884318..6f3623d 100644 --- a/src/wallet/MoneroWallet.cpp +++ b/src/wallet/MoneroWallet.cpp @@ -1384,45 +1384,26 @@ namespace monero { MTRACE("MoneroWallet::getTransfers(request)"); // LOG request - MTRACE("Transfer request: " << request.serialize()); if (request.txRequest != boost::none) { if ((*request.txRequest)->block == boost::none) MTRACE("Transfer request's tx request rooted at [tx]:" << (*request.txRequest)->serialize()); else MTRACE("Transfer request's tx request rooted at [block]: " << (*(*request.txRequest)->block)->serialize()); } // copy and normalize request - MTRACE("initializing shared pointer"); shared_ptr req; - if (request.txRequest == boost::none) { - MTRACE("copying transfer request"); - req = request.copy(make_shared(request), shared_ptr()); - MTRACE("done copying request!!!"); - } + if (request.txRequest == boost::none) req = request.copy(make_shared(request), make_shared()); else { - MTRACE("copying tx request"); - shared_ptr txReq = request.txRequest.get()->copy(request.txRequest.get(), shared_ptr()); - MTRACE("1"); - if (request.txRequest.get()->transferRequest.get().get() == &request) { - req = txReq->transferRequest.get(); - MTRACE("2"); - } + shared_ptr txReq = request.txRequest.get()->copy(request.txRequest.get(), make_shared()); + if (request.txRequest.get()->transferRequest.get().get() == &request) req = txReq->transferRequest.get(); else { - MTRACE("3"); if (request.txRequest.get()->transferRequest != boost::none) throw new runtime_error("Transfer request's tx request must be a circular reference or null"); - MTRACE("4"); - req = request.copy(make_shared(request), shared_ptr()); - MTRACE("5"); + req = request.copy(make_shared(request), make_shared()); req->txRequest = txReq; - MTRACE("6"); } } - MTRACE("7"); - if (req->txRequest == boost::none) req->txRequest = shared_ptr(); - MTRACE("8"); + if (req->txRequest == boost::none) req->txRequest = make_shared(); shared_ptr txReq = req->txRequest.get(); - MTRACE("9"); txReq->transferRequest = boost::none; // break circular link for meetsCriteria() - MTRACE("10"); // // copy and normalize request // MoneroTransferRequest req; diff --git a/src/wallet/MoneroWalletModel.cpp b/src/wallet/MoneroWalletModel.cpp index 05d7e43..fa421a2 100644 --- a/src/wallet/MoneroWalletModel.cpp +++ b/src/wallet/MoneroWalletModel.cpp @@ -106,6 +106,9 @@ namespace monero { // --------------------------- MONERO TX WALLET ----------------------------- shared_ptr MoneroTxWallet::copy(const shared_ptr& src, const shared_ptr& tgt) const { + MTRACE("MoneroTxWallet::copy(const shared_ptr& src, const shared_ptr& tgt)"); + MTRACE("src: " << src); + MTRACE("tgt: " << tgt); return MoneroTxWallet::copy(static_pointer_cast(src), static_pointer_cast(tgt)); }; @@ -116,7 +119,10 @@ namespace monero { // copy base class MoneroTx::copy(static_pointer_cast(src), static_pointer_cast(tgt)); + // copy wallet extensions throw runtime_error("MoneroTxWallet::copy(txWallet) not implemented"); + + return tgt; }; boost::property_tree::ptree MoneroTxWallet::toPropertyTree() const { @@ -177,6 +183,8 @@ namespace monero { shared_ptr MoneroTxRequest::copy(const shared_ptr& src, const shared_ptr& tgt) const { MTRACE("MoneroTxRequest::copy(const shared_ptr& src, const shared_ptr& tgt)"); + MTRACE("src: " << src); + MTRACE("tgt: " << tgt); if (this != src.get()) throw runtime_error("this != src"); // copy base class