{"action":"closed","number":162,"pull_request":{"url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/pulls/162","id":110700112,"html_url":"https://github.com/OpenZeppelin/zeppelin-solidity/pull/162","diff_url":"https://github.com/OpenZeppelin/zeppelin-solidity/pull/162.diff","patch_url":"https://github.com/OpenZeppelin/zeppelin-solidity/pull/162.patch","issue_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/issues/162","number":162,"state":"closed","locked":false,"title":"Decouple transferable logic from VestedToken","user":{"login":"izqui","id":447328,"avatar_url":"https://avatars0.githubusercontent.com/u/447328?v=3","gravatar_id":"","url":"https://api.github.com/users/izqui","html_url":"https://github.com/izqui","followers_url":"https://api.github.com/users/izqui/followers","following_url":"https://api.github.com/users/izqui/following{/other_user}","gists_url":"https://api.github.com/users/izqui/gists{/gist_id}","starred_url":"https://api.github.com/users/izqui/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/izqui/subscriptions","organizations_url":"https://api.github.com/users/izqui/orgs","repos_url":"https://api.github.com/users/izqui/repos","events_url":"https://api.github.com/users/izqui/events{/privacy}","received_events_url":"https://api.github.com/users/izqui/received_events","type":"User","site_admin":false},"body":"This PR decouples VestedToken transferable logic into another contract that is meant to be used as a base class for other contracts. \r\n\r\nThis is needed for composing multiple transferable factors in a clean way.\r\n\r\nFor example in Aragon we have our main `Stock` contract be something like:\r\n\r\n```\r\ncontract Stock is GovernanceToken, VestedToken {}\r\n```\r\n\r\nWhere `GovernanceToken` also limits token transferability based on whether a holder has voted on an opened proposal, and therefore her tokens locked.\r\n\r\nThis allows for recursively finding what is the maximum amount of tokens that can be transferred at any given moment. Helpful reference on inheritance can be found on the Solidity [doc](http://solidity.readthedocs.io/en/develop/contracts.html#inheritance), but basically it will call the function on the right most contract and then if `super` is called it will jump to the next one on the left until it gets to the base class, in this case the new `TransferableToken` implementation that just returns the holder balance. ","created_at":"2017-03-14T19:31:54Z","updated_at":"2017-03-15T19:09:14Z","closed_at":"2017-03-15T19:09:14Z","merged_at":"2017-03-15T19:09:14Z","merge_commit_sha":"312220fe6387790990a158b79df6f46543caeec5","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/pulls/162/commits","review_comments_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/pulls/162/comments","review_comment_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/pulls/comments{/number}","comments_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/issues/162/comments","statuses_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/statuses/72029b68476545ecd4c2592b927d39cc5c4da0bd","head":{"label":"AragonOne:transaferable","ref":"transaferable","sha":"72029b68476545ecd4c2592b927d39cc5c4da0bd","user":{"login":"AragonOne","id":24612534,"avatar_url":"https://avatars2.githubusercontent.com/u/24612534?v=3","gravatar_id":"","url":"https://api.github.com/users/AragonOne","html_url":"https://github.com/AragonOne","followers_url":"https://api.github.com/users/AragonOne/followers","following_url":"https://api.github.com/users/AragonOne/following{/other_user}","gists_url":"https://api.github.com/users/AragonOne/gists{/gist_id}","starred_url":"https://api.github.com/users/AragonOne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AragonOne/subscriptions","organizations_url":"https://api.github.com/users/AragonOne/orgs","repos_url":"https://api.github.com/users/AragonOne/repos","events_url":"https://api.github.com/users/AragonOne/events{/privacy}","received_events_url":"https://api.github.com/users/AragonOne/received_events","type":"Organization","site_admin":false},"repo":{"id":79832214,"name":"zeppelin-solidity","full_name":"AragonOne/zeppelin-solidity","owner":{"login":"AragonOne","id":24612534,"avatar_url":"https://avatars2.githubusercontent.com/u/24612534?v=3","gravatar_id":"","url":"https://api.github.com/users/AragonOne","html_url":"https://github.com/AragonOne","followers_url":"https://api.github.com/users/AragonOne/followers","following_url":"https://api.github.com/users/AragonOne/following{/other_user}","gists_url":"https://api.github.com/users/AragonOne/gists{/gist_id}","starred_url":"https://api.github.com/users/AragonOne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AragonOne/subscriptions","organizations_url":"https://api.github.com/users/AragonOne/orgs","repos_url":"https://api.github.com/users/AragonOne/repos","events_url":"https://api.github.com/users/AragonOne/events{/privacy}","received_events_url":"https://api.github.com/users/AragonOne/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/AragonOne/zeppelin-solidity","description":"Zeppelin, a framework to build secure smart contracts on Ethereum","fork":true,"url":"https://api.github.com/repos/AragonOne/zeppelin-solidity","forks_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/forks","keys_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/teams","hooks_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/hooks","issue_events_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/issues/events{/number}","events_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/events","assignees_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/assignees{/user}","branches_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/branches{/branch}","tags_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/tags","blobs_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/git/refs{/sha}","trees_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/statuses/{sha}","languages_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/languages","stargazers_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/stargazers","contributors_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/contributors","subscribers_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/subscribers","subscription_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/subscription","commits_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/commits{/sha}","git_commits_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/git/commits{/sha}","comments_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/comments{/number}","issue_comment_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/issues/comments{/number}","contents_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/contents/{+path}","compare_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/merges","archive_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/downloads","issues_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/issues{/number}","pulls_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/pulls{/number}","milestones_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/milestones{/number}","notifications_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/labels{/name}","releases_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/releases{/id}","deployments_url":"https://api.github.com/repos/AragonOne/zeppelin-solidity/deployments","created_at":"2017-01-23T18:06:41Z","updated_at":"2017-03-08T08:53:13Z","pushed_at":"2017-03-14T19:22:33Z","git_url":"git://github.com/AragonOne/zeppelin-solidity.git","ssh_url":"git@github.com:AragonOne/zeppelin-solidity.git","clone_url":"https://github.com/AragonOne/zeppelin-solidity.git","svn_url":"https://github.com/AragonOne/zeppelin-solidity","homepage":"https://openzeppelin.org","size":238,"stargazers_count":2,"watchers_count":2,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"OpenZeppelin:master","ref":"master","sha":"9c5975a706b076b7000e8179f8101e0c61024c87","user":{"login":"OpenZeppelin","id":20820676,"avatar_url":"https://avatars0.githubusercontent.com/u/20820676?v=3","gravatar_id":"","url":"https://api.github.com/users/OpenZeppelin","html_url":"https://github.com/OpenZeppelin","followers_url":"https://api.github.com/users/OpenZeppelin/followers","following_url":"https://api.github.com/users/OpenZeppelin/following{/other_user}","gists_url":"https://api.github.com/users/OpenZeppelin/gists{/gist_id}","starred_url":"https://api.github.com/users/OpenZeppelin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OpenZeppelin/subscriptions","organizations_url":"https://api.github.com/users/OpenZeppelin/orgs","repos_url":"https://api.github.com/users/OpenZeppelin/repos","events_url":"https://api.github.com/users/OpenZeppelin/events{/privacy}","received_events_url":"https://api.github.com/users/OpenZeppelin/received_events","type":"Organization","site_admin":false},"repo":{"id":64700934,"name":"zeppelin-solidity","full_name":"OpenZeppelin/zeppelin-solidity","owner":{"login":"OpenZeppelin","id":20820676,"avatar_url":"https://avatars0.githubusercontent.com/u/20820676?v=3","gravatar_id":"","url":"https://api.github.com/users/OpenZeppelin","html_url":"https://github.com/OpenZeppelin","followers_url":"https://api.github.com/users/OpenZeppelin/followers","following_url":"https://api.github.com/users/OpenZeppelin/following{/other_user}","gists_url":"https://api.github.com/users/OpenZeppelin/gists{/gist_id}","starred_url":"https://api.github.com/users/OpenZeppelin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OpenZeppelin/subscriptions","organizations_url":"https://api.github.com/users/OpenZeppelin/orgs","repos_url":"https://api.github.com/users/OpenZeppelin/repos","events_url":"https://api.github.com/users/OpenZeppelin/events{/privacy}","received_events_url":"https://api.github.com/users/OpenZeppelin/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/OpenZeppelin/zeppelin-solidity","description":"Zeppelin, a framework to build secure smart contracts on Ethereum","fork":false,"url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity","forks_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/forks","keys_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/teams","hooks_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/hooks","issue_events_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/issues/events{/number}","events_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/events","assignees_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/assignees{/user}","branches_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/branches{/branch}","tags_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/tags","blobs_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/git/refs{/sha}","trees_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/statuses/{sha}","languages_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/languages","stargazers_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/stargazers","contributors_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/contributors","subscribers_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/subscribers","subscription_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/subscription","commits_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/commits{/sha}","git_commits_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/git/commits{/sha}","comments_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/comments{/number}","issue_comment_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/issues/comments{/number}","contents_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/contents/{+path}","compare_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/merges","archive_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/downloads","issues_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/issues{/number}","pulls_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/pulls{/number}","milestones_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/milestones{/number}","notifications_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/labels{/name}","releases_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/releases{/id}","deployments_url":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/deployments","created_at":"2016-08-01T20:54:54Z","updated_at":"2017-03-15T12:40:28Z","pushed_at":"2017-03-15T19:09:14Z","git_url":"git://github.com/OpenZeppelin/zeppelin-solidity.git","ssh_url":"git@github.com:OpenZeppelin/zeppelin-solidity.git","clone_url":"https://github.com/OpenZeppelin/zeppelin-solidity.git","svn_url":"https://github.com/OpenZeppelin/zeppelin-solidity","homepage":"https://openzeppelin.org","size":239,"stargazers_count":278,"watchers_count":278,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":65,"mirror_url":null,"open_issues_count":47,"forks":65,"open_issues":47,"watchers":278,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/pulls/162"},"html":{"href":"https://github.com/OpenZeppelin/zeppelin-solidity/pull/162"},"issue":{"href":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/issues/162"},"comments":{"href":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/issues/162/comments"},"review_comments":{"href":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/pulls/162/comments"},"review_comment":{"href":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/pulls/162/commits"},"statuses":{"href":"https://api.github.com/repos/OpenZeppelin/zeppelin-solidity/statuses/72029b68476545ecd4c2592b927d39cc5c4da0bd"}},"merged":true,"mergeable":null,"mergeable_state":"unknown","merged_by":{"login":"maraoz","id":287189,"avatar_url":"https://avatars0.githubusercontent.com/u/287189?v=3","gravatar_id":"","url":"https://api.github.com/users/maraoz","html_url":"https://github.com/maraoz","followers_url":"https://api.github.com/users/maraoz/followers","following_url":"https://api.github.com/users/maraoz/following{/other_user}","gists_url":"https://api.github.com/users/maraoz/gists{/gist_id}","starred_url":"https://api.github.com/users/maraoz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maraoz/subscriptions","organizations_url":"https://api.github.com/users/maraoz/orgs","repos_url":"https://api.github.com/users/maraoz/repos","events_url":"https://api.github.com/users/maraoz/events{/privacy}","received_events_url":"https://api.github.com/users/maraoz/received_events","type":"User","site_admin":false},"comments":1,"review_comments":0,"maintainer_can_modify":false,"commits":1,"additions":25,"deletions":17,"changed_files":2}}
{"actor":{"display_login":"maraoz"}}