{"action":"created","comment":{"url":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls/comments/241338310","pull_request_review_id":184582528,"id":241338310,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MTMzODMxMA==","diff_hunk":"@@ -12,59 +12,191 @@\n  * Removal or modification of this copyright notice is prohibited.\n  *\n  */\n-/* tslint:disable:no-unused-expression */\n+\n+import { EventEmitter } from 'events';\n+import http, { Server } from 'http';\n+import { platform } from 'os';\n+import querystring from 'querystring';\n+import socketClusterServer from 'socketcluster-server';\n+\n+import { Peer } from './peer';\n+\n import {\n \tNetworkStatus,\n-\tP2PConfig,\n \tP2PMessagePacket,\n-\tP2PNodeStatus,\n-\tP2PPenality,\n+\tP2PPenalty,\n \tP2PRequestPacket,\n \tP2PResponsePacket,\n+\tP2PConfig,\n+\tPeerInfo,\n+\tRPCResponsePeerList,\n+\tRPCResponsePeerInfo,\n+\tP2PNodeStatus,\n } from './p2p_types';\n \n import { PeerPool } from './peer_pool';\n \n-export class P2P {\n-\tprivate readonly peerPool: PeerPool;\n+export const EVENT_NEW_INBOUND_PEER = 'newInboundPeer';\n+export const EVENT_FAILED_TO_ADD_INBOUND_PEER = 'failedToAddInboundPeer';\n+export const EVENT_NEW_PEER = 'newPeer';\n+\n+const BASE_10_RADIX = 10;\n+\n+export class P2P extends EventEmitter {\n+\tprivate readonly _config: P2PConfig;\n+\tprivate readonly _peerPool: PeerPool;\n+\tprivate readonly _httpServer: Server;\n+\tprivate readonly _scServer: any;\n+\tprivate readonly _newPeers: Set<string>;\n+\t// TODO: private readonly _triedPeers: Set<string>;\n+\tprivate _nodeStatus: P2PNodeStatus;\n \n \tpublic constructor(config: P2PConfig) {\n-\t\tthis.peerPool = new PeerPool({\n-\t\t\tblacklistedPeers: config.blacklistedPeers,\n-\t\t\tconnectTimeout: config.connectTimeout,\n-\t\t\tipAddress: config.ipAddress,\n-\t\t\tseedPeers: config.seedPeers,\n-\t\t\twsEngine: config.wsEngine,\n+\t\tsuper();\n+\t\tthis._config = config;\n+\t\tthis._nodeStatus = {\n \t\t\twsPort: config.wsPort,\n-\t\t});\n+\t\t\tos: platform(),\n+\t\t\tversion: config.version,\n+\t\t};\n+\t\tthis._newPeers = new Set();\n+\t\t// TODO: this._triedPeers = new Set();\n+\n+\t\tthis._peerPool = new PeerPool();\n+\t\tthis._httpServer = http.createServer();\n+\t\tthis._scServer = socketClusterServer.attach(this._httpServer);\n \t}\n \n-\tpublic applyPenalty = (penalty: P2PPenality): void => {\n+\tpublic applyPenalty = (penalty: P2PPenalty): void => {\n \t\tpenalty;\n \t};\n \t// TODO\n \tpublic getNetworkStatus = (): NetworkStatus => true;\n \t// TODO\n-\tpublic getNodeStatus = (): P2PNodeStatus => true;\n-\t// TODO\n-\tpublic request = async (\n-\t\tpacket: P2PRequestPacket,\n-\t): Promise<P2PResponsePacket> => {\n-\t\tconst response = packet;\n \n-\t\treturn Promise.resolve(response);\n-\t};\n+\tpublic async request<T>(\n+\t\tpacket: P2PRequestPacket<T>,\n+\t): Promise<P2PResponsePacket> {\n+\t\treturn Promise.resolve({ data: packet });\n+\t}\n \n-\tpublic send = (message: P2PMessagePacket): void => {\n+\tpublic send<T>(message: P2PMessagePacket<T>): void {\n \t\tmessage;\n \t\t// TODO\n+\t}\n+\n+\tpublic getNodeStatus(): P2PNodeStatus {\n+\t\treturn this._nodeStatus;\n+\t}\n+\n+\tpublic setNodeStatus(nodeStatus: P2PNodeStatus): void {\n+\t\tthis._nodeStatus = nodeStatus;\n+\t}\n+\n+\tprivate async _startPeerServer(): Promise<void> {\n+\t\tthis._scServer.on(\n+\t\t\t'connection',\n+\t\t\t(socket: any): void => {\n+\t\t\t\tconst queryObject = querystring.parse(socket.request.url);\n+\t\t\t\tif (\n+\t\t\t\t\ttypeof queryObject.wsPort !== 'string' ||\n+\t\t\t\t\ttypeof queryObject.os !== 'string' ||\n+\t\t\t\t\ttypeof queryObject.version !== 'string'\n+\t\t\t\t) {\n+\t\t\t\t\tsuper.emit(EVENT_FAILED_TO_ADD_INBOUND_PEER);\n+\t\t\t\t} else {\n+\t\t\t\t\tconst wsPort: number = parseInt(queryObject.wsPort, BASE_10_RADIX);\n+\t\t\t\t\tconst peerId = P2P.generatePeerIdFromPeerInfo({\n+\t\t\t\t\t\tipAddress: socket.remoteAddress,\n+\t\t\t\t\t\twsPort,\n+\t\t\t\t\t});\n+\t\t\t\t\tconst existingPeer = this._peerPool.getPeer(peerId);\n+\t\t\t\t\tif (existingPeer === undefined) {\n+\t\t\t\t\t\tconst peer = new Peer({\n+\t\t\t\t\t\t\theight: 0,\n+\t\t\t\t\t\t\tid: peerId,\n+\t\t\t\t\t\t\tinboundSocket: socket,\n+\t\t\t\t\t\t\tipAddress: socket.remoteAddress,\n+\t\t\t\t\t\t\tos: queryObject.os,\n+\t\t\t\t\t\t\tversion: queryObject.version,\n+\t\t\t\t\t\t\twsPort,\n+\t\t\t\t\t\t\tnodeStatus: this._nodeStatus,\n+\t\t\t\t\t\t});\n+\t\t\t\t\t\tthis._peerPool.addPeer(peer);\n+\t\t\t\t\t\tsuper.emit(EVENT_NEW_INBOUND_PEER, peer);\n+\t\t\t\t\t\tsuper.emit(EVENT_NEW_PEER, peer);\n+\t\t\t\t\t} else {\n+\t\t\t\t\t\texistingPeer.inboundSocket = socket;\n+\t\t\t\t\t}\n+\t\t\t\t\tthis._newPeers.add(peerId);\n+\t\t\t\t}\n+\t\t\t},\n+\t\t);\n+\t\tthis._httpServer.listen(this._config.wsPort);\n+\n+\t\treturn new Promise<void>(resolve => {\n+\t\t\tthis._scServer.once('ready', () => {\n+\t\t\t\tresolve();\n+\t\t\t});\n+\t\t});\n+\t}\n+\n+\tpublic async _loadListOfPeerListsFromSeeds(\n+\t\tseedList: ReadonlyArray<PeerInfo>,\n+\t): Promise<ReadonlyArray<ReadonlyArray<Peer>>> {\n+\t\treturn Promise.all(\n+\t\t\tseedList.map(async (seedPeer: PeerInfo) => {\n+\t\t\t\tconst seedPeerId = P2P.generatePeerIdFromPeerInfo(seedPeer);\n+\t\t\t\tconst peer = new Peer({\n+\t\t\t\t\tid: seedPeerId,\n+\t\t\t\t\tipAddress: seedPeer.ipAddress,\n+\t\t\t\t\twsPort: seedPeer.wsPort,\n+\t\t\t\t\tnodeStatus: this._nodeStatus,\n+\t\t\t\t});\n+\t\t\t\tthis._newPeers.add(seedPeerId);\n+\t\t\t\t/**\n+\t\t\t\t * TODO LATER: For the LIP phase, we shouldn't add the seed peers to our\n+\t\t\t\t * _peerPool and we should disconnect from them as soon as we've loaded their peer lists.\n+\t\t\t\t */\n+\t\t\t\tthis._peerPool.addPeer(peer);\n+\t\t\t\t// TODO LATER: For the LIP phase, the 'list' request will need to be renamed.\n+\t\t\t\tconst seedNodePeerListResponse = await peer.request<void>({\n+\t\t\t\t\tprocedure: 'list',\n+\t\t\t\t});\n+\t\t\t\tconst peerListResponse = seedNodePeerListResponse.data as RPCResponsePeerList;\n+\t\t\t\t// TODO ASAP: Validate the response before returning. Check that seedNodePeerListResponse.data.peers exists.\n+\n+\t\t\t\treturn peerListResponse.peers.map((peerObject: RPCResponsePeerInfo) => {\n+\t\t\t\t\tconst peerOfPeerId = P2P.generatePeerIdFromPeerInfo({\n+\t\t\t\t\t\tipAddress: peerObject.ip,\n+\t\t\t\t\t\twsPort: peerObject.wsPort,\n+\t\t\t\t\t});\n+\n+\t\t\t\t\treturn new Peer({\n+\t\t\t\t\t\tid: peerOfPeerId,\n+\t\t\t\t\t\tipAddress: peerObject.ip,\n+\t\t\t\t\t\twsPort: peerObject.wsPort, // TODO ASAP: Add more properties\n+\t\t\t\t\t\tnodeStatus: this._nodeStatus,\n+\t\t\t\t\t});\n+\t\t\t\t});\n+\t\t\t}),\n+\t\t);\n+\t}\n+\n+\tpublic start = async (): Promise<void> => {\n+\t\tawait this._startPeerServer();\n+\t\tawait this._loadListOfPeerListsFromSeeds(this._config.seedPeers);\n \t};\n-\tpublic setNodeStatus = (nodeStatus: P2PNodeStatus): void => {\n-\t\tnodeStatus;\n-\t\t// TODO\n+\n+\tpublic stop = async (): Promise<void> => {","path":"packages/lisk-p2p/src/p2p.ts","position":206,"original_position":206,"commit_id":"6d6e47074c748082a7d962ad7127167a45931b89","original_commit_id":"6d6e47074c748082a7d962ad7127167a45931b89","user":{"login":"SargeKhan","id":4995051,"node_id":"MDQ6VXNlcjQ5OTUwNTE=","avatar_url":"https://avatars3.githubusercontent.com/u/4995051?v=4","gravatar_id":"","url":"https://api.github.com/users/SargeKhan","html_url":"https://github.com/SargeKhan","followers_url":"https://api.github.com/users/SargeKhan/followers","following_url":"https://api.github.com/users/SargeKhan/following{/other_user}","gists_url":"https://api.github.com/users/SargeKhan/gists{/gist_id}","starred_url":"https://api.github.com/users/SargeKhan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SargeKhan/subscriptions","organizations_url":"https://api.github.com/users/SargeKhan/orgs","repos_url":"https://api.github.com/users/SargeKhan/repos","events_url":"https://api.github.com/users/SargeKhan/events{/privacy}","received_events_url":"https://api.github.com/users/SargeKhan/received_events","type":"User","site_admin":false},"body":"Shouldn't we stop listening to the server in here?","created_at":"2018-12-13T10:03:22Z","updated_at":"2018-12-13T10:05:51Z","html_url":"https://github.com/LiskHQ/lisk-elements/pull/936#discussion_r241338310","pull_request_url":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls/936","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls/comments/241338310"},"html":{"href":"https://github.com/LiskHQ/lisk-elements/pull/936#discussion_r241338310"},"pull_request":{"href":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls/936"}}},"pull_request":{"url":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls/936","id":237605229,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM3NjA1MjI5","html_url":"https://github.com/LiskHQ/lisk-elements/pull/936","diff_url":"https://github.com/LiskHQ/lisk-elements/pull/936.diff","patch_url":"https://github.com/LiskHQ/lisk-elements/pull/936.patch","issue_url":"https://api.github.com/repos/LiskHQ/lisk-elements/issues/936","number":936,"state":"open","locked":false,"title":"Initialization start(), stop() and peer management - Addresses #894 and #895 ","user":{"login":"jondubois","id":1187447,"node_id":"MDQ6VXNlcjExODc0NDc=","avatar_url":"https://avatars1.githubusercontent.com/u/1187447?v=4","gravatar_id":"","url":"https://api.github.com/users/jondubois","html_url":"https://github.com/jondubois","followers_url":"https://api.github.com/users/jondubois/followers","following_url":"https://api.github.com/users/jondubois/following{/other_user}","gists_url":"https://api.github.com/users/jondubois/gists{/gist_id}","starred_url":"https://api.github.com/users/jondubois/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jondubois/subscriptions","organizations_url":"https://api.github.com/users/jondubois/orgs","repos_url":"https://api.github.com/users/jondubois/repos","events_url":"https://api.github.com/users/jondubois/events{/privacy}","received_events_url":"https://api.github.com/users/jondubois/received_events","type":"User","site_admin":false},"body":"### What was the problem?\r\n\r\nP2P node needs to be able start, connect to seed peers and initiate discovery.\r\nAs part of this, basic peer management functionality is required.\r\n\r\n### How did I fix it?\r\n\r\nImplemented:\r\n\r\n- Basic node start functionality.\r\n- Basic peer management.\r\n- Initiate peer discovery through seed nodes.\r\n- Basic peer connection.\r\n- Peer request() and send() methods.\r\n- Cleanup of existing code.\r\n\r\n### How to test it?\r\n\r\n`npm test`\r\n\r\n### Review checklist\r\n\r\n* The PR partially resolves #894 and #895 \r\n* All new code is covered with unit tests\r\n* All new code was formatted with Prettier\r\n* Linting passes\r\n* Tests pass\r\n* Commit messages follow the [commit guidelines](CONTRIBUTING.md#git-commit-messages)\r\n* Documentation has been added/updated\r\n","created_at":"2018-12-11T09:29:09Z","updated_at":"2018-12-13T10:05:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e94720dee0ebd6b89d5ee9574eb03e4ce8efaeb4","assignee":{"login":"jondubois","id":1187447,"node_id":"MDQ6VXNlcjExODc0NDc=","avatar_url":"https://avatars1.githubusercontent.com/u/1187447?v=4","gravatar_id":"","url":"https://api.github.com/users/jondubois","html_url":"https://github.com/jondubois","followers_url":"https://api.github.com/users/jondubois/followers","following_url":"https://api.github.com/users/jondubois/following{/other_user}","gists_url":"https://api.github.com/users/jondubois/gists{/gist_id}","starred_url":"https://api.github.com/users/jondubois/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jondubois/subscriptions","organizations_url":"https://api.github.com/users/jondubois/orgs","repos_url":"https://api.github.com/users/jondubois/repos","events_url":"https://api.github.com/users/jondubois/events{/privacy}","received_events_url":"https://api.github.com/users/jondubois/received_events","type":"User","site_admin":false},"assignees":[{"login":"jondubois","id":1187447,"node_id":"MDQ6VXNlcjExODc0NDc=","avatar_url":"https://avatars1.githubusercontent.com/u/1187447?v=4","gravatar_id":"","url":"https://api.github.com/users/jondubois","html_url":"https://github.com/jondubois","followers_url":"https://api.github.com/users/jondubois/followers","following_url":"https://api.github.com/users/jondubois/following{/other_user}","gists_url":"https://api.github.com/users/jondubois/gists{/gist_id}","starred_url":"https://api.github.com/users/jondubois/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jondubois/subscriptions","organizations_url":"https://api.github.com/users/jondubois/orgs","repos_url":"https://api.github.com/users/jondubois/repos","events_url":"https://api.github.com/users/jondubois/events{/privacy}","received_events_url":"https://api.github.com/users/jondubois/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":655490233,"node_id":"MDU6TGFiZWw2NTU0OTAyMzM=","url":"https://api.github.com/repos/LiskHQ/lisk-elements/labels/:eye:%20pending%20review","name":":eye: pending review","color":"ededed","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls/936/commits","review_comments_url":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls/936/comments","review_comment_url":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls/comments{/number}","comments_url":"https://api.github.com/repos/LiskHQ/lisk-elements/issues/936/comments","statuses_url":"https://api.github.com/repos/LiskHQ/lisk-elements/statuses/6d6e47074c748082a7d962ad7127167a45931b89","head":{"label":"LiskHQ:p2p_jon","ref":"p2p_jon","sha":"6d6e47074c748082a7d962ad7127167a45931b89","user":{"login":"LiskHQ","id":16600915,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2NjAwOTE1","avatar_url":"https://avatars1.githubusercontent.com/u/16600915?v=4","gravatar_id":"","url":"https://api.github.com/users/LiskHQ","html_url":"https://github.com/LiskHQ","followers_url":"https://api.github.com/users/LiskHQ/followers","following_url":"https://api.github.com/users/LiskHQ/following{/other_user}","gists_url":"https://api.github.com/users/LiskHQ/gists{/gist_id}","starred_url":"https://api.github.com/users/LiskHQ/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LiskHQ/subscriptions","organizations_url":"https://api.github.com/users/LiskHQ/orgs","repos_url":"https://api.github.com/users/LiskHQ/repos","events_url":"https://api.github.com/users/LiskHQ/events{/privacy}","received_events_url":"https://api.github.com/users/LiskHQ/received_events","type":"Organization","site_admin":false},"repo":{"id":49426311,"node_id":"MDEwOlJlcG9zaXRvcnk0OTQyNjMxMQ==","name":"lisk-elements","full_name":"LiskHQ/lisk-elements","private":false,"owner":{"login":"LiskHQ","id":16600915,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2NjAwOTE1","avatar_url":"https://avatars1.githubusercontent.com/u/16600915?v=4","gravatar_id":"","url":"https://api.github.com/users/LiskHQ","html_url":"https://github.com/LiskHQ","followers_url":"https://api.github.com/users/LiskHQ/followers","following_url":"https://api.github.com/users/LiskHQ/following{/other_user}","gists_url":"https://api.github.com/users/LiskHQ/gists{/gist_id}","starred_url":"https://api.github.com/users/LiskHQ/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LiskHQ/subscriptions","organizations_url":"https://api.github.com/users/LiskHQ/orgs","repos_url":"https://api.github.com/users/LiskHQ/repos","events_url":"https://api.github.com/users/LiskHQ/events{/privacy}","received_events_url":"https://api.github.com/users/LiskHQ/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/LiskHQ/lisk-elements","description":"⚙️ Library for sending Lisk transactions from the client or server","fork":false,"url":"https://api.github.com/repos/LiskHQ/lisk-elements","forks_url":"https://api.github.com/repos/LiskHQ/lisk-elements/forks","keys_url":"https://api.github.com/repos/LiskHQ/lisk-elements/keys{/key_id}","collaborators_url":"https://api.github.com/repos/LiskHQ/lisk-elements/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/LiskHQ/lisk-elements/teams","hooks_url":"https://api.github.com/repos/LiskHQ/lisk-elements/hooks","issue_events_url":"https://api.github.com/repos/LiskHQ/lisk-elements/issues/events{/number}","events_url":"https://api.github.com/repos/LiskHQ/lisk-elements/events","assignees_url":"https://api.github.com/repos/LiskHQ/lisk-elements/assignees{/user}","branches_url":"https://api.github.com/repos/LiskHQ/lisk-elements/branches{/branch}","tags_url":"https://api.github.com/repos/LiskHQ/lisk-elements/tags","blobs_url":"https://api.github.com/repos/LiskHQ/lisk-elements/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/LiskHQ/lisk-elements/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/LiskHQ/lisk-elements/git/refs{/sha}","trees_url":"https://api.github.com/repos/LiskHQ/lisk-elements/git/trees{/sha}","statuses_url":"https://api.github.com/repos/LiskHQ/lisk-elements/statuses/{sha}","languages_url":"https://api.github.com/repos/LiskHQ/lisk-elements/languages","stargazers_url":"https://api.github.com/repos/LiskHQ/lisk-elements/stargazers","contributors_url":"https://api.github.com/repos/LiskHQ/lisk-elements/contributors","subscribers_url":"https://api.github.com/repos/LiskHQ/lisk-elements/subscribers","subscription_url":"https://api.github.com/repos/LiskHQ/lisk-elements/subscription","commits_url":"https://api.github.com/repos/LiskHQ/lisk-elements/commits{/sha}","git_commits_url":"https://api.github.com/repos/LiskHQ/lisk-elements/git/commits{/sha}","comments_url":"https://api.github.com/repos/LiskHQ/lisk-elements/comments{/number}","issue_comment_url":"https://api.github.com/repos/LiskHQ/lisk-elements/issues/comments{/number}","contents_url":"https://api.github.com/repos/LiskHQ/lisk-elements/contents/{+path}","compare_url":"https://api.github.com/repos/LiskHQ/lisk-elements/compare/{base}...{head}","merges_url":"https://api.github.com/repos/LiskHQ/lisk-elements/merges","archive_url":"https://api.github.com/repos/LiskHQ/lisk-elements/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/LiskHQ/lisk-elements/downloads","issues_url":"https://api.github.com/repos/LiskHQ/lisk-elements/issues{/number}","pulls_url":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls{/number}","milestones_url":"https://api.github.com/repos/LiskHQ/lisk-elements/milestones{/number}","notifications_url":"https://api.github.com/repos/LiskHQ/lisk-elements/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/LiskHQ/lisk-elements/labels{/name}","releases_url":"https://api.github.com/repos/LiskHQ/lisk-elements/releases{/id}","deployments_url":"https://api.github.com/repos/LiskHQ/lisk-elements/deployments","created_at":"2016-01-11T12:54:02Z","updated_at":"2018-12-12T14:32:27Z","pushed_at":"2018-12-12T18:08:11Z","git_url":"git://github.com/LiskHQ/lisk-elements.git","ssh_url":"git@github.com:LiskHQ/lisk-elements.git","clone_url":"https://github.com/LiskHQ/lisk-elements.git","svn_url":"https://github.com/LiskHQ/lisk-elements","homepage":"https://lisk.io/","size":14855,"stargazers_count":265,"watchers_count":265,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":73,"mirror_url":null,"archived":false,"open_issues_count":47,"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":73,"open_issues":47,"watchers":265,"default_branch":"development"}},"base":{"label":"LiskHQ:add_p2p_experiment","ref":"add_p2p_experiment","sha":"6043f41e59d7ed67c6c89daf8ab3603c6e49ff98","user":{"login":"LiskHQ","id":16600915,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2NjAwOTE1","avatar_url":"https://avatars1.githubusercontent.com/u/16600915?v=4","gravatar_id":"","url":"https://api.github.com/users/LiskHQ","html_url":"https://github.com/LiskHQ","followers_url":"https://api.github.com/users/LiskHQ/followers","following_url":"https://api.github.com/users/LiskHQ/following{/other_user}","gists_url":"https://api.github.com/users/LiskHQ/gists{/gist_id}","starred_url":"https://api.github.com/users/LiskHQ/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LiskHQ/subscriptions","organizations_url":"https://api.github.com/users/LiskHQ/orgs","repos_url":"https://api.github.com/users/LiskHQ/repos","events_url":"https://api.github.com/users/LiskHQ/events{/privacy}","received_events_url":"https://api.github.com/users/LiskHQ/received_events","type":"Organization","site_admin":false},"repo":{"id":49426311,"node_id":"MDEwOlJlcG9zaXRvcnk0OTQyNjMxMQ==","name":"lisk-elements","full_name":"LiskHQ/lisk-elements","private":false,"owner":{"login":"LiskHQ","id":16600915,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2NjAwOTE1","avatar_url":"https://avatars1.githubusercontent.com/u/16600915?v=4","gravatar_id":"","url":"https://api.github.com/users/LiskHQ","html_url":"https://github.com/LiskHQ","followers_url":"https://api.github.com/users/LiskHQ/followers","following_url":"https://api.github.com/users/LiskHQ/following{/other_user}","gists_url":"https://api.github.com/users/LiskHQ/gists{/gist_id}","starred_url":"https://api.github.com/users/LiskHQ/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LiskHQ/subscriptions","organizations_url":"https://api.github.com/users/LiskHQ/orgs","repos_url":"https://api.github.com/users/LiskHQ/repos","events_url":"https://api.github.com/users/LiskHQ/events{/privacy}","received_events_url":"https://api.github.com/users/LiskHQ/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/LiskHQ/lisk-elements","description":"⚙️ Library for sending Lisk transactions from the client or server","fork":false,"url":"https://api.github.com/repos/LiskHQ/lisk-elements","forks_url":"https://api.github.com/repos/LiskHQ/lisk-elements/forks","keys_url":"https://api.github.com/repos/LiskHQ/lisk-elements/keys{/key_id}","collaborators_url":"https://api.github.com/repos/LiskHQ/lisk-elements/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/LiskHQ/lisk-elements/teams","hooks_url":"https://api.github.com/repos/LiskHQ/lisk-elements/hooks","issue_events_url":"https://api.github.com/repos/LiskHQ/lisk-elements/issues/events{/number}","events_url":"https://api.github.com/repos/LiskHQ/lisk-elements/events","assignees_url":"https://api.github.com/repos/LiskHQ/lisk-elements/assignees{/user}","branches_url":"https://api.github.com/repos/LiskHQ/lisk-elements/branches{/branch}","tags_url":"https://api.github.com/repos/LiskHQ/lisk-elements/tags","blobs_url":"https://api.github.com/repos/LiskHQ/lisk-elements/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/LiskHQ/lisk-elements/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/LiskHQ/lisk-elements/git/refs{/sha}","trees_url":"https://api.github.com/repos/LiskHQ/lisk-elements/git/trees{/sha}","statuses_url":"https://api.github.com/repos/LiskHQ/lisk-elements/statuses/{sha}","languages_url":"https://api.github.com/repos/LiskHQ/lisk-elements/languages","stargazers_url":"https://api.github.com/repos/LiskHQ/lisk-elements/stargazers","contributors_url":"https://api.github.com/repos/LiskHQ/lisk-elements/contributors","subscribers_url":"https://api.github.com/repos/LiskHQ/lisk-elements/subscribers","subscription_url":"https://api.github.com/repos/LiskHQ/lisk-elements/subscription","commits_url":"https://api.github.com/repos/LiskHQ/lisk-elements/commits{/sha}","git_commits_url":"https://api.github.com/repos/LiskHQ/lisk-elements/git/commits{/sha}","comments_url":"https://api.github.com/repos/LiskHQ/lisk-elements/comments{/number}","issue_comment_url":"https://api.github.com/repos/LiskHQ/lisk-elements/issues/comments{/number}","contents_url":"https://api.github.com/repos/LiskHQ/lisk-elements/contents/{+path}","compare_url":"https://api.github.com/repos/LiskHQ/lisk-elements/compare/{base}...{head}","merges_url":"https://api.github.com/repos/LiskHQ/lisk-elements/merges","archive_url":"https://api.github.com/repos/LiskHQ/lisk-elements/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/LiskHQ/lisk-elements/downloads","issues_url":"https://api.github.com/repos/LiskHQ/lisk-elements/issues{/number}","pulls_url":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls{/number}","milestones_url":"https://api.github.com/repos/LiskHQ/lisk-elements/milestones{/number}","notifications_url":"https://api.github.com/repos/LiskHQ/lisk-elements/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/LiskHQ/lisk-elements/labels{/name}","releases_url":"https://api.github.com/repos/LiskHQ/lisk-elements/releases{/id}","deployments_url":"https://api.github.com/repos/LiskHQ/lisk-elements/deployments","created_at":"2016-01-11T12:54:02Z","updated_at":"2018-12-12T14:32:27Z","pushed_at":"2018-12-12T18:08:11Z","git_url":"git://github.com/LiskHQ/lisk-elements.git","ssh_url":"git@github.com:LiskHQ/lisk-elements.git","clone_url":"https://github.com/LiskHQ/lisk-elements.git","svn_url":"https://github.com/LiskHQ/lisk-elements","homepage":"https://lisk.io/","size":14855,"stargazers_count":265,"watchers_count":265,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":73,"mirror_url":null,"archived":false,"open_issues_count":47,"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":73,"open_issues":47,"watchers":265,"default_branch":"development"}},"_links":{"self":{"href":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls/936"},"html":{"href":"https://github.com/LiskHQ/lisk-elements/pull/936"},"issue":{"href":"https://api.github.com/repos/LiskHQ/lisk-elements/issues/936"},"comments":{"href":"https://api.github.com/repos/LiskHQ/lisk-elements/issues/936/comments"},"review_comments":{"href":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls/936/comments"},"review_comment":{"href":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/LiskHQ/lisk-elements/pulls/936/commits"},"statuses":{"href":"https://api.github.com/repos/LiskHQ/lisk-elements/statuses/6d6e47074c748082a7d962ad7127167a45931b89"}},"author_association":"NONE"}}
{"actor":{"display_login":"SargeKhan"}}