mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-08 13:49:35 +02:00
SegWit wallet support
This introduces two command line flags (-addresstype and -changetype) which control the type of addresses/outputs created by the GUI and RPCs. Certain RPCs allow overriding these (`getnewaddress` and `getrawchangeaddress`). Supported types are "legacy" (P2PKH and P2SH-multisig), "p2sh-segwit" (P2SH-P2WPKH and P2SH-P2WSH-multisig), and "bech32" (P2WPKH and P2WSH-multisig). A few utility functions are added to the wallet to construct different address type and to add the necessary entries to the wallet file to be compatible with earlier versions (see `CWallet::LearnRelatedScripts`, `GetDestinationForKey`, `GetAllDestinationsForKey`, `CWallet::AddAndGetDestinationForScript`).
This commit is contained in:
@@ -636,27 +636,24 @@ void PaymentServer::fetchPaymentACK(CWallet* wallet, const SendCoinsRecipient& r
|
||||
// Create a new refund address, or re-use:
|
||||
QString account = tr("Refund from %1").arg(recipient.authenticatedMerchant);
|
||||
std::string strAccount = account.toStdString();
|
||||
std::set<CTxDestination> refundAddresses = wallet->GetAccountAddresses(strAccount);
|
||||
if (!refundAddresses.empty()) {
|
||||
CScript s = GetScriptForDestination(*refundAddresses.begin());
|
||||
CPubKey newKey;
|
||||
if (wallet->GetKeyFromPool(newKey)) {
|
||||
// BIP70 requests encode the scriptPubKey directly, so we are not restricted to address
|
||||
// types supported by the receiver. As a result, we choose the address format we also
|
||||
// use for change. Despite an actual payment and not change, this is a close match:
|
||||
// it's the output type we use subject to privacy issues, but not restricted by what
|
||||
// other software supports.
|
||||
wallet->LearnRelatedScripts(newKey, g_change_type);
|
||||
CTxDestination dest = GetDestinationForKey(newKey, g_change_type);
|
||||
wallet->SetAddressBook(dest, strAccount, "refund");
|
||||
|
||||
CScript s = GetScriptForDestination(dest);
|
||||
payments::Output* refund_to = payment.add_refund_to();
|
||||
refund_to->set_script(&s[0], s.size());
|
||||
}
|
||||
else {
|
||||
CPubKey newKey;
|
||||
if (wallet->GetKeyFromPool(newKey)) {
|
||||
CKeyID keyID = newKey.GetID();
|
||||
wallet->SetAddressBook(keyID, strAccount, "refund");
|
||||
|
||||
CScript s = GetScriptForDestination(keyID);
|
||||
payments::Output* refund_to = payment.add_refund_to();
|
||||
refund_to->set_script(&s[0], s.size());
|
||||
}
|
||||
else {
|
||||
// This should never happen, because sending coins should have
|
||||
// just unlocked the wallet and refilled the keypool.
|
||||
qWarning() << "PaymentServer::fetchPaymentACK: Error getting refund key, refund_to not set";
|
||||
}
|
||||
} else {
|
||||
// This should never happen, because sending coins should have
|
||||
// just unlocked the wallet and refilled the keypool.
|
||||
qWarning() << "PaymentServer::fetchPaymentACK: Error getting refund key, refund_to not set";
|
||||
}
|
||||
|
||||
int length = payment.ByteSize();
|
||||
|
||||
Reference in New Issue
Block a user