# Domains AS NFT

**Deriving tokenId from Domains name**

The tokenId of Domains name is simply the uint256 representation of the hash of the label `(xyz for xyz.tomi).`

```javascript
const ethers = require('ethers')
const BigNumber = ethers.BigNumber
const utils = ethers.utils
const name = 'xyz'
const labelHash = utils.keccak256(utils.toUtf8Bytes(name))
const tokenId = BigNumber.from(labelHash).toString()
```

In the example above`,79233663829379634837589865448569342784712482819484549289560981379859480642508` is the tokenId of `xyz.tomi.`

**Deriving Domains name from tokenId**

Unlike deriving tokenId, deriving Domains name from tokenId is not as easy. This is because all Domains names are stored as fixed-length hash to allow registering an infinite length of names. The downside of this architecture is that you cannot directly query Domains smart contracts to return Domains name using tokenId.

Our recommended way is to query via[ <mark style="color:red;">https://thegraph.com</mark>](https://thegraph.com/) Domains subgraph. The graph decodes the hash to name as it indexes. The example code to query is as follows.

```javascript
const ethers = require('ethers')
const BigNumber = ethers.BigNumber
const gr = require('graphql-request')
const { request, gql } = gr
const tokenId = '79233663829379634837589865448569342784712482819484549289560981379859480642508'
// Should return 0xaf2caa1c2ca1d027f1ac823b529d0a67cd144264b2789fa2ea4d63a67c7103cc
const labelHash = BigNumber.from(tokenId).toHexString()

const url = 'https://api.thegraph.com/subgraphs/name/tdnsdomains/tdns'
const GET_LABEL_NAME = gql`
query{
 domains(first:1, where:{labelhash:"${labelHash}"}){
   labelName
 }
}`

request(url, GET_LABEL_NAME).then((data) => console.log(data))
// { domains: [ { labelName: 'vitalik' } ] }
```

1. Create a registrar contract as ERC721 compliant
2. Set Domains registry address (mostly when you deploy the registrar)
3. Create `register` function which calls `registry.setSubnodeOwner` then mint the token making the subdomain label hash as tokenId

Currently, all the subdomains nor non .tomi domains are not NFT, unless the domain registrar itself supports NFT such as (dcl.tomi, and .kred). If you want to turn all subdomains which you own, you have to create a registrar

**Turning subdomain into NFT**

If you prefer not to rely on a third party like TheGraph, our team has open-sourced tdns-rainbow containing a link to the original dataset (6GB with 133 million entities) so that you can host your own Domains name decoding service.

```javascript
contract DCLRegistrar is ERC721Full, Ownable {
   constructor(
       ITDNSRegistry _registry,
   ) public ERC721Full("DCL Registrar", "DCLENS") {
       // tDNS registry
       updateRegistry(_registry);
   }

   function register(
       string memory _subdomain,
       bytes32 subdomainLabelHash,
       address _beneficiary,
       uint256 _createdDate
   ) internal {
       // Create new subdomain and assign the _beneficiary as the owner
       registry.setSubnodeOwner(domainNameHash, subdomainLabelHash, _beneficiary);
       // Mint an ERC721 token with the subdomain label hash as its id
       _mint(_beneficiary, uint256(subdomainLabelHash));
   }
}
```

Once deployed, then you have to transfer the controller address to the contract.

For non-technical users, we are currently working on upgrading our `SubdomainRegistrar` which allows you to turn your subdomain into NFT without any coding.

**Metadata**

.tomi does not have `.tokenURI` . However, we created a separate metadata service where NFT marketplaces like OpenSea can fetch metadata for Domains such as registration data, expiration date, name length, etc. For more detail, please refer to the metadata documentation site.[<br>](https://tomi-domain-name-service.gitbook.io/titled/dapp-developer-guide/domains-front-end-design-guidelines)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://tomi-domains.gitbook.io/tomi-domains/tomi-domains-1/introduction/domains/domains-as-nft.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
