{"action":"created","comment":{"url":"https://api.github.com/repos/bitcoin/bitcoin/pulls/comments/224319995","pull_request_review_id":163655636,"id":224319995,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyNDMxOTk5NQ==","diff_hunk":"@@ -0,0 +1,333 @@\n+// Copyright (c) 2018 The Bitcoin Core developers\n+// Distributed under the MIT software license, see the accompanying\n+// file COPYING or http://www.opensource.org/licenses/mit-license.php.\n+\n+#include <policy/fees.h>\n+#include <policy/fees_input.h>\n+#include <util.h>\n+\n+#include <univalue.h>\n+\n+#include <fstream>\n+#include <random>\n+#include <stdio.h>\n+\n+const std::function<std::string(const char*)> G_TRANSLATION_FUN = nullptr;\n+\n+std::string Usage()\n+{\n+    std::string usage = \"Usage: fee_est [options] <estlog.txt>\\n\";\n+    usage += HelpMessageGroup(\"Options:\");\n+    usage += HelpMessageOpt(\"-?, -help\", \"This help message\");\n+    usage += HelpMessageOpt(\"-ograph=<graph.html>\", \"Generate target vs feerate graph output after replaying transaction log.\");\n+    usage += HelpMessageOpt(\"-odat=<fee_estimates.dat>\", \"Save fee estimator state after after replaying transaction log.\");\n+    usage += HelpMessageOpt(\"-idat=<fee_estimates.dat>\", \"Load fee estimator state after before replaying transaction log.\");\n+    usage += HelpMessageOpt(\"-dat=<fee_estimates.dat>\", \"Shortcut for -idat=<fee_estimates.dat> -odat=<fee_estimates.dat>\");\n+    usage += HelpMessageOpt(\"-cross\", \"Treat half the transactions from the log as test data and print cross-validation statistics.\");\n+    return usage;\n+}\n+\n+struct Options\n+{\n+    std::string logFileIn;\n+    std::string dataFileIn;\n+    std::string dataFileOut;\n+    std::string graphFileOut;\n+    bool cross = false;\n+    bool help = false;\n+    bool error = false;\n+};\n+\n+Options ParseCommandLine(int argc, char** argv)\n+{\n+    auto match = [&](const char* arg, const char* name, const char** value = nullptr) {\n+        if (arg[0] != '-') return false;\n+        size_t n = strlen(name);\n+        if (strncmp(arg + 1, name, n) != 0) return false;\n+        if (value) return (*value = arg[n + 1] == '=' ? arg + n + 2 : nullptr) != nullptr;\n+        return arg[n + 1] == '\\0';\n+    };\n+\n+    Options options;\n+    for (int i = 1; i < argc; ++i) {\n+        const char* arg = argv[i];\n+        const char* value;\n+        if (match(arg, \"ograph\", &value)) {\n+            options.graphFileOut = value;\n+        } else if (match(arg, \"odat\", &value)) {\n+            options.dataFileOut = value;\n+        } else if (match(arg, \"idat\", &value)) {\n+            options.dataFileIn = value;\n+        } else if (match(arg, \"dat\", &value)) {\n+            options.dataFileIn = options.dataFileOut = value;\n+        } else if (match(arg, \"cross\")) {\n+            options.cross = true;\n+        } else if (match(arg, \"help\") || match(arg, \"h\") || match(arg, \"?\")) {\n+            options.help = true;\n+        } else if (arg[0] != '-' && options.logFileIn.empty()) {\n+            options.logFileIn = arg;\n+        } else {\n+            fprintf(stderr, \"Error: unexpected argument: '%s'\\n\", arg);\n+            options.error = true;\n+        }\n+    }\n+\n+    if (options.logFileIn.empty() && !options.help) {\n+        fprintf(stderr, \"Error: missing required log file argument.\\n\");\n+        options.error = true;\n+    }\n+\n+    return options;\n+}\n+\n+struct TxData\n+{\n+    TxData(CAmount fee, int size, int height) : fee(fee), size(size), height(height) {}\n+    CAmount fee;\n+    int size;\n+    int height;\n+    int expectedBlocks = -1;\n+    int actualBlocks = -1;\n+};\n+\n+using TxMap = std::map<uint256, TxData>;\n+\n+const char* const GRAPH_HTML = R\"(<!DOCTYPE html>\n+<meta charset=\"utf-8\">\n+<title>Fee Graph</title>\n+<script src=\"https://d3js.org/d3.v3.min.js\"></script>\n+<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vega/3.0.0-beta.30/vega.js\"></script>\n+<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vega-lite/2.0.0-beta.2/vega-lite.js\"></script>\n+<script src=\"https://cdnjs.cloudflare.com/ajax/libs/vega-embed/3.0.0-beta.14/vega-embed.js\"></script>\n+<style media=\"screen\">\n+.vega-actions a {\n+    margin-right: 5px;\n+}\n+</style>\n+<div id=vis></div>\n+<script>\n+var spec = {\n+  \"$schema\": \"https://vega.github.io/schema/vega-lite/v2.json\",\n+  \"width\": 800,\n+  \"height\": 600,\n+  \"layer\": [\n+    {\n+        \"data\": {\n+            \"values\": %s\n+        },\n+        \"mark\": \"tick\",\n+        \"encoding\": {\n+            \"x\": {\"field\": \"blocks\", \"type\": \"quantitative\"},\n+            \"y\": {\"field\": \"feeRate\", \"type\": \"quantitative\"},\n+            \"color\": {\"field\": \"height\", \"type\": \"quantitative\"}\n+        }\n+    },\n+    {\n+      \"data\": {\n+        \"values\": %s\n+      },\n+      \"encoding\": {\n+        \"x\": {\"field\": \"blocks\", \"type\": \"quantitative\"},\n+        \"y\": {\"field\": \"feeRate\", \"type\": \"quantitative\"},\n+        \"color\": {\"field\": \"mode\", \"type\": \"nominal\"}\n+      },\n+      \"mark\": \"line\",\n+    }\n+  ]\n+}\n+vega.embed(\"#vis\", spec);\n+</script>\n+)\";\n+\n+// Maximum number of randomly sampled transactions to show on graph.\n+const int SAMPLE_TXS = 50000;\n+\n+// Drop 1/20th of sampled transactions with highest feerates if they are\n+// outliers that would change the scale of the graph.\n+const int DROP_FRAC = 20;\n+\n+void WriteGraph(const std::string& filename,\n+    const TxMap& txMap,\n+    const std::vector<unsigned int>& targets,\n+    CBlockPolicyEstimator& estimator)\n+{\n+    UniValue fees(UniValue::VARR);\n+\n+    int64_t maxFeeRate = 0;\n+    const unsigned int maxTarget = estimator.getMaxTarget();\n+    for (bool conservative : {false, true}) {\n+        for (unsigned int target : targets) {\n+            if (target > maxTarget) continue;\n+            UniValue fee(UniValue::VOBJ);\n+            fee.pushKV(\"mode\", conservative ? \"conservative\" : \"default\");\n+            fee.pushKV(\"blocks\", int(target));\n+            int64_t feeRate = estimator.estimateSmartFee(target, nullptr /* confTarget */, conservative).GetFeePerK();\n+            fee.pushKV(\"feeRate\", feeRate);\n+            fees.push_back(fee);\n+            maxFeeRate = std::max(maxFeeRate, feeRate);\n+        }\n+    }\n+\n+    std::vector<const TxMap::value_type*> sample;\n+    sample.reserve(SAMPLE_TXS);\n+    int i = 0;\n+    std::minstd_rand randint;\n+    for (const auto& entry : txMap) {\n+        if (entry.second.actualBlocks > int(maxTarget)) {\n+            continue;\n+        } else if (sample.size() < SAMPLE_TXS) {\n+            sample.emplace_back(&entry);\n+        } else {\n+            int j = randint() % i;\n+            if (j < SAMPLE_TXS) {\n+                sample[j] = &entry;\n+            }\n+        }\n+        ++i;\n+    }\n+\n+    if (!sample.empty()) {\n+        std::vector<int64_t> feeRates;\n+        feeRates.reserve(sample.size());\n+        for (const auto& entry : sample) {\n+            feeRates.emplace_back(CFeeRate(entry->second.fee, entry->second.size).GetFeePerK());\n+        }\n+        auto nth = feeRates.begin() + sample.size() / DROP_FRAC;\n+        std::nth_element(feeRates.begin(), nth, feeRates.end(), std::greater<int64_t>());\n+        maxFeeRate = std::max(maxFeeRate, *nth);\n+    }\n+\n+    UniValue txs(UniValue::VARR);\n+    for (const auto& entry : sample) {\n+        if (entry->second.actualBlocks > 0) {\n+            int64_t feeRate = CFeeRate(entry->second.fee, entry->second.size).GetFeePerK();\n+            if (feeRate <= maxFeeRate) {\n+                UniValue tx(UniValue::VOBJ);\n+                tx.pushKV(\"feeRate\", feeRate);\n+                tx.pushKV(\"blocks\", entry->second.actualBlocks);\n+                tx.pushKV(\"height\", entry->second.height);\n+                txs.push_back(std::move(tx));\n+            }\n+        }\n+    }\n+\n+    std::ofstream file(filename);\n+    file << strprintf(GRAPH_HTML, txs.write(), fees.write());\n+}\n+\n+bool UpdateCross(TxMap::value_type& tx, const std::vector<unsigned int>& targets, CBlockPolicyEstimator& estimator)\n+{\n+    if (*tx.first.begin() == 0) {\n+        auto it = std::lower_bound(targets.begin(), targets.end(), nullptr, [&](unsigned int target, std::nullptr_t) {\n+            CAmount estFee = estimator.estimateSmartFee(target, nullptr /* feeCalc */, false /* conservative */)\n+                                 .GetFee(tx.second.size);","path":"src/test/fee_est/fee_est.cpp","position":223,"original_position":223,"commit_id":"56446378f5d0c2bdeb7a45fa7382ccd58c9b994c","original_commit_id":"56446378f5d0c2bdeb7a45fa7382ccd58c9b994c","user":{"login":"practicalswift","id":7826565,"node_id":"MDQ6VXNlcjc4MjY1NjU=","avatar_url":"https://avatars3.githubusercontent.com/u/7826565?v=4","gravatar_id":"","url":"https://api.github.com/users/practicalswift","html_url":"https://github.com/practicalswift","followers_url":"https://api.github.com/users/practicalswift/followers","following_url":"https://api.github.com/users/practicalswift/following{/other_user}","gists_url":"https://api.github.com/users/practicalswift/gists{/gist_id}","starred_url":"https://api.github.com/users/practicalswift/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/practicalswift/subscriptions","organizations_url":"https://api.github.com/users/practicalswift/orgs","repos_url":"https://api.github.com/users/practicalswift/repos","events_url":"https://api.github.com/users/practicalswift/events{/privacy}","received_events_url":"https://api.github.com/users/practicalswift/received_events","type":"User","site_admin":false},"body":"An implicit signedness changing conversion takes place here. Avoid or make it explicit :-)","created_at":"2018-10-11T05:40:54Z","updated_at":"2018-10-11T05:40:55Z","html_url":"https://github.com/bitcoin/bitcoin/pull/10443#discussion_r224319995","pull_request_url":"https://api.github.com/repos/bitcoin/bitcoin/pulls/10443","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/bitcoin/bitcoin/pulls/comments/224319995"},"html":{"href":"https://github.com/bitcoin/bitcoin/pull/10443#discussion_r224319995"},"pull_request":{"href":"https://api.github.com/repos/bitcoin/bitcoin/pulls/10443"}}},"pull_request":{"url":"https://api.github.com/repos/bitcoin/bitcoin/pulls/10443","id":121880014,"node_id":"MDExOlB1bGxSZXF1ZXN0MTIxODgwMDE0","html_url":"https://github.com/bitcoin/bitcoin/pull/10443","diff_url":"https://github.com/bitcoin/bitcoin/pull/10443.diff","patch_url":"https://github.com/bitcoin/bitcoin/pull/10443.patch","issue_url":"https://api.github.com/repos/bitcoin/bitcoin/issues/10443","number":10443,"state":"open","locked":false,"title":"Add fee_est tool for debugging fee estimation code","user":{"login":"ryanofsky","id":7133040,"node_id":"MDQ6VXNlcjcxMzMwNDA=","avatar_url":"https://avatars2.githubusercontent.com/u/7133040?v=4","gravatar_id":"","url":"https://api.github.com/users/ryanofsky","html_url":"https://github.com/ryanofsky","followers_url":"https://api.github.com/users/ryanofsky/followers","following_url":"https://api.github.com/users/ryanofsky/following{/other_user}","gists_url":"https://api.github.com/users/ryanofsky/gists{/gist_id}","starred_url":"https://api.github.com/users/ryanofsky/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ryanofsky/subscriptions","organizations_url":"https://api.github.com/users/ryanofsky/orgs","repos_url":"https://api.github.com/users/ryanofsky/repos","events_url":"https://api.github.com/users/ryanofsky/events{/privacy}","received_events_url":"https://api.github.com/users/ryanofsky/received_events","type":"User","site_admin":false},"body":"This PR adds an `-estlog` option for saving live fee estimation data from a bitcoin node, and a `fee_est` command line tool for processing the data and testing fee estimation code.\r\n\r\nThe idea is to make it easier to test improvements to fee estimation like https://github.com/bitcoin/bitcoin/pull/10199 in a more systematic and reproducible way.\r\n\r\nSome documentation is in [`src/test/fee_est/README.md`](https://github.com/ryanofsky/bitcoin/blob/pr/fee/src/test/fee_est/README.md)\r\n\r\nSample log file: [`est.log.xz`](https://storage.googleapis.com/ryanofsky/est.log.xz) (65M)\r\n\r\nSample [`fee_est.cpp`](https://github.com/ryanofsky/bitcoin/blob/pr/fee/src/test/fee_est/fee_est.cpp)  graph output: \r\n\r\n![graph](https://cloud.githubusercontent.com/assets/7133040/26331057/f2de8d0c-3f1c-11e7-99ea-de1801d13b05.png)\r\n\r\n","created_at":"2017-05-22T22:40:55Z","updated_at":"2018-10-11T05:40:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"39e69f8e86668f3001202063d0e9cb19240a0058","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":82428251,"node_id":"MDU6TGFiZWw4MjQyODI1MQ==","url":"https://api.github.com/repos/bitcoin/bitcoin/labels/TX%20fees%20and%20policy","name":"TX fees and policy","color":"5319e7","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/bitcoin/bitcoin/pulls/10443/commits","review_comments_url":"https://api.github.com/repos/bitcoin/bitcoin/pulls/10443/comments","review_comment_url":"https://api.github.com/repos/bitcoin/bitcoin/pulls/comments{/number}","comments_url":"https://api.github.com/repos/bitcoin/bitcoin/issues/10443/comments","statuses_url":"https://api.github.com/repos/bitcoin/bitcoin/statuses/56446378f5d0c2bdeb7a45fa7382ccd58c9b994c","head":{"label":"ryanofsky:pr/fee","ref":"pr/fee","sha":"56446378f5d0c2bdeb7a45fa7382ccd58c9b994c","user":{"login":"ryanofsky","id":7133040,"node_id":"MDQ6VXNlcjcxMzMwNDA=","avatar_url":"https://avatars2.githubusercontent.com/u/7133040?v=4","gravatar_id":"","url":"https://api.github.com/users/ryanofsky","html_url":"https://github.com/ryanofsky","followers_url":"https://api.github.com/users/ryanofsky/followers","following_url":"https://api.github.com/users/ryanofsky/following{/other_user}","gists_url":"https://api.github.com/users/ryanofsky/gists{/gist_id}","starred_url":"https://api.github.com/users/ryanofsky/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ryanofsky/subscriptions","organizations_url":"https://api.github.com/users/ryanofsky/orgs","repos_url":"https://api.github.com/users/ryanofsky/repos","events_url":"https://api.github.com/users/ryanofsky/events{/privacy}","received_events_url":"https://api.github.com/users/ryanofsky/received_events","type":"User","site_admin":false},"repo":{"id":69901633,"node_id":"MDEwOlJlcG9zaXRvcnk2OTkwMTYzMw==","name":"bitcoin","full_name":"ryanofsky/bitcoin","private":false,"owner":{"login":"ryanofsky","id":7133040,"node_id":"MDQ6VXNlcjcxMzMwNDA=","avatar_url":"https://avatars2.githubusercontent.com/u/7133040?v=4","gravatar_id":"","url":"https://api.github.com/users/ryanofsky","html_url":"https://github.com/ryanofsky","followers_url":"https://api.github.com/users/ryanofsky/followers","following_url":"https://api.github.com/users/ryanofsky/following{/other_user}","gists_url":"https://api.github.com/users/ryanofsky/gists{/gist_id}","starred_url":"https://api.github.com/users/ryanofsky/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ryanofsky/subscriptions","organizations_url":"https://api.github.com/users/ryanofsky/orgs","repos_url":"https://api.github.com/users/ryanofsky/repos","events_url":"https://api.github.com/users/ryanofsky/events{/privacy}","received_events_url":"https://api.github.com/users/ryanofsky/received_events","type":"User","site_admin":false},"html_url":"https://github.com/ryanofsky/bitcoin","description":"Bitcoin Core integration/staging tree","fork":true,"url":"https://api.github.com/repos/ryanofsky/bitcoin","forks_url":"https://api.github.com/repos/ryanofsky/bitcoin/forks","keys_url":"https://api.github.com/repos/ryanofsky/bitcoin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ryanofsky/bitcoin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ryanofsky/bitcoin/teams","hooks_url":"https://api.github.com/repos/ryanofsky/bitcoin/hooks","issue_events_url":"https://api.github.com/repos/ryanofsky/bitcoin/issues/events{/number}","events_url":"https://api.github.com/repos/ryanofsky/bitcoin/events","assignees_url":"https://api.github.com/repos/ryanofsky/bitcoin/assignees{/user}","branches_url":"https://api.github.com/repos/ryanofsky/bitcoin/branches{/branch}","tags_url":"https://api.github.com/repos/ryanofsky/bitcoin/tags","blobs_url":"https://api.github.com/repos/ryanofsky/bitcoin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ryanofsky/bitcoin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ryanofsky/bitcoin/git/refs{/sha}","trees_url":"https://api.github.com/repos/ryanofsky/bitcoin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ryanofsky/bitcoin/statuses/{sha}","languages_url":"https://api.github.com/repos/ryanofsky/bitcoin/languages","stargazers_url":"https://api.github.com/repos/ryanofsky/bitcoin/stargazers","contributors_url":"https://api.github.com/repos/ryanofsky/bitcoin/contributors","subscribers_url":"https://api.github.com/repos/ryanofsky/bitcoin/subscribers","subscription_url":"https://api.github.com/repos/ryanofsky/bitcoin/subscription","commits_url":"https://api.github.com/repos/ryanofsky/bitcoin/commits{/sha}","git_commits_url":"https://api.github.com/repos/ryanofsky/bitcoin/git/commits{/sha}","comments_url":"https://api.github.com/repos/ryanofsky/bitcoin/comments{/number}","issue_comment_url":"https://api.github.com/repos/ryanofsky/bitcoin/issues/comments{/number}","contents_url":"https://api.github.com/repos/ryanofsky/bitcoin/contents/{+path}","compare_url":"https://api.github.com/repos/ryanofsky/bitcoin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ryanofsky/bitcoin/merges","archive_url":"https://api.github.com/repos/ryanofsky/bitcoin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ryanofsky/bitcoin/downloads","issues_url":"https://api.github.com/repos/ryanofsky/bitcoin/issues{/number}","pulls_url":"https://api.github.com/repos/ryanofsky/bitcoin/pulls{/number}","milestones_url":"https://api.github.com/repos/ryanofsky/bitcoin/milestones{/number}","notifications_url":"https://api.github.com/repos/ryanofsky/bitcoin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ryanofsky/bitcoin/labels{/name}","releases_url":"https://api.github.com/repos/ryanofsky/bitcoin/releases{/id}","deployments_url":"https://api.github.com/repos/ryanofsky/bitcoin/deployments","created_at":"2016-10-03T19:05:43Z","updated_at":"2018-08-21T18:59:08Z","pushed_at":"2018-10-10T06:28:48Z","git_url":"git://github.com/ryanofsky/bitcoin.git","ssh_url":"git@github.com:ryanofsky/bitcoin.git","clone_url":"https://github.com/ryanofsky/bitcoin.git","svn_url":"https://github.com/ryanofsky/bitcoin","homepage":"https://bitcoin.org/en/download","size":115268,"stargazers_count":2,"watchers_count":2,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":2,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"bitcoin:master","ref":"master","sha":"d799efe21432ad55c41d5315f24c002bc8b3d119","user":{"login":"bitcoin","id":528860,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUyODg2MA==","avatar_url":"https://avatars2.githubusercontent.com/u/528860?v=4","gravatar_id":"","url":"https://api.github.com/users/bitcoin","html_url":"https://github.com/bitcoin","followers_url":"https://api.github.com/users/bitcoin/followers","following_url":"https://api.github.com/users/bitcoin/following{/other_user}","gists_url":"https://api.github.com/users/bitcoin/gists{/gist_id}","starred_url":"https://api.github.com/users/bitcoin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bitcoin/subscriptions","organizations_url":"https://api.github.com/users/bitcoin/orgs","repos_url":"https://api.github.com/users/bitcoin/repos","events_url":"https://api.github.com/users/bitcoin/events{/privacy}","received_events_url":"https://api.github.com/users/bitcoin/received_events","type":"Organization","site_admin":false},"repo":{"id":1181927,"node_id":"MDEwOlJlcG9zaXRvcnkxMTgxOTI3","name":"bitcoin","full_name":"bitcoin/bitcoin","private":false,"owner":{"login":"bitcoin","id":528860,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUyODg2MA==","avatar_url":"https://avatars2.githubusercontent.com/u/528860?v=4","gravatar_id":"","url":"https://api.github.com/users/bitcoin","html_url":"https://github.com/bitcoin","followers_url":"https://api.github.com/users/bitcoin/followers","following_url":"https://api.github.com/users/bitcoin/following{/other_user}","gists_url":"https://api.github.com/users/bitcoin/gists{/gist_id}","starred_url":"https://api.github.com/users/bitcoin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bitcoin/subscriptions","organizations_url":"https://api.github.com/users/bitcoin/orgs","repos_url":"https://api.github.com/users/bitcoin/repos","events_url":"https://api.github.com/users/bitcoin/events{/privacy}","received_events_url":"https://api.github.com/users/bitcoin/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/bitcoin/bitcoin","description":"Bitcoin Core integration/staging tree","fork":false,"url":"https://api.github.com/repos/bitcoin/bitcoin","forks_url":"https://api.github.com/repos/bitcoin/bitcoin/forks","keys_url":"https://api.github.com/repos/bitcoin/bitcoin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bitcoin/bitcoin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bitcoin/bitcoin/teams","hooks_url":"https://api.github.com/repos/bitcoin/bitcoin/hooks","issue_events_url":"https://api.github.com/repos/bitcoin/bitcoin/issues/events{/number}","events_url":"https://api.github.com/repos/bitcoin/bitcoin/events","assignees_url":"https://api.github.com/repos/bitcoin/bitcoin/assignees{/user}","branches_url":"https://api.github.com/repos/bitcoin/bitcoin/branches{/branch}","tags_url":"https://api.github.com/repos/bitcoin/bitcoin/tags","blobs_url":"https://api.github.com/repos/bitcoin/bitcoin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bitcoin/bitcoin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bitcoin/bitcoin/git/refs{/sha}","trees_url":"https://api.github.com/repos/bitcoin/bitcoin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bitcoin/bitcoin/statuses/{sha}","languages_url":"https://api.github.com/repos/bitcoin/bitcoin/languages","stargazers_url":"https://api.github.com/repos/bitcoin/bitcoin/stargazers","contributors_url":"https://api.github.com/repos/bitcoin/bitcoin/contributors","subscribers_url":"https://api.github.com/repos/bitcoin/bitcoin/subscribers","subscription_url":"https://api.github.com/repos/bitcoin/bitcoin/subscription","commits_url":"https://api.github.com/repos/bitcoin/bitcoin/commits{/sha}","git_commits_url":"https://api.github.com/repos/bitcoin/bitcoin/git/commits{/sha}","comments_url":"https://api.github.com/repos/bitcoin/bitcoin/comments{/number}","issue_comment_url":"https://api.github.com/repos/bitcoin/bitcoin/issues/comments{/number}","contents_url":"https://api.github.com/repos/bitcoin/bitcoin/contents/{+path}","compare_url":"https://api.github.com/repos/bitcoin/bitcoin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bitcoin/bitcoin/merges","archive_url":"https://api.github.com/repos/bitcoin/bitcoin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bitcoin/bitcoin/downloads","issues_url":"https://api.github.com/repos/bitcoin/bitcoin/issues{/number}","pulls_url":"https://api.github.com/repos/bitcoin/bitcoin/pulls{/number}","milestones_url":"https://api.github.com/repos/bitcoin/bitcoin/milestones{/number}","notifications_url":"https://api.github.com/repos/bitcoin/bitcoin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bitcoin/bitcoin/labels{/name}","releases_url":"https://api.github.com/repos/bitcoin/bitcoin/releases{/id}","deployments_url":"https://api.github.com/repos/bitcoin/bitcoin/deployments","created_at":"2010-12-19T15:16:43Z","updated_at":"2018-10-11T04:17:57Z","pushed_at":"2018-10-11T02:14:09Z","git_url":"git://github.com/bitcoin/bitcoin.git","ssh_url":"git@github.com:bitcoin/bitcoin.git","clone_url":"https://github.com/bitcoin/bitcoin.git","svn_url":"https://github.com/bitcoin/bitcoin","homepage":"https://bitcoincore.org/en/download","size":114361,"stargazers_count":35234,"watchers_count":35234,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":21309,"mirror_url":null,"archived":false,"open_issues_count":884,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":21309,"open_issues":884,"watchers":35234,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/bitcoin/bitcoin/pulls/10443"},"html":{"href":"https://github.com/bitcoin/bitcoin/pull/10443"},"issue":{"href":"https://api.github.com/repos/bitcoin/bitcoin/issues/10443"},"comments":{"href":"https://api.github.com/repos/bitcoin/bitcoin/issues/10443/comments"},"review_comments":{"href":"https://api.github.com/repos/bitcoin/bitcoin/pulls/10443/comments"},"review_comment":{"href":"https://api.github.com/repos/bitcoin/bitcoin/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/bitcoin/bitcoin/pulls/10443/commits"},"statuses":{"href":"https://api.github.com/repos/bitcoin/bitcoin/statuses/56446378f5d0c2bdeb7a45fa7382ccd58c9b994c"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"practicalswift"}}