{"action":"created","comment":{"url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/pulls/comments/191043868","pull_request_review_id":123551795,"id":191043868,"diff_hunk":"@@ -0,0 +1,1016 @@\n+﻿using System;\n+using System.Collections.Generic;\n+using System.Net;\n+using System.Threading.Tasks;\n+using Microsoft.AspNetCore.Mvc;\n+using Moq;\n+using NBitcoin;\n+using NBitcoin.DataEncoders;\n+using NBitcoin.Protocol;\n+using Stratis.Bitcoin.Base;\n+using Stratis.Bitcoin.Configuration;\n+using Stratis.Bitcoin.Connection;\n+using Stratis.Bitcoin.Features.Consensus.Interfaces;\n+using Stratis.Bitcoin.Features.RPC.Controllers;\n+using Stratis.Bitcoin.Features.RPC.Models;\n+using Stratis.Bitcoin.Interfaces;\n+using Stratis.Bitcoin.P2P.Peer;\n+using Stratis.Bitcoin.Tests.Common.Logging;\n+using Stratis.Bitcoin.Tests.Wallet.Common;\n+using Stratis.Bitcoin.Utilities;\n+using Stratis.Bitcoin.Utilities.JsonErrors;\n+using Xunit;\n+\n+namespace Stratis.Bitcoin.Features.RPC.Tests.Controller\n+{\n+    public class APIFullNodeControllerTest : LogsTestBase\n+    {\n+        private ConcurrentChain chain;\n+        private readonly Mock<IFullNode> fullNode;\n+        private readonly Mock<IChainState> chainState;\n+        private readonly Mock<IConnectionManager> connectionManager;\n+        private Network network;\n+        private NodeSettings nodeSettings;\n+        private readonly Mock<IPooledTransaction> pooledTransaction;\n+        private readonly Mock<IPooledGetUnspentTransaction> pooledGetUnspentTransaction;\n+        private readonly Mock<IGetUnspentTransaction> getUnspentTransaction;\n+        private readonly Mock<IConsensusLoop> consensusLoop;\n+        private readonly Mock<INetworkDifficulty> networkDifficulty;\n+        private APIFullNodeController controller;\n+\n+        public APIFullNodeControllerTest()\n+        {\n+            this.fullNode = new Mock<IFullNode>();\n+            this.chainState = new Mock<IChainState>();\n+            this.connectionManager = new Mock<IConnectionManager>();\n+            this.network = Network.TestNet;\n+            this.connectionManager.Setup(c => c.Network).Returns(this.network);\n+            this.chain = WalletTestsHelpers.GenerateChainWithHeight(3, this.network);\n+            this.nodeSettings = new NodeSettings();\n+            this.pooledTransaction = new Mock<IPooledTransaction>();\n+            this.pooledGetUnspentTransaction = new Mock<IPooledGetUnspentTransaction>();\n+            this.getUnspentTransaction = new Mock<IGetUnspentTransaction>();\n+            this.consensusLoop = new Mock<IConsensusLoop>();\n+            this.networkDifficulty = new Mock<INetworkDifficulty>();\n+            this.controller = new APIFullNodeController(this.LoggerFactory.Object, this.network, this.chain, this.chainState.Object, this.connectionManager.Object, null, this.pooledGetUnspentTransaction.Object, this.getUnspentTransaction.Object, this.networkDifficulty.Object,\n+                 this.consensusLoop.Object, this.fullNode.Object, this.nodeSettings);\n+        }\n+\n+        [Fact]\n+        public async Task Stop_WithoutFullNode_DoesNotThrowExceptionAsync()\n+        {\n+            IFullNode fullNode = null;\n+            this.controller = new APIFullNodeController(this.LoggerFactory.Object, this.network, this.chain, this.chainState.Object, this.connectionManager.Object, null, this.pooledGetUnspentTransaction.Object, this.getUnspentTransaction.Object, this.networkDifficulty.Object,\n+                this.consensusLoop.Object, fullNode, this.nodeSettings);\n+            await this.controller.Stop().ConfigureAwait(false);\n+        }\n+\n+        [Fact]\n+        public async Task Stop_WithFullNode_DisposesFullNodeAsync()\n+        {\n+            await this.controller.Stop().ConfigureAwait(false);\n+\n+            this.fullNode.Verify(f => f.Dispose());\n+        }\n+\n+        [Fact]\n+        public async Task GetRawTransactionAsync_BadTransactionID_ThrowsArgumentExceptionAsync()\n+        {\n+            GetRawTransactionRequestModel request = new GetRawTransactionRequestModel\n+            {\n+                txid = \"abcd1234\",\n+                verbose = false\n+            };\n+\n+            IActionResult result = await this.controller.GetRawTransactionAsync(request).ConfigureAwait(false);\n+\n+            ErrorResult errorResult = Assert.IsType<ErrorResult>(result);\n+            ErrorResponse errorResponse = Assert.IsType<ErrorResponse>(errorResult.Value);\n+            Assert.Single(errorResponse.Errors);\n+            ErrorModel error = errorResponse.Errors[0];\n+            Assert.Equal(400, error.Status);\n+            Assert.StartsWith(\"System.ArgumentException\", error.Description);\n+        }\n+\n+\n+\n+        [Fact]\n+        public async Task GetRawTransactionAsync_TransactionCannotBeFound_ReturnsNullAsync()\n+        {\n+            uint256 txId = new uint256(12142124);\n+            this.pooledTransaction.Setup(p => p.GetTransaction(txId))\n+                .ReturnsAsync((Transaction)null)\n+                .Verifiable();\n+            var blockStore = new Mock<IBlockStore>();\n+            blockStore.Setup(b => b.GetTrxAsync(txId))\n+                .ReturnsAsync((Transaction)null)\n+                .Verifiable();\n+            this.fullNode.Setup(f => f.NodeFeature<IBlockStore>(false))\n+                .Returns(blockStore.Object);\n+            this.controller = new APIFullNodeController(this.LoggerFactory.Object, this.network, this.chain, this.chainState.Object, this.connectionManager.Object, this.pooledTransaction.Object, this.pooledGetUnspentTransaction.Object, this.getUnspentTransaction.Object, this.networkDifficulty.Object,\n+                this.consensusLoop.Object, this.fullNode.Object, this.nodeSettings);\n+            GetRawTransactionRequestModel request = new GetRawTransactionRequestModel\n+            {\n+                txid = txId.ToString(),\n+                verbose = false\n+            };\n+\n+            var json = (JsonResult)await this.controller.GetRawTransactionAsync(request).ConfigureAwait(false);\n+\n+            Assert.Null(json.Value);\n+            this.pooledTransaction.Verify();\n+            blockStore.Verify();\n+        }\n+\n+        [Fact]\n+        public async Task GetRawTransactionAsync_TransactionNotInPooledTransaction_ReturnsTransactionFromBlockStoreAsync()\n+        {\n+            uint256 txId = new uint256(12142124);\n+            this.pooledTransaction.Setup(p => p.GetTransaction(txId))\n+                .ReturnsAsync((Transaction)null);\n+            Transaction transaction = this.CreateTransaction();\n+            var blockStore = new Mock<IBlockStore>();\n+            blockStore.Setup(b => b.GetTrxAsync(txId))\n+                .ReturnsAsync(transaction);\n+            this.fullNode.Setup(f => f.NodeFeature<IBlockStore>(false))\n+                .Returns(blockStore.Object);\n+            GetRawTransactionRequestModel request = new GetRawTransactionRequestModel\n+            {\n+                txid = txId.ToString(),\n+                verbose = false\n+            };\n+\n+            var json = (JsonResult)await this.controller.GetRawTransactionAsync(request).ConfigureAwait(false);\n+            TransactionBriefModel resultModel = (TransactionBriefModel)json.Value;\n+\n+            Assert.NotNull(json);\n+            var model = Assert.IsType<TransactionBriefModel>(resultModel);\n+            Assert.Equal(transaction.ToHex(), model.Hex);\n+        }\n+\n+        [Fact]\n+        public async Task GetRawTransactionAsync_NullVerbose_ReturnsBriefModelAsync()\n+        {\n+            uint256 txId = new uint256(12142124);\n+            Transaction transaction = this.CreateTransaction();\n+            var blockStore = new Mock<IBlockStore>();\n+            blockStore.Setup(b => b.GetTrxAsync(txId))\n+                .ReturnsAsync(transaction);\n+            this.fullNode.Setup(f => f.NodeFeature<IBlockStore>(false))\n+                .Returns(blockStore.Object);\n+            GetRawTransactionRequestModel request = new GetRawTransactionRequestModel\n+            {\n+                txid = txId.ToString()\n+            };\n+\n+            var json = (JsonResult)await this.controller.GetRawTransactionAsync(request).ConfigureAwait(false);\n+            TransactionBriefModel resultModel = (TransactionBriefModel)json.Value;\n+\n+            Assert.NotNull(resultModel);\n+            Assert.IsType<TransactionBriefModel>(resultModel);\n+            Assert.Equal(transaction.ToHex(), resultModel.Hex);\n+        }\n+\n+        [Fact]\n+        public async Task GetRawTransactionAsync_PooledTransactionServiceNotAvailable_ReturnsTransactionFromBlockStoreAsync()\n+        {\n+            uint256 txId = new uint256(12142124);\n+            Transaction transaction = this.CreateTransaction();\n+            var blockStore = new Mock<IBlockStore>();\n+            blockStore.Setup(b => b.GetTrxAsync(txId))\n+                .ReturnsAsync(transaction);\n+            this.fullNode.Setup(f => f.NodeFeature<IBlockStore>(false))\n+                .Returns(blockStore.Object);\n+            GetRawTransactionRequestModel request = new GetRawTransactionRequestModel\n+            {\n+                txid = txId.ToString(),\n+                verbose = false\n+            };\n+\n+            var json = (JsonResult)await this.controller.GetRawTransactionAsync(request).ConfigureAwait(false);\n+            TransactionBriefModel resultModel = (TransactionBriefModel)json.Value;\n+\n+            Assert.NotNull(resultModel);\n+            Assert.Equal(transaction.ToHex(), resultModel.Hex);\n+        }\n+\n+        [Fact]\n+        public async Task GetRawTransactionAsync_PooledTransactionAndBlockStoreServiceNotAvailable_ReturnsNullAsync()\n+        {\n+            uint256 txId = new uint256(12142124);\n+            this.fullNode.Setup(f => f.NodeFeature<IBlockStore>(false))\n+                .Returns(default(IBlockStore))\n+                .Verifiable();\n+            this.controller = new APIFullNodeController(this.LoggerFactory.Object, this.network, this.chain, this.chainState.Object, this.connectionManager.Object, null, this.pooledGetUnspentTransaction.Object, this.getUnspentTransaction.Object, this.networkDifficulty.Object,\n+                this.consensusLoop.Object, this.fullNode.Object, this.nodeSettings);\n+            GetRawTransactionRequestModel request = new GetRawTransactionRequestModel\n+            {\n+                txid = txId.ToString(),\n+                verbose = false\n+            };\n+\n+            var json = (JsonResult)await this.controller.GetRawTransactionAsync(request).ConfigureAwait(false);\n+\n+            Assert.Null(json.Value);\n+            this.fullNode.Verify();\n+        }\n+\n+        [Fact]\n+        public async Task GetTaskAsync_Verbose_ReturnsTransactionVerboseModelAsync()\n+        {\n+            this.chainState.Setup(c => c.ConsensusTip)\n+                .Returns(this.chain.Tip);\n+            var block = this.chain.GetBlock(1);\n+            Transaction transaction = this.CreateTransaction();\n+            uint256 txId = new uint256(12142124);\n+            this.pooledTransaction.Setup(p => p.GetTransaction(txId))\n+                .ReturnsAsync(transaction);\n+            var blockStore = new Mock<IBlockStore>();\n+            blockStore.Setup(b => b.GetTrxBlockIdAsync(txId))\n+                .ReturnsAsync(block.HashBlock);\n+            this.fullNode.Setup(f => f.NodeFeature<IBlockStore>(false))\n+                .Returns(blockStore.Object);\n+            this.controller = new APIFullNodeController(this.LoggerFactory.Object, this.network, this.chain, this.chainState.Object, this.connectionManager.Object, this.pooledTransaction.Object, this.pooledGetUnspentTransaction.Object, this.getUnspentTransaction.Object, this.networkDifficulty.Object,\n+                this.consensusLoop.Object, this.fullNode.Object, this.nodeSettings);\n+            GetRawTransactionRequestModel request = new GetRawTransactionRequestModel\n+            {\n+                txid = txId.ToString(),\n+                verbose = true\n+            };\n+\n+            var json = (JsonResult)await this.controller.GetRawTransactionAsync(request).ConfigureAwait(false);\n+            TransactionVerboseModel resultModel = (TransactionVerboseModel)json.Value;\n+\n+            Assert.NotNull(resultModel);\n+            var model = Assert.IsType<TransactionVerboseModel>(resultModel);\n+            Assert.Equal(transaction.GetHash().ToString(), model.TxId);\n+            Assert.Equal(transaction.GetSerializedSize(), model.Size);\n+            Assert.Equal(transaction.Version, model.Version);\n+            Assert.Equal((uint)transaction.LockTime, model.LockTime);\n+            Assert.Equal(transaction.ToHex(), model.Hex);\n+\n+            Assert.Equal(block.HashBlock.ToString(), model.BlockHash);\n+            Assert.Equal(3, model.Confirmations);\n+            Assert.Equal(Utils.DateTimeToUnixTime(block.Header.BlockTime), model.Time);\n+            Assert.Equal(Utils.DateTimeToUnixTime(block.Header.BlockTime), model.BlockTime);\n+\n+            Assert.NotEmpty(model.VIn);\n+            var input = model.VIn[0];\n+            var expectedInput = new Vin(transaction.Inputs[0].PrevOut, transaction.Inputs[0].Sequence, transaction.Inputs[0].ScriptSig);\n+            Assert.Equal(expectedInput.Coinbase, input.Coinbase);\n+            Assert.Equal(expectedInput.ScriptSig, input.ScriptSig);\n+            Assert.Equal(expectedInput.Sequence, input.Sequence);\n+            Assert.Equal(expectedInput.TxId, input.TxId);\n+            Assert.Equal(expectedInput.VOut, input.VOut);\n+\n+            Assert.NotEmpty(model.VOut);\n+            var output = model.VOut[0];\n+            var expectedOutput = new Vout(0, transaction.Outputs[0], this.network);\n+            Assert.Equal(expectedOutput.Value, output.Value);\n+            Assert.Equal(expectedOutput.N, output.N);\n+            Assert.Equal(expectedOutput.ScriptPubKey.Hex, output.ScriptPubKey.Hex);\n+        }\n+\n+        [Fact]\n+        public async Task GetTaskAsync_Verbose_ChainStateTipNull_DoesNotCalulateConfirmationsAsync()\n+        {\n+            var block = this.chain.GetBlock(1);\n+            Transaction transaction = this.CreateTransaction();\n+            uint256 txId = new uint256(12142124);\n+            this.pooledTransaction.Setup(p => p.GetTransaction(txId))\n+                .ReturnsAsync(transaction);\n+            var blockStore = new Mock<IBlockStore>();\n+            blockStore.Setup(b => b.GetTrxBlockIdAsync(txId))\n+                .ReturnsAsync(block.HashBlock);\n+            this.fullNode.Setup(f => f.NodeFeature<IBlockStore>(false))\n+                .Returns(blockStore.Object);\n+            this.controller = new APIFullNodeController(this.LoggerFactory.Object, this.network, this.chain, this.chainState.Object, this.connectionManager.Object, this.pooledTransaction.Object, this.pooledGetUnspentTransaction.Object, this.getUnspentTransaction.Object, this.networkDifficulty.Object,\n+                this.consensusLoop.Object, this.fullNode.Object, this.nodeSettings);\n+            GetRawTransactionRequestModel request = new GetRawTransactionRequestModel\n+            {\n+                txid = txId.ToString(),\n+                verbose = true\n+            };\n+\n+            var json = (JsonResult)await this.controller.GetRawTransactionAsync(request).ConfigureAwait(false);\n+            TransactionVerboseModel resultModel = (TransactionVerboseModel)json.Value;\n+\n+            Assert.NotNull(resultModel);\n+            var model = Assert.IsType<TransactionVerboseModel>(resultModel);\n+            Assert.Null(model.Confirmations);\n+        }\n+\n+        [Fact]\n+        public async Task GetTaskAsync_Verbose_BlockNotFoundOnChain_ReturnsTransactionVerboseModelWithoutBlockInformationAsync()\n+        {\n+            var block = this.chain.GetBlock(1);","path":"src/Stratis.Bitcoin.Features.RPC.Tests/Controller/APIFullNodeControllerTest.cs","position":306,"original_position":306,"commit_id":"d4990a4b1913675c481ea0416d85076737b0b6c2","original_commit_id":"d4990a4b1913675c481ea0416d85076737b0b6c2","user":{"login":"noescape00","id":10259355,"avatar_url":"https://avatars0.githubusercontent.com/u/10259355?v=4","gravatar_id":"","url":"https://api.github.com/users/noescape00","html_url":"https://github.com/noescape00","followers_url":"https://api.github.com/users/noescape00/followers","following_url":"https://api.github.com/users/noescape00/following{/other_user}","gists_url":"https://api.github.com/users/noescape00/gists{/gist_id}","starred_url":"https://api.github.com/users/noescape00/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/noescape00/subscriptions","organizations_url":"https://api.github.com/users/noescape00/orgs","repos_url":"https://api.github.com/users/noescape00/repos","events_url":"https://api.github.com/users/noescape00/events{/privacy}","received_events_url":"https://api.github.com/users/noescape00/received_events","type":"User","site_admin":false},"body":"variable is redundant","created_at":"2018-05-26T09:01:08Z","updated_at":"2018-05-26T09:05:03Z","html_url":"https://github.com/stratisproject/StratisBitcoinFullNode/pull/1456#discussion_r191043868","pull_request_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/pulls/1456","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/pulls/comments/191043868"},"html":{"href":"https://github.com/stratisproject/StratisBitcoinFullNode/pull/1456#discussion_r191043868"},"pull_request":{"href":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/pulls/1456"}}},"pull_request":{"url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/pulls/1456","id":190616737,"html_url":"https://github.com/stratisproject/StratisBitcoinFullNode/pull/1456","diff_url":"https://github.com/stratisproject/StratisBitcoinFullNode/pull/1456.diff","patch_url":"https://github.com/stratisproject/StratisBitcoinFullNode/pull/1456.patch","issue_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/issues/1456","number":1456,"state":"open","locked":false,"title":"Explicit implementation of 12 RPC calls in API","user":{"login":"TjadenFroyda","id":38709281,"avatar_url":"https://avatars3.githubusercontent.com/u/38709281?v=4","gravatar_id":"","url":"https://api.github.com/users/TjadenFroyda","html_url":"https://github.com/TjadenFroyda","followers_url":"https://api.github.com/users/TjadenFroyda/followers","following_url":"https://api.github.com/users/TjadenFroyda/following{/other_user}","gists_url":"https://api.github.com/users/TjadenFroyda/gists{/gist_id}","starred_url":"https://api.github.com/users/TjadenFroyda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TjadenFroyda/subscriptions","organizations_url":"https://api.github.com/users/TjadenFroyda/orgs","repos_url":"https://api.github.com/users/TjadenFroyda/repos","events_url":"https://api.github.com/users/TjadenFroyda/events{/privacy}","received_events_url":"https://api.github.com/users/TjadenFroyda/received_events","type":"User","site_admin":false},"body":"Resubmission of #1418 (SDF bounty) after feedback from @dangershony on discord. All of these methods are currently available through the API under rpc/callbyname. This PR makes these each of these 12 methods available through an explicit API call with request models consistent with other API methods to enhance visibility of each method.\r\n\r\nSummary of PR:\r\n- Models/\r\n  - Added request models corresponding to methods using same parameters as RPC for compatibility. \r\n  - PeerNodeModel is a 1:1 copy of Stratis.Bitcoin/Connection (internal setters), needed for getpeerinfo\r\n- Controllers/\r\n  - APIFullNodeController - Long file; copied and updated existing FullNodeController code to work with the API per feedback on previous PR mentioned above. Most changes involved adding request models for each call and json formatting output with error handling consistent with other existing API methods. Methods included:\r\n    - stop,  getrawtransaction, gettxout, getblockcount, getinfo, getblockheader, validateaddress\r\n    - Also added in addnode, getpeerinfo, getblockhash, getbestblockhash, and getrawmempool that were available through API’s rpc/callbyname using the same logic as the respective RPC calls, again formatting for API request models and json output. Did not include send as this is handled elsewhere in the API.\r\n- Tests/\r\n  - APIFullNodeControllerTest - Used base test logic/code from FullNodeControllerTest so as not to reinvent the wheel and to demonstrate equivalence between API and RPC. Added tests to validate request model error handling and tests for methods above not in FullNodeController. ","created_at":"2018-05-25T15:05:03Z","updated_at":"2018-05-26T09:05:03Z","closed_at":null,"merged_at":null,"merge_commit_sha":"efb4f55114c8d509b61311bcc093cddf2c8cf3a3","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/pulls/1456/commits","review_comments_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/pulls/1456/comments","review_comment_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/pulls/comments{/number}","comments_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/issues/1456/comments","statuses_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/statuses/d4990a4b1913675c481ea0416d85076737b0b6c2","head":{"label":"TjadenFroyda:APIFullNode","ref":"APIFullNode","sha":"d4990a4b1913675c481ea0416d85076737b0b6c2","user":{"login":"TjadenFroyda","id":38709281,"avatar_url":"https://avatars3.githubusercontent.com/u/38709281?v=4","gravatar_id":"","url":"https://api.github.com/users/TjadenFroyda","html_url":"https://github.com/TjadenFroyda","followers_url":"https://api.github.com/users/TjadenFroyda/followers","following_url":"https://api.github.com/users/TjadenFroyda/following{/other_user}","gists_url":"https://api.github.com/users/TjadenFroyda/gists{/gist_id}","starred_url":"https://api.github.com/users/TjadenFroyda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TjadenFroyda/subscriptions","organizations_url":"https://api.github.com/users/TjadenFroyda/orgs","repos_url":"https://api.github.com/users/TjadenFroyda/repos","events_url":"https://api.github.com/users/TjadenFroyda/events{/privacy}","received_events_url":"https://api.github.com/users/TjadenFroyda/received_events","type":"User","site_admin":false},"repo":{"id":131835705,"name":"StratisBitcoinFullNode","full_name":"TjadenFroyda/StratisBitcoinFullNode","owner":{"login":"TjadenFroyda","id":38709281,"avatar_url":"https://avatars3.githubusercontent.com/u/38709281?v=4","gravatar_id":"","url":"https://api.github.com/users/TjadenFroyda","html_url":"https://github.com/TjadenFroyda","followers_url":"https://api.github.com/users/TjadenFroyda/followers","following_url":"https://api.github.com/users/TjadenFroyda/following{/other_user}","gists_url":"https://api.github.com/users/TjadenFroyda/gists{/gist_id}","starred_url":"https://api.github.com/users/TjadenFroyda/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TjadenFroyda/subscriptions","organizations_url":"https://api.github.com/users/TjadenFroyda/orgs","repos_url":"https://api.github.com/users/TjadenFroyda/repos","events_url":"https://api.github.com/users/TjadenFroyda/events{/privacy}","received_events_url":"https://api.github.com/users/TjadenFroyda/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/TjadenFroyda/StratisBitcoinFullNode","description":"Bitcoin full node in C#","fork":true,"url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode","forks_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/forks","keys_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/keys{/key_id}","collaborators_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/teams","hooks_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/hooks","issue_events_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/issues/events{/number}","events_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/events","assignees_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/assignees{/user}","branches_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/branches{/branch}","tags_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/tags","blobs_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/git/refs{/sha}","trees_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/git/trees{/sha}","statuses_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/statuses/{sha}","languages_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/languages","stargazers_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/stargazers","contributors_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/contributors","subscribers_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/subscribers","subscription_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/subscription","commits_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/commits{/sha}","git_commits_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/git/commits{/sha}","comments_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/comments{/number}","issue_comment_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/issues/comments{/number}","contents_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/contents/{+path}","compare_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/compare/{base}...{head}","merges_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/merges","archive_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/downloads","issues_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/issues{/number}","pulls_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/pulls{/number}","milestones_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/milestones{/number}","notifications_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/labels{/name}","releases_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/releases{/id}","deployments_url":"https://api.github.com/repos/TjadenFroyda/StratisBitcoinFullNode/deployments","created_at":"2018-05-02T10:32:55Z","updated_at":"2018-05-20T14:58:27Z","pushed_at":"2018-05-25T13:59:39Z","git_url":"git://github.com/TjadenFroyda/StratisBitcoinFullNode.git","ssh_url":"git@github.com:TjadenFroyda/StratisBitcoinFullNode.git","clone_url":"https://github.com/TjadenFroyda/StratisBitcoinFullNode.git","svn_url":"https://github.com/TjadenFroyda/StratisBitcoinFullNode","homepage":"https://stratisplatform.com","size":11187,"stargazers_count":0,"watchers_count":0,"language":"C#","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":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"stratisproject:master","ref":"master","sha":"0a452d5966af2f5ed945708e46c92b89c37b5104","user":{"login":"stratisproject","id":15229748,"avatar_url":"https://avatars0.githubusercontent.com/u/15229748?v=4","gravatar_id":"","url":"https://api.github.com/users/stratisproject","html_url":"https://github.com/stratisproject","followers_url":"https://api.github.com/users/stratisproject/followers","following_url":"https://api.github.com/users/stratisproject/following{/other_user}","gists_url":"https://api.github.com/users/stratisproject/gists{/gist_id}","starred_url":"https://api.github.com/users/stratisproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stratisproject/subscriptions","organizations_url":"https://api.github.com/users/stratisproject/orgs","repos_url":"https://api.github.com/users/stratisproject/repos","events_url":"https://api.github.com/users/stratisproject/events{/privacy}","received_events_url":"https://api.github.com/users/stratisproject/received_events","type":"Organization","site_admin":false},"repo":{"id":67271290,"name":"StratisBitcoinFullNode","full_name":"stratisproject/StratisBitcoinFullNode","owner":{"login":"stratisproject","id":15229748,"avatar_url":"https://avatars0.githubusercontent.com/u/15229748?v=4","gravatar_id":"","url":"https://api.github.com/users/stratisproject","html_url":"https://github.com/stratisproject","followers_url":"https://api.github.com/users/stratisproject/followers","following_url":"https://api.github.com/users/stratisproject/following{/other_user}","gists_url":"https://api.github.com/users/stratisproject/gists{/gist_id}","starred_url":"https://api.github.com/users/stratisproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stratisproject/subscriptions","organizations_url":"https://api.github.com/users/stratisproject/orgs","repos_url":"https://api.github.com/users/stratisproject/repos","events_url":"https://api.github.com/users/stratisproject/events{/privacy}","received_events_url":"https://api.github.com/users/stratisproject/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/stratisproject/StratisBitcoinFullNode","description":"Bitcoin full node in C#","fork":false,"url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode","forks_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/forks","keys_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/keys{/key_id}","collaborators_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/teams","hooks_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/hooks","issue_events_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/issues/events{/number}","events_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/events","assignees_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/assignees{/user}","branches_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/branches{/branch}","tags_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/tags","blobs_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/git/refs{/sha}","trees_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/git/trees{/sha}","statuses_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/statuses/{sha}","languages_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/languages","stargazers_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/stargazers","contributors_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/contributors","subscribers_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/subscribers","subscription_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/subscription","commits_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/commits{/sha}","git_commits_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/git/commits{/sha}","comments_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/comments{/number}","issue_comment_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/issues/comments{/number}","contents_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/contents/{+path}","compare_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/compare/{base}...{head}","merges_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/merges","archive_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/downloads","issues_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/issues{/number}","pulls_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/pulls{/number}","milestones_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/milestones{/number}","notifications_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/labels{/name}","releases_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/releases{/id}","deployments_url":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/deployments","created_at":"2016-09-03T04:32:51Z","updated_at":"2018-05-26T02:56:58Z","pushed_at":"2018-05-26T02:57:58Z","git_url":"git://github.com/stratisproject/StratisBitcoinFullNode.git","ssh_url":"git@github.com:stratisproject/StratisBitcoinFullNode.git","clone_url":"https://github.com/stratisproject/StratisBitcoinFullNode.git","svn_url":"https://github.com/stratisproject/StratisBitcoinFullNode","homepage":"https://stratisplatform.com","size":12384,"stargazers_count":475,"watchers_count":475,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":204,"mirror_url":null,"archived":false,"open_issues_count":106,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":204,"open_issues":106,"watchers":475,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/pulls/1456"},"html":{"href":"https://github.com/stratisproject/StratisBitcoinFullNode/pull/1456"},"issue":{"href":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/issues/1456"},"comments":{"href":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/issues/1456/comments"},"review_comments":{"href":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/pulls/1456/comments"},"review_comment":{"href":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/pulls/1456/commits"},"statuses":{"href":"https://api.github.com/repos/stratisproject/StratisBitcoinFullNode/statuses/d4990a4b1913675c481ea0416d85076737b0b6c2"}},"author_association":"NONE"}}
{"actor":{"display_login":"noescape00"}}