UNPKG

@filfox/fnsjs

Version:

Library For FNS

437 lines (436 loc) 18.3 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const ethers_1 = require("ethers"); const utils_1 = require("ethers/lib/utils"); const hooks_1 = require("./hooks"); const utils_2 = require("./utils"); const constant_1 = require("./constant"); class Name { constructor(name, fns) { this.name = name; this.fns = fns; } /* read methods */ getBase() { return this.fns.getNameBase(this.name); } getInfo() { return this.fns.getNameInfo(this.name); } getAddrs() { return this.fns.getNameAddrs(this.name); } getTexts() { return this.fns.getNameTexts(this.name); } getAvailable() { return this.fns.getAvailable(this.name); } getPrice(months, unit) { return this.fns.getPrice(this.name, months, unit); } getRegistrant() { return this.fns.getRegistrant(this.name); } getExpires(format) { return this.fns.getExpires(this.name, format); } getExpired() { return this.fns.getExpired(this.name); } getController() { return this.fns.getController(this.name); } getContent() { return this.fns.getContent(this.name); } getText(key) { return this.fns.getText(this.name, key); } getAddr() { return this.fns.getAddr(this.name); } getAddrOf(coin) { return this.fns.getAddrOf(this.name, coin); } /* write methods */ register(owner, months) { return this.fns.register(this.name, owner, months); } renew(months) { return this.fns.renew(this.name, months); } transferControlTo(addr) { return this.fns.transferControl(this.name, addr); } transferOwnershipTo(to) { return this.fns.transferOwnership(this.name, to); } setController(addr) { return this.fns.setController(this.name, addr); } setContent(content) { return this.fns.setContent(this.name, content); } setText(key, val) { return this.fns.setText(this.name, key, val); } setTexts(texts) { return this.fns.setTexts(this.name, texts); } setAddrOf(coin, addr) { return this.fns.setAddrOf(this.name, coin, addr); } setAddrs(addrMap) { return this.fns.setAddrs(this.name, addrMap); } setPrimaryName() { return this.fns.setPrimaryName(this.name); } setSubName(subname, owner) { return this.fns.setSubName(this.name, subname, owner); } } class Address { constructor(address, fns) { this.address = address; this.fns = fns; } getName() { return this.fns.lookupAddress(this.address); } getPrimaryName() { return this.fns.getPrimaryName(this.address); } getOwnershipNames() { return this.fns.getOwnershipNames(this.address); } } class FNS { constructor(network) { this.network = null; this.provider = null; this.signer = null; this.network = (0, constant_1.getNetwork)(network); const defaultProvider = ethers_1.providers.getDefaultProvider(this.network.rpc); this.setProvider(defaultProvider); } setProvider(provider) { if (ethers_1.providers.Provider.isProvider(provider)) { this.provider = provider; } else { this.provider = new ethers_1.providers.Web3Provider(provider); } this.signer = this.provider.getSigner(); } getProvider() { return this.provider; } setSigner(signer) { this.signer = signer; } getSigner() { return this.signer; } /*** name api ***/ name(name) { return new Name(name, this); } /*** address api ***/ address(address) { return new Address(address, this); } /*** readonly api ***/ getResolver() { return this.network.contractAddress['PublicResolver']; } getNameBase(name) { var _a, _b, _c, _d, _e; return __awaiter(this, void 0, void 0, function* () { const requests = [ this.getAvailable(name), this.getExpires(name, 'YYYY-MM-DD HH:mm'), this.getExpired(name), this.getRegistrant(name), this.getController(name) ]; const results = yield Promise.allSettled(requests); return { name, available: (_a = results[0].value) !== null && _a !== void 0 ? _a : false, expires: (_b = results[1].value) !== null && _b !== void 0 ? _b : 0, expired: (_c = results[2].value) !== null && _c !== void 0 ? _c : true, registrant: (_d = results[3].value) !== null && _d !== void 0 ? _d : '', controller: (_e = results[4].value) !== null && _e !== void 0 ? _e : '', resolver: this.getResolver() }; }); } getNameAddrs(name) { return __awaiter(this, void 0, void 0, function* () { const coins = constant_1.COIN_NAMES; const requests = coins.map(c => this.getAddrOf(name, c)); const results = yield Promise.allSettled(requests); const addrs = {}; coins.forEach((c, i) => { var _a; return addrs[c] = (_a = results[i].value) !== null && _a !== void 0 ? _a : ''; }); return addrs; }); } getNameTexts(name) { return __awaiter(this, void 0, void 0, function* () { const textKeys = constant_1.TEXT_KEYS; const requests = textKeys.map(k => this.getText(name, k)); const results = yield Promise.allSettled(requests); const texts = {}; textKeys.forEach((k, i) => { var _a; return texts[k] = (_a = results[i].value) !== null && _a !== void 0 ? _a : ''; }); return texts; }); } getNameInfo(name) { var _a, _b, _c, _d; return __awaiter(this, void 0, void 0, function* () { const requests = [ this.getNameBase(name), this.getNameAddrs(name), this.getNameTexts(name), this.getContent(name) ]; const results = yield Promise.allSettled(requests); return Object.assign(Object.assign({}, ((_a = results[0].value) !== null && _a !== void 0 ? _a : {})), { addrs: (_b = results[1].value) !== null && _b !== void 0 ? _b : {}, texts: (_c = results[2].value) !== null && _c !== void 0 ? _c : {}, content: (_d = results[3].value) !== null && _d !== void 0 ? _d : '' }); }); } getAvailable(name) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('RegistrarController', this.provider, this.network.name); const available = yield contract.available((0, utils_2.trimSuffix)(name)); return available; }); } getPrice(name, months = 12, unit) { return __awaiter(this, void 0, void 0, function* () { const duration = months * 30 * 86400; const contract = (0, hooks_1.useContract)('RegistrarController', this.provider, this.network.name); const { base } = yield contract.rentPrice((0, utils_2.trimSuffix)(name), duration); switch (unit) { case 'fil': return (0, utils_2.formatUnits)(base); case 'usd': const price = yield (0, utils_2.getFilMarketPrice)(); return (0, utils_2.formatAssetValue)(base, price); default: return base; } }); } getRegistrant(name) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('Registrar', this.provider, this.network.name); const tokenId = (0, utils_1.keccak256)((0, utils_1.toUtf8Bytes)((0, utils_2.trimSuffix)(name))); const registrant = yield contract.ownerOf(tokenId); return registrant; }); } getExpires(name, format) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('RegistrarController', this.provider, this.network.name); const expires = yield contract.nameExpires((0, utils_2.trimSuffix)(name)); const timestamp = expires.toNumber(); return format ? (0, utils_2.formatTime)(timestamp, format) : timestamp; }); } getExpired(name) { return __awaiter(this, void 0, void 0, function* () { const curTimestamp = (yield this.provider.getBlock()).timestamp; const nameExpiresTimestamp = yield this.getExpires(name); return (0, utils_2.isTimeBefore)(nameExpiresTimestamp, curTimestamp); }); } getController(name) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('FNSRegistry', this.provider, this.network.name); const node = (0, utils_1.namehash)(name); const controller = yield contract.owner(node); return controller == 0x0 ? '' : controller; }); } getContent(name) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('PublicResolver', this.provider, this.network.name); const node = (0, utils_1.namehash)(name); const contenthash = yield contract.contenthash(node); return (0, utils_1.toUtf8String)(contenthash); }); } getText(name, key) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('PublicResolver', this.provider, this.network.name); const node = (0, utils_1.namehash)(name); const val = yield contract.text(node, key); return val; }); } getAddr(name) { return __awaiter(this, void 0, void 0, function* () { return this.getAddrOf(name, 'fil'); }); } getAddrOf(name, coin) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('PublicResolver', this.provider, this.network.name); const coinCode = constant_1.COIN_IDS[coin]; const addr = yield contract['addr(bytes32,uint256)']((0, utils_1.namehash)(name), coinCode); return (0, utils_1.toUtf8String)(addr); }); } lookupAddress(addr) { return __awaiter(this, void 0, void 0, function* () { const ethAddr = (0, utils_2.convertToEthAddr)(addr); const primaryName = yield this.getPrimaryName(ethAddr); const filAddr = (0, utils_2.convertToEthAddr)(yield this.getAddr(primaryName)); return ethAddr == filAddr ? primaryName : ''; }); } getPrimaryName(addr) { return __awaiter(this, void 0, void 0, function* () { const ethAddr = (0, utils_2.convertToEthAddr)(addr); const contract = (0, hooks_1.useContract)('PublicResolver', this.provider, this.network.name); const node = (0, utils_1.namehash)(`${ethAddr.substring(2).toLowerCase()}.addr.reverse`); const name = yield contract.name(node); return name; }); } getOwnershipNames(addr) { return __awaiter(this, void 0, void 0, function* () { const ethAddr = (0, utils_2.convertToEthAddr)(addr); const contract = (0, hooks_1.useContract)('Registrar', this.provider, this.network.name); const count = yield contract.balanceOf(ethAddr); const tokenIds = yield Promise.all(Array.from({ length: count }).map((_, index) => contract.tokenOfOwnerByIndex(ethAddr, index))); const list = yield Promise.all(tokenIds.map(tokenId => contract.nameOf(tokenId))); const names = list.map(name => `${name}.fil`); return names; }); } /*** write api ***/ register(name, owner, months, reverseRecord = true, resolver = this.network.contractAddress['PublicResolver'], data = []) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('RegistrarController', this.getSigner(), this.network.name); const duration = months * 30 * 86400; const price = yield this.getPrice(name, months); const tx = yield contract.register((0, utils_2.trimSuffix)(name), owner, duration, resolver, data, reverseRecord, { value: price }); return tx; }); } renew(name, months) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('RegistrarController', this.getSigner(), this.network.name); const duration = months * 30 * 86400; const price = yield this.getPrice(name, months); const tx = yield contract.renew((0, utils_2.trimSuffix)(name), duration, { value: price }); return tx; }); } /* Only called by registrant */ transferControl(name, addr) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('Registrar', this.getSigner(), this.network.name); const id = (0, utils_2.labelhash)((0, utils_2.trimSuffix)(name)); const tx = yield contract.reclaim(id, addr); return tx; }); } /* Only called by registrant */ transferOwnership(name, to) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('Registrar', this.getSigner(), this.network.name); const id = (0, utils_2.labelhash)((0, utils_2.trimSuffix)(name)); const from = yield this.getRegistrant(name); const tx = yield contract.transferFrom(from, to, id); return tx; }); } /* Only called by controller */ setController(name, addr) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('FNSRegistry', this.getSigner(), this.network.name); const node = (0, utils_1.namehash)(name); const tx = yield contract.setOwner(node, addr); return tx; }); } setContent(name, content) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('PublicResolver', this.getSigner(), this.network.name); const node = (0, utils_1.namehash)(name); const tx = yield contract.setContenthash(node, (0, utils_1.toUtf8Bytes)(content)); return tx; }); } setText(name, key, val) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('PublicResolver', this.getSigner(), this.network.name); const node = (0, utils_1.namehash)(name); const tx = yield contract.setText(node, key, val); return tx; }); } setTexts(name, texts) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('PublicResolver', this.getSigner(), this.network.name); const node = (0, utils_1.namehash)(name); const keys = Object.keys(texts); const vals = Object.values(texts); const tx = yield contract.setTexts(node, keys, vals); return tx; }); } setAddrOf(name, coin, addr) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('PublicResolver', this.getSigner(), this.network.name); const tx = yield contract['setAddr(bytes32,uint256,bytes)']((0, utils_1.namehash)(name), constant_1.COIN_IDS[coin], ethers_1.utils.toUtf8Bytes(addr), { value: 0 }); return tx; }); } setAddrs(name, addrMap) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('PublicResolver', this.getSigner(), this.network.name); const node = (0, utils_1.namehash)(name); const coins = Object.keys(addrMap).map(c => constant_1.COIN_IDS[c]); const addrs = Object.values(addrMap).map(a => ethers_1.utils.toUtf8Bytes(a)); const tx = yield contract.setAddrs(node, coins, addrs, { value: 0 }); return tx; }); } setPrimaryName(name) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('ReverseRegistrar', this.getSigner(), this.network.name); const tx = yield contract.setName(name); return tx; }); } setSubName(name, subname, owner) { return __awaiter(this, void 0, void 0, function* () { const contract = (0, hooks_1.useContract)('FNSRegistry', this.getSigner(), this.network.name); const node = (0, utils_1.namehash)(name); const label = (0, utils_2.labelhash)(subname); const resolver = this.network.contractAddress['PublicResolver']; const tx = yield contract.setSubnodeRecord(node, label, owner, resolver, 0); return tx; }); } } exports.default = FNS; module.exports = FNS;