open-bounty/contracts/TokenReg.sol

109 lines
3.2 KiB
Solidity

//! Token Registry contract.
//! By Gav Wood (Ethcore), 2016.
//! Released under the Apache Licence 2.
pragma solidity ^0.4.0;
// From Owned.sol
contract Owned {
modifier only_owner { if (msg.sender != owner) return; _; }
event NewOwner(address indexed old, address indexed current);
function setOwner(address _new) only_owner { NewOwner(owner, _new); owner = _new; }
address public owner = msg.sender;
}
contract TokenReg is Owned {
struct Token {
address addr;
string tla;
uint base;
string name;
address owner;
mapping (bytes32 => bytes32) meta;
}
modifier when_fee_paid { if (msg.value < fee) return; _; }
modifier when_address_free(address _addr) { if (mapFromAddress[_addr] != 0) return; _; }
modifier when_tla_free(string _tla) { if (mapFromTLA[_tla] != 0) return; _; }
modifier when_is_tla(string _tla) { if (bytes(_tla).length != 3) return; _; }
modifier when_has_tla(string _tla) { if (mapFromTLA[_tla] == 0) return; _; }
modifier only_token_owner(uint _id) { if (tokens[_id].owner != msg.sender) return; _; }
event Registered(string indexed tla, uint indexed id, address addr, string name);
event Unregistered(string indexed tla, uint indexed id);
event MetaChanged(uint indexed id, bytes32 indexed key, bytes32 value);
function register(address _addr, string _tla, uint _base, string _name) payable returns (bool) {
return registerAs(_addr, _tla, _base, _name, msg.sender);
}
function registerAs(address _addr, string _tla, uint _base, string _name, address _owner) payable when_fee_paid when_address_free(_addr) when_is_tla(_tla) when_tla_free(_tla) returns (bool) {
tokens.push(Token(_addr, _tla, _base, _name, _owner));
mapFromAddress[_addr] = tokens.length;
mapFromTLA[_tla] = tokens.length;
Registered(_tla, tokens.length - 1, _addr, _name);
return true;
}
function unregister(uint _id) only_owner {
Unregistered(tokens[_id].tla, _id);
delete mapFromAddress[tokens[_id].addr];
delete mapFromTLA[tokens[_id].tla];
delete tokens[_id];
}
function setFee(uint _fee) only_owner {
fee = _fee;
}
function tokenCount() constant returns (uint) { return tokens.length; }
function token(uint _id) constant returns (address addr, string tla, uint base, string name, address owner) {
var t = tokens[_id];
addr = t.addr;
tla = t.tla;
base = t.base;
name = t.name;
owner = t.owner;
}
function fromAddress(address _addr) constant returns (uint id, string tla, uint base, string name, address owner) {
id = mapFromAddress[_addr] - 1;
var t = tokens[id];
tla = t.tla;
base = t.base;
name = t.name;
owner = t.owner;
}
function fromTLA(string _tla) constant returns (uint id, address addr, uint base, string name, address owner) {
id = mapFromTLA[_tla] - 1;
var t = tokens[id];
addr = t.addr;
base = t.base;
name = t.name;
owner = t.owner;
}
function meta(uint _id, bytes32 _key) constant returns (bytes32) {
return tokens[_id].meta[_key];
}
function setMeta(uint _id, bytes32 _key, bytes32 _value) only_token_owner(_id) {
tokens[_id].meta[_key] = _value;
MetaChanged(_id, _key, _value);
}
function drain() only_owner {
if (!msg.sender.send(this.balance))
throw;
}
mapping (address => uint) mapFromAddress;
mapping (string => uint) mapFromTLA;
Token[] tokens;
uint public fee = 0;
}