mirror of
https://github.com/seigler/dash-docs
synced 2025-07-27 09:46:12 +00:00
194 lines
149 KiB
HTML
194 lines
149 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
<meta name="generator" content="Doxygen 1.8.14"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>Dash Core: src/policy/fees.cpp Source File</title>
|
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="jquery.js"></script>
|
|
<script type="text/javascript" src="dynsections.js"></script>
|
|
<link href="navtree.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="resize.js"></script>
|
|
<script type="text/javascript" src="navtreedata.js"></script>
|
|
<script type="text/javascript" src="navtree.js"></script>
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
$(document).ready(initResizable);
|
|
/* @license-end */</script>
|
|
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="search/searchdata.js"></script>
|
|
<script type="text/javascript" src="search/search.js"></script>
|
|
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
</head>
|
|
<body>
|
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
<div id="titlearea">
|
|
<table cellspacing="0" cellpadding="0">
|
|
<tbody>
|
|
<tr style="height: 56px;">
|
|
<td id="projectlogo"><img alt="Logo" src="bitcoin_logo_doxygen.png"/></td>
|
|
<td id="projectalign" style="padding-left: 0.5em;">
|
|
<div id="projectname">Dash Core
|
|
 <span id="projectnumber">0.12.2.1</span>
|
|
</div>
|
|
<div id="projectbrief">P2P Digital Currency</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<!-- end header part -->
|
|
<!-- Generated by Doxygen 1.8.14 -->
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|
/* @license-end */
|
|
</script>
|
|
<script type="text/javascript" src="menudata.js"></script>
|
|
<script type="text/javascript" src="menu.js"></script>
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
$(function() {
|
|
initMenu('',true,false,'search.php','Search');
|
|
$(document).ready(function() { init_search(); });
|
|
});
|
|
/* @license-end */</script>
|
|
<div id="main-nav"></div>
|
|
</div><!-- top -->
|
|
<div id="side-nav" class="ui-resizable side-nav-resizable">
|
|
<div id="nav-tree">
|
|
<div id="nav-tree-contents">
|
|
<div id="nav-sync" class="sync"></div>
|
|
</div>
|
|
</div>
|
|
<div id="splitbar" style="-moz-user-select:none;"
|
|
class="ui-resizable-handle">
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
$(document).ready(function(){initNavTree('fees_8cpp_source.html','');});
|
|
/* @license-end */
|
|
</script>
|
|
<div id="doc-content">
|
|
<!-- window showing the filter options -->
|
|
<div id="MSearchSelectWindow"
|
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
</div>
|
|
|
|
<!-- iframe showing the search results (closed by default) -->
|
|
<div id="MSearchResultsWindow">
|
|
<iframe src="javascript:void(0)" frameborder="0"
|
|
name="MSearchResults" id="MSearchResults">
|
|
</iframe>
|
|
</div>
|
|
|
|
<div class="header">
|
|
<div class="headertitle">
|
|
<div class="title">fees.cpp</div> </div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<a href="fees_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">// Copyright (c) 2009-2010 Satoshi Nakamoto</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">// Copyright (c) 2009-2015 The Bitcoin developers</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">// Distributed under the MIT software license, see the accompanying</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">// file COPYING or http://www.opensource.org/licenses/mit-license.php.</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> </div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="preprocessor">#include "<a class="code" href="fees_8h.html">policy/fees.h</a>"</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="preprocessor">#include "<a class="code" href="policy_8h.html">policy/policy.h</a>"</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> </div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="preprocessor">#include "<a class="code" href="amount_8h.html">amount.h</a>"</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#include "<a class="code" href="transaction_8h.html">primitives/transaction.h</a>"</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include "<a class="code" href="streams_8h.html">streams.h</a>"</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include "<a class="code" href="txmempool_8h.html">txmempool.h</a>"</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include "util.h"</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> </div><div class="line"><a name="l00015"></a><span class="lineno"><a class="line" href="classTxConfirmStats.html#a5a7701e1463d687cae1e86204748dc5e"> 15</a></span> <span class="keywordtype">void</span> <a class="code" href="classTxConfirmStats.html#a5a7701e1463d687cae1e86204748dc5e">TxConfirmStats::Initialize</a>(std::vector<double>& defaultBuckets,</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxConfirms, <span class="keywordtype">double</span> _decay, std::string _dataTypeString)</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> {</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  <a class="code" href="classTxConfirmStats.html#a61076f7531b27abbd85ec8bc7bc90ee2">decay</a> = _decay;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  <a class="code" href="classTxConfirmStats.html#a638b665311ffa2e6433b426fa0db6453">dataTypeString</a> = _dataTypeString;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < defaultBuckets.size(); i++) {</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  <a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.push_back(defaultBuckets[i]);</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <a class="code" href="classTxConfirmStats.html#a2f21d56ed1f23ec8d106526db25e8e6e">bucketMap</a>[defaultBuckets[i]] = i;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  }</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  <a class="code" href="classTxConfirmStats.html#ab09c024915718a928764b2a6b69f8215">confAvg</a>.resize(maxConfirms);</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  <a class="code" href="classTxConfirmStats.html#a96013d2383fb68757b4dc948a98b09fe">curBlockConf</a>.resize(maxConfirms);</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  <a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>.resize(maxConfirms);</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < maxConfirms; i++) {</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  <a class="code" href="classTxConfirmStats.html#ab09c024915718a928764b2a6b69f8215">confAvg</a>[i].resize(<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size());</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  <a class="code" href="classTxConfirmStats.html#a96013d2383fb68757b4dc948a98b09fe">curBlockConf</a>[i].resize(<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size());</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>[i].resize(<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size());</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  }</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> </div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  <a class="code" href="classTxConfirmStats.html#a80101a37c91a8953151d0c146bfbc635">oldUnconfTxs</a>.resize(<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size());</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <a class="code" href="classTxConfirmStats.html#a91ea5d52ed3df7cc92e0383fcc0bf18d">curBlockTxCt</a>.resize(<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size());</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  <a class="code" href="classTxConfirmStats.html#a6d09b27bc31a4f7ce4a8104d61546d37">txCtAvg</a>.resize(<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size());</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <a class="code" href="classTxConfirmStats.html#a294a044fae770c4977f2ba46c78cdf2a">curBlockVal</a>.resize(<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size());</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <a class="code" href="classTxConfirmStats.html#aad7cdbbb2fccfe1abf2dbfb2cc0230ce">avg</a>.resize(<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size());</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> }</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> </div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="comment">// Zero out the data for the current block</span></div><div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="classTxConfirmStats.html#a3cf61e975c43103bb2c1e5ac3f5b3cf8"> 41</a></span> <span class="keywordtype">void</span> <a class="code" href="classTxConfirmStats.html#a3cf61e975c43103bb2c1e5ac3f5b3cf8">TxConfirmStats::ClearCurrent</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nBlockHeight)</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> {</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j = 0; j < <a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size(); j++) {</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <a class="code" href="classTxConfirmStats.html#a80101a37c91a8953151d0c146bfbc635">oldUnconfTxs</a>[j] += <a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>[nBlockHeight%<a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>.size()][j];</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>[nBlockHeight%<a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>.size()][j] = 0;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < <a class="code" href="classTxConfirmStats.html#a96013d2383fb68757b4dc948a98b09fe">curBlockConf</a>.size(); i++)</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <a class="code" href="classTxConfirmStats.html#a96013d2383fb68757b4dc948a98b09fe">curBlockConf</a>[i][j] = 0;</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <a class="code" href="classTxConfirmStats.html#a91ea5d52ed3df7cc92e0383fcc0bf18d">curBlockTxCt</a>[j] = 0;</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <a class="code" href="classTxConfirmStats.html#a294a044fae770c4977f2ba46c78cdf2a">curBlockVal</a>[j] = 0;</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  }</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> }</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> </div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="classTxConfirmStats.html#a64281208674a51e15fb10a619bde2a51"> 54</a></span> <span class="keywordtype">void</span> <a class="code" href="classTxConfirmStats.html#a64281208674a51e15fb10a619bde2a51">TxConfirmStats::Record</a>(<span class="keywordtype">int</span> blocksToConfirm, <span class="keywordtype">double</span> val)</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> {</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <span class="comment">// blocksToConfirm is 1-based</span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keywordflow">if</span> (blocksToConfirm < 1)</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bucketindex = <a class="code" href="classTxConfirmStats.html#a2f21d56ed1f23ec8d106526db25e8e6e">bucketMap</a>.lower_bound(val)->second;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = blocksToConfirm; i <= <a class="code" href="classTxConfirmStats.html#a96013d2383fb68757b4dc948a98b09fe">curBlockConf</a>.size(); i++) {</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <a class="code" href="classTxConfirmStats.html#a96013d2383fb68757b4dc948a98b09fe">curBlockConf</a>[i - 1][bucketindex]++;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  }</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  <a class="code" href="classTxConfirmStats.html#a91ea5d52ed3df7cc92e0383fcc0bf18d">curBlockTxCt</a>[bucketindex]++;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <a class="code" href="classTxConfirmStats.html#a294a044fae770c4977f2ba46c78cdf2a">curBlockVal</a>[bucketindex] += val;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> }</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> </div><div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="classTxConfirmStats.html#a96211021e0e019a566a2126948861ead"> 67</a></span> <span class="keywordtype">void</span> <a class="code" href="classTxConfirmStats.html#a96211021e0e019a566a2126948861ead">TxConfirmStats::UpdateMovingAverages</a>()</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> {</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j = 0; j < <a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size(); j++) {</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < <a class="code" href="classTxConfirmStats.html#ab09c024915718a928764b2a6b69f8215">confAvg</a>.size(); i++)</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <a class="code" href="classTxConfirmStats.html#ab09c024915718a928764b2a6b69f8215">confAvg</a>[i][j] = <a class="code" href="classTxConfirmStats.html#ab09c024915718a928764b2a6b69f8215">confAvg</a>[i][j] * <a class="code" href="classTxConfirmStats.html#a61076f7531b27abbd85ec8bc7bc90ee2">decay</a> + <a class="code" href="classTxConfirmStats.html#a96013d2383fb68757b4dc948a98b09fe">curBlockConf</a>[i][j];</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <a class="code" href="classTxConfirmStats.html#aad7cdbbb2fccfe1abf2dbfb2cc0230ce">avg</a>[j] = <a class="code" href="classTxConfirmStats.html#aad7cdbbb2fccfe1abf2dbfb2cc0230ce">avg</a>[j] * <a class="code" href="classTxConfirmStats.html#a61076f7531b27abbd85ec8bc7bc90ee2">decay</a> + <a class="code" href="classTxConfirmStats.html#a294a044fae770c4977f2ba46c78cdf2a">curBlockVal</a>[j];</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <a class="code" href="classTxConfirmStats.html#a6d09b27bc31a4f7ce4a8104d61546d37">txCtAvg</a>[j] = <a class="code" href="classTxConfirmStats.html#a6d09b27bc31a4f7ce4a8104d61546d37">txCtAvg</a>[j] * <a class="code" href="classTxConfirmStats.html#a61076f7531b27abbd85ec8bc7bc90ee2">decay</a> + <a class="code" href="classTxConfirmStats.html#a91ea5d52ed3df7cc92e0383fcc0bf18d">curBlockTxCt</a>[j];</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  }</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> }</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> </div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span> <span class="comment">// returns -1 on error conditions</span></div><div class="line"><a name="l00078"></a><span class="lineno"><a class="line" href="classTxConfirmStats.html#a7ac4f70e6029ecf06e8d1528ab9c33f1"> 78</a></span> <span class="keywordtype">double</span> <a class="code" href="classTxConfirmStats.html#a7ac4f70e6029ecf06e8d1528ab9c33f1">TxConfirmStats::EstimateMedianVal</a>(<span class="keywordtype">int</span> confTarget, <span class="keywordtype">double</span> sufficientTxVal,</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keywordtype">double</span> successBreakPoint, <span class="keywordtype">bool</span> requireGreater,</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nBlockHeight)</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> {</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <span class="comment">// Counters for a bucket (or range of buckets)</span></div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="keywordtype">double</span> nConf = 0; <span class="comment">// Number of tx's confirmed within the confTarget</span></div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <span class="keywordtype">double</span> totalNum = 0; <span class="comment">// Total number of tx's that were ever confirmed</span></div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keywordtype">int</span> extraNum = 0; <span class="comment">// Number of tx's still in mempool for confTarget or longer</span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span> </div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <span class="keywordtype">int</span> maxbucketindex = <a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size() - 1;</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <span class="comment">// requireGreater means we are looking for the lowest fee/priority such that all higher</span></div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="comment">// values pass, so we start at maxbucketindex (highest fee) and look at successively</span></div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="comment">// smaller buckets until we reach failure. Otherwise, we are looking for the highest</span></div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="comment">// fee/priority such that all lower values fail, and we go in the opposite direction.</span></div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> startbucket = requireGreater ? maxbucketindex : 0;</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keywordtype">int</span> step = requireGreater ? -1 : 1;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> </div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="comment">// We'll combine buckets until we have enough samples.</span></div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="comment">// The near and far variables will define the range we've combined</span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <span class="comment">// The best variables are the last range we saw which still had a high</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="comment">// enough confirmation rate to count as success.</span></div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="comment">// The cur variables are the current range we're counting.</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> curNearBucket = startbucket;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bestNearBucket = startbucket;</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> curFarBucket = startbucket;</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bestFarBucket = startbucket;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> </div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="keywordtype">bool</span> foundAnswer = <span class="keyword">false</span>;</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bins = <a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>.size();</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span> </div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="comment">// Start counting from highest(default) or lowest fee/pri transactions</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> bucket = startbucket; bucket >= 0 && bucket <= maxbucketindex; bucket += step) {</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  curFarBucket = bucket;</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  nConf += <a class="code" href="classTxConfirmStats.html#ab09c024915718a928764b2a6b69f8215">confAvg</a>[confTarget - 1][bucket];</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  totalNum += <a class="code" href="classTxConfirmStats.html#a6d09b27bc31a4f7ce4a8104d61546d37">txCtAvg</a>[bucket];</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> confct = confTarget; confct < <a class="code" href="classTxConfirmStats.html#ab2b42aa0beab3ed825ccc8486dfc0a84">GetMaxConfirms</a>(); confct++)</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  extraNum += <a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>[(nBlockHeight - confct)%bins][bucket];</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  extraNum += <a class="code" href="classTxConfirmStats.html#a80101a37c91a8953151d0c146bfbc635">oldUnconfTxs</a>[bucket];</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="comment">// If we have enough transaction data points in this range of buckets,</span></div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="comment">// we can test for success</span></div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="comment">// (Only count the confirmed data points, so that each confirmation count</span></div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="comment">// will be looking at the same amount of data and same bucket breaks)</span></div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordflow">if</span> (totalNum >= sufficientTxVal / (1 - <a class="code" href="classTxConfirmStats.html#a61076f7531b27abbd85ec8bc7bc90ee2">decay</a>)) {</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordtype">double</span> curPct = nConf / (totalNum + extraNum);</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="comment">// Check to see if we are no longer getting confirmed at the success rate</span></div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordflow">if</span> (requireGreater && curPct < successBreakPoint)</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="keywordflow">if</span> (!requireGreater && curPct > successBreakPoint)</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> </div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="comment">// Otherwise update the cumulative stats, and the bucket variables</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <span class="comment">// and reset the counters</span></div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  foundAnswer = <span class="keyword">true</span>;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  nConf = 0;</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  totalNum = 0;</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  extraNum = 0;</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  bestNearBucket = curNearBucket;</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  bestFarBucket = curFarBucket;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  curNearBucket = bucket + step;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  }</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  }</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  }</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span> </div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <span class="keywordtype">double</span> median = -1;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="keywordtype">double</span> txSum = 0;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> </div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <span class="comment">// Calculate the "average" fee of the best bucket range that met success conditions</span></div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="comment">// Find the bucket with the median transaction and then report the average fee from that bucket</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <span class="comment">// This is a compromise between finding the median which we can't since we don't save all tx's</span></div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="comment">// and reporting the average which is less accurate</span></div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> minBucket = bestNearBucket < bestFarBucket ? bestNearBucket : bestFarBucket;</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxBucket = bestNearBucket > bestFarBucket ? bestNearBucket : bestFarBucket;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j = minBucket; j <= maxBucket; j++) {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  txSum += <a class="code" href="classTxConfirmStats.html#a6d09b27bc31a4f7ce4a8104d61546d37">txCtAvg</a>[j];</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  }</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <span class="keywordflow">if</span> (foundAnswer && txSum != 0) {</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  txSum = txSum / 2;</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j = minBucket; j <= maxBucket; j++) {</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="keywordflow">if</span> (<a class="code" href="classTxConfirmStats.html#a6d09b27bc31a4f7ce4a8104d61546d37">txCtAvg</a>[j] < txSum)</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  txSum -= <a class="code" href="classTxConfirmStats.html#a6d09b27bc31a4f7ce4a8104d61546d37">txCtAvg</a>[j];</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">else</span> { <span class="comment">// we're in the right bucket</span></div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  median = <a class="code" href="classTxConfirmStats.html#aad7cdbbb2fccfe1abf2dbfb2cc0230ce">avg</a>[j] / <a class="code" href="classTxConfirmStats.html#a6d09b27bc31a4f7ce4a8104d61546d37">txCtAvg</a>[j];</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  }</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  }</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  }</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> </div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"%3d: For conf success %s %4.2f need %s %s: %12.5g from buckets %8g - %8g Cur Bucket stats %6.2f%% %8.1f/(%.1f+%d mempool)\n"</span>,</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  confTarget, requireGreater ? <span class="stringliteral">">"</span> : <span class="stringliteral">"<"</span>, successBreakPoint, <a class="code" href="classTxConfirmStats.html#a638b665311ffa2e6433b426fa0db6453">dataTypeString</a>,</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  requireGreater ? <span class="stringliteral">">"</span> : <span class="stringliteral">"<"</span>, median, <a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>[minBucket], <a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>[maxBucket],</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  100 * nConf / (totalNum + extraNum), nConf, totalNum, extraNum);</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span> </div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keywordflow">return</span> median;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span> }</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span> </div><div class="line"><a name="l00176"></a><span class="lineno"><a class="line" href="classTxConfirmStats.html#a61caf0db4ffeb8c112375e2aedf62499"> 176</a></span> <span class="keywordtype">void</span> <a class="code" href="classTxConfirmStats.html#a61caf0db4ffeb8c112375e2aedf62499">TxConfirmStats::Write</a>(<a class="code" href="classCAutoFile.html">CAutoFile</a>& <a class="code" href="util_8cpp.html#a5256be9be45ec4d0909f14a61d455e23">fileout</a>)</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> {</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <a class="code" href="util_8cpp.html#a5256be9be45ec4d0909f14a61d455e23">fileout</a> << <a class="code" href="classTxConfirmStats.html#a61076f7531b27abbd85ec8bc7bc90ee2">decay</a>;</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <a class="code" href="util_8cpp.html#a5256be9be45ec4d0909f14a61d455e23">fileout</a> << <a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <a class="code" href="util_8cpp.html#a5256be9be45ec4d0909f14a61d455e23">fileout</a> << <a class="code" href="classTxConfirmStats.html#aad7cdbbb2fccfe1abf2dbfb2cc0230ce">avg</a>;</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <a class="code" href="util_8cpp.html#a5256be9be45ec4d0909f14a61d455e23">fileout</a> << <a class="code" href="classTxConfirmStats.html#a6d09b27bc31a4f7ce4a8104d61546d37">txCtAvg</a>;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <a class="code" href="util_8cpp.html#a5256be9be45ec4d0909f14a61d455e23">fileout</a> << <a class="code" href="classTxConfirmStats.html#ab09c024915718a928764b2a6b69f8215">confAvg</a>;</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> }</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span> </div><div class="line"><a name="l00185"></a><span class="lineno"><a class="line" href="classTxConfirmStats.html#a3cc392ef180cd7bddd0181c1a73dd741"> 185</a></span> <span class="keywordtype">void</span> <a class="code" href="classTxConfirmStats.html#a3cc392ef180cd7bddd0181c1a73dd741">TxConfirmStats::Read</a>(<a class="code" href="classCAutoFile.html">CAutoFile</a>& filein)</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> {</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="comment">// Read data file into temporary variables and do some very basic sanity checking</span></div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  std::vector<double> fileBuckets;</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  std::vector<double> fileAvg;</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  std::vector<std::vector<double> > fileConfAvg;</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  std::vector<double> fileTxCtAvg;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="keywordtype">double</span> fileDecay;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordtype">size_t</span> maxConfirms;</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="keywordtype">size_t</span> numBuckets;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  filein >> fileDecay;</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="keywordflow">if</span> (fileDecay <= 0 || fileDecay >= 1)</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Corrupt estimates file. Decay must be between 0 and 1 (non-inclusive)"</span>);</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  filein >> fileBuckets;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  numBuckets = fileBuckets.size();</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <span class="keywordflow">if</span> (numBuckets <= 1 || numBuckets > 1000)</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Corrupt estimates file. Must have between 2 and 1000 fee/pri buckets"</span>);</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  filein >> fileAvg;</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <span class="keywordflow">if</span> (fileAvg.size() != numBuckets)</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Corrupt estimates file. Mismatch in fee/pri average bucket count"</span>);</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  filein >> fileTxCtAvg;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keywordflow">if</span> (fileTxCtAvg.size() != numBuckets)</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Corrupt estimates file. Mismatch in tx count bucket count"</span>);</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  filein >> fileConfAvg;</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  maxConfirms = fileConfAvg.size();</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keywordflow">if</span> (maxConfirms <= 0 || maxConfirms > 6 * 24 * 7) <span class="comment">// one week</span></div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Corrupt estimates file. Must maintain estimates for between 1 and 1008 (one week) confirms"</span>);</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < maxConfirms; i++) {</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="keywordflow">if</span> (fileConfAvg[i].size() != numBuckets)</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <span class="keywordflow">throw</span> std::runtime_error(<span class="stringliteral">"Corrupt estimates file. Mismatch in fee/pri conf average bucket count"</span>);</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  }</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="comment">// Now that we've processed the entire fee estimate data file and not</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="comment">// thrown any errors, we can copy it to our data structures</span></div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <a class="code" href="classTxConfirmStats.html#a61076f7531b27abbd85ec8bc7bc90ee2">decay</a> = fileDecay;</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a> = fileBuckets;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <a class="code" href="classTxConfirmStats.html#aad7cdbbb2fccfe1abf2dbfb2cc0230ce">avg</a> = fileAvg;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <a class="code" href="classTxConfirmStats.html#ab09c024915718a928764b2a6b69f8215">confAvg</a> = fileConfAvg;</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <a class="code" href="classTxConfirmStats.html#a6d09b27bc31a4f7ce4a8104d61546d37">txCtAvg</a> = fileTxCtAvg;</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <a class="code" href="classTxConfirmStats.html#a2f21d56ed1f23ec8d106526db25e8e6e">bucketMap</a>.clear();</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span> </div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="comment">// Resize the current block variables which aren't stored in the data file</span></div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  <span class="comment">// to match the number of confirms and buckets</span></div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <a class="code" href="classTxConfirmStats.html#a96013d2383fb68757b4dc948a98b09fe">curBlockConf</a>.resize(maxConfirms);</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < maxConfirms; i++) {</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <a class="code" href="classTxConfirmStats.html#a96013d2383fb68757b4dc948a98b09fe">curBlockConf</a>[i].resize(<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size());</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  }</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <a class="code" href="classTxConfirmStats.html#a91ea5d52ed3df7cc92e0383fcc0bf18d">curBlockTxCt</a>.resize(<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size());</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <a class="code" href="classTxConfirmStats.html#a294a044fae770c4977f2ba46c78cdf2a">curBlockVal</a>.resize(<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size());</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span> </div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>.resize(maxConfirms);</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < maxConfirms; i++) {</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>[i].resize(<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size());</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  }</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <a class="code" href="classTxConfirmStats.html#a80101a37c91a8953151d0c146bfbc635">oldUnconfTxs</a>.resize(<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size());</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span> </div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < <a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>.size(); i++)</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <a class="code" href="classTxConfirmStats.html#a2f21d56ed1f23ec8d106526db25e8e6e">bucketMap</a>[<a class="code" href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">buckets</a>[i]] = i;</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span> </div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"Reading estimates: %u %s buckets counting confirms up to %u blocks\n"</span>,</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  numBuckets, <a class="code" href="classTxConfirmStats.html#a638b665311ffa2e6433b426fa0db6453">dataTypeString</a>, maxConfirms);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span> }</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span> </div><div class="line"><a name="l00248"></a><span class="lineno"><a class="line" href="classTxConfirmStats.html#ae0b014c40cdf3c2207f2677774000261"> 248</a></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classTxConfirmStats.html#ae0b014c40cdf3c2207f2677774000261">TxConfirmStats::NewTx</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nBlockHeight, <span class="keywordtype">double</span> val)</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> {</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bucketindex = <a class="code" href="classTxConfirmStats.html#a2f21d56ed1f23ec8d106526db25e8e6e">bucketMap</a>.lower_bound(val)->second;</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockIndex = nBlockHeight % <a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>.size();</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>[blockIndex][bucketindex]++;</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"adding to %s"</span>, <a class="code" href="classTxConfirmStats.html#a638b665311ffa2e6433b426fa0db6453">dataTypeString</a>);</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  <span class="keywordflow">return</span> bucketindex;</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span> }</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span> </div><div class="line"><a name="l00257"></a><span class="lineno"><a class="line" href="classTxConfirmStats.html#a421aa07c38b5f51dae2f2bdd725ba169"> 257</a></span> <span class="keywordtype">void</span> <a class="code" href="classTxConfirmStats.html#a421aa07c38b5f51dae2f2bdd725ba169">TxConfirmStats::removeTx</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> entryHeight, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nBestSeenHeight, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bucketindex)</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span> {</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="comment">//nBestSeenHeight is not updated yet for the new block</span></div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keywordtype">int</span> blocksAgo = nBestSeenHeight - entryHeight;</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordflow">if</span> (nBestSeenHeight == 0) <span class="comment">// the BlockPolicyEstimator hasn't seen any blocks yet</span></div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  blocksAgo = 0;</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">if</span> (blocksAgo < 0) {</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"Blockpolicy error, blocks ago is negative for mempool tx\n"</span>);</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">return</span>; <span class="comment">//This can't happen because we call this with our best seen height, no entries can have higher</span></div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  }</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span> </div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  <span class="keywordflow">if</span> (blocksAgo >= (<span class="keywordtype">int</span>)<a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>.size()) {</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="keywordflow">if</span> (<a class="code" href="classTxConfirmStats.html#a80101a37c91a8953151d0c146bfbc635">oldUnconfTxs</a>[bucketindex] > 0)</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <a class="code" href="classTxConfirmStats.html#a80101a37c91a8953151d0c146bfbc635">oldUnconfTxs</a>[bucketindex]--;</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"Blockpolicy error, mempool tx removed from >25 blocks,bucketIndex=%u already\n"</span>,</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  bucketindex);</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  }</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockIndex = entryHeight % <a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>.size();</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keywordflow">if</span> (<a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>[blockIndex][bucketindex] > 0)</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <a class="code" href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">unconfTxs</a>[blockIndex][bucketindex]--;</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"Blockpolicy error, mempool tx removed from blockIndex=%u,bucketIndex=%u already\n"</span>,</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  blockIndex, bucketindex);</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  }</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> }</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span> </div><div class="line"><a name="l00285"></a><span class="lineno"><a class="line" href="classCBlockPolicyEstimator.html#a52cc7162762f37f5a246dc7a16838aa9"> 285</a></span> <span class="keywordtype">void</span> <a class="code" href="classCBlockPolicyEstimator.html#a52cc7162762f37f5a246dc7a16838aa9">CBlockPolicyEstimator::removeTx</a>(<a class="code" href="classuint256.html">uint256</a> hash)</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span> {</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  std::map<uint256, TxStatsInfo>::iterator pos = <a class="code" href="classCBlockPolicyEstimator.html#ae3af28a53439328591107672c9ad84b1">mapMemPoolTxs</a>.find(hash);</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="keywordflow">if</span> (pos == <a class="code" href="classCBlockPolicyEstimator.html#ae3af28a53439328591107672c9ad84b1">mapMemPoolTxs</a>.end()) {</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"Blockpolicy error mempool tx %s not found for removeTx\n"</span>, hash.<a class="code" href="classbase__blob.html#a7a0d25782830d8b087c4da839f3ccdeb">ToString</a>());</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  }</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <a class="code" href="classTxConfirmStats.html">TxConfirmStats</a> *stats = pos->second.stats;</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> entryHeight = pos->second.blockHeight;</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bucketIndex = pos->second.bucketIndex;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> </div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="keywordflow">if</span> (stats != NULL)</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  stats-><a class="code" href="classTxConfirmStats.html#a421aa07c38b5f51dae2f2bdd725ba169">removeTx</a>(entryHeight, <a class="code" href="classCBlockPolicyEstimator.html#a208f2b05a4ca303a1814f88f0cfb3b5b">nBestSeenHeight</a>, bucketIndex);</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <a class="code" href="classCBlockPolicyEstimator.html#ae3af28a53439328591107672c9ad84b1">mapMemPoolTxs</a>.erase(hash);</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span> }</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span> </div><div class="line"><a name="l00301"></a><span class="lineno"><a class="line" href="classCBlockPolicyEstimator.html#a63578e09e192cb16bdd28ccf49e85c06"> 301</a></span> <a class="code" href="classCBlockPolicyEstimator.html#a63578e09e192cb16bdd28ccf49e85c06">CBlockPolicyEstimator::CBlockPolicyEstimator</a>(<span class="keyword">const</span> <a class="code" href="classCFeeRate.html">CFeeRate</a>& _minRelayFee)</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  : nBestSeenHeight(0)</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span> {</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <a class="code" href="classCBlockPolicyEstimator.html#a9855a86bd39817acc9de71a574e582c2">minTrackedFee</a> = _minRelayFee < <a class="code" href="classCFeeRate.html">CFeeRate</a>(<a class="code" href="fees_8h.html#a74c407fd21a313b4919509d11d539363">MIN_FEERATE</a>) ? <a class="code" href="classCFeeRate.html">CFeeRate</a>(<a class="code" href="fees_8h.html#a74c407fd21a313b4919509d11d539363">MIN_FEERATE</a>) : _minRelayFee;</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  std::vector<double> vfeelist;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="keywordflow">for</span> (<span class="keywordtype">double</span> bucketBoundary = <a class="code" href="classCBlockPolicyEstimator.html#a9855a86bd39817acc9de71a574e582c2">minTrackedFee</a>.<a class="code" href="classCFeeRate.html#ac772be79983433d442d6b871d2fb6e11">GetFeePerK</a>(); bucketBoundary <= <a class="code" href="fees_8h.html#a1ae313c1efaf2d8962f06debeeabdb59">MAX_FEERATE</a>; bucketBoundary *= <a class="code" href="fees_8h.html#a7d6fd36ed44ed4800fa0fa9b0187643d">FEE_SPACING</a>) {</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  vfeelist.push_back(bucketBoundary);</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  }</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  vfeelist.push_back(<a class="code" href="fees_8h.html#ae1c236d0bc9983de7c249b19628afdcd">INF_FEERATE</a>);</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#a5a7701e1463d687cae1e86204748dc5e">Initialize</a>(vfeelist, <a class="code" href="fees_8h.html#a497b52dfe8ede3ddd28904d20172c030">MAX_BLOCK_CONFIRMS</a>, <a class="code" href="fees_8h.html#a7a2a101d1795850360f79d9e4d8cbbf4">DEFAULT_DECAY</a>, <span class="stringliteral">"FeeRate"</span>);</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span> </div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  <a class="code" href="classCBlockPolicyEstimator.html#a4f27bd09eadcb493cb5e31e36fa4bd02">minTrackedPriority</a> = <a class="code" href="txmempool_8h.html#a51bd4734f99121bdc24323fd5aebacc3">AllowFreeThreshold</a>() < <a class="code" href="fees_8h.html#a15a03efa27a6ae8c890c348eebb35b0a">MIN_PRIORITY</a> ? <a class="code" href="fees_8h.html#a15a03efa27a6ae8c890c348eebb35b0a">MIN_PRIORITY</a> : <a class="code" href="txmempool_8h.html#a51bd4734f99121bdc24323fd5aebacc3">AllowFreeThreshold</a>();</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  std::vector<double> vprilist;</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keywordflow">for</span> (<span class="keywordtype">double</span> bucketBoundary = <a class="code" href="classCBlockPolicyEstimator.html#a4f27bd09eadcb493cb5e31e36fa4bd02">minTrackedPriority</a>; bucketBoundary <= <a class="code" href="fees_8h.html#a33e270a0a5aaa6276fd86057feb434a7">MAX_PRIORITY</a>; bucketBoundary *= <a class="code" href="fees_8h.html#a180ab8694b65d509effa3f22040cce90">PRI_SPACING</a>) {</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  vprilist.push_back(bucketBoundary);</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  }</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  vprilist.push_back(<a class="code" href="fees_8h.html#a7a1452c0779d913728b2567683a6377a">INF_PRIORITY</a>);</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#a5a7701e1463d687cae1e86204748dc5e">Initialize</a>(vprilist, <a class="code" href="fees_8h.html#a497b52dfe8ede3ddd28904d20172c030">MAX_BLOCK_CONFIRMS</a>, <a class="code" href="fees_8h.html#a7a2a101d1795850360f79d9e4d8cbbf4">DEFAULT_DECAY</a>, <span class="stringliteral">"Priority"</span>);</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span> </div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <a class="code" href="classCBlockPolicyEstimator.html#aaefa1c1be20e8051d1fc6ec3543c2ffd">feeUnlikely</a> = <a class="code" href="classCFeeRate.html">CFeeRate</a>(0);</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <a class="code" href="classCBlockPolicyEstimator.html#a883dff595684fb967def434ea626a3b0">feeLikely</a> = <a class="code" href="classCFeeRate.html">CFeeRate</a>(<a class="code" href="fees_8h.html#ae1c236d0bc9983de7c249b19628afdcd">INF_FEERATE</a>);</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <a class="code" href="classCBlockPolicyEstimator.html#af4d05ddd6a9ba94fd1713f8556267a24">priUnlikely</a> = 0;</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <a class="code" href="classCBlockPolicyEstimator.html#a95d99a8ef792305efa3580a1beffad3d">priLikely</a> = <a class="code" href="fees_8h.html#a7a1452c0779d913728b2567683a6377a">INF_PRIORITY</a>;</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span> }</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span> </div><div class="line"><a name="l00326"></a><span class="lineno"><a class="line" href="classCBlockPolicyEstimator.html#ae5210aa92ae419c28dd18d853732c166"> 326</a></span> <span class="keywordtype">bool</span> <a class="code" href="classCBlockPolicyEstimator.html#ae5210aa92ae419c28dd18d853732c166">CBlockPolicyEstimator::isFeeDataPoint</a>(<span class="keyword">const</span> <a class="code" href="classCFeeRate.html">CFeeRate</a> &fee, <span class="keywordtype">double</span> pri)</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span> {</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="keywordflow">if</span> ((pri < minTrackedPriority && fee >= <a class="code" href="classCBlockPolicyEstimator.html#a9855a86bd39817acc9de71a574e582c2">minTrackedFee</a>) ||</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  (pri < priUnlikely && fee > <a class="code" href="classCBlockPolicyEstimator.html#a883dff595684fb967def434ea626a3b0">feeLikely</a>)) {</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  }</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span> }</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span> </div><div class="line"><a name="l00335"></a><span class="lineno"><a class="line" href="classCBlockPolicyEstimator.html#a9ac58339877c62a144679caa349c414a"> 335</a></span> <span class="keywordtype">bool</span> <a class="code" href="classCBlockPolicyEstimator.html#a9ac58339877c62a144679caa349c414a">CBlockPolicyEstimator::isPriDataPoint</a>(<span class="keyword">const</span> <a class="code" href="classCFeeRate.html">CFeeRate</a> &fee, <span class="keywordtype">double</span> pri)</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span> {</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="keywordflow">if</span> ((fee < minTrackedFee && pri >= <a class="code" href="classCBlockPolicyEstimator.html#a4f27bd09eadcb493cb5e31e36fa4bd02">minTrackedPriority</a>) ||</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  (fee < feeUnlikely && pri > <a class="code" href="classCBlockPolicyEstimator.html#a95d99a8ef792305efa3580a1beffad3d">priLikely</a>)) {</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  }</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span> }</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span> </div><div class="line"><a name="l00344"></a><span class="lineno"><a class="line" href="classCBlockPolicyEstimator.html#ab2a8e9135f06f38dc51031125e803a6b"> 344</a></span> <span class="keywordtype">void</span> <a class="code" href="classCBlockPolicyEstimator.html#ab2a8e9135f06f38dc51031125e803a6b">CBlockPolicyEstimator::processTransaction</a>(<span class="keyword">const</span> <a class="code" href="classCTxMemPoolEntry.html">CTxMemPoolEntry</a>& entry, <span class="keywordtype">bool</span> fCurrentEstimate)</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span> {</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> txHeight = entry.<a class="code" href="classCTxMemPoolEntry.html#a319f8093929fc5b6c3c66ba53ac172b5">GetHeight</a>();</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <a class="code" href="classuint256.html">uint256</a> hash = entry.<a class="code" href="classCTxMemPoolEntry.html#a2deed4202061edf8b040a3f554417c20">GetTx</a>().<a class="code" href="classCTransaction.html#a7efd1379de830341417c0bfa23a149aa">GetHash</a>();</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <span class="keywordflow">if</span> (<a class="code" href="classCBlockPolicyEstimator.html#ae3af28a53439328591107672c9ad84b1">mapMemPoolTxs</a>[hash].stats != NULL) {</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"Blockpolicy error mempool tx %s already being tracked\n"</span>, hash.<a class="code" href="classbase__blob.html#a7a0d25782830d8b087c4da839f3ccdeb">ToString</a>());</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  }</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span> </div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="keywordflow">if</span> (txHeight < <a class="code" href="classCBlockPolicyEstimator.html#a208f2b05a4ca303a1814f88f0cfb3b5b">nBestSeenHeight</a>) {</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  <span class="comment">// Ignore side chains and re-orgs; assuming they are random they don't</span></div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <span class="comment">// affect the estimate. We'll potentially double count transactions in 1-block reorgs.</span></div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  }</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> </div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  <span class="comment">// Only want to be updating estimates when our blockchain is synced,</span></div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  <span class="comment">// otherwise we'll miscalculate how many blocks its taking to get included.</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="keywordflow">if</span> (!fCurrentEstimate)</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> </div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <span class="keywordflow">if</span> (!entry.<a class="code" href="classCTxMemPoolEntry.html#a1be87eeaf1d502868d2b7a44ed8ba1d1">WasClearAtEntry</a>()) {</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  <span class="comment">// This transaction depends on other transactions in the mempool to</span></div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="comment">// be included in a block before it will be able to be included, so</span></div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="comment">// we shouldn't include it in our calculations</span></div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  }</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span> </div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <span class="comment">// Fees are stored and reported as BTC-per-kb:</span></div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  <a class="code" href="classCFeeRate.html">CFeeRate</a> feeRate(entry.<a class="code" href="classCTxMemPoolEntry.html#adf67bc503adf4ce7ff8d98769e56fecb">GetFee</a>(), entry.<a class="code" href="classCTxMemPoolEntry.html#a89325fcaa8efbd1d6fe68c39d7d676b0">GetTxSize</a>());</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> </div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <span class="comment">// Want the priority of the tx at confirmation. However we don't know</span></div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="comment">// what that will be and its too hard to continue updating it</span></div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="comment">// so use starting priority as a proxy</span></div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  <span class="keywordtype">double</span> curPri = entry.<a class="code" href="classCTxMemPoolEntry.html#a189d5dbafa6e955524692c0743dc0e0b">GetPriority</a>(txHeight);</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <a class="code" href="classCBlockPolicyEstimator.html#ae3af28a53439328591107672c9ad84b1">mapMemPoolTxs</a>[hash].blockHeight = txHeight;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span> </div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"Blockpolicy mempool tx %s "</span>, hash.<a class="code" href="classbase__blob.html#a7a0d25782830d8b087c4da839f3ccdeb">ToString</a>().substr(0,10));</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  <span class="comment">// Record this as a priority estimate</span></div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <span class="keywordflow">if</span> (entry.<a class="code" href="classCTxMemPoolEntry.html#adf67bc503adf4ce7ff8d98769e56fecb">GetFee</a>() == 0 || <a class="code" href="classCBlockPolicyEstimator.html#a9ac58339877c62a144679caa349c414a">isPriDataPoint</a>(feeRate, curPri)) {</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <a class="code" href="classCBlockPolicyEstimator.html#ae3af28a53439328591107672c9ad84b1">mapMemPoolTxs</a>[hash].stats = &<a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>;</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <a class="code" href="classCBlockPolicyEstimator.html#ae3af28a53439328591107672c9ad84b1">mapMemPoolTxs</a>[hash].bucketIndex = <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#ae0b014c40cdf3c2207f2677774000261">NewTx</a>(txHeight, curPri);</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  }</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="comment">// Record this as a fee estimate</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classCBlockPolicyEstimator.html#ae5210aa92ae419c28dd18d853732c166">isFeeDataPoint</a>(feeRate, curPri)) {</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <a class="code" href="classCBlockPolicyEstimator.html#ae3af28a53439328591107672c9ad84b1">mapMemPoolTxs</a>[hash].stats = &<a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>;</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <a class="code" href="classCBlockPolicyEstimator.html#ae3af28a53439328591107672c9ad84b1">mapMemPoolTxs</a>[hash].bucketIndex = <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#ae0b014c40cdf3c2207f2677774000261">NewTx</a>(txHeight, (<span class="keywordtype">double</span>)feeRate.GetFeePerK());</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  }</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordflow">else</span> {</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"not adding"</span>);</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  }</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span> }</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span> </div><div class="line"><a name="l00397"></a><span class="lineno"><a class="line" href="classCBlockPolicyEstimator.html#a743b4afec36ec5ac64d2ff63c7f61aae"> 397</a></span> <span class="keywordtype">void</span> <a class="code" href="classCBlockPolicyEstimator.html#a743b4afec36ec5ac64d2ff63c7f61aae">CBlockPolicyEstimator::processBlockTx</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nBlockHeight, <span class="keyword">const</span> <a class="code" href="classCTxMemPoolEntry.html">CTxMemPoolEntry</a>& entry)</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span> {</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="keywordflow">if</span> (!entry.<a class="code" href="classCTxMemPoolEntry.html#a1be87eeaf1d502868d2b7a44ed8ba1d1">WasClearAtEntry</a>()) {</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="comment">// This transaction depended on other transactions in the mempool to</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="comment">// be included in a block before it was able to be included, so</span></div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  <span class="comment">// we shouldn't include it in our calculations</span></div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  }</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span> </div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <span class="comment">// How many blocks did it take for miners to include this transaction?</span></div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  <span class="comment">// blocksToConfirm is 1-based, so a transaction included in the earliest</span></div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="comment">// possible block has confirmation count of 1</span></div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <span class="keywordtype">int</span> blocksToConfirm = nBlockHeight - entry.<a class="code" href="classCTxMemPoolEntry.html#a319f8093929fc5b6c3c66ba53ac172b5">GetHeight</a>();</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="keywordflow">if</span> (blocksToConfirm <= 0) {</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <span class="comment">// This can't happen because we don't process transactions from a block with a height</span></div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="comment">// lower than our greatest seen height</span></div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"Blockpolicy error Transaction had negative blocksToConfirm\n"</span>);</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  }</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span> </div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="comment">// Fees are stored and reported as BTC-per-kb:</span></div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <a class="code" href="classCFeeRate.html">CFeeRate</a> feeRate(entry.<a class="code" href="classCTxMemPoolEntry.html#adf67bc503adf4ce7ff8d98769e56fecb">GetFee</a>(), entry.<a class="code" href="classCTxMemPoolEntry.html#a89325fcaa8efbd1d6fe68c39d7d676b0">GetTxSize</a>());</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span> </div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="comment">// Want the priority of the tx at confirmation. The priority when it</span></div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <span class="comment">// entered the mempool could easily be very small and change quickly</span></div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="keywordtype">double</span> curPri = entry.<a class="code" href="classCTxMemPoolEntry.html#a189d5dbafa6e955524692c0743dc0e0b">GetPriority</a>(nBlockHeight);</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span> </div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <span class="comment">// Record this as a priority estimate</span></div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="keywordflow">if</span> (entry.<a class="code" href="classCTxMemPoolEntry.html#adf67bc503adf4ce7ff8d98769e56fecb">GetFee</a>() == 0 || <a class="code" href="classCBlockPolicyEstimator.html#a9ac58339877c62a144679caa349c414a">isPriDataPoint</a>(feeRate, curPri)) {</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#a64281208674a51e15fb10a619bde2a51">Record</a>(blocksToConfirm, curPri);</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  }</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="comment">// Record this as a fee estimate</span></div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classCBlockPolicyEstimator.html#ae5210aa92ae419c28dd18d853732c166">isFeeDataPoint</a>(feeRate, curPri)) {</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#a64281208674a51e15fb10a619bde2a51">Record</a>(blocksToConfirm, (<span class="keywordtype">double</span>)feeRate.GetFeePerK());</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  }</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span> }</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span> </div><div class="line"><a name="l00434"></a><span class="lineno"><a class="line" href="classCBlockPolicyEstimator.html#a4dbf4773f292c71c51cd17b7eb67dad0"> 434</a></span> <span class="keywordtype">void</span> <a class="code" href="classCBlockPolicyEstimator.html#a4dbf4773f292c71c51cd17b7eb67dad0">CBlockPolicyEstimator::processBlock</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nBlockHeight,</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  std::vector<CTxMemPoolEntry>& entries, <span class="keywordtype">bool</span> fCurrentEstimate)</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span> {</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <span class="keywordflow">if</span> (nBlockHeight <= <a class="code" href="classCBlockPolicyEstimator.html#a208f2b05a4ca303a1814f88f0cfb3b5b">nBestSeenHeight</a>) {</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  <span class="comment">// Ignore side chains and re-orgs; assuming they are random</span></div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="comment">// they don't affect the estimate.</span></div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  <span class="comment">// And if an attacker can re-org the chain at will, then</span></div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  <span class="comment">// you've got much bigger problems than "attacker can influence</span></div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="comment">// transaction fees."</span></div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  }</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  <a class="code" href="classCBlockPolicyEstimator.html#a208f2b05a4ca303a1814f88f0cfb3b5b">nBestSeenHeight</a> = nBlockHeight;</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span> </div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <span class="comment">// Only want to be updating estimates when our blockchain is synced,</span></div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <span class="comment">// otherwise we'll miscalculate how many blocks its taking to get included.</span></div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <span class="keywordflow">if</span> (!fCurrentEstimate)</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span> </div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  <span class="comment">// Update the dynamic cutoffs</span></div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="comment">// a fee/priority is "likely" the reason your tx was included in a block if >85% of such tx's</span></div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <span class="comment">// were confirmed in 2 blocks and is "unlikely" if <50% were confirmed in 10 blocks</span></div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"Blockpolicy recalculating dynamic cutoffs:\n"</span>);</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <a class="code" href="classCBlockPolicyEstimator.html#a95d99a8ef792305efa3580a1beffad3d">priLikely</a> = <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#a7ac4f70e6029ecf06e8d1528ab9c33f1">EstimateMedianVal</a>(2, <a class="code" href="fees_8h.html#abc4715f1148cb76a46594dee4cb34f93">SUFFICIENT_PRITXS</a>, <a class="code" href="fees_8h.html#aaf24bb74c1a77742398494fe80e76713">MIN_SUCCESS_PCT</a>, <span class="keyword">true</span>, nBlockHeight);</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="keywordflow">if</span> (<a class="code" href="classCBlockPolicyEstimator.html#a95d99a8ef792305efa3580a1beffad3d">priLikely</a> == -1)</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <a class="code" href="classCBlockPolicyEstimator.html#a95d99a8ef792305efa3580a1beffad3d">priLikely</a> = <a class="code" href="fees_8h.html#a7a1452c0779d913728b2567683a6377a">INF_PRIORITY</a>;</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> </div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <span class="keywordtype">double</span> feeLikelyEst = <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#a7ac4f70e6029ecf06e8d1528ab9c33f1">EstimateMedianVal</a>(2, <a class="code" href="fees_8h.html#afc18d5b08745c34352d5ee6bd9c8dfa2">SUFFICIENT_FEETXS</a>, <a class="code" href="fees_8h.html#aaf24bb74c1a77742398494fe80e76713">MIN_SUCCESS_PCT</a>, <span class="keyword">true</span>, nBlockHeight);</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <span class="keywordflow">if</span> (feeLikelyEst == -1)</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <a class="code" href="classCBlockPolicyEstimator.html#a883dff595684fb967def434ea626a3b0">feeLikely</a> = <a class="code" href="classCFeeRate.html">CFeeRate</a>(<a class="code" href="fees_8h.html#ae1c236d0bc9983de7c249b19628afdcd">INF_FEERATE</a>);</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <a class="code" href="classCBlockPolicyEstimator.html#a883dff595684fb967def434ea626a3b0">feeLikely</a> = <a class="code" href="classCFeeRate.html">CFeeRate</a>(feeLikelyEst);</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span> </div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <a class="code" href="classCBlockPolicyEstimator.html#af4d05ddd6a9ba94fd1713f8556267a24">priUnlikely</a> = <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#a7ac4f70e6029ecf06e8d1528ab9c33f1">EstimateMedianVal</a>(10, <a class="code" href="fees_8h.html#abc4715f1148cb76a46594dee4cb34f93">SUFFICIENT_PRITXS</a>, <a class="code" href="fees_8h.html#a27b53ce7b34e8fa1f02ff593341e7868">UNLIKELY_PCT</a>, <span class="keyword">false</span>, nBlockHeight);</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <span class="keywordflow">if</span> (<a class="code" href="classCBlockPolicyEstimator.html#af4d05ddd6a9ba94fd1713f8556267a24">priUnlikely</a> == -1)</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <a class="code" href="classCBlockPolicyEstimator.html#af4d05ddd6a9ba94fd1713f8556267a24">priUnlikely</a> = 0;</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span> </div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <span class="keywordtype">double</span> feeUnlikelyEst = <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#a7ac4f70e6029ecf06e8d1528ab9c33f1">EstimateMedianVal</a>(10, <a class="code" href="fees_8h.html#afc18d5b08745c34352d5ee6bd9c8dfa2">SUFFICIENT_FEETXS</a>, <a class="code" href="fees_8h.html#a27b53ce7b34e8fa1f02ff593341e7868">UNLIKELY_PCT</a>, <span class="keyword">false</span>, nBlockHeight);</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="keywordflow">if</span> (feeUnlikelyEst == -1)</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <a class="code" href="classCBlockPolicyEstimator.html#aaefa1c1be20e8051d1fc6ec3543c2ffd">feeUnlikely</a> = <a class="code" href="classCFeeRate.html">CFeeRate</a>(0);</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <a class="code" href="classCBlockPolicyEstimator.html#aaefa1c1be20e8051d1fc6ec3543c2ffd">feeUnlikely</a> = <a class="code" href="classCFeeRate.html">CFeeRate</a>(feeUnlikelyEst);</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span> </div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="comment">// Clear the current block states</span></div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#a3cf61e975c43103bb2c1e5ac3f5b3cf8">ClearCurrent</a>(nBlockHeight);</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#a3cf61e975c43103bb2c1e5ac3f5b3cf8">ClearCurrent</a>(nBlockHeight);</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span> </div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <span class="comment">// Repopulate the current block states</span></div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < entries.size(); i++)</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <a class="code" href="classCBlockPolicyEstimator.html#a743b4afec36ec5ac64d2ff63c7f61aae">processBlockTx</a>(nBlockHeight, entries[i]);</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span> </div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <span class="comment">// Update all exponential averages with the current block states</span></div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#a96211021e0e019a566a2126948861ead">UpdateMovingAverages</a>();</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#a96211021e0e019a566a2126948861ead">UpdateMovingAverages</a>();</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span> </div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  <a class="code" href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a>(<span class="stringliteral">"estimatefee"</span>, <span class="stringliteral">"Blockpolicy after updating estimates for %u confirmed entries, new mempool map size %u\n"</span>,</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  entries.size(), <a class="code" href="classCBlockPolicyEstimator.html#ae3af28a53439328591107672c9ad84b1">mapMemPoolTxs</a>.size());</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span> }</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span> </div><div class="line"><a name="l00492"></a><span class="lineno"><a class="line" href="classCBlockPolicyEstimator.html#a55418a0d0c84ff184d67b1bd366ca525"> 492</a></span> <a class="code" href="classCFeeRate.html">CFeeRate</a> <a class="code" href="classCBlockPolicyEstimator.html#a55418a0d0c84ff184d67b1bd366ca525">CBlockPolicyEstimator::estimateFee</a>(<span class="keywordtype">int</span> confTarget)</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span> {</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="comment">// Return failure if trying to analyze a target we're not tracking</span></div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  <span class="keywordflow">if</span> (confTarget <= 0 || (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)confTarget > <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#ab2b42aa0beab3ed825ccc8486dfc0a84">GetMaxConfirms</a>())</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <span class="keywordflow">return</span> <a class="code" href="classCFeeRate.html">CFeeRate</a>(0);</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span> </div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <span class="keywordtype">double</span> median = <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#a7ac4f70e6029ecf06e8d1528ab9c33f1">EstimateMedianVal</a>(confTarget, <a class="code" href="fees_8h.html#afc18d5b08745c34352d5ee6bd9c8dfa2">SUFFICIENT_FEETXS</a>, <a class="code" href="fees_8h.html#aaf24bb74c1a77742398494fe80e76713">MIN_SUCCESS_PCT</a>, <span class="keyword">true</span>, <a class="code" href="classCBlockPolicyEstimator.html#a208f2b05a4ca303a1814f88f0cfb3b5b">nBestSeenHeight</a>);</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span> </div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keywordflow">if</span> (median < 0)</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <span class="keywordflow">return</span> <a class="code" href="classCFeeRate.html">CFeeRate</a>(0);</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span> </div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="keywordflow">return</span> <a class="code" href="classCFeeRate.html">CFeeRate</a>(median);</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span> }</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span> </div><div class="line"><a name="l00506"></a><span class="lineno"><a class="line" href="classCBlockPolicyEstimator.html#acc6d4370b7b3942507647904043b181a"> 506</a></span> <a class="code" href="classCFeeRate.html">CFeeRate</a> <a class="code" href="classCBlockPolicyEstimator.html#acc6d4370b7b3942507647904043b181a">CBlockPolicyEstimator::estimateSmartFee</a>(<span class="keywordtype">int</span> confTarget, <span class="keywordtype">int</span> *answerFoundAtTarget, <span class="keyword">const</span> <a class="code" href="classCTxMemPool.html">CTxMemPool</a>& pool)</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span> {</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  <span class="keywordflow">if</span> (answerFoundAtTarget)</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  *answerFoundAtTarget = confTarget;</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="comment">// Return failure if trying to analyze a target we're not tracking</span></div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <span class="keywordflow">if</span> (confTarget <= 0 || (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)confTarget > <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#ab2b42aa0beab3ed825ccc8486dfc0a84">GetMaxConfirms</a>())</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <span class="keywordflow">return</span> <a class="code" href="classCFeeRate.html">CFeeRate</a>(0);</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span> </div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keywordtype">double</span> median = -1;</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="keywordflow">while</span> (median < 0 && (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)confTarget <= <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#ab2b42aa0beab3ed825ccc8486dfc0a84">GetMaxConfirms</a>()) {</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  median = <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#a7ac4f70e6029ecf06e8d1528ab9c33f1">EstimateMedianVal</a>(confTarget++, <a class="code" href="fees_8h.html#afc18d5b08745c34352d5ee6bd9c8dfa2">SUFFICIENT_FEETXS</a>, <a class="code" href="fees_8h.html#aaf24bb74c1a77742398494fe80e76713">MIN_SUCCESS_PCT</a>, <span class="keyword">true</span>, <a class="code" href="classCBlockPolicyEstimator.html#a208f2b05a4ca303a1814f88f0cfb3b5b">nBestSeenHeight</a>);</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  }</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span> </div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <span class="keywordflow">if</span> (answerFoundAtTarget)</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  *answerFoundAtTarget = confTarget - 1;</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span> </div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="comment">// If mempool is limiting txs , return at least the min fee from the mempool</span></div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <a class="code" href="amount_8h.html#a4eaf3a5239714d8c45b851527f7cb564">CAmount</a> minPoolFee = pool.<a class="code" href="classCTxMemPool.html#a232651541c3393c81153ffc289e7b71d">GetMinFee</a>(<a class="code" href="util_8cpp.html#a24f685720bf40370e5bd2a192ad50cd8">GetArg</a>(<span class="stringliteral">"-maxmempool"</span>, <a class="code" href="policy_8h.html#a9e11c2e41204ff87480d1cd041819fed">DEFAULT_MAX_MEMPOOL_SIZE</a>) * 1000000).<a class="code" href="classCFeeRate.html#ac772be79983433d442d6b871d2fb6e11">GetFeePerK</a>();</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keywordflow">if</span> (minPoolFee > 0 && minPoolFee > median)</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <span class="keywordflow">return</span> <a class="code" href="classCFeeRate.html">CFeeRate</a>(minPoolFee);</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span> </div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <span class="keywordflow">if</span> (median < 0)</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  <span class="keywordflow">return</span> <a class="code" href="classCFeeRate.html">CFeeRate</a>(0);</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span> </div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  <span class="keywordflow">return</span> <a class="code" href="classCFeeRate.html">CFeeRate</a>(median);</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> }</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span> </div><div class="line"><a name="l00533"></a><span class="lineno"><a class="line" href="classCBlockPolicyEstimator.html#adcaa52e6fdabbf8b0907bb5521aaa4f9"> 533</a></span> <span class="keywordtype">double</span> <a class="code" href="classCBlockPolicyEstimator.html#adcaa52e6fdabbf8b0907bb5521aaa4f9">CBlockPolicyEstimator::estimatePriority</a>(<span class="keywordtype">int</span> confTarget)</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span> {</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="comment">// Return failure if trying to analyze a target we're not tracking</span></div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <span class="keywordflow">if</span> (confTarget <= 0 || (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)confTarget > <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#ab2b42aa0beab3ed825ccc8486dfc0a84">GetMaxConfirms</a>())</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span> </div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  <span class="keywordflow">return</span> <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#a7ac4f70e6029ecf06e8d1528ab9c33f1">EstimateMedianVal</a>(confTarget, <a class="code" href="fees_8h.html#abc4715f1148cb76a46594dee4cb34f93">SUFFICIENT_PRITXS</a>, <a class="code" href="fees_8h.html#aaf24bb74c1a77742398494fe80e76713">MIN_SUCCESS_PCT</a>, <span class="keyword">true</span>, <a class="code" href="classCBlockPolicyEstimator.html#a208f2b05a4ca303a1814f88f0cfb3b5b">nBestSeenHeight</a>);</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span> }</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span> </div><div class="line"><a name="l00542"></a><span class="lineno"><a class="line" href="classCBlockPolicyEstimator.html#a81d98a40d7560a1edec92d565bb7ba4b"> 542</a></span> <span class="keywordtype">double</span> <a class="code" href="classCBlockPolicyEstimator.html#a81d98a40d7560a1edec92d565bb7ba4b">CBlockPolicyEstimator::estimateSmartPriority</a>(<span class="keywordtype">int</span> confTarget, <span class="keywordtype">int</span> *answerFoundAtTarget, <span class="keyword">const</span> <a class="code" href="classCTxMemPool.html">CTxMemPool</a>& pool)</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span> {</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keywordflow">if</span> (answerFoundAtTarget)</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  *answerFoundAtTarget = confTarget;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="comment">// Return failure if trying to analyze a target we're not tracking</span></div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="keywordflow">if</span> (confTarget <= 0 || (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)confTarget > <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#ab2b42aa0beab3ed825ccc8486dfc0a84">GetMaxConfirms</a>())</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span> </div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <span class="comment">// If mempool is limiting txs, no priority txs are allowed</span></div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <a class="code" href="amount_8h.html#a4eaf3a5239714d8c45b851527f7cb564">CAmount</a> minPoolFee = pool.<a class="code" href="classCTxMemPool.html#a232651541c3393c81153ffc289e7b71d">GetMinFee</a>(<a class="code" href="util_8cpp.html#a24f685720bf40370e5bd2a192ad50cd8">GetArg</a>(<span class="stringliteral">"-maxmempool"</span>, <a class="code" href="policy_8h.html#a9e11c2e41204ff87480d1cd041819fed">DEFAULT_MAX_MEMPOOL_SIZE</a>) * 1000000).<a class="code" href="classCFeeRate.html#ac772be79983433d442d6b871d2fb6e11">GetFeePerK</a>();</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="keywordflow">if</span> (minPoolFee > 0)</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  <span class="keywordflow">return</span> <a class="code" href="fees_8h.html#a7a1452c0779d913728b2567683a6377a">INF_PRIORITY</a>;</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span> </div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <span class="keywordtype">double</span> median = -1;</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  <span class="keywordflow">while</span> (median < 0 && (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)confTarget <= <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#ab2b42aa0beab3ed825ccc8486dfc0a84">GetMaxConfirms</a>()) {</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  median = <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#a7ac4f70e6029ecf06e8d1528ab9c33f1">EstimateMedianVal</a>(confTarget++, <a class="code" href="fees_8h.html#abc4715f1148cb76a46594dee4cb34f93">SUFFICIENT_PRITXS</a>, <a class="code" href="fees_8h.html#aaf24bb74c1a77742398494fe80e76713">MIN_SUCCESS_PCT</a>, <span class="keyword">true</span>, <a class="code" href="classCBlockPolicyEstimator.html#a208f2b05a4ca303a1814f88f0cfb3b5b">nBestSeenHeight</a>);</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  }</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span> </div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <span class="keywordflow">if</span> (answerFoundAtTarget)</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  *answerFoundAtTarget = confTarget - 1;</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span> </div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <span class="keywordflow">return</span> median;</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span> }</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span> </div><div class="line"><a name="l00566"></a><span class="lineno"><a class="line" href="classCBlockPolicyEstimator.html#a476fd39364402e84d3740fb2b52ba23d"> 566</a></span> <span class="keywordtype">void</span> <a class="code" href="classCBlockPolicyEstimator.html#a476fd39364402e84d3740fb2b52ba23d">CBlockPolicyEstimator::Write</a>(<a class="code" href="classCAutoFile.html">CAutoFile</a>& <a class="code" href="util_8cpp.html#a5256be9be45ec4d0909f14a61d455e23">fileout</a>)</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span> {</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <a class="code" href="util_8cpp.html#a5256be9be45ec4d0909f14a61d455e23">fileout</a> << <a class="code" href="classCBlockPolicyEstimator.html#a208f2b05a4ca303a1814f88f0cfb3b5b">nBestSeenHeight</a>;</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#a61caf0db4ffeb8c112375e2aedf62499">Write</a>(<a class="code" href="util_8cpp.html#a5256be9be45ec4d0909f14a61d455e23">fileout</a>);</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#a61caf0db4ffeb8c112375e2aedf62499">Write</a>(<a class="code" href="util_8cpp.html#a5256be9be45ec4d0909f14a61d455e23">fileout</a>);</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span> }</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span> </div><div class="line"><a name="l00573"></a><span class="lineno"><a class="line" href="classCBlockPolicyEstimator.html#a3d6a47569d0677f8c40a6a170e8abf4d"> 573</a></span> <span class="keywordtype">void</span> <a class="code" href="classCBlockPolicyEstimator.html#a3d6a47569d0677f8c40a6a170e8abf4d">CBlockPolicyEstimator::Read</a>(<a class="code" href="classCAutoFile.html">CAutoFile</a>& filein)</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span> {</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <span class="keywordtype">int</span> nFileBestSeenHeight;</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  filein >> nFileBestSeenHeight;</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <a class="code" href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">feeStats</a>.<a class="code" href="classTxConfirmStats.html#a3cc392ef180cd7bddd0181c1a73dd741">Read</a>(filein);</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <a class="code" href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">priStats</a>.<a class="code" href="classTxConfirmStats.html#a3cc392ef180cd7bddd0181c1a73dd741">Read</a>(filein);</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <a class="code" href="classCBlockPolicyEstimator.html#a208f2b05a4ca303a1814f88f0cfb3b5b">nBestSeenHeight</a> = nFileBestSeenHeight;</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span> }</div><div class="ttc" id="fees_8h_html_a180ab8694b65d509effa3f22040cce90"><div class="ttname"><a href="fees_8h.html#a180ab8694b65d509effa3f22040cce90">PRI_SPACING</a></div><div class="ttdeci">static const double PRI_SPACING</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00211">fees.h:211</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a6d09b27bc31a4f7ce4a8104d61546d37"><div class="ttname"><a href="classTxConfirmStats.html#a6d09b27bc31a4f7ce4a8104d61546d37">TxConfirmStats::txCtAvg</a></div><div class="ttdeci">std::vector< double > txCtAvg</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00089">fees.h:89</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_af4d05ddd6a9ba94fd1713f8556267a24"><div class="ttname"><a href="classCBlockPolicyEstimator.html#af4d05ddd6a9ba94fd1713f8556267a24">CBlockPolicyEstimator::priUnlikely</a></div><div class="ttdeci">double priUnlikely</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00287">fees.h:287</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a81d98a40d7560a1edec92d565bb7ba4b"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a81d98a40d7560a1edec92d565bb7ba4b">CBlockPolicyEstimator::estimateSmartPriority</a></div><div class="ttdeci">double estimateSmartPriority(int confTarget, int *answerFoundAtTarget, const CTxMemPool &pool)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00542">fees.cpp:542</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_ab2a8e9135f06f38dc51031125e803a6b"><div class="ttname"><a href="classCBlockPolicyEstimator.html#ab2a8e9135f06f38dc51031125e803a6b">CBlockPolicyEstimator::processTransaction</a></div><div class="ttdeci">void processTransaction(const CTxMemPoolEntry &entry, bool fCurrentEstimate)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00344">fees.cpp:344</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_ab80a5b84994e90d568f798632a510ab3"><div class="ttname"><a href="classTxConfirmStats.html#ab80a5b84994e90d568f798632a510ab3">TxConfirmStats::unconfTxs</a></div><div class="ttdeci">std::vector< std::vector< int > > unconfTxs</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00114">fees.h:114</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a7ac4f70e6029ecf06e8d1528ab9c33f1"><div class="ttname"><a href="classTxConfirmStats.html#a7ac4f70e6029ecf06e8d1528ab9c33f1">TxConfirmStats::EstimateMedianVal</a></div><div class="ttdeci">double EstimateMedianVal(int confTarget, double sufficientTxVal, double minSuccess, bool requireGreater, unsigned int nBlockHeight)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00078">fees.cpp:78</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a91ea5d52ed3df7cc92e0383fcc0bf18d"><div class="ttname"><a href="classTxConfirmStats.html#a91ea5d52ed3df7cc92e0383fcc0bf18d">TxConfirmStats::curBlockTxCt</a></div><div class="ttdeci">std::vector< int > curBlockTxCt</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00091">fees.h:91</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a4f27bd09eadcb493cb5e31e36fa4bd02"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a4f27bd09eadcb493cb5e31e36fa4bd02">CBlockPolicyEstimator::minTrackedPriority</a></div><div class="ttdeci">double minTrackedPriority</div><div class="ttdoc">Passed to constructor to avoid dependency on main. </div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00269">fees.h:269</a></div></div>
|
|
<div class="ttc" id="streams_8h_html"><div class="ttname"><a href="streams_8h.html">streams.h</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a63578e09e192cb16bdd28ccf49e85c06"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a63578e09e192cb16bdd28ccf49e85c06">CBlockPolicyEstimator::CBlockPolicyEstimator</a></div><div class="ttdeci">CBlockPolicyEstimator(const CFeeRate &minRelayFee)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00301">fees.cpp:301</a></div></div>
|
|
<div class="ttc" id="classCTxMemPoolEntry_html_a319f8093929fc5b6c3c66ba53ac172b5"><div class="ttname"><a href="classCTxMemPoolEntry.html#a319f8093929fc5b6c3c66ba53ac172b5">CTxMemPoolEntry::GetHeight</a></div><div class="ttdeci">unsigned int GetHeight() const</div><div class="ttdef"><b>Definition:</b> <a href="txmempool_8h_source.html#l00119">txmempool.h:119</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a61076f7531b27abbd85ec8bc7bc90ee2"><div class="ttname"><a href="classTxConfirmStats.html#a61076f7531b27abbd85ec8bc7bc90ee2">TxConfirmStats::decay</a></div><div class="ttdeci">double decay</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00109">fees.h:109</a></div></div>
|
|
<div class="ttc" id="classCTxMemPoolEntry_html_a89325fcaa8efbd1d6fe68c39d7d676b0"><div class="ttname"><a href="classCTxMemPoolEntry.html#a89325fcaa8efbd1d6fe68c39d7d676b0">CTxMemPoolEntry::GetTxSize</a></div><div class="ttdeci">size_t GetTxSize() const</div><div class="ttdef"><b>Definition:</b> <a href="txmempool_8h_source.html#l00117">txmempool.h:117</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a638b665311ffa2e6433b426fa0db6453"><div class="ttname"><a href="classTxConfirmStats.html#a638b665311ffa2e6433b426fa0db6453">TxConfirmStats::dataTypeString</a></div><div class="ttdeci">std::string dataTypeString</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00108">fees.h:108</a></div></div>
|
|
<div class="ttc" id="policy_8h_html_a9e11c2e41204ff87480d1cd041819fed"><div class="ttname"><a href="policy_8h.html#a9e11c2e41204ff87480d1cd041819fed">DEFAULT_MAX_MEMPOOL_SIZE</a></div><div class="ttdeci">static const unsigned int DEFAULT_MAX_MEMPOOL_SIZE</div><div class="ttdef"><b>Definition:</b> <a href="policy_8h_source.html#l00029">policy.h:29</a></div></div>
|
|
<div class="ttc" id="txmempool_8h_html_a51bd4734f99121bdc24323fd5aebacc3"><div class="ttname"><a href="txmempool_8h.html#a51bd4734f99121bdc24323fd5aebacc3">AllowFreeThreshold</a></div><div class="ttdeci">double AllowFreeThreshold()</div><div class="ttdef"><b>Definition:</b> <a href="txmempool_8h_source.html#l00026">txmempool.h:26</a></div></div>
|
|
<div class="ttc" id="util_8cpp_html_a5256be9be45ec4d0909f14a61d455e23"><div class="ttname"><a href="util_8cpp.html#a5256be9be45ec4d0909f14a61d455e23">fileout</a></div><div class="ttdeci">static FILE * fileout</div><div class="ttdef"><b>Definition:</b> <a href="util_8cpp_source.html#l00210">util.cpp:210</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a64281208674a51e15fb10a619bde2a51"><div class="ttname"><a href="classTxConfirmStats.html#a64281208674a51e15fb10a619bde2a51">TxConfirmStats::Record</a></div><div class="ttdeci">void Record(int blocksToConfirm, double val)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00054">fees.cpp:54</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a3cc392ef180cd7bddd0181c1a73dd741"><div class="ttname"><a href="classTxConfirmStats.html#a3cc392ef180cd7bddd0181c1a73dd741">TxConfirmStats::Read</a></div><div class="ttdeci">void Read(CAutoFile &filein)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00185">fees.cpp:185</a></div></div>
|
|
<div class="ttc" id="fees_8h_html_a27b53ce7b34e8fa1f02ff593341e7868"><div class="ttname"><a href="fees_8h.html#a27b53ce7b34e8fa1f02ff593341e7868">UNLIKELY_PCT</a></div><div class="ttdeci">static const double UNLIKELY_PCT</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00188">fees.h:188</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a3cf61e975c43103bb2c1e5ac3f5b3cf8"><div class="ttname"><a href="classTxConfirmStats.html#a3cf61e975c43103bb2c1e5ac3f5b3cf8">TxConfirmStats::ClearCurrent</a></div><div class="ttdeci">void ClearCurrent(unsigned int nBlockHeight)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00041">fees.cpp:41</a></div></div>
|
|
<div class="ttc" id="fees_8h_html_a74c407fd21a313b4919509d11d539363"><div class="ttname"><a href="fees_8h.html#a74c407fd21a313b4919509d11d539363">MIN_FEERATE</a></div><div class="ttdeci">static const double MIN_FEERATE</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00197">fees.h:197</a></div></div>
|
|
<div class="ttc" id="classCTxMemPoolEntry_html"><div class="ttname"><a href="classCTxMemPoolEntry.html">CTxMemPoolEntry</a></div><div class="ttdef"><b>Definition:</b> <a href="txmempool_8h_source.html#l00076">txmempool.h:76</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a96211021e0e019a566a2126948861ead"><div class="ttname"><a href="classTxConfirmStats.html#a96211021e0e019a566a2126948861ead">TxConfirmStats::UpdateMovingAverages</a></div><div class="ttdeci">void UpdateMovingAverages()</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00067">fees.cpp:67</a></div></div>
|
|
<div class="ttc" id="fees_8h_html_ae1c236d0bc9983de7c249b19628afdcd"><div class="ttname"><a href="fees_8h.html#ae1c236d0bc9983de7c249b19628afdcd">INF_FEERATE</a></div><div class="ttdeci">static const double INF_FEERATE</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00199">fees.h:199</a></div></div>
|
|
<div class="ttc" id="fees_8h_html_abc4715f1148cb76a46594dee4cb34f93"><div class="ttname"><a href="fees_8h.html#abc4715f1148cb76a46594dee4cb34f93">SUFFICIENT_PRITXS</a></div><div class="ttdeci">static const double SUFFICIENT_PRITXS</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00194">fees.h:194</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a55418a0d0c84ff184d67b1bd366ca525"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a55418a0d0c84ff184d67b1bd366ca525">CBlockPolicyEstimator::estimateFee</a></div><div class="ttdeci">CFeeRate estimateFee(int confTarget)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00492">fees.cpp:492</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_afa12ce705042b5a93bc07e5ad467a4df"><div class="ttname"><a href="classCBlockPolicyEstimator.html#afa12ce705042b5a93bc07e5ad467a4df">CBlockPolicyEstimator::priStats</a></div><div class="ttdeci">TxConfirmStats priStats</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00283">fees.h:283</a></div></div>
|
|
<div class="ttc" id="classCTxMemPoolEntry_html_adf67bc503adf4ce7ff8d98769e56fecb"><div class="ttname"><a href="classCTxMemPoolEntry.html#adf67bc503adf4ce7ff8d98769e56fecb">CTxMemPoolEntry::GetFee</a></div><div class="ttdeci">const CAmount & GetFee() const</div><div class="ttdef"><b>Definition:</b> <a href="txmempool_8h_source.html#l00116">txmempool.h:116</a></div></div>
|
|
<div class="ttc" id="fees_8h_html_a33e270a0a5aaa6276fd86057feb434a7"><div class="ttname"><a href="fees_8h.html#a33e270a0a5aaa6276fd86057feb434a7">MAX_PRIORITY</a></div><div class="ttdeci">static const double MAX_PRIORITY</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00201">fees.h:201</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a2f21d56ed1f23ec8d106526db25e8e6e"><div class="ttname"><a href="classTxConfirmStats.html#a2f21d56ed1f23ec8d106526db25e8e6e">TxConfirmStats::bucketMap</a></div><div class="ttdeci">std::map< double, unsigned int > bucketMap</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00084">fees.h:84</a></div></div>
|
|
<div class="ttc" id="amount_8h_html_a4eaf3a5239714d8c45b851527f7cb564"><div class="ttname"><a href="amount_8h.html#a4eaf3a5239714d8c45b851527f7cb564">CAmount</a></div><div class="ttdeci">int64_t CAmount</div><div class="ttdef"><b>Definition:</b> <a href="amount_8h_source.html#l00014">amount.h:14</a></div></div>
|
|
<div class="ttc" id="classCFeeRate_html"><div class="ttname"><a href="classCFeeRate.html">CFeeRate</a></div><div class="ttdef"><b>Definition:</b> <a href="amount_8h_source.html#l00036">amount.h:36</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a743b4afec36ec5ac64d2ff63c7f61aae"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a743b4afec36ec5ac64d2ff63c7f61aae">CBlockPolicyEstimator::processBlockTx</a></div><div class="ttdeci">void processBlockTx(unsigned int nBlockHeight, const CTxMemPoolEntry &entry)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00397">fees.cpp:397</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_acc6d4370b7b3942507647904043b181a"><div class="ttname"><a href="classCBlockPolicyEstimator.html#acc6d4370b7b3942507647904043b181a">CBlockPolicyEstimator::estimateSmartFee</a></div><div class="ttdeci">CFeeRate estimateSmartFee(int confTarget, int *answerFoundAtTarget, const CTxMemPool &pool)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00506">fees.cpp:506</a></div></div>
|
|
<div class="ttc" id="txmempool_8h_html"><div class="ttname"><a href="txmempool_8h.html">txmempool.h</a></div></div>
|
|
<div class="ttc" id="util_8h_html_aab1f837a2366f424bdc996fdf6352171"><div class="ttname"><a href="util_8h.html#aab1f837a2366f424bdc996fdf6352171">LogPrint</a></div><div class="ttdeci">static int LogPrint(const char *category, const char *format)</div><div class="ttdef"><b>Definition:</b> <a href="util_8h_source.html#l00126">util.h:126</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a883dff595684fb967def434ea626a3b0"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a883dff595684fb967def434ea626a3b0">CBlockPolicyEstimator::feeLikely</a></div><div class="ttdeci">CFeeRate feeLikely</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00286">fees.h:286</a></div></div>
|
|
<div class="ttc" id="classCTxMemPoolEntry_html_a2deed4202061edf8b040a3f554417c20"><div class="ttname"><a href="classCTxMemPoolEntry.html#a2deed4202061edf8b040a3f554417c20">CTxMemPoolEntry::GetTx</a></div><div class="ttdeci">const CTransaction & GetTx() const</div><div class="ttdef"><b>Definition:</b> <a href="txmempool_8h_source.html#l00110">txmempool.h:110</a></div></div>
|
|
<div class="ttc" id="policy_8h_html"><div class="ttname"><a href="policy_8h.html">policy.h</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html"><div class="ttname"><a href="classTxConfirmStats.html">TxConfirmStats</a></div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00079">fees.h:79</a></div></div>
|
|
<div class="ttc" id="classCFeeRate_html_ac772be79983433d442d6b871d2fb6e11"><div class="ttname"><a href="classCFeeRate.html#ac772be79983433d442d6b871d2fb6e11">CFeeRate::GetFeePerK</a></div><div class="ttdeci">CAmount GetFeePerK() const</div><div class="ttdef"><b>Definition:</b> <a href="amount_8h_source.html#l00047">amount.h:47</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_ab2b42aa0beab3ed825ccc8486dfc0a84"><div class="ttname"><a href="classTxConfirmStats.html#ab2b42aa0beab3ed825ccc8486dfc0a84">TxConfirmStats::GetMaxConfirms</a></div><div class="ttdeci">unsigned int GetMaxConfirms()</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00166">fees.h:166</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_ae0b014c40cdf3c2207f2677774000261"><div class="ttname"><a href="classTxConfirmStats.html#ae0b014c40cdf3c2207f2677774000261">TxConfirmStats::NewTx</a></div><div class="ttdeci">unsigned int NewTx(unsigned int nBlockHeight, double val)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00248">fees.cpp:248</a></div></div>
|
|
<div class="ttc" id="classbase__blob_html_a7a0d25782830d8b087c4da839f3ccdeb"><div class="ttname"><a href="classbase__blob.html#a7a0d25782830d8b087c4da839f3ccdeb">base_blob::ToString</a></div><div class="ttdeci">std::string ToString() const</div><div class="ttdef"><b>Definition:</b> <a href="uint256_8cpp_source.html#l00065">uint256.cpp:65</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a2b2e4283eb4ee6a03df4ab084c74ce1c"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a2b2e4283eb4ee6a03df4ab084c74ce1c">CBlockPolicyEstimator::feeStats</a></div><div class="ttdeci">TxConfirmStats feeStats</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00283">fees.h:283</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_aad7cdbbb2fccfe1abf2dbfb2cc0230ce"><div class="ttname"><a href="classTxConfirmStats.html#aad7cdbbb2fccfe1abf2dbfb2cc0230ce">TxConfirmStats::avg</a></div><div class="ttdeci">std::vector< double > avg</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00101">fees.h:101</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a5a7701e1463d687cae1e86204748dc5e"><div class="ttname"><a href="classTxConfirmStats.html#a5a7701e1463d687cae1e86204748dc5e">TxConfirmStats::Initialize</a></div><div class="ttdeci">void Initialize(std::vector< double > &defaultBuckets, unsigned int maxConfirms, double decay, std::string dataTypeString)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00015">fees.cpp:15</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a294a044fae770c4977f2ba46c78cdf2a"><div class="ttname"><a href="classTxConfirmStats.html#a294a044fae770c4977f2ba46c78cdf2a">TxConfirmStats::curBlockVal</a></div><div class="ttdeci">std::vector< double > curBlockVal</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00103">fees.h:103</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a421aa07c38b5f51dae2f2bdd725ba169"><div class="ttname"><a href="classTxConfirmStats.html#a421aa07c38b5f51dae2f2bdd725ba169">TxConfirmStats::removeTx</a></div><div class="ttdeci">void removeTx(unsigned int entryHeight, unsigned int nBestSeenHeight, unsigned int bucketIndex)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00257">fees.cpp:257</a></div></div>
|
|
<div class="ttc" id="fees_8h_html_afc18d5b08745c34352d5ee6bd9c8dfa2"><div class="ttname"><a href="fees_8h.html#afc18d5b08745c34352d5ee6bd9c8dfa2">SUFFICIENT_FEETXS</a></div><div class="ttdeci">static const double SUFFICIENT_FEETXS</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00191">fees.h:191</a></div></div>
|
|
<div class="ttc" id="classuint256_html"><div class="ttname"><a href="classuint256.html">uint256</a></div><div class="ttdef"><b>Definition:</b> <a href="uint256_8h_source.html#l00114">uint256.h:114</a></div></div>
|
|
<div class="ttc" id="fees_8h_html_a7a2a101d1795850360f79d9e4d8cbbf4"><div class="ttname"><a href="fees_8h.html#a7a2a101d1795850360f79d9e4d8cbbf4">DEFAULT_DECAY</a></div><div class="ttdeci">static const double DEFAULT_DECAY</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00184">fees.h:184</a></div></div>
|
|
<div class="ttc" id="classCTxMemPool_html"><div class="ttname"><a href="classCTxMemPool.html">CTxMemPool</a></div><div class="ttdef"><b>Definition:</b> <a href="txmempool_8h_source.html#l00357">txmempool.h:357</a></div></div>
|
|
<div class="ttc" id="fees_8h_html_aaf24bb74c1a77742398494fe80e76713"><div class="ttname"><a href="fees_8h.html#aaf24bb74c1a77742398494fe80e76713">MIN_SUCCESS_PCT</a></div><div class="ttdeci">static const double MIN_SUCCESS_PCT</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00187">fees.h:187</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_aaefa1c1be20e8051d1fc6ec3543c2ffd"><div class="ttname"><a href="classCBlockPolicyEstimator.html#aaefa1c1be20e8051d1fc6ec3543c2ffd">CBlockPolicyEstimator::feeUnlikely</a></div><div class="ttdeci">CFeeRate feeUnlikely</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00286">fees.h:286</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a9855a86bd39817acc9de71a574e582c2"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a9855a86bd39817acc9de71a574e582c2">CBlockPolicyEstimator::minTrackedFee</a></div><div class="ttdeci">CFeeRate minTrackedFee</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00268">fees.h:268</a></div></div>
|
|
<div class="ttc" id="classCAutoFile_html"><div class="ttname"><a href="classCAutoFile.html">CAutoFile</a></div><div class="ttdef"><b>Definition:</b> <a href="streams_8h_source.html#l00346">streams.h:346</a></div></div>
|
|
<div class="ttc" id="classCTransaction_html_a7efd1379de830341417c0bfa23a149aa"><div class="ttname"><a href="classCTransaction.html#a7efd1379de830341417c0bfa23a149aa">CTransaction::GetHash</a></div><div class="ttdeci">const uint256 & GetHash() const</div><div class="ttdef"><b>Definition:</b> <a href="transaction_8h_source.html#l00262">transaction.h:262</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a52cc7162762f37f5a246dc7a16838aa9"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a52cc7162762f37f5a246dc7a16838aa9">CBlockPolicyEstimator::removeTx</a></div><div class="ttdeci">void removeTx(uint256 hash)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00285">fees.cpp:285</a></div></div>
|
|
<div class="ttc" id="fees_8h_html_a7a1452c0779d913728b2567683a6377a"><div class="ttname"><a href="fees_8h.html#a7a1452c0779d913728b2567683a6377a">INF_PRIORITY</a></div><div class="ttdeci">static const double INF_PRIORITY</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00202">fees.h:202</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_ae5210aa92ae419c28dd18d853732c166"><div class="ttname"><a href="classCBlockPolicyEstimator.html#ae5210aa92ae419c28dd18d853732c166">CBlockPolicyEstimator::isFeeDataPoint</a></div><div class="ttdeci">bool isFeeDataPoint(const CFeeRate &fee, double pri)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00326">fees.cpp:326</a></div></div>
|
|
<div class="ttc" id="fees_8h_html_a15a03efa27a6ae8c890c348eebb35b0a"><div class="ttname"><a href="fees_8h.html#a15a03efa27a6ae8c890c348eebb35b0a">MIN_PRIORITY</a></div><div class="ttdeci">static const double MIN_PRIORITY</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00200">fees.h:200</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a9ac58339877c62a144679caa349c414a"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a9ac58339877c62a144679caa349c414a">CBlockPolicyEstimator::isPriDataPoint</a></div><div class="ttdeci">bool isPriDataPoint(const CFeeRate &fee, double pri)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00335">fees.cpp:335</a></div></div>
|
|
<div class="ttc" id="fees_8h_html_a1ae313c1efaf2d8962f06debeeabdb59"><div class="ttname"><a href="fees_8h.html#a1ae313c1efaf2d8962f06debeeabdb59">MAX_FEERATE</a></div><div class="ttdeci">static const double MAX_FEERATE</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00198">fees.h:198</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a208f2b05a4ca303a1814f88f0cfb3b5b"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a208f2b05a4ca303a1814f88f0cfb3b5b">CBlockPolicyEstimator::nBestSeenHeight</a></div><div class="ttdeci">unsigned int nBestSeenHeight</div><div class="ttdoc">Set to AllowFreeThreshold. </div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00270">fees.h:270</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a3d6a47569d0677f8c40a6a170e8abf4d"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a3d6a47569d0677f8c40a6a170e8abf4d">CBlockPolicyEstimator::Read</a></div><div class="ttdeci">void Read(CAutoFile &filein)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00573">fees.cpp:573</a></div></div>
|
|
<div class="ttc" id="classCTxMemPool_html_a232651541c3393c81153ffc289e7b71d"><div class="ttname"><a href="classCTxMemPool.html#a232651541c3393c81153ffc289e7b71d">CTxMemPool::GetMinFee</a></div><div class="ttdeci">CFeeRate GetMinFee(size_t sizelimit) const</div><div class="ttdef"><b>Definition:</b> <a href="txmempool_8cpp_source.html#l01076">txmempool.cpp:1076</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a4dbf4773f292c71c51cd17b7eb67dad0"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a4dbf4773f292c71c51cd17b7eb67dad0">CBlockPolicyEstimator::processBlock</a></div><div class="ttdeci">void processBlock(unsigned int nBlockHeight, std::vector< CTxMemPoolEntry > &entries, bool fCurrentEstimate)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00434">fees.cpp:434</a></div></div>
|
|
<div class="ttc" id="amount_8h_html"><div class="ttname"><a href="amount_8h.html">amount.h</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a61caf0db4ffeb8c112375e2aedf62499"><div class="ttname"><a href="classTxConfirmStats.html#a61caf0db4ffeb8c112375e2aedf62499">TxConfirmStats::Write</a></div><div class="ttdeci">void Write(CAutoFile &fileout)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00176">fees.cpp:176</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a80101a37c91a8953151d0c146bfbc635"><div class="ttname"><a href="classTxConfirmStats.html#a80101a37c91a8953151d0c146bfbc635">TxConfirmStats::oldUnconfTxs</a></div><div class="ttdeci">std::vector< int > oldUnconfTxs</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00116">fees.h:116</a></div></div>
|
|
<div class="ttc" id="classCTxMemPoolEntry_html_a189d5dbafa6e955524692c0743dc0e0b"><div class="ttname"><a href="classCTxMemPoolEntry.html#a189d5dbafa6e955524692c0743dc0e0b">CTxMemPoolEntry::GetPriority</a></div><div class="ttdeci">double GetPriority(unsigned int currentHeight) const</div><div class="ttdef"><b>Definition:</b> <a href="txmempool_8cpp_source.html#l00050">txmempool.cpp:50</a></div></div>
|
|
<div class="ttc" id="util_8cpp_html_a24f685720bf40370e5bd2a192ad50cd8"><div class="ttname"><a href="util_8cpp.html#a24f685720bf40370e5bd2a192ad50cd8">GetArg</a></div><div class="ttdeci">std::string GetArg(const std::string &strArg, const std::string &strDefault)</div><div class="ttdef"><b>Definition:</b> <a href="util_8cpp_source.html#l00441">util.cpp:441</a></div></div>
|
|
<div class="ttc" id="classCTxMemPoolEntry_html_a1be87eeaf1d502868d2b7a44ed8ba1d1"><div class="ttname"><a href="classCTxMemPoolEntry.html#a1be87eeaf1d502868d2b7a44ed8ba1d1">CTxMemPoolEntry::WasClearAtEntry</a></div><div class="ttdeci">bool WasClearAtEntry() const</div><div class="ttdef"><b>Definition:</b> <a href="txmempool_8h_source.html#l00120">txmempool.h:120</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_ab09c024915718a928764b2a6b69f8215"><div class="ttname"><a href="classTxConfirmStats.html#ab09c024915718a928764b2a6b69f8215">TxConfirmStats::confAvg</a></div><div class="ttdeci">std::vector< std::vector< double > > confAvg</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00095">fees.h:95</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a96013d2383fb68757b4dc948a98b09fe"><div class="ttname"><a href="classTxConfirmStats.html#a96013d2383fb68757b4dc948a98b09fe">TxConfirmStats::curBlockConf</a></div><div class="ttdeci">std::vector< std::vector< int > > curBlockConf</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00097">fees.h:97</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_ae3af28a53439328591107672c9ad84b1"><div class="ttname"><a href="classCBlockPolicyEstimator.html#ae3af28a53439328591107672c9ad84b1">CBlockPolicyEstimator::mapMemPoolTxs</a></div><div class="ttdeci">std::map< uint256, TxStatsInfo > mapMemPoolTxs</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00280">fees.h:280</a></div></div>
|
|
<div class="ttc" id="transaction_8h_html"><div class="ttname"><a href="transaction_8h.html">transaction.h</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a476fd39364402e84d3740fb2b52ba23d"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a476fd39364402e84d3740fb2b52ba23d">CBlockPolicyEstimator::Write</a></div><div class="ttdeci">void Write(CAutoFile &fileout)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00566">fees.cpp:566</a></div></div>
|
|
<div class="ttc" id="fees_8h_html_a497b52dfe8ede3ddd28904d20172c030"><div class="ttname"><a href="fees_8h.html#a497b52dfe8ede3ddd28904d20172c030">MAX_BLOCK_CONFIRMS</a></div><div class="ttdeci">static const unsigned int MAX_BLOCK_CONFIRMS</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00181">fees.h:181</a></div></div>
|
|
<div class="ttc" id="classTxConfirmStats_html_a1267be3e0742dcf549adcaa2e13e66f7"><div class="ttname"><a href="classTxConfirmStats.html#a1267be3e0742dcf549adcaa2e13e66f7">TxConfirmStats::buckets</a></div><div class="ttdeci">std::vector< double > buckets</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00083">fees.h:83</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_adcaa52e6fdabbf8b0907bb5521aaa4f9"><div class="ttname"><a href="classCBlockPolicyEstimator.html#adcaa52e6fdabbf8b0907bb5521aaa4f9">CBlockPolicyEstimator::estimatePriority</a></div><div class="ttdeci">double estimatePriority(int confTarget)</div><div class="ttdef"><b>Definition:</b> <a href="fees_8cpp_source.html#l00533">fees.cpp:533</a></div></div>
|
|
<div class="ttc" id="fees_8h_html"><div class="ttname"><a href="fees_8h.html">fees.h</a></div></div>
|
|
<div class="ttc" id="fees_8h_html_a7d6fd36ed44ed4800fa0fa9b0187643d"><div class="ttname"><a href="fees_8h.html#a7d6fd36ed44ed4800fa0fa9b0187643d">FEE_SPACING</a></div><div class="ttdeci">static const double FEE_SPACING</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00208">fees.h:208</a></div></div>
|
|
<div class="ttc" id="classCBlockPolicyEstimator_html_a95d99a8ef792305efa3580a1beffad3d"><div class="ttname"><a href="classCBlockPolicyEstimator.html#a95d99a8ef792305efa3580a1beffad3d">CBlockPolicyEstimator::priLikely</a></div><div class="ttdeci">double priLikely</div><div class="ttdef"><b>Definition:</b> <a href="fees_8h_source.html#l00287">fees.h:287</a></div></div>
|
|
</div><!-- fragment --></div><!-- contents -->
|
|
</div><!-- doc-content -->
|
|
<!-- start footer part -->
|
|
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
|
<ul>
|
|
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_f9a362818448b8ef6661813ae65d7e79.html">policy</a></li><li class="navelem"><a class="el" href="fees_8cpp.html">fees.cpp</a></li>
|
|
<li class="footer">Generated on Thu Dec 14 2017 13:15:04 for Dash Core by
|
|
<a href="http://www.doxygen.org/index.html">
|
|
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.14 </li>
|
|
</ul>
|
|
</div>
|
|
</body>
|
|
</html>
|