Skip to content

Commit

Permalink
Add domains on the enslistings registrar. Also fixes #6 and #7.
Browse files Browse the repository at this point in the history
  • Loading branch information
Arachnid committed Mar 13, 2018
1 parent aba11b9 commit aeeaf27
Show file tree
Hide file tree
Showing 4 changed files with 156 additions and 44 deletions.
144 changes: 109 additions & 35 deletions app/js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,61 @@ const referrerAddress = "0x0904Dac3347eA47d208F3Fd67402D039a3b99859";

var SubdomainRegistrar = contract(subdomainregistrar_artifacts);
var ENS = contract(ens_artifacts);
Promise.config({cancellation: true});

var registrarVersions = {
"0.9": {
// v0.9 is identical to 1.0, but the referrer and resolver arguments are swapped on `register`.
query: async function(domain, subdomain) {
var registrar = await (domain.registrar === undefined ? SubdomainRegistrar.deployed() : SubdomainRegistrar.at(domain.registrar));
return registrar.query('0x' + sha3(domain.name), subdomain);
},
register: async function(domain, subdomain, ownerAddress, referrerAddress, resolverAddress, value) {
var registrar = await (domain.registrar === undefined ? SubdomainRegistrar.deployed() : SubdomainRegistrar.at(domain.registrar));
return registrar.register(
'0x' + sha3(domain.name),
subdomain,
ownerAddress,
resolverAddress,
referrerAddress,
{
from: ownerAddress,
value: value,
});
}
},
"1.0": {
query: async function(domain, subdomain) {
var registrar = await (domain.registrar === undefined ? SubdomainRegistrar.deployed() : SubdomainRegistrar.at(domain.registrar));
return registrar.query('0x' + sha3(domain.name), subdomain);
},
register: async function(domain, subdomain, ownerAddress, referrerAddress, resolverAddress, value) {
var registrar = await (domain.registrar === undefined ? SubdomainRegistrar.deployed() : SubdomainRegistrar.at(domain.registrar));
return registrar.register(
'0x' + sha3(domain.name),
subdomain,
ownerAddress,
referrerAddress,
resolverAddress,
{
from: ownerAddress,
value: value,
});
}
}
};

function domainge(infoa, infob) {
// Rank free domains highest, regardless of referral fee
if(infoa[1] == 0) return true;
if(infob[1] == 0) return false;
// Then rank by referral fee descending
if(!infoa[3].eq(infob[3])) return infoa[3].gte(infob[3]);
// Then rank by price ascending
if(!infoa[1].eq(infob[1])) return infoa[1].lt(infob[1]);
// Finally sort alphabetically
return infoa[0] < infob[0];
}

