diff options
author | Andrew Chow <achow101-github@achow101.com> | 2019-10-15 17:15:22 -0400 |
---|---|---|
committer | Andrew Chow <achow101-github@achow101.com> | 2019-12-10 21:10:48 -0500 |
commit | f1ef7f0aa46338f4cd8de79696027a1bf868f359 (patch) | |
tree | 58a4f60b2f920f544ffb39b88309507d3ee456ad /src/node | |
parent | 3d6752779f0504e6435fe682f0c06c60b5c4c33b (diff) |
Don't calculate tx fees for PSBTs with invalid money values
In decodepsbt if an invalid amount is seen, don't calculate the fee
but still show the invalid value in the decode.
In analyze psbt, if an invalid amount is seen, set the next step to
be the creator as the creator needs to remake the transaction so that
it is valid.
Diffstat (limited to 'src/node')
-rw-r--r-- | src/node/psbt.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/node/psbt.cpp b/src/node/psbt.cpp index 9a30c3f083..69fb1a28a9 100644 --- a/src/node/psbt.cpp +++ b/src/node/psbt.cpp @@ -2,6 +2,7 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include <amount.h> #include <coins.h> #include <consensus/tx_verify.h> #include <node/psbt.h> @@ -31,6 +32,10 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx) // Check for a UTXO CTxOut utxo; if (psbtx.GetInputUTXO(utxo, i)) { + if (!MoneyRange(utxo.nValue) || !MoneyRange(in_amt + utxo.nValue)) { + result.SetInvalid(strprintf("PSBT is not valid. Input %u has invalid value", i)); + return result; + } in_amt += utxo.nValue; input_analysis.has_utxo = true; } else { @@ -85,9 +90,16 @@ PSBTAnalysis AnalyzePSBT(PartiallySignedTransaction psbtx) // Get the output amount CAmount out_amt = std::accumulate(psbtx.tx->vout.begin(), psbtx.tx->vout.end(), CAmount(0), [](CAmount a, const CTxOut& b) { + if (!MoneyRange(a) || !MoneyRange(b.nValue) || !MoneyRange(a + b.nValue)) { + return CAmount(-1); + } return a += b.nValue; } ); + if (!MoneyRange(out_amt)) { + result.SetInvalid(strprintf("PSBT is not valid. Output amount invalid")); + return result; + } // Get the fee CAmount fee = in_amt - out_amt; |