1 // Copyright (c) 2021 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_WALLET_SPEND_H
6 #define BITCOIN_WALLET_SPEND_H
7 
8 #include <wallet/coinselection.h>
9 #include <wallet/transaction.h>
10 #include <wallet/wallet.h>
11 
12 class COutput
13 {
14 public:
15     const CWalletTx *tx;
16 
17     /** Index in tx->vout. */
18     int i;
19 
20     /**
21      * Depth in block chain.
22      * If > 0: the tx is on chain and has this many confirmations.
23      * If = 0: the tx is waiting confirmation.
24      * If < 0: a conflicting tx is on chain and has this many confirmations. */
25     int nDepth;
26 
27     /** Pre-computed estimated size of this output as a fully-signed input in a transaction. Can be -1 if it could not be calculated */
28     int nInputBytes;
29 
30     /** Whether we have the private keys to spend this output */
31     bool fSpendable;
32 
33     /** Whether we know how to spend this output, ignoring the lack of keys */
34     bool fSolvable;
35 
36     /** Whether to use the maximum sized, 72 byte signature when calculating the size of the input spend. This should only be set when watch-only outputs are allowed */
37     bool use_max_sig;
38 
39     /**
40      * Whether this output is considered safe to spend. Unconfirmed transactions
41      * from outside keys and unconfirmed replacement transactions are considered
42      * unsafe and will not be used to fund new spending transactions.
43      */
44     bool fSafe;
45 
46     COutput(const CWalletTx *txIn, int iIn, int nDepthIn, bool fSpendableIn, bool fSolvableIn, bool fSafeIn, bool use_max_sig_in = false)
47     {
48         tx = txIn; i = iIn; nDepth = nDepthIn; fSpendable = fSpendableIn; fSolvable = fSolvableIn; fSafe = fSafeIn; nInputBytes = -1; use_max_sig = use_max_sig_in;
49         // If known and signable by the given wallet, compute nInputBytes
50         // Failure will keep this value -1
51         if (fSpendable && tx) {
52             nInputBytes = tx->GetSpendSize(i, use_max_sig);
53         }
54     }
55 
56     std::string ToString() const;
57 
GetInputCoin()58     inline CInputCoin GetInputCoin() const
59     {
60         return CInputCoin(tx->tx, i, nInputBytes);
61     }
62 };
63 
64 #endif // BITCOIN_WALLET_SPEND_H
65