payload: {"action":"created","comment":{"url":"https://api.github.com/repos/iotaledger/iri/pulls/comments/361075435","pull_request_review_id":336094963,"id":361075435,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDM2MTA3NTQzNQ==","diff_hunk":"@@ -0,0 +1,389 @@\n+package com.iota.iri.service.validation.impl;\n+\n+import com.google.common.annotations.VisibleForTesting;\n+import com.iota.iri.controllers.TipsViewModel;\n+import com.iota.iri.controllers.TransactionViewModel;\n+import com.iota.iri.model.Hash;\n+import com.iota.iri.network.pipeline.TransactionProcessingPipeline;\n+import com.iota.iri.network.TransactionRequester;\n+import com.iota.iri.service.snapshot.SnapshotProvider;\n+import com.iota.iri.service.validation.TransactionSolidifier;\n+import com.iota.iri.storage.Tangle;\n+import com.iota.iri.utils.log.interval.IntervalLogger;\n+import com.iota.iri.utils.thread.DedicatedScheduledExecutorService;\n+import com.iota.iri.utils.thread.SilentScheduledExecutorService;\n+\n+import java.util.*;\n+import java.util.concurrent.*;\n+\n+import static com.iota.iri.controllers.TransactionViewModel.PREFILLED_SLOT;\n+import static com.iota.iri.controllers.TransactionViewModel.fromHash;\n+\n+/**\n+ * A solidifier class for processing transactions. Transactions are checked for solidity, and missing transactions are\n+ * subsequently requested. Once a transaction is solidified correctly it is placed into a broadcasting set to be sent to\n+ * neighboring nodes.\n+ */\n+public class TransactionSolidifierImpl implements TransactionSolidifier {\n+\n+    private Tangle tangle;\n+    private SnapshotProvider snapshotProvider;\n+    private TransactionRequester transactionRequester;\n+\n+    /**\n+     * Max size for all queues.\n+     */\n+    private static final int MAX_SIZE= 10000;\n+\n+    private static final IntervalLogger log = new IntervalLogger(TransactionSolidifier.class);\n+\n+    /**\n+     * Executor service for running the {@link #processTransactionsToSolidify()}.\n+     */\n+    private SilentScheduledExecutorService executorService = new DedicatedScheduledExecutorService(\n+            \"Transaction Solidifier\", log.delegate());\n+\n+    /**\n+     * A queue for processing transactions with the {@link #checkSolidity(Hash)} call. Once a transaction has been\n+     * marked solid it will be placed into the {@link #transactionsToBroadcast} queue.\n+     */\n+    private BlockingQueue<Hash> transactionsToSolidify = new ArrayBlockingQueue<>(MAX_SIZE);\n+\n+    /**\n+     * A queue for processing transactions with the {@link #propagateSolidTransactions()} call. This will check\n+     * approving transactions with {@link #quickSetSolid(TransactionViewModel)}.\n+     */\n+    private BlockingQueue<Hash> solidTransactions = new ArrayBlockingQueue<>(MAX_SIZE);\n+\n+    /**\n+     * A set of transactions that will be called by the {@link TransactionProcessingPipeline} to be broadcast to\n+     * neighboring nodes.\n+     */\n+    private BlockingQueue<TransactionViewModel> transactionsToBroadcast = new ArrayBlockingQueue<>(MAX_SIZE);\n+\n+    private TipsViewModel tipsViewModel;\n+\n+    /**\n+     * Constructor for the solidifier.\n+     * @param tangle                    The DB reference\n+     * @param snapshotProvider          For fetching entry points for solidity checks\n+     * @param transactionRequester      A requester for missing transactions\n+     */\n+    public TransactionSolidifierImpl(Tangle tangle, SnapshotProvider snapshotProvider, TransactionRequester transactionRequester,\n+                                     TipsViewModel tipsViewModel){\n+        this.tangle = tangle;\n+        this.snapshotProvider = snapshotProvider;\n+        this.transactionRequester = transactionRequester;\n+        this.tipsViewModel = tipsViewModel;\n+    }\n+\n+    /**\n+     *{@inheritDoc}\n+     */\n+    @Override\n+    public void start(){\n+        executorService.silentExecute(this::processTransactionsToSolidify);\n+\n+    }\n+\n+    /**\n+     *{@inheritDoc}\n+     */\n+    @Override\n+    public void shutdown() {\n+        executorService.shutdownNow();\n+    }\n+\n+    /**\n+     *{@inheritDoc}\n+     */\n+    @Override\n+    public void addToSolidificationQueue(Hash hash){\n+        try{\n+            if(!transactionsToSolidify.contains(hash)) {\n+\n+                if(transactionsToSolidify.size() >= MAX_SIZE - 1){\n+                    transactionsToSolidify.remove();\n+                }\n+\n+                transactionsToSolidify.put(hash);\n+            }\n+        } catch(Exception e){\n+            log.error(\"Error placing transaction into solidification queue\",e);\n+        }\n+    }\n+\n+    /**\n+     * {@inheritDoc}\n+     */\n+    @Override\n+    public boolean addMilestoneToSolidificationQueue(Hash hash, int maxToProcess){\n+        try{\n+            TransactionViewModel tx = fromHash(tangle, hash);\n+            if(tx.isSolid()){\n+                addToPropagationQueue(hash);\n+                return true;\n+            }\n+            addToSolidificationQueue(hash);\n+            return false;\n+        }catch(Exception e){\n+            log.error(\"Error adding milestone to solidification queue\", e);\n+            return false;\n+        }\n+    }\n+\n+    /**\n+     *{@inheritDoc}\n+     */\n+    @Override\n+    public Set<TransactionViewModel> getBroadcastQueue(){\n+        return new LinkedHashSet<>(transactionsToBroadcast);\n+    }\n+\n+    /**\n+     *{@inheritDoc}\n+     */\n+    @Override\n+    public void clearFromBroadcastQueue(Set<TransactionViewModel> transactionsBroadcasted){\n+        for (TransactionViewModel tvm : transactionsBroadcasted) {\n+            transactionsToBroadcast.remove(tvm);\n+        }\n+    }\n+\n+\n+    /**\n+     * Iterate through the {@link #transactionsToSolidify} queue and call {@link #checkSolidity(Hash)} on each hash.\n+     * Solid transactions are then processed into the {@link #transactionsToBroadcast} queue.\n+     */\n+    private void processTransactionsToSolidify(){\n+        Hash hash;\n+        while (!Thread.currentThread().isInterrupted()) {\n+            if((hash = transactionsToSolidify.poll()) != null) {\n+                try {\n+                    checkSolidity(hash);\n+                } catch (Exception e) {\n+                    log.info(e.getMessage());\n+                }\n+            }\n+            propagateSolidTransactions();\n+        }\n+    }\n+\n+    /**\n+     *{@inheritDoc}\n+     */\n+    @Override\n+    public boolean checkSolidity(Hash hash) throws Exception {\n+        return checkSolidity(hash, 50000);\n+    }\n+\n+    /**\n+     *{@inheritDoc}\n+     */\n+   @Override\n+    public boolean checkSolidity(Hash hash, int maxProcessedTransactions) throws Exception {\n+        if(fromHash(tangle, hash).isSolid()) {\n+            return true;\n+        }\n+        LinkedHashSet<Hash> analyzedHashes = new LinkedHashSet<>(snapshotProvider.getInitialSnapshot().getSolidEntryPoints().keySet());\n+        if(maxProcessedTransactions != Integer.MAX_VALUE) {\n+            maxProcessedTransactions += analyzedHashes.size();\n+        }\n+        boolean solid = true;\n+        final Queue<Hash> nonAnalyzedTransactions = new LinkedList<>(Collections.singleton(hash));\n+        Hash hashPointer;\n+        while ((hashPointer = nonAnalyzedTransactions.poll()) != null) {\n+            if (!analyzedHashes.add(hashPointer)) {\n+                continue;\n+            }\n+\n+            if (analyzedHashes.size() >= maxProcessedTransactions) {\n+                return false;\n+            }\n+\n+            TransactionViewModel transaction = fromHash(tangle, hashPointer);\n+            if (isUnsolidWithoutEntryPoint(transaction, hashPointer)) {\n+                if (transaction.getType() == PREFILLED_SLOT) {\n+                    solid = false;\n+                    checkRequester(hashPointer);\n+                } else {\n+                    nonAnalyzedTransactions.offer(transaction.getTrunkTransactionHash());\n+                    nonAnalyzedTransactions.offer(transaction.getBranchTransactionHash());\n+                }\n+            }\n+        }\n+        if (solid) {\n+          updateTransactions(analyzedHashes);\n+        }\n+        analyzedHashes.clear();\n+        return  solid;\n+    }\n+\n+\n+    /**\n+     * Check if a transaction is present in the {@link #transactionRequester}, if not, it is added.\n+     * @param hashPointer   The hash of the transaction to request\n+     */\n+    private void checkRequester(Hash hashPointer){\n+        if (!transactionRequester.isTransactionRequested(hashPointer)) {\n+            transactionRequester.requestTransaction(hashPointer);\n+        }\n+    }\n+\n+    /**\n+     * Iterate through analyzed hashes and place them in the {@link #transactionsToBroadcast} queue\n+     * @param hashes    Analyzed hashes from the {@link #checkSolidity(Hash)} call\n+     */\n+    private void updateTransactions(Set<Hash> hashes) {\n+        hashes.forEach(hash -> {\n+            try {\n+                TransactionViewModel tvm = fromHash(tangle, hash);\n+                tvm.updateHeights(tangle, snapshotProvider.getInitialSnapshot());\n+\n+                if(!tvm.isSolid()){\n+                    tvm.updateSolid(true);\n+                    tvm.update(tangle, snapshotProvider.getInitialSnapshot(), \"solid|height\");\n+                }\n+                addToBroadcastQueue(tvm);\n+                addToPropagationQueue(tvm.getHash());\n+            } catch (Exception e) {\n+                log.info(e.getMessage());\n+            }\n+        });\n+    }\n+\n+    /**\n+     * Returns true if transaction is not solid and there are no solid entry points from the initial snapshot.\n+     */\n+    private boolean isUnsolidWithoutEntryPoint(TransactionViewModel transaction, Hash hashPointer) throws Exception{\n+        if(!transaction.isSolid()){\n+            if(!snapshotProvider.getInitialSnapshot().hasSolidEntryPoint(hashPointer)){","path":"src/main/java/com/iota/iri/service/validation/impl/TransactionSolidifierImpl.java","position":260,"original_position":260,"commit_id":"1b5294a9eb52aa10e05fa9e660f11a4587fdb1f4","original_commit_id":"1b5294a9eb52aa10e05fa9e660f11a4587fdb1f4","user":{"login":"GalRogozinski","id":7954839,"node_id":"MDQ6VXNlcjc5NTQ4Mzk=","avatar_url":"https://avatars3.githubusercontent.com/u/7954839?v=4","gravatar_id":"","url":"https://api.github.com/users/GalRogozinski","html_url":"https://github.com/GalRogozinski","followers_url":"https://api.github.com/users/GalRogozinski/followers","following_url":"https://api.github.com/users/GalRogozinski/following{/other_user}","gists_url":"https://api.github.com/users/GalRogozinski/gists{/gist_id}","starred_url":"https://api.github.com/users/GalRogozinski/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GalRogozinski/subscriptions","organizations_url":"https://api.github.com/users/GalRogozinski/orgs","repos_url":"https://api.github.com/users/GalRogozinski/repos","events_url":"https://api.github.com/users/GalRogozinski/events{/privacy}","received_events_url":"https://api.github.com/users/GalRogozinski/received_events","type":"User","site_admin":false},"body":"![Codacy](https://app.codacy.com/assets/images/favicon.png) Issue found: [These nested if statements could be combined](https://app.codacy.com/app/GalRogozinski/iri/pullRequest?prid=4339340)","created_at":"2019-12-24T06:14:16Z","updated_at":"2019-12-24T06:14:16Z","html_url":"https://github.com/iotaledger/iri/pull/1646#discussion_r361075435","pull_request_url":"https://api.github.com/repos/iotaledger/iri/pulls/1646","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/iotaledger/iri/pulls/comments/361075435"},"html":{"href":"https://github.com/iotaledger/iri/pull/1646#discussion_r361075435"},"pull_request":{"href":"https://api.github.com/repos/iotaledger/iri/pulls/1646"}}},"pull_request":{"url":"https://api.github.com/repos/iotaledger/iri/pulls/1646","id":329385381,"node_id":"MDExOlB1bGxSZXF1ZXN0MzI5Mzg1Mzgx","html_url":"https://github.com/iotaledger/iri/pull/1646","diff_url":"https://github.com/iotaledger/iri/pull/1646.diff","patch_url":"https://github.com/iotaledger/iri/pull/1646.patch","issue_url":"https://api.github.com/repos/iotaledger/iri/issues/1646","number":1646,"state":"open","locked":false,"title":"Feature: Add solidification stage to pipeline and only broadcast solid transactions ","user":{"login":"DyrellC","id":34013004,"node_id":"MDQ6VXNlcjM0MDEzMDA0","avatar_url":"https://avatars2.githubusercontent.com/u/34013004?v=4","gravatar_id":"","url":"https://api.github.com/users/DyrellC","html_url":"https://github.com/DyrellC","followers_url":"https://api.github.com/users/DyrellC/followers","following_url":"https://api.github.com/users/DyrellC/following{/other_user}","gists_url":"https://api.github.com/users/DyrellC/gists{/gist_id}","starred_url":"https://api.github.com/users/DyrellC/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DyrellC/subscriptions","organizations_url":"https://api.github.com/users/DyrellC/orgs","repos_url":"https://api.github.com/users/DyrellC/repos","events_url":"https://api.github.com/users/DyrellC/events{/privacy}","received_events_url":"https://api.github.com/users/DyrellC/received_events","type":"User","site_admin":false},"body":"# Description\r\nAbstract the broadcast queue to allow solidification and networking operations to place transactions in the `BroadcastStage`. This improves the speed that transactions are broadcast to neighbours to improve synchronisation as well as allow neighbour nodes to receive newly added transactions faster. Improves state of the tangle in higher concentrated TPS environments. \r\n\r\nFixes #1512 \r\n\r\n## Type of change\r\n- Enhancement (a non-breaking change which adds functionality)\r\n\r\n# How Has This Been Tested?\r\n-High throughput spam mixing correctly with lower throughput spam from neighbouring node \r\n\r\n# Checklist:\r\n- [x] My code follows the style guidelines for this project\r\n- [x] I have performed a self-review of my own code\r\n- [x] I have commented my code, particularly in hard-to-understand areas\r\n- [x] New and existing unit tests pass locally with my changes\r\n","created_at":"2019-10-17T17:48:40Z","updated_at":"2019-12-24T06:14:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f4c84576b37f3a6aca6a64efc71674b4dac87966","assignee":null,"assignees":[],"requested_reviewers":[{"login":"kwek20","id":1417565,"node_id":"MDQ6VXNlcjE0MTc1NjU=","avatar_url":"https://avatars1.githubusercontent.com/u/1417565?v=4","gravatar_id":"","url":"https://api.github.com/users/kwek20","html_url":"https://github.com/kwek20","followers_url":"https://api.github.com/users/kwek20/followers","following_url":"https://api.github.com/users/kwek20/following{/other_user}","gists_url":"https://api.github.com/users/kwek20/gists{/gist_id}","starred_url":"https://api.github.com/users/kwek20/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kwek20/subscriptions","organizations_url":"https://api.github.com/users/kwek20/orgs","repos_url":"https://api.github.com/users/kwek20/repos","events_url":"https://api.github.com/users/kwek20/events{/privacy}","received_events_url":"https://api.github.com/users/kwek20/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/iotaledger/iri/pulls/1646/commits","review_comments_url":"https://api.github.com/repos/iotaledger/iri/pulls/1646/comments","review_comment_url":"https://api.github.com/repos/iotaledger/iri/pulls/comments{/number}","comments_url":"https://api.github.com/repos/iotaledger/iri/issues/1646/comments","statuses_url":"https://api.github.com/repos/iotaledger/iri/statuses/1b5294a9eb52aa10e05fa9e660f11a4587fdb1f4","head":{"label":"DyrellC:add-Broadcast-queue","ref":"add-Broadcast-queue","sha":"1b5294a9eb52aa10e05fa9e660f11a4587fdb1f4","user":{"login":"DyrellC","id":34013004,"node_id":"MDQ6VXNlcjM0MDEzMDA0","avatar_url":"https://avatars2.githubusercontent.com/u/34013004?v=4","gravatar_id":"","url":"https://api.github.com/users/DyrellC","html_url":"https://github.com/DyrellC","followers_url":"https://api.github.com/users/DyrellC/followers","following_url":"https://api.github.com/users/DyrellC/following{/other_user}","gists_url":"https://api.github.com/users/DyrellC/gists{/gist_id}","starred_url":"https://api.github.com/users/DyrellC/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DyrellC/subscriptions","organizations_url":"https://api.github.com/users/DyrellC/orgs","repos_url":"https://api.github.com/users/DyrellC/repos","events_url":"https://api.github.com/users/DyrellC/events{/privacy}","received_events_url":"https://api.github.com/users/DyrellC/received_events","type":"User","site_admin":false},"repo":{"id":155443791,"node_id":"MDEwOlJlcG9zaXRvcnkxNTU0NDM3OTE=","name":"iri","full_name":"DyrellC/iri","private":false,"owner":{"login":"DyrellC","id":34013004,"node_id":"MDQ6VXNlcjM0MDEzMDA0","avatar_url":"https://avatars2.githubusercontent.com/u/34013004?v=4","gravatar_id":"","url":"https://api.github.com/users/DyrellC","html_url":"https://github.com/DyrellC","followers_url":"https://api.github.com/users/DyrellC/followers","following_url":"https://api.github.com/users/DyrellC/following{/other_user}","gists_url":"https://api.github.com/users/DyrellC/gists{/gist_id}","starred_url":"https://api.github.com/users/DyrellC/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DyrellC/subscriptions","organizations_url":"https://api.github.com/users/DyrellC/orgs","repos_url":"https://api.github.com/users/DyrellC/repos","events_url":"https://api.github.com/users/DyrellC/events{/privacy}","received_events_url":"https://api.github.com/users/DyrellC/received_events","type":"User","site_admin":false},"html_url":"https://github.com/DyrellC/iri","description":"IOTA Reference Implementation","fork":true,"url":"https://api.github.com/repos/DyrellC/iri","forks_url":"https://api.github.com/repos/DyrellC/iri/forks","keys_url":"https://api.github.com/repos/DyrellC/iri/keys{/key_id}","collaborators_url":"https://api.github.com/repos/DyrellC/iri/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/DyrellC/iri/teams","hooks_url":"https://api.github.com/repos/DyrellC/iri/hooks","issue_events_url":"https://api.github.com/repos/DyrellC/iri/issues/events{/number}","events_url":"https://api.github.com/repos/DyrellC/iri/events","assignees_url":"https://api.github.com/repos/DyrellC/iri/assignees{/user}","branches_url":"https://api.github.com/repos/DyrellC/iri/branches{/branch}","tags_url":"https://api.github.com/repos/DyrellC/iri/tags","blobs_url":"https://api.github.com/repos/DyrellC/iri/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/DyrellC/iri/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/DyrellC/iri/git/refs{/sha}","trees_url":"https://api.github.com/repos/DyrellC/iri/git/trees{/sha}","statuses_url":"https://api.github.com/repos/DyrellC/iri/statuses/{sha}","languages_url":"https://api.github.com/repos/DyrellC/iri/languages","stargazers_url":"https://api.github.com/repos/DyrellC/iri/stargazers","contributors_url":"https://api.github.com/repos/DyrellC/iri/contributors","subscribers_url":"https://api.github.com/repos/DyrellC/iri/subscribers","subscription_url":"https://api.github.com/repos/DyrellC/iri/subscription","commits_url":"https://api.github.com/repos/DyrellC/iri/commits{/sha}","git_commits_url":"https://api.github.com/repos/DyrellC/iri/git/commits{/sha}","comments_url":"https://api.github.com/repos/DyrellC/iri/comments{/number}","issue_comment_url":"https://api.github.com/repos/DyrellC/iri/issues/comments{/number}","contents_url":"https://api.github.com/repos/DyrellC/iri/contents/{+path}","compare_url":"https://api.github.com/repos/DyrellC/iri/compare/{base}...{head}","merges_url":"https://api.github.com/repos/DyrellC/iri/merges","archive_url":"https://api.github.com/repos/DyrellC/iri/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/DyrellC/iri/downloads","issues_url":"https://api.github.com/repos/DyrellC/iri/issues{/number}","pulls_url":"https://api.github.com/repos/DyrellC/iri/pulls{/number}","milestones_url":"https://api.github.com/repos/DyrellC/iri/milestones{/number}","notifications_url":"https://api.github.com/repos/DyrellC/iri/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/DyrellC/iri/labels{/name}","releases_url":"https://api.github.com/repos/DyrellC/iri/releases{/id}","deployments_url":"https://api.github.com/repos/DyrellC/iri/deployments","created_at":"2018-10-30T19:24:35Z","updated_at":"2019-10-04T16:58:31Z","pushed_at":"2019-12-24T06:11:28Z","git_url":"git://github.com/DyrellC/iri.git","ssh_url":"git@github.com:DyrellC/iri.git","clone_url":"https://github.com/DyrellC/iri.git","svn_url":"https://github.com/DyrellC/iri","homepage":null,"size":239035,"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,"disabled":false,"open_issues_count":0,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"dev"}},"base":{"label":"iotaledger:dev","ref":"dev","sha":"fc7dadb7ac728bb2128434ac4d08051880f1cd5d","user":{"login":"iotaledger","id":20126597,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIwMTI2NTk3","avatar_url":"https://avatars3.githubusercontent.com/u/20126597?v=4","gravatar_id":"","url":"https://api.github.com/users/iotaledger","html_url":"https://github.com/iotaledger","followers_url":"https://api.github.com/users/iotaledger/followers","following_url":"https://api.github.com/users/iotaledger/following{/other_user}","gists_url":"https://api.github.com/users/iotaledger/gists{/gist_id}","starred_url":"https://api.github.com/users/iotaledger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iotaledger/subscriptions","organizations_url":"https://api.github.com/users/iotaledger/orgs","repos_url":"https://api.github.com/users/iotaledger/repos","events_url":"https://api.github.com/users/iotaledger/events{/privacy}","received_events_url":"https://api.github.com/users/iotaledger/received_events","type":"Organization","site_admin":false},"repo":{"id":71836159,"node_id":"MDEwOlJlcG9zaXRvcnk3MTgzNjE1OQ==","name":"iri","full_name":"iotaledger/iri","private":false,"owner":{"login":"iotaledger","id":20126597,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIwMTI2NTk3","avatar_url":"https://avatars3.githubusercontent.com/u/20126597?v=4","gravatar_id":"","url":"https://api.github.com/users/iotaledger","html_url":"https://github.com/iotaledger","followers_url":"https://api.github.com/users/iotaledger/followers","following_url":"https://api.github.com/users/iotaledger/following{/other_user}","gists_url":"https://api.github.com/users/iotaledger/gists{/gist_id}","starred_url":"https://api.github.com/users/iotaledger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iotaledger/subscriptions","organizations_url":"https://api.github.com/users/iotaledger/orgs","repos_url":"https://api.github.com/users/iotaledger/repos","events_url":"https://api.github.com/users/iotaledger/events{/privacy}","received_events_url":"https://api.github.com/users/iotaledger/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/iotaledger/iri","description":"IOTA Reference Implementation","fork":false,"url":"https://api.github.com/repos/iotaledger/iri","forks_url":"https://api.github.com/repos/iotaledger/iri/forks","keys_url":"https://api.github.com/repos/iotaledger/iri/keys{/key_id}","collaborators_url":"https://api.github.com/repos/iotaledger/iri/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/iotaledger/iri/teams","hooks_url":"https://api.github.com/repos/iotaledger/iri/hooks","issue_events_url":"https://api.github.com/repos/iotaledger/iri/issues/events{/number}","events_url":"https://api.github.com/repos/iotaledger/iri/events","assignees_url":"https://api.github.com/repos/iotaledger/iri/assignees{/user}","branches_url":"https://api.github.com/repos/iotaledger/iri/branches{/branch}","tags_url":"https://api.github.com/repos/iotaledger/iri/tags","blobs_url":"https://api.github.com/repos/iotaledger/iri/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/iotaledger/iri/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/iotaledger/iri/git/refs{/sha}","trees_url":"https://api.github.com/repos/iotaledger/iri/git/trees{/sha}","statuses_url":"https://api.github.com/repos/iotaledger/iri/statuses/{sha}","languages_url":"https://api.github.com/repos/iotaledger/iri/languages","stargazers_url":"https://api.github.com/repos/iotaledger/iri/stargazers","contributors_url":"https://api.github.com/repos/iotaledger/iri/contributors","subscribers_url":"https://api.github.com/repos/iotaledger/iri/subscribers","subscription_url":"https://api.github.com/repos/iotaledger/iri/subscription","commits_url":"https://api.github.com/repos/iotaledger/iri/commits{/sha}","git_commits_url":"https://api.github.com/repos/iotaledger/iri/git/commits{/sha}","comments_url":"https://api.github.com/repos/iotaledger/iri/comments{/number}","issue_comment_url":"https://api.github.com/repos/iotaledger/iri/issues/comments{/number}","contents_url":"https://api.github.com/repos/iotaledger/iri/contents/{+path}","compare_url":"https://api.github.com/repos/iotaledger/iri/compare/{base}...{head}","merges_url":"https://api.github.com/repos/iotaledger/iri/merges","archive_url":"https://api.github.com/repos/iotaledger/iri/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/iotaledger/iri/downloads","issues_url":"https://api.github.com/repos/iotaledger/iri/issues{/number}","pulls_url":"https://api.github.com/repos/iotaledger/iri/pulls{/number}","milestones_url":"https://api.github.com/repos/iotaledger/iri/milestones{/number}","notifications_url":"https://api.github.com/repos/iotaledger/iri/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/iotaledger/iri/labels{/name}","releases_url":"https://api.github.com/repos/iotaledger/iri/releases{/id}","deployments_url":"https://api.github.com/repos/iotaledger/iri/deployments","created_at":"2016-10-24T22:06:06Z","updated_at":"2019-12-19T09:45:49Z","pushed_at":"2019-12-24T06:11:30Z","git_url":"git://github.com/iotaledger/iri.git","ssh_url":"git@github.com:iotaledger/iri.git","clone_url":"https://github.com/iotaledger/iri.git","svn_url":"https://github.com/iotaledger/iri","homepage":null,"size":238656,"stargazers_count":1179,"watchers_count":1179,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":429,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":411,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":429,"open_issues":411,"watchers":1179,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/iotaledger/iri/pulls/1646"},"html":{"href":"https://github.com/iotaledger/iri/pull/1646"},"issue":{"href":"https://api.github.com/repos/iotaledger/iri/issues/1646"},"comments":{"href":"https://api.github.com/repos/iotaledger/iri/issues/1646/comments"},"review_comments":{"href":"https://api.github.com/repos/iotaledger/iri/pulls/1646/comments"},"review_comment":{"href":"https://api.github.com/repos/iotaledger/iri/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/iotaledger/iri/pulls/1646/commits"},"statuses":{"href":"https://api.github.com/repos/iotaledger/iri/statuses/1b5294a9eb52aa10e05fa9e660f11a4587fdb1f4"}},"author_association":"CONTRIBUTOR"}}
other: {"actor":{"display_login":"GalRogozinski"}}