Skip to content

Instantly share code, notes, and snippets.

@naterush
Created August 18, 2017 06:24
Show Gist options
  • Save naterush/54f2f0782863ad21bf49940635a7392e to your computer and use it in GitHub Desktop.
Save naterush/54f2f0782863ad21bf49940635a7392e to your computer and use it in GitHub Desktop.
Assuming initial supply goes to members - only members can ever hold tokens. If a member is removed while holding tokens, their tokens are frozen. Also, no tests include. (don't) Use with caution :~)
// USING
// https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
// https://github.com/ConsenSys/Tokens/blob/master/contracts/StandardToken.sol
pragma solidity ^0.4.15;
import "./Ownable.sol"; // left out for conciseness
contract MembersOnly is Ownable {
uint256 public totalSupply;
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
event MemberAdded(address indexed _added);
event MemberRemoved(address indexed _removed);
mapping (address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;
mapping (address => bool) isMember; //only members can hold and transfer tokens - assuming inital supply held by members
modifier onlyMember(address addr) {
require (isMember[addr]);
_;
}
function transfer(address _to, uint256 _value) onlyMember(_to) returns (bool success) {
require(balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]);
balances[msg.sender] -= _value;
balances[_to] += _value;
Transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) onlyMember(_to) returns (bool success) {
require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value > balances[_to]);
balances[_to] += _value;
balances[_from] -= _value;
allowed[_from][msg.sender] -= _value;
Transfer(_from, _to, _value);
return true;
}
function balanceOf(address _owner) constant returns (uint256 balance) {
return balances[_owner];
}
function approve(address _spender, uint256 _value) onlyMember(_spender) returns (bool success) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
return allowed[_owner][_spender];
}
/*
OWNER ONLY FUNCTIONS
*/
function addMember(address _toAdd) onlyOwner {
isMember[_toAdd] = true;
MemberAdded(_toAdd);
}
function removeMember(address _toRemove) onlyOwner {
isMember[_toRemove] = false;
MemberRemoved(_toRemove);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment