├── app ├── .nvmrc ├── public │ ├── google9139414e5bf9791f.html │ ├── shrug.png │ ├── favicon.ico │ ├── nick.eth.png │ ├── icons │ │ ├── tally.ico │ │ ├── snapshot.png │ │ ├── legacy │ │ │ ├── logos │ │ │ │ ├── family.png │ │ │ │ ├── web3j.png │ │ │ │ ├── kethereum.png │ │ │ │ ├── connectkit.png │ │ │ │ ├── react.svg │ │ │ │ ├── ruby.svg │ │ │ │ ├── javascript.svg │ │ │ │ ├── python.svg │ │ │ │ ├── verified.svg │ │ │ │ ├── ethers.svg │ │ │ │ ├── wagmi.svg │ │ │ │ ├── node.svg │ │ │ │ ├── php.svg │ │ │ │ ├── typescript.svg │ │ │ │ ├── go.svg │ │ │ │ └── kotlin.svg │ │ │ ├── mark_dao.svg │ │ │ └── mark.svg │ │ ├── libraries │ │ │ ├── javascript.png │ │ │ ├── typescript.png │ │ │ ├── react.svg │ │ │ ├── ethers.svg │ │ │ ├── wagmi.svg │ │ │ └── family.svg │ │ ├── stackblitz.svg │ │ └── multicoin │ │ │ └── ethereum.svg │ ├── opengraph.png │ ├── robots.txt │ ├── ens │ │ ├── dao │ │ │ ├── token.png │ │ │ ├── ens_logo_dao.png │ │ │ ├── ens_mark_dao.png │ │ │ ├── token.svg │ │ │ └── ens_mark_dao.svg │ │ ├── dark │ │ │ ├── ens_logo_dark.png │ │ │ ├── ens_mark_dark.png │ │ │ └── ens_mark_dark.svg │ │ ├── light │ │ │ ├── ens_logo_light.png │ │ │ ├── ens_mark_light.png │ │ │ └── ens_mark_light.svg │ │ ├── primary │ │ │ ├── ens_logo_primary.png │ │ │ ├── ens_mark_primary.png │ │ │ └── ens_mark_primary.svg │ │ └── ecosystem │ │ │ ├── ens_logo_ecosystem.png │ │ │ ├── ens_mark_ecosystem.png │ │ │ └── ens_mark_ecosystem.svg │ ├── Inter-SemiBold.ttf │ ├── content │ │ ├── home │ │ │ ├── grid_link_1.png │ │ │ ├── grid_link_2.png │ │ │ ├── grid_link_3.png │ │ │ └── grid_link_4.png │ │ ├── learn │ │ │ ├── ccip-read │ │ │ │ └── 1.png │ │ │ ├── dnssec │ │ │ │ ├── dnssec_1.png │ │ │ │ ├── dnssec_2.png │ │ │ │ ├── coinbase-wallet-logo.svg │ │ │ │ └── argent-logo.svg │ │ │ └── immunefi.svg │ │ ├── resolution │ │ │ └── flow1.png │ │ ├── dao │ │ │ ├── proposals │ │ │ │ ├── 1.9-1.png │ │ │ │ ├── 2.2.1-1.png │ │ │ │ ├── 2.2.1-2.png │ │ │ │ ├── 2.2.1-3.png │ │ │ │ ├── 2.2.1-4.png │ │ │ │ ├── 2.2.1-5.png │ │ │ │ ├── 2.2.2-1.png │ │ │ │ ├── 2.2.2-2.png │ │ │ │ ├── 2.2.2-3.png │ │ │ │ ├── 2.2.2-4.png │ │ │ │ ├── 2.2.2-5.png │ │ │ │ ├── 2.2.2-6.png │ │ │ │ ├── 2.2.3-1.png │ │ │ │ ├── 2.2.3-2.png │ │ │ │ ├── 2.2.3-3.png │ │ │ │ ├── 2.2.3-4.jpeg │ │ │ │ ├── 2.2.3-4.png │ │ │ │ ├── 2.2.3-5.png │ │ │ │ ├── 2.2.3-6.png │ │ │ │ └── 2.2.3-7.png │ │ │ └── governance │ │ │ │ ├── social-proposal-template.md │ │ │ │ ├── constitutional-amendment-template.md │ │ │ │ ├── rfp-template.md │ │ │ │ └── executable-proposal-template.md │ │ ├── videos │ │ │ └── ethdenver24.webp │ │ ├── web │ │ │ └── reverse │ │ │ │ └── example1.png │ │ └── namewrapper │ │ │ ├── namewrapper-state-diagram.png │ │ │ ├── namewrapper-expiry-subnames.jpg │ │ │ ├── namewrapper-overview-wrapped.jpg │ │ │ └── namewrapper-overview-subnames.jpg │ ├── fonts │ │ └── sans-serif │ │ │ ├── Satoshi-Bold.otf │ │ │ ├── Satoshi-Medium.otf │ │ │ ├── Satoshi-Variable.ttf │ │ │ └── inter │ │ │ ├── static │ │ │ ├── Inter-Black.ttf │ │ │ ├── Inter-Bold.ttf │ │ │ ├── Inter-Light.ttf │ │ │ ├── Inter-Thin.ttf │ │ │ ├── Inter-Medium.ttf │ │ │ ├── Inter-Regular.ttf │ │ │ ├── Inter-ExtraBold.ttf │ │ │ ├── Inter-ExtraLight.ttf │ │ │ └── Inter-SemiBold.ttf │ │ │ └── Inter-VariableFont_slnt,wght.ttf │ ├── fallback.svg │ └── logo.svg ├── scripts │ ├── bun.lockb │ ├── package.json │ └── tsconfig.json ├── .prettierrc ├── src │ ├── lib │ │ ├── cx.ts │ │ ├── remToPx.ts │ │ ├── mobile.ts │ │ ├── useEvent.ts │ │ ├── metadata.ts │ │ └── pages.ts │ ├── layout │ │ ├── readme.md │ │ ├── sidebar │ │ │ ├── _legacy │ │ │ │ ├── useInitialValue.tsx │ │ │ │ └── VisibleSelectionHighlight.tsx │ │ │ └── Sidebar.tsx │ │ ├── RouteCheck.tsx │ │ ├── header │ │ │ └── search │ │ │ │ ├── types │ │ │ │ └── result.ts │ │ │ │ └── lib │ │ │ │ └── fetcher.ts │ │ ├── footer │ │ │ └── contribute │ │ │ │ └── ContributeLink.tsx │ │ └── details │ │ │ └── variations │ │ │ ├── GitCommitLink.tsx │ │ │ └── ENSIPDetails.tsx │ ├── components │ │ ├── mdx │ │ │ ├── Row.tsx │ │ │ ├── Properties.tsx │ │ │ ├── Col.tsx │ │ │ ├── heading │ │ │ │ ├── h2.tsx │ │ │ │ ├── Eyebrow.tsx │ │ │ │ └── Anchor.tsx │ │ │ ├── Prose.tsx │ │ │ ├── Note.tsx │ │ │ ├── Property.tsx │ │ │ └── EmbedLink.tsx │ │ ├── icons │ │ │ ├── MoonIcon.tsx │ │ │ ├── XIcon.tsx │ │ │ ├── MenuIcon.tsx │ │ │ ├── BoltIcon.tsx │ │ │ ├── SunIcon.tsx │ │ │ ├── ShirtIcon.tsx │ │ │ ├── LinkIcon.tsx │ │ │ ├── MagnifyingGlassIcon.tsx │ │ │ ├── InfoIcon.tsx │ │ │ ├── CheckIcon.tsx │ │ │ ├── BookIcon.tsx │ │ │ ├── PaperAirplaneIcon.tsx │ │ │ ├── PaperClipIcon.tsx │ │ │ ├── DocumentIcon.tsx │ │ │ ├── FaceSmileIcon.tsx │ │ │ ├── ListIcon.tsx │ │ │ ├── PackageIcon.tsx │ │ │ ├── CopyIcon.tsx │ │ │ ├── ChevronRightLeftIcon.tsx │ │ │ ├── CartIcon.tsx │ │ │ ├── BellIcon.tsx │ │ │ ├── EnvelopeIcon.tsx │ │ │ ├── ChatBubbleIcon.tsx │ │ │ ├── ShapesIcon.tsx │ │ │ ├── SquaresPlusIcon.tsx │ │ │ ├── MapPinIcon.tsx │ │ │ ├── CalendarIcon.tsx │ │ │ ├── FolderIcon.tsx │ │ │ ├── UserIcon.tsx │ │ │ ├── UsersIcon.tsx │ │ │ ├── TagIcon.tsx │ │ │ ├── ClipboardIcon.tsx │ │ │ └── CogIcon.tsx │ │ ├── Timestamp.tsx │ │ ├── TruncatedAddress.tsx │ │ ├── SmallCopy.tsx │ │ ├── wip │ │ │ └── WIP.tsx │ │ ├── ModeToggle.tsx │ │ ├── GridPattern.tsx │ │ └── Tag.tsx │ ├── ClientOnly.tsx │ └── utils │ │ └── contributorHelper.ts ├── local │ ├── content │ │ ├── demos │ │ │ ├── index.ts │ │ │ ├── namelookup │ │ │ │ └── logic │ │ │ │ │ ├── fetch.ts │ │ │ │ │ ├── profile.ts │ │ │ │ │ └── useProfile.ts │ │ │ ├── ethregistry │ │ │ │ ├── inputs │ │ │ │ │ ├── ResolverField.tsx │ │ │ │ │ ├── LabelField.tsx │ │ │ │ │ ├── GenerateSecret.tsx │ │ │ │ │ ├── OwnerField.tsx │ │ │ │ │ └── DurationField.tsx │ │ │ │ └── hooks │ │ │ │ │ ├── isAvailable.ts │ │ │ │ │ ├── useRentPrice.ts │ │ │ │ │ └── useCommitment.ts │ │ │ ├── border │ │ │ │ └── Border.tsx │ │ │ └── call │ │ │ │ └── EthCall.tsx │ │ ├── extras │ │ │ ├── icons │ │ │ │ └── NotIcon.tsx │ │ │ ├── deployments │ │ │ │ └── copy.tsx │ │ │ ├── index.ts │ │ │ ├── usertag │ │ │ │ └── Usertag.tsx │ │ │ ├── home │ │ │ │ └── QuickLink.tsx │ │ │ ├── linkcard │ │ │ │ └── LinkCard.tsx │ │ │ └── tld-list │ │ │ │ └── DNSGrid.tsx │ │ ├── prose │ │ │ ├── mermaid.tsx │ │ │ ├── repository │ │ │ │ ├── github │ │ │ │ │ └── fetch.ts │ │ │ │ └── Repository.tsx │ │ │ ├── code │ │ │ │ ├── types │ │ │ │ │ └── language.ts │ │ │ │ ├── Code.tsx │ │ │ │ └── group │ │ │ │ │ └── CodeGroupHeader.tsx │ │ │ ├── link │ │ │ │ └── ALink.tsx │ │ │ ├── index.ts │ │ │ └── profile │ │ │ │ └── ProfileAvatar.tsx │ │ └── index.ts │ ├── config │ │ └── navigation.ts │ └── data │ │ └── blockchain_explorers.ts ├── jsconfig.json ├── .gitignore ├── next-env.d.ts ├── postcss.config.js ├── mdx-components.tsx ├── data │ ├── get_pages.ts │ └── get_page.tsx ├── mdx │ └── remark.mjs ├── .eslintrc.json ├── next.config.mjs ├── tsconfig.json └── app │ ├── not-found.tsx │ ├── page.tsx │ ├── content-metadata.json │ └── route.ts │ ├── sitemap.ts │ └── theme.tsx ├── .github ├── PULL_REQUEST_TEMPLATE │ ├── code_update.md │ ├── documentation_update.md │ └── ensip_proposal.md ├── readme.png ├── CODEOWNERS ├── development.md ├── actions │ └── install │ │ └── action.yml └── workflows │ ├── ci.yml │ └── deploy.yml ├── tsconfig.json ├── docs ├── web │ ├── namehash.mdx │ ├── libraries.mdx │ └── multichain.mdx ├── dao │ ├── proposals │ │ ├── voting.mdx │ │ ├── 1.7.mdx │ │ ├── 2.2.1.mdx │ │ └── 4.3.mdx │ └── token.mdx ├── registry │ ├── test.mdx │ └── writing.mdx ├── disappeared.mdx ├── dns │ └── tlds.mdx ├── changelog.mdx ├── bugs.mdx ├── ensip │ └── index.mdx ├── resolvers │ ├── interfaces.mdx │ ├── writing.mdx │ ├── quickstart.mdx │ └── public.mdx └── learn │ ├── deployments.mdx │ └── dns.mdx └── README.md /app/.nvmrc: -------------------------------------------------------------------------------- 1 | v19 2 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/code_update.md: -------------------------------------------------------------------------------- 1 | > This PR alters code / functionality 2 | -------------------------------------------------------------------------------- /.github/readme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/.github/readme.png -------------------------------------------------------------------------------- /app/public/google9139414e5bf9791f.html: -------------------------------------------------------------------------------- 1 | google-site-verification: google9139414e5bf9791f.html -------------------------------------------------------------------------------- /app/public/shrug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/shrug.png -------------------------------------------------------------------------------- /app/scripts/bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/scripts/bun.lockb -------------------------------------------------------------------------------- /app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/favicon.ico -------------------------------------------------------------------------------- /app/public/nick.eth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/nick.eth.png -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/documentation_update.md: -------------------------------------------------------------------------------- 1 | > This PR alters content of the Documentation 2 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE/ensip_proposal.md: -------------------------------------------------------------------------------- 1 | > This PR has to do with ENSIP / Proposes an ENSIP 2 | -------------------------------------------------------------------------------- /app/public/icons/tally.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/icons/tally.ico -------------------------------------------------------------------------------- /app/public/opengraph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/opengraph.png -------------------------------------------------------------------------------- /app/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | Sitemap: https://docs.ens.domains/sitemap.xml 4 | -------------------------------------------------------------------------------- /app/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 4, 3 | "useTabs": false, 4 | "singleQuote": true 5 | } 6 | -------------------------------------------------------------------------------- /app/public/ens/dao/token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/ens/dao/token.png -------------------------------------------------------------------------------- /app/public/Inter-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/Inter-SemiBold.ttf -------------------------------------------------------------------------------- /app/public/icons/snapshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/icons/snapshot.png -------------------------------------------------------------------------------- /app/src/lib/cx.ts: -------------------------------------------------------------------------------- 1 | export const cx = (...all) => { 2 | return all.filter((f) => !!f).join(' '); 3 | }; 4 | -------------------------------------------------------------------------------- /app/public/ens/dao/ens_logo_dao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/ens/dao/ens_logo_dao.png -------------------------------------------------------------------------------- /app/public/ens/dao/ens_mark_dao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/ens/dao/ens_mark_dao.png -------------------------------------------------------------------------------- /app/public/ens/dark/ens_logo_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/ens/dark/ens_logo_dark.png -------------------------------------------------------------------------------- /app/public/ens/dark/ens_mark_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/ens/dark/ens_mark_dark.png -------------------------------------------------------------------------------- /app/src/layout/readme.md: -------------------------------------------------------------------------------- 1 | # Layout Folder 2 | 3 | This folder contains all of the components use for general page layout. 4 | -------------------------------------------------------------------------------- /app/local/content/demos/index.ts: -------------------------------------------------------------------------------- 1 | import { LiveDemo } from './LiveDemo'; 2 | 3 | export const demos = { 4 | LiveDemo, 5 | }; 6 | -------------------------------------------------------------------------------- /app/public/content/home/grid_link_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/home/grid_link_1.png -------------------------------------------------------------------------------- /app/public/content/home/grid_link_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/home/grid_link_2.png -------------------------------------------------------------------------------- /app/public/content/home/grid_link_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/home/grid_link_3.png -------------------------------------------------------------------------------- /app/public/content/home/grid_link_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/home/grid_link_4.png -------------------------------------------------------------------------------- /app/public/content/learn/ccip-read/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/learn/ccip-read/1.png -------------------------------------------------------------------------------- /app/public/content/resolution/flow1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/resolution/flow1.png -------------------------------------------------------------------------------- /app/public/ens/light/ens_logo_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/ens/light/ens_logo_light.png -------------------------------------------------------------------------------- /app/public/ens/light/ens_mark_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/ens/light/ens_mark_light.png -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/family.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/icons/legacy/logos/family.png -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/web3j.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/icons/legacy/logos/web3j.png -------------------------------------------------------------------------------- /app/public/icons/libraries/javascript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/icons/libraries/javascript.png -------------------------------------------------------------------------------- /app/public/icons/libraries/typescript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/icons/libraries/typescript.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/1.9-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/1.9-1.png -------------------------------------------------------------------------------- /app/public/content/videos/ethdenver24.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/videos/ethdenver24.webp -------------------------------------------------------------------------------- /app/public/content/web/reverse/example1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/web/reverse/example1.png -------------------------------------------------------------------------------- /app/public/ens/primary/ens_logo_primary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/ens/primary/ens_logo_primary.png -------------------------------------------------------------------------------- /app/public/ens/primary/ens_mark_primary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/ens/primary/ens_mark_primary.png -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/kethereum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/icons/legacy/logos/kethereum.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.1-1.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.1-2.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.1-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.1-3.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.1-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.1-4.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.1-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.1-5.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.2-1.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.2-2.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.2-3.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.2-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.2-4.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.2-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.2-5.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.2-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.2-6.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.3-1.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.3-2.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.3-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.3-3.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.3-4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.3-4.jpeg -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.3-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.3-4.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.3-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.3-5.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.3-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.3-6.png -------------------------------------------------------------------------------- /app/public/content/dao/proposals/2.2.3-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/dao/proposals/2.2.3-7.png -------------------------------------------------------------------------------- /app/public/content/learn/dnssec/dnssec_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/learn/dnssec/dnssec_1.png -------------------------------------------------------------------------------- /app/public/content/learn/dnssec/dnssec_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/learn/dnssec/dnssec_2.png -------------------------------------------------------------------------------- /app/public/fonts/sans-serif/Satoshi-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/fonts/sans-serif/Satoshi-Bold.otf -------------------------------------------------------------------------------- /app/public/fonts/sans-serif/Satoshi-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/fonts/sans-serif/Satoshi-Medium.otf -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/connectkit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/icons/legacy/logos/connectkit.png -------------------------------------------------------------------------------- /app/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "@/*": ["src/*"] 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /app/public/ens/ecosystem/ens_logo_ecosystem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/ens/ecosystem/ens_logo_ecosystem.png -------------------------------------------------------------------------------- /app/public/ens/ecosystem/ens_mark_ecosystem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/ens/ecosystem/ens_mark_ecosystem.png -------------------------------------------------------------------------------- /app/public/fonts/sans-serif/Satoshi-Variable.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/fonts/sans-serif/Satoshi-Variable.ttf -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | docs/ @lucemans @gskril 2 | .github/ @lucemans 3 | app/ @lucemans @svemat01 4 | 5 | docs/ensip/ @arachnid 6 | docs/ensip/index @lucemans 7 | -------------------------------------------------------------------------------- /app/public/fonts/sans-serif/inter/static/Inter-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/fonts/sans-serif/inter/static/Inter-Black.ttf -------------------------------------------------------------------------------- /app/public/fonts/sans-serif/inter/static/Inter-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/fonts/sans-serif/inter/static/Inter-Bold.ttf -------------------------------------------------------------------------------- /app/public/fonts/sans-serif/inter/static/Inter-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/fonts/sans-serif/inter/static/Inter-Light.ttf -------------------------------------------------------------------------------- /app/public/fonts/sans-serif/inter/static/Inter-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/fonts/sans-serif/inter/static/Inter-Thin.ttf -------------------------------------------------------------------------------- /app/public/fonts/sans-serif/inter/static/Inter-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/fonts/sans-serif/inter/static/Inter-Medium.ttf -------------------------------------------------------------------------------- /app/public/fonts/sans-serif/inter/static/Inter-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/fonts/sans-serif/inter/static/Inter-Regular.ttf -------------------------------------------------------------------------------- /app/public/content/namewrapper/namewrapper-state-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/namewrapper/namewrapper-state-diagram.png -------------------------------------------------------------------------------- /app/public/fonts/sans-serif/inter/static/Inter-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/fonts/sans-serif/inter/static/Inter-ExtraBold.ttf -------------------------------------------------------------------------------- /app/public/fonts/sans-serif/inter/static/Inter-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/fonts/sans-serif/inter/static/Inter-ExtraLight.ttf -------------------------------------------------------------------------------- /app/public/fonts/sans-serif/inter/static/Inter-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/fonts/sans-serif/inter/static/Inter-SemiBold.ttf -------------------------------------------------------------------------------- /app/public/content/namewrapper/namewrapper-expiry-subnames.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/namewrapper/namewrapper-expiry-subnames.jpg -------------------------------------------------------------------------------- /app/public/content/namewrapper/namewrapper-overview-wrapped.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/namewrapper/namewrapper-overview-wrapped.jpg -------------------------------------------------------------------------------- /app/public/content/namewrapper/namewrapper-overview-subnames.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/content/namewrapper/namewrapper-overview-subnames.jpg -------------------------------------------------------------------------------- /app/public/fonts/sans-serif/inter/Inter-VariableFont_slnt,wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sche/ens-docs/master/app/public/fonts/sans-serif/inter/Inter-VariableFont_slnt,wght.ttf -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./app/src/*"], 5 | "#/*": ["./app/local/*"] 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /docs/web/namehash.mdx: -------------------------------------------------------------------------------- 1 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 2 | export const meta = { 3 | description: '', 4 | contributors: [] 5 | }; 6 | 7 | # Namehash 8 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | node_modules 3 | .next/ 4 | out/ 5 | .DS_Store 6 | *.pem 7 | npm-debug.log* 8 | yarn-debug.log* 9 | yarn-error.log* 10 | .pnpm-debug.log* 11 | .env*.local 12 | .env 13 | -------------------------------------------------------------------------------- /app/local/content/extras/icons/NotIcon.tsx: -------------------------------------------------------------------------------- 1 | import { FiBookOpen, FiClock, FiHash } from 'react-icons/fi'; 2 | 3 | export const Icons = { 4 | FiHash, 5 | FiClock, 6 | FiBookOpen, 7 | }; 8 | -------------------------------------------------------------------------------- /app/local/content/prose/mermaid.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { Mermaid as MermaidZ } from 'mdx-mermaid/lib/Mermaid'; 4 | 5 | export const Mermaid = ({ chart }) => { 6 | return ; 7 | }; 8 | -------------------------------------------------------------------------------- /app/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /app/public/icons/stackblitz.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | 'postcss-focus-visible': { 5 | replaceWith: '[data-focus-visible-added]', 6 | }, 7 | autoprefixer: {}, 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /app/src/components/mdx/Row.tsx: -------------------------------------------------------------------------------- 1 | export const Row = ({ children }) => { 2 | return ( 3 |
4 | {children} 5 |
6 | ); 7 | }; 8 | -------------------------------------------------------------------------------- /app/src/layout/sidebar/_legacy/useInitialValue.tsx: -------------------------------------------------------------------------------- 1 | import { useRef } from 'react'; 2 | 3 | export function useInitialValue(value, condition = true) { 4 | const initialValue = useRef(value).current; 5 | 6 | return condition ? initialValue : value; 7 | } 8 | -------------------------------------------------------------------------------- /docs/dao/proposals/voting.mdx: -------------------------------------------------------------------------------- 1 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 2 | export const meta = { 3 | description: '', 4 | emoji: '🧠', 5 | contributors: [ 6 | 'luc.eth' 7 | ] 8 | }; 9 | 10 | # Process of Voting 11 | -------------------------------------------------------------------------------- /app/src/components/icons/MoonIcon.tsx: -------------------------------------------------------------------------------- 1 | export const MoonIcon = (properties) => ( 2 | 5 | ); 6 | -------------------------------------------------------------------------------- /docs/registry/test.mdx: -------------------------------------------------------------------------------- 1 | import { WIP } from '@/components/wip/WIP'; 2 | 3 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 4 | export const meta = { 5 | description: '', 6 | emoji: '🗒️', 7 | contributors: [] 8 | }; 9 | 10 | # Test Registrar 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/components/Timestamp.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | import RelativeTime from '@yaireo/relative-time'; 3 | import { FC } from 'react'; 4 | 5 | const format = new RelativeTime(); 6 | 7 | export const TimeSince: FC<{ date: number }> = ({ date }) => ( 8 | <>{format.from(new Date(date))} 9 | ); 10 | -------------------------------------------------------------------------------- /app/src/lib/remToPx.ts: -------------------------------------------------------------------------------- 1 | export const remToPx = (remValue) => { 2 | const rootFontSize = 3 | typeof window === 'undefined' 4 | ? 16 5 | : Number.parseFloat( 6 | window.getComputedStyle(document.documentElement).fontSize 7 | ); 8 | 9 | return Number.parseFloat(remValue) * rootFontSize; 10 | }; 11 | -------------------------------------------------------------------------------- /app/local/content/prose/repository/github/fetch.ts: -------------------------------------------------------------------------------- 1 | import { GithubRepositoryData } from './type'; 2 | 3 | export const fetchGithubRepositoryData = async ( 4 | name: string 5 | ): Promise => { 6 | const response = await fetch('https://api.github.com/repos/' + name); 7 | 8 | return (await response.json()) as GithubRepositoryData; 9 | }; 10 | -------------------------------------------------------------------------------- /app/src/components/mdx/Properties.tsx: -------------------------------------------------------------------------------- 1 | export const Properties = ({ children }) => { 2 | return ( 3 |
4 |
    5 | {children} 6 |
