diff --git a/content/dns/tlds.mdx b/content/dns/tlds.mdx new file mode 100644 index 00000000..900f78fe --- /dev/null +++ b/content/dns/tlds.mdx @@ -0,0 +1,15 @@ +import { WIP } from "@/components/wip/WIP"; + +{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} +export const meta = { + title: 'Supported TLD List', + description: '', + emoji: '📝', + contributors: ['lucemans'] +}; + +# Supported TLD List + +Allongside the `.eth` Top Level Domain, the ENS Protocol also supports most of your favourite DNS Top Level Domains (such as `.com`, `.cash` or `.domains`). The list below aims to show all TLDs and their current status. + + diff --git a/content/index.mdx b/content/index.mdx index e8f0b2ca..a73138d4 100644 --- a/content/index.mdx +++ b/content/index.mdx @@ -29,8 +29,6 @@ contributors: [

Learn more

Try out ENS

-{/* */} -
{/* TODO: Insert examples of protocol.art .kred etc */} diff --git a/content/resolvers/ccip.mdx b/content/resolvers/ccip.mdx index 3bde25d1..312e81d5 100644 --- a/content/resolvers/ccip.mdx +++ b/content/resolvers/ccip.mdx @@ -15,8 +15,8 @@ export const meta = { {/* This document covers what it takes to write a gateway resolver. */} The source of truth for a name and its subdomains does not always have to be on-chain or on Ethereum L1 at all. -By leveraging [EIP-3668](https://eips.ethereum.org/EIPS/eip-3668), the Cross Chain Interoperability Protocol (CCIP for short), we can load information about a name (and its subnames) by hitting a so called "Gateway". -This enables for storing names, addresses, records, and more on other chains, or even off-chain. +By leveraging [EIP-3668](https://eips.ethereum.org/EIPS/eip-3668), the Cross Chain Interoperability Protocol (or CCIP Read for short), we can load information by hitting a so called "Gateway". +Within the context of ENS, this enables us, to read names, addresses, records, and more from other chains, or even off-chain. ## How does it work? @@ -57,7 +57,8 @@ This service can be a server, a serverless function, worker, etc. The URL for this gateway is determined by the `OffchainLookup` error, and is passed as a parameter to the error. ### Template Repositories - + + diff --git a/content/resolvers/quickstart.mdx b/content/resolvers/quickstart.mdx index 1984e7f1..67f01950 100644 --- a/content/resolvers/quickstart.mdx +++ b/content/resolvers/quickstart.mdx @@ -39,4 +39,8 @@ interface ExtendedResolver { Don't forget to add `0x9061b923` to your [EIP-165](https://eips.ethereum.org/) `supportsInterface()` implementation. - \ No newline at end of file + + +## Offchain Resolution + +When you write your own resolver you are able to leverage the power of CCIP Read. More about writing a ccip-enabled resolver [here](/resolvers/ccip) diff --git a/docs/app/globals.css b/docs/app/globals.css index ee1fe03c..f774f46e 100644 --- a/docs/app/globals.css +++ b/docs/app/globals.css @@ -48,12 +48,13 @@ @font-face { font-family: 'Inter'; font-display: swap; - src: url('/fonts/sans-serif/inter/Inter-VariableFont_slnt,wght.ttf') format('truetype'); + src: url('/fonts/sans-serif/inter/Inter-VariableFont_slnt,wght.ttf') + format('truetype'); } @media (min-width: 768px) { :root { - font-size: 18px; + font-size: 16px; } } @@ -65,6 +66,13 @@ @apply overflow-hidden rounded-lg bg-ens-light-grey-surface dark:bg-ens-dark-grey-surface shadow-sm dark:shadow-md ring-1 ring-black/10 dark:ring-white/10; } +.card1 { + @apply rounded-lg bg-ens-light-background-primary dark:bg-ens-dark-background-primary border border-ens-light-border dark:border-ens-dark-border; +} +.card2 { + @apply rounded-lg bg-ens-light-background-secondary dark:bg-ens-dark-background-secondary border border-ens-light-border dark:border-ens-dark-border; +} + .card:not(.no-margin) { @apply my-6; } @@ -74,6 +82,10 @@ /* width: 720px; */ } +.prose > * { + margin-left: 0; +} + .prose > p + p { /* @apply !mt-0 mb-0; */ } diff --git a/docs/src/content/extras/index.ts b/docs/src/content/extras/index.ts index fdfcd48a..56f26b37 100644 --- a/docs/src/content/extras/index.ts +++ b/docs/src/content/extras/index.ts @@ -1,6 +1,7 @@ import { ChainDeployments } from './deployments/deployment'; import { DNSUsageExamples } from './dns/DNSUsageExamples'; import { QuickBannerLink } from './home/QuickLink'; +import { TLDList } from './tld-list/TLDList'; import { Usertag } from './usertag/Usertag'; export const extras = { @@ -8,4 +9,5 @@ export const extras = { QuickBannerLink, Usertag, ChainDeployments, + TLDList, }; diff --git a/docs/src/content/extras/tld-list/TLDList.tsx b/docs/src/content/extras/tld-list/TLDList.tsx new file mode 100644 index 00000000..1976741f --- /dev/null +++ b/docs/src/content/extras/tld-list/TLDList.tsx @@ -0,0 +1,132 @@ +import { createPublicClient, http, MulticallReturnType, namehash } from 'viem'; +import { mainnet } from 'viem/chains'; + +import { TLDs } from '@/lib/tld-list'; + +const ADDRESS_MAP = { + '0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85': ( + ETH Registrar + ), + '0x58774Bb8acD458A640aF0B88238369A167546ef2': ( + DNS Registrar + ), + '0x828D6e836e586B53f1da3403FEda923AEd431019': + '(Custom) Protocol.ART Registrar', + '0x0b9BB06Ebf35A755998B60353546ae8A055554d2': '(Custom) Box Registrar', + '0x04ebA57401184A97C919b0B6b4e8dDE263BCb920': '(Custom) HipHop Registrar', + '0x1eb4b8506fca65e6B229E346dfBfd349956A66e3': '(Custom) Club Registrar', + '0x56ca9514363F68d622931dce1566070f86Ce5550': '(Custom) Kred Registrar', + '0xA86ba3b6d83139a49B649C05DBb69E0726DB69cf': '(Custom) Luxe Registrar', +}; + +const classifyOwner = (owner_address: string) => { + if (!owner_address) return 1; + + if (owner_address === '0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85') + return 10; + + if (owner_address === '0x58774Bb8acD458A640aF0B88238369A167546ef2') + return 3; + + if (ADDRESS_MAP[owner_address]) return 5; + + if (owner_address === '0x0000000000000000000000000000000000000000') + return 0; + + return 4; +}; + +const computeTLD = (owner_address: string) => { + if (!owner_address) return; + + if (ADDRESS_MAP[owner_address]) return ADDRESS_MAP[owner_address]; + + if (owner_address === '0x0000000000000000000000000000000000000000') + return ( + Unsupported TLD + ); + + return owner_address; +}; + +export const TLDList = async () => { + const client = createPublicClient({ + chain: mainnet, + transport: http( + process.env.RPC_URL ?? 'https://cloudflare-eth.com/rpc' + ), + }); + + const contract = { + address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e', + abi: [ + { + name: 'owner', + type: 'function', + stateMutability: 'view', + inputs: [{ name: 'node', type: 'bytes32' }], + outputs: [{ name: 'owner', type: 'address' }], + }, + ], + } as const; + + const chunks: string[][] = []; + + for (let index = 0; index < TLDs.length; index += 100) { + chunks.push(TLDs.slice(index, index + 100)); + } + + const results: [string[], MulticallReturnType][] = []; + + for (const chunk of chunks) { + const result = await client.multicall({ + contracts: chunk.map((tld) => ({ + ...contract, + args: [namehash(tld)], + functionName: 'owner', + })), + }); + + results.push([chunk, result]); + } + + return ( +
+ + + + + + + + + + {results + .flatMap(([chunks, result]) => { + return chunks.map((chunk, index) => { + return { + result: result[index].result, + owner_index: classifyOwner( + result[index].result as string + ), + domain: chunk, + }; + }); + }) + .sort((a, b) => { + return b.owner_index - a.owner_index; + }) + .map((v) => { + return ( + + + + + + ); + })} + +
TLDControllerNotes
.{v.domain}{computeTLD(v.result as string)}
+
+ ); +}; diff --git a/docs/src/layout/PageLayout.tsx b/docs/src/layout/PageLayout.tsx index ac40619d..19547daa 100644 --- a/docs/src/layout/PageLayout.tsx +++ b/docs/src/layout/PageLayout.tsx @@ -34,7 +34,7 @@ export const Layout: FC<{
-
+