{"action":"created","comment":{"url":"https://api.github.com/repos/rchain/rchain/pulls/comments/183216714","pull_request_review_id":114180711,"id":183216714,"diff_hunk":"@@ -1,67 +1,100 @@\n package coop.rchain.casper.util\n \n import com.google.protobuf.ByteString\n+import coop.rchain.casper.BlockGenerator\n+import coop.rchain.casper.internals._\n import coop.rchain.casper.protocol._\n-import coop.rchain.casper.protocol.Resource.ResourceClass.ProduceResource\n import org.scalatest.{FlatSpec, Matchers}\n-import coop.rchain.crypto.hash.Sha256\n+import scalaz.State\n \n-import scala.collection.mutable\n+import scala.collection.immutable.HashMap\n \n-class CasperUtilTest extends FlatSpec with Matchers {\n-  val resourceCounter: Iterator[Int] = Iterator.from(0)\n+class CasperUtilTest extends FlatSpec with Matchers with BlockGenerator {\n \n-  \"isInMainChain\" should \"classify appropriately\" in {\n-    val chain = mutable.HashMap[ByteString, BlockMessage]()\n-\n-    val genesis: BlockMessage = createBlock(Seq())\n-    chain += (genesis.blockHash -> genesis)\n+  type StateWithChain[A] = State[Chain, A]\n \n-    val blockMessage2: BlockMessage = createBlock(Seq(genesis.blockHash))\n-    chain += (blockMessage2.blockHash -> blockMessage2)\n+  \"isInMainChain\" should \"classify appropriately\" in {\n+    val createChain =\n+      for {\n+        genesis <- createBlock[StateWithChain](Seq())\n+        b2      <- createBlock[StateWithChain](Seq(genesis.blockHash))\n+        b3      <- createBlock[StateWithChain](Seq(b2.blockHash))\n+      } yield b3\n \n-    val blockMessage3: BlockMessage = createBlock(Seq(blockMessage2.blockHash))\n-    chain += (blockMessage3.blockHash -> blockMessage3)\n+    val initState =\n+      Chain(HashMap.empty[Int, BlockMessage], HashMap.empty[ByteString, BlockMessage], 0)\n+    val (chain: Chain, lastBlock: BlockMessage) = createChain.run(initState)\n \n-    isInMainChain(chain, genesis, blockMessage3) should be(true)\n-    isInMainChain(chain, blockMessage2, blockMessage3) should be(true)\n-    isInMainChain(chain, blockMessage3, blockMessage2) should be(false)\n-    isInMainChain(chain, blockMessage3, genesis) should be(false)\n+    val genesis = chain.idToBlocks(1)\n+    val b2      = chain.idToBlocks(2)\n+    val b3      = chain.idToBlocks(3)\n+    isInMainChain(chain.hashToBlocks, genesis, b3) should be(true)\n+    isInMainChain(chain.hashToBlocks, b2, b3) should be(true)\n+    isInMainChain(chain.hashToBlocks, b3, b2) should be(false)\n+    isInMainChain(chain.hashToBlocks, b3, genesis) should be(false)\n   }\n \n   \"isInMainChain\" should \"classify diamond DAGs appropriately\" in {\n-    val chain = mutable.HashMap[ByteString, BlockMessage]()\n+    val createChain =\n+      for {\n+        genesis <- createBlock[StateWithChain](Seq())\n+        b2      <- createBlock[StateWithChain](Seq(genesis.blockHash))\n+        b3      <- createBlock[StateWithChain](Seq(genesis.blockHash))\n+        b4      <- createBlock[StateWithChain](Seq(b2.blockHash, b3.blockHash))\n+      } yield b4\n \n-    val genesis: BlockMessage = createBlock(Seq())\n-    chain += (genesis.blockHash -> genesis)\n+    val initState =\n+      Chain(HashMap.empty[Int, BlockMessage], HashMap.empty[ByteString, BlockMessage], 0)\n+    val (chain: Chain, lastBlock: BlockMessage) = createChain.run(initState)\n \n-    val blockMessage2: BlockMessage = createBlock(Seq(genesis.blockHash))\n-    chain += (blockMessage2.blockHash -> blockMessage2)\n-\n-    val blockMessage3: BlockMessage = createBlock(Seq(genesis.blockHash))\n-    chain += (blockMessage3.blockHash -> blockMessage3)\n+    val genesis = chain.idToBlocks(1)\n+    val b2      = chain.idToBlocks(2)\n+    val b3      = chain.idToBlocks(3)\n+    val b4      = chain.idToBlocks(4)\n+    isInMainChain(chain.hashToBlocks, genesis, b2) should be(true)\n+    isInMainChain(chain.hashToBlocks, genesis, b3) should be(true)\n+    isInMainChain(chain.hashToBlocks, genesis, b4) should be(true)\n+    isInMainChain(chain.hashToBlocks, b2, b4) should be(true)\n+    isInMainChain(chain.hashToBlocks, b3, b4) should be(false)\n+  }\n \n-    val blockMessage4: BlockMessage =\n-      createBlock(Seq(blockMessage2.blockHash, blockMessage3.blockHash))\n-    chain += (blockMessage4.blockHash -> blockMessage4)\n+  // See https://docs.google.com/presentation/d/1znz01SF1ljriPzbMoFV0J127ryPglUYLFyhvsb-ftQk/edit?usp=sharing slide 29 for diagram\n+  \"isInMainChain\" should \"classify complicated chains appropriately\" in {\n+    val v1 = ByteString.copyFromUtf8(\"Validator One\")\n+    val v2 = ByteString.copyFromUtf8(\"Validator Two\")\n+    val createChain =\n+      for {\n+        genesis <- createBlock[StateWithChain](Seq(), ByteString.EMPTY)\n+        b2      <- createBlock[StateWithChain](Seq(genesis.blockHash), v2)\n+        _       <- createBlock[StateWithChain](Seq(genesis.blockHash), v1)\n+        b4      <- createBlock[StateWithChain](Seq(b2.blockHash), v2)\n+        _       <- createBlock[StateWithChain](Seq(b2.blockHash), v1)\n+        _       <- createBlock[StateWithChain](Seq(b4.blockHash), v2)\n+        b7      <- createBlock[StateWithChain](Seq(b4.blockHash), v1)\n+        b8      <- createBlock[StateWithChain](Seq(b7.blockHash), v1)\n+      } yield b8\n \n-    isInMainChain(chain, genesis, blockMessage2) should be(true)\n-    isInMainChain(chain, genesis, blockMessage3) should be(true)\n-    isInMainChain(chain, genesis, blockMessage4) should be(true)\n-    isInMainChain(chain, blockMessage2, blockMessage4) should be(true)\n-    isInMainChain(chain, blockMessage3, blockMessage4) should be(false)\n-  }\n+    val initState =\n+      Chain(HashMap.empty[Int, BlockMessage], HashMap.empty[ByteString, BlockMessage], 0)\n+    val (chain: Chain, lastBlock: BlockMessage) = createChain.run(initState)\n \n-  private def createBlock(parentsHashList: Seq[ByteString]) = {\n-    val resourceId     = resourceCounter.next()\n-    val uniqueResource = Resource(ProduceResource(Produce(resourceId)))\n-    val postState      = RChainState().withResources(Seq(uniqueResource))\n-    val postStateHash  = Sha256.hash(postState.toByteArray)\n-    val header = Header()\n-      .withPostStateHash(ByteString.copyFrom(postStateHash))\n-      .withParentsHashList(parentsHashList)\n-    val blockHash = Sha256.hash(header.toByteArray)\n-    val body      = Body().withPostState(postState)\n-    BlockMessage(ByteString.copyFrom(blockHash), Some(header), Some(body))\n+    val genesis = chain.idToBlocks(1)\n+    val b2      = chain.idToBlocks(2)\n+    val b3      = chain.idToBlocks(3)\n+    val b4      = chain.idToBlocks(4)\n+    val b5      = chain.idToBlocks(5)\n+    val b6      = chain.idToBlocks(6)\n+    val b7      = chain.idToBlocks(7)\n+    val b8      = chain.idToBlocks(8)\n+    isInMainChain(chain.hashToBlocks, genesis, b2) should be(true)\n+    isInMainChain(chain.hashToBlocks, b2, b3) should be(false)\n+    isInMainChain(chain.hashToBlocks, b3, b4) should be(false)\n+    isInMainChain(chain.hashToBlocks, b4, b5) should be(false)\n+    isInMainChain(chain.hashToBlocks, b5, b6) should be(false)\n+    isInMainChain(chain.hashToBlocks, b6, b7) should be(false)\n+    isInMainChain(chain.hashToBlocks, b7, b8) should be(true)\n+    isInMainChain(chain.hashToBlocks, b2, b6) should be(true)\n+    isInMainChain(chain.hashToBlocks, b2, b8) should be(true)\n+    isInMainChain(chain.hashToBlocks, b4, b2) should be(false)","path":"casper/src/test/scala/coop/rchain/casper/util/CasperUtilTest.scala","position":144,"original_position":144,"commit_id":"7780962bd6c71bcda22fa0bbd3b9a6fd8aa35b2c","original_commit_id":"4bcbed3f6958b6b6b1624cd19863266070ffce29","user":{"login":"KentShikama","id":6329898,"avatar_url":"https://avatars0.githubusercontent.com/u/6329898?v=4","gravatar_id":"","url":"https://api.github.com/users/KentShikama","html_url":"https://github.com/KentShikama","followers_url":"https://api.github.com/users/KentShikama/followers","following_url":"https://api.github.com/users/KentShikama/following{/other_user}","gists_url":"https://api.github.com/users/KentShikama/gists{/gist_id}","starred_url":"https://api.github.com/users/KentShikama/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KentShikama/subscriptions","organizations_url":"https://api.github.com/users/KentShikama/orgs","repos_url":"https://api.github.com/users/KentShikama/repos","events_url":"https://api.github.com/users/KentShikama/events{/privacy}","received_events_url":"https://api.github.com/users/KentShikama/received_events","type":"User","site_admin":false},"body":"See comment there","created_at":"2018-04-21T19:04:04Z","updated_at":"2018-04-21T19:04:04Z","html_url":"https://github.com/rchain/rchain/pull/594#discussion_r183216714","pull_request_url":"https://api.github.com/repos/rchain/rchain/pulls/594","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/rchain/rchain/pulls/comments/183216714"},"html":{"href":"https://github.com/rchain/rchain/pull/594#discussion_r183216714"},"pull_request":{"href":"https://api.github.com/repos/rchain/rchain/pulls/594"}},"in_reply_to_id":183208089},"pull_request":{"url":"https://api.github.com/repos/rchain/rchain/pulls/594","id":183203730,"html_url":"https://github.com/rchain/rchain/pull/594","diff_url":"https://github.com/rchain/rchain/pull/594.diff","patch_url":"https://github.com/rchain/rchain/pull/594.patch","issue_url":"https://api.github.com/repos/rchain/rchain/issues/594","number":594,"state":"open","locked":false,"title":"Turan oracle implementation without disagreements ","user":{"login":"KentShikama","id":6329898,"avatar_url":"https://avatars0.githubusercontent.com/u/6329898?v=4","gravatar_id":"","url":"https://api.github.com/users/KentShikama","html_url":"https://github.com/KentShikama","followers_url":"https://api.github.com/users/KentShikama/followers","following_url":"https://api.github.com/users/KentShikama/following{/other_user}","gists_url":"https://api.github.com/users/KentShikama/gists{/gist_id}","starred_url":"https://api.github.com/users/KentShikama/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KentShikama/subscriptions","organizations_url":"https://api.github.com/users/KentShikama/orgs","repos_url":"https://api.github.com/users/KentShikama/repos","events_url":"https://api.github.com/users/KentShikama/events{/privacy}","received_events_url":"https://api.github.com/users/KentShikama/received_events","type":"User","site_admin":false},"body":"## Overview\r\nProvide a brief description of what this PR does, and why it's needed.\r\n\r\nRelative to #593\r\n\r\nThe turan oracle is a type of clique oracle and one of the more conservative (and quick to execute) safety oracles. This should do for checking safety of blocks in Node v0.3. Note since disagreements have not been implemented there may be false positives on safety. A follow up PR implementing disagreements will come soon.\r\n\r\n### Does this PR relate to an RChain JIRA issue? \r\nIf applicable, add link to corresponding JIRA issue.\r\n\r\nThis partially resolves https://rchain.atlassian.net/browse/RHOL-270\r\n\r\n### Complete this checklist before you submit the PR\r\n- [X] This PR contains no more than 200 lines of code, excluding test code.\r\n- [X] This PR meets [RChain development coding standards](https://rchain.atlassian.net/wiki/spaces/DOC/pages/28082177/Coding+Standards).\r\n- [X] You have someone in mind to assign for review. Make this assignment after submitting the PR.\r\n\r\n### Notes\r\nOptional. Add any notes on caveats, approaches you tried that didn't work, or anything else.\r\n","created_at":"2018-04-21T03:39:49Z","updated_at":"2018-04-21T19:04:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2f37f571da26d52a98a14e0dd2845c51cfdbfbb4","assignee":null,"assignees":[],"requested_reviewers":[{"login":"rabbitonweb","id":6287558,"avatar_url":"https://avatars1.githubusercontent.com/u/6287558?v=4","gravatar_id":"","url":"https://api.github.com/users/rabbitonweb","html_url":"https://github.com/rabbitonweb","followers_url":"https://api.github.com/users/rabbitonweb/followers","following_url":"https://api.github.com/users/rabbitonweb/following{/other_user}","gists_url":"https://api.github.com/users/rabbitonweb/gists{/gist_id}","starred_url":"https://api.github.com/users/rabbitonweb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rabbitonweb/subscriptions","organizations_url":"https://api.github.com/users/rabbitonweb/orgs","repos_url":"https://api.github.com/users/rabbitonweb/repos","events_url":"https://api.github.com/users/rabbitonweb/events{/privacy}","received_events_url":"https://api.github.com/users/rabbitonweb/received_events","type":"User","site_admin":false},{"login":"birchmd","id":13788876,"avatar_url":"https://avatars1.githubusercontent.com/u/13788876?v=4","gravatar_id":"","url":"https://api.github.com/users/birchmd","html_url":"https://github.com/birchmd","followers_url":"https://api.github.com/users/birchmd/followers","following_url":"https://api.github.com/users/birchmd/following{/other_user}","gists_url":"https://api.github.com/users/birchmd/gists{/gist_id}","starred_url":"https://api.github.com/users/birchmd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/birchmd/subscriptions","organizations_url":"https://api.github.com/users/birchmd/orgs","repos_url":"https://api.github.com/users/birchmd/repos","events_url":"https://api.github.com/users/birchmd/events{/privacy}","received_events_url":"https://api.github.com/users/birchmd/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/rchain/rchain/pulls/594/commits","review_comments_url":"https://api.github.com/repos/rchain/rchain/pulls/594/comments","review_comment_url":"https://api.github.com/repos/rchain/rchain/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rchain/rchain/issues/594/comments","statuses_url":"https://api.github.com/repos/rchain/rchain/statuses/7780962bd6c71bcda22fa0bbd3b9a6fd8aa35b2c","head":{"label":"KentShikama:dev-kent-turan-oracle","ref":"dev-kent-turan-oracle","sha":"7780962bd6c71bcda22fa0bbd3b9a6fd8aa35b2c","user":{"login":"KentShikama","id":6329898,"avatar_url":"https://avatars0.githubusercontent.com/u/6329898?v=4","gravatar_id":"","url":"https://api.github.com/users/KentShikama","html_url":"https://github.com/KentShikama","followers_url":"https://api.github.com/users/KentShikama/followers","following_url":"https://api.github.com/users/KentShikama/following{/other_user}","gists_url":"https://api.github.com/users/KentShikama/gists{/gist_id}","starred_url":"https://api.github.com/users/KentShikama/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KentShikama/subscriptions","organizations_url":"https://api.github.com/users/KentShikama/orgs","repos_url":"https://api.github.com/users/KentShikama/repos","events_url":"https://api.github.com/users/KentShikama/events{/privacy}","received_events_url":"https://api.github.com/users/KentShikama/received_events","type":"User","site_admin":false},"repo":{"id":110069345,"name":"rchain","full_name":"KentShikama/rchain","owner":{"login":"KentShikama","id":6329898,"avatar_url":"https://avatars0.githubusercontent.com/u/6329898?v=4","gravatar_id":"","url":"https://api.github.com/users/KentShikama","html_url":"https://github.com/KentShikama","followers_url":"https://api.github.com/users/KentShikama/followers","following_url":"https://api.github.com/users/KentShikama/following{/other_user}","gists_url":"https://api.github.com/users/KentShikama/gists{/gist_id}","starred_url":"https://api.github.com/users/KentShikama/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KentShikama/subscriptions","organizations_url":"https://api.github.com/users/KentShikama/orgs","repos_url":"https://api.github.com/users/KentShikama/repos","events_url":"https://api.github.com/users/KentShikama/events{/privacy}","received_events_url":"https://api.github.com/users/KentShikama/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/KentShikama/rchain","description":null,"fork":true,"url":"https://api.github.com/repos/KentShikama/rchain","forks_url":"https://api.github.com/repos/KentShikama/rchain/forks","keys_url":"https://api.github.com/repos/KentShikama/rchain/keys{/key_id}","collaborators_url":"https://api.github.com/repos/KentShikama/rchain/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/KentShikama/rchain/teams","hooks_url":"https://api.github.com/repos/KentShikama/rchain/hooks","issue_events_url":"https://api.github.com/repos/KentShikama/rchain/issues/events{/number}","events_url":"https://api.github.com/repos/KentShikama/rchain/events","assignees_url":"https://api.github.com/repos/KentShikama/rchain/assignees{/user}","branches_url":"https://api.github.com/repos/KentShikama/rchain/branches{/branch}","tags_url":"https://api.github.com/repos/KentShikama/rchain/tags","blobs_url":"https://api.github.com/repos/KentShikama/rchain/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/KentShikama/rchain/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/KentShikama/rchain/git/refs{/sha}","trees_url":"https://api.github.com/repos/KentShikama/rchain/git/trees{/sha}","statuses_url":"https://api.github.com/repos/KentShikama/rchain/statuses/{sha}","languages_url":"https://api.github.com/repos/KentShikama/rchain/languages","stargazers_url":"https://api.github.com/repos/KentShikama/rchain/stargazers","contributors_url":"https://api.github.com/repos/KentShikama/rchain/contributors","subscribers_url":"https://api.github.com/repos/KentShikama/rchain/subscribers","subscription_url":"https://api.github.com/repos/KentShikama/rchain/subscription","commits_url":"https://api.github.com/repos/KentShikama/rchain/commits{/sha}","git_commits_url":"https://api.github.com/repos/KentShikama/rchain/git/commits{/sha}","comments_url":"https://api.github.com/repos/KentShikama/rchain/comments{/number}","issue_comment_url":"https://api.github.com/repos/KentShikama/rchain/issues/comments{/number}","contents_url":"https://api.github.com/repos/KentShikama/rchain/contents/{+path}","compare_url":"https://api.github.com/repos/KentShikama/rchain/compare/{base}...{head}","merges_url":"https://api.github.com/repos/KentShikama/rchain/merges","archive_url":"https://api.github.com/repos/KentShikama/rchain/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/KentShikama/rchain/downloads","issues_url":"https://api.github.com/repos/KentShikama/rchain/issues{/number}","pulls_url":"https://api.github.com/repos/KentShikama/rchain/pulls{/number}","milestones_url":"https://api.github.com/repos/KentShikama/rchain/milestones{/number}","notifications_url":"https://api.github.com/repos/KentShikama/rchain/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/KentShikama/rchain/labels{/name}","releases_url":"https://api.github.com/repos/KentShikama/rchain/releases{/id}","deployments_url":"https://api.github.com/repos/KentShikama/rchain/deployments","created_at":"2017-11-09T04:59:22Z","updated_at":"2017-11-09T04:59:26Z","pushed_at":"2018-04-21T19:03:01Z","git_url":"git://github.com/KentShikama/rchain.git","ssh_url":"git@github.com:KentShikama/rchain.git","clone_url":"https://github.com/KentShikama/rchain.git","svn_url":"https://github.com/KentShikama/rchain","homepage":null,"size":8166,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":null,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"rchain:dev","ref":"dev","sha":"815f0d9c4e0a5081bab1b8a495a703e0422b087f","user":{"login":"rchain","id":20671765,"avatar_url":"https://avatars0.githubusercontent.com/u/20671765?v=4","gravatar_id":"","url":"https://api.github.com/users/rchain","html_url":"https://github.com/rchain","followers_url":"https://api.github.com/users/rchain/followers","following_url":"https://api.github.com/users/rchain/following{/other_user}","gists_url":"https://api.github.com/users/rchain/gists{/gist_id}","starred_url":"https://api.github.com/users/rchain/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rchain/subscriptions","organizations_url":"https://api.github.com/users/rchain/orgs","repos_url":"https://api.github.com/users/rchain/repos","events_url":"https://api.github.com/users/rchain/events{/privacy}","received_events_url":"https://api.github.com/users/rchain/received_events","type":"Organization","site_admin":false},"repo":{"id":84493691,"name":"rchain","full_name":"rchain/rchain","owner":{"login":"rchain","id":20671765,"avatar_url":"https://avatars0.githubusercontent.com/u/20671765?v=4","gravatar_id":"","url":"https://api.github.com/users/rchain","html_url":"https://github.com/rchain","followers_url":"https://api.github.com/users/rchain/followers","following_url":"https://api.github.com/users/rchain/following{/other_user}","gists_url":"https://api.github.com/users/rchain/gists{/gist_id}","starred_url":"https://api.github.com/users/rchain/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rchain/subscriptions","organizations_url":"https://api.github.com/users/rchain/orgs","repos_url":"https://api.github.com/users/rchain/repos","events_url":"https://api.github.com/users/rchain/events{/privacy}","received_events_url":"https://api.github.com/users/rchain/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rchain/rchain","description":null,"fork":false,"url":"https://api.github.com/repos/rchain/rchain","forks_url":"https://api.github.com/repos/rchain/rchain/forks","keys_url":"https://api.github.com/repos/rchain/rchain/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rchain/rchain/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rchain/rchain/teams","hooks_url":"https://api.github.com/repos/rchain/rchain/hooks","issue_events_url":"https://api.github.com/repos/rchain/rchain/issues/events{/number}","events_url":"https://api.github.com/repos/rchain/rchain/events","assignees_url":"https://api.github.com/repos/rchain/rchain/assignees{/user}","branches_url":"https://api.github.com/repos/rchain/rchain/branches{/branch}","tags_url":"https://api.github.com/repos/rchain/rchain/tags","blobs_url":"https://api.github.com/repos/rchain/rchain/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rchain/rchain/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rchain/rchain/git/refs{/sha}","trees_url":"https://api.github.com/repos/rchain/rchain/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rchain/rchain/statuses/{sha}","languages_url":"https://api.github.com/repos/rchain/rchain/languages","stargazers_url":"https://api.github.com/repos/rchain/rchain/stargazers","contributors_url":"https://api.github.com/repos/rchain/rchain/contributors","subscribers_url":"https://api.github.com/repos/rchain/rchain/subscribers","subscription_url":"https://api.github.com/repos/rchain/rchain/subscription","commits_url":"https://api.github.com/repos/rchain/rchain/commits{/sha}","git_commits_url":"https://api.github.com/repos/rchain/rchain/git/commits{/sha}","comments_url":"https://api.github.com/repos/rchain/rchain/comments{/number}","issue_comment_url":"https://api.github.com/repos/rchain/rchain/issues/comments{/number}","contents_url":"https://api.github.com/repos/rchain/rchain/contents/{+path}","compare_url":"https://api.github.com/repos/rchain/rchain/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rchain/rchain/merges","archive_url":"https://api.github.com/repos/rchain/rchain/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rchain/rchain/downloads","issues_url":"https://api.github.com/repos/rchain/rchain/issues{/number}","pulls_url":"https://api.github.com/repos/rchain/rchain/pulls{/number}","milestones_url":"https://api.github.com/repos/rchain/rchain/milestones{/number}","notifications_url":"https://api.github.com/repos/rchain/rchain/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rchain/rchain/labels{/name}","releases_url":"https://api.github.com/repos/rchain/rchain/releases{/id}","deployments_url":"https://api.github.com/repos/rchain/rchain/deployments","created_at":"2017-03-09T22:15:35Z","updated_at":"2018-04-21T16:04:38Z","pushed_at":"2018-04-21T19:03:03Z","git_url":"git://github.com/rchain/rchain.git","ssh_url":"git@github.com:rchain/rchain.git","clone_url":"https://github.com/rchain/rchain.git","svn_url":"https://github.com/rchain/rchain","homepage":null,"size":8336,"stargazers_count":263,"watchers_count":263,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":74,"mirror_url":null,"archived":false,"open_issues_count":19,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":74,"open_issues":19,"watchers":263,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rchain/rchain/pulls/594"},"html":{"href":"https://github.com/rchain/rchain/pull/594"},"issue":{"href":"https://api.github.com/repos/rchain/rchain/issues/594"},"comments":{"href":"https://api.github.com/repos/rchain/rchain/issues/594/comments"},"review_comments":{"href":"https://api.github.com/repos/rchain/rchain/pulls/594/comments"},"review_comment":{"href":"https://api.github.com/repos/rchain/rchain/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rchain/rchain/pulls/594/commits"},"statuses":{"href":"https://api.github.com/repos/rchain/rchain/statuses/7780962bd6c71bcda22fa0bbd3b9a6fd8aa35b2c"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"KentShikama"}}