{"action":"created","comment":{"url":"https://api.github.com/repos/btcsuite/btcd/pulls/comments/75538250","id":75538250,"diff_hunk":"@@ -0,0 +1,434 @@\n+// Copyright (c) 2013-2016 The btcsuite developers\n+// Use of this source code is governed by an ISC\n+// license that can be found in the LICENSE file.\n+\n+package main\n+\n+import (\n+\t\"errors\"\n+\t\"fmt\"\n+\t\"math\"\n+\t\"math/rand\"\n+\t\"sort\"\n+\t\"sync\"\n+\n+\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n+\t\"github.com/btcsuite/btcutil\"\n+)\n+\n+const (\n+\t// estimateFeeDepth is the maximum number of blocks before a transaction\n+\t// is confirmed that we want to track.\n+\testimateFeeBins = 25\n+\n+\t// estimateFeeBinSize is the number of txs stored in each bin.\n+\testimateFeeBinSize = 100\n+\n+\t// estimateFeeMaxReplacements is the max number of replacements that\n+\t// can be made by the txs found in a given block.\n+\testimateFeeMaxReplacements = 10\n+)\n+\n+// observedTransaction represents an observed transaction and some\n+// additional data required for the fee estimation algorithm.\n+type observedTransaction struct {\n+\thash     chainhash.Hash // a transaction hash.\n+\tsize     uint32         // size in bytes.\n+\tfee      uint64         // miner's fee.\n+\tfeePerKb float64\n+\tobserved int32 // The block height when it was observed.\n+\tmined    int32 // The block in which this tx was mined.\n+}\n+\n+// registeredBlock\n+type registeredBlock struct {\n+\thash         *chainhash.Hash\n+\ttransactions []*observedTransaction\n+}\n+\n+// feeEstimator is a class that manages the data necessary to create\n+// fee estimations. It is safe for concurrent access.\n+type feeEstimator struct {\n+\tmaxRollback uint32\n+\tbinSize     int\n+\n+\t// The maximum number of replacements that can be made in a single\n+\t// bin per block. Default is estimateFeeMaxReplacements\n+\tmaxReplacements int\n+\n+\t// The minimum number of blocks that can be registered with the fee\n+\t// estimator before it will provide answers.\n+\tminRegisteredBlocks uint32\n+\n+\t// The last known height.\n+\tlastKnownHeight int32\n+\n+\tsync.RWMutex\n+\tobserved            map[chainhash.Hash]observedTransaction\n+\tbin                 [estimateFeeBins][]*observedTransaction\n+\tnumBlocksRegistered uint32 // The number of blocks that have been registered.\n+\n+\t// The cached estimates.\n+\tcached []float64\n+\n+\t// Transactions that have been removed from the bins. This allows us to\n+\t// revert in case of an orphaned block.\n+\tdropped []registeredBlock\n+}\n+\n+// newFeeEstimator creates a feeEstimator for which at most maxRollback blocks\n+// can be unregistered and which returns an error unless minRegisteredBlocks\n+// have been registered with it.\n+func newFeeEstimator(maxRollback, minRegisteredBlocks uint32) *feeEstimator {\n+\treturn &feeEstimator{\n+\t\tmaxRollback:         maxRollback,\n+\t\tminRegisteredBlocks: minRegisteredBlocks,\n+\t\tlastKnownHeight:     mempoolHeight,\n+\t\tbinSize:             estimateFeeBinSize,\n+\t\tmaxReplacements:     estimateFeeMaxReplacements,\n+\t\tobserved:            make(map[chainhash.Hash]observedTransaction),\n+\t\tdropped:             make([]registeredBlock, 0, maxRollback),\n+\t}\n+}\n+\n+// ObserveTransaction is called when a new transaction is observed in the mempool.\n+func (ef *feeEstimator) ObserveTransaction(t *mempoolTxDesc) {\n+\tef.Lock()\n+\tdefer ef.Unlock()\n+\n+\thash := *t.Tx.Hash()\n+\tif _, ok := ef.observed[hash]; !ok {\n+\t\tsize := uint32(t.Tx.MsgTx().SerializeSize())\n+\t\tfee := uint64(t.Fee)\n+\n+\t\tef.observed[hash] = observedTransaction{\n+\t\t\thash:     hash,\n+\t\t\tsize:     size,\n+\t\t\tfee:      fee,\n+\t\t\tfeePerKb: float64(1000*fee) / float64(size),\n+\t\t\tobserved: t.Height,\n+\t\t\tmined:    mempoolHeight,\n+\t\t}\n+\t}\n+}\n+\n+// RegisterBlock informs the fee estimator of a new block to take into account.\n+func (ef *feeEstimator) RecordBlock(block *btcutil.Block) {\n+\tef.Lock()\n+\tdefer ef.Unlock()\n+\n+\t// The previous sorted list is invalid, so delete it.\n+\tef.cached = nil\n+\n+\theight := block.Height()\n+\tif height != ef.lastKnownHeight+1 && ef.lastKnownHeight != mempoolHeight {\n+\t\tpanic(fmt.Sprint(\"intermediate block not recorded; current height is \", ef.lastKnownHeight,\n+\t\t\t\"; new height is \", height))\n+\t}\n+\n+\t// Update the last known height.\n+\tef.lastKnownHeight = height\n+\tef.numBlocksRegistered++\n+\n+\t// Randomly order txs in block.\n+\ttransactions := make(map[*btcutil.Tx]struct{})\n+\tfor _, t := range block.Transactions() {\n+\t\ttransactions[t] = struct{}{}\n+\t}\n+\n+\t// Count the number of replacements we make per bin so that we don't\n+\t// replace too many.\n+\tvar replacementCounts [estimateFeeBins]int\n+\n+\t// Keep track of which txs were dropped in case of an orphan block.\n+\tdropped := registeredBlock{\n+\t\thash:         block.Hash(),\n+\t\ttransactions: make([]*observedTransaction, 0, 100),\n+\t}\n+\n+\t// Go through the txs in the block.\n+\tfor t := range transactions {\n+\t\thash := *t.Hash()\n+\n+\t\t// Have we observed this tx in the mempool?\n+\t\to, ok := ef.observed[hash]\n+\t\tif !ok {\n+\t\t\tcontinue\n+\t\t}\n+\n+\t\t// Put the observed tx in the oppropriate bin.\n+\t\to.mined = height\n+\n+\t\tblocksToConfirm := height - o.observed - 1\n+\n+\t\t// Make sure we do not replace too many transactions per min.\n+\t\tif replacementCounts[blocksToConfirm] == ef.maxReplacements {\n+\t\t\tcontinue\n+\t\t}\n+\n+\t\treplacementCounts[blocksToConfirm]++\n+\n+\t\tbin := ef.bin[blocksToConfirm]\n+\n+\t\t// Remove a random element and replace it with this new tx.\n+\t\tif len(bin) == int(ef.binSize) {","path":"estimatefee.go","position":174,"original_position":174,"commit_id":"a65d71ad10210f5ffec62cda78a682b11d9548dc","original_commit_id":"a65d71ad10210f5ffec62cda78a682b11d9548dc","user":{"login":"davecgh","id":2115102,"avatar_url":"https://avatars.githubusercontent.com/u/2115102?v=3","gravatar_id":"","url":"https://api.github.com/users/davecgh","html_url":"https://github.com/davecgh","followers_url":"https://api.github.com/users/davecgh/followers","following_url":"https://api.github.com/users/davecgh/following{/other_user}","gists_url":"https://api.github.com/users/davecgh/gists{/gist_id}","starred_url":"https://api.github.com/users/davecgh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davecgh/subscriptions","organizations_url":"https://api.github.com/users/davecgh/orgs","repos_url":"https://api.github.com/users/davecgh/repos","events_url":"https://api.github.com/users/davecgh/events{/privacy}","received_events_url":"https://api.github.com/users/davecgh/received_events","type":"User","site_admin":false},"body":"` ef.binSize` is already an int.  No need to cast it.","created_at":"2016-08-19T19:23:17Z","updated_at":"2016-08-19T19:23:17Z","html_url":"https://github.com/btcsuite/btcd/pull/735#discussion_r75538250","pull_request_url":"https://api.github.com/repos/btcsuite/btcd/pulls/735","_links":{"self":{"href":"https://api.github.com/repos/btcsuite/btcd/pulls/comments/75538250"},"html":{"href":"https://github.com/btcsuite/btcd/pull/735#discussion_r75538250"},"pull_request":{"href":"https://api.github.com/repos/btcsuite/btcd/pulls/735"}}},"pull_request":{"url":"https://api.github.com/repos/btcsuite/btcd/pulls/735","id":81209193,"html_url":"https://github.com/btcsuite/btcd/pull/735","diff_url":"https://github.com/btcsuite/btcd/pull/735.diff","patch_url":"https://github.com/btcsuite/btcd/pull/735.patch","issue_url":"https://api.github.com/repos/btcsuite/btcd/issues/735","number":735,"state":"open","locked":false,"title":"rpc method estimatefee","user":{"login":"DanielKrawisz","id":4990891,"avatar_url":"https://avatars.githubusercontent.com/u/4990891?v=3","gravatar_id":"","url":"https://api.github.com/users/DanielKrawisz","html_url":"https://github.com/DanielKrawisz","followers_url":"https://api.github.com/users/DanielKrawisz/followers","following_url":"https://api.github.com/users/DanielKrawisz/following{/other_user}","gists_url":"https://api.github.com/users/DanielKrawisz/gists{/gist_id}","starred_url":"https://api.github.com/users/DanielKrawisz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DanielKrawisz/subscriptions","organizations_url":"https://api.github.com/users/DanielKrawisz/orgs","repos_url":"https://api.github.com/users/DanielKrawisz/repos","events_url":"https://api.github.com/users/DanielKrawisz/events{/privacy}","received_events_url":"https://api.github.com/users/DanielKrawisz/received_events","type":"User","site_admin":false},"body":"This pr implements estimatefee similar to the way it works in Bitcoin Core, as described [here](https://github.com/bitcoin/bitcoin/pull/3959). estimatefee allows for one parameter, NumBlocks. It attempts to provide an estimated fee / kb rate (in Bitcoins) for a transaction to be confirmed before at least NumBlocks (inclusive) have been mined. \r\n\r\nEvery time a transaction is added to the mempool, it is registered with the fee estimator. Every time a new block is received, it is also registered with the fee estimator. The fee estimator keeps 25 bins containing information on transactions for which 1 to 25 blocks have been mined before being put in a block. Each bin contains information on up to 100 transactions. \r\n\r\nLet m be a bijective map from all sots in all bins to the set if indices from 1 to N, where N is the number of transactions in all bins. m maps the first slot in the first bin to 1, the second to 2, and so on, all the way through all the bins. The value returned by estimatefee is the fee / kb value of the transactions whose index in a sorted list of all transactions (with the highest value first) is the same as m[s], where s is the middle slot in bin NumBlocks. estimatefee therefore is a monotonically decreasing function of NumBlocks. \r\n\r\nIt is also possible to rollback the effect of a limited number of blocks in case of orphans. Default number of rollbacks allowed is 2. \r\n\r\nSince it is very easy to store 25 values, all results for all values of NumBlocks are cached when estimatefee is first called. Each time a new block is registered or rolled back, the cache is deleted. \r\n\r\nIn core, the set of observed transactions is saved between sessions in a file that also contains mempool transactions. btcd doesn't seem to have a similar file, so fee estimation starts over if the program restarts. ","created_at":"2016-08-13T06:55:16Z","updated_at":"2016-08-19T19:23:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b3646ec7d8a60b0aa906c399fe69a65cdbbf19fa","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/btcsuite/btcd/pulls/735/commits","review_comments_url":"https://api.github.com/repos/btcsuite/btcd/pulls/735/comments","review_comment_url":"https://api.github.com/repos/btcsuite/btcd/pulls/comments{/number}","comments_url":"https://api.github.com/repos/btcsuite/btcd/issues/735/comments","statuses_url":"https://api.github.com/repos/btcsuite/btcd/statuses/a65d71ad10210f5ffec62cda78a682b11d9548dc","head":{"label":"DanielKrawisz:estimatefee","ref":"estimatefee","sha":"a65d71ad10210f5ffec62cda78a682b11d9548dc","user":{"login":"DanielKrawisz","id":4990891,"avatar_url":"https://avatars.githubusercontent.com/u/4990891?v=3","gravatar_id":"","url":"https://api.github.com/users/DanielKrawisz","html_url":"https://github.com/DanielKrawisz","followers_url":"https://api.github.com/users/DanielKrawisz/followers","following_url":"https://api.github.com/users/DanielKrawisz/following{/other_user}","gists_url":"https://api.github.com/users/DanielKrawisz/gists{/gist_id}","starred_url":"https://api.github.com/users/DanielKrawisz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DanielKrawisz/subscriptions","organizations_url":"https://api.github.com/users/DanielKrawisz/orgs","repos_url":"https://api.github.com/users/DanielKrawisz/repos","events_url":"https://api.github.com/users/DanielKrawisz/events{/privacy}","received_events_url":"https://api.github.com/users/DanielKrawisz/received_events","type":"User","site_admin":false},"repo":{"id":32612344,"name":"btcd","full_name":"DanielKrawisz/btcd","owner":{"login":"DanielKrawisz","id":4990891,"avatar_url":"https://avatars.githubusercontent.com/u/4990891?v=3","gravatar_id":"","url":"https://api.github.com/users/DanielKrawisz","html_url":"https://github.com/DanielKrawisz","followers_url":"https://api.github.com/users/DanielKrawisz/followers","following_url":"https://api.github.com/users/DanielKrawisz/following{/other_user}","gists_url":"https://api.github.com/users/DanielKrawisz/gists{/gist_id}","starred_url":"https://api.github.com/users/DanielKrawisz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DanielKrawisz/subscriptions","organizations_url":"https://api.github.com/users/DanielKrawisz/orgs","repos_url":"https://api.github.com/users/DanielKrawisz/repos","events_url":"https://api.github.com/users/DanielKrawisz/events{/privacy}","received_events_url":"https://api.github.com/users/DanielKrawisz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/DanielKrawisz/btcd","description":"An alternative full node bitcoin implementation written in Go (golang)","fork":true,"url":"https://api.github.com/repos/DanielKrawisz/btcd","forks_url":"https://api.github.com/repos/DanielKrawisz/btcd/forks","keys_url":"https://api.github.com/repos/DanielKrawisz/btcd/keys{/key_id}","collaborators_url":"https://api.github.com/repos/DanielKrawisz/btcd/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/DanielKrawisz/btcd/teams","hooks_url":"https://api.github.com/repos/DanielKrawisz/btcd/hooks","issue_events_url":"https://api.github.com/repos/DanielKrawisz/btcd/issues/events{/number}","events_url":"https://api.github.com/repos/DanielKrawisz/btcd/events","assignees_url":"https://api.github.com/repos/DanielKrawisz/btcd/assignees{/user}","branches_url":"https://api.github.com/repos/DanielKrawisz/btcd/branches{/branch}","tags_url":"https://api.github.com/repos/DanielKrawisz/btcd/tags","blobs_url":"https://api.github.com/repos/DanielKrawisz/btcd/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/DanielKrawisz/btcd/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/DanielKrawisz/btcd/git/refs{/sha}","trees_url":"https://api.github.com/repos/DanielKrawisz/btcd/git/trees{/sha}","statuses_url":"https://api.github.com/repos/DanielKrawisz/btcd/statuses/{sha}","languages_url":"https://api.github.com/repos/DanielKrawisz/btcd/languages","stargazers_url":"https://api.github.com/repos/DanielKrawisz/btcd/stargazers","contributors_url":"https://api.github.com/repos/DanielKrawisz/btcd/contributors","subscribers_url":"https://api.github.com/repos/DanielKrawisz/btcd/subscribers","subscription_url":"https://api.github.com/repos/DanielKrawisz/btcd/subscription","commits_url":"https://api.github.com/repos/DanielKrawisz/btcd/commits{/sha}","git_commits_url":"https://api.github.com/repos/DanielKrawisz/btcd/git/commits{/sha}","comments_url":"https://api.github.com/repos/DanielKrawisz/btcd/comments{/number}","issue_comment_url":"https://api.github.com/repos/DanielKrawisz/btcd/issues/comments{/number}","contents_url":"https://api.github.com/repos/DanielKrawisz/btcd/contents/{+path}","compare_url":"https://api.github.com/repos/DanielKrawisz/btcd/compare/{base}...{head}","merges_url":"https://api.github.com/repos/DanielKrawisz/btcd/merges","archive_url":"https://api.github.com/repos/DanielKrawisz/btcd/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/DanielKrawisz/btcd/downloads","issues_url":"https://api.github.com/repos/DanielKrawisz/btcd/issues{/number}","pulls_url":"https://api.github.com/repos/DanielKrawisz/btcd/pulls{/number}","milestones_url":"https://api.github.com/repos/DanielKrawisz/btcd/milestones{/number}","notifications_url":"https://api.github.com/repos/DanielKrawisz/btcd/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/DanielKrawisz/btcd/labels{/name}","releases_url":"https://api.github.com/repos/DanielKrawisz/btcd/releases{/id}","deployments_url":"https://api.github.com/repos/DanielKrawisz/btcd/deployments","created_at":"2015-03-20T23:31:35Z","updated_at":"2015-04-17T15:02:44Z","pushed_at":"2016-08-13T08:54:23Z","git_url":"git://github.com/DanielKrawisz/btcd.git","ssh_url":"git@github.com:DanielKrawisz/btcd.git","clone_url":"https://github.com/DanielKrawisz/btcd.git","svn_url":"https://github.com/DanielKrawisz/btcd","homepage":null,"size":11046,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"btcsuite:master","ref":"master","sha":"cee207c64caee6b2471ab73dce0b11c8762346cb","user":{"login":"btcsuite","id":10235229,"avatar_url":"https://avatars.githubusercontent.com/u/10235229?v=3","gravatar_id":"","url":"https://api.github.com/users/btcsuite","html_url":"https://github.com/btcsuite","followers_url":"https://api.github.com/users/btcsuite/followers","following_url":"https://api.github.com/users/btcsuite/following{/other_user}","gists_url":"https://api.github.com/users/btcsuite/gists{/gist_id}","starred_url":"https://api.github.com/users/btcsuite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/btcsuite/subscriptions","organizations_url":"https://api.github.com/users/btcsuite/orgs","repos_url":"https://api.github.com/users/btcsuite/repos","events_url":"https://api.github.com/users/btcsuite/events{/privacy}","received_events_url":"https://api.github.com/users/btcsuite/received_events","type":"Organization","site_admin":false},"repo":{"id":11931032,"name":"btcd","full_name":"btcsuite/btcd","owner":{"login":"btcsuite","id":10235229,"avatar_url":"https://avatars.githubusercontent.com/u/10235229?v=3","gravatar_id":"","url":"https://api.github.com/users/btcsuite","html_url":"https://github.com/btcsuite","followers_url":"https://api.github.com/users/btcsuite/followers","following_url":"https://api.github.com/users/btcsuite/following{/other_user}","gists_url":"https://api.github.com/users/btcsuite/gists{/gist_id}","starred_url":"https://api.github.com/users/btcsuite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/btcsuite/subscriptions","organizations_url":"https://api.github.com/users/btcsuite/orgs","repos_url":"https://api.github.com/users/btcsuite/repos","events_url":"https://api.github.com/users/btcsuite/events{/privacy}","received_events_url":"https://api.github.com/users/btcsuite/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/btcsuite/btcd","description":"An alternative full node bitcoin implementation written in Go (golang)","fork":false,"url":"https://api.github.com/repos/btcsuite/btcd","forks_url":"https://api.github.com/repos/btcsuite/btcd/forks","keys_url":"https://api.github.com/repos/btcsuite/btcd/keys{/key_id}","collaborators_url":"https://api.github.com/repos/btcsuite/btcd/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/btcsuite/btcd/teams","hooks_url":"https://api.github.com/repos/btcsuite/btcd/hooks","issue_events_url":"https://api.github.com/repos/btcsuite/btcd/issues/events{/number}","events_url":"https://api.github.com/repos/btcsuite/btcd/events","assignees_url":"https://api.github.com/repos/btcsuite/btcd/assignees{/user}","branches_url":"https://api.github.com/repos/btcsuite/btcd/branches{/branch}","tags_url":"https://api.github.com/repos/btcsuite/btcd/tags","blobs_url":"https://api.github.com/repos/btcsuite/btcd/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/btcsuite/btcd/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/btcsuite/btcd/git/refs{/sha}","trees_url":"https://api.github.com/repos/btcsuite/btcd/git/trees{/sha}","statuses_url":"https://api.github.com/repos/btcsuite/btcd/statuses/{sha}","languages_url":"https://api.github.com/repos/btcsuite/btcd/languages","stargazers_url":"https://api.github.com/repos/btcsuite/btcd/stargazers","contributors_url":"https://api.github.com/repos/btcsuite/btcd/contributors","subscribers_url":"https://api.github.com/repos/btcsuite/btcd/subscribers","subscription_url":"https://api.github.com/repos/btcsuite/btcd/subscription","commits_url":"https://api.github.com/repos/btcsuite/btcd/commits{/sha}","git_commits_url":"https://api.github.com/repos/btcsuite/btcd/git/commits{/sha}","comments_url":"https://api.github.com/repos/btcsuite/btcd/comments{/number}","issue_comment_url":"https://api.github.com/repos/btcsuite/btcd/issues/comments{/number}","contents_url":"https://api.github.com/repos/btcsuite/btcd/contents/{+path}","compare_url":"https://api.github.com/repos/btcsuite/btcd/compare/{base}...{head}","merges_url":"https://api.github.com/repos/btcsuite/btcd/merges","archive_url":"https://api.github.com/repos/btcsuite/btcd/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/btcsuite/btcd/downloads","issues_url":"https://api.github.com/repos/btcsuite/btcd/issues{/number}","pulls_url":"https://api.github.com/repos/btcsuite/btcd/pulls{/number}","milestones_url":"https://api.github.com/repos/btcsuite/btcd/milestones{/number}","notifications_url":"https://api.github.com/repos/btcsuite/btcd/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/btcsuite/btcd/labels{/name}","releases_url":"https://api.github.com/repos/btcsuite/btcd/releases{/id}","deployments_url":"https://api.github.com/repos/btcsuite/btcd/deployments","created_at":"2013-08-06T18:10:52Z","updated_at":"2016-08-16T10:26:59Z","pushed_at":"2016-08-19T17:40:25Z","git_url":"git://github.com/btcsuite/btcd.git","ssh_url":"git@github.com:btcsuite/btcd.git","clone_url":"https://github.com/btcsuite/btcd.git","svn_url":"https://github.com/btcsuite/btcd","homepage":"https://github.com/btcsuite/btcd/blob/master/docs/README.md","size":17545,"stargazers_count":912,"watchers_count":912,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":242,"mirror_url":null,"open_issues_count":66,"forks":242,"open_issues":66,"watchers":912,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/btcsuite/btcd/pulls/735"},"html":{"href":"https://github.com/btcsuite/btcd/pull/735"},"issue":{"href":"https://api.github.com/repos/btcsuite/btcd/issues/735"},"comments":{"href":"https://api.github.com/repos/btcsuite/btcd/issues/735/comments"},"review_comments":{"href":"https://api.github.com/repos/btcsuite/btcd/pulls/735/comments"},"review_comment":{"href":"https://api.github.com/repos/btcsuite/btcd/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/btcsuite/btcd/pulls/735/commits"},"statuses":{"href":"https://api.github.com/repos/btcsuite/btcd/statuses/a65d71ad10210f5ffec62cda78a682b11d9548dc"}}}}
{"actor":{"display_login":"davecgh"}}