Branch data Line data Source code
1 : : // Copyright (c) 2018-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 : : #include <wallet/coincontrol.h> 6 : : 7 : : #include <common/args.h> 8 : : 9 : : namespace wallet { 10 : 0 : CCoinControl::CCoinControl() 11 : : { 12 [ # # ][ # # ]: 0 : m_avoid_partial_spends = gArgs.GetBoolArg("-avoidpartialspends", DEFAULT_AVOIDPARTIALSPENDS); 13 : 0 : } 14 : : 15 : 0 : bool CCoinControl::HasSelected() const 16 : : { 17 : 0 : return !m_selected.empty(); 18 : : } 19 : : 20 : 0 : bool CCoinControl::IsSelected(const COutPoint& outpoint) const 21 : : { 22 : 0 : return m_selected.count(outpoint) > 0; 23 : : } 24 : : 25 : 0 : bool CCoinControl::IsExternalSelected(const COutPoint& outpoint) const 26 : : { 27 : 0 : const auto it = m_selected.find(outpoint); 28 [ # # ]: 0 : return it != m_selected.end() && it->second.HasTxOut(); 29 : : } 30 : : 31 : 0 : std::optional<CTxOut> CCoinControl::GetExternalOutput(const COutPoint& outpoint) const 32 : : { 33 : 0 : const auto it = m_selected.find(outpoint); 34 [ # # ][ # # ]: 0 : if (it == m_selected.end() || !it->second.HasTxOut()) { 35 : 0 : return std::nullopt; 36 : : } 37 : 0 : return it->second.GetTxOut(); 38 : 0 : } 39 : : 40 : 0 : PreselectedInput& CCoinControl::Select(const COutPoint& outpoint) 41 : : { 42 : 0 : auto& input = m_selected[outpoint]; 43 : 0 : input.SetPosition(m_selection_pos); 44 : 0 : ++m_selection_pos; 45 : 0 : return input; 46 : : } 47 : 0 : void CCoinControl::UnSelect(const COutPoint& outpoint) 48 : : { 49 : 0 : m_selected.erase(outpoint); 50 : 0 : } 51 : : 52 : 0 : void CCoinControl::UnSelectAll() 53 : : { 54 : 0 : m_selected.clear(); 55 : 0 : } 56 : : 57 : 0 : std::vector<COutPoint> CCoinControl::ListSelected() const 58 : : { 59 : 0 : std::vector<COutPoint> outpoints; 60 [ # # ][ # # ]: 0 : std::transform(m_selected.begin(), m_selected.end(), std::back_inserter(outpoints), 61 : 0 : [](const std::map<COutPoint, PreselectedInput>::value_type& pair) { 62 : 0 : return pair.first; 63 : : }); 64 : 0 : return outpoints; 65 [ # # ]: 0 : } 66 : : 67 : 0 : void CCoinControl::SetInputWeight(const COutPoint& outpoint, int64_t weight) 68 : : { 69 : 0 : m_selected[outpoint].SetInputWeight(weight); 70 : 0 : } 71 : : 72 : 0 : std::optional<int64_t> CCoinControl::GetInputWeight(const COutPoint& outpoint) const 73 : : { 74 : 0 : const auto it = m_selected.find(outpoint); 75 [ # # ]: 0 : return it != m_selected.end() ? it->second.GetInputWeight() : std::nullopt; 76 : : } 77 : : 78 : 0 : std::optional<uint32_t> CCoinControl::GetSequence(const COutPoint& outpoint) const 79 : : { 80 : 0 : const auto it = m_selected.find(outpoint); 81 [ # # ]: 0 : return it != m_selected.end() ? it->second.GetSequence() : std::nullopt; 82 : : } 83 : : 84 : 0 : std::pair<std::optional<CScript>, std::optional<CScriptWitness>> CCoinControl::GetScripts(const COutPoint& outpoint) const 85 : : { 86 : 0 : const auto it = m_selected.find(outpoint); 87 [ # # ]: 0 : return it != m_selected.end() ? m_selected.at(outpoint).GetScripts() : std::make_pair(std::nullopt, std::nullopt); 88 : 0 : } 89 : : 90 : 0 : void PreselectedInput::SetTxOut(const CTxOut& txout) 91 : 0 : { 92 : 0 : m_txout = txout; 93 : 0 : } 94 : : 95 : 0 : CTxOut PreselectedInput::GetTxOut() const 96 : : { 97 [ # # ]: 0 : assert(m_txout.has_value()); 98 : 0 : return m_txout.value(); 99 : : } 100 : : 101 : 0 : bool PreselectedInput::HasTxOut() const 102 : : { 103 : 0 : return m_txout.has_value(); 104 : : } 105 : 0 : 106 : 0 : void PreselectedInput::SetInputWeight(int64_t weight) 107 : 0 : { 108 : 0 : m_weight = weight; 109 : 0 : } 110 : : 111 : 0 : std::optional<int64_t> PreselectedInput::GetInputWeight() const 112 : : { 113 : 0 : return m_weight; 114 : : } 115 : : 116 : 0 : void PreselectedInput::SetSequence(uint32_t sequence) 117 : : { 118 : 0 : m_sequence = sequence; 119 : 0 : } 120 : : 121 : 0 : std::optional<uint32_t> PreselectedInput::GetSequence() const 122 : : { 123 : 0 : return m_sequence; 124 : : } 125 : : 126 : 0 : void PreselectedInput::SetScriptSig(const CScript& script) 127 : : { 128 : 0 : m_script_sig = script; 129 : 0 : } 130 : : 131 : 0 : void PreselectedInput::SetScriptWitness(const CScriptWitness& script_wit) 132 : : { 133 : 0 : m_script_witness = script_wit; 134 : 0 : } 135 : : 136 : 0 : bool PreselectedInput::HasScripts() const 137 : : { 138 [ # # ]: 0 : return m_script_sig.has_value() || m_script_witness.has_value(); 139 : : } 140 : : 141 : 0 : std::pair<std::optional<CScript>, std::optional<CScriptWitness>> PreselectedInput::GetScripts() const 142 : : { 143 : 0 : return {m_script_sig, m_script_witness}; 144 : : } 145 : : 146 : 0 : void PreselectedInput::SetPosition(unsigned int pos) 147 : : { 148 : 0 : m_pos = pos; 149 : 0 : } 150 : : 151 : 0 : std::optional<unsigned int> PreselectedInput::GetPosition() const 152 : : { 153 : 0 : return m_pos; 154 : : } 155 : : } // namespace wallet