Namekit package intended to allow app developers to seamlessly integrate decentralized name systems into their apps. Right now it has support for ENS, Decentraweb and limited support of classic DNS system.
For now Namekit only support reading data. If you need to manage domain data, please check @decentraweb/core or one of ENS libraries.
Domain name provider is detected using following logic:
.eth
then it is resolved through ENSList of ICANN domains can be found here and is updated regulary.
Important Note: This logic may change in the future.
To install library run npm install --save @decentraweb/namekit ethers@5
in your project directory.
Namekit uses ethers.js to call Ethereum contracts. It is required as peer dependency.
Decentraweb supports both Ethereum and Polygon networks. Namekit will automatically detect which network to use based on
where domain name is located currently. To initialize Namekit instance you need to pass Ethereum and Polygon network
name (mainnet
is used with 'matic' and goerli
is used with 'maticmum') and ethers.js providers for each network.
import {providers, Wallet} from "ethers";
import DwebNamekit, {NamekitConfig} from "@decentraweb/namekit";
const ETH_NETWORK = 'goerli';
const ETH_JSONRPC_URL = 'https://goerli.infura.io/v3/00000000000000000000000000000000';
const POLYGON_NETWORK = 'maticmum';
const POLYGON_JSONRPC_URL = 'https://polygon-mumbai.infura.io/v3/00000000000000000000000000000000';
const config: NamekitConfig = {
ethereum: {
network: ETH_NETWORK,
provider: new providers.JsonRpcProvider(ETH_JSONRPC_URL, ETH_NETWORK),
},
polygon: {
network: POLYGON_NETWORK,
provider: new providers.JsonRpcProvider(POLYGON_JSONRPC_URL, POLYGON_NETWORK)
}
};
const namekit = new DwebNamekit(config);
Alternatively, if you use one of supported providers, you can initialize Namekit in a simpler way:
const config: NamekitConfig = {
apiProvider: 'infura', //Supported providers: 'etherscan', 'infura', 'alchemy', 'cloudflare', 'pocket', 'ankr'
apiKey: '00000000000000000000000000000000', //
production: false //If true, then mainnet and matic networks will be used, otherwise goerli and maticmum
};
const namekit = new DwebNamekit(config);
In most cases importing library using npm
is preferred way, but for fast prototyping you can load it from our CND:
<script src="https://cdn.ethers.io/lib/ethers-5.7.umd.min.js" type="application/javascript"></script>
<script src="https://cdn.decentraweb.org/decentraweb-namekit-2.2.2.min.js" type="application/javascript"></script>
<script>
window.addEventListener('load', async () => {
const {DwebNamekit} = Decentraweb;
const namekit = new DwebNamekit({
ethereum: {
network: 'mainnet',
provider: ethers.getDefaultProvider('mainnet')
},
polygon: {
network: 'matic',
provider: ethers.getDefaultProvider('matic')
}
})
</script>
Ethereum address can be resolved through both Decentraweb and ENS contracts or through one specified system.
const names = await namekit.address.resolve('0x4323E6b155BCf0b25f8c4C0B37dA808e3550b521');
/*
Returns:
[
{ provider: 'dweb', name: 'vitalik' },
{ provider: 'ens', name: 'vitalik.eth' }
]
*/
//To query Decentraweb only
const dwebName = await namekit.address.resolve('0x4323E6b155BCf0b25f8c4C0B37dA808e3550b521', 'dweb');
/*
Returns: 'vitalik'
*/
// Alternatively to query ENS
const ensName = await namekit.address.resolve('0x4323E6b155BCf0b25f8c4C0B37dA808e3550b521', 'ens');
/*
Returns: 'vitalik.eth'
*/
In this case Namekit will detect which domain name system name belongs to and will look for Ethereum address associated
with given name. Note that classic domains will always return null
.
const address = await namekit.address.lookup('vitalik');
/*
Returns: '0x4323E6b155BCf0b25f8c4C0B37dA808e3550b521'
*/
By calling namekit.domain(domainName)
you can get instance of class that will allow to read extended data associated
with domain name. Depending on domain name provider you will get either DWEBDomain
, ENSDomain
or ICANNDomain
instance.
Below you can see feature support table for different domain name systems.
DWEB | ENS | ICANN | |
---|---|---|---|
Wallet address | yes | yes | no |
Content Hash | yes | yes | yes1 |
Text Records | yes | yes | no |
DNS records | yes | yes | yes |
const domain = await namekit.domain('vitalik');
if (domain) {
const domainProvider = domain.provider; // 'ens'
const ethAddress = await domain.address('ETH'); // '0x4323E6b155BCf0b25f8c4C0B37dA808e3550b521'
const contentHash = await domain.contentHash(); // 'ipfs://bafybeiaysi4s6lnjev27ln5icwm6tueaw2vdykrtjkwiphwekaywqhcjze'
const githubName = await domain.txt('email'); // 'foo@bar.baz'
const records = await domain.dns('A'); // [{ name: 'vitalik', type: 'A', ttl: 3600, class: 'IN', data: '127.0.0.1'}]
}
All domain name wrapper classes (DWEBDomain
, ENSDomain
and ICANNDomain
) have same interface to provide consistent API for developers.
interface BaseDomain {
//Domain name
readonly name: string;
//Which domain name system is used to query the data
readonly provider: 'dweb' | 'ens' | 'icann';
//Supported features for domain
readonly features: {
address: boolean;
contentHash: boolean;
dns: boolean;
txt: boolean;
};
//Get cryptocurrency address for given coinId
address(coinId: string): Promise<string | null>;
//Get contenthash associated with domain name
contentHash(): Promise<string | null>;
//Get DNS records of given type. Response contains JSON representation of records
dns(recordType: string): Promise<dnspacket.Answer[]>;
//Check if domain name is registered
exists(): Promise<boolean>;
//Read text records on domain
txt(key: string): Promise<string | null>;
}
Notes:
null
and won't throw an error. domain.exists()
will always return true
for icann
domains. Generated using TypeDoc