UNPKG

@plug.cool/sense

Version:

A tiny library for easily getting Ethereum ENS data using Javascript

141 lines (127 loc) 4.45 kB
/** * sense * Released under MIT license */ const ethers = require('ethers'); const utilities = require('./utilities'); /* ENS TEXT RECORD QUERY CONSTANTS THESE ARE SEPARATE FROM SOCIAL MEDIA LINKS BECAUSE LOOP IN getEnsTextRecord() BREAKS WITH SOCIAL MEDIA ENS RECORDS. */ const ENS_TEXT_RECORD_QUERY = { description: 'description', avatar: 'avatar', url: 'url', email: 'email', name: 'name', location: 'location', notice: 'notice', keywords: 'keywords' } /* SOCIAL MEDIA ENS TEXT RECORD QUERY CONSTANTS EACH OF THESE IS USED ONE AT A TIME */ const ENS_TWITTER_URL = 'com.twitter'; const ENS_GITHUB_URL = 'com.github'; const ENS_TELEGRAM_URL = 'org.telegram'; const ENS_LINKEDIN_URL = 'com.linkedin'; const ENS_DISCORD_URL = 'com.discord'; const ENS_REDDIT_URL = 'com.reddit'; const setProvider = (data) => { /** * Returns a provider object * @param {type} {Object} data params to choose provider (apiType, network, apiKey) * @return {type} {String/Bool} provider Returns the provider object for further calls */ let { apiType, network, apiKey } = data; // make sure inputs are lowercase apiType = apiType.toLowerCase(); network = network.toLowerCase(); switch (apiType) { case 'infura': return new ethers.providers.InfuraProvider(network, { projectId: apiKey }); case 'etherscan': return new ethers.providers.EtherscanProvider(network, { projectId: apiKey }); case 'alchemy': return new ethers.providers.AlchemyProvider(network, { projectId: apiKey }); case 'cloudflare': return new ethers.providers.CloudflareProvider(network, { projectId: apiKey }); default: return false; } } const lookupENSFromAddress = async (address, provider) => { /** * Returns an ENS name if address is a Registrant * @param {type} {String} address The verified wallet address to attach to Twitter account * @param {type} {Object} provider The provider object instantiated by setProvider * @return {type} {String/Bool} ensName Returns the ENS Name if address is a registrant */ const name = await provider.lookupAddress(address); if (name === null) { return false; } return name; } const getEthRegistrantFromENS = async (ensName, provider) => { /** * Returns the Eth Registrant address from an ENS name * @param {type} {String} ensName The verified wallet address to attach to Twitter account * @param {type} {Object} provider The provider object instantiated by setProvider * @return {type} {String/Bool} address Returns the address tied to the ENS name */ return await provider.resolveName(ensName); } const getENSTextRecord = async (ensName, provider) => { /** * Returns ENS data if applicable * @param {type} {String} ensName The ENS name to get text record for i.e vitalik.eth * @param {type} {Object} provider The provider object instantiated by setProvider * @return {type} {Object/Bool} ensTextRecord/false Returns an ensTextRecord object if present, false if not */ const resolver = await provider.getResolver(ensName); let ensTextRecord = {}; if (resolver) { for (const [key, value] of Object.entries(ENS_TEXT_RECORD_QUERY)) { const result = await resolver.getText(ENS_TEXT_RECORD_QUERY[value]); if (result) { const item = { [key] : result } ensTextRecord = Object.assign(ensTextRecord, item); } else { console.log('⚠️ ENS RECORD NOT FOUND'); } } } const twitter = await resolver.getText(ENS_TWITTER_URL); const github = await resolver.getText(ENS_GITHUB_URL); const telegram = await resolver.getText(ENS_TELEGRAM_URL); const linkedIn = await resolver.getText(ENS_LINKEDIN_URL); const discord = await resolver.getText(ENS_DISCORD_URL); const reddit = await resolver.getText(ENS_REDDIT_URL); const ensTextRecordUrls = { twitter, github, telegram, linkedIn, discord, reddit }; for (const [key, value] of Object.entries(ensTextRecordUrls)) { if (value !== null) { const item = { [key]: value }; ensTextRecord = Object.assign(ensTextRecord, item); } } if (!utilities.isEmpty(ensTextRecord)) { return ensTextRecord; } return false; } module.exports.setProvider = setProvider; module.exports.lookupENSFromAddress = lookupENSFromAddress; module.exports.getEthRegistrantFromENS = getEthRegistrantFromENS; module.exports.getENSTextRecord = getENSTextRecord;