improve protection of user terms

This commit is contained in:
Ricardo Guilherme Schmidt 2018-05-06 20:42:06 -03:00 committed by Barry Gitarts
parent a7313c1a0b
commit 968a4b2427
1 changed files with 24 additions and 14 deletions

View File

@ -31,6 +31,7 @@ contract ENSSubdomainRegistry is Controlled {
struct Account {
uint256 tokenBalance;
uint256 creationTime;
address backupOwner;
}
/**
@ -77,7 +78,7 @@ contract ENSSubdomainRegistry is Controlled {
subdomainHash = keccak256(_userHash, _domainHash);
require(ens.owner(subdomainHash) == address(0));
require(accounts[subdomainHash].creationTime == 0);
accounts[subdomainHash] = Account(domain.price, block.timestamp);
accounts[subdomainHash] = Account(domain.price, block.timestamp, msg.sender);
require(token.allowance(msg.sender, address(this)) >= domain.price);
bool resolvePubkey = _pubkeyA != 0 || _pubkeyB != 0;
@ -120,23 +121,20 @@ contract ENSSubdomainRegistry is Controlled {
)
external
{
bool isDomainController = ens.owner(_domainHash) == address(this);
bytes32 subdomainHash = keccak256(_userHash, _domainHash);
require(msg.sender == ens.owner(subdomainHash));
Account memory account = accounts[subdomainHash];
require(account.creationTime > 0);
bool isDomainController = ens.owner(_domainHash) == address(this);
require(
account.creationTime + releaseDelay > block.timestamp ||
!isDomainController //user can optout anytime if ens domainHash is unowned
);
delete accounts[subdomainHash];
if(isDomainController) {
if (isDomainController) {
require(msg.sender == ens.owner(subdomainHash));
require(account.creationTime + releaseDelay > block.timestamp);
ens.setSubnodeOwner(_domainHash, _userHash, address(this));
ens.setResolver(subdomainHash, address(0));
ens.setSubnodeOwner(_domainHash, _userHash, address(0));
} else {
require(msg.sender == account.backupOwner);
}
delete accounts[subdomainHash];
require(token.transfer(msg.sender, account.tokenBalance));
emit Released(subdomainHash);
}
@ -196,6 +194,16 @@ contract ENSSubdomainRegistry is Controlled {
_newRegistry.migrateDomain(_domain, price);
}
/**
* @notice updates backup owner useful in case of opt-out domain move to new registry.
* @param _subdomainHash hash of the subdomain regarding this
**/
function updateBackupOwner(bytes32 _subdomainHash) external {
require(accounts[_subdomainHash].creationTime > 0);
require(msg.sender == ens.owner(_subdomainHash));
accounts[_subdomainHash].backupOwner == msg.sender;
}
/**
* @notice updates default public resolver for newly registred subdomains
* @param _resolver new default resolver
@ -229,7 +237,7 @@ contract ENSSubdomainRegistry is Controlled {
Account memory account = accounts[subdomainHash];
delete accounts[subdomainHash];
token.approve(_newRegistry, account.tokenBalance);
_newRegistry.migrateAccount(_userHash, _domainHash, account.tokenBalance, account.creationTime);
_newRegistry.migrateAccount(_userHash, _domainHash, account.tokenBalance, account.creationTime, account.backupOwner);
}
/**
@ -251,18 +259,20 @@ contract ENSSubdomainRegistry is Controlled {
* @param _domianHash choosen contract owned domain hash
* @param _tokenBalance amount being transferred
* @param _creationTime any value coming from parent
* @param _backupOwner backupOwner for opt-out/release at domain move
**/
function migrateAccount(
bytes32 _userHash,
bytes32 _domainHash,
uint256 _tokenBalance,
uint256 _creationTime
uint256 _creationTime,
address _backupOwner
)
external
{
require(msg.sender == parentRegistry);
bytes32 subdomainHash = keccak256(_userHash, _domainHash);
accounts[subdomainHash] = Account(_tokenBalance, _creationTime);
accounts[subdomainHash] = Account(_tokenBalance, _creationTime, _backupOwner);
require(token.transferFrom(parentRegistry, address(this), _tokenBalance));
}