window.App = {
start: async function() {
Expand All @@ -27,17 +82,14 @@ window.App = {
ENS.setProvider(web3.currentProvider);

try {
self.registrar = await SubdomainRegistrar.deployed();
self.ens = await ENS.deployed();

// Get the address of the current public resolver
self.resolverAddress = await self.ens.resolver(namehash.hash('resolver.eth'));
console.log(self.resolverAddress);
} catch(e) {
$("#wrongnetworkmodal").modal('show');
}

var last = undefined;
$("#name").keyup(function() {
try {
var name = $("#name");
Expand All @@ -57,48 +109,79 @@ window.App = {
var subdomain = namehash.normalize($("#name").val().trim());
$("#name").val(subdomain);

if(subdomain == last) return;
last = subdomain;
if(subdomain == this.last) return;
this.last = subdomain;

self.clearDomains();
if(this.lookups !== undefined) {
this.lookups.cancel();
}
if(subdomain != "") {
for(var domain of domainnames) {
self.checkDomain(domain, subdomain);
}
self.checkDomains(domainnames, subdomain, 2);
}
}, 500));
}.bind(this), 500));
},
clearDomains: function() {
$('#results').empty();
},
checkDomain: async function(domain, subdomain) {
var name = subdomain + "." + domain + "." + tld;

var item = $('<a href="#" class="list-group-item list-group-item-action flex-column align-items-start disabled">');

var namediv = $('<div class="d-flex w-100 justify-content-between">');
namediv.append($('<h5 class="mb-1">').text(name));
var icon = $('<span class="icon">');
namediv.append(icon.append($('<span class="oi oi-ellipses">')));
item.append(namediv);

$('#results').append(item);
checkDomains: async function(domains, subdomain, parallelism) {
this.lookups = Promise.map(
domains,
async function(domain) {
var name = subdomain + "." + domain.name + "." + tld;

var item = $('<a href="#" class="list-group-item list-group-item-action flex-column align-items-start disabled">');
item.data({domain: domain, subdomain: subdomain});

var namediv = $('<div class="d-flex w-100 justify-content-between">');
namediv.append($('<h5 class="mb-1">').text(name));
var icon = $('<span class="icon">');
namediv.append(icon.append($('<span class="oi oi-ellipses">')));
item.append(namediv);

var insertPoint = $('#results .list-group-item-danger');
if(insertPoint.length == 0) {
item.appendTo($('#results'));
} else {
item.insertBefore(insertPoint.first());
}

var info = await this.registrar.query('0x' + sha3(domain), subdomain);
item.removeClass("disabled");
this.setItemState(domain, subdomain, item, info);
var info = await registrarVersions[domain.version].query(domain, subdomain);
item.removeClass("disabled");
this.setItemState(domain, subdomain, item, info);
}.bind(this),
{concurrency: 4}
);
await this.lookups;
this.lookups = undefined;
},
setItemState: function(domain, subdomain, item, info) {
if(subdomain != this.last) return;

item.data().info = info;
console.log(domain.name + " fee ppm " + info[3]);
if(info[0] == "") {
$(".icon", item).empty().append($('<span class="oi oi-circle-x">'));
item.removeClass("list-group-item-success");
item.addClass("list-group-item-danger");
item.appendTo($('#results'));
} else {
var cost = web3.fromWei(info[1]);
$(".icon", item).empty().append($('<span class="badge badge-primary badge-pill">').text("Ξ" + cost));
item.removeClass("list-group-item-danger");
item.addClass("list-group-item-success");
item.click(() => this.buySubdomain(domain, subdomain, item, info));

// Find the correct insertion point
for(var li of $('#results a')) {
li = $(li);
if(li.hasClass("disabled") || li.hasClass("list-group-item-danger") || domainge(item.data().info, li.data().info)) {
console.log(item.data().info + " > " + li.data().info);
item.insertBefore(li);
return;
}
}
item.appendTo($('#results'));
}
},
buySubdomain: async function(domain, subdomain, item, info) {
Expand All @@ -107,18 +190,9 @@ window.App = {
return;
}

$(".domainname").text(subdomain + "." + domain + "." + tld);
$(".domainname").text(subdomain + "." + domain.name + "." + tld);
$("#registeringmodal").modal('show');
var tx = await this.registrar.register(
'0x' + sha3(domain),
subdomain,
web3.eth.accounts[0],
referrerAddress,
this.resolverAddress,
{
from: web3.eth.accounts[0],
value: info[1],
});
var tx = await registrarVersions[domain.version].register(domain, subdomain, web3.eth.accounts[0], referrerAddress, this.resolverAddress, info[1]);
$("#etherscan").attr("href", "https://etherscan.io/tx/" + tx.tx);
$("#registeringmodal").modal('hide');
$("#registeredmodal").modal('show');
Expand Down
36 changes: 33 additions & 3 deletions app/js/domains.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,35 @@
[
"gimmethe",
"wantsome",
"etherbase"
{"name": "etherbase", "version": "1.0"},
{"name": "gimmethe", "version": "1.0"},
{"name": "wantsome", "version": "1.0"},
{"name": "appleid", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atdiscord", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atdtube", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atdistrict0x", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atethereum", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atfacebook", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "aticloud", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atinstagram", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atleeroy", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atmedium", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atopenbazaar", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atreddit", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atrocketchat", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atslack", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atskype", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atsnapchat", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atsteemit", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "attelegram", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "attwitter", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atwechat", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atwhatsapp", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "atyoutube", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "buymecoffee", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "ethereumpurse", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "ishername", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "satoshiwallet", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "smartaddress", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "thisisme", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "viewwallet", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"},
{"name": "yourass", "version": "0.9", "registrar": "0xfa6512358d241b636edf5f8ccaaf86676dec21a7"}
]
10 changes: 5 additions & 5 deletions migrations/2_deploy_contracts.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ module.exports = function(deployer, network, accounts) {
}).then(function(registrar) {
if(dhr != undefined) {
// Configuration of test domains
return Promise.map(domainnames, async function(name) {
await dhr.setSubnodeOwner('0x' + sha3(name), accounts[0]);
await dhr.transfer('0x' + sha3(name), registrar.address);
await registrar.configureDomain(name, 1e16, 100000);

return Promise.map(domainnames, async function(domain) {
if(domain.registrar !== undefined) return;
await dhr.setSubnodeOwner('0x' + sha3(domain.name), accounts[0]);
await dhr.transfer('0x' + sha3(domain.name), registrar.address);
await registrar.configureDomain(domain.name, 1e16, 100000);
});
}
});
Expand Down
10 changes: 9 additions & 1 deletion truffle.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
require('babel-register');

module.exports = { };
module.exports = {
networks: {
test: {
host: "127.0.0.1",
port: 9545,
network_id: "*"
}
}
};

0 comments on commit aeeaf27

Please sign in to comment.