Add support for descriptors to utxoupdatepsbt #15427

pull sipa wants to merge 4 commits into bitcoin:master from sipa:201902_utxoupdatepsbtdesc changing 10 files +148 −59
  1. sipa commented at 0:50 am on February 17, 2019: member

    This adds a descriptors argument to the utxoupdatepsbt RPC. This means:

    • Input and output scripts and keys will be filled in when known.
    • P2SH-witness inputs will be filled in from the UTXO set when a descriptor is provided that shows they’re spending segwit outputs.

    This also moves some (newly) shared code to separate functions: UpdatePSBTOutput (an analogue to SignPSBTInput), IsSegWitOutput, and EvalDescriptorStringOrObject (implementing the string or object notation parsing used in scantxoutset).

  2. sipa commented at 0:53 am on February 17, 2019: member
    @achow101 @gwillen You may be interested in this.
  3. sipa force-pushed on Feb 17, 2019
  4. fanquake added the label RPC/REST/ZMQ on Feb 17, 2019
  5. DrahtBot commented at 1:26 pm on February 18, 2019: member

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #16240 (JSONRPCRequest-aware RPCHelpMan by kallewoof)
    • #16227 (Refactor CWallet’s inheritance chain by achow101)
    • #15996 (rpc: Deprecate totalfee argument in bumpfee by instagibbs)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  6. in src/script/sign.cpp:514 in cb085728f6 outdated
    503+bool IsSegWitOutput(const SigningProvider& provider, const CScript& script)
    504+{
    505+    std::vector<valtype> solutions;
    506+    auto whichtype = Solver(script, solutions);
    507+    if (whichtype == TX_WITNESS_V0_SCRIPTHASH || whichtype == TX_WITNESS_V0_KEYHASH || whichtype == TX_WITNESS_UNKNOWN) return true;
    508+    if (whichtype == TX_SCRIPTHASH) {
    


    promag commented at 6:26 pm on February 18, 2019:

    Commit cb085728f64a76fec48dee4e6432c199aa69a62a

    Isn’t this new code?


    sipa commented at 7:01 pm on February 18, 2019:
    Yes?

    promag commented at 7:28 pm on February 18, 2019:
    That’s fine, just that after reading commit message I thought this was move only commit.

    sipa commented at 3:46 pm on February 20, 2019:
    Ah, good point. I’ll clarify in the commit message.

    sipa commented at 10:58 pm on February 24, 2019:
    Done.
  7. in src/rpc/rawtransaction.cpp:1723 in e90a5c753d outdated
    1719+                {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
    1720+                {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::OMITTED_NAMED_ARG, "An array of either strings or objects", {
    1721+                    {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "A descriptor"},
    1722+                    {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with a descriptor and extra information", {
    1723+                         {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "A descriptor"},
    1724+                         {"range", RPCArg::Type::NUM, "1000", "Up to what index HD chains should be explored"},
    


    achow101 commented at 6:33 pm on February 18, 2019:
    Instead of a single range value, this could be the start and end values of the range like what importmulti does?

    sipa commented at 10:52 pm on February 24, 2019:
    I’m copying the behavior of scantxoutset here. Maybe it makes sense to merge the two afterwards, and have all three (scantxoutset, utxoupdatepsbt, importmulti) support both start+end and range?

    sipa commented at 9:27 pm on March 2, 2019:
    This is now fixed by using the same parameter style as all through #15497.
  8. achow101 commented at 6:33 pm on February 18, 2019: member
    Conecpt ACK
  9. promag commented at 6:40 pm on February 18, 2019: member
    Concept ACK, beside comment below, abstracted code looks good. Could include release note.
  10. DrahtBot added the label Needs rebase on Feb 22, 2019
  11. sipa force-pushed on Feb 24, 2019
  12. sipa commented at 10:58 pm on February 24, 2019: member
    Rebased.
  13. DrahtBot removed the label Needs rebase on Feb 24, 2019
  14. DrahtBot added the label Needs rebase on Mar 1, 2019
  15. sipa force-pushed on Mar 2, 2019
  16. sipa commented at 9:27 pm on March 2, 2019: member
    Rebased after merge of #15497.
  17. DrahtBot removed the label Needs rebase on Mar 2, 2019
  18. meshcollider commented at 4:11 am on April 14, 2019: contributor
    Concept ACK
  19. laanwj added this to the "Blockers" column in a project

  20. in src/psbt.h:557 in cdabfae36e outdated
    553@@ -554,6 +554,9 @@ bool PSBTInputSigned(PSBTInput& input);
    554 /** Signs a PSBTInput, verifying that all provided data matches what is being signed. */
    555 bool SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index, int sighash = SIGHASH_ALL, SignatureData* out_sigdata = nullptr, bool use_dummy = false);
    556 
    557+/** Updates a PSBTOutput with information from provider. */
    


    jnewbery commented at 5:57 pm on May 2, 2019:
    I think this could comment could be a bit more detailed. How is the PSBTOutput updated? (Answer: the redeem_script, witness_script and hd_keypaths are filled in)

    sipa commented at 10:39 pm on May 9, 2019:
    Done.
  21. in src/psbt.cpp:219 in cdabfae36e outdated
    209@@ -210,6 +210,20 @@ bool PSBTInputSigned(PSBTInput& input)
    210     return !input.final_script_sig.empty() || !input.final_script_witness.IsNull();
    211 }
    212 
    213+void UpdatePSBTOutput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index)
    214+{
    


    jnewbery commented at 6:00 pm on May 2, 2019:

    I know this is move-only, but I found this functionality pretty inscrutable, and think it could do with some additional commenting. Things that would be helpful:

    • explain why the caller is instantiating a HidingSigningProvider with nosign set to true
    • explain what the magic 0 and 1 values are in the call to ProduceSignature()
    • explain that ProduceSignature() isn’t really signing (or if it does, then that signature gets thrown away)

    sipa commented at 10:39 pm on May 9, 2019:
    Added a bunch of comments. Better?
  22. in src/rpc/rawtransaction.cpp:1716 in cdabfae36e outdated
    1709@@ -1710,12 +1710,19 @@ UniValue converttopsbt(const JSONRPCRequest& request)
    1710 
    1711 UniValue utxoupdatepsbt(const JSONRPCRequest& request)
    1712 {
    1713-    if (request.fHelp || request.params.size() != 1) {
    1714+    if (request.fHelp || request.params.size() < 1 || request.params.size() > 2) {
    1715         throw std::runtime_error(
    1716             RPCHelpMan{"utxoupdatepsbt",
    1717-            "\nUpdates a PSBT with witness UTXOs retrieved from the UTXO set or the mempool.\n",
    1718+            "\nUpdates a PSBT with data from descriptors and the UTXO set or the mempool (segwit outputs only)\n",
    


    jnewbery commented at 6:13 pm on May 2, 2019:

    The parentheses here are ambiguous - they could be interpreted as modifying the entire sentence or just the mempool part. Consider changing this to:

    0"\nUpdates all segwit inputs and outputs in a PSBT with data from descriptors, the UTXO set or the mempool.\n",
    

    sipa commented at 10:40 pm on May 9, 2019:
    Done.
  23. in src/rpc/rawtransaction.cpp:1783 in cdabfae36e outdated
    1781-        if (which_type == TX_WITNESS_V0_SCRIPTHASH || which_type == TX_WITNESS_V0_KEYHASH || which_type == TX_WITNESS_UNKNOWN) {
    1782+        if (IsSegWitOutput(provider, coin.out.scriptPubKey)) {
    1783             input.witness_utxo = coin.out;
    1784         }
    1785+
    1786+        // Update the inputs using descriptor data.
    


    jnewbery commented at 6:14 pm on May 2, 2019:
    Comment could be expanded to say what is being updated (redeem_script, witness_script and hd_keypaths are being filled)
  24. in src/rpc/rawtransaction.cpp:1787 in cdabfae36e outdated
    1785+
    1786+        // Update the inputs using descriptor data.
    1787+        SignPSBTInput(HidingSigningProvider(&provider, /* nosign */ true, /* nobip32derivs */ false), psbtx, i, /* sighash_type */ 1);
    1788+    }
    1789+
    1790+    // Update the outputs
    


    jnewbery commented at 6:14 pm on May 2, 2019:
    Comment could be expanded to say what is being updated (redeem_script, witness_script and hd_keypaths are being filled)

    sipa commented at 10:40 pm on May 9, 2019:
    I’d rather not be specific here, as it may change over time.
  25. in src/rpc/rawtransaction.cpp:1784 in cdabfae36e outdated
    1782+        if (IsSegWitOutput(provider, coin.out.scriptPubKey)) {
    1783             input.witness_utxo = coin.out;
    1784         }
    1785+
    1786+        // Update the inputs using descriptor data.
    1787+        SignPSBTInput(HidingSigningProvider(&provider, /* nosign */ true, /* nobip32derivs */ false), psbtx, i, /* sighash_type */ 1);
    


    jnewbery commented at 6:15 pm on May 2, 2019:
    I found using SignPSBTInput() a bit jarring here, since nothing is actually being signed. Can you add a comment to say that SignPSBTInput() won’t actually sign when provided with a HidingSigningProvider where nosign is true?

    jnewbery commented at 6:16 pm on May 2, 2019:
    Is there a reason not to create one HidingSigningProvider() for the entire function, rather than instantiate one for each call to SignPSBTInput() and UpdatePSBTOutput()

    sipa commented at 10:41 pm on May 9, 2019:
    Added some comments.

    sipa commented at 10:41 pm on May 9, 2019:
    Nope. Done that, that’s much more readable.
  26. in test/functional/rpc_psbt.py:314 in cdabfae36e outdated
    310@@ -311,14 +311,21 @@ def run_test(self):
    311         # Bech32 inputs should be filled with witness UTXO. Other inputs should not be filled because they are non-witness
    312         psbt = self.nodes[1].createpsbt([{"txid":txid1, "vout":vout1},{"txid":txid2, "vout":vout2},{"txid":txid3, "vout":vout3}], {self.nodes[0].getnewaddress():32.999})
    313         decoded = self.nodes[1].decodepsbt(psbt)
    314-        assert "witness_utxo" not in decoded['inputs'][0] and "non_witness_utxo" not in decoded['inputs'][0]
    315-        assert "witness_utxo" not in decoded['inputs'][1] and "non_witness_utxo" not in decoded['inputs'][1]
    316-        assert "witness_utxo" not in decoded['inputs'][2] and "non_witness_utxo" not in decoded['inputs'][2]
    317+        assert "witness_utxo" not in decoded['inputs'][0] and "non_witness_utxo" not in decoded['inputs'][0] and "bip32_derivs" not in decoded['inputs'][0]
    


    jnewbery commented at 6:49 pm on May 2, 2019:

    These lines are pretty hard to read, and don’t give very useful output if they fail. Consider refactoring as follows:

     0diff --git a/test/functional/rpc_psbt.py b/test/functional/rpc_psbt.py
     1index 20261f7b7..9b00fc767 100755
     2--- a/test/functional/rpc_psbt.py
     3+++ b/test/functional/rpc_psbt.py
     4@@ -307,25 +307,32 @@ class PSBTTest(BitcoinTestFramework):
     5         vout3 = find_output(self.nodes[0], txid3, 11)
     6         self.sync_all()
     7 
     8-        # Update a PSBT with UTXOs from the node
     9-        # Bech32 inputs should be filled with witness UTXO. Other inputs should not be filled because they are non-witness
    10+        def test_psbt_input_keys(psbt_input, keys):
    11+            """Check that the psbt input has only the expected keys."""
    12+            assert_equal(set(keys), set(psbt_input.keys()))
    13+
    14+        # Create a PSBT. None of the inputs are filled initially
    15         psbt = self.nodes[1].createpsbt([{"txid":txid1, "vout":vout1},{"txid":txid2, "vout":vout2},{"txid":txid3, "vout":vout3}], {self.nodes[0].getnewaddress():32.999})
    16         decoded = self.nodes[1].decodepsbt(psbt)
    17-        assert "witness_utxo" not in decoded['inputs'][0] and "non_witness_utxo" not in decoded['inputs'][0] and "bip32_derivs" not in decoded['inputs'][0]
    18-        assert "witness_utxo" not in decoded['inputs'][1] and "non_witness_utxo" not in decoded['inputs'][1] and "bip32_derivs" not in decoded['inputs'][1]
    19-        assert "witness_utxo" not in decoded['inputs'][2] and "non_witness_utxo" not in decoded['inputs'][2] and "redeem_script" not in decoded['inputs'][2]
    20+        test_psbt_input_keys(decoded['inputs'][0], [])
    21+        test_psbt_input_keys(decoded['inputs'][1], [])
    22+        test_psbt_input_keys(decoded['inputs'][2], [])
    23+
    24+        # Update a PSBT with UTXOs from the node
    25+        # Bech32 inputs should be filled with witness UTXO. Other inputs should not be filled because they are non-witness
    26         updated = self.nodes[1].utxoupdatepsbt(psbt)
    27         decoded = self.nodes[1].decodepsbt(updated)
    28-        assert "witness_utxo" in decoded['inputs'][0] and "non_witness_utxo" not in decoded['inputs'][0] and "bip32_derivs" not in decoded['inputs'][0]
    29-        assert "witness_utxo" not in decoded['inputs'][1] and "non_witness_utxo" not in decoded['inputs'][1] and "bip32_derivs" not in decoded['inputs'][1]
    30-        assert "witness_utxo" not in decoded['inputs'][2] and "non_witness_utxo" not in decoded['inputs'][2] and "redeem_script" not in decoded['inputs'][2]
    31+        test_psbt_input_keys(decoded['inputs'][0], ['witness_utxo'])
    32+        test_psbt_input_keys(decoded['inputs'][1], [])
    33+        test_psbt_input_keys(decoded['inputs'][2], [])
    34+
    35         # Try again, now while providing descriptors, making P2SH-segwit work, and causing bip32_derivs and redeem_script to be filled in
    36         descs = [self.nodes[1].getaddressinfo(addr)['desc'] for addr in [addr1,addr2,addr3]]
    37         updated = self.nodes[1].utxoupdatepsbt(psbt, descs)
    38         decoded = self.nodes[1].decodepsbt(updated)
    39-        assert "witness_utxo" in decoded['inputs'][0] and "non_witness_utxo" not in decoded['inputs'][0] and "bip32_derivs" in decoded['inputs'][0]
    40-        assert "witness_utxo" not in decoded['inputs'][1] and "non_witness_utxo" not in decoded['inputs'][1] and "bip32_derivs" not in decoded['inputs'][1]
    41-        assert "witness_utxo" in decoded['inputs'][2] and "non_witness_utxo" not in decoded['inputs'][2] and "redeem_script" in decoded['inputs'][2]
    42+        test_psbt_input_keys(decoded['inputs'][0], ['witness_utxo', 'bip32_derivs'])
    43+        test_psbt_input_keys(decoded['inputs'][1], [])
    44+        test_psbt_input_keys(decoded['inputs'][2], ['witness_utxo', 'bip32_derivs', 'redeem_script'])
    45 
    46         # Two PSBTs with a common input should not be joinable
    47         psbt1 = self.nodes[1].createpsbt([{"txid":txid1, "vout":vout1}], {self.nodes[0].getnewaddress():Decimal('10.999')})
    

    sipa commented at 10:41 pm on May 9, 2019:
    Applied.
  27. jnewbery commented at 6:50 pm on May 2, 2019: member

    utACk cdabfae36e83f20c4728fcbbab0089e711cf3bc3

    I left a bunch of comments, mostly around comments.

  28. sipa force-pushed on May 9, 2019
  29. DrahtBot added the label Needs rebase on May 10, 2019
  30. Abstract out IsSegWitOutput from utxoupdatepsbt
    This is not a pure refactor; additional functionality is added in
    IsSegWitOutput which lets it recurse into P2SH when a
    SigningProvider is provided that knows about the inner script.
    eaf4f88734
  31. Abstract out EvalDescriptorStringOrObject from scantxoutset fb90ec3c33
  32. Abstract out UpdatePSBTOutput from FillPSBT 3135c1a2d2
  33. Add support for descriptors to utxoupdatepsbt
    This adds a descriptors argument to the utxoupdatepsbt RPC. This means:
    * Input and output scripts and keys will be filled in when known
    * P2SH-witness outputs will be filled in from the UTXO set when a descriptor
      is provided to show they're segwit outputs.
    26fe9b9909
  34. in src/rpc/rawtransaction.cpp:1723 in 535b649da4 outdated
    1721+                {"psbt", RPCArg::Type::STR, RPCArg::Optional::NO, "A base64 string of a PSBT"},
    1722+                {"descriptors", RPCArg::Type::ARR, RPCArg::Optional::OMITTED_NAMED_ARG, "An array of either strings or objects", {
    1723+                    {"", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "A descriptor"},
    1724+                    {"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with a descriptor and extra information", {
    1725+                         {"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "A descriptor"},
    1726+                         {"range", RPCArg::Type::NUM, "1000", "Up to what index HD chains should be explored"},
    


    jnewbery commented at 7:21 pm on May 10, 2019:

    I believe this needs to be a range type and have the description updated. You should just be able to copy it from the scantxoutset help text.

    Also consider refering to descriptors as output descriptors throughout, for consistency with other RPCs.


    sipa commented at 9:46 pm on May 10, 2019:
    Done.
  35. sipa force-pushed on May 10, 2019
  36. sipa commented at 9:46 pm on May 10, 2019: member
    Rebased.
  37. jnewbery commented at 10:19 pm on May 10, 2019: member
    utACK 26fe9b990995f9cb5eee21d40b4daaad19f7181f
  38. DrahtBot removed the label Needs rebase on May 13, 2019
  39. in src/rpc/rawtransaction.cpp:1527 in 26fe9b9909
    1520@@ -1514,6 +1521,17 @@ UniValue utxoupdatepsbt(const JSONRPCRequest& request)
    1521         throw JSONRPCError(RPC_DESERIALIZATION_ERROR, strprintf("TX decode failed %s", error));
    1522     }
    1523 
    1524+    // Parse descriptors, if any.
    1525+    FlatSigningProvider provider;
    1526+    if (!request.params[1].isNull()) {
    1527+        auto descs = request.params[1].get_array();
    


    promag commented at 5:45 pm on May 13, 2019:

    Use range loop

    0for (const UniValue& scanobject : request.params[1].get_array().getValues()) {
    

    Like here.

  40. in src/wallet/psbtwallet.cpp:47 in 26fe9b9909
    52-        psbt_out.FillSignatureData(sigdata);
    53-
    54-        MutableTransactionSignatureCreator creator(psbtx.tx.get_ptr(), 0, out.nValue, 1);
    55-        ProduceSignature(HidingSigningProvider(pwallet, true, !bip32derivs), creator, out.scriptPubKey, sigdata);
    56-        psbt_out.FromSignatureData(sigdata);
    57+        UpdatePSBTOutput(HidingSigningProvider(pwallet, true, !bip32derivs), psbtx, i);
    


    promag commented at 5:55 pm on May 13, 2019:
    Makes sense to instantiate HidingSigningProvider before the loop?
  41. in test/functional/rpc_psbt.py:337 in 26fe9b9909
    340+        test_psbt_input_keys(decoded['inputs'][0], ['witness_utxo'])
    341+        test_psbt_input_keys(decoded['inputs'][1], [])
    342+        test_psbt_input_keys(decoded['inputs'][2], [])
    343+
    344+        # Try again, now while providing descriptors, making P2SH-segwit work, and causing bip32_derivs and redeem_script to be filled in
    345+        descs = [self.nodes[1].getaddressinfo(addr)['desc'] for addr in [addr1,addr2,addr3]]
    


    promag commented at 5:57 pm on May 13, 2019:
    nit, spaces after , - [addr1, addr2, addr3].
  42. in src/psbt.cpp:218 in 26fe9b9909
    214@@ -215,6 +215,25 @@ bool PSBTInputSigned(const PSBTInput& input)
    215     return !input.final_script_sig.empty() || !input.final_script_witness.IsNull();
    216 }
    217 
    218+void UpdatePSBTOutput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index)
    


    promag commented at 6:00 pm on May 13, 2019:
    Could name this UpdatePSBT() and iterate outputs here? - which is what both callers do.

    Empact commented at 4:19 am on May 29, 2019:
    Alternatively, seems this could be appropriate as PartiallySignedTransaction::UpdateOutput
  43. promag commented at 6:01 pm on May 13, 2019: member
    A couple of comments.
  44. laanwj commented at 2:29 pm on May 20, 2019: member
    utACK 26fe9b990995f9cb5eee21d40b4daaad19f7181f (will hold merging until response to promag’s comments)
  45. in src/script/sign.h:235 in eaf4f88734 outdated
    231@@ -232,4 +232,7 @@ void UpdateInput(CTxIn& input, const SignatureData& data);
    232  * Solvability is unrelated to whether we consider this output to be ours. */
    233 bool IsSolvable(const SigningProvider& provider, const CScript& script);
    234 
    235+/** Check whether a scriptPubKey is known to be segwit. */
    


    ariard commented at 9:26 pm on May 20, 2019:
    nit: “native segwit or nested-segwit”?
  46. in src/rpc/rawtransaction.cpp:1508 in 26fe9b9909
    1506+                         {"range", RPCArg::Type::RANGE, "1000", "Up to what index HD chains should be explored (either end or [begin,end])"},
    1507+                    }},
    1508+                }},
    1509             },
    1510             RPCResult {
    1511                 "  \"psbt\"          (string) The base64-encoded partially signed transaction with inputs updated\n"
    


    ariard commented at 9:26 pm on May 20, 2019:
    nit: “with inputs and outputs updated”
  47. ariard commented at 9:36 pm on May 20, 2019: member

    @sipa I’m trying the RPC with the following command:

    bitcoin-cli utxoupdatepsbt 'cHNidP8BAFMCAAAAAYCdwVRx2X3o4KHx5tAMsN1ddp51MbfWsietjfMbl5HtAAAAAAD/////AQDh9QUAAAAAF6kUW+rtEOi4nk9rpw2F5XZl1dd8ehGHAAAAAAAAAA=='  '[{"desc":"sh(wpkh([bd50871a/0h/0h/0h]03895c66337b38699bfafff1084ad35bc347fac4f4e5e5fe5eb7dd81155280db53))"}]'
    

    With psbt built from createpsbt and a desc from listunspent but got a RPC_TYPE_ERROR Expected type array, got string. Is there somehting really basic I’m missing or a real parsing issue ? (given than descriptors hasn’t been added as argNames)

  48. in src/rpc/rawtransaction.cpp:1493 in 26fe9b9909
    1489@@ -1490,12 +1490,19 @@ UniValue converttopsbt(const JSONRPCRequest& request)
    1490 
    1491 UniValue utxoupdatepsbt(const JSONRPCRequest& request)
    1492 {
    1493-    if (request.fHelp || request.params.size() != 1) {
    1494+    if (request.fHelp || request.params.size() < 1 || request.params.size() > 2) {
    


    promag commented at 8:39 pm on June 2, 2019:

    26fe9b990995f9cb5eee21d40b4daaad19f7181f

    nit, could use the “new” way:

    0    if (request.fHelp || !help.IsValidNumArgs(request.params.size())) {
    1        throw std::runtime_error(help.ToString());
    2    }
    
  49. moneyball commented at 9:45 pm on June 6, 2019: contributor
    It seems like next steps for this PR are for @sipa to respond to @promag and @ariard comments, then probably back to @laanwj for merge consideration.
  50. promag commented at 1:58 pm on June 11, 2019: member
    My comments aren’t blocking FWIW.
  51. promag commented at 9:20 pm on June 12, 2019: member
    @sipa my suggestions are in fb3540a87, and rebased here d7a8cf21f.
  52. promag commented at 9:23 pm on June 12, 2019: member
    ACK 26fe9b9, checked refactors and tests look comprehensive. Still missing a release note but can be added later.
  53. fanquake added the label Waiting for author on Jun 25, 2019
  54. laanwj removed the label Waiting for author on Jul 2, 2019
  55. laanwj merged this on Jul 2, 2019
  56. laanwj closed this on Jul 2, 2019

  57. laanwj commented at 2:54 pm on July 2, 2019: member
    Going to merge this, I think the comments are minor enough to be addressable afterward and don’t really need to block the merge.
  58. laanwj referenced this in commit 2f717fb5cd on Jul 2, 2019
  59. jnewbery commented at 4:57 pm on July 2, 2019: member
    It’s a shame that this got merged without a bunch of review comments being addressed. It seems to me that this: #15427#pullrequestreview-239730895 is a bug, and that the new functionality won’t work with bitcoin-cli or using named arguments.
  60. jnewbery commented at 5:45 pm on July 2, 2019: member
    Fixed here: #16326
  61. MarcoFalke commented at 8:37 pm on July 2, 2019: member
    This had 3 ACKs. master is always expected to have bugs and if they are trivially fixed in a follow-up, why not?
  62. sidhujag referenced this in commit 6b86135a05 on Jul 3, 2019
  63. laanwj removed this from the "Blockers" column in a project

  64. fanquake added the label Needs release note on Jul 4, 2019
  65. fanquake removed the label Needs release note on Jul 5, 2019
  66. fanquake commented at 2:03 am on July 5, 2019: member
    Release notes for this are being added as part of #16326.
  67. jnewbery commented at 9:45 am on July 5, 2019: member

    This had 3 ACKs. master is always expected to have bugs and if they are trivially fixed in a follow-up, why not?

    Because comments should at least be acknowledged by the author, even if that’s just to say “This can be addressed in a follow-up PR”.

  68. vansergen referenced this in commit 0bf3e38d34 on Mar 26, 2020
  69. deadalnix referenced this in commit c8309573b9 on Jun 23, 2020
  70. deadalnix referenced this in commit 3264546a77 on Jun 23, 2020
  71. deadalnix referenced this in commit 4bfb19a4c3 on Jun 23, 2020
  72. DrahtBot locked this on Dec 16, 2021

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-12-18 18:12 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me