diff --git a/ensawards.org/astro.config.mjs b/ensawards.org/astro.config.mjs index e9d4b7ca..4514d95c 100644 --- a/ensawards.org/astro.config.mjs +++ b/ensawards.org/astro.config.mjs @@ -43,6 +43,8 @@ export default defineConfig({ "/leaderboards/referrer": "/ens-referral-program/editions/2025-12/leaderboard", "/ens-best-practices/contract-naming": "/ens-best-practices", + + "/leaderboards/defi": "/leaderboards/defi-protocol", }, adapter: vercel(), diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-portfolio.gif b/ensawards.org/data/apps/1inch-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-portfolio.gif new file mode 100644 index 00000000..a1b9eeee Binary files /dev/null and b/ensawards.org/data/apps/1inch-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-portfolio.gif differ diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-send.png b/ensawards.org/data/apps/1inch-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-send.png new file mode 100644 index 00000000..47e5cf8f Binary files /dev/null and b/ensawards.org/data/apps/1inch-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-send.png differ diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx b/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx new file mode 100644 index 00000000..f4cdf5c0 --- /dev/null +++ b/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx @@ -0,0 +1,62 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import type { AcceptanceTestBenchmark } from "data/acceptance-tests/types"; +import OneInchDeFi from "data/apps/1inch-defi"; +import { defineAppBenchmarks } from "data/benchmarks/registry"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; +import type { BestPracticeBenchmarks } from "data/ens-best-practices/types"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImagePortfolio from "./correctly-resolve-ensv2-test-name-address-proof-portfolio.gif"; +import correctlyResolveEnsv2TestNameAddressProofImageSend from "./correctly-resolve-ensv2-test-name-address-proof-send.png"; + +const benchmarks: BestPracticeBenchmarks = { + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, + "ensv2-ready-resolution": { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-09T12:41:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested for two different flows of the app: "send" + and "portfolio". In both cases the resolved address is NOT correct. +

+
+ 1inch defi app fails to resolve the name for ENSv2 + 1inch defi app fails to resolve the name for ENSv2 +
+
+ ), + } as const satisfies AcceptanceTestBenchmark, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(OneInchDeFi, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/1inch-defi/icon.tsx b/ensawards.org/data/apps/1inch-defi/icon.tsx new file mode 100644 index 00000000..4959f734 --- /dev/null +++ b/ensawards.org/data/apps/1inch-defi/icon.tsx @@ -0,0 +1,21 @@ +import React from "react"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/1inch-defi/index.ts b/ensawards.org/data/apps/1inch-defi/index.ts new file mode 100644 index 00000000..0d46c142 --- /dev/null +++ b/ensawards.org/data/apps/1inch-defi/index.ts @@ -0,0 +1,30 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying apps + +import OneInchProject from "data/projects/1inch/index.ts"; +import { asInterpretedName } from "enssdk"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import OneInchIcon from "./icon.tsx"; + +const OneInchDeFi: App = { + id: "1inch-defi", + appSlug: "1inch-defi", + type: AppTypes.DeFi, + project: OneInchProject, + name: '1inch"', + description: + "A DeFi aggregator app for swapping tokens across 13+ chains with the only native connection between Solana and EVM networks, with true self-custody and built-in security.", + socials: { + website: new URL("https://1inch.com/swap"), + twitter: new URL("https://x.com/1inch"), + ens: asInterpretedName("1inch.eth"), + }, + icon: OneInchIcon, + // TODO: Add OG images +}; + +defineApp(OneInchDeFi); + +export default OneInchDeFi; diff --git a/ensawards.org/data/apps/aave-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-v3.gif b/ensawards.org/data/apps/aave-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-v3.gif new file mode 100644 index 00000000..ae90fbd0 Binary files /dev/null and b/ensawards.org/data/apps/aave-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-v3.gif differ diff --git a/ensawards.org/data/apps/aave-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-v4.png b/ensawards.org/data/apps/aave-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-v4.png new file mode 100644 index 00000000..971914fa Binary files /dev/null and b/ensawards.org/data/apps/aave-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-v4.png differ diff --git a/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx b/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx new file mode 100644 index 00000000..aad7f05e --- /dev/null +++ b/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx @@ -0,0 +1,83 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import type { AcceptanceTestBenchmark } from "data/acceptance-tests/types"; +import AaveDeFi from "data/apps/aave-defi"; +import { defineAppBenchmarks } from "data/benchmarks/registry"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + acceptanceTestDetailsContainerStyles, + bestPracticeTechnicalDetailsLinkStyles, +} from "data/ens-best-practices/styles"; +import type { BestPracticeBenchmarks } from "data/ens-best-practices/types"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImageV3 from "./correctly-resolve-ensv2-test-name-address-proof-v3.gif"; +import correctlyResolveEnsv2TestNameAddressProofImageV4 from "./correctly-resolve-ensv2-test-name-address-proof-v4.png"; + +const benchmarks: BestPracticeBenchmarks = { + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, + "ensv2-ready-resolution": { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.PartialPass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-09T11:56:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested for two versions of the app:{" "} + + Aave (v3) + {" "} + and{" "} + + Aave Pro (v4) + {" "} + using the "watch" tool for both of them. The resolved address is correct for + the v4 version, but INCORRECT for the v3 variant. +

+
+ Aave defi app fails to resolve the name for ENSv2 + Aave Pro defi app correctly resolves the name for ENSv2 +
+
+ ), + } as const satisfies AcceptanceTestBenchmark, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(AaveDeFi, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/aave-defi/icon.tsx b/ensawards.org/data/apps/aave-defi/icon.tsx new file mode 100644 index 00000000..5c5873d2 --- /dev/null +++ b/ensawards.org/data/apps/aave-defi/icon.tsx @@ -0,0 +1,33 @@ +import React from "react"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/aave-defi/index.ts b/ensawards.org/data/apps/aave-defi/index.ts new file mode 100644 index 00000000..31408d0f --- /dev/null +++ b/ensawards.org/data/apps/aave-defi/index.ts @@ -0,0 +1,30 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying apps + +import AaveProject from "data/projects/aave/index.ts"; +import { asInterpretedName } from "enssdk"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import AaveIcon from "./icon.tsx"; + +const AaveDeFi: App = { + id: "aave-defi", + appSlug: "aave-defi", + type: AppTypes.DeFi, + project: AaveProject, + name: "Aave", + description: + "A decentralized lending app where users can supply assets to earn yield and borrow against their collateral across Ethereum and multiple L2 networks.", + socials: { + website: new URL("https://aave.com"), + twitter: new URL("https://x.com/aave"), + ens: asInterpretedName("aave.eth"), + }, + icon: AaveIcon, + // TODO: Add OG images +}; + +defineApp(AaveDeFi); + +export default AaveDeFi; diff --git a/ensawards.org/data/apps/lido-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-address.png b/ensawards.org/data/apps/lido-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-address.png new file mode 100644 index 00000000..0458d3bf Binary files /dev/null and b/ensawards.org/data/apps/lido-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-address.png differ diff --git a/ensawards.org/data/apps/lido-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/lido-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png new file mode 100644 index 00000000..db5ed579 Binary files /dev/null and b/ensawards.org/data/apps/lido-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png differ diff --git a/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx b/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx new file mode 100644 index 00000000..0de5a9fd --- /dev/null +++ b/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx @@ -0,0 +1,63 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import type { AcceptanceTestBenchmark } from "data/acceptance-tests/types"; +import LidoDeFi from "data/apps/lido-defi"; +import { defineAppBenchmarks } from "data/benchmarks/registry"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; +import type { BestPracticeBenchmarks } from "data/ens-best-practices/types.ts"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImageName from "./correctly-resolve-ensv2-test-name-address-proof.png"; +import correctlyResolveEnsv2TestNameAddressProofImageAddress from "./correctly-resolve-ensv2-test-name-address-proof-address.png"; + +const benchmarks: BestPracticeBenchmarks = { + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, + "ensv2-ready-resolution": { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.PartialPass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-09T13:49:30Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "rewards" explorer. The app + doesn't explicitly prompt the user to pass an ENS name as identifier, but when it + receives one, the resolved address is correct. +

+
+ Lido DeFi app correctly resolves the name for ENSv2 + Proof that the resolution flow is the same for address and name inputs +
+
+ ), + } as const satisfies AcceptanceTestBenchmark, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(LidoDeFi, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/lido-defi/icon.tsx b/ensawards.org/data/apps/lido-defi/icon.tsx new file mode 100644 index 00000000..994bcec0 --- /dev/null +++ b/ensawards.org/data/apps/lido-defi/icon.tsx @@ -0,0 +1,257 @@ +import React from "react"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +const Icon = ({ className, ...props }: React.SVGProps) => { + const reactId = React.useId(); + const id = (name: string) => `${reactId}-${name}`; + const url = (name: string) => `url(#${id(name)})`; + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default Icon; diff --git a/ensawards.org/data/apps/lido-defi/index.ts b/ensawards.org/data/apps/lido-defi/index.ts new file mode 100644 index 00000000..63c6d2f7 --- /dev/null +++ b/ensawards.org/data/apps/lido-defi/index.ts @@ -0,0 +1,28 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying apps + +import LidoProject from "data/projects/lido/index.ts"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import LidoIcon from "./icon.tsx"; + +const LidoDeFi: App = { + id: "lido-defi", + appSlug: "lido-defi", + type: AppTypes.DeFi, + project: LidoProject, + name: "Lido", + description: + "A DeFi app that lets users mint transferable utility tokens which earn rewards from Ethereum validation activity and remain usable as collateral, liquidity, or yield-bearing capital across other onchain protocols.", + socials: { + website: new URL("https://lido.fi/"), + twitter: new URL("https://x.com/lidofinance"), + }, + icon: LidoIcon, + // TODO: Add OG images +}; + +defineApp(LidoDeFi); + +export default LidoDeFi; diff --git a/ensawards.org/data/apps/types.ts b/ensawards.org/data/apps/types.ts index 6d05410a..8e7cd445 100644 --- a/ensawards.org/data/apps/types.ts +++ b/ensawards.org/data/apps/types.ts @@ -10,6 +10,7 @@ import type { Project } from "../projects/types.ts"; export const AppTypes = { Wallet: "wallet", Explorer: "explorer", + DeFi: "defi-app", } as const; /** diff --git a/ensawards.org/data/apps/uniswap-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/uniswap-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png new file mode 100644 index 00000000..7290f693 Binary files /dev/null and b/ensawards.org/data/apps/uniswap-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png differ diff --git a/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx b/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx new file mode 100644 index 00000000..fa6684af --- /dev/null +++ b/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx @@ -0,0 +1,54 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import type { AcceptanceTestBenchmark } from "data/acceptance-tests/types"; +import UniswapDeFi from "data/apps/uniswap-defi"; +import { defineAppBenchmarks } from "data/benchmarks/registry"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; +import type { BestPracticeBenchmarks } from "data/ens-best-practices/types.ts"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; + +const benchmarks: BestPracticeBenchmarks = { + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, + "ensv2-ready-resolution": { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-09T11:00:21Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "search" tool. The resolved + address is correct. +

+ Uniswap DeFi app correctly resolves the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(UniswapDeFi, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/uniswap-defi/icon.tsx b/ensawards.org/data/apps/uniswap-defi/icon.tsx new file mode 100644 index 00000000..2db804fd --- /dev/null +++ b/ensawards.org/data/apps/uniswap-defi/icon.tsx @@ -0,0 +1,55 @@ +import React from "react"; + +const Icon = (props: React.SVGProps) => ( + + + + + + + + + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/uniswap-defi/index.ts b/ensawards.org/data/apps/uniswap-defi/index.ts new file mode 100644 index 00000000..20f8a38a --- /dev/null +++ b/ensawards.org/data/apps/uniswap-defi/index.ts @@ -0,0 +1,30 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying apps + +import UniswapProject from "data/projects/uniswap/index.ts"; +import { asInterpretedName } from "enssdk"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import UniswapIcon from "./icon.tsx"; + +const UniswapDeFi: App = { + id: "uniswap-defi", + appSlug: "uniswap-defi", + type: AppTypes.DeFi, + project: UniswapProject, + name: "Uniswap", + description: + "A decentralized exchange app for swapping tokens and providing liquidity through automated market makers across Ethereum and 12+ other chains.", + socials: { + website: new URL("https://app.uniswap.org"), + twitter: new URL("https://x.com/Uniswap"), + ens: asInterpretedName("uniswap.eth"), + }, + icon: UniswapIcon, + // TODO: Add OG images +}; + +defineApp(UniswapDeFi); + +export default UniswapDeFi; diff --git a/ensawards.org/data/apps/utils.test.ts b/ensawards.org/data/apps/utils.test.ts index 8304819b..c13ad2a9 100644 --- a/ensawards.org/data/apps/utils.test.ts +++ b/ensawards.org/data/apps/utils.test.ts @@ -95,6 +95,8 @@ describe("App utils", () => { describe("validateAppType", () => { it("Should return the app type for a valid AppType value", () => { expect(asAppType("wallet")).toEqual(AppTypes.Wallet); + expect(asAppType("explorer")).toEqual(AppTypes.Explorer); + expect(asAppType("defi-app")).toEqual(AppTypes.DeFi); }); it("Should throw an error for an invalid AppType value", () => { @@ -213,7 +215,7 @@ describe("App utils", () => { describe("appliesToAllApps", () => { it("Should return true when all app types are included in targets", () => { - expect(appliesToAllApps([AppTypes.Wallet, AppTypes.Explorer])).toEqual(true); + expect(appliesToAllApps([AppTypes.Wallet, AppTypes.Explorer, AppTypes.DeFi])).toEqual(true); }); it("Should return false when not all app types are included in targets", () => { diff --git a/ensawards.org/data/apps/utils.ts b/ensawards.org/data/apps/utils.ts index 72ff4622..36c2ab8e 100644 --- a/ensawards.org/data/apps/utils.ts +++ b/ensawards.org/data/apps/utils.ts @@ -27,6 +27,8 @@ export const asAppType = (maybeAppType: string): AppType => { return AppTypes.Wallet; case "explorer": return AppTypes.Explorer; + case "defi-app": + return AppTypes.DeFi; default: throw new Error(`Invalid AppType value: ${maybeAppType}`); } @@ -126,12 +128,17 @@ export const formatAppType = ( formattedType = plural ? "Explorers" : "Explorer"; break; + case AppTypes.DeFi: + formattedType = plural ? "DeFi apps" : "DeFi app"; + break; + default: const _exhaustive: never = appType; throw new Error(`Unsupported AppType: ${_exhaustive}`); } - if (lowercase) { + // Keep "DeFi" capitalized even when `lowercase` option is true + if (lowercase && appType !== AppTypes.DeFi) { formattedType = formattedType.toLowerCase(); } diff --git a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/index.ts b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/index.ts index fa2f8df4..34fa09ab 100644 --- a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/index.ts +++ b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/index.ts @@ -19,7 +19,7 @@ const displayNamedSmartContractsL2: BestPracticeApp = { description: "Display ENS names instead of addresses when users interact with named smart contracts on L2 chains.", category: ContractNamingCategory, - appliesTo: [AppTypes.Wallet, AppTypes.Explorer], + appliesTo: [AppTypes.Wallet, AppTypes.Explorer, AppTypes.DeFi], technicalDetails: technicalDetails, contributions: [ { from: contributors.lightwalker, lastUpdated: parseTimestamp("2025-11-03T11:25:00.000Z") }, diff --git a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/index.ts b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/index.ts index 9b918bef..97d0ad44 100644 --- a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/index.ts +++ b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/index.ts @@ -19,7 +19,7 @@ const displayNamedSmartContractsMainnet: BestPracticeApp = { description: "Display ENS names instead of addresses when users interact with named smart contracts on Ethereum mainnet.", category: ContractNamingCategory, - appliesTo: [AppTypes.Wallet, AppTypes.Explorer], + appliesTo: [AppTypes.Wallet, AppTypes.Explorer, AppTypes.DeFi], technicalDetails: technicalDetails, contributions: [ { from: contributors.lightwalker, lastUpdated: parseTimestamp("2025-11-03T11:25:00.000Z") }, diff --git a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/index.ts b/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/index.ts index 08b18795..f89294d3 100644 --- a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/index.ts +++ b/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/index.ts @@ -18,7 +18,7 @@ const ensv2ReadyResolution: BestPracticeApp = { name: "Correctly Resolve All Names For ENSv2", description: "Make sure your app keeps resolving ENS names correctly once ENSv2 launches.", category: ENSv2ReadinessCategory, - appliesTo: [AppTypes.Wallet, AppTypes.Explorer], + appliesTo: [AppTypes.Wallet, AppTypes.Explorer, AppTypes.DeFi], technicalDetails: technicalDetails, contributions: [ { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-05T13:01:00.000Z") }, diff --git a/ensawards.org/data/ens-best-practices/utils.ts b/ensawards.org/data/ens-best-practices/utils.ts index c41712bd..55ed4b8c 100644 --- a/ensawards.org/data/ens-best-practices/utils.ts +++ b/ensawards.org/data/ens-best-practices/utils.ts @@ -151,6 +151,10 @@ export const formatBestPracticeTarget = ( formattedTarget = plural ? "Wallets" : "Wallet"; break; + case AppTypes.DeFi: + formattedTarget = plural ? "DeFi apps" : "DeFi app"; + break; + case ProtocolTypes.DAO: formattedTarget = plural ? "DAOs" : "DAO"; break; diff --git a/ensawards.org/data/projects/1inch/icon.tsx b/ensawards.org/data/projects/1inch/icon.tsx new file mode 100644 index 00000000..4959f734 --- /dev/null +++ b/ensawards.org/data/projects/1inch/icon.tsx @@ -0,0 +1,21 @@ +import React from "react"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + + +); + +export default Icon; diff --git a/ensawards.org/data/projects/1inch/index.ts b/ensawards.org/data/projects/1inch/index.ts new file mode 100644 index 00000000..5ddaef39 --- /dev/null +++ b/ensawards.org/data/projects/1inch/index.ts @@ -0,0 +1,23 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying projects + +import { defineProject } from "../registry.ts"; +import type { Project } from "../types.ts"; +import { ProjectIds } from "../types.ts"; +import OneInchIcon from "./icon.tsx"; + +const OneInchProject: Project = { + id: ProjectIds.OneInch, + name: "1inch", + description: + "A DeFi ecosystem integrating 13+ chains with the only native connection between Solana and EVM networks, helping users trade, hold, and track digital assets with true self-custody.", + icon: OneInchIcon, + socials: { + website: new URL("https://1inch.com/"), + twitter: new URL("https://x.com/1inch"), + }, +}; + +defineProject(OneInchProject); + +export default OneInchProject; diff --git a/ensawards.org/data/projects/lido/icon.tsx b/ensawards.org/data/projects/lido/icon.tsx new file mode 100644 index 00000000..994bcec0 --- /dev/null +++ b/ensawards.org/data/projects/lido/icon.tsx @@ -0,0 +1,257 @@ +import React from "react"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +const Icon = ({ className, ...props }: React.SVGProps) => { + const reactId = React.useId(); + const id = (name: string) => `${reactId}-${name}`; + const url = (name: string) => `url(#${id(name)})`; + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default Icon; diff --git a/ensawards.org/data/projects/lido/index.ts b/ensawards.org/data/projects/lido/index.ts new file mode 100644 index 00000000..16dd360f --- /dev/null +++ b/ensawards.org/data/projects/lido/index.ts @@ -0,0 +1,23 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying projects + +import { defineProject } from "data/projects/registry"; +import { type Project, ProjectIds } from "data/projects/types"; + +import LidoIcon from "./icon.tsx"; + +const LidoProject: Project = { + id: ProjectIds.Lido, + name: "Lido", + description: + "A family of open-source software on Ethereum that lets users mint transferable utility tokens which earn rewards linked to validation activity while remaining usable across other onchain apps.", + icon: LidoIcon, + socials: { + website: new URL("https://lido.fi/"), + twitter: new URL("https://x.com/lidofinance"), + }, +}; + +defineProject(LidoProject); + +export default LidoProject; diff --git a/ensawards.org/data/projects/types.ts b/ensawards.org/data/projects/types.ts index d39d0f2e..8f5842fb 100644 --- a/ensawards.org/data/projects/types.ts +++ b/ensawards.org/data/projects/types.ts @@ -28,6 +28,8 @@ export const ProjectIds = { World: "project-world", Trust: "project-trust", Phantom: "project-phantom", + OneInch: "project-1inch", + Lido: "project-lido", } as const; /** diff --git a/ensawards.org/data/protocols/types.ts b/ensawards.org/data/protocols/types.ts index 7ffe034b..af124f47 100644 --- a/ensawards.org/data/protocols/types.ts +++ b/ensawards.org/data/protocols/types.ts @@ -49,7 +49,7 @@ export type ProtocolId = (typeof ProtocolIds)[keyof typeof ProtocolIds]; export const ProtocolTypes = { DAO: "dao", - DeFi: "defi", + DeFi: "defi-protocol", } as const; export type ProtocolType = (typeof ProtocolTypes)[keyof typeof ProtocolTypes]; diff --git a/ensawards.org/data/protocols/utils.ts b/ensawards.org/data/protocols/utils.ts index 25d43514..84edb291 100644 --- a/ensawards.org/data/protocols/utils.ts +++ b/ensawards.org/data/protocols/utils.ts @@ -84,7 +84,7 @@ export const asProtocolType = (maybeProtocolType: string): ProtocolType => { case "dao": return ProtocolTypes.DAO; - case "defi": + case "defi-protocol": return ProtocolTypes.DeFi; default: @@ -135,7 +135,7 @@ export const formatProtocolType = ( switch (protocolType) { case ProtocolTypes.DeFi: - return lowercase ? "defi" : "DeFi"; + return lowercase ? "defi protocol" : "DeFi protocol"; case ProtocolTypes.DAO: return lowercase ? "dao" : "DAO"; diff --git a/ensawards.org/public/defi_leaderboard_og_image.png b/ensawards.org/public/defi-protocol_leaderboard_og_image.png similarity index 100% rename from ensawards.org/public/defi_leaderboard_og_image.png rename to ensawards.org/public/defi-protocol_leaderboard_og_image.png diff --git a/ensawards.org/public/defi_leaderboard_twitter_og_image.png b/ensawards.org/public/defi-protocol_leaderboard_twitter_og_image.png similarity index 100% rename from ensawards.org/public/defi_leaderboard_twitter_og_image.png rename to ensawards.org/public/defi-protocol_leaderboard_twitter_og_image.png diff --git a/ensawards.org/src/components/contract-naming-season/ContractNamingHero.astro b/ensawards.org/src/components/contract-naming-season/ContractNamingHero.astro index 4c0e763a..a3a85d98 100644 --- a/ensawards.org/src/components/contract-naming-season/ContractNamingHero.astro +++ b/ensawards.org/src/components/contract-naming-season/ContractNamingHero.astro @@ -67,7 +67,7 @@ import { shadcnButtonVariants } from "../ui/shadcnButtonStyles"; )}>DAO leaderboard + viewDetailsText={`${formatProtocolType(protocolType)} report`}> {idx < 3 ? ( {`${idx + viewDetailsText={`${formatProtocolType(protocolType)} report`}> {`${idx + viewDetailsText={`${formatProtocolType(protocolType, { lowercase: false })} report`}> {idx < 3 ? (