{"action":"created","comment":{"url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls/comments/76405020","id":76405020,"diff_hunk":"@@ -0,0 +1,531 @@\n+from copy import deepcopy\n+from functools import reduce\n+from operator import and_\n+from uuid import uuid4\n+\n+from cryptoconditions import (\n+    Fulfillment as CCFulfillment,\n+    Condition as CCCondition,\n+    ThresholdSha256Fulfillment,\n+    Ed25519Fulfillment,\n+    PreimageSha256Fulfillment,\n+)\n+from cryptoconditions.exceptions import ParsingError\n+\n+from bigchaindb_common.crypto import (\n+    SigningKey,\n+    hash_data,\n+)\n+from bigchaindb_common.exceptions import (\n+    KeypairMismatchException,\n+    InvalidHash,\n+)\n+from bigchaindb_common.util import (\n+    serialize,\n+    gen_timestamp,\n+)\n+\n+\n+class Fulfillment(object):\n+    def __init__(self, fulfillment, owners_before, tx_input=None):\n+        self.fulfillment = fulfillment\n+\n+        if tx_input is not None and not isinstance(tx_input, TransactionLink):\n+            raise TypeError('`tx_input` must be a TransactionLink instance')\n+        else:\n+            self.tx_input = tx_input\n+\n+        if not isinstance(owners_before, list):\n+            raise TypeError('`owners_after` must be a list instance')\n+        else:\n+            self.owners_before = owners_before\n+\n+    def __eq__(self, other):\n+        return self.to_dict() == other.to_dict()\n+\n+    def to_dict(self, fid=None):\n+        try:\n+            fulfillment = self.fulfillment.serialize_uri()\n+        except (TypeError, AttributeError):\n+            fulfillment = None\n+\n+        try:\n+            # NOTE: `self.tx_input` can be `None` and that's fine\n+            tx_input = self.tx_input.to_dict()\n+        except AttributeError:\n+            tx_input = None\n+\n+        ffill = {\n+            'owners_before': self.owners_before,\n+            'input': tx_input,\n+            'fulfillment': fulfillment,\n+        }\n+        if fid is not None:\n+            ffill['fid'] = fid\n+        return ffill\n+\n+    @classmethod\n+    def from_dict(cls, ffill):\n+        \"\"\" Serializes a BigchainDB 'jsonized' fulfillment back to a BigchainDB Fulfillment class.\n+        \"\"\"\n+        try:\n+            fulfillment = CCFulfillment.from_uri(ffill['fulfillment'])\n+        except TypeError:\n+            fulfillment = None\n+        return cls(fulfillment, ffill['owners_before'], TransactionLink.from_dict(ffill['input']))\n+\n+\n+class TransactionLink(object):\n+    # NOTE: In an IPLD implementation, this class is not necessary anymore, as an IPLD link can simply point to an\n+    #       object, as well as an objects properties. So instead of having a (de)serializable class, we can have a\n+    #       simple IPLD link of the form: `/<tx_id>/transaction/conditions/<cid>/`\n+    def __init__(self, txid=None, cid=None):\n+        self.txid = txid\n+        self.cid = cid\n+\n+    def __bool__(self):\n+        return not (self.txid is None and self.cid is None)\n+\n+    def __eq__(self, other):\n+        return self.to_dict() == self.to_dict()\n+\n+    @classmethod\n+    def from_dict(cls, link):\n+        try:\n+            return cls(link['txid'], link['cid'])\n+        except TypeError:\n+            return cls()\n+\n+    def to_dict(self):\n+        if self.txid is None and self.cid is None:\n+            return None\n+        else:\n+            return {\n+                'txid': self.txid,\n+                'cid': self.cid,\n+            }\n+\n+\n+class Condition(object):\n+    def __init__(self, fulfillment, owners_after=None):\n+        # TODO: Add more description\n+        \"\"\"Create a new condition for a fulfillment\n+\n+        Args\n+            owners_after (Optional(list)): base58 encoded public key of the owner of the digital asset after\n+            this transaction.\n+\n+        \"\"\"\n+        self.fulfillment = fulfillment\n+\n+        if not isinstance(owners_after, list) and owners_after is not None:\n+            raise TypeError('`owners_after` must be a list instance or None')\n+        else:\n+            self.owners_after = owners_after\n+\n+    def __eq__(self, other):\n+        return self.to_dict() == other.to_dict()\n+\n+    def to_dict(self, cid=None):\n+        # TODO FOR CC: It must be able to recognize a hashlock condition\n+        #              and fulfillment!\n+        condition = {}\n+        try:\n+            condition['details'] = self.fulfillment.to_dict()\n+        except AttributeError:\n+            pass\n+\n+        try:\n+            condition['uri'] = self.fulfillment.condition_uri\n+        except AttributeError:\n+            condition['uri'] = self.fulfillment\n+\n+        cond = {\n+            'owners_after': self.owners_after,\n+            'condition': condition\n+        }\n+        if cid is not None:\n+            cond['cid'] = cid\n+        return cond\n+\n+    @classmethod\n+    def from_dict(cls, cond):\n+        # TODO: This case should have it's own serialization test\n+        try:\n+            fulfillment = CCFulfillment.from_dict(cond['condition']['details'])\n+        except KeyError:\n+            # NOTE: Hashlock condition case\n+            fulfillment = cond['condition']['uri']\n+        return cls(fulfillment, cond['owners_after'])\n+\n+\n+class Data(object):\n+    def __init__(self, payload=None, payload_id=None):\n+        self.payload_id = payload_id if payload_id is not None else self.to_hash()\n+        if payload is not None and not isinstance(payload, dict):\n+            raise TypeError('`payload` must be a dict instance or None')\n+        else:\n+            self.payload = payload\n+\n+    def __eq__(self, other):\n+        return self.to_dict() == other.to_dict()\n+\n+    @classmethod\n+    def from_dict(cls, payload):\n+        try:\n+            return cls(payload['payload'], payload['uuid'])\n+        except TypeError:\n+            return cls()\n+\n+    def to_dict(self):\n+        if self.payload is None:\n+            return None\n+        else:\n+            return {\n+                'payload': self.payload,\n+                'uuid': self.payload_id,\n+            }\n+\n+    def to_hash(self):\n+        return str(uuid4())\n+\n+\n+class Transaction(object):\n+    CREATE = 'CREATE'\n+    TRANSFER = 'TRANSFER'\n+    GENESIS = 'GENESIS'\n+    ALLOWED_OPERATIONS = (CREATE, TRANSFER, GENESIS)\n+    VERSION = 1\n+\n+    def __init__(self, operation, fulfillments=None, conditions=None, data=None, timestamp=None, version=None):\n+        # TODO: Update this comment\n+        \"\"\"Create a new transaction in memory\n+\n+        A transaction in BigchainDB is a transfer of a digital asset between two entities represented\n+        by public keys.\n+\n+        Currently BigchainDB supports two types of operations:\n+\n+            `CREATE` - Only federation nodes are allowed to use this operation. In a create operation\n+            a federation node creates a digital asset in BigchainDB and assigns that asset to a public\n+            key. The owner of the private key can then decided to transfer this digital asset by using the\n+            `transaction id` of the transaction as an input in a `TRANSFER` transaction.\n+\n+            `TRANSFER` - A transfer operation allows for a transfer of the digital assets between entities.\n+\n+        If a transaction is initialized with the inputs being `None` a `operation` `CREATE` is\n+        chosen. Otherwise the transaction is of `operation` `TRANSFER`.\n+\n+        Args:\n+            # TODO: Write a description here\n+            fulfillments\n+            conditions\n+            operation\n+           data (Optional[dict]): dictionary with information about asset.\n+\n+        Raises:\n+            TypeError: if the optional ``data`` argument is not a ``dict``.\n+\n+        # TODO: Incorporate this text somewhere better in the docs of this class\n+        Some use cases for this class:\n+\n+            1. Create a new `CREATE` transaction:\n+                - This means `inputs` is empty\n+\n+            2. Create a new `TRANSFER` transaction:\n+                - This means `inputs` is a filled list (one to multiple transactions)\n+\n+            3. Written transactions must be managed somehow in the user's program: use `from_dict`\n+\n+\n+        \"\"\"\n+        self.timestamp = timestamp if timestamp is not None else gen_timestamp()\n+        self.version = version if version is not None else Transaction.VERSION\n+\n+        if operation not in Transaction.ALLOWED_OPERATIONS:\n+            raise TypeError('`operation` must be either CREATE or TRANSFER')\n+        else:\n+            self.operation = operation\n+\n+        if conditions is not None and not isinstance(conditions, list):\n+            raise TypeError('`conditions` must be a list instance or None')\n+        elif conditions is None:\n+            self.conditions = []\n+        else:\n+            self.conditions = conditions","path":"bigchaindb_common/transaction.py","position":255,"original_position":255,"commit_id":"64a1b24e221fe0f357d5450a1eeb017d7e8297ab","original_commit_id":"64a1b24e221fe0f357d5450a1eeb017d7e8297ab","user":{"login":"diminator","id":6178597,"avatar_url":"https://avatars.githubusercontent.com/u/6178597?v=3","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":"ofc we want to check the schema of the transaction/conditions/fulfillments,\r\nsee: https://github.com/bigchaindb/bigchaindb/pull/311","created_at":"2016-08-26T11:42:21Z","updated_at":"2016-08-26T11:42:21Z","html_url":"https://github.com/bigchaindb/bigchaindb-common/pull/4#discussion_r76405020","pull_request_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls/4","_links":{"self":{"href":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls/comments/76405020"},"html":{"href":"https://github.com/bigchaindb/bigchaindb-common/pull/4#discussion_r76405020"},"pull_request":{"href":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls/4"}}},"pull_request":{"url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls/4","id":81642764,"html_url":"https://github.com/bigchaindb/bigchaindb-common/pull/4","diff_url":"https://github.com/bigchaindb/bigchaindb-common/pull/4.diff","patch_url":"https://github.com/bigchaindb/bigchaindb-common/pull/4.patch","issue_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/issues/4","number":4,"state":"open","locked":false,"title":"[WIP] Integrate transaction model","user":{"login":"TimDaub","id":2758453,"avatar_url":"https://avatars.githubusercontent.com/u/2758453?v=3","gravatar_id":"","url":"https://api.github.com/users/TimDaub","html_url":"https://github.com/TimDaub","followers_url":"https://api.github.com/users/TimDaub/followers","following_url":"https://api.github.com/users/TimDaub/following{/other_user}","gists_url":"https://api.github.com/users/TimDaub/gists{/gist_id}","starred_url":"https://api.github.com/users/TimDaub/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TimDaub/subscriptions","organizations_url":"https://api.github.com/users/TimDaub/orgs","repos_url":"https://api.github.com/users/TimDaub/repos","events_url":"https://api.github.com/users/TimDaub/events{/privacy}","received_events_url":"https://api.github.com/users/TimDaub/received_events","type":"User","site_admin":false},"body":"I've integrated all the necessary modules for the tests to pass.\r\n\r\nThe transaction model is not ready for usage yet, so until then this PR will stay opened and I'll add commits to it.\r\n\r\nTODOs:\r\n\r\n- [ ] Write better comments\r\n- [x] Check a `TRANSFER` tx against it's condition in `fulfillments_valid`\r\n- [ ] sanity checks in `Condition` and `Fulfillment` for correct `owners_before` and `owners_after`\r\n- [ ] there must be an easier way to spend outputs from multiple transactions (merge transactions)\r\n\r\nLATER: \r\n\r\n- Separate client and server logic (exceptions, some signing logic, serialization methods, etc.)\r\n\r\nQUESTIONS:\r\n\r\n- Do we bump the version of the transaction with this update? It's for sure not compatible with version 1.\r\n\r\nThx to @sohkai for helping with extracting the git history out of individual files.","created_at":"2016-08-17T13:31:02Z","updated_at":"2016-08-26T11:42:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6f25b54d3321fe247bb826c5b12bb91678e35e7f","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls/4/commits","review_comments_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls/4/comments","review_comment_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls/comments{/number}","comments_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/issues/4/comments","statuses_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/statuses/64a1b24e221fe0f357d5450a1eeb017d7e8297ab","head":{"label":"bigchaindb:integrate-transaction-model","ref":"integrate-transaction-model","sha":"64a1b24e221fe0f357d5450a1eeb017d7e8297ab","user":{"login":"bigchaindb","id":17097586,"avatar_url":"https://avatars.githubusercontent.com/u/17097586?v=3","gravatar_id":"","url":"https://api.github.com/users/bigchaindb","html_url":"https://github.com/bigchaindb","followers_url":"https://api.github.com/users/bigchaindb/followers","following_url":"https://api.github.com/users/bigchaindb/following{/other_user}","gists_url":"https://api.github.com/users/bigchaindb/gists{/gist_id}","starred_url":"https://api.github.com/users/bigchaindb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bigchaindb/subscriptions","organizations_url":"https://api.github.com/users/bigchaindb/orgs","repos_url":"https://api.github.com/users/bigchaindb/repos","events_url":"https://api.github.com/users/bigchaindb/events{/privacy}","received_events_url":"https://api.github.com/users/bigchaindb/received_events","type":"Organization","site_admin":false},"repo":{"id":65894012,"name":"bigchaindb-common","full_name":"bigchaindb/bigchaindb-common","owner":{"login":"bigchaindb","id":17097586,"avatar_url":"https://avatars.githubusercontent.com/u/17097586?v=3","gravatar_id":"","url":"https://api.github.com/users/bigchaindb","html_url":"https://github.com/bigchaindb","followers_url":"https://api.github.com/users/bigchaindb/followers","following_url":"https://api.github.com/users/bigchaindb/following{/other_user}","gists_url":"https://api.github.com/users/bigchaindb/gists{/gist_id}","starred_url":"https://api.github.com/users/bigchaindb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bigchaindb/subscriptions","organizations_url":"https://api.github.com/users/bigchaindb/orgs","repos_url":"https://api.github.com/users/bigchaindb/repos","events_url":"https://api.github.com/users/bigchaindb/events{/privacy}","received_events_url":"https://api.github.com/users/bigchaindb/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/bigchaindb/bigchaindb-common","description":"Set of reusable components for BigchainDB","fork":false,"url":"https://api.github.com/repos/bigchaindb/bigchaindb-common","forks_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/forks","keys_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/teams","hooks_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/hooks","issue_events_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/issues/events{/number}","events_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/events","assignees_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/assignees{/user}","branches_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/branches{/branch}","tags_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/tags","blobs_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/git/refs{/sha}","trees_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/statuses/{sha}","languages_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/languages","stargazers_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/stargazers","contributors_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/contributors","subscribers_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/subscribers","subscription_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/subscription","commits_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/commits{/sha}","git_commits_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/git/commits{/sha}","comments_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/comments{/number}","issue_comment_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/issues/comments{/number}","contents_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/contents/{+path}","compare_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/merges","archive_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/downloads","issues_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/issues{/number}","pulls_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls{/number}","milestones_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/milestones{/number}","notifications_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/labels{/name}","releases_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/releases{/id}","deployments_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/deployments","created_at":"2016-08-17T09:20:56Z","updated_at":"2016-08-17T10:01:38Z","pushed_at":"2016-08-26T08:57:08Z","git_url":"git://github.com/bigchaindb/bigchaindb-common.git","ssh_url":"git@github.com:bigchaindb/bigchaindb-common.git","clone_url":"https://github.com/bigchaindb/bigchaindb-common.git","svn_url":"https://github.com/bigchaindb/bigchaindb-common","homepage":"","size":286,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":3,"forks":1,"open_issues":3,"watchers":0,"default_branch":"master"}},"base":{"label":"bigchaindb:master","ref":"master","sha":"d132623c6f81a0402bbb9dbb34f55c57b3d1e6ac","user":{"login":"bigchaindb","id":17097586,"avatar_url":"https://avatars.githubusercontent.com/u/17097586?v=3","gravatar_id":"","url":"https://api.github.com/users/bigchaindb","html_url":"https://github.com/bigchaindb","followers_url":"https://api.github.com/users/bigchaindb/followers","following_url":"https://api.github.com/users/bigchaindb/following{/other_user}","gists_url":"https://api.github.com/users/bigchaindb/gists{/gist_id}","starred_url":"https://api.github.com/users/bigchaindb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bigchaindb/subscriptions","organizations_url":"https://api.github.com/users/bigchaindb/orgs","repos_url":"https://api.github.com/users/bigchaindb/repos","events_url":"https://api.github.com/users/bigchaindb/events{/privacy}","received_events_url":"https://api.github.com/users/bigchaindb/received_events","type":"Organization","site_admin":false},"repo":{"id":65894012,"name":"bigchaindb-common","full_name":"bigchaindb/bigchaindb-common","owner":{"login":"bigchaindb","id":17097586,"avatar_url":"https://avatars.githubusercontent.com/u/17097586?v=3","gravatar_id":"","url":"https://api.github.com/users/bigchaindb","html_url":"https://github.com/bigchaindb","followers_url":"https://api.github.com/users/bigchaindb/followers","following_url":"https://api.github.com/users/bigchaindb/following{/other_user}","gists_url":"https://api.github.com/users/bigchaindb/gists{/gist_id}","starred_url":"https://api.github.com/users/bigchaindb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bigchaindb/subscriptions","organizations_url":"https://api.github.com/users/bigchaindb/orgs","repos_url":"https://api.github.com/users/bigchaindb/repos","events_url":"https://api.github.com/users/bigchaindb/events{/privacy}","received_events_url":"https://api.github.com/users/bigchaindb/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/bigchaindb/bigchaindb-common","description":"Set of reusable components for BigchainDB","fork":false,"url":"https://api.github.com/repos/bigchaindb/bigchaindb-common","forks_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/forks","keys_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/teams","hooks_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/hooks","issue_events_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/issues/events{/number}","events_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/events","assignees_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/assignees{/user}","branches_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/branches{/branch}","tags_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/tags","blobs_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/git/refs{/sha}","trees_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/statuses/{sha}","languages_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/languages","stargazers_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/stargazers","contributors_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/contributors","subscribers_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/subscribers","subscription_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/subscription","commits_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/commits{/sha}","git_commits_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/git/commits{/sha}","comments_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/comments{/number}","issue_comment_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/issues/comments{/number}","contents_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/contents/{+path}","compare_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/merges","archive_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/downloads","issues_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/issues{/number}","pulls_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls{/number}","milestones_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/milestones{/number}","notifications_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/labels{/name}","releases_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/releases{/id}","deployments_url":"https://api.github.com/repos/bigchaindb/bigchaindb-common/deployments","created_at":"2016-08-17T09:20:56Z","updated_at":"2016-08-17T10:01:38Z","pushed_at":"2016-08-26T08:57:08Z","git_url":"git://github.com/bigchaindb/bigchaindb-common.git","ssh_url":"git@github.com:bigchaindb/bigchaindb-common.git","clone_url":"https://github.com/bigchaindb/bigchaindb-common.git","svn_url":"https://github.com/bigchaindb/bigchaindb-common","homepage":"","size":286,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":3,"forks":1,"open_issues":3,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls/4"},"html":{"href":"https://github.com/bigchaindb/bigchaindb-common/pull/4"},"issue":{"href":"https://api.github.com/repos/bigchaindb/bigchaindb-common/issues/4"},"comments":{"href":"https://api.github.com/repos/bigchaindb/bigchaindb-common/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/bigchaindb/bigchaindb-common/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/bigchaindb/bigchaindb-common/statuses/64a1b24e221fe0f357d5450a1eeb017d7e8297ab"}}}}
{"actor":{"display_login":"diminator"}}