ready to implement tx wallet copy()

This commit is contained in:
woodser
2019-07-29 21:34:16 -04:00
parent a887772177
commit dcb8407457
3 changed files with 65 additions and 25 deletions
+52 -1
View File
@@ -177,7 +177,58 @@ namespace monero {
shared_ptr<MoneroTx> MoneroTx::copy(const shared_ptr<MoneroTx>& src, const shared_ptr<MoneroTx>& tgt) const {
MTRACE("MoneroTx::copy(const shared_ptr<MoneroTx>& src, const shared_ptr<MoneroTx>& 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<shared_ptr<MoneroOutput>>();
for (const shared_ptr<MoneroOutput>& vin : src->vins) {
shared_ptr<MoneroOutput> vinCopy = vin->copy(vin, shared_ptr<MoneroOutput>());
vinCopy->tx = tgt;
tgt->vins.push_back(vinCopy);
}
}
if (!src->vouts.empty()) {
tgt->vouts = vector<shared_ptr<MoneroOutput>>();
for (const shared_ptr<MoneroOutput>& vout : src->vouts) {
shared_ptr<MoneroOutput> voutCopy = vout->copy(vout, shared_ptr<MoneroOutput>());
voutCopy->tx = tgt;
tgt->vouts.push_back(voutCopy);
}
}
if (!src->outputIndices.empty()) tgt->outputIndices = vector<uint32_t>(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<string>(src->signatures);
return tgt;
}
boost::property_tree::ptree MoneroTx::toPropertyTree() const {
+5 -24
View File
@@ -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<MoneroTransferRequest> req;
if (request.txRequest == boost::none) {
MTRACE("copying transfer request");
req = request.copy(make_shared<MoneroTransferRequest>(request), shared_ptr<MoneroTransferRequest>());
MTRACE("done copying request!!!");
}
if (request.txRequest == boost::none) req = request.copy(make_shared<MoneroTransferRequest>(request), make_shared<MoneroTransferRequest>());
else {
MTRACE("copying tx request");
shared_ptr<MoneroTxRequest> txReq = request.txRequest.get()->copy(request.txRequest.get(), shared_ptr<MoneroTxRequest>());
MTRACE("1");
if (request.txRequest.get()->transferRequest.get().get() == &request) {
req = txReq->transferRequest.get();
MTRACE("2");
}
shared_ptr<MoneroTxRequest> txReq = request.txRequest.get()->copy(request.txRequest.get(), make_shared<MoneroTxRequest>());
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<MoneroTransferRequest>(request), shared_ptr<MoneroTransferRequest>());
MTRACE("5");
req = request.copy(make_shared<MoneroTransferRequest>(request), make_shared<MoneroTransferRequest>());
req->txRequest = txReq;
MTRACE("6");
}
}
MTRACE("7");
if (req->txRequest == boost::none) req->txRequest = shared_ptr<MoneroTxRequest>();
MTRACE("8");
if (req->txRequest == boost::none) req->txRequest = make_shared<MoneroTxRequest>();
shared_ptr<MoneroTxRequest> txReq = req->txRequest.get();
MTRACE("9");
txReq->transferRequest = boost::none; // break circular link for meetsCriteria()
MTRACE("10");
// // copy and normalize request
// MoneroTransferRequest req;
+8
View File
@@ -106,6 +106,9 @@ namespace monero {
// --------------------------- MONERO TX WALLET -----------------------------
shared_ptr<MoneroTxWallet> MoneroTxWallet::copy(const shared_ptr<MoneroTx>& src, const shared_ptr<MoneroTx>& tgt) const {
MTRACE("MoneroTxWallet::copy(const shared_ptr<MoneroTx>& src, const shared_ptr<MoneroTx>& tgt)");
MTRACE("src: " << src);
MTRACE("tgt: " << tgt);
return MoneroTxWallet::copy(static_pointer_cast<MoneroTxWallet>(src), static_pointer_cast<MoneroTxWallet>(tgt));
};
@@ -116,7 +119,10 @@ namespace monero {
// copy base class
MoneroTx::copy(static_pointer_cast<MoneroTx>(src), static_pointer_cast<MoneroTx>(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> MoneroTxRequest::copy(const shared_ptr<MoneroTxRequest>& src, const shared_ptr<MoneroTxRequest>& tgt) const {
MTRACE("MoneroTxRequest::copy(const shared_ptr<MoneroTxRequest>& src, const shared_ptr<MoneroTxRequest>& tgt)");
MTRACE("src: " << src);
MTRACE("tgt: " << tgt);
if (this != src.get()) throw runtime_error("this != src");
// copy base class