{"action":"created","comment":{"url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls/comments/308648789","pull_request_review_id":268297657,"id":308648789,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDMwODY0ODc4OQ==","diff_hunk":"@@ -0,0 +1,500 @@\n+/* eslint-env mocha */\n+/* eslint-disable no-console */\n+/* global artifacts, contract, describe, it */\n+const chai = require('chai')\n+const { assert } = chai\n+const chaiAsPromised = require('chai-as-promised')\n+chai.use(chaiAsPromised)\n+\n+const EpochLibrary = artifacts.require('EpochLibrary')\n+const ConditionStoreManager = artifacts.require('ConditionStoreManager')\n+const ThresholdCondition = artifacts.require('ThresholdCondition')\n+const HashLockCondition = artifacts.require('HashLockCondition')\n+\n+const constants = require('../../helpers/constants.js')\n+const testUtils = require('../../helpers/utils.js')\n+\n+contract('Threshold Condition', (accounts) => {\n+    let owner = accounts[1]\n+    let createRole = accounts[0]\n+    let hashLockCondition\n+    let randomConditionID\n+    let randomConditions = []\n+    async function setupTest({\n+        conditionId = constants.bytes32.one,\n+        conditionType = constants.address.dummy,\n+        createRole = accounts[0],\n+        owner = accounts[1],\n+        fulfillInputConditions = true,\n+        includeRandomInputConditions = false,\n+        MaxNConditions = 1000\n+    } = {}) {\n+        const epochLibrary = await EpochLibrary.new()\n+        await ConditionStoreManager.link('EpochLibrary', epochLibrary.address)\n+\n+        const conditionStoreManager = await ConditionStoreManager.new()\n+        await conditionStoreManager.initialize(\n+            owner,\n+            { from: accounts[0] }\n+        )\n+\n+        await conditionStoreManager.delegateCreateRole(\n+            createRole,\n+            { from: owner }\n+        )\n+\n+        const thresholdCondition = await ThresholdCondition.new()\n+        await thresholdCondition.initialize(\n+            owner,\n+            conditionStoreManager.address,\n+            { from: accounts[0] }\n+        )\n+\n+        // create dummy and real input conditions\n+        hashLockCondition = await HashLockCondition.new()\n+        await hashLockCondition.initialize(\n+            owner,\n+            conditionStoreManager.address,\n+            { from: owner }\n+        )\n+\n+        const firstConditionId = await hashLockCondition.generateId(\n+            constants.bytes32.one,\n+            constants.condition.hashlock.uint.keccak\n+        )\n+\n+        const secondConditionId = await hashLockCondition.generateId(\n+            constants.bytes32.two,\n+            constants.condition.hashlock.uint.keccak\n+        )\n+\n+        await conditionStoreManager.createCondition(\n+            firstConditionId,\n+            hashLockCondition.address\n+        )\n+\n+        await conditionStoreManager.createCondition(\n+            secondConditionId,\n+            hashLockCondition.address\n+        )\n+\n+        if (fulfillInputConditions) {\n+            await hashLockCondition.fulfill(\n+                constants.bytes32.one,\n+                constants.condition.hashlock.uint.preimage\n+            )\n+\n+            await hashLockCondition.fulfill(\n+                constants.bytes32.two,\n+                constants.condition.hashlock.uint.preimage\n+            )\n+\n+            const firstConditionState = await conditionStoreManager.getCondition(firstConditionId)\n+            const secondConditionState = await conditionStoreManager.getCondition(secondConditionId)\n+            assert.strictEqual(firstConditionState.state.toNumber(), constants.condition.state.fulfilled)\n+            assert.strictEqual(secondConditionState.state.toNumber(), constants.condition.state.fulfilled)\n+        }\n+\n+        const inputConditions = [\n+            firstConditionId,\n+            secondConditionId\n+        ]\n+\n+        if (includeRandomInputConditions) {\n+            for (let i = 0; i < MaxNConditions - 2; i++) {\n+                randomConditionID = testUtils.generateId()\n+                await conditionStoreManager.createCondition(\n+                    randomConditionID,\n+                    hashLockCondition.address\n+                )\n+                randomConditions.push(randomConditionID)\n+            }\n+            randomConditions.push(inputConditions[0])\n+            randomConditions.push(inputConditions[1])\n+        }\n+\n+        return { thresholdCondition, conditionStoreManager, conditionId, conditionType, createRole, owner, inputConditions, randomConditions }\n+    }\n+\n+    describe('deploy and setup', () => {\n+        it('contract should deploy', async () => {\n+            const epochLibrary = await EpochLibrary.new()\n+            await ConditionStoreManager.link('EpochLibrary', epochLibrary.address)\n+\n+            const conditionStoreManager = await ConditionStoreManager.new()\n+            await conditionStoreManager.initialize(\n+                owner,\n+                { from: owner }\n+            )\n+\n+            await conditionStoreManager.delegateCreateRole(\n+                createRole,\n+                { from: owner }\n+            )\n+\n+            const thresholdCondition = await ThresholdCondition.new()\n+            await thresholdCondition.initialize(\n+                owner,\n+                conditionStoreManager.address,\n+                { from: owner }\n+            )\n+        })\n+    })\n+\n+    describe('fulfill non existing condition', () => {\n+        it('should not fulfill if conditions do not exist', async () => {\n+            const { thresholdCondition, inputConditions } = await setupTest()\n+            let agreementId = constants.bytes32.three\n+\n+            await assert.isRejected(\n+                thresholdCondition.fulfill(agreementId, inputConditions, 2, { from: accounts[2] }),\n+                constants.condition.state.error.conditionNeedsToBeUnfulfilled\n+            )\n+        })\n+    })\n+\n+    describe('fulfill existing condition', () => {\n+        it('should fulfill if conditions exist', async () => {\n+            const {\n+                thresholdCondition,\n+                conditionStoreManager,\n+                inputConditions,\n+                createRole\n+            } = await setupTest()\n+\n+            let agreementId = constants.bytes32.three\n+\n+            let hashValues = await thresholdCondition.hashValues(inputConditions, inputConditions.length)\n+\n+            const conditionId = await thresholdCondition.generateId(\n+                agreementId,\n+                hashValues\n+            )\n+\n+            await conditionStoreManager.createCondition(\n+                conditionId,\n+                thresholdCondition.address\n+            )\n+\n+            await thresholdCondition.methods['fulfill(bytes32,bytes32[],uint256)'](\n+                agreementId,\n+                inputConditions,\n+                inputConditions.length,\n+                {\n+                    from: createRole\n+                }\n+            )\n+\n+            let { state } = await conditionStoreManager.getCondition(conditionId)\n+            assert.strictEqual(constants.condition.state.fulfilled, state.toNumber())\n+        })\n+    })\n+\n+    describe('fail to fulfill existing condition', () => {\n+        it('wrong value should fail to fulfill if conditions exist', async () => {\n+            const {\n+                thresholdCondition,\n+                conditionStoreManager,\n+                inputConditions,\n+                createRole\n+            } = await setupTest()\n+            let agreementId = constants.bytes32.three\n+\n+            let hashValues = await thresholdCondition.hashValues(inputConditions, inputConditions.length)\n+\n+            const conditionId = await thresholdCondition.generateId(\n+                agreementId,\n+                hashValues\n+            )\n+\n+            await conditionStoreManager.createCondition(\n+                conditionId,\n+                thresholdCondition.address\n+            )\n+\n+            await thresholdCondition.methods['fulfill(bytes32,bytes32[],uint256)'](\n+                agreementId,\n+                inputConditions,\n+                inputConditions.length,\n+                {\n+                    from: createRole\n+                }\n+            )\n+            const invalidInputConditions = [\n+                constants.bytes32.one,\n+                constants.bytes32.two\n+            ]\n+            await assert.isRejected(\n+                thresholdCondition.methods['fulfill(bytes32,bytes32[],uint256)'](\n+                    agreementId,\n+                    invalidInputConditions,\n+                    inputConditions.length,\n+                    {\n+                        from: createRole\n+                    }\n+                ),\n+                'Invalid threshold fulfilment'\n+            )\n+        })\n+\n+        it('wrong value should fail to fulfill if conditions exist', async () => {\n+            const {\n+                thresholdCondition,\n+                conditionStoreManager,\n+                inputConditions,\n+                createRole\n+            } = await setupTest()\n+            let agreementId = constants.bytes32.three\n+\n+            let hashValues = await thresholdCondition.hashValues(inputConditions, inputConditions.length)\n+\n+            const conditionId = await thresholdCondition.generateId(\n+                agreementId,\n+                hashValues\n+            )\n+\n+            await conditionStoreManager.createCondition(\n+                conditionId,\n+                thresholdCondition.address\n+            )\n+            await assert.isRejected(\n+                thresholdCondition.methods['fulfill(bytes32,bytes32[],uint256)'](\n+                    agreementId,\n+                    inputConditions,\n+                    inputConditions.length - 1,\n+                    {\n+                        from: createRole\n+                    }\n+                ),\n+                'Invalid UpdateRole'\n+            )\n+        })\n+\n+        it('right value should fail to fulfill if conditions already fulfilled ', async () => {\n+            const {\n+                thresholdCondition,\n+                conditionStoreManager,\n+                inputConditions,\n+                createRole\n+            } = await setupTest()\n+\n+            let agreementId = constants.bytes32.three\n+\n+            let hashValues = await thresholdCondition.hashValues(inputConditions, inputConditions.length)\n+\n+            const conditionId = await thresholdCondition.generateId(\n+                agreementId,\n+                hashValues\n+            )\n+\n+            await conditionStoreManager.createCondition(\n+                conditionId,\n+                thresholdCondition.address\n+            )\n+\n+            await thresholdCondition.methods['fulfill(bytes32,bytes32[],uint256)'](\n+                agreementId,\n+                inputConditions,\n+                inputConditions.length,\n+                {\n+                    from: createRole\n+                }\n+            )\n+\n+            await assert.isRejected(\n+                thresholdCondition.methods['fulfill(bytes32,bytes32[],uint256)'](\n+                    agreementId,\n+                    inputConditions,\n+                    inputConditions.length,\n+                    {\n+                        from: createRole\n+                    }\n+                ),\n+                constants.condition.state.error.invalidStateTransition\n+            )\n+        })\n+\n+        it('should fail to fulfill if conditions has different type ref', async () => {\n+            const {\n+                thresholdCondition,\n+                conditionStoreManager,\n+                inputConditions,\n+                owner,\n+                createRole\n+            } = await setupTest()\n+\n+            let agreementId = constants.bytes32.three\n+\n+            let hashValues = await thresholdCondition.hashValues(inputConditions, inputConditions.length)\n+\n+            const conditionId = await thresholdCondition.generateId(\n+                agreementId,\n+                hashValues\n+            )\n+\n+            await conditionStoreManager.createCondition(\n+                conditionId,\n+                thresholdCondition.address\n+            )\n+\n+            await conditionStoreManager.delegateUpdateRole(\n+                conditionId,\n+                createRole,\n+                { from: owner }\n+            )\n+\n+            await assert.isRejected(\n+                thresholdCondition.methods['fulfill(bytes32,bytes32[],uint256)'](\n+                    agreementId,\n+                    inputConditions,\n+                    inputConditions.length,\n+                    {\n+                        from: createRole\n+                    }\n+                ),\n+                constants.acl.error.invalidUpdateRole\n+            )\n+        })\n+    })\n+\n+    describe('UNINITIALIZED OR ABORTED input conditions', () => {\n+        it('should fail if input conditions are Uninitialized', async () => {\n+            const {\n+                thresholdCondition,\n+                conditionStoreManager,\n+                inputConditions,\n+                createRole\n+            } = await setupTest({ fulfillInputConditions: false })\n+\n+            let agreementId = constants.bytes32.three\n+\n+            let hashValues = await thresholdCondition.hashValues(inputConditions, inputConditions.length)\n+\n+            const conditionId = await thresholdCondition.generateId(\n+                agreementId,\n+                hashValues\n+            )\n+\n+            await conditionStoreManager.createCondition(\n+                conditionId,\n+                thresholdCondition.address\n+            )\n+\n+            await assert.isRejected(\n+                thresholdCondition.methods['fulfill(bytes32,bytes32[],uint256)'](\n+                    agreementId,\n+                    inputConditions,\n+                    inputConditions.length,\n+                    {\n+                        from: createRole\n+                    }\n+                )\n+            )\n+        })\n+\n+        it('should fail if input conditions are ABORTED', async () => {\n+            const {\n+                thresholdCondition,\n+                conditionStoreManager,\n+                inputConditions,\n+                createRole,\n+                owner\n+            } = await setupTest({ fulfillInputConditions: false })\n+\n+            let agreementId = constants.bytes32.three\n+\n+            let hashValues = await thresholdCondition.hashValues(inputConditions, inputConditions.length)\n+\n+            const conditionId = await thresholdCondition.generateId(\n+                agreementId,\n+                hashValues\n+            )\n+\n+            // Abort input conditions\n+            await conditionStoreManager.delegateUpdateRole(\n+                inputConditions[0],\n+                createRole,\n+                {\n+                    from: owner\n+                }\n+            )\n+            await conditionStoreManager.delegateUpdateRole(\n+                inputConditions[1],\n+                createRole,\n+                {\n+                    from: owner\n+                }\n+            )\n+            await conditionStoreManager.updateConditionState(\n+                inputConditions[0],\n+                3,\n+                {\n+                    from: createRole\n+                }\n+            )\n+            await conditionStoreManager.updateConditionState(\n+                inputConditions[1],\n+                3,\n+                {\n+                    from: createRole\n+                }\n+            )\n+            await conditionStoreManager.createCondition(\n+                conditionId,\n+                thresholdCondition.address\n+            )\n+\n+            await assert.isRejected(\n+                thresholdCondition.methods['fulfill(bytes32,bytes32[],uint256)'](\n+                    agreementId,\n+                    inputConditions,\n+                    inputConditions.length,\n+                    {\n+                        from: createRole\n+                    }\n+                )","path":"test/unit/conditions/ThresholdCondition.Test.js","position":455,"original_position":455,"commit_id":"d820af83f2568c92ff97abd5c934580fc2f23f13","original_commit_id":"d820af83f2568c92ff97abd5c934580fc2f23f13","user":{"login":"diminator","id":6178597,"node_id":"MDQ6VXNlcjYxNzg1OTc=","avatar_url":"https://avatars1.githubusercontent.com/u/6178597?v=4","gravatar_id":"","url":"https://api.github.com/users/diminator","html_url":"https://github.com/diminator","followers_url":"https://api.github.com/users/diminator/followers","following_url":"https://api.github.com/users/diminator/following{/other_user}","gists_url":"https://api.github.com/users/diminator/gists{/gist_id}","starred_url":"https://api.github.com/users/diminator/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/diminator/subscriptions","organizations_url":"https://api.github.com/users/diminator/orgs","repos_url":"https://api.github.com/users/diminator/repos","events_url":"https://api.github.com/users/diminator/events{/privacy}","received_events_url":"https://api.github.com/users/diminator/received_events","type":"User","site_admin":false},"body":"what's the error message?","created_at":"2019-07-30T10:31:33Z","updated_at":"2019-07-30T10:31:56Z","html_url":"https://github.com/oceanprotocol/keeper-contracts/pull/558#discussion_r308648789","pull_request_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls/558","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls/comments/308648789"},"html":{"href":"https://github.com/oceanprotocol/keeper-contracts/pull/558#discussion_r308648789"},"pull_request":{"href":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls/558"}}},"pull_request":{"url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls/558","id":297636049,"node_id":"MDExOlB1bGxSZXF1ZXN0Mjk3NjM2MDQ5","html_url":"https://github.com/oceanprotocol/keeper-contracts/pull/558","diff_url":"https://github.com/oceanprotocol/keeper-contracts/pull/558.diff","patch_url":"https://github.com/oceanprotocol/keeper-contracts/pull/558.patch","issue_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/issues/558","number":558,"state":"open","locked":false,"title":"Feature/Threshold","user":{"login":"0x3bfc","id":5428661,"node_id":"MDQ6VXNlcjU0Mjg2NjE=","avatar_url":"https://avatars3.githubusercontent.com/u/5428661?v=4","gravatar_id":"","url":"https://api.github.com/users/0x3bfc","html_url":"https://github.com/0x3bfc","followers_url":"https://api.github.com/users/0x3bfc/followers","following_url":"https://api.github.com/users/0x3bfc/following{/other_user}","gists_url":"https://api.github.com/users/0x3bfc/gists{/gist_id}","starred_url":"https://api.github.com/users/0x3bfc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/0x3bfc/subscriptions","organizations_url":"https://api.github.com/users/0x3bfc/orgs","repos_url":"https://api.github.com/users/0x3bfc/repos","events_url":"https://api.github.com/users/0x3bfc/events{/privacy}","received_events_url":"https://api.github.com/users/0x3bfc/received_events","type":"User","site_admin":false},"body":"Closes #550 \r\n\r\n- [x] Condition implementation\r\n- [x] Unit testing (coverage 100 %)\r\n- [x] Documentation\r\n\r\nTemplate will be added in a different PR :) ","created_at":"2019-07-15T14:03:31Z","updated_at":"2019-07-30T10:31:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"25d9ecde55f0d8b3dd082f709d505a109073aaef","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls/558/commits","review_comments_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls/558/comments","review_comment_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls/comments{/number}","comments_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/issues/558/comments","statuses_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/statuses/d820af83f2568c92ff97abd5c934580fc2f23f13","head":{"label":"oceanprotocol:feature/thresholding","ref":"feature/thresholding","sha":"d820af83f2568c92ff97abd5c934580fc2f23f13","user":{"login":"oceanprotocol","id":31523682,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNTIzNjgy","avatar_url":"https://avatars2.githubusercontent.com/u/31523682?v=4","gravatar_id":"","url":"https://api.github.com/users/oceanprotocol","html_url":"https://github.com/oceanprotocol","followers_url":"https://api.github.com/users/oceanprotocol/followers","following_url":"https://api.github.com/users/oceanprotocol/following{/other_user}","gists_url":"https://api.github.com/users/oceanprotocol/gists{/gist_id}","starred_url":"https://api.github.com/users/oceanprotocol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oceanprotocol/subscriptions","organizations_url":"https://api.github.com/users/oceanprotocol/orgs","repos_url":"https://api.github.com/users/oceanprotocol/repos","events_url":"https://api.github.com/users/oceanprotocol/events{/privacy}","received_events_url":"https://api.github.com/users/oceanprotocol/received_events","type":"Organization","site_admin":false},"repo":{"id":136028978,"node_id":"MDEwOlJlcG9zaXRvcnkxMzYwMjg5Nzg=","name":"keeper-contracts","full_name":"oceanprotocol/keeper-contracts","private":false,"owner":{"login":"oceanprotocol","id":31523682,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNTIzNjgy","avatar_url":"https://avatars2.githubusercontent.com/u/31523682?v=4","gravatar_id":"","url":"https://api.github.com/users/oceanprotocol","html_url":"https://github.com/oceanprotocol","followers_url":"https://api.github.com/users/oceanprotocol/followers","following_url":"https://api.github.com/users/oceanprotocol/following{/other_user}","gists_url":"https://api.github.com/users/oceanprotocol/gists{/gist_id}","starred_url":"https://api.github.com/users/oceanprotocol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oceanprotocol/subscriptions","organizations_url":"https://api.github.com/users/oceanprotocol/orgs","repos_url":"https://api.github.com/users/oceanprotocol/repos","events_url":"https://api.github.com/users/oceanprotocol/events{/privacy}","received_events_url":"https://api.github.com/users/oceanprotocol/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/oceanprotocol/keeper-contracts","description":"💧 Integration of SEAs, DID and OceanToken in Solidity","fork":false,"url":"https://api.github.com/repos/oceanprotocol/keeper-contracts","forks_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/forks","keys_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/teams","hooks_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/hooks","issue_events_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/issues/events{/number}","events_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/events","assignees_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/assignees{/user}","branches_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/branches{/branch}","tags_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/tags","blobs_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/git/refs{/sha}","trees_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/statuses/{sha}","languages_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/languages","stargazers_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/stargazers","contributors_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/contributors","subscribers_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/subscribers","subscription_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/subscription","commits_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/commits{/sha}","git_commits_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/git/commits{/sha}","comments_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/comments{/number}","issue_comment_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/issues/comments{/number}","contents_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/contents/{+path}","compare_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/merges","archive_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/downloads","issues_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/issues{/number}","pulls_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls{/number}","milestones_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/milestones{/number}","notifications_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/labels{/name}","releases_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/releases{/id}","deployments_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/deployments","created_at":"2018-06-04T13:26:12Z","updated_at":"2019-07-26T09:02:15Z","pushed_at":"2019-07-30T09:55:24Z","git_url":"git://github.com/oceanprotocol/keeper-contracts.git","ssh_url":"git@github.com:oceanprotocol/keeper-contracts.git","clone_url":"https://github.com/oceanprotocol/keeper-contracts.git","svn_url":"https://github.com/oceanprotocol/keeper-contracts","homepage":"http://oceanprotocol.com","size":64727,"stargazers_count":82,"watchers_count":82,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":14,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":22,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":14,"open_issues":22,"watchers":82,"default_branch":"develop"}},"base":{"label":"oceanprotocol:develop","ref":"develop","sha":"6e6e9fa0bdd47a53bd0563f60ffd827f5c45f13b","user":{"login":"oceanprotocol","id":31523682,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNTIzNjgy","avatar_url":"https://avatars2.githubusercontent.com/u/31523682?v=4","gravatar_id":"","url":"https://api.github.com/users/oceanprotocol","html_url":"https://github.com/oceanprotocol","followers_url":"https://api.github.com/users/oceanprotocol/followers","following_url":"https://api.github.com/users/oceanprotocol/following{/other_user}","gists_url":"https://api.github.com/users/oceanprotocol/gists{/gist_id}","starred_url":"https://api.github.com/users/oceanprotocol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oceanprotocol/subscriptions","organizations_url":"https://api.github.com/users/oceanprotocol/orgs","repos_url":"https://api.github.com/users/oceanprotocol/repos","events_url":"https://api.github.com/users/oceanprotocol/events{/privacy}","received_events_url":"https://api.github.com/users/oceanprotocol/received_events","type":"Organization","site_admin":false},"repo":{"id":136028978,"node_id":"MDEwOlJlcG9zaXRvcnkxMzYwMjg5Nzg=","name":"keeper-contracts","full_name":"oceanprotocol/keeper-contracts","private":false,"owner":{"login":"oceanprotocol","id":31523682,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNTIzNjgy","avatar_url":"https://avatars2.githubusercontent.com/u/31523682?v=4","gravatar_id":"","url":"https://api.github.com/users/oceanprotocol","html_url":"https://github.com/oceanprotocol","followers_url":"https://api.github.com/users/oceanprotocol/followers","following_url":"https://api.github.com/users/oceanprotocol/following{/other_user}","gists_url":"https://api.github.com/users/oceanprotocol/gists{/gist_id}","starred_url":"https://api.github.com/users/oceanprotocol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oceanprotocol/subscriptions","organizations_url":"https://api.github.com/users/oceanprotocol/orgs","repos_url":"https://api.github.com/users/oceanprotocol/repos","events_url":"https://api.github.com/users/oceanprotocol/events{/privacy}","received_events_url":"https://api.github.com/users/oceanprotocol/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/oceanprotocol/keeper-contracts","description":"💧 Integration of SEAs, DID and OceanToken in Solidity","fork":false,"url":"https://api.github.com/repos/oceanprotocol/keeper-contracts","forks_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/forks","keys_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/teams","hooks_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/hooks","issue_events_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/issues/events{/number}","events_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/events","assignees_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/assignees{/user}","branches_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/branches{/branch}","tags_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/tags","blobs_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/git/refs{/sha}","trees_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/statuses/{sha}","languages_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/languages","stargazers_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/stargazers","contributors_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/contributors","subscribers_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/subscribers","subscription_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/subscription","commits_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/commits{/sha}","git_commits_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/git/commits{/sha}","comments_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/comments{/number}","issue_comment_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/issues/comments{/number}","contents_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/contents/{+path}","compare_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/merges","archive_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/downloads","issues_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/issues{/number}","pulls_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls{/number}","milestones_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/milestones{/number}","notifications_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/labels{/name}","releases_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/releases{/id}","deployments_url":"https://api.github.com/repos/oceanprotocol/keeper-contracts/deployments","created_at":"2018-06-04T13:26:12Z","updated_at":"2019-07-26T09:02:15Z","pushed_at":"2019-07-30T09:55:24Z","git_url":"git://github.com/oceanprotocol/keeper-contracts.git","ssh_url":"git@github.com:oceanprotocol/keeper-contracts.git","clone_url":"https://github.com/oceanprotocol/keeper-contracts.git","svn_url":"https://github.com/oceanprotocol/keeper-contracts","homepage":"http://oceanprotocol.com","size":64727,"stargazers_count":82,"watchers_count":82,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":14,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":22,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":14,"open_issues":22,"watchers":82,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls/558"},"html":{"href":"https://github.com/oceanprotocol/keeper-contracts/pull/558"},"issue":{"href":"https://api.github.com/repos/oceanprotocol/keeper-contracts/issues/558"},"comments":{"href":"https://api.github.com/repos/oceanprotocol/keeper-contracts/issues/558/comments"},"review_comments":{"href":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls/558/comments"},"review_comment":{"href":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/oceanprotocol/keeper-contracts/pulls/558/commits"},"statuses":{"href":"https://api.github.com/repos/oceanprotocol/keeper-contracts/statuses/d820af83f2568c92ff97abd5c934580fc2f23f13"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"diminator"}}