{"action":"created","comment":{"url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/comments/213084758","pull_request_review_id":149846856,"id":213084758,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMzA4NDc1OA==","diff_hunk":"@@ -0,0 +1,200 @@\n+// Copyright 2018 The go-ethereum Authors\n+// This file is part of the go-ethereum library.\n+//\n+// The go-ethereum library is free software: you can redistribute it and/or modify\n+// it under the terms of the GNU Lesser General Public License as published by\n+// the Free Software Foundation, either version 3 of the License, or\n+// (at your option) any later version.\n+//\n+// The go-ethereum library is distributed in the hope that it will be useful,\n+// but WITHOUT ANY WARRANTY; without even the implied warranty of\n+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+// GNU Lesser General Public License for more details.\n+//\n+// You should have received a copy of the GNU Lesser General Public License\n+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n+\n+package swap\n+\n+import (\n+\t\"context\"\n+\t\"fmt\"\n+\t\"sync\"\n+\n+\t\"github.com/ethereum/go-ethereum/metrics\"\n+\t\"github.com/ethereum/go-ethereum/p2p\"\n+\t\"github.com/ethereum/go-ethereum/p2p/discover\"\n+\t\"github.com/ethereum/go-ethereum/p2p/protocols\"\n+\t\"github.com/ethereum/go-ethereum/rpc\"\n+\t\"github.com/ethereum/go-ethereum/swarm/log\"\n+)\n+\n+const (\n+\tIsActiveProtocol = true\n+)\n+\n+type SwapProtocol struct {\n+\tpeersMu sync.RWMutex\n+\tpeers   map[discover.NodeID]*SwapProtocolPeer\n+\tswap    *Swap\n+}\n+\n+// Peer is the Peer extension for the streaming protocol\n+type SwapProtocolPeer struct {\n+\t*protocols.Peer\n+\tswapProtocol *SwapProtocol\n+}\n+\n+func NewSwapProtocol(swapAccount *Swap) *SwapProtocol {\n+\tproto := &SwapProtocol{\n+\t\tpeers: make(map[discover.NodeID]*SwapProtocolPeer),\n+\t\tswap:  swapAccount,\n+\t}\n+\treturn proto\n+}\n+\n+// NewPeer is the constructor for Peer\n+func NewPeer(peer *protocols.Peer, swap *SwapProtocol) *SwapProtocolPeer {\n+\tp := &SwapProtocolPeer{\n+\t\tPeer:         peer,\n+\t\tswapProtocol: swap,\n+\t}\n+\treturn p\n+}\n+\n+type IssueChequeMsg struct {\n+\tCheque *Cheque\n+}\n+\n+type RedeemChequeMsg struct {\n+}\n+\n+/////////////////////////////////////////////////////////////////////\n+// SECTION: node.Service interface\n+/////////////////////////////////////////////////////////////////////\n+\n+func (p *SwapProtocol) Start(srv *p2p.Server) error {\n+\tlog.Debug(\"Started swap\")\n+\treturn nil\n+}\n+\n+func (p *SwapProtocol) Stop() error {\n+\tlog.Info(\"swap shutting down\")\n+\treturn nil\n+}\n+\n+var swapSpec = &protocols.Spec{\n+\tName:       swapProtocolName,\n+\tVersion:    swapVersion,\n+\tMaxMsgSize: defaultMaxMsgSize,\n+\tMessages: []interface{}{\n+\t\tSwapMsg{},\n+\t},\n+}\n+\n+func (p *SwapProtocol) Protocols() []p2p.Protocol {\n+\treturn []p2p.Protocol{\n+\t\t{\n+\t\t\tName:    swapSpec.Name,\n+\t\t\tVersion: swapSpec.Version,\n+\t\t\tLength:  swapSpec.Length(),\n+\t\t\tRun:     p.Run,\n+\t\t},\n+\t}\n+}\n+\n+func (p *SwapProtocol) APIs() []rpc.API {\n+\tapis := []rpc.API{\n+\t\t{\n+\t\t\tNamespace: \"swap\",\n+\t\t\tVersion:   \"1.0\",\n+\t\t\tService:   NewAPI(p),\n+\t\t\tPublic:    true,\n+\t\t},\n+\t}\n+\treturn apis\n+}\n+\n+/////////////////////////////////////////////////////////////////////\n+// SECTION: p2p.protocol interface\n+/////////////////////////////////////////////////////////////////////\n+func (swap *SwapProtocol) Run(peer *p2p.Peer, rw p2p.MsgReadWriter) error {\n+\tp := protocols.NewPeer(peer, rw, swapSpec)\n+\tsp := NewPeer(p, swap)\n+\tswap.setPeer(sp)\n+\tdefer swap.deletePeer(sp)\n+\tdefer swap.Close()\n+\treturn sp.Run(sp.handleSwapMsg)\n+}\n+\n+func (swap *SwapProtocol) NodeInfo() interface{} {\n+\treturn nil\n+}\n+\n+func (swap *SwapProtocol) PeerInfo(id discover.NodeID) interface{} {\n+\treturn nil\n+}\n+\n+//------------------------------------------------------------------------------------------\n+func (swap *SwapProtocol) Close() {\n+}\n+\n+func (swap *SwapProtocol) getPeer(peerId discover.NodeID) *SwapProtocolPeer {\n+\tswap.peersMu.RLock()\n+\tdefer swap.peersMu.RUnlock()\n+\n+\treturn swap.peers[peerId]\n+}\n+\n+func (swap *SwapProtocol) setPeer(peer *SwapProtocolPeer) {\n+\tswap.peersMu.Lock()\n+\tdefer swap.peersMu.Unlock()\n+\n+\tswap.peers[peer.ID()] = peer\n+\tmetrics.GetOrRegisterGauge(\"registry.peers\", nil).Update(int64(len(swap.peers)))\n+}\n+\n+func (swap *SwapProtocol) deletePeer(peer *SwapProtocolPeer) {\n+\tswap.peersMu.Lock()\n+\tdefer swap.peersMu.Unlock()\n+\n+\tdelete(swap.peers, peer.ID())\n+\tmetrics.GetOrRegisterGauge(\"registry.peers\", nil).Update(int64(len(swap.peers)))\n+\tswap.peersMu.Unlock()\n+}\n+\n+func (swap *SwapProtocol) peersCount() (c int) {\n+\tswap.peersMu.Lock()\n+\tc = len(swap.peers)\n+\tswap.peersMu.Unlock()\n+\treturn\n+}\n+\n+func (p *SwapProtocolPeer) handleSwapMsg(ctx context.Context, msg interface{}) error {\n+\tswitch msg := msg.(type) {\n+\n+\tcase *IssueChequeMsg:","path":"swarm/swap/protocol.go","position":176,"original_position":176,"commit_id":"41aec7e20f945e1b1d7f3c35d51eb1ff8d5d423d","original_commit_id":"41aec7e20f945e1b1d7f3c35d51eb1ff8d5d423d","user":{"login":"holisticode","id":88287,"node_id":"MDQ6VXNlcjg4Mjg3","avatar_url":"https://avatars3.githubusercontent.com/u/88287?v=4","gravatar_id":"","url":"https://api.github.com/users/holisticode","html_url":"https://github.com/holisticode","followers_url":"https://api.github.com/users/holisticode/followers","following_url":"https://api.github.com/users/holisticode/following{/other_user}","gists_url":"https://api.github.com/users/holisticode/gists{/gist_id}","starred_url":"https://api.github.com/users/holisticode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/holisticode/subscriptions","organizations_url":"https://api.github.com/users/holisticode/orgs","repos_url":"https://api.github.com/users/holisticode/repos","events_url":"https://api.github.com/users/holisticode/events{/privacy}","received_events_url":"https://api.github.com/users/holisticode/received_events","type":"User","site_admin":false},"body":"No. \r\n\r\nAccording to https://www.sharelatex.com/project/59c298da5b3a6e3b7ec80d56, \r\n\"Figure 1: The basic interaction sequence for swap chequebooks\", \r\n\r\nwhen a node A gets too indebted with node B, it sends a Cheque to node B (`issue cheque` --> `IssueChequeMsg`). If then node B wants to cash this cheque in, it sends the `redeem cheque` (`RedeemChequeMsg`) message to node A. \r\n\r\nAccording to that same paper, these interactions are off-chain, and only handling the `RedeemChequeMsg` triggers a blockchain transaction.","created_at":"2018-08-27T19:19:12Z","updated_at":"2018-08-27T19:19:12Z","html_url":"https://github.com/ethersphere/go-ethereum/pull/899#discussion_r213084758","pull_request_url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/899","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/comments/213084758"},"html":{"href":"https://github.com/ethersphere/go-ethereum/pull/899#discussion_r213084758"},"pull_request":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/899"}},"in_reply_to_id":212191370},"pull_request":{"url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/899","id":209251511,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA5MjUxNTEx","html_url":"https://github.com/ethersphere/go-ethereum/pull/899","diff_url":"https://github.com/ethersphere/go-ethereum/pull/899.diff","patch_url":"https://github.com/ethersphere/go-ethereum/pull/899.patch","issue_url":"https://api.github.com/repos/ethersphere/go-ethereum/issues/899","number":899,"state":"open","locked":false,"title":"Swap accounting","user":{"login":"holisticode","id":88287,"node_id":"MDQ6VXNlcjg4Mjg3","avatar_url":"https://avatars3.githubusercontent.com/u/88287?v=4","gravatar_id":"","url":"https://api.github.com/users/holisticode","html_url":"https://github.com/holisticode","followers_url":"https://api.github.com/users/holisticode/followers","following_url":"https://api.github.com/users/holisticode/following{/other_user}","gists_url":"https://api.github.com/users/holisticode/gists{/gist_id}","starred_url":"https://api.github.com/users/holisticode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/holisticode/subscriptions","organizations_url":"https://api.github.com/users/holisticode/orgs","repos_url":"https://api.github.com/users/holisticode/repos","events_url":"https://api.github.com/users/holisticode/events{/privacy}","received_events_url":"https://api.github.com/users/holisticode/received_events","type":"User","site_admin":false},"body":"Implementation of swap accounting\r\n\r\nNOTE: This is a very early stage, this PR is not to be merged and only a base for review and discussion\r\n\r\nThis is an early version of Swap accounting.\r\nA node runs a `Swap` instance, which is added to the streamer registry.\r\n\r\n`SwapPeer` implements the `Send` and `Handle` functions of `p2p/protocols/protocol.Peer`. This allows `p2p/protocol` implementation to simply **embed** `SwapPeer`, Thus, when they call the `Send` function, the `SwapPeer.Send` function is called, which allows for accounting.\r\n\r\nSimilarly, for accounted message handling (receiving messages), the protocol's run function would just be assigned to `SwapPeer.RunAccountedProtocol` with the own message handler as parameter. This way, the protocol's handler is run while automatic accounting is performed.\r\n\r\nFor automatic accounting to take place, a protocol needs to implement the `GetMsgPrice()` function from the `SwapAccountedMsgType` interface for every message which needs accounting.\r\n\r\nSwap accounting is being implemented in the `swarm/swap` package. The previous `swarm/services/swap` packages have not been removed yet, but would be made obsolete by the new package once it is terminated.\r\n\r\n`swarm/swap/api.go` and `swarm/swap/protocol.go` are currently very early stage and not much developed. \r\n\r\nThe actual integration test is implemented in `swarm/network_test.go`, as implementing them in `swarm/swap` would create circular dependenices (the test works with  `NewSwarm` from the `swarm` package, which imports `swarm/network/stream`, which imports `swarm/swap`). There are a couple of simple unit tests in `swarm/swap/swap_test.go`.\r\n\r\nThe actual pricing mechanism is totally unclear yet. Issue #218 actually says to maintain balances in ETH, but it seems to make more sense to maintain them in **bytes**. The actual price values are not defined yet, and together with limits such as `payAt` and `dropAt` are totally arbitrary.","created_at":"2018-08-17T20:36:11Z","updated_at":"2018-08-27T19:19:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"79a4a2152357e0d9781fbfa01986a61e39b4c8a3","assignee":null,"assignees":[],"requested_reviewers":[{"login":"nonsense","id":50459,"node_id":"MDQ6VXNlcjUwNDU5","avatar_url":"https://avatars0.githubusercontent.com/u/50459?v=4","gravatar_id":"","url":"https://api.github.com/users/nonsense","html_url":"https://github.com/nonsense","followers_url":"https://api.github.com/users/nonsense/followers","following_url":"https://api.github.com/users/nonsense/following{/other_user}","gists_url":"https://api.github.com/users/nonsense/gists{/gist_id}","starred_url":"https://api.github.com/users/nonsense/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nonsense/subscriptions","organizations_url":"https://api.github.com/users/nonsense/orgs","repos_url":"https://api.github.com/users/nonsense/repos","events_url":"https://api.github.com/users/nonsense/events{/privacy}","received_events_url":"https://api.github.com/users/nonsense/received_events","type":"User","site_admin":false},{"login":"janos","id":78134,"node_id":"MDQ6VXNlcjc4MTM0","avatar_url":"https://avatars0.githubusercontent.com/u/78134?v=4","gravatar_id":"","url":"https://api.github.com/users/janos","html_url":"https://github.com/janos","followers_url":"https://api.github.com/users/janos/followers","following_url":"https://api.github.com/users/janos/following{/other_user}","gists_url":"https://api.github.com/users/janos/gists{/gist_id}","starred_url":"https://api.github.com/users/janos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janos/subscriptions","organizations_url":"https://api.github.com/users/janos/orgs","repos_url":"https://api.github.com/users/janos/repos","events_url":"https://api.github.com/users/janos/events{/privacy}","received_events_url":"https://api.github.com/users/janos/received_events","type":"User","site_admin":false},{"login":"gbalint","id":127662,"node_id":"MDQ6VXNlcjEyNzY2Mg==","avatar_url":"https://avatars1.githubusercontent.com/u/127662?v=4","gravatar_id":"","url":"https://api.github.com/users/gbalint","html_url":"https://github.com/gbalint","followers_url":"https://api.github.com/users/gbalint/followers","following_url":"https://api.github.com/users/gbalint/following{/other_user}","gists_url":"https://api.github.com/users/gbalint/gists{/gist_id}","starred_url":"https://api.github.com/users/gbalint/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gbalint/subscriptions","organizations_url":"https://api.github.com/users/gbalint/orgs","repos_url":"https://api.github.com/users/gbalint/repos","events_url":"https://api.github.com/users/gbalint/events{/privacy}","received_events_url":"https://api.github.com/users/gbalint/received_events","type":"User","site_admin":false},{"login":"dleonard00","id":3628492,"node_id":"MDQ6VXNlcjM2Mjg0OTI=","avatar_url":"https://avatars1.githubusercontent.com/u/3628492?v=4","gravatar_id":"","url":"https://api.github.com/users/dleonard00","html_url":"https://github.com/dleonard00","followers_url":"https://api.github.com/users/dleonard00/followers","following_url":"https://api.github.com/users/dleonard00/following{/other_user}","gists_url":"https://api.github.com/users/dleonard00/gists{/gist_id}","starred_url":"https://api.github.com/users/dleonard00/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dleonard00/subscriptions","organizations_url":"https://api.github.com/users/dleonard00/orgs","repos_url":"https://api.github.com/users/dleonard00/repos","events_url":"https://api.github.com/users/dleonard00/events{/privacy}","received_events_url":"https://api.github.com/users/dleonard00/received_events","type":"User","site_admin":false},{"login":"justelad","id":12988138,"node_id":"MDQ6VXNlcjEyOTg4MTM4","avatar_url":"https://avatars2.githubusercontent.com/u/12988138?v=4","gravatar_id":"","url":"https://api.github.com/users/justelad","html_url":"https://github.com/justelad","followers_url":"https://api.github.com/users/justelad/followers","following_url":"https://api.github.com/users/justelad/following{/other_user}","gists_url":"https://api.github.com/users/justelad/gists{/gist_id}","starred_url":"https://api.github.com/users/justelad/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justelad/subscriptions","organizations_url":"https://api.github.com/users/justelad/orgs","repos_url":"https://api.github.com/users/justelad/repos","events_url":"https://api.github.com/users/justelad/events{/privacy}","received_events_url":"https://api.github.com/users/justelad/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":805518048,"node_id":"MDU6TGFiZWw4MDU1MTgwNDg=","url":"https://api.github.com/repos/ethersphere/go-ethereum/labels/do-not-merge","name":"do-not-merge","color":"2d51e2","default":false},{"id":239695069,"node_id":"MDU6TGFiZWwyMzk2OTUwNjk=","url":"https://api.github.com/repos/ethersphere/go-ethereum/labels/in%20progress","name":"in progress","color":"d2db30","default":false},{"id":820254723,"node_id":"MDU6TGFiZWw4MjAyNTQ3MjM=","url":"https://api.github.com/repos/ethersphere/go-ethereum/labels/swap","name":"swap","color":"e2b58a","default":false},{"id":944629443,"node_id":"MDU6TGFiZWw5NDQ2Mjk0NDM=","url":"https://api.github.com/repos/ethersphere/go-ethereum/labels/swap-phase-1-accounting","name":"swap-phase-1-accounting","color":"ffd1cc","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/899/commits","review_comments_url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/899/comments","review_comment_url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ethersphere/go-ethereum/issues/899/comments","statuses_url":"https://api.github.com/repos/ethersphere/go-ethereum/statuses/41aec7e20f945e1b1d7f3c35d51eb1ff8d5d423d","head":{"label":"ethersphere:sw3","ref":"sw3","sha":"41aec7e20f945e1b1d7f3c35d51eb1ff8d5d423d","user":{"login":"ethersphere","id":6946989,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY5NDY5ODk=","avatar_url":"https://avatars2.githubusercontent.com/u/6946989?v=4","gravatar_id":"","url":"https://api.github.com/users/ethersphere","html_url":"https://github.com/ethersphere","followers_url":"https://api.github.com/users/ethersphere/followers","following_url":"https://api.github.com/users/ethersphere/following{/other_user}","gists_url":"https://api.github.com/users/ethersphere/gists{/gist_id}","starred_url":"https://api.github.com/users/ethersphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethersphere/subscriptions","organizations_url":"https://api.github.com/users/ethersphere/orgs","repos_url":"https://api.github.com/users/ethersphere/repos","events_url":"https://api.github.com/users/ethersphere/events{/privacy}","received_events_url":"https://api.github.com/users/ethersphere/received_events","type":"Organization","site_admin":false},"repo":{"id":17790136,"node_id":"MDEwOlJlcG9zaXRvcnkxNzc5MDEzNg==","name":"go-ethereum","full_name":"ethersphere/go-ethereum","owner":{"login":"ethersphere","id":6946989,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY5NDY5ODk=","avatar_url":"https://avatars2.githubusercontent.com/u/6946989?v=4","gravatar_id":"","url":"https://api.github.com/users/ethersphere","html_url":"https://github.com/ethersphere","followers_url":"https://api.github.com/users/ethersphere/followers","following_url":"https://api.github.com/users/ethersphere/following{/other_user}","gists_url":"https://api.github.com/users/ethersphere/gists{/gist_id}","starred_url":"https://api.github.com/users/ethersphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethersphere/subscriptions","organizations_url":"https://api.github.com/users/ethersphere/orgs","repos_url":"https://api.github.com/users/ethersphere/repos","events_url":"https://api.github.com/users/ethersphere/events{/privacy}","received_events_url":"https://api.github.com/users/ethersphere/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ethersphere/go-ethereum","description":"Ethereum Go","fork":true,"url":"https://api.github.com/repos/ethersphere/go-ethereum","forks_url":"https://api.github.com/repos/ethersphere/go-ethereum/forks","keys_url":"https://api.github.com/repos/ethersphere/go-ethereum/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ethersphere/go-ethereum/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ethersphere/go-ethereum/teams","hooks_url":"https://api.github.com/repos/ethersphere/go-ethereum/hooks","issue_events_url":"https://api.github.com/repos/ethersphere/go-ethereum/issues/events{/number}","events_url":"https://api.github.com/repos/ethersphere/go-ethereum/events","assignees_url":"https://api.github.com/repos/ethersphere/go-ethereum/assignees{/user}","branches_url":"https://api.github.com/repos/ethersphere/go-ethereum/branches{/branch}","tags_url":"https://api.github.com/repos/ethersphere/go-ethereum/tags","blobs_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/refs{/sha}","trees_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ethersphere/go-ethereum/statuses/{sha}","languages_url":"https://api.github.com/repos/ethersphere/go-ethereum/languages","stargazers_url":"https://api.github.com/repos/ethersphere/go-ethereum/stargazers","contributors_url":"https://api.github.com/repos/ethersphere/go-ethereum/contributors","subscribers_url":"https://api.github.com/repos/ethersphere/go-ethereum/subscribers","subscription_url":"https://api.github.com/repos/ethersphere/go-ethereum/subscription","commits_url":"https://api.github.com/repos/ethersphere/go-ethereum/commits{/sha}","git_commits_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/commits{/sha}","comments_url":"https://api.github.com/repos/ethersphere/go-ethereum/comments{/number}","issue_comment_url":"https://api.github.com/repos/ethersphere/go-ethereum/issues/comments{/number}","contents_url":"https://api.github.com/repos/ethersphere/go-ethereum/contents/{+path}","compare_url":"https://api.github.com/repos/ethersphere/go-ethereum/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ethersphere/go-ethereum/merges","archive_url":"https://api.github.com/repos/ethersphere/go-ethereum/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ethersphere/go-ethereum/downloads","issues_url":"https://api.github.com/repos/ethersphere/go-ethereum/issues{/number}","pulls_url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls{/number}","milestones_url":"https://api.github.com/repos/ethersphere/go-ethereum/milestones{/number}","notifications_url":"https://api.github.com/repos/ethersphere/go-ethereum/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ethersphere/go-ethereum/labels{/name}","releases_url":"https://api.github.com/repos/ethersphere/go-ethereum/releases{/id}","deployments_url":"https://api.github.com/repos/ethersphere/go-ethereum/deployments","created_at":"2014-03-16T02:06:34Z","updated_at":"2018-08-27T10:13:05Z","pushed_at":"2018-08-27T13:32:38Z","git_url":"git://github.com/ethersphere/go-ethereum.git","ssh_url":"git@github.com:ethersphere/go-ethereum.git","clone_url":"https://github.com/ethersphere/go-ethereum.git","svn_url":"https://github.com/ethersphere/go-ethereum","homepage":"","size":95904,"stargazers_count":113,"watchers_count":113,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":33,"mirror_url":null,"archived":false,"open_issues_count":201,"license":{"key":"lgpl-3.0","name":"GNU Lesser General Public License v3.0","spdx_id":"LGPL-3.0","url":"https://api.github.com/licenses/lgpl-3.0","node_id":"MDc6TGljZW5zZTEy"},"forks":33,"open_issues":201,"watchers":113,"default_branch":"master"}},"base":{"label":"ethersphere:master","ref":"master","sha":"2695fa2213fe5010a80970bca1078834662d5972","user":{"login":"ethersphere","id":6946989,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY5NDY5ODk=","avatar_url":"https://avatars2.githubusercontent.com/u/6946989?v=4","gravatar_id":"","url":"https://api.github.com/users/ethersphere","html_url":"https://github.com/ethersphere","followers_url":"https://api.github.com/users/ethersphere/followers","following_url":"https://api.github.com/users/ethersphere/following{/other_user}","gists_url":"https://api.github.com/users/ethersphere/gists{/gist_id}","starred_url":"https://api.github.com/users/ethersphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethersphere/subscriptions","organizations_url":"https://api.github.com/users/ethersphere/orgs","repos_url":"https://api.github.com/users/ethersphere/repos","events_url":"https://api.github.com/users/ethersphere/events{/privacy}","received_events_url":"https://api.github.com/users/ethersphere/received_events","type":"Organization","site_admin":false},"repo":{"id":17790136,"node_id":"MDEwOlJlcG9zaXRvcnkxNzc5MDEzNg==","name":"go-ethereum","full_name":"ethersphere/go-ethereum","owner":{"login":"ethersphere","id":6946989,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY5NDY5ODk=","avatar_url":"https://avatars2.githubusercontent.com/u/6946989?v=4","gravatar_id":"","url":"https://api.github.com/users/ethersphere","html_url":"https://github.com/ethersphere","followers_url":"https://api.github.com/users/ethersphere/followers","following_url":"https://api.github.com/users/ethersphere/following{/other_user}","gists_url":"https://api.github.com/users/ethersphere/gists{/gist_id}","starred_url":"https://api.github.com/users/ethersphere/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethersphere/subscriptions","organizations_url":"https://api.github.com/users/ethersphere/orgs","repos_url":"https://api.github.com/users/ethersphere/repos","events_url":"https://api.github.com/users/ethersphere/events{/privacy}","received_events_url":"https://api.github.com/users/ethersphere/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ethersphere/go-ethereum","description":"Ethereum Go","fork":true,"url":"https://api.github.com/repos/ethersphere/go-ethereum","forks_url":"https://api.github.com/repos/ethersphere/go-ethereum/forks","keys_url":"https://api.github.com/repos/ethersphere/go-ethereum/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ethersphere/go-ethereum/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ethersphere/go-ethereum/teams","hooks_url":"https://api.github.com/repos/ethersphere/go-ethereum/hooks","issue_events_url":"https://api.github.com/repos/ethersphere/go-ethereum/issues/events{/number}","events_url":"https://api.github.com/repos/ethersphere/go-ethereum/events","assignees_url":"https://api.github.com/repos/ethersphere/go-ethereum/assignees{/user}","branches_url":"https://api.github.com/repos/ethersphere/go-ethereum/branches{/branch}","tags_url":"https://api.github.com/repos/ethersphere/go-ethereum/tags","blobs_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/refs{/sha}","trees_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ethersphere/go-ethereum/statuses/{sha}","languages_url":"https://api.github.com/repos/ethersphere/go-ethereum/languages","stargazers_url":"https://api.github.com/repos/ethersphere/go-ethereum/stargazers","contributors_url":"https://api.github.com/repos/ethersphere/go-ethereum/contributors","subscribers_url":"https://api.github.com/repos/ethersphere/go-ethereum/subscribers","subscription_url":"https://api.github.com/repos/ethersphere/go-ethereum/subscription","commits_url":"https://api.github.com/repos/ethersphere/go-ethereum/commits{/sha}","git_commits_url":"https://api.github.com/repos/ethersphere/go-ethereum/git/commits{/sha}","comments_url":"https://api.github.com/repos/ethersphere/go-ethereum/comments{/number}","issue_comment_url":"https://api.github.com/repos/ethersphere/go-ethereum/issues/comments{/number}","contents_url":"https://api.github.com/repos/ethersphere/go-ethereum/contents/{+path}","compare_url":"https://api.github.com/repos/ethersphere/go-ethereum/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ethersphere/go-ethereum/merges","archive_url":"https://api.github.com/repos/ethersphere/go-ethereum/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ethersphere/go-ethereum/downloads","issues_url":"https://api.github.com/repos/ethersphere/go-ethereum/issues{/number}","pulls_url":"https://api.github.com/repos/ethersphere/go-ethereum/pulls{/number}","milestones_url":"https://api.github.com/repos/ethersphere/go-ethereum/milestones{/number}","notifications_url":"https://api.github.com/repos/ethersphere/go-ethereum/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ethersphere/go-ethereum/labels{/name}","releases_url":"https://api.github.com/repos/ethersphere/go-ethereum/releases{/id}","deployments_url":"https://api.github.com/repos/ethersphere/go-ethereum/deployments","created_at":"2014-03-16T02:06:34Z","updated_at":"2018-08-27T10:13:05Z","pushed_at":"2018-08-27T13:32:38Z","git_url":"git://github.com/ethersphere/go-ethereum.git","ssh_url":"git@github.com:ethersphere/go-ethereum.git","clone_url":"https://github.com/ethersphere/go-ethereum.git","svn_url":"https://github.com/ethersphere/go-ethereum","homepage":"","size":95904,"stargazers_count":113,"watchers_count":113,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":33,"mirror_url":null,"archived":false,"open_issues_count":201,"license":{"key":"lgpl-3.0","name":"GNU Lesser General Public License v3.0","spdx_id":"LGPL-3.0","url":"https://api.github.com/licenses/lgpl-3.0","node_id":"MDc6TGljZW5zZTEy"},"forks":33,"open_issues":201,"watchers":113,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/899"},"html":{"href":"https://github.com/ethersphere/go-ethereum/pull/899"},"issue":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/issues/899"},"comments":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/issues/899/comments"},"review_comments":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/899/comments"},"review_comment":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/pulls/899/commits"},"statuses":{"href":"https://api.github.com/repos/ethersphere/go-ethereum/statuses/41aec7e20f945e1b1d7f3c35d51eb1ff8d5d423d"}},"author_association":"NONE"}}
{"actor":{"display_login":"holisticode"}}