diff --git a/app/.prettierrc b/app/.prettierrc index 97313f17..d681759c 100644 --- a/app/.prettierrc +++ b/app/.prettierrc @@ -1,5 +1,6 @@ { "tabWidth": 4, "useTabs": false, - "singleQuote": true + "singleQuote": true, + "trailingComma": "es5" } diff --git a/app/app/theme.tsx b/app/app/theme.tsx index 63294704..c7808c5a 100644 --- a/app/app/theme.tsx +++ b/app/app/theme.tsx @@ -4,7 +4,13 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { ThemeProvider } from 'next-themes'; import { useEffect } from 'react'; import { holesky, mainnet, sepolia } from 'viem/chains'; -import { createConfig, http, WagmiProvider } from 'wagmi'; +import { + createConfig, + http, + useAccount, + useConfig, + WagmiProvider, +} from 'wagmi'; import { injected, walletConnect } from 'wagmi/connectors'; const config = createConfig({ @@ -30,6 +36,8 @@ const config = createConfig({ }); declare module 'wagmi' { + // @ts-ignore + // eslint-disable-next-line unused-imports/no-unused-vars interface Register { config: typeof config; } @@ -38,19 +46,29 @@ declare module 'wagmi' { const queryClient = new QueryClient(); export const Theme = ({ children }) => { - useEffect(() => { - (async () => { - const { setupConfig } = await import('@ens-tools/thorin-core'); - - setupConfig(() => config as any); - })(); - }, []); - return ( - {children} + + {children} + + ); }; + +export const WagmiChild = () => { + const state = useConfig(); + const { address, connector } = useAccount(); + + useEffect(() => { + (async () => { + const { setupConfig } = await import('@ens-tools/thorin-core'); + + setupConfig(() => state || config); + })(); + }, [state, address, connector]); + + return <>; +}; diff --git a/app/local/config/navigation/protocol.ts b/app/local/config/navigation/protocol.ts index 887dee8d..ecd8d157 100644 --- a/app/local/config/navigation/protocol.ts +++ b/app/local/config/navigation/protocol.ts @@ -405,10 +405,31 @@ export const navigation: SectionData[] = [ { title: 'Proposals Term 5', links: [ + { + title: '5.27 - [Executable] Revoke the DAO’s ability to upgrade the name wrapper', + href: '/dao/proposals/5.27', + }, + { + title: '5.26 - [Executable] Implementation of [EP 5.19]’s ENS Governance Distribution Pilot Program', + href: '/dao/proposals/5.26', + }, + { + title: '5.25 - [Executable] Collective Working Group Funding Request (Oct 2024) - Resubmission', + href: '/dao/proposals/5.25', + }, { title: '5.24 - [Executable] Term 5 Q4, Collective Working Group Funding Proposal', href: '/dao/proposals/5.24', }, + { + // eslint-disable-next-line quotes + title: "5.23 - [Executable] blockful's governance security bounty", + href: '/dao/proposals/5.23', + }, + { + title: '5.22 - [Executable] ENSv2 Development Funding', + href: '/dao/proposals/5.22', + }, { title: '5.21 - [Social] Governance Security Bounty', href: '/dao/proposals/5.21', diff --git a/app/local/content/demos/ethregistry/ETHRegistryDemo.tsx b/app/local/content/demos/ethregistry/ETHRegistryDemo.tsx index 890a0070..3937e3ae 100644 --- a/app/local/content/demos/ethregistry/ETHRegistryDemo.tsx +++ b/app/local/content/demos/ethregistry/ETHRegistryDemo.tsx @@ -30,7 +30,7 @@ const Demo = () => { '0x225f137127d9067788314bc7fcc1f36746a3c3B5' ); const [resolver, setResolver] = useState( - '0x225f137127d9067788314bc7fcc1f36746a3c3B5' + '0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63' ); const [duration, setDuration] = useState(60 * 60 * 24 * 365); const [secret, setSecret] = useState( diff --git a/app/local/data/resolver.tsx b/app/local/data/resolver.tsx index 1f91b447..5f87ff87 100644 --- a/app/local/data/resolver.tsx +++ b/app/local/data/resolver.tsx @@ -2,24 +2,6 @@ import { CodeGroup } from '../content/prose/code/group/CodeGroup'; import { ContractMethod } from './interfaces'; -export const PUBLIC_RESOLVER_SUPPORTS = [ - // 'addr', - // 'addr.reverse', - // 'contenthash', - // 'contenthash.set', - // 'multicoin', - // 'multicoin.set', - // 'text', - // 'text.set', - // 'ABI', - // 'ABI.set', - // 'pubkey', - // 'pubkey.set', - // 'name', - // 'name.set', - // 'multicall', -]; - export const resolver_methods: ContractMethod[] = [ { name: 'supportsInterface(bytes4 interfaceID) external pure returns (bool)', @@ -162,7 +144,7 @@ export const resolver_methods: ContractMethod[] = [ name: 'pubkey(bytes32 node) view returns (bytes32 x, bytes32 y)', interface: '0xc8690233', usage: 'Read Public Key', - seeMore: 'ENSIP- / EIP-619', + seeMore: '', input: [ { name: 'node', @@ -197,6 +179,21 @@ export const resolver_methods: ContractMethod[] = [ }, ], }, + { + name: 'resolve(bytes memory name, bytes memory data) view returns (bytes memory)', + interface: '0x9061b923', + usage: 'Wildcard Resolution', + seeMore: 'ENSIP-10', + input: [ + { name: 'name', type: 'bytes', description: 'DNS-encoded name' }, + { + name: 'data', + type: 'bytes', + description: + 'Encoded function data for other resolver calls like addr(), text(), etc.', + }, + ], + }, { name: 'setAddr(bytes32 node, address a)', interface: '0xd5fa2b00', diff --git a/app/package.json b/app/package.json index 09006646..9187286c 100644 --- a/app/package.json +++ b/app/package.json @@ -12,7 +12,7 @@ "browserslist": "defaults, not ie <= 11", "dependencies": { "@ens-tools/format": "^0.0.2", - "@ens-tools/thorin-core": "0.0.5", + "@ens-tools/thorin-core": "0.1.4-1", "@ensdomains/thorin": "1.0.0-beta.9", "@headlessui/react": "^1.7.18", "@mdx-js/loader": "^3.0.0", diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml index c0413235..b251bea6 100644 --- a/app/pnpm-lock.yaml +++ b/app/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^0.0.2 version: 0.0.2 '@ens-tools/thorin-core': - specifier: 0.0.5 - version: 0.0.5(xqiju3h3eq44wukvwi6pqup5mi) + specifier: 0.1.4-1 + version: 0.1.4-1(fg6tno6dxbhiiz7flp6ucdbniu) '@ensdomains/thorin': specifier: 1.0.0-beta.9 version: 1.0.0-beta.9(@vanilla-extract/css@1.15.5(babel-plugin-macros@3.1.0))(@vanilla-extract/dynamic@2.1.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1012,12 +1012,13 @@ packages: '@ens-tools/format@0.0.3': resolution: {integrity: sha512-uq9XsSPp1hFeHuWF+Hn1GlMU9dXl+3gsgnoJf9JaPZucg53Qn5e9FgysN/zCFh8JV5xRbjTcSzr65ajd8sywYg==} - '@ens-tools/thorin-core@0.0.5': - resolution: {integrity: sha512-qkgJsgIOf7PyvCejOpSGS6z3M3a4tHc6GuTN2y+NZoCNi/h8AFMMfEbAU0+pJDcyzW01yW1fB1Leeh8n1z6PsQ==} + '@ens-tools/thorin-core@0.1.4-1': + resolution: {integrity: sha512-29wcAXJKUv5xdOjrfSj+MvUiOvwNUPiynLSvDCvn/rA4JRVlBnlT3RZJCMP8XzYtG+WPbDylUeKTiMa5wuJJdw==} peerDependencies: '@wagmi/connectors': ^4.1.14 '@wagmi/core': ^2.6.5 viem: 2.x + wagmi: ^2.12.25 '@ensdomains/thorin@1.0.0-beta.9': resolution: {integrity: sha512-n+4tZvTt5GtpG3GOZ4RyKpmoHKp1L3TYgOPVUKmDJKWxsqcAPzp54S23klYePadTlP9E+tGGyGRSpC3DOVI4PQ==} @@ -2286,6 +2287,7 @@ packages: acorn-import-assertions@1.9.0: resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + deprecated: package has been renamed to acorn-import-attributes peerDependencies: acorn: ^8 @@ -2821,8 +2823,8 @@ packages: cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} crossws@0.1.1: @@ -3183,6 +3185,9 @@ packages: elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + elliptic@6.5.7: + resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -5069,8 +5074,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -5910,6 +5915,9 @@ packages: rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -5956,9 +5964,9 @@ packages: scrypt-js@3.0.1: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - secp256k1@5.0.0: - resolution: {integrity: sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==} - engines: {node: '>=14.0.0'} + secp256k1@5.0.1: + resolution: {integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==} + engines: {node: '>=18.0.0'} secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} @@ -6406,6 +6414,9 @@ packages: ts-pattern@4.3.0: resolution: {integrity: sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==} + ts-pattern@5.5.0: + resolution: {integrity: sha512-jqbIpTsa/KKTJYWgPNsFNbLVpwCgzXfFJ1ukNn4I8hMwyQzHMJnk/BqWzggB0xpkILuKzaO/aMYhS0SkaJyKXg==} + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -7957,7 +7968,7 @@ snapshots: '@ens-tools/format@0.0.3': {} - '@ens-tools/thorin-core@0.0.5(xqiju3h3eq44wukvwi6pqup5mi)': + '@ens-tools/thorin-core@0.1.4-1(fg6tno6dxbhiiz7flp6ucdbniu)': dependencies: '@ens-tools/format': 0.0.3 '@rollup/plugin-commonjs': 25.0.7(rollup@4.11.0) @@ -7966,7 +7977,10 @@ snapshots: '@wagmi/core': 2.6.4(@tanstack/query-core@5.18.1)(@types/react@18.2.55)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.3.3)(viem@2.7.8(bufferutil@4.0.8)(typescript@5.3.3)(zod@3.22.4))(zod@3.22.4) lit: 3.1.2 rollup-plugin-peer-deps-external: 2.2.4(rollup@4.11.0) + rxjs: 7.8.1 + ts-pattern: 5.5.0 viem: 2.7.8(bufferutil@4.0.8)(typescript@5.3.3)(zod@3.22.4) + wagmi: 2.5.6(@react-native-async-storage/async-storage@1.21.0(react-native@0.73.4(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)))(@tanstack/query-core@5.18.1)(@tanstack/react-query@5.18.1(react@18.2.0))(@types/react@18.2.55)(bufferutil@4.0.8)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react-native@0.73.4(@babel/core@7.23.9)(@babel/preset-env@7.23.9(@babel/core@7.23.9))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0))(react@18.2.0)(rollup@4.11.0)(typescript@5.3.3)(viem@2.7.8(bufferutil@4.0.8)(typescript@5.3.3)(zod@3.22.4))(zod@3.22.4) webcomponent-qr-code: 1.2.0 transitivePeerDependencies: - rollup @@ -10662,7 +10676,7 @@ snapshots: transitivePeerDependencies: - encoding - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -11001,7 +11015,7 @@ snapshots: dependencies: '@types/secp256k1': 4.0.6 futoin-hkdf: 1.5.3 - secp256k1: 5.0.0 + secp256k1: 5.0.1 ee-first@1.1.1: {} @@ -11019,6 +11033,16 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + elliptic@6.5.7: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -11209,7 +11233,7 @@ snapshots: debug: 4.3.4(supports-color@5.5.0) enhanced-resolve: 5.15.0 eslint: 8.56.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0))(eslint@8.56.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) fast-glob: 3.3.2 get-tsconfig: 4.7.2 @@ -11221,7 +11245,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0))(eslint@8.56.0): + eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -11242,7 +11266,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0))(eslint@8.56.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -11413,7 +11437,7 @@ snapshots: '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 debug: 4.3.4(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 @@ -11598,7 +11622,7 @@ snapshots: execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -11610,7 +11634,7 @@ snapshots: execa@8.0.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -11744,7 +11768,7 @@ snapshots: foreground-child@3.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 fraction.js@4.3.7: {} @@ -13872,7 +13896,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.7: {} + nanoid@3.3.8: {} natural-compare@1.4.0: {} @@ -14313,13 +14337,13 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.0.0 source-map-js: 1.0.2 postcss@8.4.35: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.0.0 source-map-js: 1.0.2 @@ -14853,6 +14877,10 @@ snapshots: rw@1.3.3: {} + rxjs@7.8.1: + dependencies: + tslib: 2.6.2 + sade@1.8.1: dependencies: mri: 1.2.0 @@ -14902,9 +14930,9 @@ snapshots: scrypt-js@3.0.1: {} - secp256k1@5.0.0: + secp256k1@5.0.1: dependencies: - elliptic: 6.5.4 + elliptic: 6.5.7 node-addon-api: 5.1.0 node-gyp-build: 4.8.0 @@ -15399,6 +15427,8 @@ snapshots: ts-pattern@4.3.0: {} + ts-pattern@5.5.0: {} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 diff --git a/app/public/fallback-avatar.svg b/app/public/fallback-avatar.svg new file mode 100644 index 00000000..0f1ed580 --- /dev/null +++ b/app/public/fallback-avatar.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/src/components/mdx/Avatar.tsx b/app/src/components/mdx/Avatar.tsx new file mode 100644 index 00000000..5ff9c64d --- /dev/null +++ b/app/src/components/mdx/Avatar.tsx @@ -0,0 +1,26 @@ +'use client'; + +import clsx from 'clsx'; +import { useEnsAvatar } from 'wagmi'; + +type Properties = { + name: string; + width: number; + rounded?: boolean; +}; + +export function Avatar({ name, width, rounded }: Properties) { + const { data: ensAvatar } = useEnsAvatar({ name, chainId: 1 }); + + return ( + {name} + ); +} diff --git a/docs/dao/proposals/5.22.mdx b/docs/dao/proposals/5.22.mdx new file mode 100644 index 00000000..cfa76246 --- /dev/null +++ b/docs/dao/proposals/5.22.mdx @@ -0,0 +1,34 @@ +{/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} +export const meta = { + description: 'This proposal seeks to implement the revised budget stream to ENS Labs to develop, maintain and audit ENSv2.', + emoji: '📖', + contributors: [ + 'katherine.eth' + ], + proposal: { + tally: '33504840096777976512510989921427323867039135570342563123194157971712476988820', + type: 'executable' + } +}; + +# [EP 5.22] [Executable] ENSv2 Development Funding + +## Summary + +This executable proposal seeks to implement the revised budget stream to ENS Labs develop, maintain and audit [ENSv2](https://discuss.ens.domains/t/ens-labs-development-proposal-ensv2-and-native-l2-support/19232). The motivation, justification, budget breakdown, and development plan was previously detailed in a [Temp Check](https://discuss.ens.domains/t/temp-check-ensv2-development-funding-request/19762) request. + +## Background + +With over 3 million .eth names and 20 million more ENS names registered by the likes of Coinbase, Uniswap, and Linea – ENS has become the standard for web3 identity. As Ethereum's roadmap evolves towards being rollup-centric, it's essential for ENS to adapt in parallel, ensuring it meets the needs of both the Ethereum ecosystem and its users. + +To continue scaling and evolving ENS, ENS Labs is requesting an increase in its annual budget from $4.2M USDC to $9.7M USDC, and a one-time grant for future security audits of ENSv2. This revised funding is necessary for ENS Labs to develop, maintain, and audit ENSv2, a major upgrade that will enhance decentralization, flexibility, and scalability by leveraging Layer 2 solutions and redesigning the ENS protocol from the ground up. + +### Links + +- [\[Temp Check\] ENSv2 Development Funding Request](https://discuss.ens.domains/t/temp-check-ensv2-development-funding-request/19762) +- [ENS Labs development proposal: ENSv2 and native L2 support](https://discuss.ens.domains/t/ens-labs-development-proposal-ensv2-and-native-l2-support/19232) +- [ENS Labs Transparency Reports](https://discuss.ens.domains/t/ens-labs-transparency-reports/19806) + +## Specification + +This executable proposal will initiate a new daily stream of 15,075.33 USDC from the ENS DAO treasury to ENS Labs, starting on January 1, 2025\. This will run in addition to the existing streaming contract of 11,500 USDC/day at 0xB1377e4f32e6746444970823D5506F98f5A04201, for a total of 26,575.34 USDC/day ($9.7M USDC/year). diff --git a/docs/dao/proposals/5.23.mdx b/docs/dao/proposals/5.23.mdx new file mode 100644 index 00000000..bfba22c4 --- /dev/null +++ b/docs/dao/proposals/5.23.mdx @@ -0,0 +1,80 @@ +export const meta = { + description: + "This proposal aims to compensate the blockful team for their work in identifying, analyzing, reporting and mitigating a severe vulnerability in ENS DAO's governance structure.", + emoji: '📖', + contributors: ['netto.eth'], + proposal: { + tally: + '46071186312489687574960948336391811341595411932836110873328798657006776570015', + type: 'executable', + }, +} + +# [EP 5.23] [Executable] blockful's governance security bounty + +## Summary + +This proposal aims to compensate the blockful team for their work in identifying, analyzing, reporting and mitigating a severe vulnerability in ENS DAO's governance structure. + +## Background + +In March 2024, blockful uncovered a critical vulnerability that could have led to a [~$150M](https://dune.com/steakhouse/ens-steakhouse) theft and protocol capture. Their subsequent work led to the implementation of the Security Council, +significantly enhancing ENS DAO's resilience against attacks. + +## Contribution Details + +The team involved is a [different](https://discuss.ens.domains/t/blockful-service-provider-reports/19553#p-54163-other-contributions-not-related-to-service-provider-scope-14) squad than the one working on the scope of the [ENS service provider](https://discuss.ens.domains/t/blockful-service-provider-reports/19553). It was developed by 2 researchers, +1 smart contract engineer and 4 different auditors the team has worked with previously. Summing up to ~600 hours, +the scope includes: + +- Comprehensive vulnerability assessment and risk analysis: **[Here](https://mirror.xyz/research.blockful.eth/-PfMduhpxdypPrutofr6099T4ROpsAmX0fPNbvDgR_k)** is our detailed security report. + +- Data analysis of ENS governance metrics and study of past DAO attacker's behaviors. + +- Design, development and deployment of the Security Council contract and multisig. + +- The Security Council was thought with several key features to balance security and decentralization. + +- Smart contract implementation and testing ([GitHub](https://github.com/blockful-io/security-council-ens)) +- Governance proposal drafting and support [[1](https://snapshot.org/#/ens.eth/proposal/0xf3a4673fe04a3ecfed4a2f066f6ced1539a5466d61630428333360b843653c54), [2](https://snapshot.org/#/ens.eth/proposal/0xa0b1bfadf6853b5b0d59d3c4d73c434fc6389339887d05de805361372eb17c3a), [3](https://www.tally.xyz/gov/ens/proposal/42329103797433777309488042029679811802172320979541414683300183273376839219133)] + +More details can be found on the links above for past proposals and the [report](https://mirror.xyz/research.blockful.eth/-PfMduhpxdypPrutofr6099T4ROpsAmX0fPNbvDgR_k). + +## Compensation Rationale + +As a team that is totally bootstrapped and never received any investment, this support us to keep it sustainable with the resources invested towards this initiative. The requested amount represents fair compensation for: + +- The potential loss prevention of ~$150M, capture of the DAO and protocol. The attack is anything but theoretical and there are actually many groups of investors who specialize in "risk free value raiders". They have exerted the attack on other DAOs before. Currently there are [unknown whales](https://etherscan.io/address/0x245445940b317e509002eb682e03f4429184059d#tokentxns) buying ENS for +450 days and have ~2M ENS, showing how feasible the scenario is, more than the average quorum, in one wallet. + +- A critical code bug bounty in [ENS is $250k USDC](https://immunefi.com/bug-bounty/ens/scope/#assets). Our work was much beyond identifying and disclosing. + +- Significantly lower cost compared to standard rates charged by other security service providers in the DAO space, + which typically demand liquid compensation. An example is that Open Zeppelin (one of the most reputable players in security) [charges $4M/year at Compound](https://compound.finance/governance/proposals/76), + which recently [suffered](https://mirror.xyz/research.blockful.eth/v0GEP49oXP1gzMDlyP91-S4XIa8PIOd0vKq-6R8f54I) this type of attack. + +- Months of dedicated work by the team involved (researchers, devs and auditors). + +- The long-term value added to ENS through enhanced security. + +- Our commitment to ENS's long-term success and continued contribution, as evidenced by the 2-year vesting schedule. + +## Compensation Structure + +- Total amount: 100k USDC + 15k vested ENS tokens +- Vesting period: 2 years +- Vesting start date: April 8 2024 (date of initial research disclosure) +- Vesting schedule: Linear vesting +- Will be sent to the meta-governance multisig transferred and vested to blockful. + +## Benefits to ENS DAO + +- Sets a positive precedent that **responsible vulnerability disclosure and correction are rewarded**, + encouraging future security contributions + +- Preserves DAO treasury liquidity by using part of the bounty in ENS tokens instead of USDC or ETH + +- Enhances governance security by increasing the number of engaged security-focused token holders + +## Conclusion + +By approving this compensation, ENS DAO acknowledges the critical importance of security research and proactive governance improvements. The vesting structure ensures ongoing commitment and aligns incentives for continued contribution to ENS's security and stability. diff --git a/docs/dao/proposals/5.25.mdx b/docs/dao/proposals/5.25.mdx new file mode 100644 index 00000000..f26bbb1b --- /dev/null +++ b/docs/dao/proposals/5.25.mdx @@ -0,0 +1,108 @@ +export const meta = { + description: + 'This is a resubmission of EP 5.24, with no changes to the funding amounts or technical specifications.', + emoji: '📖', + contributors: ['5pence.eth'], + proposal: { + tally: + '14573906698181916980991958251655570598275649222336388998984945658874299918898', + type: 'executable', + }, +} + +# [EP 5.25] [Executable] Collective Working Group Funding Request (Oct 2024) - Resubmission + +## Description + +This is a resubmission of [EP 5.24], with no changes to the funding amounts or technical specifications. + +## Abstract + +This proposal executes all three Working Group funding requests for the October 2024 funding window as passed in [EP 5.17.1](https://discuss.ens.domains/t/5-17-1-social-funding-request-ens-meta-governance-working-group-term-5-oct-window/19677), [EP 5.17.2](https://discuss.ens.domains/t/5-17-2-social-funding-request-ens-ecosystem-working-group/19678), and [EP 5.17.3](https://discuss.ens.domains/t/5-17-3-social-funding-request-ens-public-goods-working-group/19679). For more detail, view the ENS Governance docs at https://basics.ensdao.org/funding-requests + +## Proposal Components + +--- + +### 1) [Meta-governance Funding Request [EP 5.17.1]](https://discuss.ens.domains/t/5-17-1-social-funding-request-ens-meta-governance-working-group-term-5-oct-window/19677) + +The Meta-governance Working Group requests funding to fulfill anticipated budgetary needs through the next formal funding window in April 2025. + +| Destination | USDC | ETH | $ENS | +| :---------------------------------------------------------------------------------------------------- | :-----: | :-: | :--: | +| [ENS Meta-Gov Main Multisig](https://etherscan.io/address/0x91c32893216dE3eA0a55ABb9851f581d4503d39b) | 254,000 | 0 | 0 | + +This amount will cover all expected expenses while maintaining a 100,000 USDC prudent reserve to ensure continuity if future funding is delayed. + +--- + +### 2) [Ecosystem Funding Request [EP 5.17.2]](https://discuss.ens.domains/t/5-17-2-social-funding-request-ens-ecosystem-working-group/19678) + +The ENS Ecosystem Working Group requests funding to support operations through April 2025. This is the only funding request of Term 5. The working group is responsible for growing and improving the ENS Ecosystem by funding builders and projects that are ENS-specific or ENS-centric. + +| Destination | USDC | ETH | $ENS | +| :----------------------------------------------------------------------------------------------------- | :-----: | :-: | :--: | +| [ENS Ecosystem Main Multisig](https://etherscan.io/address/0x2686a8919df194aa7673244549e68d42c1685d03) | 836,000 | 0 | 0 | + +--- + +### 3) [Public Goods Funding Request [EP 5.17.3]](https://discuss.ens.domains/t/5-17-3-social-funding-request-ens-public-goods-working-group/19679) + +The ENS Public Goods Working Group requests funding to support operations through the next funding window in April 2025. The funds requested extend current needs through to next term to ensure that next season's stewards have available funding before the next funding window. + +| Destination | USDC | ETH | $ENS | +| :---------------------------------------------------------------------------------------------------- | :-----: | :-: | :--: | +| [Public Goods Main Multisig](https://etherscan.io/address/0xcD42b4c4D102cc22864e3A1341Bb0529c17fD87d) | 226,000 | 0 | 0 | + +--- + +## Specification + +The following transfers are to be made from the DAO treasury: + +1. Transfer 254,000 USDC to the Meta-governance safe: + + - Address: `0x91c32893216dE3eA0a55ABb9851f581d4503d39b` + +2. Transfer 836,000 USDC to the Ecosystem safe: + + - Address: `0x2686A8919Df194aA7673244549E68D42C1685d03` + +3. Transfer 226,000 USDC to the Public Goods safe: + - Address: `0xcD42b4c4D102cc22864e3A1341Bb0529c17fD87d` + +#### Total transfer amount: 1,316,000 USDC + +--- + +### Calldata: + +**5.17.1 Tx to Metagov** + +``` +{ + "target": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "value": 0, + "calldata": "0xa9059cbb00000000000000000000000091c32893216de3ea0a55abb9851f581d4503d39b0000000000000000000000000000000000000000000000000000003b23946c00" +} +``` + +**5.17.2 Tx to Ecosystem** + +``` +{ + "target": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "value": 0, + "calldata": "0xa9059cbb0000000000000000000000002686a8919df194aa7673244549e68d42c1685d03000000000000000000000000000000000000000000000000000000c2a57ba800" +} +``` + +**5.17.3 Tx to Public Goods** + +``` +{ + "target": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "value": 0, + "calldata": "0xa9059cbb000000000000000000000000cd42b4c4d102cc22864e3a1341bb0529c17fd87d000000000000000000000000000000000000000000000000000000349ea65400" +} +``` diff --git a/docs/dao/proposals/5.26.mdx b/docs/dao/proposals/5.26.mdx new file mode 100644 index 00000000..73397f00 --- /dev/null +++ b/docs/dao/proposals/5.26.mdx @@ -0,0 +1,174 @@ +export const meta = { + description: + 'This executable proposal implements the Governance Distribution Pilot Program approved in EP5.19.', + emoji: '📖', + contributors: ['5pence.eth'], + proposal: { + tally: + '50152158826647742094695349340830523178083147237337111134725087674188893435887', + type: 'executable', + }, +} + +# [EP 5.26] [Executable] Implementation of [EP 5.19]’s ENS Governance Distribution Pilot Program + +## Abstract + +This executable proposal implements the Governance Distribution Pilot Program approved in [EP5.19](https://snapshot.org/#/ens.eth/proposal/0xfa54ff2b55f0495c96ec2d8645241bcff48ca6afe1f4925fb51f29c4667252df). Following the community's selection of the 30k ENS distribution option, this proposal authorizes the transfer of ENS tokens from the treasury to implement the program. + +## Specification + +This proposal authorizes: + +1. The transfer of 30,000 ENS tokens from the DAO treasury to the Meta-governance working group's main wallet (main.mg.wg.ens.eth) for distribution to eligible recipients +2. The Meta-governance working group will then distribute these tokens through 2-year linear vesting contracts according to the allocation table below + +This distribution follows the quadratic funding method, which is a progressive ratio where recipients receive ENS tokens proportional to the square root of their USDC/ETH contributions during January-September 2024. The complete distribution table is as follows: + +### Recipients + +| From | To | SUM of Value | Squared Weight | % of total | ENS | % of value received | +| --------------------- | ---------------------------------- | -------------- | -------------- | ---------- | --------- | ------------------- | +| Ecosystem | ETHGlobal | $ 190,000.00 | 435.9 | 5.2% | 1,569.85 | 11.6% | +| | wslyvh.eth | $ 50,004.00 | 223.6 | 2.7% | 805.35 | 22.5% | +| | Onthis | $ 25,000.00 | 158.1 | 1.9% | 569.44 | 31.9% | +| | ipns.eth | $ 25,000.00 | 158.1 | 1.9% | 569.44 | 31.9% | +| | Fluidkey | $ 25,000.00 | 158.1 | 1.9% | 569.44 | 31.9% | +| | Blockscout | $ 25,000.00 | 158.1 | 1.9% | 569.44 | 31.9% | +| | beaconchain.eth | $ 25,000.00 | 158.1 | 1.9% | 569.44 | 31.9% | +| | 1w3.eth | $ 25,000.00 | 158.1 | 1.9% | 569.44 | 31.9% | +| | Urbe Campus | $ 14,680.00 | 121.2 | 1.5% | 436.36 | 41.6% | +| | Discord Support | $ 13,000.00 | 114.0 | 1.4% | 410.63 | 44.2% | +| | generalmagic.eth | $ 11,563.43 | 107.5 | 1.3% | 387.28 | 46.9% | +| | Pugson | $ 10,000.00 | 100.0 | 1.2% | 360.15 | 50.4% | +| | Juicebox | $ 10,000.00 | 100.0 | 1.2% | 360.15 | 50.4% | +| | frolic.eth | $ 10,000.00 | 100.0 | 1.2% | 360.15 | 50.4% | +| | Drips | $ 10,000.00 | 100.0 | 1.2% | 360.15 | 50.4% | +| | Socket | $ 5,000.00 | 70.7 | 0.8% | 254.66 | 71.3% | +| | ENS Fairy | $ 4,781.34 | 69.1 | 0.8% | 249.03 | 72.9% | +| | weird3.eth | $ 3,000.00 | 54.8 | 0.7% | 197.26 | 92.1% | +| | stephancill.eth | $ 2,367.89 | 48.7 | 0.6% | 175.25 | 103.6% | +| | Scope.sh | $ 2,367.89 | 48.7 | 0.6% | 175.25 | 103.6% | +| | Kiwi News | $ 2,367.89 | 48.7 | 0.6% | 175.25 | 103.6% | +| | aexek.eth | $ 1,750.00 | 41.8 | 0.5% | 150.66 | 120.5% | +| Ecosystem Total | | $ 490,882.44 | | | | | +| Public Goods | Rotki | $ 53,973.38 | 232.3 | 2.8% | 836.70 | 21.7% | +| | gashawk.eth | $ 40,000.00 | 200.0 | 2.4% | 720.29 | 25.2% | +| | buidlguidl.eth | $ 35,000.00 | 187.1 | 2.2% | 673.77 | 27.0% | +| | borderlessafrica.eth | $ 30,000.00 | 173.2 | 2.1% | 623.79 | 29.1% | +| | Revoke.Cash | $ 20,000.00 | 141.4 | 1.7% | 509.33 | 35.7% | +| | Firefly | $ 20,000.00 | 141.4 | 1.7% | 509.33 | 35.7% | +| | EIP-7212 | $ 20,000.00 | 141.4 | 1.7% | 509.33 | 35.7% | +| | ethdaily.eth | $ 14,797.60 | 121.6 | 1.5% | 438.10 | 41.4% | +| | Dappnode | $ 12,500.00 | 111.8 | 1.3% | 402.66 | 45.1% | +| | ETHDenver | $ 10,000.00 | 100.0 | 1.2% | 360.15 | 50.4% | +| | pairwise.eth | $ 8,402.18 | 91.7 | 1.1% | 330.12 | 55.0% | +| | apoorv.eth | $ 7,021.88 | 83.8 | 1.0% | 301.79 | 60.2% | +| | leticiaferraz.eth | $ 6,949.32 | 83.4 | 1.0% | 300.23 | 60.5% | +| | Urbe Campus | $ 5,000.00 | 70.7 | 0.8% | 254.66 | 71.3% | +| | Latin Hackathon | $ 5,000.00 | 70.7 | 0.8% | 254.66 | 71.3% | +| | eth-mexico.eth | $ 5,000.00 | 70.7 | 0.8% | 254.66 | 71.3% | +| | DAOstar | $ 5,000.00 | 70.7 | 0.8% | 254.66 | 71.3% | +| | aynieducativo.eth | $ 5,000.00 | 70.7 | 0.8% | 254.66 | 71.3% | +| | glodollar.eth | $ 3,762.22 | 61.3 | 0.7% | 220.90 | 82.2% | +| | modularcrypto.eth | $ 1,818.29 | 42.6 | 0.5% | 153.57 | 118.2% | +| | daveytea.eth | $ 1,818.29 | 42.6 | 0.5% | 153.57 | 118.2% | +| | UPE | $ 940.56 | 30.7 | 0.4% | 110.45 | 164.4% | +| | illuminated.eth | $ 940.56 | 30.7 | 0.4% | 110.45 | 164.4% | +| | dhive.eth | $ 940.56 | 30.7 | 0.4% | 110.45 | 164.4% | +| | bloomnetwork.eth | $ 940.56 | 30.7 | 0.4% | 110.45 | 164.4% | +| | pabl0cks.eth | $ 877.74 | 29.6 | 0.4% | 106.70 | 170.2% | +| | iviangita.eth | $ 877.74 | 29.6 | 0.4% | 106.70 | 170.2% | +| | easlabs.eth | $ 877.74 | 29.6 | 0.4% | 106.70 | 170.2% | +| | 2118.eth | $ 877.74 | 29.6 | 0.4% | 106.70 | 170.2% | +| Public Goods Total | | $ 318,316.31 | | | | | +| Metagov | Karpatkey | $ 187,149.13 | 432.6 | 5.2% | 1,558.02 | 11.7% | +| | daemon.eth | $ 27,000.00 | 164.3 | 2.0% | 591.78 | 30.7% | +| | Lemma | $ 9,998.67 | 100.0 | 1.2% | 360.12 | 50.4% | +| | Tally | $ 8,999.54 | 94.9 | 1.1% | 341.66 | 53.1% | +| | Event Support | $ 3,000.00 | 54.8 | 0.7% | 197.26 | 92.1% | +| | daveytea.eth | $ 1,000.00 | 31.6 | 0.4% | 113.89 | 159.4% | +| | andrewpage.eth | $ 780.00 | 27.9 | 0.3% | 100.58 | 180.5% | +| Metagov Total | | $ 237,927.35 | | | | | +| Immunefi Bounty | Immunefi | $ 102,000.00 | 319.4 | 3.8% | 1,150.22 | 15.8% | +| | @UGWST_COM | $ 75,000.00 | 273.9 | 3.3% | 986.30 | 18.4% | +| | @navad | $ 7,500.00 | 86.6 | 1.0% | 311.90 | 58.2% | +| | @Sagamore | $ 6,000.00 | 77.5 | 0.9% | 278.97 | 65.1% | +| | @adhd | $ 5,000.00 | 70.7 | 0.8% | 254.66 | 71.3% | +| | @solidityhaxor | $ 2,500.00 | 50.0 | 0.6% | 180.07 | 100.8% | +| | @haoce505 | $ 2,500.00 | 50.0 | 0.6% | 180.07 | 100.8% | +| | @h4nt3rx | $ 2,500.00 | 50.0 | 0.6% | 180.07 | 100.8% | +| | @austinoa012 | $ 1,000.00 | 31.6 | 0.4% | 113.89 | 159.4% | +| Immunefi Bounty Total | | $ 204,000.00 | | | | | +| ETH Global | TF Guo | $ 3,000.00 | 54.8 | 0.7% | 197.26 | 92.1% | +| | Nikolas Lionis | $ 2,000.00 | 44.7 | 0.5% | 161.06 | 112.7% | +| | Arthur Sabirzyanov | $ 2,000.00 | 44.7 | 0.5% | 161.06 | 112.7% | +| | Stephan Wittig | $ 1,500.00 | 38.7 | 0.5% | 139.48 | 130.2% | +| | Rashmi Abbigeri | $ 1,500.00 | 38.7 | 0.5% | 139.48 | 130.2% | +| | Mehran Saliminia | $ 1,500.00 | 38.7 | 0.5% | 139.48 | 130.2% | +| | Mattis Deisen | $ 1,500.00 | 38.7 | 0.5% | 139.48 | 130.2% | +| | Ben Levy | $ 1,375.00 | 37.1 | 0.4% | 133.55 | 136.0% | +| | Aryeh Greenberg | $ 1,375.00 | 37.1 | 0.4% | 133.55 | 136.0% | +| | Shoma Shiga | $ 1,250.00 | 35.4 | 0.4% | 127.33 | 142.6% | +| | Rao Araki | $ 1,250.00 | 35.4 | 0.4% | 127.33 | 142.6% | +| | sudolabel ‎ | $ 1,000.00 | 31.6 | 0.4% | 113.89 | 159.4% | +| | Simone Staffa | $ 1,000.00 | 31.6 | 0.4% | 113.89 | 159.4% | +| | Paolo Rollo | $ 1,000.00 | 31.6 | 0.4% | 113.89 | 159.4% | +| | Francesco Cirulli | $ 1,000.00 | 31.6 | 0.4% | 113.89 | 159.4% | +| | Yong Feng Ng | $ 875.00 | 29.6 | 0.4% | 106.53 | 170.5% | +| | Yik Kai Ng | $ 875.00 | 29.6 | 0.4% | 106.53 | 170.5% | +| | Junyao Chan | $ 875.00 | 29.6 | 0.4% | 106.53 | 170.5% | +| | Jing Jie Ng | $ 875.00 | 29.6 | 0.4% | 106.53 | 170.5% | +| | Tom Chauveau | $ 750.00 | 27.4 | 0.3% | 98.63 | 184.1% | +| | Roman GASCOIN | $ 750.00 | 27.4 | 0.3% | 98.63 | 184.1% | +| | Coline SEGURET | $ 750.00 | 27.4 | 0.3% | 98.63 | 184.1% | +| | Wojciech Staniszewski | $ 500.00 | 22.4 | 0.3% | 80.53 | 225.5% | +| | Patrick Fuchs | $ 500.00 | 22.4 | 0.3% | 80.53 | 225.5% | +| | Pascal Rüger | $ 500.00 | 22.4 | 0.3% | 80.53 | 225.5% | +| | Luca Orbke | $ 500.00 | 22.4 | 0.3% | 80.53 | 225.5% | +| | Joanna Daniluk | $ 500.00 | 22.4 | 0.3% | 80.53 | 225.5% | +| | Eason Chai | $ 500.00 | 22.4 | 0.3% | 80.53 | 225.5% | +| | Bartłomiej Tarczyński | $ 500.00 | 22.4 | 0.3% | 80.53 | 225.5% | +| | Antoni Koszowski | $ 500.00 | 22.4 | 0.3% | 80.53 | 225.5% | +| | Andrzej Daniel | $ 500.00 | 22.4 | 0.3% | 80.53 | 225.5% | +| | Yoshiki Takabayashi | $ 250.00 | 15.8 | 0.2% | 56.94 | 318.9% | +| | Shritesh Jamulkar | $ 250.00 | 15.8 | 0.2% | 56.94 | 318.9% | +| | Rohit Ramesh | $ 250.00 | 15.8 | 0.2% | 56.94 | 318.9% | +| | Nishen Kaushika Menerapitiyage Don | $ 250.00 | 15.8 | 0.2% | 56.94 | 318.9% | +| | Helen Femi Williams | $ 250.00 | 15.8 | 0.2% | 56.94 | 318.9% | +| | Francisco Cordero | $ 250.00 | 15.8 | 0.2% | 56.94 | 318.9% | +| | Danya Carolina Gómez Cantú | $ 250.00 | 15.8 | 0.2% | 56.94 | 318.9% | +| | Bianca Trovò | $ 250.00 | 15.8 | 0.2% | 56.94 | 318.9% | +| | Bernardo Vieira | $ 250.00 | 15.8 | 0.2% | 56.94 | 318.9% | +| | Adaku Agwunobi | $ 250.00 | 15.8 | 0.2% | 56.94 | 318.9% | +| ETH Global Total | | $ 35,000.00 | | | | | +| Grand Total | | $ 1,286,126.10 | 8329.9 | 100% | 30,000.00 | | + +1. Value represents the total received of all transactions +2. Squared Weight is simply the square root of that value, which is used as a weight +3. % of total divided that by the total weight +4. ENS multiplies that percentage to the total budget +5. % of value received is a comparison of the value received in USDC with the value received in ENS, with ENS at $14 + +## Transaction + +```json +{ + "target": "0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72", + "value": 0, + "calldata": "0xa9059cbb00000000000000000000000091c32893216de3ea0a55abb9851f581d4503d39b00000000000000000000000000000000000000000000065a4da25d3016c00000" +} +``` + +## Verification + +- Target: ENS token contract (0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72) +- Recipient: main.mg.wg.ens.eth (0x91c32893216dE3eA0a55ABb9851f581d4503d39b) +- Amount: 30,000 ENS (30000000000000000000000 in wei) +- Function: transfer(address,uint256) + +--- + +The Meta-governance working group will handle subsequent distributions to individual recipients through Hedgey vesting contracts following the approved allocation table. + +The transaction will move the 30k $ENS to the main Meta-governance wallet. After the transaction completes, the Meta-governance working group will craft the Hedgey vesting contracts following the above allocation table. diff --git a/docs/dao/proposals/5.27.mdx b/docs/dao/proposals/5.27.mdx new file mode 100644 index 00000000..b2bb75a9 --- /dev/null +++ b/docs/dao/proposals/5.27.mdx @@ -0,0 +1,34 @@ +{/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} +export const meta = { + description: "Revokes the DAO's ability to upgrade the name wrapper", + emoji: '📖', + contributors: [ + 'nick.eth' + ], + proposal: { + tally: '40272043175867710511047990376059633000673751036364092383567949469124429500507', + type: 'executable' + } +}; + +# [EP 5.27] [Executable] Revoke the DAO’s ability to upgrade the name wrapper + +[Temp Check Discourse link](https://discuss.ens.domains/t/ep-5-27-executable-revoke-the-daos-ability-to-upgrade-the-name-wrapper/19920) + +## Abstract + +The Name Wrapper’s upgrade mechanism contains a vulnerability whereby a malicious DAO could use the upgrade mechanism to seize control of wrapped names without the owner’s consent, documented [here](https://discuss.ens.domains/t/security-advisory-a-malicious-dao-update-could-reduce-the-registration-duration-of-registered-eth-2lds/17576/1). + +Since the v2 migration plan makes the upgrade mechanism obsolete, we now know the mechanism will never be required. This EP proposes to remove the DAO’s ability to upgrade the name wrapper. + +## Specification + +Admin control over the name wrapper gives the DAO two functions: it can set the upgrade contract, and it can specify the address of the metadata contract. Since we want to remove the former ability while preserving the latter, we propose the following sequence of actions: + +1. Deploy a new metadata contract, identical to the current one but using a proxy. The proxy instance should be owned by the DAO to provide for future metadata upgrades. +2. Update the name wrapper to reference the new metadata contract instead of the old one. +3. Revoke admin ownership over the name wrapper. + +A new metadata service has been deployed at 0x806f84F3789f51352C1B0aB3fFa192665d283808, and a transparent proxy was deployed in transaction 0xd0aca1f2efb2db5e3d494649004e341decb2e94a1f30e94f301b6626702ee4c8, at address 0xabb76d7e79de010117b147761013f11630a6799f, with the initial implementation set to the above address, and the owner set to wallet.ensdao.eth. The admin contract for this proxy is at 0xeae9309ddb1aadb4cf1ebad5e51aef999833a992. + +The executable component of this proposal sets the metadata service address on the name wrapper to the above proxy, then revokes ownership over it. diff --git a/docs/dao/stewards.mdx b/docs/dao/stewards.mdx index 437fe9c6..cec3ef74 100644 --- a/docs/dao/stewards.mdx +++ b/docs/dao/stewards.mdx @@ -1,3 +1,5 @@ +import { Avatar } from '@/components/mdx/Avatar' + {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} export const meta = { description: 'Overview of the current governance stewards', @@ -17,25 +19,25 @@ Read the [full active rules governing the Working Groups](https://docs.ens.domai ## Current Stewards -### 2024 +### 2024 #### Meta-Governance Working Group -| 5pence.eth | avsa.eth | estmcmxci.eth -| --- | --- | --- | -| Spence / 5pence.eth | Alex / avsa.eth | Marcus / estmcmxci.eth | +| | | | +| ---------------------------------------- | -------------------------------------- | ------------------------------------------- | +| Spence / 5pence.eth | Alex / avsa.eth | Marcus / estmcmxci.eth | #### ENS Ecosystem Working Group -| slobo.eth | limes.eth | 184.eth -| --- | --- | --- | -| slobo.eth | limes.eth | 184.eth | +| | | | +| --------------------------------------- | --------------------------------------- | ------------------------------------- | +| slobo.eth | limes.eth | 184.eth | #### Public Goods Working Group -| coltron.eth | Simona / simona.eth | vegayp.eth | -| --- | --- | --- | -| coltron.eth | Simona / simona.eth | vegayp.eth | +| | | | +| ----------------------------------------- | ---------------------------------------- | ---------------------------------------- | +| coltron.eth | Simona / simona.eth | vegayp.eth | ## Past Stewards @@ -43,98 +45,98 @@ Read the [full active rules governing the Working Groups](https://docs.ens.domai #### Meta-Governance Working Group -| nick.eth | 5pence.eth | Katherine Wu / katherineykwu.eth -| --- | --- | --- | -| Nick Johnson / nick.eth | Spence / 5pence.eth | Katherine Wu / katherineykwu.eth | +| | | | +| -------------------------------------- | ---------------------------------------- | ------------------------------------------- | +| Nick Johnson / nick.eth | Spence / 5pence.eth | Katherine Wu / katherine.eth | #### ENS Ecosystem Working Group -| slobo.eth | limes.eth | 184.eth -| --- | --- | --- | -| slobo.eth | limes.eth | 184.eth | +| | | | +| --------------------------------------- | --------------------------------------- | ------------------------------------- | +| slobo.eth | limes.eth | 184.eth | #### Public Goods Working Group -| coltron.eth | Simona / simona.eth | vegayp.eth | -| --- | --- | --- | -| coltron.eth | Simona / simona.eth | vegayp.eth | +| | | | +| ----------------------------------------- | ---------------------------------------- | ---------------------------------------- | +| coltron.eth | Simona / simona.eth | vegayp.eth | ### 2023 Q1/Q2 #### Meta-Governance Working Group -| nick.eth | simona.eth | Katherine Wu / katherineykwu.eth -| --- | --- | --- | -| nick.eth | simona.eth | Katherine Wu | +| | | | +| -------------------------------------- | ---------------------------------------- | ------------------------------------------- | +| nick.eth | simona.eth | Katherine Wu | #### ENS Ecosystem Working Group -| slobo.eth | limes.eth | yambo.eth | -| --- | --- | --- | -| slobo.eth | limes.eth | yambo.eth | +| | | | +| --------------------------------------- | --------------------------------------- | --------------------------------------- | +| slobo.eth | limes.eth | yambo.eth | #### Public Goods Working Group -| avsa.eth | coltron.eth | vegayp.eth | -| --- | --- | --- | -| avsa.eth | coltron.eth | vegayp.eth | +| | | | +| -------------------------------------- | ----------------------------------------- | ---------------------------------------- | +| avsa.eth | coltron.eth | vegayp.eth | ### 2022 Q3/Q4 #### Meta-Governance -| coltron.eth | simona.eth | nick.eth | -| --- | --- | --- | -| coltron.eth | simona.eth | nick.eth | +| | | | +| ----------------------------------------- | ---------------------------------------- | -------------------------------------- | +| coltron.eth | simona.eth | nick.eth | #### ENS Ecosystem -| bobjiang.eth | validator.eth | slobo.eth | -| --- | --- | --- | -| bobjiang.eth | validator.eth | slobo.eth | +| | | | +| ------------------------------------------ | ------------------------------------------- | --------------------------------------- | +| bobjiang.eth | validator.eth | slobo.eth | #### Community -| limes.eth | coltron.eth | validator.eth | -| --- | --- | --- | -| limes.eth | coltron.eth | validator.eth | +| | | | +| --------------------------------------- | ----------------------------------------- | ------------------------------------------- | +| limes.eth | coltron.eth | validator.eth | #### Public Goods -| anthonyware.eth | ceresstation.eth | avsa.eth | -| --- | --- | --- | -| anthonyware.eth | ceresstation.eth | avsa.eth | +| | | | +| --------------------------------------------- | ---------------------------------------------- | -------------------------------------- | +| anthonyware.eth | ceresstation.eth | avsa.eth | ### 2022 Q1/Q2 #### Meta-Governance -| jmj.eth | simona.eth | james.eth | -| --- | --- | --- | -| jmj.eth | simona.eth | james.eth | -| nick.eth | leontalbert.eth | | -| nick.eth | leontalbert.eth | | +| | | | +| -------------------------------------- | --------------------------------------------- | --------------------------------------- | +| jmj.eth | simona.eth | james.eth | +| | | | +| nick.eth | leontalbert.eth | | #### ENS Ecosystem -| ginge.eth | slobo.eth | bobjiang.eth | -| --- | --- | --- | -| ginge.eth | slobo.eth | bobjiang.eth | -| nick.eth | jefflau.eth | | -| nick.eth | jefflau.eth | | +| | | | +| --------------------------------------- | ----------------------------------------- | ------------------------------------------ | +| ginge.eth | slobo.eth | bobjiang.eth | +| | | | +| nick.eth | jefflau.eth | | #### Community -| limes.eth | coltron.eth | spencecoin.eth | -| --- | --- | --- | -| limes.eth | coltron.eth | spencecoin.eth | -| brantly.eth | validator.eth | | -| brantly.eth | validator.eth | | +| | | | +| ----------------------------------------- | ------------------------------------------- | -------------------------------------------- | +| limes.eth | coltron.eth | spencecoin.eth | +| | | | +| brantly.eth | validator.eth | | #### Public Goods -| sumedha.eth | ceresstation.eth | avsa.eth | -| --- | --- | --- | -| sumedha.eth | ceresstation.eth | avsa.eth | -| matoken.eth | ricmoo.eth | | -| matoken.eth | ricmoo.eth | | +| | | | +| ----------------------------------------- | ---------------------------------------------- | -------------------------------------- | +| sumedha.eth | ceresstation.eth | avsa.eth | +| | | | +| matoken.eth | ricmoo.eth | | diff --git a/docs/dweb/intro.mdx b/docs/dweb/intro.mdx index 20508db9..b1e5923f 100644 --- a/docs/dweb/intro.mdx +++ b/docs/dweb/intro.mdx @@ -43,7 +43,7 @@ When it comes to hosting your files there are many options to choose from. Popular options include [IPFS](https://ipfs.io), [Swarm](https://ethswarm.org), and [Arweave](https://arweave.org). Depending on what option you go with your files are either permanently stored on a network, -or require to be actively stored on atleast one machine, also known as "pinning". +or require to be actively stored on at least one machine, also known as "pinning". ### Deploy your site {{ id: 'deploy' }} diff --git a/docs/learn/dns.mdx b/docs/learn/dns.mdx index dcd1caa5..3b8227b7 100644 --- a/docs/learn/dns.mdx +++ b/docs/learn/dns.mdx @@ -13,7 +13,7 @@ export const meta = { {/*TODO: User-friendly explanation of the fact that DNS names also work in the ENS system.*/} -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. +The Ethereum Name Service is so much more than just `.eth` names. It is a general-purpose naming system that can be used for any kind of name. This includes DNS names. DNS functionality was originally introduced in [ENSIP-6](/ensip/6). ## Importing a DNS name diff --git a/docs/registry/eth.mdx b/docs/registry/eth.mdx index 979c4e0b..98eee173 100644 --- a/docs/registry/eth.mdx +++ b/docs/registry/eth.mdx @@ -147,7 +147,7 @@ ETHRegistrarController.commit(commitment bytes32) ``` Note this does require an on-chain transaction. -After having committed it is recommended to wait at least the `MIN_COMMITMENT_AGE` (~60 seconds) before registering. +After having committed it is required to wait at least the `MIN_COMMITMENT_AGE` (60 seconds) before registering. ### Registering diff --git a/docs/resolvers/ccip-read.mdx b/docs/resolvers/ccip-read.mdx index c8bf4c53..707d2f09 100644 --- a/docs/resolvers/ccip-read.mdx +++ b/docs/resolvers/ccip-read.mdx @@ -12,9 +12,9 @@ export const meta = { The source of truth for a name and its subdomains does not always have to be on-chain or on Ethereum L1 at all. By leveraging [EIP-3668](https://eips.ethereum.org/EIPS/eip-3668), the Cross Chain Interoperability Protocol (or CCIP Read for short), we can load information by hitting a so called "Gateway". -Within the context of ENS, this enables us, to read names, addresses, records, and more from other chains, or even off-chain. +Within the context of ENS, this enables us to read names, addresses, text records and more from other chains, or even off-chain. -
+
➡️
@@ -27,7 +27,7 @@ Within the context of ENS, this enables us, to read names, addresses, records, a
api.example.com
➡️
-
+
Address:
0x225...c3b5
diff --git a/docs/resolvers/interacting.mdx b/docs/resolvers/interacting.mdx index ab7b1606..c04660ac 100644 --- a/docs/resolvers/interacting.mdx +++ b/docs/resolvers/interacting.mdx @@ -31,12 +31,12 @@ Interface IDs are calculated according to solidity ABI and stored in a four-byte If you want to help a user set their avatar, specify a preferred color scheme, or set any other record on their ENS name you can do so in specific cases. First we need to check if the user's resolver supports the interface we want to use (see [setText](/resolvers/interfaces#0x10f13a8c)). -Afterwhich you can call the `setRecord` function on the user's resolver contract. +Afterwhich you can call the `setText()` function on the user's resolver contract. ```solidity -interface ENS { +interface Resolver { function setText(bytes32 node, string calldata key, string calldata value) external; } ``` diff --git a/docs/resolvers/interfaces.mdx b/docs/resolvers/interfaces.mdx index 00403799..241d5bd8 100644 --- a/docs/resolvers/interfaces.mdx +++ b/docs/resolvers/interfaces.mdx @@ -1,7 +1,5 @@ -import { WIP } from "@/components/wip/WIP"; import { interfaceDetails } from "#/data/interfaces"; import { resolver_methods } from "#/data/resolver"; -import { h2, h3, h4 } from '@/components/mdx/heading/h2'; {/* * @type {import('@/lib/mdxPageProps').MdxMetaProps} */} export const meta = { diff --git a/docs/resolvers/quickstart.mdx b/docs/resolvers/quickstart.mdx index d443036b..944bb9b9 100644 --- a/docs/resolvers/quickstart.mdx +++ b/docs/resolvers/quickstart.mdx @@ -7,7 +7,7 @@ export const meta = { # Resolvers Quickstart 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)). -The resolvers smart contract functions have control over the resolution process of a "node" (a name or subdomain) and onwards (subdomains of itself). +The resolvers smart contract functions have control over the resolution process of a ["node"](/resolution/names#namehash) (a name or subdomain) and onwards (subdomains of itself). ## Basic Resolver @@ -15,9 +15,17 @@ A naive but very plausible example of a resolver is the following. ```solidity contract MyResolver { - function addr(bytes32 node) public view returns (address) { + function addr(bytes32 node) external pure returns (address) { return 0x225f137127d9067788314bc7fcc1f36746a3c3B5; } + + function supportsInterface( + bytes4 interfaceID + ) external pure returns (bool) { + return + interfaceID == this.addr.selector || + interfaceID == this.supportsInterface.selector; + } } ``` @@ -40,4 +48,4 @@ Are you writing a dApp and want to build this? Checkout the [Interacting with a ## Offchain Resolution 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. -More about writing a ccip-enabled resolver [here](/resolvers/ccip-read). +More about writing a CCIP Read-enabled resolver [here](/resolvers/ccip-read). diff --git a/docs/resolvers/writing.mdx b/docs/resolvers/writing.mdx index cd0e4c8a..cf3ca59b 100644 --- a/docs/resolvers/writing.mdx +++ b/docs/resolvers/writing.mdx @@ -1,5 +1,3 @@ -import { WIP } from '@/components/wip/WIP'; - {/** @type {import('@/lib/mdxPageProps').MdxMetaProps} */} export const meta = { description: 'How to write your own resolver.', @@ -10,28 +8,46 @@ export const meta = { # Writing a Resolver Every ENS name has a resolver, which is responsible for resolving information about a name. -By writing your own resolver contract you can extend the functionality of your name, subnames, and more. -Resolvers are a core part of the ENS protocolm, they give the power to a name "node" to control the resolution process from itself onwards (its subdomains etc). 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). +Resolvers are a core part of the ENS protocol. They give each name, represented as a ["node"](/resolution/names#namehash), the power to control the resolution process for itself and all of its subnames. Resolvers were originally standardized in [EIP 137](https://eips.ethereum.org/EIPS/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). + +You can find the latest default resolver implementation, called the Public Resolver, on [GitHub](https://github.com/ensdomains/ens-contracts/blob/mainnet/contracts/resolvers/PublicResolver.sol) and [Etherscan](/learn/deployments). ## Resolver Interface -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: +You can view an extended list of resolver methods [here](/resolvers/interfaces), however a simple interface might look something like this: ```solidity -contract MyResolver { - fn addr(bytes32 node) public view returns (address); +interface IMyResolver { + function supportsInterface(bytes4 interfaceId) external view returns (bool); + function addr(bytes32 node) external view returns (address payable); + function addr(bytes32 node, uint256 coinType) external view returns (bytes memory); + function contenthash(bytes32 node) external view returns (bytes memory); + function text(bytes32 node, string calldata key) external view returns (string memory); + + function setAddr(bytes32 node, address addr) external; + function setAddr(bytes32 node, uint256 coinType, bytes calldata a) external; + function setContenthash(bytes32 node, bytes calldata hash) external; + function setText(bytes32 node, string calldata key, string calldata value) external; } ``` ## Wildcard Resolution -In [ENSIP-10](/ensip/10) a new method was added to the resolver interface, the `resolve()` method. -This method allows for fetching +In [ENSIP-10](/ensip/10) a new `resolve()` method was added to the resolver interface to allow for wildcard resolution. ```solidity -interface ExtendedResolver { - function resolve(bytes calldata name, bytes calldata data) external view returns(bytes); +interface IExtendedResolver { + /** + * @dev Performs ENS name resolution for the supplied name and resolution data. + * @param name The name to resolve, in normalised and DNS-encoded form. + * @param data The resolution data, as specified in ENSIP-10. + * @return The result of resolving the name. + */ + function resolve( + bytes memory name, + bytes memory data + ) external view returns (bytes memory); } ``` @@ -41,8 +57,4 @@ Don't forget to add `0x9061b923` to your [EIP-165](https://eips.ethereum.org/) ` ## Offchain Resolution -When you write your own resolver you are able to leverage the power of CCIP Read. More about writing a ccip-enabled resolver [here](/resolvers/ccip-read) - -## Test your Resolver - - +When you write your own resolver, you are able to leverage CCIP Read to effectively defer name resolution to an HTTP server. This server can then load data from any source including offchain databases, APIs, or other blockchains. Learn more about implementing CCIP Read in your resolver [here](/resolvers/ccip-read). diff --git a/docs/terminology.mdx b/docs/terminology.mdx index e04a09db..75c5be17 100644 --- a/docs/terminology.mdx +++ b/docs/terminology.mdx @@ -124,7 +124,7 @@ This term is typically used with respect to the Ethereum Mainnet blockchain. If ### CCIP Read -The "Cross Chain Interoperability Procol Read" specification, also known as [EIP-3668](https://eips.ethereum.org/EIPS/eip-3668), authored by Nick Johnson, is a specification that allows for secure and trustless offchain data retrieval. +The "Cross Chain Interoperability Protocol Read" specification, also known as [EIP-3668](https://eips.ethereum.org/EIPS/eip-3668), authored by Nick Johnson, is a specification that allows for secure and trustless offchain data retrieval. It allows for an Ethereum call to defer to an [offchain gateway](/resolvers/ccip-read#writing-a-gateway) and then securely verify the resulting data on-chain. With respect to ENS, this is typically used for offchain subnames that don't exist in the core Registry. diff --git a/docs/web/avatars.mdx b/docs/web/avatars.mdx index 164927ef..47bc18b5 100644 --- a/docs/web/avatars.mdx +++ b/docs/web/avatars.mdx @@ -109,7 +109,7 @@ with some rules about what URI schemes are supported and how to process them. Fo Clients are expected to support a number of URI schemas, which aren't always web URIs, so the final result you see in your application will vary depending on how the library you are using has decided to handle avatar records. -- `http(s):` - URI Scheme for for HTTP(S) URLs. Libraries will most likely return the result directly. +- `http(s):` - URI Scheme for HTTP(S) URLs. Libraries will most likely return the result directly. - `ipfs:` - URI scheme for [IPFS hashes](). Libraries may decide to fetch the result from a public gateway for you. - `data:` - URI Scheme for [data URIs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs). Libraries will most likely return the result directly. diff --git a/docs/web/index.mdx b/docs/web/index.mdx index e23eada8..b3c82f37 100644 --- a/docs/web/index.mdx +++ b/docs/web/index.mdx @@ -16,19 +16,17 @@ This section walks you through how to leverage the ENS open standards to improve 0x225...c3B5 0x179...9285 0xd8d...6045 - 0x225...c3B5 - 0x225...c3B5 + 0x849...8bf1
- + + ➡️ + ➡️ + ➡️ ➡️ - ➡️ - ➡️ - ➡️ - ➡️
{[ - 'luc.eth', 'gregskril.eth', 'vitalik.eth', 'luc.cash', 'puma.eth'].map((name) => ( + 'luc.eth', 'gregskril.eth', 'vitalik.eth', 'jesse.xyz'].map((name) => (
@@ -123,8 +121,8 @@ If you just want to see some code in action we have a variety of codesnippet & t -Information about a name can be fetched from its resolver, this can be done using pre-built features included in your tooling, or manually by calling the resolver contract directly. -If you're interested in interacting with the resolver contract directly, you might find the [Resolver Reference](/resolvers/interfaces) section helpful. +Information about a name is fetched from its resolver. This can be done using pre-built features included in popular [web3 libraries](/web/libraries) (recommended), or by calling a resolver contract directly. +If you're interested in interacting with ENS resolvers, you might find the [Resolver Reference](/resolvers/interfaces) section helpful. ## Registration diff --git a/docs/web/quickstart.mdx b/docs/web/quickstart.mdx index 93e1615c..9ec8eaca 100644 --- a/docs/web/quickstart.mdx +++ b/docs/web/quickstart.mdx @@ -91,8 +91,8 @@ import { formatAddress } from 'ens-tools'; export const YourApp: FC = () => { const { address } = useAccount(); - const { data: name } = useEnsName({ address }); - const { data: avatar } = useEnsAvatar({ name }); + const { data: name } = useEnsName({ address, chainId: 1 }); + const { data: avatar } = useEnsAvatar({ name, chainId: 1 }); return (
@@ -134,6 +134,11 @@ func main() { + + ENS resolution always starts from L1 regardless of the chain the user is connected to. + This is why we specify `chainId: 1` for Ethereum Mainnet in the wagmi hooks above. + + ### Name Lookups @@ -147,8 +152,8 @@ import { formatAddress } from '@ens-tools/format'; export const NameLookup = () => { const name = normalize("luc.eth"); - const { data: avatar } = useEnsAvatar({ name }) - const { data: ethereum } = useEnsAddress({ name, coinType: 60 }); + const { data: avatar } = useEnsAvatar({ name, chainId: 1 }); + const { data: ethereum } = useEnsAddress({ name, coinType: 60, chainId: 1 }); return (
diff --git a/docs/web/records.mdx b/docs/web/records.mdx index c4d4965d..91a73870 100644 --- a/docs/web/records.mdx +++ b/docs/web/records.mdx @@ -51,28 +51,6 @@ To fetch the record for a specific name, you can use one of the following method -{/* ```tsx {{ title: "ens-tools (React)", meta: "focus=4:8", variant: "ens-tools", link: "https://github.com/v3xlabs/ens-tools" }} -import { useRecords } from "ens-tools/react"; - -export const MyProfile: FC<{ name: string }> = ({ name }) => { - const { data } = useRecords({ - name: name, - records: ["com.twitter", "com.github", "description"], - normalize: true, - }); - - return ( -
- {data.map((record) => ( -
- {record.key}: {record.value} -
- ))} -
- ); -}; -``` */} - ```tsx {{ title: "Wagmi", variant: "wagmi", link: "https://wagmi.sh/react/api/hooks/useEnsText" }} import { useEnsText } from "wagmi"; import { normalize } from "viem/ens"; @@ -85,7 +63,7 @@ export const MyProfile: FC<{ name: string }> = ({ name }) => { return (
- Twitter: {data} + Twitter: {data}
); }; @@ -156,18 +134,19 @@ func main() { Here are some of the most commonly used records: -| Name | Usage | Reference | Example | -| ----------- | -------------------------------------------- | ------------------- | ------------------- | -| display | Preferred Capitalization | [ENSIP-5](/ensip/5) | Luc.eth | -| avatar | Avatar or Logo (see [Avatars](/web/avatars)) | [ENSIP-5](/ensip/5) | ipfs://dQw4w9WgXcQ | -| description | Description of the name | [ENSIP-5](/ensip/5) | DevRel @ ENS Labs | -| keywords | A list of comma-separated keywords | [ENSIP-5](/ensip/5) | person, ens | -| email | Email Address | [ENSIP-5](/ensip/5) | luc@ens.domains | -| mail | A physical mailing address | [ENSIP-5](/ensip/5) | V3X HQ | -| notice | A notice regarding this name | [ENSIP-5](/ensip/5) | This is a notice | -| location | A generic location (e.g. "Toronto, Canada") | [ENSIP-5](/ensip/5) | Breda, NL | -| phone | A phone number as an E.164 string | [ENSIP-5](/ensip/5) | +1 234 567 890 | -| url | a website URL | [ENSIP-5](/ensip/5) | https://ens.domains | +| Name | Usage | Reference | Example | +| ----------- | -------------------------------------------- | --------------------- | ------------------- | +| display | Preferred capitalization | [ENSIP-5](/ensip/5) | Luc.eth | +| avatar | Avatar or logo (see [Avatars](/web/avatars)) | [ENSIP-5](/ensip/5) | ipfs://dQw4w9WgXcQ | +| description | Description of the name | [ENSIP-5](/ensip/5) | DevRel @ ENS Labs | +| keywords | List of comma-separated keywords | [ENSIP-5](/ensip/5) | person, ens | +| email | Email address | [ENSIP-5](/ensip/5) | luc@ens.domains | +| mail | Physical mailing address | [ENSIP-5](/ensip/5) | V3X HQ | +| notice | Notice regarding this name | [ENSIP-5](/ensip/5) | This is a notice | +| location | Generic location (e.g. "Toronto, Canada") | [ENSIP-5](/ensip/5) | Breda, NL | +| phone | Phone number as an E.164 string | [ENSIP-5](/ensip/5) | +1 234 567 890 | +| url | Website URL | [ENSIP-5](/ensip/5) | https://ens.domains | +| header | Image URL to be used as a header/banner | [ENSIP-18](/ensip/18) | ipfs://dQw4w9WgXcQ | ### Other Records @@ -176,7 +155,7 @@ We generally recommend to stick to a pattern, or prefix things with your app or ### Header/Banner Record -An example of a "yet to be standardised" record is the "header" record. From initial community usage this header record, similar to the avatar record, accepts any IPFS, Arweave, EIP155, or regular URL to an image resource. +One of the newer standardised records is the "header" record. This header record, similar to the avatar record, accepts any IPFS, Arweave, EIP155, or regular URL to an image resource. The image is then displayed as a banner on the profile page and tends to be in a 1:3 aspect ratio.
diff --git a/docs/web/resolution.mdx b/docs/web/resolution.mdx index 977c01f1..2d9ec0aa 100644 --- a/docs/web/resolution.mdx +++ b/docs/web/resolution.mdx @@ -37,7 +37,7 @@ import { useAccount, useEnsName, useEnsAvatar } from "wagmi"; export const Name = () => { const { data: ensName } = useEnsAddress({ address: "luc.eth", // The name to lookup - chainId: 1, // The chainId to lookup on + chainId: 1, // The chain to start resolution on (Ethereum mainnet or testnet) }); return
{ensName || address}
; @@ -150,27 +150,40 @@ For EVM Chains besides Mainnet Ethereum, always use its [ENSIP-11](/ensip/11) co The standardization of multichain addresses was first introduced in [ENSIP-9](/ensip/9), and also [EIP-2304](https://eips.ethereum.org/EIPS/eip-2304). - + + Regardless of the chain you're resolving an address for, ENS resolution always starts from Ethereum L1. + -```tsx {{ variant: 'wagmi', link: 'https://wagmi.sh/react/api/hooks/useEnsAddress', stackblitz: 'https://stackblitz.com/edit/ens-viem-get-ens-address' }} -import { useAccount, useEnsAddress, useEnsAvatar, useEnsName } from 'wagmi'; -import { formatAddress } from '@ens-tools/format'; + -export const MyAddresses = () => { - const { data: name } = useEnsName({ address: "0x225f137127d9067788314bc7fcc1f36746a3c3B5" }); +```tsx {{ variant: 'wagmi', link: 'https://wagmi.sh/react/api/hooks/useEnsAddress' }} +import { useEnsAddress } from "wagmi"; +import { arbitrum, base } from "wagmi/chains"; - // SLIP-0044 Coin Types - const { data: bitcoin } = useEnsAddress({ name, coinType: 0 }); - const { data: litecoin } = useEnsAddress({ name, coinType: 2 }); - const { data: solana } = useEnsAddress({ name, coinType: 501 }); +const name = "gregskril.eth"; - // EVM Chain IDs (see ENSIP-9) - const { data: optimism } = useEnsAddress({ name, coinType: 2147483658 }); - const { data: base } = useEnsAddress({ name, coinType: 2147492101 }); - const { data: polygon } = useEnsAddress({ name, coinType: 2147483658 }); - const { data: arbitrum } = useEnsAddress({ name, coinType: 2147525809 }); +const evmChainIdToCoinType = (chainId: number) => { + return (0x80000000 | chainId) >>> 0; +}; - return
{JSON.stringify({ name, bitcoin, litecoin, solana, optimism, base, polygon, arbitrum })}
; +export const MyAddresses = () => { + // SLIP-0044 Coin Types (see ENSIP-9) + const { data: bitcoinAddr } = useEnsAddress({ name, coinType: 0, chainId: 1 }); + const { data: solanaAddr } = useEnsAddress({ name, coinType: 501, chainId: 1 }); + + // EVM Chain IDs (see ENSIP-11) + const { data: baseAddr } = useEnsAddress({ + name, + coinType: evmChainIdToCoinType(base.id), + chainId: 1, + }); + const { data: arbitrumAddr } = useEnsAddress({ + name, + coinType: evmChainIdToCoinType(arbitrum.id), + chainId: 1, + }); + + return
{JSON.stringify({ bitcoinAddr, solanaAddr, baseAddr, arbitrumAddr })}
; }; ``` diff --git a/docs/web/reverse.mdx b/docs/web/reverse.mdx index b480d665..3a5dd501 100644 --- a/docs/web/reverse.mdx +++ b/docs/web/reverse.mdx @@ -117,7 +117,7 @@ func main() { In some cases you might want to encourage users to set their primary name. This might be in the event you are issuing names, or want people to be part of a community. -Currently, primary names are only support on L1 mainnet. Soon, primary names are also coming to L2s and are already available on testnets. The examples below use the testnet deployments, for which the (latest code can be found here)[https://github.com/ensdomains/ens-contracts/pull/379]. +Currently, primary names are only support on L1 mainnet. Soon, primary names are also coming to L2s and are already available on testnets. The examples below use the testnet deployments, for which the [latest code can be found here](https://github.com/ensdomains/ens-contracts/pull/379). Deployments for the latest L2 reverse registrars, the contracts that power L2 primary names,