Skip to content

Instantly share code, notes, and snippets.

@Arachnid
Last active April 5, 2019 01:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Arachnid/3ab69c4e1d7943073b69451359426ddc to your computer and use it in GitHub Desktop.
Save Arachnid/3ab69c4e1d7943073b69451359426ddc to your computer and use it in GitHub Desktop.
contract UserTokenFactory {
mapping(address=>UserToken) public userTokens;
function getUserToken(address owner) returns(UserToken) {
if(userTokens[owner] == 0) {
UserToken token = new UserToken(owner);
userTokens[owner] = token;
}
return userTokens[owner];
}
contract UserToken {
UserTokenFactory factory;
address public owner;
mapping(uint256=>uint256) public balances;
uint nonce;
event TokenIssued(uint256 tokenId, uint256 quantity);
constructor(address _owner) {
owner = _owner;
factory = msg.sender;
}
function issue(uint256 amount) returns(uint256) {
uint256 tokenId = keccak256(abi.encodePacked(owner, nonce++));
tokens[tokenId] = amount;
return tokenId;
}
function transfer(address recipient, uint256 tokenId, uint256 amount) {
require(owner == msg.sender);
require(balances[tokenId] >= amount);
balances[tokenId] -= amount;
UserToken recipient = factory.getUserToken(recipient);
recipient.recieve(tokenId, amount);
}
function receive(uint256 tokenId, uint256 amount) {
UserToken sender = UserToken(msg.sender);
require(factory.userTokens[sender.owner] == msg.sender);
require(balances[tokenId] + amount >= amount);
balances[tokenId] += amount;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment