@unstoppabledomains/resolution
Version:
Domain Resolution for blockchain domains
95 lines (94 loc) • 3.97 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getParentDomain = exports.labelNameHash = exports.splitDomainName = exports.fromDecStringToHex = exports.fromHexStringToDecimals = exports.znsChildhash = exports.znsNamehash = exports.eip137Childhash = exports.eip137Namehash = void 0;
var sha256_1 = __importDefault(require("crypto-js/sha256"));
var sha3_1 = __importDefault(require("crypto-js/sha3"));
var enc_hex_1 = __importDefault(require("crypto-js/enc-hex"));
var lib_typedarrays_1 = __importDefault(require("crypto-js/lib-typedarrays"));
var bn_js_1 = __importDefault(require("bn.js"));
var js_sha3_1 = require("js-sha3");
function eip137Namehash(domain) {
var arr = hashArray(domain, 'sha3');
return arrayToHex(arr);
}
exports.eip137Namehash = eip137Namehash;
function eip137Childhash(parentHash, label) {
return childhash(parentHash, label, 'sha3');
}
exports.eip137Childhash = eip137Childhash;
function znsNamehash(domain) {
var arr = hashArray(domain, 'sha256');
return arrayToHex(arr);
}
exports.znsNamehash = znsNamehash;
function znsChildhash(parentHash, label) {
return childhash(parentHash, label, 'sha256');
}
exports.znsChildhash = znsChildhash;
function childhash(parentHash, label, hashingAlgo) {
var hash = hashingAlgo === 'sha256' ? sha256_1.default : sha3_1.default;
var opts = { outputLength: 256 };
var parent = parentHash.replace(/^0x/, '');
var childHash = enc_hex_1.default.stringify(hash(label, opts));
return "0x".concat(enc_hex_1.default.stringify(hash(enc_hex_1.default.parse("".concat(parent).concat(childHash)), opts)));
}
function hashArray(domain, hashingAlgo) {
if (!domain) {
return lib_typedarrays_1.default.create(Array.from(new Uint8Array(8)));
}
var hash = hashingAlgo === 'sha256' ? sha256_1.default : sha3_1.default;
var opts = { outputLength: 256 };
var _a = domain.split('.'), label = _a[0], remainder = _a.slice(1);
var labelHash = hash(label, opts);
var remainderHash = hashArray(remainder.join('.'), hashingAlgo);
return hash(remainderHash.concat(labelHash), opts);
}
function arrayToHex(arr) {
return "0x".concat(enc_hex_1.default.stringify(arr));
}
function fromHexStringToDecimals(value) {
if (value.startsWith('0x')) {
var valueWithoutPrefix = value.slice(2, value.length);
var bn = new bn_js_1.default(valueWithoutPrefix, 16);
return bn.toString(10);
}
return value;
}
exports.fromHexStringToDecimals = fromHexStringToDecimals;
function fromDecStringToHex(value) {
if (!value.startsWith('0x')) {
var bn = new bn_js_1.default(value, 10);
var bnString = bn.toString(16);
return "0x".concat(bnString.padStart(64, '0'));
}
return value;
}
exports.fromDecStringToHex = fromDecStringToHex;
var splitDomainName = function (domain) {
var splitDomain = domain.split('.');
var label = splitDomain[0];
var tld = splitDomain[1];
if (splitDomain.length - 1 < 2) {
return { label: label, tld: tld };
}
tld = splitDomain[-1];
label = splitDomain.slice(0, -1).join('.');
return { label: label, tld: tld };
};
exports.splitDomainName = splitDomainName;
// returns the tokenId of an ens domain name.
// @see https://docs.ens.domains/dapp-developer-guide/ens-as-nft#deriving-tokenid-from-ens-name
var labelNameHash = function (domain) {
var splitDomain = (0, exports.splitDomainName)(domain);
var labelHash = (0, js_sha3_1.keccak256)(Buffer.from(splitDomain.label, 'utf8'));
return "0x".concat(labelHash);
};
exports.labelNameHash = labelNameHash;
var getParentDomain = function (domain) {
var splitDomain = domain.split('.');
return "".concat(splitDomain[-2], ".").concat(splitDomain[-1]);
};
exports.getParentDomain = getParentDomain;