7 |
8 | ); 9 | }; 10 | -------------------------------------------------------------------------------- /app/src/components/icons/XIcon.tsx: -------------------------------------------------------------------------------- 1 | export const XIcon = (properties) => { 2 | return ( 3 | 12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /docs/disappeared.mdx: -------------------------------------------------------------------------------- 1 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 2 | export const meta = { 3 | description: 'It looks like this page no longer exists.', 4 | title: 'Whoops' 5 | }; 6 | 7 | # Whoops 8 | 9 | It appears this page doesn't exist anymore... 10 | 11 | 404 15 | -------------------------------------------------------------------------------- /app/src/components/icons/MenuIcon.tsx: -------------------------------------------------------------------------------- 1 | export const MenuIcon = (properties) => { 2 | return ( 3 | 12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /app/src/components/mdx/Col.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | 3 | export const Col = ({ children, sticky = false }) => { 4 | return ( 5 |
:first-child]:mt-0 [&>:last-child]:mb-0', 8 | sticky && 'xl:sticky xl:top-24' 9 | )} 10 | > 11 | {children} 12 |
13 | ); 14 | }; 15 | -------------------------------------------------------------------------------- /app/src/components/TruncatedAddress.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { formatAddress } from 'ens-tools'; 4 | import { FC } from 'react'; 5 | 6 | export const TruncatedAddress: FC<{ address?: string }> = ({ address }) => { 7 | try { 8 | return <>{formatAddress(address)}; 9 | } catch (error) { 10 | return <>{'FAILED TO TRUNCATE ADDRESS' + JSON.stringify(error)}; 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /app/src/components/mdx/heading/h2.tsx: -------------------------------------------------------------------------------- 1 | import { Heading } from '.'; 2 | 3 | export const h2 = function H2(properties) { 4 | return ; 5 | }; 6 | 7 | export const h3 = function H2(properties) { 8 | return ; 9 | }; 10 | 11 | export const h4 = function H2(properties) { 12 | return ; 13 | }; 14 | -------------------------------------------------------------------------------- /app/public/content/learn/dnssec/coinbase-wallet-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/components/icons/BoltIcon.tsx: -------------------------------------------------------------------------------- 1 | export const BoltIcon = (properties) => { 2 | return ( 3 | 10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /app/src/components/mdx/Prose.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import { FC } from 'react'; 3 | 4 | export const Prose: FC<{ 5 | as?: 'article'; 6 | className?: string; 7 | children?: any; 8 | }> = ({ className, ...properties }) => { 9 | return ( 10 |
14 | ); 15 | }; 16 | -------------------------------------------------------------------------------- /app/public/icons/libraries/react.svg: -------------------------------------------------------------------------------- 1 | 2 | React Logo 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/react.svg: -------------------------------------------------------------------------------- 1 | 2 | React Logo 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/local/content/prose/code/types/language.ts: -------------------------------------------------------------------------------- 1 | export type LanguageSettings = { 2 | name: string; 3 | icon?: string; 4 | language?: string; 5 | fallback?: LanguageTypes[]; 6 | }; 7 | 8 | export const configureLanguages = ( 9 | preset: Record> 10 | ) => { 11 | return preset as Record>; 12 | }; 13 | -------------------------------------------------------------------------------- /.github/development.md: -------------------------------------------------------------------------------- 1 | # Development Guide 2 | 3 | ## 🏠 Use node version 4 | 5 | Ensure you are on the right version of NodeJS. To see the active version, check [the .nvmrc file](../app/.nvmrc). 6 | 7 | ``` 8 | nvm use 9 | ``` 10 | 11 | ## 🏃 Running the project 12 | 13 | To run the project, run: 14 | 15 | ```sh 16 | pnpm dev 17 | ``` 18 | 19 | ## 🏗️ Building the project 20 | 21 | To build the project, run: 22 | 23 | ```sh 24 | pnpm build 25 | ``` 26 | -------------------------------------------------------------------------------- /app/src/components/icons/SunIcon.tsx: -------------------------------------------------------------------------------- 1 | export const SunIcon = (properties) => ( 2 | 9 | ); 10 | -------------------------------------------------------------------------------- /app/src/components/icons/ShirtIcon.tsx: -------------------------------------------------------------------------------- 1 | export const ShirtIcon = (properties) => { 2 | return ( 3 | 10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /app/mdx-components.tsx: -------------------------------------------------------------------------------- 1 | import type { MDXComponents } from 'mdx/types'; 2 | 3 | import { contentComponents } from '#/content'; 4 | 5 | /** 6 | * This file needs to be named `mdx-components.ts` and needs to stay in this directory. 7 | * Moving it will cause the project to fail to build. Thank you next. 8 | */ 9 | export function useMDXComponents(components: MDXComponents): MDXComponents { 10 | return { 11 | ...contentComponents, 12 | ...components, 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /app/scripts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@ensdomains/docs-internal-scripts", 3 | "module": "index.ts", 4 | "type": "module", 5 | "scripts": { 6 | "build-search": "bun run search-builder.bun.ts" 7 | }, 8 | "devDependencies": { 9 | "@types/bun": "latest", 10 | "@types/html-to-text": "^9.0.4" 11 | }, 12 | "peerDependencies": { 13 | "typescript": "^5.0.0" 14 | }, 15 | "dependencies": { 16 | "html-to-text": "^9.0.5", 17 | "node-html-parser": "^6.1.12" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/data/get_pages.ts: -------------------------------------------------------------------------------- 1 | import { glob } from 'glob'; 2 | import { join } from 'node:path'; 3 | import { cache } from 'react'; 4 | 5 | const contentDirectory = join(process.cwd(), '../docs'); 6 | 7 | const _getAllPageSlugs = async () => { 8 | console.log('🧹 GLOBBING DA FILES'); 9 | 10 | const files = await glob('**/*.mdx', { cwd: contentDirectory }); 11 | 12 | return files.map((file) => file.replace(/(\/index)?\.mdx$/, '')); 13 | }; 14 | 15 | export const getAllPageSlugs = cache(_getAllPageSlugs); 16 | -------------------------------------------------------------------------------- /app/src/ClientOnly.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { FC, ReactNode, useEffect, useState } from 'react'; 4 | 5 | export const ClientOnly: FC<{ child: () => ReactNode }> = ({ child }) => { 6 | const [visible, setVisible] = useState(false); 7 | 8 | useEffect(() => { 9 | if (typeof window !== 'undefined') { 10 | setTimeout(() => { 11 | setVisible(true); 12 | }, 1); 13 | } 14 | }, []); 15 | 16 | return visible ? child() : undefined; 17 | }; 18 | -------------------------------------------------------------------------------- /app/src/components/icons/LinkIcon.tsx: -------------------------------------------------------------------------------- 1 | export const LinkIcon = (properties) => { 2 | return ( 3 | 11 | ); 12 | }; 13 | -------------------------------------------------------------------------------- /app/src/components/SmallCopy.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { FC } from 'react'; 4 | import { FiCopy } from 'react-icons/fi'; 5 | 6 | export const SmallCopy: FC<{ data: string; className?: string }> = ({ 7 | data, 8 | className, 9 | }) => { 10 | return ( 11 | 19 | ); 20 | }; 21 | -------------------------------------------------------------------------------- /app/src/components/icons/MagnifyingGlassIcon.tsx: -------------------------------------------------------------------------------- 1 | export const MagnifyingGlassIcon = (properties) => { 2 | return ( 3 | 12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /app/local/content/prose/repository/Repository.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react'; 2 | 3 | import { GithubRepository } from './github'; 4 | 5 | export type RepositoryType = { 6 | src: string; 7 | name?: string; 8 | description?: string; 9 | type?: 'github'; 10 | }; 11 | 12 | export const Repository: FC = async (properties) => { 13 | const { type = 'github' } = properties; 14 | 15 | if (type !== 'github') return

Unsupported Repository Type

; 16 | 17 | return ; 18 | }; 19 | -------------------------------------------------------------------------------- /app/src/components/icons/InfoIcon.tsx: -------------------------------------------------------------------------------- 1 | export const InfoIcon = (properties) => { 2 | return ( 3 | 14 | ); 15 | }; 16 | -------------------------------------------------------------------------------- /app/local/content/extras/deployments/copy.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { FC } from 'react'; 4 | import { FiClipboard } from 'react-icons/fi'; 5 | 6 | import { Button } from '@/components/Button'; 7 | 8 | export const CopyButton: FC<{ text: string }> = ({ text }) => { 9 | return ( 10 | 19 | ); 20 | }; 21 | -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/ruby.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/scripts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["ESNext"], 4 | "target": "ESNext", 5 | "module": "ESNext", 6 | "moduleDetection": "force", 7 | "jsx": "react-jsx", 8 | "allowJs": true, 9 | 10 | /* Bundler mode */ 11 | "moduleResolution": "bundler", 12 | "allowImportingTsExtensions": true, 13 | "verbatimModuleSyntax": true, 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "skipLibCheck": true, 18 | "strict": true, 19 | "noFallthroughCasesInSwitch": true, 20 | "forceConsistentCasingInFileNames": true 21 | }, 22 | } 23 | -------------------------------------------------------------------------------- /app/public/icons/multicoin/ethereum.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/components/icons/CheckIcon.tsx: -------------------------------------------------------------------------------- 1 | export const CheckIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /app/src/components/icons/BookIcon.tsx: -------------------------------------------------------------------------------- 1 | export const BookIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /app/src/components/icons/PaperAirplaneIcon.tsx: -------------------------------------------------------------------------------- 1 | export const PaperAirplaneIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /app/src/components/icons/PaperClipIcon.tsx: -------------------------------------------------------------------------------- 1 | export const PaperClipIcon = (properties) => { 2 | return ( 3 | 11 | ); 12 | }; 13 | -------------------------------------------------------------------------------- /app/local/content/index.ts: -------------------------------------------------------------------------------- 1 | import { MDXComponents } from 'mdx/types'; 2 | 3 | import { demos } from './demos'; 4 | import { extras } from './extras'; 5 | import { prose } from './prose'; 6 | 7 | /** 8 | * Content Components 9 | * This includes examples, demos, and other content that is not suitable for markdown. 10 | * Names are transient and must match the name in the mdx file. 11 | */ 12 | export const contentComponents = { 13 | // Links, Buttons, Images 14 | ...prose, 15 | // Interactive Demos 16 | ...demos, 17 | // Other Content 18 | ...extras, 19 | } as any as Record; 20 | -------------------------------------------------------------------------------- /app/src/components/icons/DocumentIcon.tsx: -------------------------------------------------------------------------------- 1 | export const DocumentIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /app/src/layout/RouteCheck.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { FC, useEffect } from 'react'; 4 | 5 | export const RouteCheck: FC<{ slug: string }> = ({ slug }) => { 6 | useEffect(() => { 7 | if (typeof window !== 'undefined') { 8 | const path = window.location.pathname; 9 | 10 | if (path !== slug) { 11 | console.log('Navigating in favor to ' + slug + ' from ' + path); 12 | window.location.pathname = slug; 13 | } 14 | } 15 | }, []); 16 | 17 | return <>; 18 | }; 19 | 20 | export const redirectToIndex = () => ; 21 | -------------------------------------------------------------------------------- /app/src/components/mdx/heading/Eyebrow.tsx: -------------------------------------------------------------------------------- 1 | import { Tag } from '@/components/Tag'; 2 | 3 | export const Eyebrow = ({ tag, label }) => { 4 | if (!tag && !label) { 5 | return; 6 | } 7 | 8 | return ( 9 |
10 | {tag && {tag}} 11 | {tag && label && ( 12 | 13 | )} 14 | {label && ( 15 | {label} 16 | )} 17 |
18 | ); 19 | }; 20 | -------------------------------------------------------------------------------- /app/src/layout/sidebar/Sidebar.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { motion } from 'framer-motion'; 4 | import { usePathname } from 'next/navigation'; 5 | 6 | import { Navigation } from './_legacy/sidenav'; 7 | 8 | export const Sidebar = () => { 9 | const pathname = usePathname(); 10 | 11 | if (pathname === '/') return; 12 | 13 | return ( 14 | 18 | 19 | 20 | ); 21 | }; 22 | -------------------------------------------------------------------------------- /app/mdx/remark.mjs: -------------------------------------------------------------------------------- 1 | import { mdxAnnotations } from 'mdx-annotations'; 2 | // import mdxmermaid from 'mdx-mermaid'; 3 | import gfm from 'remark-gfm'; 4 | 5 | export const remarkPlugins = [ 6 | /** 7 | * Add support for annotations to MDX. 8 | * An annotation is a JavaScript object associated with an MDX node. The object properties are passed to the resulting JSX element as props. 9 | * @see https://www.npmjs.com/package/mdx-annotations 10 | */ 11 | mdxAnnotations.remark, 12 | /** 13 | * Add support for GitHub Flavored Markdown. 14 | */ 15 | gfm, 16 | // [mdxmermaid, { output: 'svg' }], 17 | ]; 18 | -------------------------------------------------------------------------------- /app/local/content/demos/namelookup/logic/fetch.ts: -------------------------------------------------------------------------------- 1 | import { ENStateProfile } from './profile'; 2 | 3 | const ENSTATE_PUBLIC_INSTANCE = 'https://enstate.rs'; 4 | 5 | export const rawFetchEnstateProfile = async ( 6 | name: string, 7 | instance: string = ENSTATE_PUBLIC_INSTANCE 8 | ): Promise => { 9 | const request = await fetch(instance + '/u/' + name); 10 | 11 | return request.json() as Promise; 12 | }; 13 | 14 | export const swrFetchEnstateProfile = (instance?: string) => { 15 | return async ([_enstate, name]: ['enstate', string]) => 16 | rawFetchEnstateProfile(name, instance); 17 | }; 18 | -------------------------------------------------------------------------------- /app/src/components/icons/FaceSmileIcon.tsx: -------------------------------------------------------------------------------- 1 | export const FaceSmileIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /app/src/components/icons/ListIcon.tsx: -------------------------------------------------------------------------------- 1 | export const ListIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /docs/dns/tlds.mdx: -------------------------------------------------------------------------------- 1 | import { WIP } from "@/components/wip/WIP"; 2 | 3 | {/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 4 | export const meta = { 5 | title: 'Supported TLD List', 6 | description: 'List of all supported DNS TLDs. Any DNS TLD that supports DNSSEC can be used with ENS.', 7 | emoji: '📝', 8 | contributors: ['luc.eth', '0xPenryn'] 9 | }; 10 | 11 | # Supported TLD List 12 | 13 | Alongside 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. 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/components/icons/PackageIcon.tsx: -------------------------------------------------------------------------------- 1 | export const PackageIcon = (properties) => { 2 | return ( 3 | 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /docs/registry/writing.mdx: -------------------------------------------------------------------------------- 1 | import { WIP } from '@/components/wip/WIP'; 2 | 3 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 4 | export const meta = { 5 | description: 'Guide for DNS TLD owners to write a registrar for their TLD', 6 | emoji: '✍️', 7 | contributors: [] 8 | }; 9 | 10 | # Authoring a Registry 11 | 12 | 17 | 18 | 19 | This document contains **highly specialized** content and is only intended for those who are authoring a Registry. 20 | Such as the ETHRegistrar, DNSRegistrar, or a registrar written by a TLD owner. 21 | 22 | -------------------------------------------------------------------------------- /app/src/components/icons/CopyIcon.tsx: -------------------------------------------------------------------------------- 1 | export const CopyIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /app/src/components/icons/ChevronRightLeftIcon.tsx: -------------------------------------------------------------------------------- 1 | export const ChevronRightLeftIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /.github/actions/install/action.yml: -------------------------------------------------------------------------------- 1 | name: Install Tools & Dependencies 2 | description: Installs pnpm, Node.js & package dependencies 3 | 4 | runs: 5 | using: composite 6 | steps: 7 | - name: Setup PNPM 8 | uses: pnpm/action-setup@v4 9 | with: 10 | run_install: false 11 | standalone: true 12 | package_json_file: app/package.json 13 | version: 9 14 | 15 | - name: Setup Node 16 | uses: actions/setup-node@v4 17 | with: 18 | node-version: 19 19 | cache: pnpm 20 | cache-dependency-path: 'app' 21 | 22 | - name: Install dependencies 23 | run: cd app && pnpm install 24 | shell: bash 25 | -------------------------------------------------------------------------------- /app/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "extends": ["plugin:v3xlabs/recommended", "plugin:tailwindcss/recommended"], 4 | "parser": "@typescript-eslint/parser", 5 | "parserOptions": { 6 | "ecmaVersion": 2021 7 | }, 8 | "ignorePatterns": ["!**/*"], 9 | "plugins": ["v3xlabs", "tailwindcss"], 10 | "env": { 11 | "node": true, 12 | "browser": true 13 | }, 14 | "rules": { 15 | "sonarjs/cognitive-complexity": ["warn", 20], 16 | "tailwindcss/no-custom-classname": "off" 17 | }, 18 | "settings": { 19 | "tailwindcss": { 20 | "config": "./tailwind.config.js" 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/components/icons/CartIcon.tsx: -------------------------------------------------------------------------------- 1 | export const CartIcon = (properties) => { 2 | return ( 3 | 14 | ); 15 | }; 16 | -------------------------------------------------------------------------------- /app/src/components/icons/BellIcon.tsx: -------------------------------------------------------------------------------- 1 | export const BellIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /app/src/components/icons/EnvelopeIcon.tsx: -------------------------------------------------------------------------------- 1 | export const EnvelopeIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/javascript.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/public/content/learn/dnssec/argent-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/local/content/demos/ethregistry/inputs/ResolverField.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react'; 2 | 3 | export const ResolverField: FC<{ 4 | resolver: string; 5 | setResolver: (owner: string) => void; 6 | }> = ({ resolver: owner, setResolver: setOwner }) => { 7 | return ( 8 |
9 |

