2
0
mirror of synced 2025-02-24 12:08:10 +00:00

Added ENS reverse lookup to provider.

This commit is contained in:
Richard Moore 2017-10-03 19:37:06 -04:00
parent c566f00567
commit 394761a6ca
3 changed files with 59 additions and 9 deletions

View File

@ -1,6 +1,6 @@
{
"name": "ethers-providers",
"version": "2.1.1",
"version": "2.1.2",
"description": "Service provider for Ethereum wallet library.",
"bugs": {
"url": "http://github.com/ethers-io/ethers.js/issues",

View File

@ -22,6 +22,8 @@ var utils = (function() {
namehash: require('ethers-utils/namehash'),
toUtf8String: require('ethers-utils/utf8').toUtf8String,
RLP: require('ethers-utils/rlp'),
}
})();
@ -739,28 +741,34 @@ utils.defineProperty(Provider.prototype, '_resolveNames', function(object, keys)
return Promise.all(promises).then(function() { return result; });
});
utils.defineProperty(Provider.prototype, 'resolveName', function(name) {
// If it is already an address, nothing to resolve
try {
return Promise.resolve(utils.getAddress(name));
} catch (error) { }
utils.defineProperty(Provider.prototype, '_getResolver', function(name) {
var nodeHash = utils.namehash(name);
// keccak256('resolver(bytes32)')
var data = '0x0178b8bf' + nodeHash.substring(2);
var transaction = { to: this.ensAddress, data: data };
var self = this;
// Get the resolver from the blockchain
return this.call(transaction).then(function(data) {
// extract the address from the data
if (data.length != 66) { return null; }
return utils.getAddress('0x' + data.substring(26));
});
});
utils.defineProperty(Provider.prototype, 'resolveName', function(name) {
// If it is already an address, nothing to resolve
try {
return Promise.resolve(utils.getAddress(name));
} catch (error) { }
var self = this;
var nodeHash = utils.namehash(name);
// Get the addr from the resovler
}).then(function(resolverAddress) {
return this._getResolver(name).then(function(resolverAddress) {
// keccak256('addr(bytes32)')
var data = '0x3b3b57de' + nodeHash.substring(2);
@ -776,6 +784,45 @@ utils.defineProperty(Provider.prototype, 'resolveName', function(name) {
});
});
utils.defineProperty(Provider.prototype, 'lookupAddress', function(address) {
var name = utils.getAddress(address).substring(2) + '.addr.reverse'
var nodehash = utils.namehash(name);
var self = this;
return this._getResolver(name).then(function(resolverAddress) {
if (!resolverAddress) { return null; }
// keccak('name(bytes32)')
var data = '0x691f3431' + nodehash.substring(2);
var transaction = { to: resolverAddress, data: data };
return self.call(transaction);
}).then(function(data) {
// Strip off the "0x"
data = data.substring(2);
// Strip off the dynamic string pointer (0x20)
if (data.length < 64) { return null; }
data = data.substring(64);
if (data.length < 64) { return null; }
var length = utils.bigNumberify('0x' + data.substring(0, 64)).toNumber();
data = data.substring(64);
if (2 * length > data.length) { return null; }
var name = utils.toUtf8String('0x' + data.substring(0, 2 * length));
// Make sure the reverse record matches the foward record
return self.resolveName(name).then(function(addr) {
if (addr != address) { return null; }
return name;
});
});
});
utils.defineProperty(Provider.prototype, 'doPoll', function() {
});

View File

@ -484,6 +484,9 @@ function testENS(test) {
return provider.resolveName('not-valid');
}).then(function(address) {
test.equal(null, address, 'Invalid ENS name');
return provider.lookupAddress('0x06B5955A67D827CDF91823E3bB8F069e6c89c1D6');
}).then(function(name) {
test.equal('ricmoo.firefly.eth', name, 'Invalid ENS reverse lookup');
test.done();
});
}