wallet: allow psbtbumpfee to work with txs with external inputs #23202

pull achow101 wants to merge 7 commits into bitcoin:master from achow101:bumpfee-ext-inputs changing 10 files +225 −28
  1. achow101 commented at 2:39 AM on October 6, 2021: member

    This PR allows psbtbumpfee to return a PSBT for transactions that contain external inputs. This does not work for bumping in the GUI nor bumpfee because these need private keys available to sign and send the transaction. But psbtbumpfee returns a psbt, so it is fine to not be able to sign.

    In order to correctly estimate the size of the inputs for coin selection, the fee bumper will use the size of the inputs of the transaction being bumped. Because the sizes of signatures are not guaranteed, for external inputs, the fee bumper will verify the scripts with a special SignatureChecker which will compute the weight of all of the signatures in that input, and compute their weights if those signatures were maximally sized. This allows the fee bumper to obtain a max size estimate for each external input.

    Builds on #23201 as it relies on the ability to pass weights in to coin selection.

    Closes #23189

  2. fanquake added the label Wallet on Oct 6, 2021
  3. DrahtBot commented at 11:19 AM on October 6, 2021: contributor

    <!--e57a25ab6845829454e8d69fc972939a-->

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

    <!--174a7506f384e20aa4161008e828411d-->

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #22793 (Simplify BaseSignatureChecker virtual functions and GenericTransactionSignatureChecker constructors by achow101)

    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.

  4. achow101 force-pushed on Oct 6, 2021
  5. achow101 force-pushed on Oct 6, 2021
  6. achow101 force-pushed on Oct 6, 2021
  7. achow101 force-pushed on Oct 8, 2021
  8. achow101 force-pushed on Oct 8, 2021
  9. ghost commented at 3:41 PM on October 14, 2021: none

    Concept ACK

  10. achow101 force-pushed on Dec 8, 2021
  11. DrahtBot added the label Needs rebase on Dec 13, 2021
  12. achow101 force-pushed on Dec 14, 2021
  13. DrahtBot removed the label Needs rebase on Dec 14, 2021
  14. DrahtBot added the label Needs rebase on Jan 25, 2022
  15. achow101 marked this as ready for review on Jan 25, 2022
  16. achow101 force-pushed on Jan 25, 2022
  17. DrahtBot removed the label Needs rebase on Jan 25, 2022
  18. ghost commented at 12:55 AM on January 26, 2022: none

    Compiling this branch now as its ready for review. Not sure if I will be able to test everything but this is an interesting feature which should exist in Core. Hoping other devs review this without any club.

  19. t-bast commented at 1:15 PM on January 26, 2022: contributor

    I would really love to see this land. I can test this end-to-end with eclair whenever it's ready and verify that it lets us bump lightning transactions (I can add tests with various kinds of inputs, confirmed / unconfirmed / unsafe).

    How does it impact @Xekyo's work on ancestor aware funding (https://github.com/Xekyo/bitcoin/commits/ancestor-aware-funding)? Ideally the feerate computed here should take into account all unconfirmed ancestors, but maybe Xekyo's work would just land after this PR and fix its feerate computation?

  20. achow101 commented at 5:11 PM on January 26, 2022: member

    How does it impact @Xekyo's work on ancestor aware funding (https://github.com/Xekyo/bitcoin/commits/ancestor-aware-funding)? Ideally the feerate computed here should take into account all unconfirmed ancestors, but maybe Xekyo's work would just land after this PR and fix its feerate computation?

    I believe that work will require some mempool changes that have not been implemented yet, so it is probable that it will still be some time before that is ready for review.

  21. t-bast commented at 5:24 PM on January 26, 2022: contributor

    Thanks for the quick answer, so I guess @Xekyo's work will simply improve psbtbumpfee's feerate estimation when there are unconfirmed ancestors and can be added after this PR is merged.

  22. in src/wallet/feebumper.cpp:181 in ec8360682e outdated
     176 | +    }
     177 | +    wallet.chain().findCoins(coins);
     178 | +    for (const CTxIn& txin : wtx.tx->vin) {
     179 | +        const Coin& coin = coins.at(txin.prevout);
     180 | +        assert(!coin.out.IsNull());
     181 | +        new_coin_control.SelectExternal(txin.prevout, coin.out);
    


    ishaanam commented at 6:15 PM on July 12, 2022:

    In "bumpfee: Calculate fee by looking up UTXOs" (ec8360682e128929a2c3962e34ce5328d4983685)

    I might be misunderstanding the usage of this function, but It appears that SelectExternal() is also called for txouts that aren't external? Might be useful to have a comment about this if this is true. I don't think that this is an issue, however, because m_external_txouts is mostly used after looking for the txout in the wallet.


    achow101 commented at 10:30 PM on July 13, 2022:

    There is largely no difference, but since #24649, our pattern is to actually only use SelectExternal for external inputs, so I have changed this to do that.

  23. in src/wallet/feebumper.cpp:175 in 16891107fa outdated
     169 | +            break;
     170 | +        case SigVersion::WITNESS_V0:
     171 | +            m_sigs_weight += weight;
     172 | +            m_sigs_count++;
     173 | +            break;
     174 | +        case SigVersion::TAPROOT:
    


    ishaanam commented at 9:17 AM on July 13, 2022:

    In "bumpfee: extract weights of external inputs when bumping fee" (a95d41bdf366939e4d3ff6368c384e752d745648)

    Do we never need to do this for witness v1 outputs because these signatures are always 64 bytes so there is no need to estimate? If this is the case, would I be correct in saying that CalculateMaximumSignedInputSize() doesn't return -1 for taproot outputs in this case?


    achow101 commented at 10:30 PM on July 13, 2022:

    Yes and yes.


    murchandamus commented at 11:38 AM on July 15, 2022:

    It would have really helped me if you had explained a bit more here.


    murchandamus commented at 11:51 AM on July 15, 2022:

    Wouldn't it be possible that you're creating a replacement transaction for which you have a different spending condition that you can solve than the transaction that you are replacing? E.g. you're using a scriptpath and the original transaction was a keypath spend?


    achow101 commented at 3:51 PM on July 15, 2022:

    Wouldn't it be possible that you're creating a replacement transaction for which you have a different spending condition that you can solve than the transaction that you are replacing? E.g. you're using a scriptpath and the original transaction was a keypath spend?

    Yes, but we can't know that. Either the wallet is the one spending the input and so we are able to estimate the size using whatever the wallet will sign with, or the input is external and we only know the spending path that exists in the transaction to be bumped.

  24. ishaanam commented at 9:28 AM on July 13, 2022: contributor

    Concept ACK, I have a few questions to make sure that I'm understanding how this is being implemented correctly.

  25. achow101 commented at 10:30 PM on July 13, 2022: member

    Rebased for silent merge conflict.

  26. achow101 force-pushed on Jul 13, 2022
  27. in src/wallet/feebumper.cpp:161 in 4154dea906 outdated
     152 | @@ -152,6 +153,58 @@ bool TransactionCanBeBumped(const CWallet& wallet, const uint256& txid)
     153 |      return res == feebumper::Result::OK;
     154 |  }
     155 |  
     156 | +struct SignatureWeights
     157 | +{
     158 | +    int m_sigs_count{0};
     159 | +    int64_t m_sigs_weight{0};
     160 | +
     161 | +    void AddSigWeight(size_t weight, SigVersion sigversion)
    


    ishaanam commented at 7:46 PM on July 18, 2022:

    nit: I think that both of these parameters can be made const.


    achow101 commented at 3:46 PM on July 19, 2022:

    Done.

  28. in src/wallet/feebumper.cpp:161 in 4154dea906 outdated
     152 | @@ -152,6 +153,58 @@ bool TransactionCanBeBumped(const CWallet& wallet, const uint256& txid)
     153 |      return res == feebumper::Result::OK;
     154 |  }
     155 |  
     156 | +struct SignatureWeights
     157 | +{
     158 | +    int m_sigs_count{0};
     159 | +    int64_t m_sigs_weight{0};
    


    ishaanam commented at 7:49 PM on July 18, 2022:

    How come m_sigs_weight has a getter if it isn't private?


    achow101 commented at 3:46 PM on July 19, 2022:

    For consistency with GetMaxSigsWeight. I've made it private anyways.

  29. in src/wallet/feebumper.cpp:180 in ac575d7615 outdated
     175 | +        coins[txin.prevout]; // Create empty map entry keyed by prevout.
     176 | +    }
     177 | +    wallet.chain().findCoins(coins);
     178 | +    for (const CTxIn& txin : wtx.tx->vin) {
     179 | +        const Coin& coin = coins.at(txin.prevout);
     180 | +        assert(!coin.out.IsNull());
    


    ishaanam commented at 8:20 PM on July 18, 2022:

    In "bumpfee: Calculate fee by looking up UTXOs" (ac575d76158e96f8cfec491d15411e6dcb4738a9) Is it possible for the following to happen:

    1. When this function starts running, all of the utxos we are trying to spend here are unspent.
    2. Before wallet.chain().findCoins(coins) is run, one of these inputs gets spent, and the UTXO set gets updated accordingly.
    3. When findCoins(coins) is run, that runs FindCoins(), which iterates through the entries in coins, and if a coin is spent, then that runs Clear() for that coin, which also sets coin.out as null.
    4. This assertion fails because coin.out is null.

    achow101 commented at 3:46 PM on July 19, 2022:

    That is theoretically possible. Changed this to return an error in that case.

  30. ishaanam commented at 9:16 AM on July 19, 2022: contributor

    Approach ACK, I just have some minor questions and a nit.

  31. achow101 force-pushed on Jul 19, 2022
  32. achow101 force-pushed on Jul 22, 2022
  33. achow101 force-pushed on Jul 22, 2022
  34. in src/wallet/feebumper.cpp:177 in 66a5cb5b46 outdated
     173 | +            m_sigs_weight += weight;
     174 | +            m_sigs_count++;
     175 | +            break;
     176 | +        case SigVersion::TAPROOT:
     177 | +        case SigVersion::TAPSCRIPT:
     178 | +            assert(false);
    


    murchandamus commented at 12:12 PM on July 25, 2022:

    I think it might be good to catch all other calls to this function that are not covered by BASE or WITNESS_V0 as not being expected to be handled in this function. This will make this function future proof if other SigVersions get added in the future.

            case SigVersion::TAPSCRIPT:
            default:
                assert(false);
    

    sipa commented at 12:26 PM on July 25, 2022:

    It's actually better to not have a default: clause, as it means the compiler can warn about missing clauses, rather than needing to notice through an assertion failure.


    achow101 commented at 3:17 PM on July 25, 2022:

    Yes, the lack of a default is intentional.


    fanquake commented at 2:23 PM on August 11, 2022:

    Going to mark this as resolved.

  35. ishaanam commented at 6:06 PM on July 25, 2022: contributor

    ACK 66a5cb5b4651191bc92438cbc3f02226d250feef

  36. fanquake requested review from t-bast on Aug 11, 2022
  37. fanquake commented at 2:23 PM on August 11, 2022: member

    @instagibbs want to take a look here given #23189?

  38. t-bast approved
  39. t-bast commented at 7:04 AM on August 12, 2022: contributor

    Tested ACK https://github.com/bitcoin/bitcoin/pull/23202/commits/66a5cb5b4651191bc92438cbc3f02226d250feef, thanks @achow101!

    I integrated this with lightning to bump the fees of anchor transactions and htlc transactions and was able to bump both kinds of transactions correctly.

    There was one caveat though for the anchor transaction, that should probably be fixed in a separate PR. This is a transaction that is only used to CPFP its parent transaction, so it has a single output sending to a change address. Doing psbtbumpfee yields the following error: Unable to create transaction. Transaction must have at least one recipient (code: -4). Browsing through the code it looks like bitcoind doesn't count an output sending to a change address as a "real" output in CreateTransaction (https://github.com/bitcoin/bitcoin/blob/27724c23f72b17142f95e082e23eee26e93791f4/src/wallet/spend.cpp#L1067). I can work around this, but a follow-up PR to make this check more lenient would IMO be useful.

  40. fanquake requested review from murchandamus on Aug 12, 2022
  41. achow101 added this to the milestone 24.0 on Aug 12, 2022
  42. in src/wallet/feebumper.cpp:210 in 22106a26f8 outdated
     258 | +            int64_t input_weight = GetTransactionInputWeight(txin);
     259 | +            // Because signatures can have different sizes, we need to figure out all of the
     260 | +            // signature sizes and replace them with the max sized signature.
     261 | +            // In order to do this, we verify the script with a special SignatureChecker which
     262 | +            // will observe the signatures verified and record their sizes.
     263 | +            SignatureWeights weights;
    


    instagibbs commented at 4:54 PM on August 12, 2022:

    I think this section could stand a few unit tests, covering the major cases of usage, and maybe an odd-ball one that shows it's not constrained to things we know how to sign for.

    e.g., something with no sigs at all, HTLC script, et al


    achow101 commented at 8:53 PM on August 12, 2022:

    Added a test.

  43. in src/wallet/feebumper.cpp:268 in 22106a26f8 outdated
     263 | +            SignatureWeights weights;
     264 | +            TransactionSignatureChecker tx_checker(wtx.tx.get(), i, coin.out.nValue, txdata, MissingDataBehavior::FAIL);
     265 | +            SignatureWeightChecker size_checker(weights, tx_checker);
     266 | +            VerifyScript(txin.scriptSig, coin.out.scriptPubKey, &txin.scriptWitness, STANDARD_SCRIPT_VERIFY_FLAGS, size_checker);
     267 | +            // Add the difference between max and current to input_weight so that it represents the largest the input could be
     268 | +            input_weight += weights.GetMaxSigsWeight() - weights.GetSigsWeight();
    


    instagibbs commented at 4:55 PM on August 12, 2022:

    If we're always using it this way, perhaps just have a function return this difference explicitly


    achow101 commented at 8:53 PM on August 12, 2022:

    Done.

  44. in src/wallet/rpc/spend.cpp:1048 in 8fee03c6aa outdated
    1044 | @@ -1045,7 +1045,7 @@ static RPCHelpMan bumpfee_helper(std::string method_name)
    1045 |      CMutableTransaction mtx;
    1046 |      feebumper::Result res;
    1047 |      // Targeting feerate bump.
    1048 | -    res = feebumper::CreateRateBumpTransaction(*pwallet, hash, coin_control, errors, old_fee, new_fee, mtx);
    1049 | +    res = feebumper::CreateRateBumpTransaction(*pwallet, hash, coin_control, errors, old_fee, new_fee, mtx, !want_psbt);
    


    instagibbs commented at 4:56 PM on August 12, 2022:

    please add /* require_mine= */ here as well since variable isn't clear


    achow101 commented at 8:53 PM on August 12, 2022:

    done

  45. in src/wallet/interfaces.cpp:294 in 8fee03c6aa outdated
     288 | @@ -289,7 +289,7 @@ class WalletImpl : public Wallet
     289 |          CAmount& new_fee,
     290 |          CMutableTransaction& mtx) override
     291 |      {
     292 | -        return feebumper::CreateRateBumpTransaction(*m_wallet.get(), txid, coin_control, errors, old_fee, new_fee, mtx) == feebumper::Result::OK;
     293 | +        return feebumper::CreateRateBumpTransaction(*m_wallet.get(), txid, coin_control, errors, old_fee, new_fee, mtx, /* require_mine= */ true) == feebumper::Result::OK;
    


    instagibbs commented at 5:01 PM on August 12, 2022:

    Might want some motivation somewhere(header declaration?) when require_mine can be false or true.


    achow101 commented at 8:54 PM on August 12, 2022:

    added docs

  46. achow101 force-pushed on Aug 12, 2022
  47. achow101 commented at 9:26 PM on August 16, 2022: member
  48. t-bast commented at 8:49 AM on August 17, 2022: contributor

    There seems to be an issue when I provide the fee_rate parameter, I'm getting the following (seemingly unrelated) error:

    bitcoind: wallet/wallet.cpp:1540: bool wallet::FillInputToWeight(CTxIn&, int64_t): Assertion `txin.scriptWitness.IsNull()' failed.
    

    I was calling psbtbumpfee on the following regtest tx:

    02000000000102b72c3d62593110e0e340e15363b9d12dbe79af9fb9aa2087ba306436d5a51bca0200000000010000003182d6341b973d2f83b9b07a2075a6501e9753831df26427cbe0de6c601b43000100000000fdffffff02bb08000000000000220020352a6494d2541ba95998c1f2881bce71cb4fe420ebda7cba45f66d88222e4ba02858eb0200000000225120996aa742c86fe13934f855a461a3ac23acfca489369a3b80c8829ba5d122cbc005004730440220309709721d51a931c9984ae02c4f6cefc72d947a61b4d46d39f891f0ff24f92402202fd39201ccfa4e201e5f4c6a72fcb248ac985b21946dc07c2d1ccff3f30e45ed83473044022022fe0c3dd42c641e9cd4756360165597333ef24b1aebbe6f1a7f66e7e2288403022040cffadb335097ab36036d18ee18178520bc92b8bac894c430961242fe3e82880120fa64d24aac82ae7f180cd3fb75391a1be94913130d514b75d3d2001018f14f968d76a91458ea2a44f040121f04384be65d29024be6be21a18763ac672102a1af0b6995a260ad47f9438ae5525701c8bdafd3792b8418376384466f1e55777c8201208763a914a451fab97f394a6bb0e74f22992c227e28e62b2f88527c2103faf880218ed6f87580e99a4760857726a74adf878be803567f7babea4166c0a052ae6775022701b175ac6851b2756801401f5c05b6fc4a49e8b5bf4557753e9d861b62b3509bf82c497698328b519bd1f29360b89c095e22b4e1276d8801fe515ed15f46edd8ab74416b241fefef33927d00000000
    

    Its second input is a wallet input and the second output is the change output, and the amount should allow bumping to the feerate I'm expecting.

  49. achow101 force-pushed on Aug 17, 2022
  50. achow101 commented at 3:38 PM on August 17, 2022: member

    There seems to be an issue when I provide the fee_rate parameter, I'm getting the following (seemingly unrelated) error:

    Good catch. I've added a fix for that and a test case.

  51. in src/wallet/feebumper.cpp:245 in e6899a0170 outdated
     241 | @@ -242,7 +242,13 @@ Result CreateRateBumpTransaction(CWallet& wallet, const uint256& txid, const CCo
     242 |      if (coin_control.m_feerate) {
     243 |          // The user provided a feeRate argument.
     244 |          // We calculate this here to avoid compiler warning on the cs_wallet lock
     245 | -        const int64_t maxTxSize{CalculateMaximumSignedTxSize(*wtx.tx, &wallet, &new_coin_control).vsize};
     246 | +        // We need to make a temporary transaction with no inputs witnesses as the dummy signer expects them to be empty for some inputs
    


    instagibbs commented at 4:26 PM on August 17, 2022:

    which inputs?


    ishaanam commented at 4:36 PM on August 17, 2022:

    I think inputs for which we have set the weight using coin_control.SetInputWeight(), as we do with external inputs here.


    achow101 commented at 4:52 PM on August 17, 2022:

    Clarified for that it's for external inputs.

  52. achow101 force-pushed on Aug 17, 2022
  53. achow101 force-pushed on Aug 17, 2022
  54. t-bast approved
  55. t-bast commented at 7:31 AM on August 19, 2022: contributor

    ACK https://github.com/bitcoin/bitcoin/pull/23202/commits/bea4313459cb07ae8ba119321e9177d7da0a3bed, I tried to bump lightning htlc transactions and everything seems to work fine :+1:

  56. fanquake requested review from ishaanam on Aug 19, 2022
  57. fanquake removed review request from ishaanam on Aug 19, 2022
  58. fanquake requested review from instagibbs on Aug 19, 2022
  59. fanquake requested review from ishaanam on Aug 19, 2022
  60. furszy commented at 2:42 PM on August 19, 2022: member

    Needs to be rebased, b3d33efa was included in #25679.

  61. bumpfee: Calculate fee by looking up UTXOs
    Instead of calculating the fee by using what is stored in the wallet,
    calculate it by looking up the UTXOs.
    612f1e44fe
  62. bumpfee: extract weights of external inputs when bumping fee
    When bumping the fee of a transaction containing external inputs,
    determine the weights of those inputs. Because signatures can have a
    variable size, the script is executed with a special SignatureChecker
    which will compute the total weight of the signatures in the transaction
    and the weight if they were all maximum size signatures. This allows us
    to compute the maximum weight of the input for use during coin
    selection.
    a0c3afb898
  63. bumpfee: Clear scriptSigs and scriptWitnesses before calculated max size
    The max size calculation expects some inputs to have empty scriptSigs
    and witnesses, so we need to clear these before doing that calculation.
    31dd3dc9e5
  64. bumpfee: be able to bump fee of a tx with external inputs
    In some cases, notably psbtbumpfee, it is okay, and potentially desired,
    to be able to bump the fee of a transaction which contains external
    inputs.
    1bc8106d4c
  65. achow101 commented at 3:27 PM on August 19, 2022: member

    Needs to be rebased, b3d33ef was already included in #25679.

    Rebased

  66. achow101 force-pushed on Aug 19, 2022
  67. in src/wallet/test/feebumper_tests.cpp:49 in b1f8fa3702 outdated
      40 | +BOOST_AUTO_TEST_CASE(external_max_weight_test)
      41 | +{
      42 | +    CheckMaxWeightComputation("453042021f03c8957c5ce12940ee6e3333ecc3f633d9a1ac53a55b3ce0351c617fa96abe021f0dccdcce3ef45a63998be9ec748b561baf077b8e862941d0cd5ec08f5afe68012102fccfeb395f0ecd3a77e7bc31c3bc61dc987418b18e395d441057b42ca043f22c", {}, "76a914f60dcfd3392b28adc7662669603641f578eed72d88ac", 593);
      43 | +    CheckMaxWeightComputation("160014001dca1b22c599b5a56a87c78417ad2ff39552f1", {"3042021f5443c58eaf45f3e5ef46f8516f966b334a7d497cedda4edb2b9fad57c90c3b021f63a77cb56cde848e2e2dd20b487eec2f53101f634193786083f60b4d23a82301", "026cfe86116f161057deb240201d6b82ebd4f161e0200d63dc9aca65a1d6b38bb7"}, "a9147c8ab5ad7708b97ccb6b483d57aba48ee85214df87", 364);
      44 | +    CheckMaxWeightComputation("", {"3042021f0f8906f0394979d5b737134773e5b88bf036c7d63542301d600ab677ba5a59021f0e9fe07e62c113045fa1c1532e2914720e8854d189c4f5b8c88f57956b704401", "0359edba11ed1a0568094a6296a16c4d5ee4c8cfe2f5e2e6826871b5ecf8188f79"}, "00149961a78658030cc824af4c54fbf5294bec0cabdd", 272);
      45 | +    CheckMaxWeightComputation("", {"3042021f5c4c29e6b686aae5b6d0751e90208592ea96d26bc81d78b0d3871a94a21fa8021f74dc2f971e438ccece8699c8fd15704c41df219ab37b63264f2147d15c34d801", "01", "6321024cf55e52ec8af7866617dc4e7ff8433758e98799906d80e066c6f32033f685f967029000b275210214827893e2dcbe4ad6c20bd743288edad21100404eb7f52ccd6062fd0e7808f268ac"}, "002089e84892873c679b1129edea246e484fd914c2601f776d4f2f4a001eb8059703", 318);
    


    ishaanam commented at 6:06 PM on August 19, 2022:

    It would be nice to have some comments detailing what kinds of scripts are tested here, it could save people time and it would be easier to tell what there is coverage for at a glance to add more tests in the future.


    achow101 commented at 6:37 PM on August 19, 2022:

    Done

  68. in test/functional/wallet_bumpfee.py:255 in b1f8fa3702 outdated
     249 | @@ -250,8 +250,27 @@ def test_notmine_bumpfee_fails(self, rbf_node, peer_node, dest_address):
     250 |      signedtx = rbf_node.signrawtransactionwithwallet(rawtx)
     251 |      signedtx = peer_node.signrawtransactionwithwallet(signedtx["hex"])
     252 |      rbfid = rbf_node.sendrawtransaction(signedtx["hex"])
     253 | +    entry = rbf_node.getmempoolentry(rbfid)
     254 | +    old_fee = entry["fees"]["base"]
     255 | +    old_feerate = int(entry["fees"]["base"] / entry["vsize"] * Decimal(1e8))
    


    ishaanam commented at 6:10 PM on August 19, 2022:

    nit:

        old_fee = entry["fees"]["base"]
        old_feerate = int(old_fee / entry["vsize"] * Decimal(1e8))
    

    achow101 commented at 6:37 PM on August 19, 2022:

    Done

  69. ishaanam commented at 6:18 PM on August 19, 2022: contributor

    reACK b1f8fa37028e5947aa250dae8700144947e17986

  70. test, bumpfee: Check that psbtbumpfee can bump txs with external inputs ff638323d1
  71. Make DUMMY_CHECKER availble outside of script/sign.cpp 116a620ce7
  72. wallet, tests: Test bumpfee's max input weight calculation c3b099ace0
  73. achow101 force-pushed on Aug 19, 2022
  74. ishaanam commented at 7:03 PM on August 19, 2022: contributor

    reACK c3b099ace031758cafeec08c38bedbf717d6b7fe

  75. t-bast approved
  76. t-bast commented at 7:30 AM on August 22, 2022: contributor
  77. fanquake merged this on Aug 22, 2022
  78. fanquake closed this on Aug 22, 2022

  79. sidhujag referenced this in commit f8e125b2a5 on Aug 22, 2022
  80. bitcoin locked this on Aug 22, 2023

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: 2026-04-13 15:14 UTC

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