add release delay + add release+refunds + natspec

This commit is contained in:
Ricardo Guilherme Schmidt 2018-05-03 17:29:33 -03:00 committed by Barry Gitarts
parent 209ed0e002
commit 2ecaa0fabe
1 changed files with 105 additions and 99 deletions

View File

@ -5,39 +5,59 @@ import "../token/ERC20Token.sol";
import "../ens/ENS.sol";
import "../ens/PublicResolver.sol";
contract SubdomainRegistry is Controlled {
struct Domain {
bool active;
uint256 price;
}
mapping (bytes32 => Domain) public domains;
mapping (bytes32 => address) public registry;
mapping (bytes32 => address) public owner;
/**
* @author Ricardo Guilherme Schmidt (Status Research & Development GmbH)
* @notice Sell ENS subdomains of owned domains.
*/
contract ENSSubdomainRegistry is Controlled {
ERC20Token public token;
ENS public ens;
PublicResolver public resolver;
event Registered(bytes32 indexed _subDomainHash, address _identity);
uint256 public releaseDelay = 1 years;
mapping (bytes32 => Domain) public domains;
mapping (bytes32 => Account) public accounts;
event Registered(bytes32 indexed _subDomainHash, address _owner);
event Released(bytes32 indexed _subDomainHash);
struct Domain {
bool active;
uint256 price;
}
struct Account {
uint256 tokenBalance;
uint256 creationTime;
}
/**
* @notice Initializes a UserRegistry contract
* @param _token fee token base
* @param _ens Ethereum Name Service root address
* @param _resolver Default resolver to use in initial settings
*/
constructor(
address _token,
address _ens,
address _resolver
ERC20Token _token,
ENS _ens,
PublicResolver _resolver
)
public
{
initialize(
ERC20Token(_token),
ENS(_ens),
PublicResolver(_resolver),
address(msg.sender)
);
token = _token;
ens = _ens;
resolver = _resolver;
}
/**
* @notice Registers `_userHash` subdomain to `_domainHash` setting msg.sender as owner.
* @param _userHash choosen unowned subdomain hash
* @param _domianHash choosen contract owned domain hash
* @param _account optional address to set at public resolver
* @param _pubkeyA optional pubkey part A to set at public resolver
* @param _pubkeyB optional pubkey part B to set at public resolver
*/
function register(
bytes32 _userHash,
bytes32 _domainHash,
@ -47,41 +67,24 @@ contract SubdomainRegistry is Controlled {
)
external
returns(bytes32 subdomainHash)
{
return _register(_userHash, _domainHash, msg.sender, _account, _pubkeyA, _pubkeyB);
}
function _register(
bytes32 _userHash,
bytes32 _domainHash,
address _owner,
address _account,
bytes32 _pubkeyA,
bytes32 _pubkeyB
)
internal
returns(bytes32 subdomainHash)
{
Domain memory domain = domains[_domainHash];
require(domain.active);
subdomainHash = keccak256(_userHash, _domainHash);
require(owner[subdomainHash] == address(0));
owner[subdomainHash] = _owner;
address currentOwner = ens.owner(subdomainHash);
require(currentOwner == 0);
require(ens.owner(subdomainHash) == address(0));
require(accounts[subdomainHash].creationTime == 0);
accounts[subdomainHash] = Account(domain.price, block.timestamp);
ens.setSubnodeOwner(_domainHash, _userHash, address(this));
ens.setResolver(subdomainHash, resolver);
if(_account != address(0)){
resolver.setAddr(subdomainHash, _account);
}
if(_pubkeyA != 0 || _pubkeyB != 0) {
resolver.setPubkey(subdomainHash, _pubkeyA, _pubkeyB);
}
ens.setSubnodeOwner(_domainHash, _userHash, msg.sender);
require(
token.transferFrom(
address(msg.sender),
@ -89,35 +92,41 @@ contract SubdomainRegistry is Controlled {
domain.price
)
);
emit Registered(subdomainHash, _owner);
}
function claimSubnodeOwnership(
emit Registered(subdomainHash, msg.sender);
}
/**
* @notice release subdomain and retrieve locked fee, needs to be called after `releasePeriod` from creation time.
* @param _userHash `msg.sender` owned subdomain hash
* @param _domianHash choosen contract owned domain hash
*/
function release(
bytes32 _userHash,
bytes32 _domainHash
)
)
external
{
bytes32 subdomainHash = keccak256(_userHash, _domainHash);
address currentOwner = owner[subdomainHash];
require(currentOwner == msg.sender);
ens.setSubnodeOwner(_domainHash, _userHash, currentOwner);
}
require(msg.sender == ens.owner(subdomainHash));
Account memory account = accounts[subdomainHash];
require(account.creationTime > 0);
require(account.creationTime + releaseDelay > block.timestamp);
delete accounts[subdomainHash];
function update(
bytes32 _subdomainHash,
address _newContract
)
external
{
require(
msg.sender == owner[_subdomainHash] &&
address(this) == ens.owner(_subdomainHash)
);
PublicResolver(resolver).setAddr(_subdomainHash, _newContract);
ens.setSubnodeOwner(_domainHash, _userHash, address(this));
ens.setResolver(subdomainHash, address(0));
ens.setSubnodeOwner(_domainHash, _userHash, address(0));
require(token.transfer(msg.sender, account.tokenBalance));
emit Released(subdomainHash);
}
/**
* @notice Controller include new domain available to register
* @param _domain domain owned by user registry being activated
* @param _price cost to register subnode from this node
*/
function addDomain(
bytes32 _domain,
uint256 _price
@ -130,27 +139,11 @@ contract SubdomainRegistry is Controlled {
domains[_domain] = Domain(true, _price);
}
function removeDomain(
bytes32 _domain,
address _newOwner
)
external
onlyController
{
require(ens.owner(_domain) == address(this));
ens.setOwner(_domain, _newOwner);
delete domains[_domain];
}
function setResolver(
address _resolver
)
external
onlyController
{
resolver = PublicResolver(_resolver);
}
/**
* @notice updates domain price
* @param _domain active domain being defined price
* @param _price new price
*/
function setDomainPrice(
bytes32 _domain,
uint256 _price
@ -163,22 +156,35 @@ contract SubdomainRegistry is Controlled {
domain.price = _price;
}
function initialize(
ERC20Token _token,
ENS _ens,
PublicResolver _resolver,
address _controller
/**
* @notice removes a domain from available (will not remove current sold subdomains)
* @param _domain domain being deactivated
* @param _newOwner new address hodling this domain
*/
function removeDomain(
bytes32 _domain,
address _newOwner
)
public
external
onlyController
{
require(controller == 0x0);
require(address(ens) == 0x0);
require(address(token) == 0x0);
require(address(resolver) == 0x0);
controller = _controller;
token = _token;
ens = _ens;
resolver = _resolver;
require(ens.owner(_domain) == address(this));
ens.setOwner(_domain, _newOwner);
delete domains[_domain];
}
/**
* @notice updates default public resolver for newly registred subdomains
* @param _resolver new default resolver
*/
function setResolver(
address _resolver
)
external
onlyController
{
resolver = PublicResolver(_resolver);
}
}