{"action":"created","comment":{"url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/pulls/comments/293727507","pull_request_review_id":249759477,"id":293727507,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI5MzcyNzUwNw==","diff_hunk":"@@ -0,0 +1,224 @@\n+package org.bitcoins.core.gcs\n+\n+import org.bitcoins.core.number.{UInt64, UInt8}\n+import org.bitcoins.core.protocol.CompactSizeUInt\n+import org.bouncycastle.crypto.macs.SipHash\n+import org.bouncycastle.crypto.params.KeyParameter\n+import scodec.bits.{BitVector, ByteVector}\n+\n+import scala.annotation.tailrec\n+\n+// TODO: Replace ByteVector with a type for keys\n+/**\n+  * Defines all functionality dealing with Golomb-Coded Sets\n+  * @see [[https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki#GolombCoded_Sets]]\n+  */\n+object GCS {\n+\n+  /**\n+    * Given parameters and data, golomb-encodes the data\n+    * @see [[https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki#set-construction]]\n+    */\n+  def buildGCS(\n+      data: Vector[ByteVector],\n+      key: ByteVector,\n+      p: UInt8,\n+      m: UInt64): BitVector = {\n+    val hashedValues = hashedSetConstruct(data, key, m)\n+    val sortedHashedValues = hashedValues.sortWith(_ < _)\n+    encodeSortedSet(sortedHashedValues, p)\n+  }\n+\n+  /**\n+    * Given parameters and data, constructs a GolombFilter for that data\n+    */\n+  def buildGolombFilter(\n+      data: Vector[ByteVector],\n+      key: ByteVector,\n+      p: UInt8,\n+      m: UInt64): GolombFilter = {\n+    val encodedData = buildGCS(data, key, p, m)\n+\n+    GolombFilter(key, m, p, CompactSizeUInt(UInt64(data.length)), encodedData)\n+  }\n+\n+  /**\n+    * Given data, constructs a GolombFilter for that data using Basic Block Filter parameters\n+    * @see [[https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki#block-filters]]\n+    */\n+  def buildBasicBlockFilter(\n+      data: Vector[ByteVector],\n+      key: ByteVector): GolombFilter = {\n+    buildGolombFilter(data, key, BlockFilter.P, BlockFilter.M)\n+  }\n+\n+  private def sipHash(item: ByteVector, key: ByteVector): UInt64 = {\n+    // https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki#hashing-data-objects\n+    val sipHashCParam = 2\n+    val sipHashDParam = 4\n+\n+    val sh = new SipHash(sipHashCParam, sipHashDParam)\n+\n+    val keyParam = new KeyParameter(key.toArray)\n+\n+    sh.init(keyParam)\n+\n+    sh.update(item.toArray, 0, item.length.toInt)\n+\n+    val digest = sh.doFinal()\n+\n+    UInt64.fromHex(digest.toHexString)\n+  }\n+\n+  /**\n+    * Hashes the item to the range [0, f)\n+    * @see [[https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki#hashing-data-objects]]\n+    */\n+  def hashToRange(item: ByteVector, f: UInt64, key: ByteVector): UInt64 = {\n+    val hash = sipHash(item, key)\n+\n+    val bigInt = (hash.toBigInt * f.toBigInt) >> 64\n+\n+    UInt64(bigInt)\n+  }\n+\n+  /**\n+    * Hashes the items of a set of items\n+    * @see [[https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki#hashing-data-objects]]\n+    */\n+  def hashedSetConstruct(\n+      rawItems: Vector[ByteVector],\n+      key: ByteVector,\n+      m: UInt64): Vector[UInt64] = {\n+    val n = rawItems.length\n+    val f = m * n\n+\n+    val hashedItemsBuilder = Vector.newBuilder[UInt64]\n+\n+    rawItems.foreach { item =>\n+      val setValue = hashToRange(item, f, key)\n+      hashedItemsBuilder.+=(setValue)\n+    }\n+\n+    hashedItemsBuilder.result()\n+  }\n+\n+  /**\n+    * Converts num to unary (6 = 1111110)\n+    * @see [[https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki#golomb-rice-coding]]\n+    *\n+    * TODO: protect against large inputs which cause OutOfMemoryErrors and even larger ones which fail on toInt\n+    */\n+  def toUnary(num: UInt64): BitVector = {\n+    if (num == UInt64.zero) {\n+      BitVector.bits(Vector(false))\n+    } else {\n+      /*\n+       * We use the fact that 2^n - 1 = 111...1 (in binary) where there are n 1 digits\n+       */\n+      val binUnary = (BigInt(1) << num.toInt) - 1\n+      val leftPadded = BitVector(binUnary.toByteArray)\n+      val noPadding = dropLeftPadding(leftPadded)\n+\n+      noPadding.:+(false)\n+    }\n+  }\n+\n+  /**\n+    * Encodes a hash into a unary prefix and binary suffix\n+    * @see [[https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki#golomb-rice-coding]]\n+    */\n+  def golombEncode(item: UInt64, p: UInt8): BitVector = {\n+    val q = item >> p.toInt\n+\n+    val prefix = toUnary(q)\n+\n+    val pBits = item.bytes.toBitVector.takeRight(p.toInt)\n+\n+    prefix ++ pBits\n+  }\n+\n+  /**\n+    * Decodes an item off of the front of a BitVector by reversing [[GCS.golombEncode]]\n+    * @see [[https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki#golomb-rice-coding]]\n+    */\n+  def golombDecode(codedItem: BitVector, p: UInt8): UInt64 = {\n+    @tailrec\n+    def split(vec: BitVector, accum: UInt64): (UInt64, BitVector) = {\n+      if (vec.head) {\n+        split(vec.tail, accum + UInt64.one)\n+      } else {\n+        (accum, vec.tail)\n+      }\n+    }\n+\n+    val (q, pBits) = split(codedItem, UInt64.zero)\n+\n+    val sizeWithPadding = (8 - (p.toInt % 8)) + p.toInt\n+\n+    val pBitsAsBytes = {\n+      val withoutRightPaddingOrData = pBits.take(p.toInt)\n+      val withLeftPadding = withoutRightPaddingOrData.padLeft(sizeWithPadding)\n+      withLeftPadding.toByteVector\n+    }\n+\n+    (q << p.toInt) + UInt64.fromBytes(pBitsAsBytes)\n+  }\n+\n+  @tailrec\n+  private def dropLeftPadding(padded: BitVector): BitVector = {\n+    if (padded.isEmpty || padded.head) {\n+      padded\n+    } else {\n+      dropLeftPadding(padded.tail)\n+    }\n+  }\n+\n+  private def golombDecodeItemFromSet(","path":"core/src/main/scala/org/bitcoins/core/gcs/GCS.scala","position":177,"original_position":177,"commit_id":"e34643b12c69136e6d54e613cd8964365425ee47","original_commit_id":"e34643b12c69136e6d54e613cd8964365425ee47","user":{"login":"torkelrogstad","id":16610775,"node_id":"MDQ6VXNlcjE2NjEwNzc1","avatar_url":"https://avatars2.githubusercontent.com/u/16610775?v=4","gravatar_id":"","url":"https://api.github.com/users/torkelrogstad","html_url":"https://github.com/torkelrogstad","followers_url":"https://api.github.com/users/torkelrogstad/followers","following_url":"https://api.github.com/users/torkelrogstad/following{/other_user}","gists_url":"https://api.github.com/users/torkelrogstad/gists{/gist_id}","starred_url":"https://api.github.com/users/torkelrogstad/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/torkelrogstad/subscriptions","organizations_url":"https://api.github.com/users/torkelrogstad/orgs","repos_url":"https://api.github.com/users/torkelrogstad/repos","events_url":"https://api.github.com/users/torkelrogstad/events{/privacy}","received_events_url":"https://api.github.com/users/torkelrogstad/received_events","type":"User","site_admin":false},"body":"Looks like the `BitVector` returned is surplus bits. Could we add a one line scaladoc?","created_at":"2019-06-14T09:19:59Z","updated_at":"2019-06-14T09:32:23Z","html_url":"https://github.com/bitcoin-s/bitcoin-s/pull/481#discussion_r293727507","pull_request_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/pulls/481","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/bitcoin-s/bitcoin-s/pulls/comments/293727507"},"html":{"href":"https://github.com/bitcoin-s/bitcoin-s/pull/481#discussion_r293727507"},"pull_request":{"href":"https://api.github.com/repos/bitcoin-s/bitcoin-s/pulls/481"}}},"pull_request":{"url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/pulls/481","id":283011866,"node_id":"MDExOlB1bGxSZXF1ZXN0MjgzMDExODY2","html_url":"https://github.com/bitcoin-s/bitcoin-s/pull/481","diff_url":"https://github.com/bitcoin-s/bitcoin-s/pull/481.diff","patch_url":"https://github.com/bitcoin-s/bitcoin-s/pull/481.patch","issue_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/issues/481","number":481,"state":"open","locked":false,"title":"BIP 158 Golomb-Rice Coded Sets and block filters","user":{"login":"nkohen","id":22485603,"node_id":"MDQ6VXNlcjIyNDg1NjAz","avatar_url":"https://avatars2.githubusercontent.com/u/22485603?v=4","gravatar_id":"","url":"https://api.github.com/users/nkohen","html_url":"https://github.com/nkohen","followers_url":"https://api.github.com/users/nkohen/followers","following_url":"https://api.github.com/users/nkohen/following{/other_user}","gists_url":"https://api.github.com/users/nkohen/gists{/gist_id}","starred_url":"https://api.github.com/users/nkohen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nkohen/subscriptions","organizations_url":"https://api.github.com/users/nkohen/orgs","repos_url":"https://api.github.com/users/nkohen/repos","events_url":"https://api.github.com/users/nkohen/events{/privacy}","received_events_url":"https://api.github.com/users/nkohen/received_events","type":"User","site_admin":false},"body":"Implements BIP 158 Golomb-Rice Coded Sets and their corresponding block filters","created_at":"2019-05-28T21:56:38Z","updated_at":"2019-06-14T09:32:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"575a400520aa808846e4e6b536bbf6e6f9b6f368","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1323686553,"node_id":"MDU6TGFiZWwxMzIzNjg2NTUz","url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/labels/core","name":"core","color":"b60205","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/pulls/481/commits","review_comments_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/pulls/481/comments","review_comment_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/pulls/comments{/number}","comments_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/issues/481/comments","statuses_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/statuses/e34643b12c69136e6d54e613cd8964365425ee47","head":{"label":"nkohen:2019-05-28-bip158","ref":"2019-05-28-bip158","sha":"e34643b12c69136e6d54e613cd8964365425ee47","user":{"login":"nkohen","id":22485603,"node_id":"MDQ6VXNlcjIyNDg1NjAz","avatar_url":"https://avatars2.githubusercontent.com/u/22485603?v=4","gravatar_id":"","url":"https://api.github.com/users/nkohen","html_url":"https://github.com/nkohen","followers_url":"https://api.github.com/users/nkohen/followers","following_url":"https://api.github.com/users/nkohen/following{/other_user}","gists_url":"https://api.github.com/users/nkohen/gists{/gist_id}","starred_url":"https://api.github.com/users/nkohen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nkohen/subscriptions","organizations_url":"https://api.github.com/users/nkohen/orgs","repos_url":"https://api.github.com/users/nkohen/repos","events_url":"https://api.github.com/users/nkohen/events{/privacy}","received_events_url":"https://api.github.com/users/nkohen/received_events","type":"User","site_admin":false},"repo":{"id":134758462,"node_id":"MDEwOlJlcG9zaXRvcnkxMzQ3NTg0NjI=","name":"bitcoin-s-core","full_name":"nkohen/bitcoin-s-core","private":false,"owner":{"login":"nkohen","id":22485603,"node_id":"MDQ6VXNlcjIyNDg1NjAz","avatar_url":"https://avatars2.githubusercontent.com/u/22485603?v=4","gravatar_id":"","url":"https://api.github.com/users/nkohen","html_url":"https://github.com/nkohen","followers_url":"https://api.github.com/users/nkohen/followers","following_url":"https://api.github.com/users/nkohen/following{/other_user}","gists_url":"https://api.github.com/users/nkohen/gists{/gist_id}","starred_url":"https://api.github.com/users/nkohen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nkohen/subscriptions","organizations_url":"https://api.github.com/users/nkohen/orgs","repos_url":"https://api.github.com/users/nkohen/repos","events_url":"https://api.github.com/users/nkohen/events{/privacy}","received_events_url":"https://api.github.com/users/nkohen/received_events","type":"User","site_admin":false},"html_url":"https://github.com/nkohen/bitcoin-s-core","description":"Bitcoin Implementation in Scala (core module)","fork":true,"url":"https://api.github.com/repos/nkohen/bitcoin-s-core","forks_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/forks","keys_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/teams","hooks_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/hooks","issue_events_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/issues/events{/number}","events_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/events","assignees_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/assignees{/user}","branches_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/branches{/branch}","tags_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/tags","blobs_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/git/refs{/sha}","trees_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/statuses/{sha}","languages_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/languages","stargazers_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/stargazers","contributors_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/contributors","subscribers_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/subscribers","subscription_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/subscription","commits_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/commits{/sha}","git_commits_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/git/commits{/sha}","comments_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/comments{/number}","issue_comment_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/issues/comments{/number}","contents_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/contents/{+path}","compare_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/merges","archive_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/downloads","issues_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/issues{/number}","pulls_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/pulls{/number}","milestones_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/milestones{/number}","notifications_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/labels{/name}","releases_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/releases{/id}","deployments_url":"https://api.github.com/repos/nkohen/bitcoin-s-core/deployments","created_at":"2018-05-24T19:13:24Z","updated_at":"2019-06-07T17:55:18Z","pushed_at":"2019-06-13T20:16:26Z","git_url":"git://github.com/nkohen/bitcoin-s-core.git","ssh_url":"git@github.com:nkohen/bitcoin-s-core.git","clone_url":"https://github.com/nkohen/bitcoin-s-core.git","svn_url":"https://github.com/nkohen/bitcoin-s-core","homepage":null,"size":9988,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":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":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"bitcoin-s:master","ref":"master","sha":"e4d26e717adcadf777e21496c165697b146fc571","user":{"login":"bitcoin-s","id":16688471,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2Njg4NDcx","avatar_url":"https://avatars1.githubusercontent.com/u/16688471?v=4","gravatar_id":"","url":"https://api.github.com/users/bitcoin-s","html_url":"https://github.com/bitcoin-s","followers_url":"https://api.github.com/users/bitcoin-s/followers","following_url":"https://api.github.com/users/bitcoin-s/following{/other_user}","gists_url":"https://api.github.com/users/bitcoin-s/gists{/gist_id}","starred_url":"https://api.github.com/users/bitcoin-s/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bitcoin-s/subscriptions","organizations_url":"https://api.github.com/users/bitcoin-s/orgs","repos_url":"https://api.github.com/users/bitcoin-s/repos","events_url":"https://api.github.com/users/bitcoin-s/events{/privacy}","received_events_url":"https://api.github.com/users/bitcoin-s/received_events","type":"Organization","site_admin":false},"repo":{"id":57332261,"node_id":"MDEwOlJlcG9zaXRvcnk1NzMzMjI2MQ==","name":"bitcoin-s","full_name":"bitcoin-s/bitcoin-s","private":false,"owner":{"login":"bitcoin-s","id":16688471,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2Njg4NDcx","avatar_url":"https://avatars1.githubusercontent.com/u/16688471?v=4","gravatar_id":"","url":"https://api.github.com/users/bitcoin-s","html_url":"https://github.com/bitcoin-s","followers_url":"https://api.github.com/users/bitcoin-s/followers","following_url":"https://api.github.com/users/bitcoin-s/following{/other_user}","gists_url":"https://api.github.com/users/bitcoin-s/gists{/gist_id}","starred_url":"https://api.github.com/users/bitcoin-s/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bitcoin-s/subscriptions","organizations_url":"https://api.github.com/users/bitcoin-s/orgs","repos_url":"https://api.github.com/users/bitcoin-s/repos","events_url":"https://api.github.com/users/bitcoin-s/events{/privacy}","received_events_url":"https://api.github.com/users/bitcoin-s/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/bitcoin-s/bitcoin-s","description":"Bitcoin Implementation in Scala","fork":false,"url":"https://api.github.com/repos/bitcoin-s/bitcoin-s","forks_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/forks","keys_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/teams","hooks_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/hooks","issue_events_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/issues/events{/number}","events_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/events","assignees_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/assignees{/user}","branches_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/branches{/branch}","tags_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/tags","blobs_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/git/refs{/sha}","trees_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/statuses/{sha}","languages_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/languages","stargazers_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/stargazers","contributors_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/contributors","subscribers_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/subscribers","subscription_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/subscription","commits_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/commits{/sha}","git_commits_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/git/commits{/sha}","comments_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/comments{/number}","issue_comment_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/issues/comments{/number}","contents_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/contents/{+path}","compare_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/merges","archive_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/downloads","issues_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/issues{/number}","pulls_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/pulls{/number}","milestones_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/milestones{/number}","notifications_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/labels{/name}","releases_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/releases{/id}","deployments_url":"https://api.github.com/repos/bitcoin-s/bitcoin-s/deployments","created_at":"2016-04-28T20:38:56Z","updated_at":"2019-06-13T13:06:43Z","pushed_at":"2019-06-14T02:24:39Z","git_url":"git://github.com/bitcoin-s/bitcoin-s.git","ssh_url":"git@github.com:bitcoin-s/bitcoin-s.git","clone_url":"https://github.com/bitcoin-s/bitcoin-s.git","svn_url":"https://github.com/bitcoin-s/bitcoin-s","homepage":"https://bitcoin-s.org","size":19345,"stargazers_count":137,"watchers_count":137,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":41,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":89,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":41,"open_issues":89,"watchers":137,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/bitcoin-s/bitcoin-s/pulls/481"},"html":{"href":"https://github.com/bitcoin-s/bitcoin-s/pull/481"},"issue":{"href":"https://api.github.com/repos/bitcoin-s/bitcoin-s/issues/481"},"comments":{"href":"https://api.github.com/repos/bitcoin-s/bitcoin-s/issues/481/comments"},"review_comments":{"href":"https://api.github.com/repos/bitcoin-s/bitcoin-s/pulls/481/comments"},"review_comment":{"href":"https://api.github.com/repos/bitcoin-s/bitcoin-s/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/bitcoin-s/bitcoin-s/pulls/481/commits"},"statuses":{"href":"https://api.github.com/repos/bitcoin-s/bitcoin-s/statuses/e34643b12c69136e6d54e613cd8964365425ee47"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"torkelrogstad"}}