Resolver (address):

10 |
11 | setOwner(event.target.value)} 14 | className="input" 15 | placeholder="0x225f137127d9067788314bc7fcc1f36746a3c3B5" 16 | /> 17 |
18 |
19 | ); 20 | }; 21 | -------------------------------------------------------------------------------- /app/src/components/icons/ChatBubbleIcon.tsx: -------------------------------------------------------------------------------- 1 | export const ChatBubbleIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /app/public/fallback.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/components/icons/ShapesIcon.tsx: -------------------------------------------------------------------------------- 1 | export const ShapesIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /app/src/layout/header/search/types/result.ts: -------------------------------------------------------------------------------- 1 | export type MatchesPosition = { start: number; length: number }[]; 2 | 3 | export type SearchEntry = { 4 | slug: string; 5 | title: string; 6 | description: string; 7 | emoji: string; 8 | _formatted: { 9 | content: string; 10 | slug: string; 11 | title: string; 12 | description: string; 13 | }; 14 | _matchesPosition: { 15 | content: MatchesPosition; 16 | slug: MatchesPosition; 17 | title: MatchesPosition; 18 | description: MatchesPosition; 19 | }; 20 | }; 21 | 22 | export type SearchResult = { 23 | estimatedTotalHits: number; 24 | hits: SearchEntry[]; 25 | limit: number; 26 | offset: number; 27 | processingTimeMs: number; 28 | }; 29 | -------------------------------------------------------------------------------- /app/src/components/icons/SquaresPlusIcon.tsx: -------------------------------------------------------------------------------- 1 | export const SquaresPlusIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /app/src/components/mdx/Note.tsx: -------------------------------------------------------------------------------- 1 | import { InfoIcon } from '../icons/InfoIcon'; 2 | 3 | export const Note = ({ children }) => { 4 | return ( 5 |
6 | 7 |
8 | {children} 9 |
10 |
11 | ); 12 | }; 13 | -------------------------------------------------------------------------------- /app/public/icons/libraries/ethers.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/components/icons/MapPinIcon.tsx: -------------------------------------------------------------------------------- 1 | export const MapPinIcon = (properties) => { 2 | return ( 3 | 18 | ); 19 | }; 20 | -------------------------------------------------------------------------------- /app/local/content/extras/index.ts: -------------------------------------------------------------------------------- 1 | import { ChainDeployments } from './deployments/deployment'; 2 | import { DNSUsageExamples } from './dns/DNSUsageExamples'; 3 | import { QuickBannerLink } from './home/QuickLink'; 4 | import { Icons } from './icons/NotIcon'; 5 | import { LinkCard } from './linkcard/LinkCard'; 6 | import { SmartContractMap } from './smartcontractmap/SmartContractMap'; 7 | import { DNSGrid } from './tld-list/DNSGrid'; 8 | import { TLDList } from './tld-list/TLDList'; 9 | import { Usertag } from './usertag/Usertag'; 10 | import { VideoGallery } from './videos/VideoGallery'; 11 | 12 | export const extras = { 13 | DNSUsageExamples, 14 | QuickBannerLink, 15 | Usertag, 16 | ChainDeployments, 17 | TLDList, 18 | DNSGrid, 19 | SmartContractMap, 20 | Icons, 21 | LinkCard, 22 | VideoGallery, 23 | }; 24 | -------------------------------------------------------------------------------- /app/local/content/prose/code/Code.tsx: -------------------------------------------------------------------------------- 1 | import { FC, PropsWithChildren } from 'react'; 2 | 3 | import { 4 | CodePanel, 5 | CodePanelProperties, 6 | } from '#/content/prose/code/snippet/CodeSnippet'; 7 | 8 | import { CodeGroup } from './group/CodeGroup'; 9 | 10 | export function Code({ children, ...properties }) { 11 | return ( 12 | 13 | ); 14 | } 15 | 16 | export const Pre: FC> = ({ 17 | children, 18 | // title, 19 | isChild, 20 | ...properties 21 | }) => { 22 | if (isChild) { 23 | return {children}; 24 | } 25 | 26 | return ( 27 | 28 | {children} 29 | 30 | ); 31 | }; 32 | -------------------------------------------------------------------------------- /app/src/components/mdx/Property.tsx: -------------------------------------------------------------------------------- 1 | export const Property = ({ name, type, children }) => { 2 | return ( 3 |
  • 4 |
    5 |
    Name
    6 |
    7 | {name} 8 |
    9 |
    Type
    10 |
    11 | {type} 12 |
    13 |
    Description
    14 |
    15 | {children} 16 |
    17 |
    18 |
  • 19 | ); 20 | }; 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![readme](./.github/readme.png)](https://docs.ens.domains/?ref=github-banner) 2 | 3 | The Ethereum Name Service (ENS) is a distributed, open, and extensible naming system based on the Ethereum blockchain, but available to the entire internet. 4 | 5 | ## 🗒️ Documentation 6 | 7 | The ENS documentation is available at [docs.ens.domains](https://docs.ens.domains/?ref=ens-docs-github). This repository contains the source code for the documentation, as well as the markdown files that make up its contents. 8 | 9 | ## 📖 Contributing 10 | 11 | We welcome contributions to the ENS documentation. If you would like to contribute, please read the [contributing guidelines](./CONTRIBUTING.md). All content is written in mdx, and [markdown files can be found here](./docs). 12 | 13 | ## 📄 License 14 | 15 | Please check the license information from the [LICENSE](./LICENSE) file. 16 | -------------------------------------------------------------------------------- /app/src/components/icons/CalendarIcon.tsx: -------------------------------------------------------------------------------- 1 | export const CalendarIcon = (properties) => { 2 | return ( 3 | 22 | ); 23 | }; 24 | -------------------------------------------------------------------------------- /app/local/content/demos/ethregistry/hooks/isAvailable.ts: -------------------------------------------------------------------------------- 1 | import { mainnet, sepolia } from 'viem/chains'; 2 | import { useChainId, useReadContract } from 'wagmi'; 3 | 4 | import { ETHRegistrarABI } from '../ETHRegistryABI'; 5 | 6 | const deployments = { 7 | [mainnet.id]: '0x253553366Da8546fC250F225fe3d25d0C782303b', 8 | [sepolia.id]: '0xFED6a969AaA60E4961FCD3EBF1A2e8913ac65B72', 9 | }; 10 | 11 | export const useIsAvailable = (name: string) => { 12 | const chainId = useChainId(); 13 | 14 | const { data, isLoading } = useReadContract({ 15 | address: deployments[chainId] as `0x${string}`, 16 | abi: ETHRegistrarABI, 17 | functionName: 'available', 18 | args: [name], 19 | // enabled: !!name && name.length >= 3, 20 | chainId, 21 | }); 22 | 23 | return { 24 | isAvailable: data as boolean, 25 | isLoadingAvailability: isLoading, 26 | }; 27 | }; 28 | -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/python.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/local/content/demos/border/Border.tsx: -------------------------------------------------------------------------------- 1 | import { FC, PropsWithChildren } from 'react'; 2 | 3 | import { BorderConnection } from './BorderConnection'; 4 | 5 | export const DemoBorder: FC< 6 | PropsWithChildren<{ 7 | showConnect: boolean; 8 | title: string; 9 | chains?: Set; 10 | }> 11 | > = ({ children, showConnect, title, chains }) => { 12 | return ( 13 |
    14 |
    15 |
    {title}
    16 |
    {showConnect && }
    17 |
    18 |
    19 | {children} 20 |
    21 |
    22 | ); 23 | }; 24 | -------------------------------------------------------------------------------- /app/src/components/icons/FolderIcon.tsx: -------------------------------------------------------------------------------- 1 | export const FolderIcon = (properties) => { 2 | return ( 3 | 21 | ); 22 | }; 23 | -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/verified.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/public/content/learn/immunefi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/local/content/demos/ethregistry/inputs/LabelField.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react'; 2 | 3 | export const LabelField: FC<{ 4 | label: string; 5 | setLabel: (_label: string) => void; 6 | }> = ({ label, setLabel }) => { 7 | const id = 'label'; // TODO: 8 | 9 | return ( 10 |
    11 | 17 |
    18 | setLabel(event.target.value)} 21 | className="input" 22 | placeholder="test123" 23 | name="label" 24 | /> 25 |
    .eth
    26 |
    27 |
    28 | ); 29 | }; 30 | -------------------------------------------------------------------------------- /app/local/content/demos/ethregistry/hooks/useRentPrice.ts: -------------------------------------------------------------------------------- 1 | import { mainnet, sepolia } from 'viem/chains'; 2 | import { useChainId, useReadContract } from 'wagmi'; 3 | 4 | import { ETHRegistrarABI } from '../ETHRegistryABI'; 5 | 6 | const deployments = { 7 | [mainnet.id]: '0x253553366Da8546fC250F225fe3d25d0C782303b', 8 | [sepolia.id]: '0xFED6a969AaA60E4961FCD3EBF1A2e8913ac65B72', 9 | }; 10 | 11 | export const useRentPrice = (name: string, duration: number) => { 12 | const chainId = useChainId(); 13 | 14 | const { data, isLoading } = useReadContract({ 15 | address: deployments[chainId] as `0x${string}`, 16 | abi: ETHRegistrarABI, 17 | functionName: 'rentPrice', 18 | args: [name, duration], 19 | // enabled: !!name && name.length >= 3 && !!duration && duration > 0, 20 | chainId, 21 | }); 22 | 23 | return { 24 | rentPrice: data as { base: bigint; premium: bigint }, 25 | isLoadingRentPrice: isLoading, 26 | }; 27 | }; 28 | -------------------------------------------------------------------------------- /docs/changelog.mdx: -------------------------------------------------------------------------------- 1 | import { WIP } from "@/components/wip/WIP"; 2 | 3 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 4 | export const meta = { 5 | title: 'Changelog', 6 | description: 'A list of changes and events that happened to the protocol.', 7 | emoji: '📝', 8 | contributors: [ 9 | 'luc.eth' 10 | ] 11 | }; 12 | 13 | # 📝 Changelog 14 | 15 | This page contains a list of changes and events that happened to the ENS protocol & ecosystem. 16 | 17 | ## ENSv2 Announcement 18 | 19 | On March 28th, 2024 the ENS Labs team announced our plans and roadmap for scaling ENS to the entire internet and beyond. 20 | This involves migrating .eth registrations to a brand new system, in addition to improving support for existing L2 solutions. 21 | You can read more [on our blog](https://blog.ens.domains/post/ensv2), [on X](https://twitter.com/ensdomains/status/1795440186513576318), and [the forums](https://discuss.ens.domains/t/technical-feedback-thread-for-ensv2/19233). 22 | 23 | -------------------------------------------------------------------------------- /app/local/content/prose/link/ALink.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import Link, { LinkProps } from 'next/link'; 3 | import React, { FC } from 'react'; 4 | import { FiExternalLink } from 'react-icons/fi'; 5 | 6 | export const ALink: FC< 7 | React.AnchorHTMLAttributes & 8 | LinkProps & { hideExtras: boolean } 9 | > = ({ target, children, hideExtras, ...properties }) => { 10 | const isExternal = properties.href?.toString()?.startsWith('http'); 11 | 12 | target = target ?? isExternal ? '_blank' : undefined; 13 | 14 | const className = hideExtras 15 | ? '' 16 | : clsx('my-0 inline-flex items-center gap-1', properties.className); 17 | 18 | return ( 19 | 24 | {children} 25 | {!hideExtras && isExternal ? : undefined} 26 | 27 | ); 28 | }; 29 | -------------------------------------------------------------------------------- /app/next.config.mjs: -------------------------------------------------------------------------------- 1 | /* eslint-disable sonarjs/no-duplicate-string */ 2 | import nextMDX from '@next/mdx'; 3 | 4 | import { recmaPlugins } from './mdx/recma.mjs'; 5 | import { rehypePlugins } from './mdx/rehype.mjs'; 6 | import { remarkPlugins } from './mdx/remark.mjs'; 7 | 8 | /** @type {import('@next/mdx').NextMDXOptions} */ 9 | const mdxOptions = { 10 | options: { 11 | remarkPlugins, 12 | rehypePlugins, 13 | recmaPlugins, 14 | // providerImportSource: '@mdx-js/react', 15 | }, 16 | }; 17 | 18 | /** @type {import('next').NextConfig} */ 19 | const nextConfig = { 20 | output: 'export', 21 | reactStrictMode: true, 22 | pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'mdx'], 23 | experimental: { 24 | // scrollRestoration: process.env.NODE_ENV === 'production', 25 | // mdxRs: true, 26 | }, 27 | images: { 28 | unoptimized: true, 29 | }, 30 | }; 31 | 32 | const withMDX = nextMDX(mdxOptions); 33 | 34 | export default withMDX(nextConfig); 35 | -------------------------------------------------------------------------------- /app/local/content/demos/namelookup/logic/profile.ts: -------------------------------------------------------------------------------- 1 | export type SuggestedRecords = 2 | | 'url' 3 | | 'mail' 4 | | 'name' 5 | | 'email' 6 | | 'header' 7 | | 'avatar' 8 | | 'location' 9 | | 'timezone' 10 | | 'language' 11 | | 'pronouns' 12 | | 'org.matrix' 13 | | 'io.keybase' 14 | | 'com.twitter' 15 | | 'description' 16 | | 'com.discord' 17 | | 'org.telegram' 18 | | 'com.linkedin' 19 | | 'social.bluesky' 20 | | 'social.mastadon' 21 | | 'network.dm3.profile' 22 | | 'network.dm3.deliveryService'; 23 | 24 | export type RecordType = SuggestedRecords | (string & {}); 25 | 26 | export type ENStateProfile = { 27 | name: string; 28 | address: string; // address 29 | avatar: string; // url 30 | display: string; // ens name 31 | records: Record; 32 | chains: Record; 33 | fresh: number; // timestamp 34 | resolver: string; // address of resolver 35 | errors: Record; 36 | }; 37 | -------------------------------------------------------------------------------- /app/public/icons/libraries/wagmi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/local/content/prose/index.ts: -------------------------------------------------------------------------------- 1 | import { Button } from '@/components/Button'; 2 | import { Col } from '@/components/mdx/Col'; 3 | import { EmbedLink } from '@/components/mdx/EmbedLink'; 4 | import { h2, h3, h4 } from '@/components/mdx/heading/h2'; 5 | import { Note } from '@/components/mdx/Note'; 6 | import { Properties } from '@/components/mdx/Properties'; 7 | import { Property } from '@/components/mdx/Property'; 8 | import { Row } from '@/components/mdx/Row'; 9 | 10 | import { Code, Pre } from './code/Code'; 11 | import { CodeGroup } from './code/group/CodeGroup'; 12 | import { ALink } from './link/ALink'; 13 | import { Repository } from './repository/Repository'; 14 | import { VideoComponent } from './video/Video'; 15 | 16 | export const prose = { 17 | a: ALink, 18 | h2, 19 | h3, 20 | h4, 21 | Note, 22 | Row, 23 | Col, 24 | Properties, 25 | Property, 26 | code: Code, 27 | CodeGroup, 28 | pre: Pre, 29 | button: Button, 30 | Button, 31 | VideoComponent, 32 | EmbedLink, 33 | Repository, 34 | }; 35 | -------------------------------------------------------------------------------- /app/src/layout/footer/contribute/ContributeLink.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { usePathname } from 'next/navigation'; 4 | import { FC } from 'react'; 5 | import { FiGithub } from 'react-icons/fi'; 6 | 7 | const ROOT_REPO = 'ensdomains/docs'; 8 | 9 | export const ContributeLink: FC<{ url?: string }> = ({ url }) => { 10 | if (!url) { 11 | const asPath = usePathname(); 12 | 13 | url = `/pages${asPath}.mdx`; 14 | console.warn( 15 | 'Failed to get url, defaulting back to asPath from useRouter', 16 | url 17 | ); 18 | 19 | return <>; 20 | } 21 | 22 | const branch = 'master'; 23 | 24 | return ( 25 | 31 | 32 | Edit this page on GitHub 33 | 34 | ); 35 | }; 36 | -------------------------------------------------------------------------------- /app/src/lib/mobile.ts: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | import { createContext, useContext } from 'react'; 3 | import { create } from 'zustand'; 4 | 5 | export const IsInsideMobileNavigationContext = createContext(false); 6 | 7 | export const useIsInsideMobileNavigation = () => 8 | useContext(IsInsideMobileNavigationContext); 9 | 10 | export const useMobileNavigationStore = create<{ 11 | isOpen: boolean; 12 | open: () => void; 13 | close: () => void; 14 | toggle: () => void; 15 | 16 | navStack: number[]; 17 | pushNav: (index: number) => void; 18 | popNav: () => void; 19 | setNav: (navStack: number[]) => void; 20 | }>((set) => ({ 21 | isOpen: false, 22 | open: () => set({ isOpen: true }), 23 | close: () => set({ isOpen: false }), 24 | toggle: () => set((state) => ({ isOpen: !state.isOpen })), 25 | 26 | navStack: [], 27 | pushNav: (index) => 28 | set((state) => ({ navStack: [...state.navStack, index] })), 29 | popNav: () => set((state) => ({ navStack: state.navStack.slice(0, -1) })), 30 | setNav: (navStack) => set({ navStack }), 31 | })); 32 | -------------------------------------------------------------------------------- /app/local/content/prose/profile/ProfileAvatar.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import clsx from 'clsx'; 4 | import { FC, useMemo, useState } from 'react'; 5 | 6 | import { generateMeshGradientFromName } from './MeshGradient'; 7 | 8 | export const ProfileAvatar: FC<{ name: string }> = ({ name }) => { 9 | const [failedToLoad, setFailedToLoad] = useState(false); 10 | const mesh = useMemo(() => generateMeshGradientFromName(name), [name]); 11 | 12 | return ( 13 |
    14 |
    15 |
    16 | setFailedToLoad(true)} 24 | /> 25 |
    26 | ); 27 | }; 28 | -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/ethers.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "@/*": ["src/*"], 6 | "#/*": ["local/*"] 7 | }, 8 | "target": "es5", 9 | "lib": ["dom", "dom.iterable", "esnext"], 10 | "downlevelIteration": true, 11 | "allowJs": true, 12 | "skipLibCheck": true, 13 | "strict": false, 14 | "forceConsistentCasingInFileNames": true, 15 | "noEmit": true, 16 | "incremental": true, 17 | "esModuleInterop": true, 18 | "module": "esnext", 19 | "moduleResolution": "node", 20 | "resolveJsonModule": true, 21 | "isolatedModules": true, 22 | "jsx": "preserve", 23 | "plugins": [ 24 | { 25 | "name": "next" 26 | } 27 | ] 28 | }, 29 | "include": [ 30 | "src/next-env.d.ts", 31 | "**/*.ts", 32 | "**/*.tsx", 33 | "src/components/SectionProvider.jsx", 34 | ".next/types/**/*.ts" 35 | ], 36 | "exclude": ["node_modules", "scripts"] 37 | } 38 | -------------------------------------------------------------------------------- /docs/web/libraries.mdx: -------------------------------------------------------------------------------- 1 | import { Libraries, ensLibraries } from '@/components/Libraries'; 2 | import { ConnectKits } from '@/components/ConnectKits'; 3 | 4 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 5 | export const meta = { 6 | description: '', 7 | emoji: '🛠️', 8 | contributors: [ 9 | 'luc.eth', 10 | 'antony1060.eth' 11 | ] 12 | }; 13 | 14 | # Tools & Libraries 15 | 16 | There are many ways you can interface with the Ethereum smart contracts. {{ className: 'lead' }} 17 | 18 | ## Quickstart Kits 19 | 20 | There are a few plug-and-play kits that you can use to jumpstart your project. These kits will include everything you need to have users connect their wallet, have names showing, avatars, and more, right out of the box! 21 | 22 | 23 | 24 | ## Libraries 25 | 26 | There are many ways to interface with the ENS Ethereum smart contracts, indexers, and metadata services. Whether you're building a dApp, a backend service, or interacting with ENS from your smart contract, there's a library out there to help you get started. 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/components/icons/UserIcon.tsx: -------------------------------------------------------------------------------- 1 | export const UserIcon = (properties) => { 2 | return ( 3 | 23 | ); 24 | }; 25 | -------------------------------------------------------------------------------- /app/src/components/icons/UsersIcon.tsx: -------------------------------------------------------------------------------- 1 | export const UsersIcon = (properties) => { 2 | return ( 3 | 27 | ); 28 | }; 29 | -------------------------------------------------------------------------------- /app/src/lib/useEvent.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from 'react'; 2 | 3 | // eslint-disable-next-line no-undef 4 | export const useEvent = ( 5 | event: Event, 6 | // eslint-disable-next-line unused-imports/no-unused-vars, no-undef 7 | handler: (event: GlobalEventHandlersEventMap[Event]) => void 8 | ) => { 9 | const handlerReference = useRef(handler); 10 | 11 | // Update handlerRef.current value if handler changes. 12 | useEffect(() => { 13 | handlerReference.current = handler; 14 | }, [handler]); 15 | 16 | useEffect(() => { 17 | // eslint-disable-next-line no-undef 18 | const stableHandler = (_event: GlobalEventHandlersEventMap[Event]) => 19 | handlerReference.current(_event); 20 | 21 | // Add event listener 22 | document.addEventListener(event, stableHandler); 23 | 24 | return () => { 25 | // Remove event listener on cleanup 26 | document.removeEventListener(event, stableHandler); 27 | }; 28 | }, [event]); // Only re-run the effect if event changes 29 | }; 30 | -------------------------------------------------------------------------------- /app/src/components/icons/TagIcon.tsx: -------------------------------------------------------------------------------- 1 | export const TagIcon = (properties) => { 2 | return ( 3 | 18 | ); 19 | }; 20 | -------------------------------------------------------------------------------- /app/app/not-found.tsx: -------------------------------------------------------------------------------- 1 | import Image from 'next/image'; 2 | 3 | import { Button } from '@/components/Button'; 4 | import { Layout } from '@/layout/PageLayout'; 5 | 6 | export default function NotFound() { 7 | return ( 8 | 17 |
    18 | Shrug 25 |

    Article Not Found

    26 |

    It doesn't look like this page exists...

    27 | 30 |
    31 |
    32 | ); 33 | } 34 | -------------------------------------------------------------------------------- /app/src/layout/details/variations/GitCommitLink.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | // eslint-disable-next-line unicorn/prefer-node-protocol 4 | import crypto from 'crypto'; 5 | import { usePathname } from 'next/navigation'; 6 | import { FC, PropsWithChildren } from 'react'; 7 | 8 | import { cx } from '@/lib/cx'; 9 | 10 | const prefix = 'docs'; 11 | const repo = 'ensdomains/docs'; 12 | 13 | export const GitCommitLink: FC< 14 | PropsWithChildren<{ file: string; hash: string }> 15 | > = ({ file, hash, children }) => { 16 | const file_hash = crypto 17 | .createHash('sha256') 18 | .update(prefix + file) 19 | .digest('hex'); 20 | const pathname = usePathname(); 21 | const isDAO = pathname.startsWith('/dao'); 22 | 23 | return ( 24 | 33 | {children} 34 | 35 | ); 36 | }; 37 | -------------------------------------------------------------------------------- /app/local/content/demos/namelookup/logic/useProfile.ts: -------------------------------------------------------------------------------- 1 | import useSWR from 'swr'; 2 | 3 | import { swrFetchEnstateProfile } from './fetch'; 4 | 5 | export type UseProfileParameters = { 6 | /** 7 | * The name of the profile to fetch. 8 | * @example 'luc.eth' 9 | */ 10 | name: string; 11 | /** 12 | * URL of the enstate instance to use. 13 | * WARNING, the default instance is provided as is, please use it respectfully. 14 | * @default https://enstate.rs 15 | */ 16 | instance?: string; 17 | }; 18 | 19 | // TODO: Naive approach, doesn't support extended character set 20 | const isValidDomain = /^([\da-z-]{1,63}\.)+[\da-z-]{1,63}$/i; 21 | 22 | const isValidAddress = /^0x[\da-f]{40}$/i; 23 | 24 | export const useProfile = ({ name, instance }: UseProfileParameters) => { 25 | const { data, error, isLoading, isValidating, mutate } = useSWR( 26 | isValidDomain.test(name) || isValidAddress.test(name) 27 | ? ['enstate', name] 28 | : undefined, 29 | swrFetchEnstateProfile(instance) 30 | ); 31 | 32 | return { 33 | data, 34 | error, 35 | isLoading, 36 | isValidating, 37 | mutate, 38 | }; 39 | }; 40 | -------------------------------------------------------------------------------- /app/src/utils/contributorHelper.ts: -------------------------------------------------------------------------------- 1 | export const GITHUB_REGEX = /^[\da-z](?:[\da-z]|-(?=[\da-z])){0,38}$/i; 2 | export const ENS_REGEX = /^([\da-z]+(-[\da-z]+)*\.)+[a-z]{2,}$/i; 3 | 4 | export const getUsernameType = ( 5 | username: string 6 | ): 'ens' | 'github' | 'unknown' => { 7 | if (ENS_REGEX.test(username)) { 8 | return 'ens'; 9 | } 10 | 11 | if (GITHUB_REGEX.test(username)) { 12 | return 'github'; 13 | } 14 | 15 | return 'unknown'; 16 | }; 17 | 18 | export const getProfilePicture = (username: string, format: 'webp' | 'jpg') => { 19 | const type = getUsernameType(username); 20 | 21 | if (type === 'ens') { 22 | return `https://avatarservice.xyz/64/${username}.${format}`; 23 | } 24 | 25 | if (type === 'github') { 26 | return `https://github.com/${username}.png?size=64`; 27 | } 28 | }; 29 | 30 | export const getLinkHref = (username: string) => { 31 | const type = getUsernameType(username); 32 | 33 | if (type === 'ens') { 34 | return `https://ens.page/${username}?ref=ens-docs`; 35 | } 36 | 37 | if (type === 'github') { 38 | return `https://github.com/${username}?ref=ens-docs`; 39 | } 40 | 41 | return '#'; 42 | }; 43 | -------------------------------------------------------------------------------- /app/local/config/navigation.ts: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react'; 2 | 3 | import { navigation as protocolNavigation } from './navigation/protocol'; 4 | 5 | export type SectionData = { 6 | name: string; 7 | href: string; 8 | icon: ReactNode; 9 | activePattern?: RegExp; 10 | links: routeGroup[]; 11 | }; 12 | 13 | export const isSectionData = (element: any): element is SectionData => { 14 | return (element as SectionData).name !== undefined; 15 | }; 16 | 17 | export type routeLink = { 18 | title: string; 19 | href: string; 20 | icon?: string; 21 | external?: boolean; 22 | wip?: number | boolean; 23 | design_wip?: boolean; 24 | }; 25 | 26 | export type routeGroup = { 27 | title: string; 28 | icon?: string; 29 | links: routeElement[]; 30 | }; 31 | 32 | export type routeElement = routeGroup | routeLink; 33 | export const isRouteLink = (element: routeElement): element is routeLink => { 34 | return (element as routeLink).href !== undefined; 35 | }; 36 | export const isRouteGroup = (element: routeElement): element is routeGroup => { 37 | return (element as routeGroup).links !== undefined; 38 | }; 39 | 40 | export const navigation = { 41 | protocol: protocolNavigation, 42 | }; 43 | -------------------------------------------------------------------------------- /app/src/components/wip/WIP.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react'; 2 | 3 | export const WIP: FC<{ missing?: string[] }> = ({ missing }) => { 4 | return ( 5 |
    6 |
    7 |

    8 | 🚧 This page is work in progress 🚧 9 |

    10 |

    11 | 🏗️👷This page is still under construction. Check back at a 12 | later date to see more! 13 |

    14 | {missing && ( 15 |
    16 |
    This page is still missing:
    17 |
      18 | {missing.map((m, index) => ( 19 |
    • - {m}
    • 20 | ))} 21 |
    22 |
    23 | )} 24 |
    25 |
    26 | ); 27 | }; 28 | -------------------------------------------------------------------------------- /app/local/content/extras/usertag/Usertag.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react'; 2 | 3 | export type UsertagVariant = 'full' | 'small'; 4 | 5 | export const Usertag: FC<{ 6 | name?: string; 7 | image?: string; 8 | variant?: UsertagVariant; 9 | }> = ({ name = 'nick.eth', image = '/nick.eth.png', variant = 'full' }) => { 10 | return ( 11 |
    12 |
    13 | {variant == 'full' && ( 14 |
    15 | 20 |
    21 | )} 22 |
    23 | {name} 24 |
    25 |
    26 |
    27 | ); 28 | }; 29 | -------------------------------------------------------------------------------- /app/local/content/demos/ethregistry/inputs/GenerateSecret.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react'; 2 | import { FiRefreshCcw } from 'react-icons/fi'; 3 | 4 | import { Button } from '@/components/Button'; 5 | 6 | export const GenerateSecret: FC<{ 7 | secret: string; 8 | setSecret: (secret: string) => void; 9 | }> = ({ secret, setSecret }) => { 10 | return ( 11 |
    12 |

    Secret (random bytes32):

    13 |
    14 | setSecret(event.target.value)} 17 | className="input" 18 | placeholder="0x0000000000000000000000000000000000000000000000000000000000000000" 19 | /> 20 | 30 |
    31 |
    32 | ); 33 | }; 34 | -------------------------------------------------------------------------------- /app/public/icons/libraries/family.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/local/content/demos/ethregistry/inputs/OwnerField.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react'; 2 | import { useAccount } from 'wagmi'; 3 | 4 | import { Button } from '@/components/Button'; 5 | 6 | export const OwnerField: FC<{ 7 | owner: string; 8 | setOwner: (_owner: string) => void; 9 | }> = ({ owner, setOwner }) => { 10 | const { address } = useAccount(); 11 | 12 | return ( 13 |
    14 | 17 |
    18 | setOwner(event.target.value)} 21 | className="input" 22 | placeholder="0x225f137127d9067788314bc7fcc1f36746a3c3B5" 23 | /> 24 | {address && ( 25 | 33 | )} 34 |
    35 |
    36 | ); 37 | }; 38 | -------------------------------------------------------------------------------- /app/local/content/demos/ethregistry/hooks/useCommitment.ts: -------------------------------------------------------------------------------- 1 | import { mainnet, sepolia } from 'viem/chains'; 2 | import { useChainId, useReadContract } from 'wagmi'; 3 | 4 | import { ETHRegistrarABI } from '../ETHRegistryABI'; 5 | 6 | const deployments = { 7 | [mainnet.id]: '0x253553366Da8546fC250F225fe3d25d0C782303b', 8 | [sepolia.id]: '0xFED6a969AaA60E4961FCD3EBF1A2e8913ac65B72', 9 | }; 10 | 11 | export const useCommitment = ( 12 | name: string, 13 | owner: string, 14 | duration: number, 15 | secret: string, 16 | resolver: string 17 | ) => { 18 | const chainId = useChainId(); 19 | 20 | const { data, isLoading } = useReadContract({ 21 | address: deployments[chainId] as `0x${string}`, 22 | abi: ETHRegistrarABI, 23 | functionName: 'makeCommitment', 24 | args: [name, owner, duration, secret, resolver, [], false, 0], 25 | // enabled: 26 | // !!name && 27 | // name.length >= 3 && 28 | // !!owner && 29 | // !!duration && 30 | // duration > 0 && 31 | // !!secret && 32 | // !!resolver, 33 | chainId, 34 | }); 35 | 36 | return { 37 | commithash: data as string, 38 | isLoadingCommithash: isLoading, 39 | }; 40 | }; 41 | -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/wagmi.svg: -------------------------------------------------------------------------------- 1 | 2 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/lib/metadata.ts: -------------------------------------------------------------------------------- 1 | import { deepmerge } from 'deepmerge-ts'; 2 | import { Metadata, ResolvedMetadata } from 'next'; 3 | 4 | type CreateMetadataOptions = { 5 | title: string; 6 | description?: string; 7 | path: string; 8 | }; 9 | 10 | export const createMetadata = ( 11 | options: CreateMetadataOptions, 12 | parentMetadata?: ResolvedMetadata, 13 | extras?: Metadata 14 | ): Metadata => { 15 | const { title, path } = options; 16 | const description = 17 | options.description ?? parentMetadata?.description ?? undefined; 18 | 19 | const base: Metadata = { 20 | // For some reason Next.js is returning a very weird object for `metadataBase` 21 | // from the parentMetadata, so we need to always set it here even if it is 22 | // already set in app/layout.tsx 23 | metadataBase: new URL('https://docs.ens.domains'), 24 | title, 25 | description, 26 | alternates: { 27 | canonical: path, 28 | }, 29 | openGraph: { 30 | title, 31 | description, 32 | url: path, 33 | }, 34 | twitter: { 35 | title, 36 | description, 37 | }, 38 | }; 39 | 40 | return deepmerge(parentMetadata, base, extras ?? {}); 41 | }; 42 | -------------------------------------------------------------------------------- /app/app/page.tsx: -------------------------------------------------------------------------------- 1 | import { getPageBySlug } from 'data/get_page'; 2 | import { ResolvingMetadata } from 'next'; 3 | 4 | import { Layout } from '@/layout/PageLayout'; 5 | import { createMetadata } from '@/lib/metadata'; 6 | 7 | export const generateMetadata = async (_x: any, parent: ResolvingMetadata) => { 8 | const { 9 | pageProperties: { meta }, 10 | } = await getPageBySlug('index'); 11 | const parentMetadata = await parent; 12 | 13 | return createMetadata( 14 | { 15 | title: 'ENS Documentation', 16 | description: meta.description, 17 | path: '/', 18 | }, 19 | parentMetadata, 20 | { 21 | twitter: { 22 | card: 'summary_large_image', 23 | }, 24 | openGraph: { 25 | type: 'article', 26 | images: '/opengraph.png', 27 | }, 28 | } 29 | ); 30 | }; 31 | 32 | export default async function Page() { 33 | const { Page, pageProperties } = await getPageBySlug('index'); 34 | 35 | return ( 36 | 41 | 42 | 43 | ); 44 | } 45 | -------------------------------------------------------------------------------- /app/public/content/dao/governance/social-proposal-template.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: A short (1-2 sentence) description of the proposal. 3 | --- 4 | 5 | # [Social] Proposal Title 6 | 7 | | **Status** | Pending | 8 | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | 9 | | **Discussion Thread** | [Discuss](https://discuss.ens.domains/t/...) | 10 | | **Votes** | Pending | 11 | 12 | ## Abstract 13 | 14 | 19 | 20 | ## Specification 21 | 22 | 25 | -------------------------------------------------------------------------------- /app/local/content/extras/home/QuickLink.tsx: -------------------------------------------------------------------------------- 1 | import Link from 'next/link'; 2 | import { FC } from 'react'; 3 | 4 | export const QuickBannerLink: FC<{ 5 | title: string; 6 | description: string; 7 | href: string; 8 | image: string; 9 | }> = ({ title, description, href, image }) => { 10 | return ( 11 | 16 |
    17 | {image && } 18 |
    19 |
    20 |
    21 |
    22 | {title} 23 |
    24 |
    {description}
    25 |
    26 |
    27 | 28 | ); 29 | }; 30 | -------------------------------------------------------------------------------- /app/src/components/mdx/heading/Anchor.tsx: -------------------------------------------------------------------------------- 1 | import Link from 'next/link'; 2 | 3 | export const AnchorIcon = (properties) => { 4 | return ( 5 | 14 | ); 15 | }; 16 | 17 | export const Anchor = ({ id, inView, children }) => { 18 | return ( 19 |
    20 | {children} 21 | 25 | {inView && ( 26 |
    27 |
    28 | 29 |
    30 |
    31 | )} 32 | 33 |
    34 | ); 35 | }; 36 | -------------------------------------------------------------------------------- /app/local/data/blockchain_explorers.ts: -------------------------------------------------------------------------------- 1 | import { holesky, mainnet, sepolia } from 'viem/chains'; 2 | 3 | type BlockchainExplorer = { 4 | name: string; 5 | contract_url?: string; 6 | account_url?: string; 7 | name_url?: string; 8 | }; 9 | 10 | export const BLOCKCHAIN_EXPLORERS: Record = { 11 | [mainnet.id]: [ 12 | { 13 | name: 'Etherscan', 14 | account_url: 'https://etherscan.io/address/%ADDRESS%', 15 | contract_url: 'https://etherscan.io/address/%ADDRESS%', 16 | name_url: 'https://etherscan.io/name-lookup-search?id=%NAME%', 17 | }, 18 | ], 19 | [sepolia.id]: [ 20 | { 21 | name: 'Etherscan', 22 | account_url: 'https://sepolia.etherscan.io/address/%ADDRESS%', 23 | contract_url: 'https://sepolia.etherscan.io/address/%ADDRESS%', 24 | name_url: 25 | 'https://sepolia.etherscan.io/name-lookup-search?id=%NAME%', 26 | }, 27 | ], 28 | [holesky.id]: [ 29 | { 30 | name: 'Etherscan', 31 | account_url: 'https://holesky.etherscan.io/address/%ADDRESS%', 32 | contract_url: 'https://holesky.etherscan.io/address/%ADDRESS%', 33 | name_url: 34 | 'https://holesky.etherscan.io/name-lookup-search?id=%NAME%', 35 | }, 36 | ], 37 | }; 38 | -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/node.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/local/content/prose/code/group/CodeGroupHeader.tsx: -------------------------------------------------------------------------------- 1 | import { FC, ReactNode } from 'react'; 2 | 3 | import { CodeSnippetProperties } from '../snippet/CodeSnippet'; 4 | import { LanguageSwitcher } from './LanguageSwitcher'; 5 | 6 | export const CodeGroupHeader: FC<{ 7 | snippets: { 8 | element: ReactNode; 9 | data: CodeSnippetProperties; 10 | }[]; 11 | identifier: string; 12 | title: string; 13 | presets: string; 14 | }> = ({ title, snippets, identifier, presets }) => { 15 | const hasTabs = snippets.length > 1; 16 | 17 | if (!title && !hasTabs) { 18 | return; 19 | } 20 | 21 | return ( 22 |
    23 | {title && ( 24 |
    25 | {title} 26 |
    27 | )} 28 | {hasTabs && ( 29 | entry.data)} 31 | identifier={identifier} 32 | presets={presets} 33 | /> 34 | )} 35 |
    36 | ); 37 | }; 38 | -------------------------------------------------------------------------------- /app/src/layout/header/search/lib/fetcher.ts: -------------------------------------------------------------------------------- 1 | import { Fetcher } from 'swr'; 2 | 3 | import { SearchResult } from '../types/result'; 4 | 5 | export const searchFetcher: Fetcher< 6 | SearchResult, 7 | { search: string; tag: string } 8 | > = async ({ search, tag }) => { 9 | // @ts-ignore 10 | const result = await fetch( 11 | 'https://search.v3x.systems/indexes/ens-docs/search', 12 | { 13 | method: 'POST', 14 | headers: { 15 | 'Content-Type': 'application/json', 16 | Authorization: 17 | 'Bearer b77dacb494c3272351784097847e34c59b22510b30aa0ed662f1e79e1df658a0', 18 | } as any, 19 | body: JSON.stringify({ 20 | q: search, 21 | limit: 5, 22 | showMatchesPosition: true, 23 | attributesToCrop: ['content'], 24 | attributesToRetrieve: [ 25 | 'title', 26 | 'slug', 27 | 'description', 28 | 'authors', 29 | 'tag', 30 | 'emoji', 31 | ], 32 | filter: tag === 'All' ? undefined : `tag = '${tag}'`, 33 | cropLength: 10, 34 | attributesToHighlight: ['content', 'title'], 35 | }) as any, 36 | } 37 | ); 38 | 39 | return result.json(); 40 | }; 41 | -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/php.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/components/ModeToggle.tsx: -------------------------------------------------------------------------------- 1 | import { MoonIcon } from '@/components/icons/MoonIcon'; 2 | import { SunIcon } from '@/components/icons/SunIcon'; 3 | 4 | function disableTransitionsTemporarily() { 5 | document.documentElement.classList.add('[&_*]:!transition-none'); 6 | window.setTimeout(() => { 7 | document.documentElement.classList.remove('[&_*]:!transition-none'); 8 | }, 0); 9 | } 10 | 11 | function toggleMode() { 12 | disableTransitionsTemporarily(); 13 | 14 | const darkModeMediaQuery = window.matchMedia( 15 | '(prefers-color-scheme: dark)' 16 | ); 17 | const isSystemDarkMode = darkModeMediaQuery.matches; 18 | const isDarkMode = document.documentElement.classList.toggle('dark'); 19 | 20 | if (isDarkMode === isSystemDarkMode) { 21 | delete window.localStorage.isDarkMode; 22 | } else { 23 | window.localStorage.isDarkMode = isDarkMode; 24 | } 25 | } 26 | 27 | export function ModeToggle() { 28 | return ( 29 | 38 | ); 39 | } 40 | -------------------------------------------------------------------------------- /app/app/content-metadata.json/route.ts: -------------------------------------------------------------------------------- 1 | import { getPageBySlug } from 'data/get_page'; 2 | import { getAllPageSlugs } from 'data/get_pages'; 3 | import { NextResponse } from 'next/server'; 4 | 5 | import { navigation } from '../../local/config/navigation'; 6 | 7 | const { protocol } = navigation; 8 | 9 | export async function GET() { 10 | if (process.env.NODE_ENV !== 'production') return NextResponse.json([]); 11 | 12 | console.log('🔍 Generating Search Index'); 13 | 14 | const slugs = await getAllPageSlugs(); 15 | 16 | const posts = await Promise.all( 17 | slugs.map(async (slug) => { 18 | const tag = 19 | protocol.find((section) => { 20 | if (slug == 'index' && section.name == 'Intro') return true; 21 | 22 | if (slug == 'dissapeared') return false; 23 | 24 | return section.activePattern.test(`/${slug}`); 25 | })?.name || ''; 26 | const { pageProperties } = await getPageBySlug(slug); 27 | 28 | return { 29 | pageProperties, 30 | slug, 31 | tag, 32 | }; 33 | }) 34 | ); 35 | 36 | const data = posts.map((post) => ({ 37 | ...post.pageProperties.meta, 38 | id: post.slug.replace('/', '--').replace(/[^\w-]/g, ''), 39 | slug: post.slug, 40 | tag: post.tag, 41 | })); 42 | 43 | return NextResponse.json(data); 44 | } 45 | -------------------------------------------------------------------------------- /app/app/sitemap.ts: -------------------------------------------------------------------------------- 1 | import { glob } from 'glob'; 2 | import { MetadataRoute } from 'next'; 3 | import { join } from 'node:path'; 4 | import simpleGit from 'simple-git'; 5 | 6 | const SLUG_IGNORE = new Set(['dissapeared']); 7 | 8 | const processSlugs = (slug: string) => { 9 | return slug.replace('index', ''); 10 | }; 11 | 12 | const getGitLastUpdatedTimeStamp = async (slug: string) => { 13 | const git = simpleGit({ 14 | baseDir: process.cwd().replace(/\/app$/, ''), 15 | }); 16 | const lastUpdatedTimeStamp = await git.log({ 17 | file: process.cwd().replace(/\/app$/, '') + `/docs/${slug}`, 18 | }); 19 | 20 | return new Date(lastUpdatedTimeStamp.latest.date); 21 | }; 22 | 23 | export default async function sitemap(): Promise { 24 | const files = await glob('**/*.mdx', { 25 | cwd: join(process.cwd(), '../docs'), 26 | }); 27 | 28 | const routes = await Promise.all( 29 | files.map(async (file) => { 30 | const slug = file.replace(/(\/index)?\.mdx$/, ''); 31 | const lastUpdated = await getGitLastUpdatedTimeStamp(file); 32 | 33 | if (SLUG_IGNORE.has(slug)) { 34 | return; 35 | } 36 | 37 | return { 38 | url: 'https://docs.ens.domains/' + processSlugs(slug), 39 | lastModified: lastUpdated, 40 | }; 41 | }) 42 | ); 43 | 44 | return routes.filter(Boolean); 45 | } 46 | -------------------------------------------------------------------------------- /app/public/content/dao/governance/constitutional-amendment-template.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: A short (1-2 sentence) description of the proposal. 3 | --- 4 | 5 | # [Amendment] Proposal Title 6 | 7 | | **Status** | Pending | 8 | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | 9 | | **Discussion Thread** | [Discuss](https://discuss.ens.domains/t/...) | 10 | | **Votes** | Pending | 11 | 12 | ## Abstract 13 | 14 | 19 | 20 | ## Specification 21 | 22 | 25 | 26 | ## Pull Request 27 | 28 | 31 | -------------------------------------------------------------------------------- /docs/bugs.mdx: -------------------------------------------------------------------------------- 1 | {/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 2 | export const meta = { 3 | title: 'Bug Bounties', 4 | description: 'ENS offers cash rewards to anyone who finds a bug in covered ENS smart contracts.', 5 | emoji: '🪲', 6 | contributors: [ 7 | 'luc.eth', 8 | 'gregskril.eth' 9 | ] 10 | }; 11 | 12 | # 🪲 Bug Bounty Program 13 | 14 | The ENS bug bounty program rewards anyone who finds a bug in covered ENS smart contracts and ENS Labs assets. This page provides a brief overview of the program which is operated by Immunefi and ENS Labs. 15 | 16 | {/* TODO: add link to final bug bounty when ready */} 17 | 18 |
    19 | 25 |
    26 | 27 | ## Bounties 💸 28 | 29 | Reward sizes are guided by the rules below, but are in the end, determined at the sole discretion of the ENS Labs team. 30 | 31 | ### Smart Contracts 32 | 33 | - **Critical**: up to $250,000 USD 34 | - **High**: up to $150,000 USD 35 | - **Medium**: up to $100,000 USD 36 | - **Low**: up to $20,000 USD 37 | 38 | ### Websites and Applications 39 | 40 | - **Critical**: up to $50,000 USD 41 | - **High**: up to $20,000 USD 42 | - **Medium**: up to $2,500 USD 43 | - **Low**: up to $1,000 USD 44 | 45 | The ENS Labs team reserves the right to adjust bounty amounts at any time in the future. 46 | -------------------------------------------------------------------------------- /app/src/components/GridPattern.tsx: -------------------------------------------------------------------------------- 1 | import { useId } from 'react'; 2 | 3 | export const GridPattern = ({ 4 | width, 5 | height, 6 | x, 7 | y, 8 | squares, 9 | ...properties 10 | }) => { 11 | const patternId = useId(); 12 | 13 | return ( 14 | 48 | ); 49 | }; 50 | -------------------------------------------------------------------------------- /app/src/components/icons/ClipboardIcon.tsx: -------------------------------------------------------------------------------- 1 | export const ClipboardIcon = (properties) => { 2 | return ( 3 | 16 | ); 17 | }; 18 | 19 | // function ClipboardIcon(properties) { 20 | // return ( 21 | // 32 | // ); 33 | // } 34 | -------------------------------------------------------------------------------- /app/public/ens/dark/ens_mark_dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/public/ens/light/ens_mark_light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/components/mdx/EmbedLink.tsx: -------------------------------------------------------------------------------- 1 | import Link from 'next/link'; 2 | import { FC } from 'react'; 3 | import { FiChevronRight } from 'react-icons/fi'; 4 | 5 | export const EmbedLink: FC<{ 6 | title: string; 7 | href: string; 8 | tag?: string; 9 | description: string; 10 | target?: string; 11 | }> = ({ title, href, description, target, tag }) => { 12 | return ( 13 | 18 |
    19 | 20 | {title} 21 | {description} 22 | 23 | 24 | {tag && ( 25 | 26 | {tag} 27 | 28 | )} 29 | 30 |
    31 | 32 | ); 33 | }; 34 | -------------------------------------------------------------------------------- /app/src/lib/pages.ts: -------------------------------------------------------------------------------- 1 | // import { MDXProps } from 'mdx/types'; 2 | // import { notFound } from 'next/navigation'; 3 | // import fs from 'node:fs'; 4 | // import { join } from 'node:path'; 5 | // import { JSX } from 'react'; 6 | 7 | // const contentDirectory = join(process.cwd(), 'content'); 8 | 9 | // export const getAllPagesSlug = () => { 10 | // // const walkSync = (directory: string, filelist: string[] = []) => { 11 | // // for (const file of fs.readdirSync(directory)) { 12 | // // if (directory === contentDirectory && file === 'index.mdx') 13 | // // continue; 14 | 15 | // // // console.log({ file, directory }); 16 | // // filelist = fs.statSync(join(directory, file)).isDirectory() 17 | // // ? walkSync(join(directory, file), filelist) 18 | // // : filelist.concat( 19 | // // join(directory, file) 20 | // // .replace(/\.mdx$/, '') 21 | // // // if filename is index.mdx, then we want to remove the index part 22 | // // .replace(/\/index$/, '') 23 | // // ); 24 | // // } 25 | 26 | // // return filelist; 27 | // // }; 28 | 29 | // // return walkSync(contentDirectory).map((file) => 30 | // // file.replace(`${contentDirectory}/`, '') 31 | // // ); 32 | // return []; 33 | // }; 34 | 35 | // export const getAllPages = async () => { 36 | // const slugs = await (); 37 | 38 | // return await Promise.all(slugs.map((slug) => getPageBySlug(slug))); 39 | // }; 40 | 41 | const hello = 'foo'; 42 | 43 | export { hello }; 44 | -------------------------------------------------------------------------------- /app/public/content/dao/governance/rfp-template.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: >- 3 | A template for DAO RFPs. 4 | --- 5 | 6 | ## Overview 7 | 8 | 9 | 10 | ## Scope of Work 11 | 12 | 13 | 14 | ## Selection Criteria 15 | 16 | 17 | 18 | ## Timeline 19 | 20 | | **Submission Period** | | 21 | | **Approval Period** | | 22 | | **Expected Delivery** | | 23 | 24 | ## RFP Manager 25 | 26 | 29 | 30 | ## Budget 31 | 32 | 35 | -------------------------------------------------------------------------------- /docs/dao/token.mdx: -------------------------------------------------------------------------------- 1 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 2 | export const meta = { 3 | description: 'THERE ARE NO PLANS FOR ANOTHER AIRDROP', 4 | emoji: '🪂', 5 | contributors: [] 6 | }; 7 | 8 | # 🪂 Airdrop {{ title: "Airdrop" }} 9 | 10 | ENS Airdropped tokens to anyone who held an ENS name on _October 31st, 2021_. **THERE ARE NO PLANS FOR ANOTHER AIRDROP**. Please be weary of any notices of airdrops as these could turn out fraudulent. 11 | 12 | All major decisions of the ENS DAO governance rely on the ENS Governance Token, which was distributted to ENS owners in 2021. The token address is at token.ensdao.eth (0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72) on ethereum Mainnet and is the only official governance token for the DAO. 13 | 14 | ## Can I recover tokens accidentally sent to the wrong address? 15 | 16 | The answer depends on the address the token was sent to. If you accidentally sent the token to the token contract address listed above (0xC1836021..) or the wallet.ensdao.eth address (0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7) then the tokens might be recoverable. Contact the [Meta-governance working group](/dao/stewards/) at the [ENS Forum](https://discuss.ens.domains) and explain the situation. Tokens can only be sent back to the address they were sent from, so if it was sent from an exchange, contact your exchange support to make sure the address can receive tokens. 17 | 18 | If the tokens were sent to the null address (0x000..) or an address with a typo, then the tokens are unrecoverable and there's nothing that anyone can do. If the tokens were sent to an exchange or a third party, then contact that third party for help. 19 | -------------------------------------------------------------------------------- /app/src/layout/sidebar/_legacy/VisibleSelectionHighlight.tsx: -------------------------------------------------------------------------------- 1 | import { motion } from 'framer-motion'; 2 | import { useIsPresent } from 'framer-motion'; 3 | 4 | import { useSectionStore } from '@/components/SectionProvider'; 5 | import { useIsInsideMobileNavigation } from '@/lib/mobile'; 6 | import { remToPx } from '@/lib/remToPx'; 7 | 8 | import { useInitialValue } from './useInitialValue'; 9 | 10 | export function VisibleSectionHighlight({ group, pathname }) { 11 | const [sections, visibleSections] = useInitialValue( 12 | [ 13 | useSectionStore((s) => s.sections || []), 14 | useSectionStore((s) => s.visibleSections || []), 15 | ], 16 | useIsInsideMobileNavigation() 17 | ); 18 | 19 | const isPresent = useIsPresent(); 20 | const firstVisibleSectionIndex = Math.max( 21 | 0, 22 | [{ id: '_top' }, ...sections].findIndex( 23 | (section) => section.id === visibleSections[0] 24 | ) 25 | ); 26 | const itemHeight = remToPx(2); 27 | const height = isPresent 28 | ? Math.max(1, visibleSections.length) * itemHeight 29 | : itemHeight; 30 | const top = 31 | group.links?.findIndex((link) => link.href === pathname) * itemHeight + 32 | firstVisibleSectionIndex * itemHeight; 33 | 34 | return ( 35 | 43 | ); 44 | } 45 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: 🔎 2 | 3 | on: 4 | push: 5 | branches: [master, main] 6 | merge_group: 7 | pull_request: 8 | branches: [master, main] 9 | 10 | # Automatically cancel in-progress actions on the same branch 11 | concurrency: 12 | group: ${{ github.workflow }}-${{ github.event_name == 'pull_request_target' && github.head_ref || github.ref }} 13 | cancel-in-progress: true 14 | 15 | env: 16 | NODE_OPTIONS: '--max_old_space_size=8192' 17 | 18 | jobs: 19 | typecheck: 20 | name: 🟦 Typescript 21 | runs-on: ubuntu-latest 22 | env: 23 | FORCE_COLOR: true 24 | steps: 25 | - name: Checkout 26 | uses: actions/checkout@v4 27 | with: 28 | fetch-depth: 0 29 | 30 | - name: Install Tools & Dependencies 31 | uses: ./.github/actions/install 32 | 33 | - name: Run typecheck 34 | working-directory: ./app 35 | run: pnpm run typecheck 36 | eslint: 37 | name: 👕 Linting 38 | runs-on: ubuntu-latest 39 | env: 40 | FORCE_COLOR: true 41 | steps: 42 | - name: Checkout 43 | uses: actions/checkout@v4 44 | 45 | - name: Install Tools & Dependencies 46 | uses: ./.github/actions/install 47 | 48 | - name: Run eslint 49 | working-directory: ./app 50 | run: pnpm run lint 51 | build: 52 | name: 🛠️ Build 53 | runs-on: ubuntu-latest 54 | env: 55 | FORCE_COLOR: true 56 | steps: 57 | - name: Checkout 58 | uses: actions/checkout@v4 59 | 60 | - name: Install Tools & Dependencies 61 | uses: ./.github/actions/install 62 | 63 | - name: Build 64 | working-directory: ./app 65 | run: pnpm run build 66 | -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/typescript.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/public/icons/legacy/mark_dao.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/public/icons/legacy/mark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/public/ens/dao/token.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/app/theme.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; 4 | import { ThemeProvider } from 'next-themes'; 5 | import { useEffect } from 'react'; 6 | import { holesky, mainnet, sepolia } from 'viem/chains'; 7 | import { createConfig, http, WagmiProvider } from 'wagmi'; 8 | import { injected, walletConnect } from 'wagmi/connectors'; 9 | 10 | const config = createConfig({ 11 | chains: [mainnet, sepolia, holesky], 12 | connectors: [ 13 | injected({}), 14 | walletConnect({ 15 | projectId: '3b205429cec06896f1d18c3b46dc5a68', 16 | metadata: { 17 | name: 'ENS Documentation', 18 | description: 'Ethereum Name Service Documentation', 19 | icons: ['https://docs.ens.domains/favicon.ico'], 20 | url: 'https://docs.ens.domains', 21 | }, 22 | showQrModal: false, 23 | }), 24 | ], 25 | transports: { 26 | [mainnet.id]: http(), 27 | [sepolia.id]: http(), 28 | [holesky.id]: http(), 29 | }, 30 | }); 31 | 32 | declare module 'wagmi' { 33 | interface Register { 34 | config: typeof config; 35 | } 36 | } 37 | 38 | const queryClient = new QueryClient(); 39 | 40 | export const Theme = ({ children }) => { 41 | useEffect(() => { 42 | (async () => { 43 | const { setupConfig } = await import('@ens-tools/thorin-core'); 44 | 45 | setupConfig(() => config as any); 46 | })(); 47 | }, []); 48 | 49 | return ( 50 | 51 | 52 | {children} 53 | 54 | 55 | ); 56 | }; 57 | -------------------------------------------------------------------------------- /app/src/components/Tag.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | 3 | const variantStyles = { 4 | medium: 'rounded-lg px-1.5 ring-1 ring-inset', 5 | }; 6 | 7 | const colorStyles = { 8 | emerald: { 9 | small: 'text-ens-light-blue-500 dark:text-ens-light-blue-400', 10 | medium: 'ring-ens-300 dark:ring-ens-400/30 bg-ens-light-blue-400/10 text-ens-light-blue-500 dark:text-ens-light-blue-400', 11 | }, 12 | sky: { 13 | small: 'text-sky-500', 14 | medium: 'ring-sky-300 bg-sky-400/10 text-sky-500 dark:ring-sky-400/30 dark:bg-sky-400/10 dark:text-sky-400', 15 | }, 16 | amber: { 17 | small: 'text-amber-500', 18 | medium: 'ring-amber-300 bg-amber-400/10 text-amber-500 dark:ring-amber-400/30 dark:bg-amber-400/10 dark:text-amber-400', 19 | }, 20 | rose: { 21 | small: 'text-red-500 dark:text-rose-500', 22 | medium: 'ring-rose-200 bg-rose-50 text-red-500 dark:ring-rose-500/20 dark:bg-rose-400/10 dark:text-rose-400', 23 | }, 24 | zinc: { 25 | small: 'text-zinc-400 dark:text-zinc-500', 26 | medium: 'ring-zinc-200 bg-zinc-50 text-zinc-500 dark:ring-zinc-500/20 dark:bg-zinc-400/10 dark:text-zinc-400', 27 | }, 28 | }; 29 | 30 | const valueColorMap = { 31 | get: 'emerald', 32 | post: 'sky', 33 | put: 'amber', 34 | delete: 'rose', 35 | }; 36 | 37 | export const Tag = ({ 38 | children, 39 | variant = 'medium', 40 | color = valueColorMap[children.toLowerCase()] ?? 'emerald', 41 | }) => { 42 | return ( 43 | 50 | {children} 51 | 52 | ); 53 | }; 54 | -------------------------------------------------------------------------------- /app/public/ens/dao/ens_mark_dao.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/go.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/data/get_page.tsx: -------------------------------------------------------------------------------- 1 | import { MDXProps } from 'mdx/types'; 2 | import { notFound } from 'next/navigation'; 3 | import { existsSync } from 'node:fs'; 4 | import { join } from 'node:path'; 5 | import { cache, ReactNode } from 'react'; 6 | 7 | import { 8 | MdxPageProps as MdxPageProperties, 9 | mdxPagePropsSchema as mdxPagePropertiesSchema, 10 | } from '../src/lib/mdxPageProps'; 11 | 12 | const contentDirectory = join(process.cwd(), '../docs'); 13 | 14 | const _getPageBySlug = async ( 15 | // ex 'index' or 'web' or 'web/quickstart' 16 | slug: string 17 | ): Promise<{ 18 | Page: (_properties: MDXProps) => ReactNode; 19 | pageProperties: MdxPageProperties; 20 | }> => { 21 | console.log('🔍 -> ' + slug); 22 | 23 | const potentialPaths = [slug, slug + '/index']; 24 | let foundPath: string | undefined; 25 | 26 | for (const path of potentialPaths) { 27 | const exists = existsSync(join(contentDirectory, path + '.mdx')); 28 | 29 | if (exists) { 30 | foundPath = path; 31 | break; 32 | } 33 | } 34 | 35 | if (!foundPath) { 36 | console.warn('Tried to find page by slug but couldnt find:', slug); 37 | 38 | return notFound(); 39 | } 40 | 41 | const file = await import('../../docs/' + foundPath + '.mdx'); 42 | 43 | const { default: Page, ...rawPageProperties } = 44 | file as MdxPageProperties & { 45 | default: (_properties: MDXProps) => ReactNode; 46 | }; 47 | 48 | const pageProperties = mdxPagePropertiesSchema.parse(rawPageProperties); 49 | 50 | if (!pageProperties.meta.title || pageProperties.meta.title == '') 51 | pageProperties.meta.title = pageProperties.title; 52 | 53 | return { 54 | pageProperties, 55 | Page, 56 | }; 57 | }; 58 | 59 | export const getPageBySlug = cache(_getPageBySlug); 60 | -------------------------------------------------------------------------------- /app/public/ens/ecosystem/ens_mark_ecosystem.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/local/content/extras/linkcard/LinkCard.tsx: -------------------------------------------------------------------------------- 1 | import { FiChevronRight } from 'react-icons/fi'; 2 | 3 | type Properties = { 4 | title: string; 5 | description: string; 6 | domain?: string; 7 | link: string; 8 | logo: string; 9 | bgColor: string; 10 | fgColor: string; 11 | }; 12 | 13 | export const LinkCard = ({ 14 | title, 15 | description, 16 | domain, 17 | link, 18 | logo, 19 | bgColor, 20 | fgColor, 21 | }: Properties) => { 22 | return ( 23 | 35 |
    36 |
    37 | {title} 38 |
    39 | {domain && ( 40 |
    44 | {domain} 45 |
    46 | )} 47 |
    48 |
    {title}
    49 |
    {description}
    50 |
    51 |
    52 | read more 53 |
    54 |
    55 |
    56 | ); 57 | }; 58 | -------------------------------------------------------------------------------- /app/public/ens/primary/ens_mark_primary.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /docs/dao/proposals/1.7.mdx: -------------------------------------------------------------------------------- 1 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 2 | export const meta = { 3 | description: 'Ens the $ENS airdrop and EP2 airdrop by transferring tokens and revoking approvals.', 4 | emoji: '📗', 5 | contributors: [ 6 | 'arachnid' 7 | ], 8 | proposal: { 9 | discourse: '12047', 10 | snapshot: '0x718c496b04017fb82749b68570d12f32c839f59b9f9433df127f48bf99121eb7', 11 | tally: '99882233577221676057992280816078245519848378270443751235073826886360950537295', 12 | type: 'executable' 13 | } 14 | }; 15 | 16 | # [EP1.7] [Executable] End the $ENS and EP2 airdrops 17 | 18 | _Note: This was previously numbered EP11._ 19 | 20 | ## Abstract 21 | 22 | The $ENS airdrop can be terminated at any time on or after May 4, 2022 by a call from the DAO, transferring remaining tokens to an address it specifies. The EP2 airdrop can be terminated at any time by revoking the token approval given to it by the DAO. This EP proposes to execute both of these actions on or shortly after May 4, 2022. 23 | 24 | ## Specification 25 | 26 | - Call 'sweep' on the ENS token contract, specifying the DAO wallet as target address. 27 | - Call 'approve' on the ENS token contract, specifying the EP2 airdrop contract and an allowance of 0. 28 | 29 | ## Transactions 30 | 31 | | Address | Value | Function | Argument | Value | 32 | | ------------------------------------------ | ----- | -------- | -------- | ------------------------------------------ | 33 | | 0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72 | 0 | sweep | dest | 0xFe89cc7aBB2C4183683ab71653C4cdc9B02D44b7 | 34 | | 0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72 | 0 | approve | spender | 0x4A1241C2Cf2fD4a39918BCd738f90Bd7094eC2DC | 35 | | amount | 0 | | | | 36 | -------------------------------------------------------------------------------- /docs/ensip/index.mdx: -------------------------------------------------------------------------------- 1 | import { WIP } from '@/components/wip/WIP'; 2 | 3 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 4 | export const meta = { 5 | description: '', 6 | emoji: '🧑‍🏫', 7 | contributors: [ 8 | 'luc.eth' 9 | ] 10 | }; 11 | 12 | # ENS Improvement Proposals 13 | 14 | This page contains a summary of all the ENS Improvement Proposals (ENSIPs) that have been proposed, and their current status. 15 | Improvement Proposals have included anything from new contract features, to text record standards, protocol features, and more. 16 | 17 | ## ENSIPs 18 | 19 | | Title | Status | 20 | | ----- | ------ | 21 | | [1 - ENS](/ensip/1) | ✅ Final | 22 | | [2 - Initial Hash Registrar](/ensip/2) | 😵 Obsolete | 23 | | [3 - Reverse Resolution](/ensip/3) | ✅ Final | 24 | | [4 - Support for contract ABIs](/ensip/4) | ✅ Final | 25 | | [5 - Text Records](/ensip/5) | ✅ Final | 26 | | [6 - DNS-in-ENS](/ensip/6) | 😵 Obsolete | 27 | | [7 - Contenthash](/ensip/7) | ✅ Final | 28 | | [8 - Interface Discovery](/ensip/8) | ✅ Final | 29 | | [9 - Multichain Address Resolution](/ensip/9) | ✅ Final | 30 | | [10 - Wildcard Resolution](/ensip/10) | ✅ Final | 31 | | [11 - EVM Compatible Chain Address Resolution](/ensip/11) | ✅ Final | 32 | | [12 - Avatar Text Record](/ensip/12) | ✅ Final | 33 | | [13 - SAFE Authentication for ENS](/ensip/13) | ✍️ Draft | 34 | | [14 - On-chain Source Parameter](/ensip/14) | ✍️ Draft | 35 | | [15 - Normalization Standard](/ensip/15) | ✍️ Draft | 36 | | [16 - Offchain Metadata](/ensip/16) | ✍️ Draft | 37 | | [17 - Gasless DNS Resolution](/ensip/17) | ✍️ Draft | 38 | | [18 - Profile Text Records](/ensip/18) | ✍️ Draft | 39 | | [19 - EVM-chain Reverse Resolution](/ensip/19) | ✍️ Draft | 40 | 41 | {/* ## Propose an ENSIP 42 | 43 | Feel free to [open a github issue](https://github.com/ensdomains/docs) or pull request on [ensdomains/docs](https://github.com/ensdomains/docs). 44 | 45 | */} 46 | -------------------------------------------------------------------------------- /app/public/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /docs/resolvers/interfaces.mdx: -------------------------------------------------------------------------------- 1 | import { WIP } from "@/components/wip/WIP"; 2 | import { resolver_methods } from "#/data/resolver"; 3 | import { h2, h3, h4 } from '@/components/mdx/heading/h2'; 4 | 5 | {/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 6 | export const meta = { 7 | description: '', 8 | emoji: '👉', 9 | contributors: [] 10 | }; 11 | 12 | export const methods = resolver_methods; 13 | 14 | # Interface Standards 15 | 16 | This page is a collection of methods that a resolver MAY implement 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | {methods.map((method) => { 27 | return ( 28 | 29 | 32 | 33 | 34 | ); 35 | })} 36 | 37 |
    UsageInterface ID
    30 | {method.usage} 31 | {method.name}
    38 | 39 | ## Check Interface Support 40 | 41 | ``` 42 | function supportsInterface(bytes4 interfaceID) external pure returns (bool) 43 | ``` 44 | 45 | { 46 | methods.map((method) => { 47 | return ( 48 |
    49 |

    {method.usage}

    50 | 51 | {method.name} 52 | 53 |

    54 | Interface ID is 55 | {method.interface} 56 |

    57 | {method.seeMore} 58 | {method.output && ( 59 | <> 60 |

    Outputs

    61 |

    {method.output}

    62 | 63 | )} 64 |
    65 | ); 66 | }) 67 | } -------------------------------------------------------------------------------- /app/local/content/demos/call/EthCall.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx'; 2 | import { FC, PropsWithChildren, ReactNode } from 'react'; 3 | 4 | type AllProperties = { 5 | call: ReactNode; 6 | description?: string; 7 | }; 8 | 9 | type EthCallProperties = { 10 | type?: 'call'; 11 | }; 12 | 13 | type EthTransactionProperties = { 14 | type?: 'transaction'; 15 | gas: string; 16 | }; 17 | 18 | export const EthCall: FC< 19 | PropsWithChildren< 20 | AllProperties & (EthCallProperties | EthTransactionProperties) 21 | > 22 | > = ({ type = 'call', call, children, description }) => { 23 | const is_transaction = type == 'transaction'; 24 | 25 | return ( 26 |
    27 |
    28 |
    29 |
    37 | {is_transaction ? 'Transaction' : 'ETH Call'} 38 |
    39 |
    40 |
    41 | {description} 42 |
    43 |
    44 | {call} 45 |
    46 | {children} 47 |
    48 |
    49 | ); 50 | }; 51 | -------------------------------------------------------------------------------- /docs/dao/proposals/2.2.1.mdx: -------------------------------------------------------------------------------- 1 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 2 | export const meta = { 3 | description: '', 4 | emoji: '📙', 5 | contributors: [ 6 | 'coltron-code' 7 | ], 8 | proposal: { 9 | discourse: '13756', 10 | snapshot: '0x46c7294aca8d70ae8213e8e8c6915697c7be1aab731fbb7e534276f7eb0ef2b9', 11 | tally: '21861129347596183989807248258922558214743224135371288783165185538477576992486', 12 | type: 'executable' 13 | } 14 | }; 15 | 16 | # [EP2.2.1] [Executable] Q3 & Q4 2022 Meta-Governance WG Budget 17 | 18 | _Note: This was previously numbered EP16.1._ 19 | 20 | ## Summary 21 | 22 | The Meta-Governance Working Group is requesting funding of 632k USD equivalent for the Q3/Q4 of 2022. The budget has three categories. All figures are presented in USD equivalent. 23 | 24 | ![](/content/dao/proposals/2.2.1-1.png) 25 | 26 | ## Multisigs / Subgroups: $371k USD Value 27 | 28 | Funding in this category is related to the two Meta-Governance subgroup multi-sigs. These have been reviewed and approved by the Meta-Gov Stewards. 29 | 30 | #### Budget 31 | 32 | ![](/content/dao/proposals/2.2.1-2.png) 33 | 34 | #### Description 35 | 36 | ![](/content/dao/proposals/2.2.1-3.png) 37 | 38 | ## Compensation: $190k USD Value 39 | 40 | Funding in this category relates to compensation for DAO stewards and secretary. 41 | 42 | #### Budget 43 | 44 | ![](/content/dao/proposals/2.2.1-4.png) 45 | 46 | #### Description 47 | 48 | The Working Group Rules passed in [EP12](https://discuss.ens.domains/t/ep12-social-working-group-rules/12953#specification-3) state compensation is permitted for stewards and secretary as set out in Rules 11.1 and 9.4 respectively. 49 | 50 | ## Unallocated: $71k USD Value 51 | 52 | The funds in this category are reserved for unforeseen grants and unexpected expenses for the term. Stewards will distribute unallocated funds on a discretionary basis. 53 | 54 | ![](/content/dao/proposals/2.2.1-5.png) 55 | -------------------------------------------------------------------------------- /app/local/content/demos/ethregistry/inputs/DurationField.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react'; 2 | 3 | import { Button } from '@/components/Button'; 4 | 5 | export const DurationField: FC<{ 6 | duration: number; 7 | setDuration: (_duration: number) => void; 8 | }> = ({ duration, setDuration }) => { 9 | const id = 'duration'; 10 | 11 | return ( 12 |
    13 | 19 |
    20 | {( 21 | [ 22 | [60 * 60 * 24 * 30, '1 month'], 23 | [60 * 60 * 24 * 365, '1 year'], 24 | [60 * 60 * 24 * 365 * 2, '2 years'], 25 | ] as [number, string][] 26 | ).map(([time, name]) => ( 27 | 36 | ))} 37 | { 40 | try { 41 | setDuration(Number(event.target.value)); 42 | } catch (error) { 43 | event.preventDefault(); 44 | console.log(error); 45 | } 46 | }} 47 | className="input max-w-sm" 48 | placeholder="31536000" 49 | /> 50 |
    51 |
    52 | ); 53 | }; 54 | -------------------------------------------------------------------------------- /app/local/content/extras/tld-list/DNSGrid.tsx: -------------------------------------------------------------------------------- 1 | export const DNSGrid = () => { 2 | return ( 3 |
    4 |
    5 | {[ 6 | '.com', 7 | '.xyz', 8 | '.nl', 9 | '.net', 10 | '.org', 11 | '.shop', 12 | '.photos', 13 | '.pizza', 14 | '.cash', 15 | '.money', 16 | '.news', 17 | '.info', 18 | '.gold', 19 | '.domains', 20 | '.social', 21 | '.de', 22 | '.city', 23 | '.lol', 24 | '.rip', 25 | '.company', 26 | '.es', 27 | '.network', 28 | '.me', 29 | '.us', 30 | '.id', 31 | '.fr', 32 | '.space', 33 | '.ninja', 34 | '.tools', 35 | '.wtf', 36 | '.capital', 37 | '.finance', 38 | '.vision', 39 | '.limo', 40 | '.link', 41 | '.uk', 42 | '.world', 43 | '.dev', 44 | '.day', 45 | '.fyi', 46 | '.cool', 47 | ].map((a) => ( 48 | 49 | {a} 50 | 51 | ))} 52 | 53 | and any other DNSSEC-compatible domain... 54 | 55 |
    56 |
    57 | ); 58 | }; 59 | -------------------------------------------------------------------------------- /docs/resolvers/writing.mdx: -------------------------------------------------------------------------------- 1 | import { WIP } from '@/components/wip/WIP'; 2 | 3 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 4 | export const meta = { 5 | description: '', 6 | emoji: '✍️', 7 | contributors: [] 8 | }; 9 | 10 | # Writing a Resolver 11 | 12 | Every ENS name has a resolver, which is responsible for resolving information about a name. 13 | By writing your own resolver contract you can extend the functionality of your name, subnames, and more. 14 | 15 | resolvers are a core part of the ENS protocol 16 | 17 | they give the power to a name "node" to control the resolution process from itself onwards (its subdomains etc) 18 | 19 | resolvers were originally standardized in EIP 137, but have since received a few updates such as [EIP 181](https://eips.ethereum.org/EIPS/eip-181), [EIP 2304](https://eips.ethereum.org/EIPS/eip-2304), and [ENSIP-10](/ensip/10). 20 | 21 | ## Resolver Interface 22 | 23 | the idea of a resolver is pretty straight forward. "any contract that implements the resolver interface". There have been a few extensions to the original interface, however a summarized interface is defined as follows: 24 | 25 | ```solidity 26 | contract MyResolver { 27 | fn addr(bytes32 node) public view returns (address); 28 | } 29 | ``` 30 | 31 | ## Wildcard Resolution 32 | 33 | In [ENSIP-10](/ensip/10) a new method was added to the resolver interface, the `resolve()` method. 34 | This method allows for fetching 35 | 36 | ```solidity 37 | interface ExtendedResolver { 38 | function resolve(bytes calldata name, bytes calldata data) external view returns(bytes); 39 | } 40 | ``` 41 | 42 | 43 | Don't forget to add `0x9061b923` to your [EIP-165](https://eips.ethereum.org/) `supportsInterface()` implementation. 44 | 45 | 46 | ## Offchain Resolution 47 | 48 | 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-read) 49 | 50 | ## Test your Resolver 51 | 52 | 53 | -------------------------------------------------------------------------------- /app/src/layout/details/variations/ENSIPDetails.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react'; 2 | import { FiClock } from 'react-icons/fi'; 3 | 4 | import { MdxENSIPProps } from '@/lib/mdxPageProps'; 5 | 6 | export const ENSIPDetails: FC<{ mdxProperties: MdxENSIPProps }> = ({ 7 | mdxProperties, 8 | }) => { 9 | return ( 10 |
    11 | {mdxProperties.status && ( 12 |
    13 |
    Status
    14 |
    15 | { 16 | { 17 | final: ( 18 | 19 | ✅ Final 20 | 21 | ), 22 | draft: ( 23 | 24 | ✍️ Draft 25 | 26 | ), 27 | obsolete: ( 28 | 29 | ❌ Obsolete 30 | 31 | ), 32 | }[mdxProperties.status] 33 | } 34 |
    35 |
    36 | )} 37 | {mdxProperties.created && ( 38 |
    39 |
    Created
    40 |
    41 | 42 | {new Date(mdxProperties.created).toLocaleDateString()} 43 |
    44 |
    45 | )} 46 |
    47 | ); 48 | }; 49 | -------------------------------------------------------------------------------- /docs/resolvers/quickstart.mdx: -------------------------------------------------------------------------------- 1 | {/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 2 | export const meta = { 3 | description: '', 4 | showDetailsSection: false, 5 | }; 6 | 7 | # Quickstart Resolver 8 | 9 | At the heart of every ENS name is its resolver. A resolver is a smart contract that implements a specific set of Resolver features (see [Resolver Interface](/resolver/interfaces)). 10 | The resolvers smart contract functions have control over the resolution process of a "node" (a name or subdomain) and onwards (subdomains of itself). 11 | 12 | ## Basic Resolver 13 | 14 | A naive but very plausible example of a resolver is the following. 15 | 16 | ```solidity 17 | contract MyResolver { 18 | function addr(bytes32 node) public view returns (address) { 19 | return 0x225f137127d9067788314bc7fcc1f36746a3c3B5; 20 | } 21 | } 22 | ``` 23 | 24 | Notice how the above would always return the same address regardless of the name it is queried for. 25 | 26 | If you want to [write your own resolver resolver](/resolvers/writing), or see the [interface reference](/resolvers/interfaces). 27 | 28 | ## Public Resolver 29 | 30 | The default resolver for all names is the Public Resolver, a swiss army knife of resolvers, written by the ENS Labs team, feature-packed with everything your everyday user might need. 31 | You can read more about the [Public Resolver](/resolvers/public). 32 | 33 | ## Interacting with a resolver 34 | 35 | Depending on the resolver in charge of a name, certain frontend apps will be able to interact with them as well. 36 | This means you can set your favourite records, upgrade your name to different logic, and more, from your dApp of choice. 37 | 38 | Are you writing a dApp and want to build this? Checkout the [Interacting with a Resolver](/resolvers/interacting) section. 39 | 40 | ## Offchain Resolution 41 | 42 | Although by default ENS resolution is done on-chain. You can leverage the power of CCIP Read to redirect resolution to an off-chain gateway. 43 | More about writing a ccip-enabled resolver [here](/resolvers/ccip-read). 44 | -------------------------------------------------------------------------------- /docs/learn/deployments.mdx: -------------------------------------------------------------------------------- 1 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 2 | export const meta = { 3 | description: 'ENS is multichain, but it all starts with Ethereum Mainnet. This page contains common addresses for ENS contracts.', 4 | emoji: '📰', 5 | contributors: [ 6 | 'luc.eth' 7 | ] 8 | }; 9 | 10 | # Deployments 11 | 12 | {/* 13 | This page contains information that is only relevant to developers who would 14 | like to interact with the contract manually. Most libraries will handle this 15 | for you. 16 | */} 17 | 18 | ENS is multichain (read more [here](/web/multichain)) and can be used in any application. 19 | In addition to being able to query many address formats and record types, data can be stored [practically anywhere](/learn/ccip-read). 20 | However, resolution needs to start somewhere, so the entrypoint for resolution is Ethereum Mainnet, alongside the most popular testnets. 21 | 22 |
    23 |
    24 | Ethereum Mainnet 25 |
    26 |
    27 | -> 28 |
    29 |
    30 |
    31 | Optimism 32 |
    33 |
    34 | Arbitrum 35 |
    36 |
    37 | Offchain 38 |
    39 |
    40 | ... 41 |
    42 |
    43 |
    44 | 45 | ## Deployments 46 | 47 | Listed below you will find a list of latest deployments of registries, resolvers, and more. 48 | 49 | 50 | 51 | ## But what about multichain? {{ tag: "Multichain", title: "Multichain", id: "multichain" }} 52 | 53 | The ENS Protocol can be used on/for any chain! If you are building a dApp and want to use ENS you might have to add a [Mainnet RPC to your Wagmi config](/web/libraries). 54 | This allows tools like wagmi to access mainnet, and load ENS information! 55 | 56 | 61 | -------------------------------------------------------------------------------- /app/public/icons/legacy/logos/kotlin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /docs/resolvers/public.mdx: -------------------------------------------------------------------------------- 1 | import { WIP } from "@/components/wip/WIP"; 2 | 3 | {/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 4 | export const meta = { 5 | description: '', 6 | emoji: '🏛️', 7 | contributors: [] 8 | }; 9 | 10 | # Public Resolver 11 | 12 | {/* */} 13 | 14 | The public resolver is a general-purpose ENS resolver that is suitable for most user needs. It permits the owner of a name to update their records, includes permissions, and stores its data on layer-1 ethereum. 15 | 16 | Most ENS names registered through the ENS Manager will use the latest version of the public resolver by default. 17 | Names that resolve to a supported public resolver are editable from within the ENS Manager. 18 | 19 | ## Features 20 | 21 | The public resolver supports the following features: 22 | 23 | - [EIP-137](https://eips.ethereum.org/EIPS/eip-137) - Contract address interface (`addr()`) 24 | - [EIP-165](https://eips.ethereum.org/EIPS/eip-165) - Interface Detection (`supportsInterface()`) 25 | - [EIP-181](https://eips.ethereum.org/EIPS/eip-181) - Reverse Resolution (`name()`) 26 | - [EIP-205](https://eips.ethereum.org/EIPS/eip-205) - ABI Resolution for contracts (`ABI()`) 27 | - [EIP-619](https://eips.ethereum.org/EIPS/eip-619) - SECP256k1 public keys (`pubkey()`) 28 | - [EIP-634](https://eips.ethereum.org/EIPS/eip-634) - Text records (`text()`) 29 | - [EIP-1577](https://eips.ethereum.org/EIPS/eip-1577) - Content hash resolution (`contenthash()`) 30 | - [EIP-2304](https://eips.ethereum.org/EIPS/eip-2304) - Multicoin support (`addr()`) 31 | 32 | 33 | While the `PublicResolver` provides a convenient default implementation. 34 | Many versions & variations may exist, and it is therefore not recommended to 35 | hardcode any addresses. To ensure a safe implementation, always use the `supportsInterface()` method to check for the existence of a specific interface. 36 | See [Interacting with a Resolver](/resolvers/interacting) for how to do this. 37 | 38 | 39 | ## Permissions 40 | 41 | The public resolver supports the notion of a "owner" and "manager". 42 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: 🚚 Deploy 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | env: 9 | NODE_OPTIONS: "--max_old_space_size=8192" 10 | 11 | jobs: 12 | deploy: 13 | runs-on: ubuntu-20.04 14 | permissions: 15 | contents: write 16 | concurrency: 17 | group: ${{ github.workflow }}-${{ github.ref }} 18 | steps: 19 | - name: Checkout 20 | uses: actions/checkout@v3 21 | with: 22 | fetch-depth: 0 23 | 24 | - name: Install Tools & Dependencies 25 | uses: ./.github/actions/install 26 | 27 | - name: Build 28 | working-directory: ./app 29 | run: pnpm run build 30 | env: 31 | TALLY_API_KEY: ${{ secrets.TALLY_API_KEY }} 32 | 33 | - name: Cloudflare Pages Upload 34 | uses: cloudflare/pages-action@v1 35 | with: 36 | apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} 37 | accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} 38 | projectName: ens-docs 39 | branch: master 40 | directory: app/out 41 | # gitHubToken: ${{ secrets.GITHUB_TOKEN }} 42 | wranglerVersion: '3' 43 | 44 | - name: Edgeserver Upload 45 | uses: lvkdotsh/edgeserver-action@v0.1.2-pre.4 46 | with: 47 | app_id: "207908995888658940" 48 | server: https://api.edgeserver.io 49 | token: ${{ secrets.EDGESERVER_TOKEN }} 50 | directory: app/out 51 | 52 | - uses: oven-sh/setup-bun@v1 53 | 54 | - name: Install dependencies 55 | run: bun install 56 | working-directory: app/scripts 57 | shell: bash 58 | 59 | - name: Build search.json 60 | run: bun run build-search 61 | working-directory: app/scripts 62 | shell: bash 63 | 64 | - name: Index search.json 65 | shell: bash 66 | run: | 67 | curl --silent -X POST -H "Content-Type: application/json" -H "Authorization: Bearer ${{secrets.SEARCH_TOKEN}}" -d @app/out/search.json https://search.v3x.systems/indexes/ens-docs/documents?primaryKey=id 68 | -------------------------------------------------------------------------------- /docs/dao/proposals/4.3.mdx: -------------------------------------------------------------------------------- 1 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 2 | export const meta = { 3 | description: '', 4 | emoji: '📖', 5 | contributors: [], 6 | proposal: { 7 | discourse: '16824', 8 | tally: '87741894125754523615596264728611635516467361279764827076788536604061840625452', 9 | type: 'executable' 10 | } 11 | }; 12 | 13 | # [EP4.3] [Executable] Refund Invalid .eth Names 14 | 15 | This proposal initiates a transfer of 117 ETH to the Meta-Governance Working Group to facilitate the refunding of .eth names invalidated by ENSIP-15, the latest ENS name normalization standard. 16 | 17 | ## Specification 18 | 19 | ENSIP-15 introduced a new ENS name normalization standard, resulting in the invalidation of a set of .eth names. In order to address the impact on owners of these invalidated names, refund amounts have been determined based on the following factors: 20 | 21 | 1. Remaining registration fee or renewal fee 22 | 2. Gas fees paid to register the name 23 | 3. Any premium protocol fee paid to acquire the names 24 | 25 | These factors together have been used to calculate the refund amounts. A total of 2,973 unique addresses will be refunded a total of approximately 115 ETH. 26 | 27 | Note: The data is from June 18, 2023 when ENSIP-15 passed. The [distributions](https://docs.google.com/spreadsheets/d/1JoLq8obUwFu_xGaXRMslAyX6nwR3njXqIc7I9sizTLU/edit?usp=sharing) and [code](https://github.com/ensdomains/normalise-refund) are both open source. 28 | 29 | To facilitate the transfer of refunds to the affected addresses, this proposal suggests transferring the necessary ETH amount, including gas fees, to the Meta-Governance multisig. The multisig will then execute the refunds on behalf of the ENS DAO and return any leftover gas funds, if applicable. 30 | 31 | ## Transactions 32 | 33 | | Address | Value | Function | Argument | Value | 34 | | ------------------------------------------ | ------- | -------- | -------- | ----- | 35 | | 0x91c32893216dE3eA0a55ABb9851f581d4503d39b | 117 ETH | | | | 36 | -------------------------------------------------------------------------------- /app/src/components/icons/CogIcon.tsx: -------------------------------------------------------------------------------- 1 | export const CogIcon = (properties) => { 2 | return ( 3 | 18 | ); 19 | }; 20 | -------------------------------------------------------------------------------- /app/public/content/dao/governance/executable-proposal-template.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: A short (1-2 sentence) description of the proposal. 3 | --- 4 | 5 | # [Executable] Proposal Title 6 | 7 | | **Status** | Pending | 8 | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | 9 | | **Discussion Thread** | [Discuss](https://discuss.ens.domains/t/...) | 10 | | **Votes** | Pending | 11 | 12 | ## Abstract 13 | 14 | 19 | 20 | ## Specification 21 | 22 | 25 | 26 | ## Transactions 27 | 28 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 |
    AddressValueFunctionArgumentValue
    Address or ENS name of targetValue to send (ETH)Function identifierFirst argFirst value
    Second argSecond value
    52 | -------------------------------------------------------------------------------- /docs/web/multichain.mdx: -------------------------------------------------------------------------------- 1 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 2 | export const meta = { 3 | description: '', 4 | emoji: '⛓️', 5 | contributors: [ 6 | 'luc.eth' 7 | ] 8 | }; 9 | 10 | # Multichain 11 | 12 |
    13 | "the future is multichain" 14 |
    15 | 16 | ## ENS L2 17 | 18 | The ENS Labs team recently announced our plans and roadmap for scaling ENS to the entire internet and beyond. 19 | You can read more [on our blog](https://blog.ens.domains/post/ensv2), [on X](https://twitter.com/ensdomains/status/1795440186513576318), and [the forums](https://discuss.ens.domains/t/technical-feedback-thread-for-ensv2/19233). 20 | The roadmap involves migrating .eth registrations to a new system, in addition to improved support for existing L2 solutions. 21 | You can findout more on the [changelog](/changelog). 22 | 23 | ## But isn't ENS on mainnet? {{ label: "ENS Multichain", navtitle: "Resolution" }} 24 | 25 | Yes, technically. The resolution process always starts on mainnet. There needs to be, one source of truth after all. However, the name 26 | resolution process can branch off to other chains, offchain gateways and much more.
    27 | To read a more indepth explanation of how resolution works, checkout the [section dedicated to the Resolution Process](/resolution/). 28 | 29 | ## My dapp is on X but I want ENS {{ label: "dApp Multichain", navtitle: "dApps on other Chains" }} 30 | 31 | The ENS Protocol can be used on/for any chain! 32 | If you are building a non-mainnet dApp and want to use ENS names simply [add a Mainnet RPC to your Wagmi config](/web/libraries) and specify `chainId: 1` in your config like so: 33 | 34 | ```tsx focus=6 35 | import { useAccount, useEnsName, useEnsAvatar } from 'wagmi'; 36 | 37 | const Name = () => { 38 | const { data: ensName } = useEnsAddress({ 39 | address: 'luc.eth', 40 | chainId: 1, // (1 = Ethereum, 11155111 = Sepolia) 41 | }); 42 | 43 | return
    {ensName || address}
    ; 44 | }; 45 | ``` 46 | 47 | And voila! You can now resolve ENS names anywhere! 🎉 48 | -------------------------------------------------------------------------------- /docs/learn/dns.mdx: -------------------------------------------------------------------------------- 1 | {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} 2 | export const meta = { 3 | description: '', 4 | emoji: '🌐', 5 | contributors: [ 6 | 'luc.eth' 7 | ] 8 | }; 9 | 10 | # DNS on ENS 11 | 12 | <> 13 | {/*TODO: User-friendly explanation of the fact that DNS names also work in the ENS system.*/} 14 | 15 | 16 | The Ethereum Name Service is so much more then just `.eth` names. It is a general-purpose naming system that can be used for any kind of name. This includes DNS names. 17 | DNS functionality was originally introduced in [ENSIP-6](/ensip/6). 18 | 19 | ## Importing a DNS name 20 | 21 | There are currently two ways of importing a DNS name into ENS. Both methods require you enable DNSSEC on your domain, and setup a TXT record. 22 | This record is then verified using smart-contracts on the Ethereum blockchain. 23 | 24 | To import a name, simply visit the [ENS Manager](https://ens.app), type in your name, and click "Import DNS". You will walked through setting up your DNS records. 25 | Additionally you can read more about the records and specifications here: 26 | 27 | 31 | 32 | ## Why DNS on ENS? 33 | 34 | ENS aims to extend the existing functionality of the DNS system. This also means that existing DNS names (such as `.com`, `.org`, or `.xyz`) should be able to leverage the benefits of the ENS resolution process. 35 | 36 | 37 | 38 | ## DNS Names in the wild 39 | 40 | DNS names are widely used and many users may already have one without even realizing it. Some major platforms that issue subdomains of their DNS names include: 41 | 42 | 43 | 44 | ## Top-Level Domains 45 | 46 | In addition to allowing any DNSSEC enabled name to be imported, ENS also allows existing DNS TLDs to take control of their smart-contract resolution process. 47 | Resulting in even more seamless integration with the DNS system. 48 | 49 | A list of all supported TLDs can be found [here](/dns/tlds) 50 | 51 | <>{/* TODO: Insert examples of protocol.art .kred etc */} 52 | --------------------------------------------------------------------------------