Added ENS reverse lookup to provider.
This commit is contained in:
parent
c566f00567
commit
394761a6ca
@ -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",
|
||||
|
@ -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() {
|
||||
});
|
||||
|
||||
|
@ -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();
|
||||
});
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user