1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
crateix!;
/**
| This is the Branch and Bound Coin Selection
| algorithm designed by Murch. It searches
| for an input set that can pay for the spending
| target and does not exceed the spending
| target by more than the cost of creating
| and spending a change output. The algorithm
| uses a depth-first search on a binary
| tree. In the binary tree, each node corresponds
| to the inclusion or the omission of a
| UTXO. UTXOs are sorted by their effective
| values and the trees is explored deterministically
| per the inclusion branch first. At each
| node, the algorithm checks whether
| the selection is within the target range.
|
| While the selection has not reached
| the target range, more UTXOs are included.
| When a selection's value exceeds the
| target range, the complete subtree
| deriving from this selection can be
| omitted.
|
| At that point, the last included UTXO
| is deselected and the corresponding
| omission branch explored instead.
| The search ends after the complete tree
| has been searched or after a limited
| number of tries.
|
| The search continues to search for better
| solutions after one solution has been
| found. The best solution is chosen by
| minimizing the waste metric. The waste
| metric is defined as the cost to spend
| the current inputs at the given fee rate
| minus the long term expected cost to
| spend the inputs, plus the amount the
| selection exceeds the spending target:
|
| waste = selectionTotal - target + inputs
| × (currentFeeRate - longTermFeeRate)
|
| The algorithm uses two additional optimizations.
| A lookahead keeps track of the total
| value of the unexplored UTXOs. A subtree
| is not explored if the lookahead indicates
| that the target range cannot be reached.
| Further, it is unnecessary to test equivalent
| combinations. This allows us to skip
| testing the inclusion of UTXOs that
| match the effective value and waste
| of an omitted predecessor.
|
| The Branch and Bound algorithm is described
| in detail in Murch's Master Thesis:
| https://murch.one/wp-content/uploads/2016/11/erhardt2016coinselection.pdf
|
| -----------
| @param const
|
| std::vector<CInputCoin>& utxo_pool
| The set of UTXOs that we are choosing
| from.
|
| These UTXOs will be sorted in descending
| order by effective value and the CInputCoins'
| values are their effective values.
| ----------
| @param const
|
| CAmount& selection_target This is
| the value that we want to select. It is
| the lower bound of the range.
| ----------
| @param const
|
| CAmount& cost_of_change This is the
| cost of creating and spending a change
| output.
|
| This plus selection_target is the upper
| bound of the range.
| ----------
| @param std
|
| ::set<CInputCoin>& out_set -> This
| is an output parameter for the set of
| CInputCoins that have been selected.
| ----------
| @param CAmount
|
| & value_ret -> This is an output parameter
| for the total value of the CInputCoins
| that were selected.
|
*/
pub const TOTAL_TRIES: usize = 100000;
/**
| Select coins by Single Random Draw.
| OutputGroups are selected randomly
| from the eligible outputs until the
| target is satisfied
|
| -----------
| @param[in] utxo_pool
|
| The positive effective value OutputGroups
| eligible for selection
| ----------
| @param[in] target_value
|
| The target value to select for
|
| -----------
| @return
|
| If successful, a pair of set of outputs
| and total selected value, otherwise,
| std::nullopt
|
*/