add release delay + add release+refunds + natspec
This commit is contained in:
parent
209ed0e002
commit
2ecaa0fabe
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue