<aside> <img src="https://prod-files-secure.s3.us-west-2.amazonaws.com/5daf3b41-07be-47c5-ade9-fed18156fd7f/55a71b99-1ca1-436f-b60c-35296ad6abfc/ens_mark_primary.svg" alt="https://prod-files-secure.s3.us-west-2.amazonaws.com/5daf3b41-07be-47c5-ade9-fed18156fd7f/55a71b99-1ca1-436f-b60c-35296ad6abfc/ens_mark_primary.svg" width="40px" /> What is ENS? ENS (Ethereum Name Service) is the de facto decentralized, permissionless naming protocol that lives on Ethereum and scales to the entire internet.

</aside>

<aside> πŸ“’ Workshops

workshop.png

</aside>

<aside> ❓ Have Questions? We’re here to help

Come to our booth located by the main stage Or ask in the Discord channel #partner-ens Or reach out to Greg on Telegram @gregskril

</aside>

<aside> πŸ”‘ **Key Concepts

Forward resolution** (aka Address Lookup) - resolving any crypto address (ETH, Base, BTC, etc.) by a human readable name. So gregskril.eth β†’ 0x179A862703a4adfb29896552DF9e307980D19285. Any number of names can resolve to the same address.

Reverse resolution (aka Name Lookup) - resolving a human readable name by ETH address. So 0x179A862703a4adfb29896552DF9e307980D19285 β†’ gregskril.eth. In this example, gregskril.eth is considered 0x179...'s β€œPrimary Name”. An address can only have one Primary Name.

Text Records - arbitrary key:value storage attached to an ENS name, with some standards for things like avatar.

Resolvers - the smart contract standard that controls how ENS data (mainly addresses and text records) is fetched. They can read from internal contract storage on mainnet Ethereum, or defer storage to any L2/offchain data source using CCIP Read and Wildcard Resolution.

Subnames (aka subdomains) - children of a name (eg sub.ens.eth) which can be more flexible than second level names (eg ens.eth). These can exist on any L2/offchain data source using the same method as resolvers.

</aside>

Project Ideas

<aside> 🧠 **Project Ideas ($8k in prizes)

Default names with account abstraction** Smart contract wallets that creates a subname upon deployment so that users always have a name and never need to copy/paste a hex address.

Creative use cases for subnames An example is FluidKey, a subname system that resolves to a new stealth address on each resolution.

Unique use cases for text records Since text records can store any key:value pair, it works as any generic datastore!


β€”β€”β€”

We encourage teams to explore the EVMGateway for L2-related projects.

</aside>

<aside> πŸ‘¨β€πŸ’» **Contribution to open source libraries ($2k in prizes)

EVM Gateway (Solidity and Typescript)** The EVM Gateway is a framework for fetching and verifying L2 data from L1. It currently supports OP Stack and Arbitrum, but we’d love to PRs that add support for other rollups!

web3.py (Python) Fix CCIP Read support

web3.js (Typescript) Add CCIP Read / Wildcard Resolution support

KEthereum (Kotlin) Add CCIP Read / Wildcard Resolution support

ENSKit (Swift) Add CCIP Read / Wildcard Resolution support

</aside>

<aside> ⏭️ Address Lookup (see useEnsAddress)

</aside>

import { useEnsAddress } from 'wagmi'
import { normalize } from 'viem/ens'

function App() {
  const { data: ensAddress, isLoading } = useEnsAddress({
    name: normalize('luc.eth'),
    chainId: 1
  })

	if (isLoading) return <div>loading...</div>;
  return <div>Your address is {ensAddress}</div>
}

<aside> βͺ Name Lookup (see useEnsName)

</aside>

import { useEnsName } from 'wagmi'

function App() {
  const { data: ensName, isLoading } = useEnsName({
    address: '0x225f137127d9067788314bc7fcc1f36746a3c3B5',
    chainId: 1
  })

	if (isLoading) return <div>loading...</div>
  return <div>🫑 Gm {ensName}!</div>
}

<aside> <img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/b7e5fb02-a62c-44f9-bb31-1443ac05c6c8/pfp.png" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/b7e5fb02-a62c-44f9-bb31-1443ac05c6c8/pfp.png" width="40px" /> Avatars (see useEnsAvatar)

</aside>

import { useEnsName } from 'wagmi'
import { normalize } from 'viem/ens'

function Avatar() {
  const { data: ensAvatar } = useEnsAvatar({
    name: normalize('luc.eth'),
    chainId: 1
  })

	if (!ensAvatar) return <div className="w-32 rounded-full bg-blue-500" />
  return <img src={ensAvatar} className="w-32 rounded-full" />
}

<aside> πŸ““ Text Records (see useEnsText)

</aside>

import { useEnsText } from 'wagmi'
import { normalize } from 'viem/ens'

function Avatar() {
  const { data: ensTwitter } = useEnsText({
    name: normalize('luc.eth'),
    key: 'com.twitter',
    chainId: 1
  })

	if (!ensTwitter) return <div className="w-32 rounded-full bg-blue-500" />;
  return <img src={ens} className="w-32 rounded-full" />
}

<aside> πŸ€“ **Tutorials

🌐 I am building a dApp** When building a dApp we highly recommend you take a look at our frontend-starter template to kickstart your dApp development journey. If you’re using a different stack, wagmi, viem, ethers, web3js, and many more come with ENS support built-in! πŸ› οΈ This saves you tons of work and lets you use the libraries native ENS tooling!

πŸ“œ I am building a Contract Every smart contract should have an ENS name. It lets users see what contract they are interacting with. Learn more about how to give you contract a name.

</aside>

<aside> 🌍 Ecosystem If you are interested in continuing to build in the ENS ecosystem, ask Greg to add you to the ENS Developers group chat.

</aside>

<aside> πŸ“š Resources Docs | FAQ | Github | Twitter | App

</aside>

<aside> ❓ Questions & Support Discord | Support

</aside>