bool DecodeHexTx(CMutableTransaction& tx, const std::string& strHexTx, bool fTryNoWitness) { if (!IsHex(strHexTx)) { return false; } std::vector<unsigned char> txData(ParseHex(strHexTx)); if (fTryNoWitness) { CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS); try { ssData >> tx; if (ssData.eof() && CheckTxScriptsSanity(tx)) { return true; } } catch (const std::exception&) { // Fall through. } } CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); try { ssData >> tx; if (!ssData.empty()) { return false; } } catch (const std::exception&) { return false; } return true; }
void MultisigDialog::on_sendTransactionButton_clicked() { int64_t transactionSize = ui->signedTransaction->text().size() / 2; if(transactionSize == 0) return; // Check the fee int64_t fee = (int64_t ) (ui->fee->text().toDouble() * COIN); int64_t minFee = MIN_TX_FEE * (1 + (int64_t) transactionSize / 1000); if(fee < minFee) { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Confirm send transaction"), tr("The fee of the transaction (%1 XBTC21) is smaller than the expected fee (%2 XBTC21). Do you want to send the transaction anyway?").arg((double) fee / COIN).arg((double) minFee / COIN), QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel); if(ret != QMessageBox::Yes) return; } else if(fee > minFee) { QMessageBox::StandardButton ret = QMessageBox::question(this, tr("Confirm send transaction"), tr("The fee of the transaction (%1 XBTC21) is bigger than the expected fee (%2 XBTC21). Do you want to send the transaction anyway?").arg((double) fee / COIN).arg((double) minFee / COIN), QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel); if(ret != QMessageBox::Yes) return; } // Decode the raw transaction std::vector<unsigned char> txData(ParseHex(ui->signedTransaction->text().toStdString())); CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); CTransaction tx; try { ssData >> tx; } catch(std::exception &e) { (void)e; return; } uint256 txHash = tx.GetHash(); // Check if the transaction is already in the blockchain CTransaction existingTx; uint256 blockHash = 0; if(GetTransaction(txHash, existingTx, blockHash)) { if(blockHash != 0) return; } // Send the transaction to the local node CTxDB txdb("r"); if(!tx.AcceptToMemoryPool(txdb, false)) return; SyncWithWallets(tx, NULL, true); //(CInv(MSG_TX, txHash), tx); RelayTransaction(tx, txHash); }
bool DecodeHexTx(CMutableTransaction& tx, const std::string& strHexTx) { if (!IsHex(strHexTx)) return false; std::vector<unsigned char> txData(ParseHex(strHexTx)); CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); try { ssData >> tx; if (!ssData.empty()) return false; } catch (const std::exception&) { return false; } return true; }
void SellsPage::on_refundButton_clicked() { QItemSelectionModel* selectionModel = ui->buysTableWidget->selectionModel(); QModelIndexList selected = selectionModel->selectedRows(); if(selected.count() == 0) return; QModelIndex index = selected.at(0); int r = index.row(); std::string id = ui->buysTableWidget->item(r, 4)->text().toStdString(); uint256 listingIdHash = uint256(id); std::string rid = ui->buysTableWidget->item(r, 5)->text().toStdString(); uint256 requestIdHash = uint256(rid); // ask the user if they really want to accept the buy request QMessageBox::StandardButton reply; reply = QMessageBox::question(this, "Refund Buy", "Are you sure you want to refund the buyer for this item? This will return the security deposit to both buyer and seller.", QMessageBox::Yes|QMessageBox::No); if (reply == QMessageBox::Yes) { // Construct a transaction that spends the escrow multisig and sends the security deposit back to // the seller as well as the buyer CBuyRequest buyRequest = mapBuyRequests[requestIdHash]; // get the raw tx off of the request //std::string rawTx = RefundEscrow(buyRequest.buyerEscrowLockTxHash, buyRequest.sellerEscrowLockTxHash, mapListings[buyRequest.listingId].listing.sellerKey, 2*mapListings[buyRequest.listingId].listing.nValue, buyRequest.buyerKey, strErrors); std::string rawTx = SignMultiSigTransaction(buyRequest.rawTx); // broadcast the payment transaction CTransaction tx; vector<unsigned char> txData(ParseHex(rawTx)); CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); ssData >> tx; AcceptToMemoryPool(mempool, tx, false, NULL); LoadSells(); LoadBuyRequests(); }