diff --git a/.agents/skills/generate-app-benchmark/SKILL.md b/.agents/skills/generate-app-benchmark/SKILL.md new file mode 100644 index 00000000..0a73939b --- /dev/null +++ b/.agents/skills/generate-app-benchmark/SKILL.md @@ -0,0 +1,338 @@ +--- +name: generate-app-benchmark +description: >- + Generate ENS Awards app benchmark `index.tsx` files for a target best practice + from a `manual.json` test log and nearby proof images. Use when asked to + unwrap/scaffold benchmark boilerplate for one or more apps against a best + practice (e.g. "deposit-addresses"), turning manual test results into typed + AcceptanceTestBenchmarks. +disable-model-invocation: true +--- + +# Generate App Benchmark + +Turn a hand-written `manual.json` test log plus nearby proof images into a typed +`index.tsx` benchmark file for a target best practice, for each app in a list. + +## Inputs + +1. **apps** — list of app slugs (directory names under `ensawards.org/data/apps/`). +2. **best practice** — target `bestPracticeSlug` (e.g. `deposit-addresses`). +3. **contributor** — a key from the `contributors` record (e.g. `llev`). +4. **datetime** (optional) — ISO-8601 UTC timestamp for the contribution's + `lastUpdated`. Default to the machine's current time: + `date -u +%Y-%m-%dT%H:%M:%SZ`. + +## Workflow + +Copy this checklist and track progress: + +``` +- [ ] Step 1: Resolve the best practice's ordered acceptance test slugs +- [ ] Step 2: Resolve datetime (use input or current UTC time) +- [ ] For each app: + - [ ] Step 3: Locate manual.json + proof media + - [ ] Step 3b: Normalize proof media to .png / .gif + - [ ] Step 4: Generate the best-practice index.tsx + - [ ] Step 5: Wire it into the app's main benchmarks/index.tsx +- [ ] Step 6: Typecheck +``` + +### Step 1: Resolve acceptance test slugs + note builders (once) + +The `manual.json` test `id`s map **positionally** (1-based) to the best +practice's acceptance tests, in declaration order. Read them from the best +practice's technical details: + +``` +ensawards.org/data/ens-best-practices/**//technicalDetails.tsx +``` + +Sort the acceptance tests by `order` (slug as the tiebreaker) before mapping `manual.json` ids to slugs. + +#### Prefer the best practice's shared note builders + +A best practice may ship a `notes.tsx` module next to its `technicalDetails.tsx`: + +``` +ensawards.org/data/ens-best-practices///notes.tsx +``` + +If it exists, **the benchmark notes must be generated with these builders** — +do **not** hand-write `
`/`

`/`` markup or import the canonical +`*Span` constants into the app file. Each acceptance test always exercises the +same ENS name, expected address, and chain, so those are already baked into the +builders. The app file only supplies what varies per app: + +- `method` — how the test was run (e.g. `'the "send" flow'`) +- `proof` — the screenshot(s) (`{ image, alt }`, or an array for multiple) +- which builder you call (encodes the result + acceptance test) + +Read `notes.tsx` to see the available builders. `deposit-addresses` exports, for +example: + +- `buildPassNoteForAT1`…`buildPassNoteForAT8` — a name resolves correctly. +- `buildFailNoteForAT1`…`buildFailNoteForAT8` — a name fails to resolve; each + takes an optional `extra` follow-up sentence for app-specific detail. +- `buildEnsNotSupportedNote` — the app doesn't accept ENS names at all (AT1). +- `buildNotApplicableForNonEvmChain({ chain })` — Bitcoin / Solana not supported. +- `buildNotApplicableForFailedTest({ testNumber, scope })` — a prerequisite test + failed (`scope` defaults to `"at all"`; use `"on Base"` for the AT5 cascade). +- `buildBenchmarkNote({ children, proof })` — escape hatch for an unusual result + no builder covers. Only here may you import `*Span` constants from + `technicalDetails` to write custom prose. + +If `notes.tsx` doesn't exist for the target best practice, fall back to writing +notes inline (see the legacy guidance at the end of Step 4), referencing the +exported `*Span` constants from `technicalDetails.tsx` (add `export` if missing). + +### Step 3: Locate manual.json + proof media (per app) + +Search the app's benchmarks dir: + +``` +ensawards.org/data/apps//benchmarks/**/manual.json +``` + +Pick the `manual.json` whose directory corresponds to the target best practice. +Proof media sit in the **same directory**, named with a +trailing test id: `at-.` or `ac-.`. Match each file to a test +by its id. A test may have no media. Source files can be images (`.png`, `.jpg`, +`.webp`, ...) or screen recordings (`.mov`, `.mp4`, ...). + +### Step 3b: Normalize proof media to .png / .gif + +The benchmark file may only reference `.png` or `.gif` assets. Normalize each +proof file `at-.` in place, then `git rm` the original if its extension +changed: + +| Source | Action | +| ----------------------------------------------------------- | ----------------------- | +| `.png` | keep as-is | +| `.gif` | keep as-is | +| other image (`.jpg`/`.jpeg`/`.webp`/`.heic`/`.tiff`/`.bmp`) | convert → `at-.png` | +| video (`.mov`/`.mp4`/`.m4v`/`.webm`/`.avi`/`.mkv`) | convert → `at-.gif` | + +Conversions can be finicky; pick commands by OS (default to **macOS**). + +**Image → PNG** + +macOS (built-in `sips`, no install): + +```bash +sips -s format png "at-1.jpg" --out "at-1.png" && git rm "at-1.jpg" +``` + +Windows (ImageMagick): + +```powershell +magick "at-1.jpg" "at-1.png"; git rm "at-1.jpg" +``` + +**Video → GIF** (both OSes use `ffmpeg`; install via `brew install ffmpeg` / +`winget install Gyan.FFmpeg` if missing): + +```bash +ffmpeg -y -i "at-5.mov" \ + -vf "fps=12,scale=800:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \ + -loop 0 "at-5.gif" && git rm "at-5.mov" +``` + +Tune `fps` / `scale` down if the resulting `.gif` is large. After this step every +proof file is a `.png` or `.gif`, and that final extension is what the import in +Step 4 must reference. + +`manual.json` schema: + +```json +{ + "method": "Default description of how every test was run.", + "tests": [ + { "id": 1, "status": "passed", "reason": "Shown correct address" }, + { "id": 5, "status": "failed", "reason": "...", "method": "Per-test method override" }, + { "id": 6, "status": "not-applicable", "reason": "app doesn't support Bitcoin" } + ] +} +``` + +Status → result mapping: + +| `status` | `BenchmarkResults` | +| ------------------ | -------------------------------- | +| `passed` | `BenchmarkResults.Pass` | +| `partially-passed` | `BenchmarkResults.PartialPass` | +| `failed` | `BenchmarkResults.Fail` | +| `not-applicable` | `BenchmarkResults.NotApplicable` | + +### Step 4: Generate `index.tsx` + +Write `index.tsx` in the directory that holds `manual.json` (replace any empty +`index.ts` there — JSX requires `.tsx`). Export a default +`AcceptanceTestBenchmarks` keyed by acceptance test slug. Include **one entry per +test present in `manual.json`** (keyed by the slug at that id's position). + +Notes: call the right note builder per entry (see Step 1). Pick the builder from +the acceptance test id (its 1-based position) and the recorded `status`, then pass: + +- `method` — derive a short phrase from the per-test `method` override (else the + global `method`) describing **how** the test was run. Omit the chain context the + builder already bakes in (e.g. don't repeat "on Base" for the AT5 builder). +- `proof` — `{ image: , alt: " ..." }` when a matching proof image + exists; multiple images → pass an array. Omit when there's no proof. +- `extra` (fail builders) — an optional extra sentence for app-specific detail + (e.g. `'The app showed an "invalid domain format" error instead.'`). + +The `reason` and `method` strings are **not strict** — they are author notes, not +literal copy. Use them to choose the builder and to phrase `method`/`extra` +naturally and accurately; just don't contradict the recorded `status`. + +File template (deposit-addresses; import only the builders + proofs you use): + +```tsx +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildPassNoteForAT1, + // ...one builder per emitted test +} from "data/ens-best-practices///notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +// ...more proof imports + +const = { + "": { + result: BenchmarkResults.Pass, + contributions: [{ from: contributors., lastUpdated: parseTimestamp("") }], + notes: buildPassNoteForAT1({ + method: "", + proof: { image: at1Proof, alt: " correctly resolves ..." }, + }), + }, + // ...more entries +} as const satisfies AcceptanceTestBenchmarks; + +export default ; +``` + +The single `} as const satisfies AcceptanceTestBenchmarks;` at the end type-checks +every entry, so individual entries don't need a per-entry +`as const satisfies AcceptanceTestBenchmark` (and the `AcceptanceTestBenchmark` +type import isn't needed in deposit-addresses files). + +Result-specific entry examples — match these renderings: + +**Passed** (proof image present): + +```tsx +"at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [{ from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-15T06:40:48Z") }], + notes: buildPassNoteForAT1({ + method: "the name lookup search on etherscan.io", + proof: { image: at1Proof, alt: "Etherscan correctly resolves the deposit address" }, + }), +}, +``` + +**Failed** (the builder bakes in the ENS name, expected address, and `NOT` +emphasis; add `extra` for any app-specific detail): + +```tsx +"at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [{ from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-09T06:37:10Z") }], + notes: buildFailNoteForAT5({ + method: "the name lookup search on basescan.org", + proof: { image: at5Proof, alt: "Etherscan fails to resolve the Base deposit address" }, + extra: "The app showed the Ethereum Mainnet address instead.", + }), +}, +``` + +**Not applicable** (no proof needed — omit `proof`): + +```tsx +"at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [{ from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-08T16:18:00Z") }], + notes: buildNotApplicableForNonEvmChain({ chain: "Bitcoin" }), +}, +``` + +**Escape hatch** (result a builder doesn't cover — write custom prose; this is the +only place you may import `*Span` constants from `technicalDetails`): + +```tsx +notes: buildBenchmarkNote({ + proof: { image: at2Proof, alt: "..." }, + children: ( + <> + Tested using {method}. For {ethereumUnnormalizedEnsNameSpan} the resolved address is correct + ({ethereumAddressSpan}), but the app behaves inconsistently ... so we count this as a failure. + + ), +}), +``` + +**Legacy fallback** (only when the best practice has no `notes.tsx`): write the +note inline as `

` +with a `

` and optional ``, naming the concrete ENS name and expected +address via the `*Span` constants imported from `technicalDetails.tsx`. + +### Step 5: Wire into the app's main benchmarks file + +In `ensawards.org/data/apps//benchmarks/index.tsx`, replace the target best +practice's placeholder block (the slug mapping to `undefined` entries) with a +reference to the generated module, and add the import: + +```tsx +import depositAddresses from "./resolution/deposit-addresses"; +// ... + "deposit-addresses": depositAddresses, +``` + +Use the actual directory where `manual.json` lives for the import path. Remove +any imports in the main file that become unused as a result. + +### Step 6: Typecheck + +```bash +cd ensawards.org && pnpm astro sync && pnpm exec tsc --noEmit +``` + +Fix any errors before finishing. The IDE may show a stale "is not a module" +error referencing a deleted `index.ts`; `tsc` is the source of truth. + +## Special overrides + +### deposit-addresses + +Use the `notes.tsx` builders (see Step 1) for these recurring patterns instead of +writing markup: + +- **App doesn't accept ENS names at all** (AT1 fails this way): use + `buildEnsNotSupportedNote({ method, proof })`. The remaining acceptance tests + then become Not Applicable via `buildNotApplicableForFailedTest({ testNumber: 1 })` + (default `scope: "at all"`). +- **`not-applicable` because a dependent test failed** (e.g. `reason` says + "at#5 is failed"): `buildNotApplicableForFailedTest({ testNumber, scope })`. + For the AT5 / Base cascade pass `scope: "on Base"`. +- **Non-EVM chain not supported** (Bitcoin / Solana): + `buildNotApplicableForNonEvmChain({ chain: "Bitcoin" })` / + `{ chain: "Solana" }` (pass `proof` if a screenshot exists). + +Never import `*Span` constants or `bestPracticeTechnicalDetailsCodeStyles` / +`acceptanceTestDetailsContainerStyles` into a deposit-addresses app file — the +builders own all of that. The only exception is the `buildBenchmarkNote` escape +hatch, where you write custom prose and may import the spans you need. + +## Notes + +- Only emit entries for ids present in `manual.json`. Other acceptance tests of + the best practice stay `undefined` in the main file (or are omitted from the + generated module and left `undefined` in the main file). +- Keep import grouping/order consistent with existing benchmark files: `data/*` + imports, then `@ensnode/*`, then `@/*`, then relative imports. diff --git a/.gitignore b/.gitignore index e2c28a4e..9f36a828 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,6 @@ dist .codex .vscode/mcp.json .claude + +# Manual files for benchmark skill +ensawards.org/data/apps/*/benchmarks/**/manual.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3c52b28d..6bf3862a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -228,7 +228,7 @@ For reference see [ensawards.org/data/ens-best-practices/contract-naming/name-yo [ensawards.org/data/ens-best-practices/types.ts](ensawards.org/data/ens-best-practices/types.ts) file. ```typescript export interface BestPracticeTechnicalDetails { - useCaseSummary: JSX.Element; + ensBestPracticeOverview: JSX.Element; benefitFromUsingEns: JSX.Element; /** Title for the benefit card. Defaults to "Benefit from using ENS" when omitted. */ benefitFromUsingEnsTitle?: string; @@ -309,6 +309,9 @@ For reference, see [ensawards.org/data/ens-best-practices/contract-naming/name-y examplePartialPass?: AcceptanceTestBenchmarkPartialPass; exampleFail?: AcceptanceTestBenchmarkFail; exampleNotApplicable?: NotApplicableAcceptanceTestBenchmark; + + /** Sort priority within a {@link BestPractice}; lower comes first, undefined sorts last (then by slug). */ + order?: number; } ``` 4. In your PR describe your reasoning for adding it. @@ -348,9 +351,9 @@ export interface BestPracticeCategory { ### Suggest a `benchmark update` -1. To suggest a benchmark update for an existing app, modify its `benchmarks` record in the -[ensawards.org/data/apps/[app-directory]/benchmarks/index.tsx](ensawards.org/data/apps/rainbow-wallet/benchmarks/index.tsx) file -where `[app-directory]` represents the slug of the relevant app. These records define relationships between benchmarks and best practices. Their data model is available at +1. To suggest a benchmark update for an existing app, modify its relevant `benchmarks` record in the +[ensawards.org/data/apps/[app-directory]/benchmarks/[best-practice-category-slug]/[best-practice-slug]/index.tsx](ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/index.tsx) file +where `[app-directory]`, `[best-practice-category-slug]`, and `[best-practice-slug]` represent the slugs of the relevant app, best practice category, and best practice. These records define relationships between benchmarks and best practices. Their data model is available at [ensawards.org/data/ens-best-practices/types.ts](ensawards.org/data/ens-best-practices/types.ts). ```typescript @@ -366,7 +369,7 @@ export type BestPracticeBenchmarks = Record`/`

`/`` by hand. Every acceptance test always exercises the same ENS name, expected address, and chain, so the builders bake those in for you — you only supply what actually varies per app: how you tested it (`method`) and the proof screenshot(s) (`proof`). This keeps notes consistent and accurate, and makes them easy to update later. + +For example, the `deposit-addresses` best practice (see [ensawards.org/data/ens-best-practices/resolution/deposit-addresses/notes.tsx](ensawards.org/data/ens-best-practices/resolution/deposit-addresses/notes.tsx)) exports builders such as `buildPassNoteForAT1`, `buildFailNoteForAT5`, `buildEnsNotSupportedNote`, `buildNotApplicableForNonEvmChain`, and `buildNotApplicableForFailedTest`. A benchmark entry then reads: + +```tsx +import { + buildFailNoteForAT5, + buildPassNoteForAT1, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +// ... + +"at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [{ from: contributors.you, lastUpdated: parseTimestamp("2026-06-19T11:48:58Z") }], + notes: buildPassNoteForAT1({ + method: 'the "send" flow', + proof: { image: at1Proof, alt: "MyApp correctly resolves the address for vitalik.eth" }, + }), +}, +``` + +The `fail` builders also accept an optional `extra` sentence for app-specific detail, and there's a `buildBenchmarkNote` escape hatch for the rare result no builder covers. For full per-app references see [ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/index.tsx](ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/index.tsx) and [ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/index.tsx](ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/index.tsx). + +#### Writing notes by hand (when there's no `notes.tsx`) + +If the relevant best practice doesn't provide note builders, write the `notes` JSX element directly as part of the new item in the `benchmarks` record. For reference, see [ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx](ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx). diff --git a/ensawards.org/astro.config.mjs b/ensawards.org/astro.config.mjs index 4514d95c..1a509a4f 100644 --- a/ensawards.org/astro.config.mjs +++ b/ensawards.org/astro.config.mjs @@ -45,6 +45,75 @@ export default defineConfig({ "/ens-best-practices/contract-naming": "/ens-best-practices", "/leaderboards/defi": "/leaderboards/defi-protocol", + + // The `ensv2-readiness` best practice category was renamed to `resolution`. + "/ens-best-practices/ensv2-readiness/ensv2-ready-resolution": + "/ens-best-practices/resolution/ensv2-ready-resolution", + + "/app/1inch-defi/ensv2-readiness/ensv2-ready-resolution": + "/app/1inch-defi/resolution/ensv2-ready-resolution", + "/app/aave-defi/ensv2-readiness/ensv2-ready-resolution": + "/app/aave-defi/resolution/ensv2-ready-resolution", + "/app/ambire-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/ambire-wallet/resolution/ensv2-ready-resolution", + "/app/binance-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/binance-exchange/resolution/ensv2-ready-resolution", + "/app/binance-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/binance-wallet/resolution/ensv2-ready-resolution", + "/app/blockscout-explorer/ensv2-readiness/ensv2-ready-resolution": + "/app/blockscout-explorer/resolution/ensv2-ready-resolution", + "/app/coinbase-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/coinbase-exchange/resolution/ensv2-ready-resolution", + "/app/coinbase-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/coinbase-wallet/resolution/ensv2-ready-resolution", + "/app/cryptocom-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/cryptocom-exchange/resolution/ensv2-ready-resolution", + "/app/cryptocom-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/cryptocom-wallet/resolution/ensv2-ready-resolution", + "/app/etherscan-explorer/ensv2-readiness/ensv2-ready-resolution": + "/app/etherscan-explorer/resolution/ensv2-ready-resolution", + "/app/frame-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/frame-wallet/resolution/ensv2-ready-resolution", + "/app/gemini-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/gemini-wallet/resolution/ensv2-ready-resolution", + "/app/kraken-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/kraken-exchange/resolution/ensv2-ready-resolution", + "/app/kraken-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/kraken-wallet/resolution/ensv2-ready-resolution", + "/app/lido-defi/ensv2-readiness/ensv2-ready-resolution": + "/app/lido-defi/resolution/ensv2-ready-resolution", + "/app/metamask-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/metamask-wallet/resolution/ensv2-ready-resolution", + "/app/okx-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/okx-exchange/resolution/ensv2-ready-resolution", + "/app/okx-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/okx-wallet/resolution/ensv2-ready-resolution", + "/app/phantom-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/phantom-wallet/resolution/ensv2-ready-resolution", + "/app/rabby-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/rabby-wallet/resolution/ensv2-ready-resolution", + "/app/rainbow-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/rainbow-wallet/resolution/ensv2-ready-resolution", + "/app/readyx-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/readyx-wallet/resolution/ensv2-ready-resolution", + "/app/robinhood-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/robinhood-exchange/resolution/ensv2-ready-resolution", + "/app/robinhood-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/robinhood-wallet/resolution/ensv2-ready-resolution", + "/app/safe-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/safe-wallet/resolution/ensv2-ready-resolution", + "/app/status-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/status-wallet/resolution/ensv2-ready-resolution", + "/app/trust-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/trust-wallet/resolution/ensv2-ready-resolution", + "/app/uniswap-defi/ensv2-readiness/ensv2-ready-resolution": + "/app/uniswap-defi/resolution/ensv2-ready-resolution", + "/app/walletchan-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/walletchan-wallet/resolution/ensv2-ready-resolution", + "/app/worldapp-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/worldapp-wallet/resolution/ensv2-ready-resolution", + "/app/zerion-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/zerion-wallet/resolution/ensv2-ready-resolution", }, adapter: vercel(), diff --git a/ensawards.org/data/acceptance-tests/types.ts b/ensawards.org/data/acceptance-tests/types.ts index 96256a02..16eb1653 100644 --- a/ensawards.org/data/acceptance-tests/types.ts +++ b/ensawards.org/data/acceptance-tests/types.ts @@ -47,6 +47,9 @@ export interface AcceptanceTest { examplePartialPass?: AcceptanceTestBenchmarkPartialPass; exampleFail?: AcceptanceTestBenchmarkFail; exampleNotApplicable?: AcceptanceTestBenchmarkNotApplicable; + + /** Sort priority within a {@link BestPractice}; lower comes first, undefined sorts last (then by slug). */ + order?: number; } /** diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx b/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx index f4cdf5c0..bf908e4f 100644 --- a/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx +++ b/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx @@ -1,22 +1,17 @@ // 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 depositAddresses from "./resolution/deposit-address"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -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. @@ -27,34 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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); diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-1.gif b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-1.gif new file mode 100644 index 00000000..f451b9a6 Binary files /dev/null and b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-1.gif differ diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-2.gif b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-2.gif new file mode 100644 index 00000000..e2f9d7a5 Binary files /dev/null and b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-2.gif differ diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-3.gif b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-3.gif new file mode 100644 index 00000000..95e2cf0c Binary files /dev/null and b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-3.gif differ diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-4.png b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-4.png new file mode 100644 index 00000000..abf485ed Binary files /dev/null and b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-4.png differ diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-5.gif b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-5.gif new file mode 100644 index 00000000..b783eb1a Binary files /dev/null and b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-5.gif differ diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-7.png b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-7.png new file mode 100644 index 00000000..78a3d033 Binary files /dev/null and b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/at-7.png differ diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/index.tsx b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/index.tsx new file mode 100644 index 00000000..046cb4f9 --- /dev/null +++ b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/deposit-address/index.tsx @@ -0,0 +1,113 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying apps + +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT4, + buildFailNoteForAT5, + buildFailNoteForAT7, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT3, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.gif"; +import at2Proof from "./at-2.gif"; +import at3Proof from "./at-3.gif"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.gif"; +import at7Proof from "./at-7.png"; + +const evmWalletMethod = 'the "send" feature on 1inch.com with a connected EVM wallet'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T15:10:01Z") }, + ], + notes: buildPassNoteForAT1({ + method: evmWalletMethod, + proof: { + image: at1Proof, + alt: "1inch correctly resolves the direct onchain subname address", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T15:10:01Z") }, + ], + notes: buildPassNoteForAT2({ + method: evmWalletMethod, + proof: { image: at2Proof, alt: "1inch correctly resolves a name requiring normalization" }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T15:10:01Z") }, + ], + notes: buildPassNoteForAT3({ + method: evmWalletMethod, + proof: { image: at3Proof, alt: "1inch correctly implements CCIP-Read for .eth subnames" }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T15:10:01Z") }, + ], + notes: buildFailNoteForAT4({ + method: evmWalletMethod, + proof: { image: at4Proof, alt: "1inch fails to resolve an offchain DNS name" }, + extra: 'The app showed an "invalid domain format" error instead.', + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T15:10:01Z") }, + ], + notes: buildFailNoteForAT5({ + method: + 'the "send" feature for ETH on the Base network on the main page of 1inch.com with a connected EVM wallet', + proof: { image: at5Proof, alt: "1inch fails to resolve the Base deposit address" }, + extra: "The app showed the Ethereum Mainnet address instead.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T15:10:01Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Bitcoin" }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T15:10:01Z") }, + ], + notes: buildFailNoteForAT7({ + method: 'the "send" feature on 1inch.com with a connected Solana wallet', + proof: { image: at7Proof, alt: "1inch fails to resolve a Solana address using ENS" }, + extra: "Sending to it using its ENS name was not possible.", + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T15:10:01Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; 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/resolution/ensv2-ready-resolution/ac-1.1.gif similarity index 100% rename from ensawards.org/data/apps/1inch-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-portfolio.gif rename to ensawards.org/data/apps/1inch-defi/benchmarks/resolution/ensv2-ready-resolution/ac-1.1.gif 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/resolution/ensv2-ready-resolution/ac-1.2.png similarity index 100% rename from ensawards.org/data/apps/1inch-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-send.png rename to ensawards.org/data/apps/1inch-defi/benchmarks/resolution/ensv2-ready-resolution/ac-1.2.png diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..aec25120 --- /dev/null +++ b/ensawards.org/data/apps/1inch-defi/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,46 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImagePortfolio from "./ac-1.1.gif"; +import correctlyResolveEnsv2TestNameAddressProofImageSend from "./ac-1.2.png"; + +const ensv2ReadyResolution = { + "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 AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx b/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx index aad7f05e..97e2a68a 100644 --- a/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx +++ b/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx @@ -1,25 +1,17 @@ // 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 depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -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. @@ -30,52 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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); diff --git a/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..20d95c33 Binary files /dev/null and b/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..0e63ef73 Binary files /dev/null and b/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..8064a9c1 Binary files /dev/null and b/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/at-4.png b/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/at-4.png new file mode 100644 index 00000000..f62c77d3 Binary files /dev/null and b/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/at-4.png differ diff --git a/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..8d6f97a0 --- /dev/null +++ b/ensawards.org/data/apps/aave-defi/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,106 @@ +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildBenchmarkNote, + buildFailNoteForAT2, + buildFailNoteForAT4, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT3, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; + +const method = 'the "watch address" feature on pro.aave.com'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Aave correctly resolves the direct onchain subname address", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildFailNoteForAT2({ + method, + proof: { image: at2Proof, alt: "Aave fails to resolve a name requiring normalization" }, + extra: 'The app showed the message "This is an invalid ENS address."', + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildPassNoteForAT3({ + method, + proof: { image: at3Proof, alt: "Aave correctly implements CCIP-Read for .eth subnames" }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildFailNoteForAT4({ + method, + proof: { image: at4Proof, alt: "Aave fails to resolve an offchain DNS name" }, + extra: 'The app showed the message "Invalid address".', + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildBenchmarkNote({ + children: ( + <> + The app doesn't have context of the Base EVM chain and therefore we classify this + acceptance test as Not Applicable. + + ), + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Bitcoin" }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Solana" }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; 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/resolution/ensv2-ready-resolution/ac-1.gif similarity index 100% rename from ensawards.org/data/apps/aave-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-v3.gif rename to ensawards.org/data/apps/aave-defi/benchmarks/resolution/ensv2-ready-resolution/ac-1.gif 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/resolution/ensv2-ready-resolution/ac-2.png similarity index 100% rename from ensawards.org/data/apps/aave-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-v4.png rename to ensawards.org/data/apps/aave-defi/benchmarks/resolution/ensv2-ready-resolution/ac-2.png diff --git a/ensawards.org/data/apps/aave-defi/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/aave-defi/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..8f7b2225 --- /dev/null +++ b/ensawards.org/data/apps/aave-defi/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,67 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + acceptanceTestDetailsContainerStyles, + bestPracticeTechnicalDetailsLinkStyles, +} from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImageV3 from "./ac-1.gif"; +import correctlyResolveEnsv2TestNameAddressProofImageV4 from "./ac-2.png"; + +const ensv2ReadyResolution = { + "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 AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/ambire-wallet/benchmarks/index.tsx index 7a2c6b20..bd267e3b 100644 --- a/ensawards.org/data/apps/ambire-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/ambire-wallet/benchmarks/index.tsx @@ -11,9 +11,8 @@ 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"; +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks = { // TODO: `Contract Naming` category is temporarily hidden due to unfit content, @@ -46,27 +45,8 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, - "ensv2-ready-resolution": { - "correctly-resolve-ensv2-test-name-address": { - result: BenchmarkResults.Pass, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-05T17:29:00Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is correct. -

- Ambire Wallet correctly resolves the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(AmbireWallet, benchmarks); diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-1.gif b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-1.gif new file mode 100644 index 00000000..23f6c050 Binary files /dev/null and b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-1.gif differ diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-2.gif b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-2.gif new file mode 100644 index 00000000..2d19b094 Binary files /dev/null and b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-2.gif differ diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-3.gif b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-3.gif new file mode 100644 index 00000000..e031e7e1 Binary files /dev/null and b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-3.gif differ diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-4.gif b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-4.gif new file mode 100644 index 00000000..66b8cb77 Binary files /dev/null and b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-4.gif differ diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-5.gif b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-5.gif new file mode 100644 index 00000000..e1f524d4 Binary files /dev/null and b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-5.gif differ diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-6.png b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-6.png new file mode 100644 index 00000000..946e9511 Binary files /dev/null and b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-6.png differ diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-7.png b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-7.png new file mode 100644 index 00000000..88a33879 Binary files /dev/null and b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-7.png differ diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-8.gif b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-8.gif new file mode 100644 index 00000000..0922561b Binary files /dev/null and b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/at-8.gif differ diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..ecc3c5e6 --- /dev/null +++ b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,133 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT4, + buildFailNoteForAT5, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT3, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.gif"; +import at2Proof from "./at-2.gif"; +import at3Proof from "./at-3.gif"; +import at4Proof from "./at-4.gif"; +import at5Proof from "./at-5.gif"; +import at6Proof from "./at-6.png"; +import at7Proof from "./at-7.png"; +import at8Proof from "./at-8.gif"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T08:48:26Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Ambire Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T08:18:28Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "Ambire Wallet correctly resolves the address for Ξthereum.eth", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T08:20:12Z") }, + ], + notes: buildPassNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "Ambire Wallet correctly resolves the address for jesse.base.eth", + }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T08:21:49Z") }, + ], + notes: buildFailNoteForAT4({ + method, + proof: { image: at4Proof, alt: "Ambire Wallet fails to resolve the address for dperri.com" }, + extra: 'The app showed the message "Failed to resolve ENS Domain".', + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T08:33:38Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "Ambire Wallet fails to resolve the address for lightkeeper.eth in context of the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T08:38:20Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ + chain: "Bitcoin", + proof: { + image: at6Proof, + alt: "Ambire Wallet doesn't have context of non-EVM chain Bitcoin", + }, + }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T08:39:08Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ + chain: "Solana", + proof: { image: at7Proof, alt: "Ambire Wallet doesn't have context of non-EVM chain Solana" }, + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T08:35:02Z") }, + ], + notes: buildNotApplicableForFailedTest({ + testNumber: 5, + scope: "on Base", + proof: { + image: at8Proof, + alt: "Ambire Wallet fails to resolve the address for zissou.eth in context of the Base chain", + }, + }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.png similarity index 100% rename from ensawards.org/data/apps/ambire-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.png diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..e006dd6c --- /dev/null +++ b/ensawards.org/data/apps/ambire-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,37 @@ +// 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 { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-05T17:29:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is + correct. +

+ Ambire Wallet correctly resolves the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/binance-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/binance-exchange/benchmarks/index.tsx index 9ce7bff5..cb32468d 100644 --- a/ensawards.org/data/apps/binance-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/binance-exchange/benchmarks/index.tsx @@ -1,65 +1,16 @@ // 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 BinanceExchange from "data/apps/binance-exchange"; 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 correctlyResolveEnsv2TestNameAddressProofImageCopyTrading from "./correctly-resolve-ensv2-test-name-address-proof-copy-trading.gif"; -import correctlyResolveEnsv2TestNameAddressProofImageWithdrawal from "./correctly-resolve-ensv2-test-name-address-proof-withdrawal.png"; +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks: BestPracticeBenchmarks = { - "ensv2-ready-resolution": { - "correctly-resolve-ensv2-test-name-address": { - result: BenchmarkResults.NotApplicable, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T07:30:06Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the search tool in the "copy-trading" - flow. The app doesn't support the use of ENS names at all as the trader identifier. -
-
- While that's a key issue that this app is encouraged to improve, this best practice is - applicable specifically to apps that already have an existing ENS integration and making - sure existing integrations are ENSv2 compatible. Therefore, for this best practice we - apply a rating of not applicable. -

- Binance exchange doesn't allow ENS name as trader in the copy-trading flow - -

- The ENSv2 ready resolution was also tested using the "withdrawal" flow. The - app doesn't support the use of ENS names at all as the recipient identifier. -
-
- While that's a key issue that this app is encouraged to improve, this best practice is - applicable specifically to apps that already have an existing ENS integration and making - sure existing integrations are ENSv2 compatible. Therefore, for this best practice we - apply a rating of not applicable. -

- Binance exchange doesn't allow ENS name as recipient in the withdrawal flow -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, }; defineAppBenchmarks(BinanceExchange, benchmarks); diff --git a/ensawards.org/data/apps/binance-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/binance-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..b1c64b7f Binary files /dev/null and b/ensawards.org/data/apps/binance-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/binance-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/binance-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..9f6393a5 --- /dev/null +++ b/ensawards.org/data/apps/binance-exchange/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,80 @@ +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; + +const method = "the 'withdraw' feature on binance.com"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildEnsNotSupportedNote({ + method, + proof: { + image: at1Proof, + alt: "Binance doesn't accept ENS names as withdrawal addresses", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/binance-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof-copy-trading.gif b/ensawards.org/data/apps/binance-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-1.gif similarity index 100% rename from ensawards.org/data/apps/binance-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof-copy-trading.gif rename to ensawards.org/data/apps/binance-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-1.gif diff --git a/ensawards.org/data/apps/binance-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof-withdrawal.png b/ensawards.org/data/apps/binance-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-2.png similarity index 100% rename from ensawards.org/data/apps/binance-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof-withdrawal.png rename to ensawards.org/data/apps/binance-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-2.png diff --git a/ensawards.org/data/apps/binance-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/binance-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..a64d35dc --- /dev/null +++ b/ensawards.org/data/apps/binance-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,61 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImageCopyTrading from "./ac-1.gif"; +import correctlyResolveEnsv2TestNameAddressProofImageWithdrawal from "./ac-2.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T07:30:06Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the search tool in the "copy-trading" + flow. The app doesn't support the use of ENS names at all as the trader identifier. +
+
+ While that's a key issue that this app is encouraged to improve, this best practice is + applicable specifically to apps that already have an existing ENS integration and making + sure existing integrations are ENSv2 compatible. Therefore, for this best practice we + apply a rating of not applicable. +

+ Binance exchange doesn't allow ENS name as trader in the copy-trading flow + +

+ The ENSv2 ready resolution was also tested using the "withdrawal" flow. The app + doesn't support the use of ENS names at all as the recipient identifier. +
+
+ While that's a key issue that this app is encouraged to improve, this best practice is + applicable specifically to apps that already have an existing ENS integration and making + sure existing integrations are ENSv2 compatible. Therefore, for this best practice we + apply a rating of not applicable. +

+ Binance exchange doesn't allow ENS name as recipient in the withdrawal flow +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/binance-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/binance-wallet/benchmarks/index.tsx index b8b031e0..1e49ed7d 100644 --- a/ensawards.org/data/apps/binance-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/binance-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 BinanceWallet from "data/apps/binance-wallet"; 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 depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.gif"; - -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. @@ -26,34 +22,7 @@ const benchmarks: BestPracticeBenchmarks = { "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.NotApplicable, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T07:33:06Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The wallet doesn't - support the use of ENS names at all as the recipient identifier. -
-
- While that's a key issue that this app is encouraged to improve, this best practice is - applicable specifically to apps that already have an existing ENS integration and making - sure existing integrations are ENSv2 compatible. Therefore, for this best practice we - apply a rating of not applicable. -

- Binance Wallet doesn't allow ENS name as recipient in the send flow -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, -}; +} as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(BinanceWallet, benchmarks); diff --git a/ensawards.org/data/apps/binance-wallet/benchmarks/resolution/deposit-addresses/at-1.gif b/ensawards.org/data/apps/binance-wallet/benchmarks/resolution/deposit-addresses/at-1.gif new file mode 100644 index 00000000..b469368c Binary files /dev/null and b/ensawards.org/data/apps/binance-wallet/benchmarks/resolution/deposit-addresses/at-1.gif differ diff --git a/ensawards.org/data/apps/binance-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/binance-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..619c67b8 --- /dev/null +++ b/ensawards.org/data/apps/binance-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,80 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.gif"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T09:39:20Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "send" flow', + proof: { + image: at1Proof, + alt: "Binance Wallet doesn't allow ENS name as recipient in the send flow", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T09:44:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T09:45:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T09:45:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T09:45:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T09:46:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T09:46:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T09:46:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/binance-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif b/ensawards.org/data/apps/binance-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.gif similarity index 100% rename from ensawards.org/data/apps/binance-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif rename to ensawards.org/data/apps/binance-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.gif diff --git a/ensawards.org/data/apps/binance-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/binance-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..083256b5 --- /dev/null +++ b/ensawards.org/data/apps/binance-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,43 @@ +// 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 { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.gif"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T07:33:06Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The wallet doesn't + support the use of ENS names at all as the recipient identifier. +
+
+ While that's a key issue that this app is encouraged to improve, this best practice is + applicable specifically to apps that already have an existing ENS integration and making + sure existing integrations are ENSv2 compatible. Therefore, for this best practice we + apply a rating of not applicable. +

+ Binance Wallet doesn't allow ENS name as recipient in the send flow +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/blockscout-explorer/benchmarks/index.tsx b/ensawards.org/data/apps/blockscout-explorer/benchmarks/index.tsx index cb6770de..7904a167 100644 --- a/ensawards.org/data/apps/blockscout-explorer/benchmarks/index.tsx +++ b/ensawards.org/data/apps/blockscout-explorer/benchmarks/index.tsx @@ -14,7 +14,8 @@ import { parseTimestamp } from "@ensnode/ensnode-sdk"; import { cn } from "@/utils/tailwindClassConcatenation"; import exampleProofImage from "./acceptance-test-benchmark-proof-example.png"; -import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; +import depositAddresses from "./resolution/deposit-address"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks = { // "recognize-all-ens-names": { @@ -23,6 +24,8 @@ const benchmarks = { // { from: contributors.stevedylan, lastUpdated: parseTimestamp("2025-12-03T14:00:00Z") }, // ], // }, + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, // TODO: `Contract Naming` category is temporarily hidden due to unfit content, // and so are all benchmarks belonging to it. @@ -64,27 +67,6 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, - "ensv2-ready-resolution": { - "correctly-resolve-ensv2-test-name-address": { - result: BenchmarkResults.Fail, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-05T14:55:00Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "search" flow. The resolved - address is NOT correct. -

- Blockscout fails to resolve the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(BlockscoutExplorer, benchmarks); diff --git a/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-1.png b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-1.png new file mode 100644 index 00000000..61fb31ac Binary files /dev/null and b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-1.png differ diff --git a/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-2.png b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-2.png new file mode 100644 index 00000000..ea17131e Binary files /dev/null and b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-2.png differ diff --git a/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-3.png b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-3.png new file mode 100644 index 00000000..c412fcbf Binary files /dev/null and b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-3.png differ diff --git a/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-4.png b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-4.png new file mode 100644 index 00000000..42de5838 Binary files /dev/null and b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-4.png differ diff --git a/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-5.png b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-5.png new file mode 100644 index 00000000..67e39892 Binary files /dev/null and b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/at-5.png differ diff --git a/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/index.tsx b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/index.tsx new file mode 100644 index 00000000..ae660cef --- /dev/null +++ b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/deposit-address/index.tsx @@ -0,0 +1,112 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying apps + +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT5, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT3, + buildPassNoteForAT4, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.png"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T14:27:32Z") }, + ], + notes: buildPassNoteForAT1({ + method: "the quick-search feature on the main page of eth.blockscout.com", + proof: { + image: at1Proof, + alt: "Blockscout correctly resolves the deposit address of a direct onchain name", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T14:27:32Z") }, + ], + notes: buildPassNoteForAT2({ + method: "the quick-search feature on eth.blockscout.com", + proof: { + image: at2Proof, + alt: "Blockscout correctly resolves the deposit address of a name requiring normalization", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T14:27:32Z") }, + ], + notes: buildPassNoteForAT3({ + method: "the quick-search feature on eth.blockscout.com", + proof: { + image: at3Proof, + alt: "Blockscout correctly resolves the deposit address of an offchain .eth subname via CCIP-Read", + }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T14:27:32Z") }, + ], + notes: buildPassNoteForAT4({ + method: "the quick-search feature on eth.blockscout.com", + proof: { + image: at4Proof, + alt: "Blockscout correctly resolves the deposit address of an offchain DNS name via CCIP-Read", + }, + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T14:27:32Z") }, + ], + notes: buildFailNoteForAT5({ + method: "the quick-search feature on base.blockscout.com", + proof: { image: at5Proof, alt: "Blockscout fails to resolve the Base deposit address" }, + extra: "The app showed the Ethereum Mainnet address instead.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T14:27:32Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Bitcoin" }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T14:27:32Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Solana" }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T14:27:32Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/blockscout-explorer/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/blockscout-explorer/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..d2228afc --- /dev/null +++ b/ensawards.org/data/apps/blockscout-explorer/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-05T14:55:00Z") }, + ], + notes: ( +
+

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

+ Blockscout fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/bybit-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/bybit-exchange/benchmarks/index.tsx new file mode 100644 index 00000000..f8e43473 --- /dev/null +++ b/ensawards.org/data/apps/bybit-exchange/benchmarks/index.tsx @@ -0,0 +1,18 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import BybitExchange from "data/apps/bybit-exchange"; +import { defineAppBenchmarks } from "data/benchmarks/registry"; +import type { BestPracticeBenchmarks } from "data/ens-best-practices/types"; + +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; + +const benchmarks: BestPracticeBenchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, +}; + +defineAppBenchmarks(BybitExchange, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/bybit-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/bybit-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..3b8d743e Binary files /dev/null and b/ensawards.org/data/apps/bybit-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/bybit-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/bybit-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..dca17c6f --- /dev/null +++ b/ensawards.org/data/apps/bybit-exchange/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,80 @@ +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; + +const method = "the 'withdraw' feature on bybit.com"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T11:42:48Z") }, + ], + notes: buildEnsNotSupportedNote({ + method, + proof: { + image: at1Proof, + alt: "Bybit fails to resolve the direct onchain subname address", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T11:42:48Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T11:42:48Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T11:42:48Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T11:42:48Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T11:42:48Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T11:42:48Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T11:42:48Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/bybit-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/bybit-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..b0b630ed Binary files /dev/null and b/ensawards.org/data/apps/bybit-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/bybit-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/bybit-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..bd0364e4 --- /dev/null +++ b/ensawards.org/data/apps/bybit-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,44 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./at-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T13:40:39Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "withdraw" flow. The app doesn't + support the use of ENS names at all as the recipient identifier. +
+
+ While that's a key issue that this app is encouraged to improve, this best practice is + applicable specifically to apps that already have an existing ENS integration and making + sure existing integrations are ENSv2 compatible. Therefore, for this best practice we + apply a rating of not applicable. +

+ Bybit exchange doesn't allow ENS name as recipient in the withdrawal flow +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/bybit-exchange/icon.tsx b/ensawards.org/data/apps/bybit-exchange/icon.tsx new file mode 100644 index 00000000..50887d9f --- /dev/null +++ b/ensawards.org/data/apps/bybit-exchange/icon.tsx @@ -0,0 +1 @@ +export { default } from "data/projects/bybit/icon.tsx"; diff --git a/ensawards.org/data/apps/bybit-exchange/index.ts b/ensawards.org/data/apps/bybit-exchange/index.ts new file mode 100644 index 00000000..de5131c6 --- /dev/null +++ b/ensawards.org/data/apps/bybit-exchange/index.ts @@ -0,0 +1,29 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying apps + +import BybitProject from "data/projects/bybit"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import BybitIcon from "./icon.tsx"; + +const BybitExchange: App = { + id: "bybit-exchange", + appSlug: "bybit-exchange", + type: AppTypes.Exchange, + project: BybitProject, + name: "Bybit", + description: + "Cryptocurrency exchange for spot and derivatives trading, buying, selling, and managing digital assets.", + socials: { + website: new URL("https://www.bybit.com"), + twitter: new URL("https://x.com/Bybit_Official"), + }, + icon: BybitIcon, + ogImagePath: "bybit-exchange/og.png", + twitterOgImagePath: "bybit-exchange/twitter-og.png", +}; + +defineApp(BybitExchange); + +export default BybitExchange; diff --git a/ensawards.org/data/apps/bybit-exchange/og.png b/ensawards.org/data/apps/bybit-exchange/og.png new file mode 100644 index 00000000..659d9c1f Binary files /dev/null and b/ensawards.org/data/apps/bybit-exchange/og.png differ diff --git a/ensawards.org/data/apps/bybit-exchange/twitter-og.png b/ensawards.org/data/apps/bybit-exchange/twitter-og.png new file mode 100644 index 00000000..5d8ded6c Binary files /dev/null and b/ensawards.org/data/apps/bybit-exchange/twitter-og.png differ diff --git a/ensawards.org/data/apps/coinbase-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/coinbase-exchange/benchmarks/index.tsx index 92b1d021..019875d2 100644 --- a/ensawards.org/data/apps/coinbase-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/coinbase-exchange/benchmarks/index.tsx @@ -1,42 +1,16 @@ // 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 CoinbaseExchange from "data/apps/coinbase-exchange"; 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 correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks: BestPracticeBenchmarks = { - "ensv2-ready-resolution": { - "correctly-resolve-ensv2-test-name-address": { - result: BenchmarkResults.Fail, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-12T09:01:23Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is NOT correct. -

- Coinbase exchange fails to resolve the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, }; defineAppBenchmarks(CoinbaseExchange, benchmarks); diff --git a/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..770bd850 Binary files /dev/null and b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..973e4a12 Binary files /dev/null and b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..3a3fa05b Binary files /dev/null and b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-4.gif b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-4.gif new file mode 100644 index 00000000..5c971a52 Binary files /dev/null and b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-4.gif differ diff --git a/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-5.png b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-5.png new file mode 100644 index 00000000..151cbaa2 Binary files /dev/null and b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-5.png differ diff --git a/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-7.gif b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-7.gif new file mode 100644 index 00000000..b42730fb Binary files /dev/null and b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/at-7.gif differ diff --git a/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..e6cb7498 --- /dev/null +++ b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,119 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT4, + buildFailNoteForAT5, + buildFailNoteForAT7, + buildNotApplicableForFailedTest, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT3, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.gif"; +import at5Proof from "./at-5.png"; +import at7Proof from "./at-7.gif"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Coinbase Exchange correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "Coinbase Exchange correctly resolves the address for Ξthereum.eth", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildPassNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "Coinbase Exchange correctly resolves the address for jesse.base.eth", + }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildFailNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "Coinbase Exchange fails to resolve the address for dperri.com", + }, + extra: 'The app showed the message "No compatible addresses".', + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "Coinbase Exchange fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": undefined, + "at07-resolve-solana-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildFailNoteForAT7({ + method: 'the "send" flow in context of the Solana chain', + proof: { + image: at7Proof, + alt: "Coinbase Exchange fails to resolve the Solana address for gregskril.eth", + }, + extra: 'The app showed the message "This address is not valid for the Solana network".', + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/coinbase-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/coinbase-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..4828e933 --- /dev/null +++ b/ensawards.org/data/apps/coinbase-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-12T09:01:23Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is{" "} + NOT correct. +

+ Coinbase exchange fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/coinbase-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/coinbase-wallet/benchmarks/index.tsx index 66d1ced8..702dc8eb 100644 --- a/ensawards.org/data/apps/coinbase-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/coinbase-wallet/benchmarks/index.tsx @@ -14,7 +14,8 @@ import { parseTimestamp } from "@ensnode/ensnode-sdk"; import { cn } from "@/utils/tailwindClassConcatenation"; import exampleProofImage from "./acceptance-test-benchmark-proof-example.png"; -import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.gif"; +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks = { // "recognize-all-ens-names": { @@ -64,27 +65,8 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, - "ensv2-ready-resolution": { - "correctly-resolve-ensv2-test-name-address": { - result: BenchmarkResults.Fail, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-05T15:12:00Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is NOT correct. -

- Coinbase Wallet fails to resolve the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(CoinbaseWallet, benchmarks); diff --git a/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-1.gif b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-1.gif new file mode 100644 index 00000000..7b3fd1d0 Binary files /dev/null and b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-1.gif differ diff --git a/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-2.gif b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-2.gif new file mode 100644 index 00000000..064238da Binary files /dev/null and b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-2.gif differ diff --git a/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-3.gif b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-3.gif new file mode 100644 index 00000000..c5b0524a Binary files /dev/null and b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-3.gif differ diff --git a/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-4.gif b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-4.gif new file mode 100644 index 00000000..28b61f1a Binary files /dev/null and b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-4.gif differ diff --git a/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-5.gif b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-5.gif new file mode 100644 index 00000000..b7a953bb Binary files /dev/null and b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-5.gif differ diff --git a/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-6.png b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-6.png new file mode 100644 index 00000000..e32f1cdc Binary files /dev/null and b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-6.png differ diff --git a/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-7.gif b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-7.gif new file mode 100644 index 00000000..2f0af4de Binary files /dev/null and b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/at-7.gif differ diff --git a/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..b6c70531 --- /dev/null +++ b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,133 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT4, + buildFailNoteForAT5, + buildFailNoteForAT7, + buildNotApplicableForFailedTest, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT3, + buildPassNoteForAT6, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.gif"; +import at2Proof from "./at-2.gif"; +import at3Proof from "./at-3.gif"; +import at4Proof from "./at-4.gif"; +import at5Proof from "./at-5.gif"; +import at6Proof from "./at-6.png"; +import at7Proof from "./at-7.gif"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T10:17:33Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Coinbase Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T10:19:15Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "Coinbase Wallet correctly resolves the address for Ξthereum.eth", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T10:20:22Z") }, + ], + notes: buildPassNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "Coinbase Wallet correctly resolves the address for jesse.base.eth", + }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T10:22:06Z") }, + ], + notes: buildFailNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "Coinbase Wallet fails to resolve the address for dperri.com", + }, + extra: `The app couldn't find the ENS name with a ".com" TLD.`, + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T10:26:55Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "Coinbase Wallet fails to resolve the address for lightkeeper.eth in context of the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:01:38Z") }, + ], + notes: buildPassNoteForAT6({ + method: 'the "send" flow in context of the Bitcoin chain', + proof: { + image: at6Proof, + alt: "Coinbase Wallet correctly resolves the Bitcoin address for gregskril.eth", + }, + }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T11:35:34Z") }, + ], + notes: buildFailNoteForAT7({ + method: 'the "send" flow in context of the Solana chain', + proof: { + image: at7Proof, + alt: "Coinbase Wallet fails to resolve the Solana address for gregskril.eth", + }, + extra: 'The app showed the message "No results".', + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T11:51:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/coinbase-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.gif similarity index 100% rename from ensawards.org/data/apps/coinbase-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif rename to ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.gif diff --git a/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..cc89d7ab --- /dev/null +++ b/ensawards.org/data/apps/coinbase-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,37 @@ +// 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 { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.gif"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-05T15:12:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is{" "} + NOT correct. +

+ Coinbase Wallet fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/cryptocom-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/cryptocom-exchange/benchmarks/index.tsx index acab9f2a..7cc2e4ab 100644 --- a/ensawards.org/data/apps/cryptocom-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/cryptocom-exchange/benchmarks/index.tsx @@ -1,48 +1,16 @@ // 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 CryptoComExchange from "data/apps/cryptocom-exchange"; 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 correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.gif"; +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks: BestPracticeBenchmarks = { - "ensv2-ready-resolution": { - "correctly-resolve-ensv2-test-name-address": { - result: BenchmarkResults.NotApplicable, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T13:47:40Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "withdrawal" flow. The app doesn't - support the use of ENS names at all as the recipient identifier. -
-
- While that's a key issue that this app is encouraged to improve, this best practice is - applicable specifically to apps that already have an existing ENS integration and making - sure existing integrations are ENSv2 compatible. Therefore, for this best practice we - apply a rating of not applicable. -

- Crypto.com exchange doesn't allow ENS name as recipient in the withdrawal flow -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, }; defineAppBenchmarks(CryptoComExchange, benchmarks); diff --git a/ensawards.org/data/apps/cryptocom-exchange/benchmarks/resolution/deposit-addresses/at-1.gif b/ensawards.org/data/apps/cryptocom-exchange/benchmarks/resolution/deposit-addresses/at-1.gif new file mode 100644 index 00000000..c032f466 Binary files /dev/null and b/ensawards.org/data/apps/cryptocom-exchange/benchmarks/resolution/deposit-addresses/at-1.gif differ diff --git a/ensawards.org/data/apps/cryptocom-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/cryptocom-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..9c5e89ca --- /dev/null +++ b/ensawards.org/data/apps/cryptocom-exchange/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,80 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.gif"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "withdraw" flow', + proof: { + image: at1Proof, + alt: "Crypto.com Exchange doesn't allow ENS names as the recipient in the withdraw flow", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/cryptocom-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif b/ensawards.org/data/apps/cryptocom-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-1.gif similarity index 100% rename from ensawards.org/data/apps/cryptocom-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif rename to ensawards.org/data/apps/cryptocom-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-1.gif diff --git a/ensawards.org/data/apps/cryptocom-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/cryptocom-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..16682d5f --- /dev/null +++ b/ensawards.org/data/apps/cryptocom-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,44 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.gif"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T13:47:40Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "withdrawal" flow. The app doesn't + support the use of ENS names at all as the recipient identifier. +
+
+ While that's a key issue that this app is encouraged to improve, this best practice is + applicable specifically to apps that already have an existing ENS integration and making + sure existing integrations are ENSv2 compatible. Therefore, for this best practice we + apply a rating of not applicable. +

+ Crypto.com exchange doesn't allow ENS name as recipient in the withdrawal flow +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/index.tsx index 305c5e96..df2ab873 100644 --- a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 CryptoComWallet from "data/apps/cryptocom-wallet"; 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 correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks: BestPracticeBenchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + // 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. @@ -26,27 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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-11T12:07:27Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is NOT correct. -

- Crypto.com Wallet fails to resolve the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, }; defineAppBenchmarks(CryptoComWallet, benchmarks); diff --git a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..d1cb41d4 Binary files /dev/null and b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..f907c080 Binary files /dev/null and b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..1dab3146 Binary files /dev/null and b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-4.png b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-4.png new file mode 100644 index 00000000..509671df Binary files /dev/null and b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-4.png differ diff --git a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-5.png b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-5.png new file mode 100644 index 00000000..8d6a53f7 Binary files /dev/null and b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-5.png differ diff --git a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-7.png b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-7.png new file mode 100644 index 00000000..3968688a Binary files /dev/null and b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-7.png differ diff --git a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-8.png b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-8.png new file mode 100644 index 00000000..f3de9168 Binary files /dev/null and b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/at-8.png differ diff --git a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..a0c8711f --- /dev/null +++ b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,126 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT2, + buildFailNoteForAT3, + buildFailNoteForAT4, + buildPassNoteForAT1, + buildPassNoteForAT5, + buildPassNoteForAT7, + buildPassNoteForAT8, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.png"; +import at7Proof from "./at-7.png"; +import at8Proof from "./at-8.png"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Crypto.com Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildFailNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "Crypto.com Wallet fails to resolve the address for Ξthereum.eth", + }, + extra: 'The app showed the message "Invalid address".', + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildFailNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "Crypto.com Wallet fails to resolve the address for jesse.base.eth", + }, + extra: 'The app showed the message "Invalid address".', + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildFailNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "Crypto.com Wallet fails to resolve the address for dperri.com", + }, + extra: 'The app showed the message "Invalid address".', + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildPassNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "Crypto.com Wallet correctly resolves the address for lightkeeper.eth on the Base chain", + }, + }), + }, + "at06-resolve-bitcoin-address": undefined, + "at07-resolve-solana-address": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildPassNoteForAT7({ + method: 'the "send" flow in context of the Solana chain', + proof: { + image: at7Proof, + alt: "Crypto.com Wallet correctly resolves the Solana address for gregskril.eth", + }, + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildPassNoteForAT8({ + method: 'the "send" flow in context of the Base chain', + proof: { + image: at8Proof, + alt: "Crypto.com Wallet gracefully handles the invalid address for zissou.eth on the Base chain", + }, + }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/cryptocom-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..d5b8df4e --- /dev/null +++ b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T12:07:27Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is{" "} + NOT correct. +

+ Crypto.com Wallet fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/etherscan-explorer/benchmarks/index.tsx b/ensawards.org/data/apps/etherscan-explorer/benchmarks/index.tsx index 4bcc9896..a410e2e8 100644 --- a/ensawards.org/data/apps/etherscan-explorer/benchmarks/index.tsx +++ b/ensawards.org/data/apps/etherscan-explorer/benchmarks/index.tsx @@ -14,7 +14,8 @@ import { parseTimestamp } from "@ensnode/ensnode-sdk"; import { cn } from "@/utils/tailwindClassConcatenation"; import exampleProofImage from "./acceptance-test-benchmark-proof-example.png"; -import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; +import depositAddresses from "./resolution/deposit-address"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks = { // "recognize-all-ens-names": { @@ -23,6 +24,8 @@ const benchmarks = { // { from: contributors.stevedylan, lastUpdated: parseTimestamp("2025-12-03T14:00:00Z") }, // ], // }, + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, // TODO: `Contract Naming` category is temporarily hidden due to unfit content, // and so are all benchmarks belonging to it. @@ -64,27 +67,6 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, - "ensv2-ready-resolution": { - "correctly-resolve-ensv2-test-name-address": { - result: BenchmarkResults.Fail, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-05T14:45:00Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "search" flow. The resolved - address is NOT correct. -

- Etherscan fails to resolve the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(EtherscanExplorer, benchmarks); diff --git a/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-1.png b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-1.png new file mode 100644 index 00000000..c602d56e Binary files /dev/null and b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-1.png differ diff --git a/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-2.png b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-2.png new file mode 100644 index 00000000..b7f75d51 Binary files /dev/null and b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-2.png differ diff --git a/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-3.png b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-3.png new file mode 100644 index 00000000..91363fa5 Binary files /dev/null and b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-3.png differ diff --git a/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-4.png b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-4.png new file mode 100644 index 00000000..ca9567ca Binary files /dev/null and b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-4.png differ diff --git a/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-5.png b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-5.png new file mode 100644 index 00000000..4728e12e Binary files /dev/null and b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/at-5.png differ diff --git a/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/index.tsx b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/index.tsx new file mode 100644 index 00000000..3233c8f5 --- /dev/null +++ b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/deposit-address/index.tsx @@ -0,0 +1,109 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying apps + +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT5, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT3, + buildPassNoteForAT4, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.png"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T11:48:58Z") }, + ], + notes: buildPassNoteForAT1({ + method: "the name lookup search on etherscan.io", + proof: { + image: at1Proof, + alt: "Etherscan correctly resolves the direct onchain subname address", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T11:48:58Z") }, + ], + notes: buildPassNoteForAT2({ + method: "the name lookup search on etherscan.io", + proof: { + image: at2Proof, + alt: "Etherscan correctly resolves a name requiring normalization", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T11:48:58Z") }, + ], + notes: buildPassNoteForAT3({ + method: "the name lookup search on etherscan.io", + proof: { image: at3Proof, alt: "Etherscan correctly implements CCIP-Read for .eth subnames" }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T11:48:58Z") }, + ], + notes: buildPassNoteForAT4({ + method: "the name lookup search on etherscan.io", + proof: { + image: at4Proof, + alt: "Etherscan correctly implements CCIP-Read for offchain DNS names", + }, + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T11:48:58Z") }, + ], + notes: buildFailNoteForAT5({ + method: "the name lookup search on basescan.org", + proof: { image: at5Proof, alt: "Etherscan fails to resolve the Base deposit address" }, + extra: "The app showed the Ethereum Mainnet address instead.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T11:48:58Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Bitcoin" }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T11:48:58Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Solana" }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-19T11:48:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/etherscan-explorer/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/etherscan-explorer/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..95e79b31 --- /dev/null +++ b/ensawards.org/data/apps/etherscan-explorer/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-05T14:45:00Z") }, + ], + notes: ( +
+

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

+ Etherscan fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/frame-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/frame-wallet/benchmarks/index.tsx index 8ba257fc..a5058d36 100644 --- a/ensawards.org/data/apps/frame-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/frame-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 FrameWallet from "data/apps/frame-wallet"; 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 correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; +import depositAddresses from "./resolution/deposit-address"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks: BestPracticeBenchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + // 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. @@ -26,27 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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-12T11:46:19Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is NOT correct. -

- Frame fails to resolve the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, }; defineAppBenchmarks(FrameWallet, benchmarks); diff --git a/ensawards.org/data/apps/frame-wallet/benchmarks/resolution/deposit-address/index.tsx b/ensawards.org/data/apps/frame-wallet/benchmarks/resolution/deposit-address/index.tsx new file mode 100644 index 00000000..e81d8c52 --- /dev/null +++ b/ensawards.org/data/apps/frame-wallet/benchmarks/resolution/deposit-address/index.tsx @@ -0,0 +1,14 @@ +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; + +const depositAddresses = { + "at01-resolve-onchain-name": undefined, + "at02-resolve-name-needing-normalization": undefined, + "at03-resolve-offchain-eth-subname": undefined, + "at04-resolve-offchain-dns-name": undefined, + "at05-resolve-name-on-other-evm-chain": undefined, + "at06-resolve-bitcoin-address": undefined, + "at07-resolve-solana-address": undefined, + "at08-handle-invalid-address-format": undefined, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/frame-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/frame-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/frame-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/frame-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/frame-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/frame-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..122f1d12 --- /dev/null +++ b/ensawards.org/data/apps/frame-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-12T11:46:19Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is{" "} + NOT correct. +

+ Frame fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/gemini-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/gemini-wallet/benchmarks/index.tsx index 91bdc14d..1cbc95a8 100644 --- a/ensawards.org/data/apps/gemini-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/gemini-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 GeminiWallet from "data/apps/gemini-wallet"; 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 correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks: BestPracticeBenchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + // 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. @@ -26,27 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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-12T07:15:17Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is correct. -

- Gemini Wallet correctly resolves the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, }; defineAppBenchmarks(GeminiWallet, benchmarks); diff --git a/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..6c00d7ac Binary files /dev/null and b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..f307afeb Binary files /dev/null and b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..7317f421 Binary files /dev/null and b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-4.png b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-4.png new file mode 100644 index 00000000..ce0f31f8 Binary files /dev/null and b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-4.png differ diff --git a/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-5.png b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-5.png new file mode 100644 index 00000000..243b982e Binary files /dev/null and b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/at-5.png differ diff --git a/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..1d7c4ff0 --- /dev/null +++ b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,117 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT2, + buildFailNoteForAT5, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT3, + buildPassNoteForAT4, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.png"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Gemini Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildFailNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "Gemini Wallet fails to resolve the address for Ξthereum.eth", + }, + extra: "The name is normalized incorrectly, resulting in an incorrect resolved address.", + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildPassNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "Gemini Wallet correctly resolves the address for jesse.base.eth", + }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildPassNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "Gemini Wallet correctly resolves the address for dperri.com", + }, + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "Gemini Wallet fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Bitcoin" }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Solana" }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/gemini-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/gemini-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..cf3d3298 --- /dev/null +++ b/ensawards.org/data/apps/gemini-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-12T07:15:17Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is + correct. +

+ Gemini Wallet correctly resolves the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/kraken-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/kraken-exchange/benchmarks/index.tsx index 7c0e6b24..d7c71d74 100644 --- a/ensawards.org/data/apps/kraken-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/kraken-exchange/benchmarks/index.tsx @@ -1,48 +1,16 @@ // 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 KrakenExchange from "data/apps/kraken-exchange"; 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 correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.gif"; +import depositAddresses from "./resolution/deposit-address"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks: BestPracticeBenchmarks = { - "ensv2-ready-resolution": { - "correctly-resolve-ensv2-test-name-address": { - result: BenchmarkResults.NotApplicable, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T10:47:44Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "withdrawal" flow. The app doesn't - support the use of ENS names at all as the recipient identifier. -
-
- While that's a key issue that this app is encouraged to improve, this best practice is - applicable specifically to apps that already have an existing ENS integration and making - sure existing integrations are ENSv2 compatible. Therefore, for this best practice we - apply a rating of not applicable. -

- Kraken exchange doesn't allow ENS name as recipient in the withdrawal flow -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, }; defineAppBenchmarks(KrakenExchange, benchmarks); diff --git a/ensawards.org/data/apps/kraken-exchange/benchmarks/resolution/deposit-address/index.tsx b/ensawards.org/data/apps/kraken-exchange/benchmarks/resolution/deposit-address/index.tsx new file mode 100644 index 00000000..e81d8c52 --- /dev/null +++ b/ensawards.org/data/apps/kraken-exchange/benchmarks/resolution/deposit-address/index.tsx @@ -0,0 +1,14 @@ +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; + +const depositAddresses = { + "at01-resolve-onchain-name": undefined, + "at02-resolve-name-needing-normalization": undefined, + "at03-resolve-offchain-eth-subname": undefined, + "at04-resolve-offchain-dns-name": undefined, + "at05-resolve-name-on-other-evm-chain": undefined, + "at06-resolve-bitcoin-address": undefined, + "at07-resolve-solana-address": undefined, + "at08-handle-invalid-address-format": undefined, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/kraken-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif b/ensawards.org/data/apps/kraken-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-1.gif similarity index 100% rename from ensawards.org/data/apps/kraken-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif rename to ensawards.org/data/apps/kraken-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-1.gif diff --git a/ensawards.org/data/apps/kraken-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/kraken-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..a1f48b0a --- /dev/null +++ b/ensawards.org/data/apps/kraken-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,44 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.gif"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T10:47:44Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "withdrawal" flow. The app doesn't + support the use of ENS names at all as the recipient identifier. +
+
+ While that's a key issue that this app is encouraged to improve, this best practice is + applicable specifically to apps that already have an existing ENS integration and making + sure existing integrations are ENSv2 compatible. Therefore, for this best practice we + apply a rating of not applicable. +

+ Kraken exchange doesn't allow ENS name as recipient in the withdrawal flow +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/kraken-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/kraken-wallet/benchmarks/index.tsx index 2411029e..ec8a57c7 100644 --- a/ensawards.org/data/apps/kraken-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/kraken-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 KrakenWallet from "data/apps/kraken-wallet"; 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 correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; +import depositAddresses from "./resolution/deposit-address"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks: BestPracticeBenchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + // 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. @@ -26,27 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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-10T11:02:00Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is correct. -

- Kraken Wallet correctly resolves the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, }; defineAppBenchmarks(KrakenWallet, benchmarks); diff --git a/ensawards.org/data/apps/kraken-wallet/benchmarks/resolution/deposit-address/index.tsx b/ensawards.org/data/apps/kraken-wallet/benchmarks/resolution/deposit-address/index.tsx new file mode 100644 index 00000000..e81d8c52 --- /dev/null +++ b/ensawards.org/data/apps/kraken-wallet/benchmarks/resolution/deposit-address/index.tsx @@ -0,0 +1,14 @@ +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; + +const depositAddresses = { + "at01-resolve-onchain-name": undefined, + "at02-resolve-name-needing-normalization": undefined, + "at03-resolve-offchain-eth-subname": undefined, + "at04-resolve-offchain-dns-name": undefined, + "at05-resolve-name-on-other-evm-chain": undefined, + "at06-resolve-bitcoin-address": undefined, + "at07-resolve-solana-address": undefined, + "at08-handle-invalid-address-format": undefined, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/kraken-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/kraken-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/kraken-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/kraken-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/kraken-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/kraken-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..46ea7deb --- /dev/null +++ b/ensawards.org/data/apps/kraken-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-10T11:02:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is + correct. +

+ Kraken Wallet correctly resolves the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx b/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx index 0de5a9fd..2b7b5b81 100644 --- a/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx +++ b/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx @@ -1,22 +1,17 @@ // 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 depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -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. @@ -27,35 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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); diff --git a/ensawards.org/data/apps/lido-defi/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/lido-defi/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..0df6b8bd Binary files /dev/null and b/ensawards.org/data/apps/lido-defi/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/lido-defi/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/lido-defi/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..25edd6e1 --- /dev/null +++ b/ensawards.org/data/apps/lido-defi/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,81 @@ +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT1, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; + +const method = 'the "rewards" feature on stake.lido.fi'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:47:02Z") }, + ], + notes: buildFailNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Lido fails to resolve the direct onchain subname address", + }, + extra: 'The app showed the message "An error happened during ENS name resolving".', + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:47:02Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:47:02Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:47:02Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:47:02Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:47:02Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:47:02Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:47:02Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; 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/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/lido-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/lido-defi/benchmarks/resolution/ensv2-ready-resolution/ac-1.png 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/resolution/ensv2-ready-resolution/ac-2.png similarity index 100% rename from ensawards.org/data/apps/lido-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof-address.png rename to ensawards.org/data/apps/lido-defi/benchmarks/resolution/ensv2-ready-resolution/ac-2.png diff --git a/ensawards.org/data/apps/lido-defi/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/lido-defi/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..e5f76138 --- /dev/null +++ b/ensawards.org/data/apps/lido-defi/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,47 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImageName from "./ac-1.png"; +import correctlyResolveEnsv2TestNameAddressProofImageAddress from "./ac-2.png"; + +const ensv2ReadyResolution = { + "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 AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/metamask-wallet/benchmarks/index.tsx index 61d652f7..cee353e2 100644 --- a/ensawards.org/data/apps/metamask-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/metamask-wallet/benchmarks/index.tsx @@ -11,9 +11,8 @@ 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"; +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks = { // "recognize-all-ens-names": { @@ -23,6 +22,9 @@ const benchmarks = { // ], // }, + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + // 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. @@ -53,27 +55,6 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, - "ensv2-ready-resolution": { - "correctly-resolve-ensv2-test-name-address": { - result: BenchmarkResults.Pass, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-05T15:34:00Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is correct. -

- MetaMask Wallet correctly resolves the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(MetaMaskWallet, benchmarks); diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..16a26c73 Binary files /dev/null and b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..9f67e4a0 Binary files /dev/null and b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..33af2103 Binary files /dev/null and b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-4.png b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-4.png new file mode 100644 index 00000000..d54ce087 Binary files /dev/null and b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-4.png differ diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-5.png b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-5.png new file mode 100644 index 00000000..176665e4 Binary files /dev/null and b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-5.png differ diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-6.png b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-6.png new file mode 100644 index 00000000..7ad78b4d Binary files /dev/null and b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-6.png differ diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-7.png b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-7.png new file mode 100644 index 00000000..1b5ab235 Binary files /dev/null and b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-7.png differ diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-8.png b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-8.png new file mode 100644 index 00000000..349b544d Binary files /dev/null and b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/at-8.png differ diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..d43ef847 --- /dev/null +++ b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,138 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT8, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT3, + buildPassNoteForAT4, + buildPassNoteForAT5, + buildPassNoteForAT6, + buildPassNoteForAT7, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.png"; +import at6Proof from "./at-6.png"; +import at7Proof from "./at-7.png"; +import at8Proof from "./at-8.png"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "MetaMask Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "MetaMask Wallet correctly resolves the address for Ξthereum.eth", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildPassNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "MetaMask Wallet correctly resolves the address for jesse.base.eth", + }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildPassNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "MetaMask Wallet correctly resolves the address for dperri.com", + }, + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildPassNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "MetaMask Wallet correctly resolves the address for lightkeeper.eth on the Base chain", + }, + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildPassNoteForAT6({ + method: 'the "send" flow in context of the Bitcoin chain', + proof: { + image: at6Proof, + alt: "MetaMask Wallet correctly resolves the Bitcoin address for gregskril.eth", + }, + }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildPassNoteForAT7({ + method: 'the "send" flow in context of the Solana chain', + proof: { + image: at7Proof, + alt: "MetaMask Wallet correctly resolves the Solana address for gregskril.eth", + }, + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:38:32Z") }, + ], + notes: buildFailNoteForAT8({ + method: 'the "send" flow in context of the Base chain', + proof: { + image: at8Proof, + alt: "MetaMask Wallet fails to gracefully handle the invalid address for zissou.eth on the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/metamask-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..1414087b --- /dev/null +++ b/ensawards.org/data/apps/metamask-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-05T15:34:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is + correct. +

+ MetaMask Wallet correctly resolves the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/okx-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/okx-exchange/benchmarks/index.tsx index a6091eb8..24ce4cd5 100644 --- a/ensawards.org/data/apps/okx-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/okx-exchange/benchmarks/index.tsx @@ -1,48 +1,16 @@ // 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 OKXExchange from "data/apps/okx-exchange"; 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 correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks: BestPracticeBenchmarks = { - "ensv2-ready-resolution": { - "correctly-resolve-ensv2-test-name-address": { - result: BenchmarkResults.NotApplicable, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T11:42:14Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "withdrawal" flow. The app doesn't - support the use of ENS names at all as the recipient identifier. -
-
- While that's a key issue that this app is encouraged to improve, this best practice is - applicable specifically to apps that already have an existing ENS integration and making - sure existing integrations are ENSv2 compatible. Therefore, for this best practice we - apply a rating of not applicable. -

- OKX exchange doesn't allow ENS name as recipient in the withdrawal flow -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, }; defineAppBenchmarks(OKXExchange, benchmarks); diff --git a/ensawards.org/data/apps/okx-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/okx-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..7b1d8093 Binary files /dev/null and b/ensawards.org/data/apps/okx-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/okx-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/okx-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..d9af56c9 --- /dev/null +++ b/ensawards.org/data/apps/okx-exchange/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,80 @@ +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; + +const method = "the 'withdraw' feature on okx.com"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildEnsNotSupportedNote({ + method, + proof: { + image: at1Proof, + alt: "OKX doesn't accept ENS names as withdrawal addresses", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T12:08:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/okx-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/okx-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/okx-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/okx-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/okx-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/okx-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..e96466c5 --- /dev/null +++ b/ensawards.org/data/apps/okx-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,44 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T11:42:14Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "withdrawal" flow. The app doesn't + support the use of ENS names at all as the recipient identifier. +
+
+ While that's a key issue that this app is encouraged to improve, this best practice is + applicable specifically to apps that already have an existing ENS integration and making + sure existing integrations are ENSv2 compatible. Therefore, for this best practice we + apply a rating of not applicable. +

+ OKX exchange doesn't allow ENS name as recipient in the withdrawal flow +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/okx-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/okx-wallet/benchmarks/index.tsx index ee54ee01..c89b61a6 100644 --- a/ensawards.org/data/apps/okx-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/okx-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 OKXWallet from "data/apps/okx-wallet"; 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 correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks: BestPracticeBenchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + // 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. @@ -26,27 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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-11T09:22:42Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is NOT correct. -

- OKX Wallet fails to resolve the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, }; defineAppBenchmarks(OKXWallet, benchmarks); diff --git a/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..f5ffbd82 Binary files /dev/null and b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..364b4fea Binary files /dev/null and b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..2da79b8a Binary files /dev/null and b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-4.png b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-4.png new file mode 100644 index 00000000..bbb3b4bc Binary files /dev/null and b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-4.png differ diff --git a/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-5.png b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-5.png new file mode 100644 index 00000000..71c7c7d0 Binary files /dev/null and b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-5.png differ diff --git a/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-6.png b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-6.png new file mode 100644 index 00000000..ca826e11 Binary files /dev/null and b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-6.png differ diff --git a/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-7.png b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-7.png new file mode 100644 index 00000000..739f0a3a Binary files /dev/null and b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/at-7.png differ diff --git a/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..07e9cedb --- /dev/null +++ b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,133 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT3, + buildFailNoteForAT4, + buildFailNoteForAT5, + buildNotApplicableForFailedTest, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT6, + buildPassNoteForAT7, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.png"; +import at6Proof from "./at-6.png"; +import at7Proof from "./at-7.png"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "OKX Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "OKX Wallet correctly resolves the address for Ξthereum.eth", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildFailNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "OKX Wallet fails to resolve the address for jesse.base.eth", + }, + extra: 'The app showed the message "Invalid address".', + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildFailNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "OKX Wallet fails to resolve the address for dperri.com", + }, + extra: 'The app showed the message "Invalid address".', + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "OKX Wallet fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: 'The app showed the message "Invalid address".', + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildPassNoteForAT6({ + method: 'the "send" flow in context of the Bitcoin chain', + proof: { + image: at6Proof, + alt: "OKX Wallet correctly resolves the Bitcoin address for gregskril.eth", + }, + }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildPassNoteForAT7({ + method: 'the "send" flow in context of the Solana chain', + proof: { + image: at7Proof, + alt: "OKX Wallet correctly resolves the Solana address for gregskril.eth", + }, + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T08:11:36Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/okx-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/okx-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/okx-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..35fb2beb --- /dev/null +++ b/ensawards.org/data/apps/okx-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T09:22:42Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is{" "} + NOT correct. +

+ OKX Wallet fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/phantom-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/phantom-wallet/benchmarks/index.tsx index ec4ad451..19123bfe 100644 --- a/ensawards.org/data/apps/phantom-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/phantom-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 PhantomWallet from "data/apps/phantom-wallet"; 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 depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.gif"; - -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. @@ -26,27 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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-08T12:49:34Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is NOT correct. -

- Phantom fails to resolve the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(PhantomWallet, benchmarks); diff --git a/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..65529e73 Binary files /dev/null and b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-2.gif b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-2.gif new file mode 100644 index 00000000..2ea0b993 Binary files /dev/null and b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-2.gif differ diff --git a/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-3.gif b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-3.gif new file mode 100644 index 00000000..82e1c200 Binary files /dev/null and b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-3.gif differ diff --git a/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-4.gif b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-4.gif new file mode 100644 index 00000000..6939a58c Binary files /dev/null and b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-4.gif differ diff --git a/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-5.gif b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-5.gif new file mode 100644 index 00000000..f4107c03 Binary files /dev/null and b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-5.gif differ diff --git a/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-6.png b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-6.png new file mode 100644 index 00000000..34d21dda Binary files /dev/null and b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-6.png differ diff --git a/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-7.png b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-7.png new file mode 100644 index 00000000..8af1dde6 Binary files /dev/null and b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/at-7.png differ diff --git a/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..48508326 --- /dev/null +++ b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,135 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT3, + buildFailNoteForAT4, + buildFailNoteForAT5, + buildFailNoteForAT6, + buildFailNoteForAT7, + buildNotApplicableForFailedTest, + buildPassNoteForAT1, + buildPassNoteForAT2, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.gif"; +import at3Proof from "./at-3.gif"; +import at4Proof from "./at-4.gif"; +import at5Proof from "./at-5.gif"; +import at6Proof from "./at-6.png"; +import at7Proof from "./at-7.png"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Phantom Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "Phantom Wallet correctly resolves the address for Ξthereum.eth", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildFailNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "Phantom Wallet fails to resolve the address for jesse.base.eth", + }, + extra: 'The app showed the message "Invalid Ethereum address".', + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildFailNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "Phantom Wallet fails to resolve the address for dperri.com", + }, + extra: 'The app showed the message "Invalid Ethereum address".', + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "Phantom Wallet fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildFailNoteForAT6({ + method: 'the "send" flow in context of the Bitcoin chain', + proof: { + image: at6Proof, + alt: "Phantom Wallet fails to resolve the Bitcoin address for gregskril.eth", + }, + extra: 'The app showed the message "Invalid Bitcoin address".', + }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildFailNoteForAT7({ + method: 'the "send" flow in context of the Solana chain', + proof: { + image: at7Proof, + alt: "Phantom Wallet fails to resolve the Solana address for gregskril.eth", + }, + extra: 'The app showed the message "Invalid Solana address".', + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/phantom-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.gif similarity index 100% rename from ensawards.org/data/apps/phantom-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif rename to ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.gif diff --git a/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..1d61926c --- /dev/null +++ b/ensawards.org/data/apps/phantom-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.gif"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-08T12:49:34Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is{" "} + NOT correct. +

+ Phantom fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/rabby-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/rabby-wallet/benchmarks/index.tsx index 17ddf6ca..5ff8a8bc 100644 --- a/ensawards.org/data/apps/rabby-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/rabby-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 RabbyWallet from "data/apps/rabby-wallet"; 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 depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.gif"; - -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. @@ -26,27 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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-15T06:40:48Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is correct. -

- Rabby Wallet correctly resolves the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(RabbyWallet, benchmarks); diff --git a/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-1.gif b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-1.gif new file mode 100644 index 00000000..9b107411 Binary files /dev/null and b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-1.gif differ diff --git a/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-2.gif b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-2.gif new file mode 100644 index 00000000..51836d31 Binary files /dev/null and b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-2.gif differ diff --git a/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-3.gif b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-3.gif new file mode 100644 index 00000000..22a875fa Binary files /dev/null and b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-3.gif differ diff --git a/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-4.gif b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-4.gif new file mode 100644 index 00000000..bceab955 Binary files /dev/null and b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-4.gif differ diff --git a/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-5.gif b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-5.gif new file mode 100644 index 00000000..8ead7066 Binary files /dev/null and b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/at-5.gif differ diff --git a/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..19a82bd2 --- /dev/null +++ b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,116 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT5, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT3, + buildPassNoteForAT4, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.gif"; +import at2Proof from "./at-2.gif"; +import at3Proof from "./at-3.gif"; +import at4Proof from "./at-4.gif"; +import at5Proof from "./at-5.gif"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Rabby Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "Rabby Wallet correctly resolves the address for Ξthereum.eth", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildPassNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "Rabby Wallet correctly resolves the address for jesse.base.eth", + }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildPassNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "Rabby Wallet correctly resolves the address for dperri.com", + }, + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "Rabby Wallet fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Bitcoin" }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Solana" }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T10:00:25Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/rabby-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.gif similarity index 100% rename from ensawards.org/data/apps/rabby-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif rename to ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.gif diff --git a/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..fdb395c8 --- /dev/null +++ b/ensawards.org/data/apps/rabby-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.gif"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-15T06:40:48Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is + correct. +

+ Rabby Wallet correctly resolves the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/rainbow-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/rainbow-wallet/benchmarks/index.tsx index 7ae5f55c..7cfb2517 100644 --- a/ensawards.org/data/apps/rainbow-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/rainbow-wallet/benchmarks/index.tsx @@ -14,7 +14,8 @@ import { parseTimestamp } from "@ensnode/ensnode-sdk"; import { cn } from "@/utils/tailwindClassConcatenation"; import exampleProofImage from "./acceptance-test-benchmark-proof-example.png"; -import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks = { // "recognize-all-ens-names": { @@ -24,6 +25,9 @@ const benchmarks = { // ], // }, + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + // 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. @@ -64,27 +68,6 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, - "ensv2-ready-resolution": { - "correctly-resolve-ensv2-test-name-address": { - result: BenchmarkResults.Fail, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-05T15:12:00Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is NOT correct. -

- Rainbow Wallet fails to resolve the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(RainbowWallet, benchmarks); diff --git a/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..d4291d47 Binary files /dev/null and b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..d8230f4b Binary files /dev/null and b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..f9669a37 Binary files /dev/null and b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-4.png b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-4.png new file mode 100644 index 00000000..0d9627f5 Binary files /dev/null and b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-4.png differ diff --git a/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-5.png b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-5.png new file mode 100644 index 00000000..c1cb2745 Binary files /dev/null and b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/at-5.png differ diff --git a/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..4fbe9eb2 --- /dev/null +++ b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,117 @@ +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT2, + buildFailNoteForAT3, + buildFailNoteForAT4, + buildFailNoteForAT5, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.png"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Rainbow Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildFailNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "Rainbow Wallet fails to resolve the address for Ξthereum.eth", + }, + extra: 'The app showed an "Enter a valid address" error instead of resolving the name.', + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildFailNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "Rainbow Wallet fails to resolve the address for jesse.base.eth", + }, + extra: 'The app showed an "Enter a valid address" error instead of resolving the name.', + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildFailNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "Rainbow Wallet fails to resolve the address for dperri.com", + }, + extra: 'The app showed an "Enter a valid address" error instead of resolving the name.', + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "Rainbow Wallet fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Bitcoin" }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Solana" }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/rainbow-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/rainbow-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..adf3c775 --- /dev/null +++ b/ensawards.org/data/apps/rainbow-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-05T15:12:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is{" "} + NOT correct. +

+ Rainbow Wallet fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/readyx-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/readyx-wallet/benchmarks/index.tsx index 57e3fa58..a417abbf 100644 --- a/ensawards.org/data/apps/readyx-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/readyx-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 ReadyXWallet from "data/apps/readyx-wallet"; 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 depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -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. @@ -26,33 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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.NotApplicable, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-08T16:18:00Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The app doesn't - support the use of ENS names at all as the recipient identifier. -
-
- While that's a key issue that this app is encouraged to improve, this best practice is - applicable specifically to apps that already have an existing ENS integration and making - sure existing integrations are ENSv2 compatible. Therefore, for this best practice we - apply a rating of not applicable. -

- ReadyX doesn't allow ENS name as recipient in the send flow -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(ReadyXWallet, benchmarks); diff --git a/ensawards.org/data/apps/readyx-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/readyx-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..a00a2b68 Binary files /dev/null and b/ensawards.org/data/apps/readyx-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/readyx-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/readyx-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..b27eea90 --- /dev/null +++ b/ensawards.org/data/apps/readyx-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,80 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:31:00Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "send" flow', + proof: { + image: at1Proof, + alt: "ReadyX doesn't allow ENS name as recipient in the send flow", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:32:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:32:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:32:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:32:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:33:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:33:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:33:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/readyx-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/readyx-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.png similarity index 100% rename from ensawards.org/data/apps/readyx-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/readyx-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.png diff --git a/ensawards.org/data/apps/readyx-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/readyx-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..b839581b --- /dev/null +++ b/ensawards.org/data/apps/readyx-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,43 @@ +// 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 { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-08T16:18:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The app doesn't support + the use of ENS names at all as the recipient identifier. +
+
+ While that's a key issue that this app is encouraged to improve, this best practice is + applicable specifically to apps that already have an existing ENS integration and making + sure existing integrations are ENSv2 compatible. Therefore, for this best practice we + apply a rating of not applicable. +

+ ReadyX doesn't allow ENS name as recipient in the send flow +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/robinhood-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/robinhood-exchange/benchmarks/index.tsx index 4bb2de11..63c061cb 100644 --- a/ensawards.org/data/apps/robinhood-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/robinhood-exchange/benchmarks/index.tsx @@ -1,56 +1,16 @@ // 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 RobinhoodExchange from "data/apps/robinhood-exchange"; 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 correctlyResolveEnsv2TestNameAddressProofImage1 from "./correctly-resolve-ensv2-test-name-address-proof-1.png"; -import correctlyResolveEnsv2TestNameAddressProofImage2 from "./correctly-resolve-ensv2-test-name-address-proof-2.png"; +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; const benchmarks: BestPracticeBenchmarks = { - "ensv2-ready-resolution": { - "correctly-resolve-ensv2-test-name-address": { - result: BenchmarkResults.NotApplicable, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-15T06:59:00Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The app doesn't - support the use of ENS names at all as the recipient identifier. -
-
- While that's a key issue that this app is encouraged to improve, this best practice is - applicable specifically to apps that already have an existing ENS integration and making - sure existing integrations are ENSv2 compatible. Therefore, for this best practice we - apply a rating of not applicable. -

-
- Robinhood doesn't allow ENS name as recipient in the send flow, part 1 - Robinhood doesn't allow ENS name as recipient in the send flow, part 2 -
-
- ), - } as const satisfies AcceptanceTestBenchmark, - }, + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, }; defineAppBenchmarks(RobinhoodExchange, benchmarks); diff --git a/ensawards.org/data/apps/robinhood-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof-1.png b/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/deposit-addresses/at-1.1.png similarity index 100% rename from ensawards.org/data/apps/robinhood-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof-1.png rename to ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/deposit-addresses/at-1.1.png diff --git a/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/deposit-addresses/at-1.2.png b/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/deposit-addresses/at-1.2.png new file mode 100644 index 00000000..248f3a9c Binary files /dev/null and b/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/deposit-addresses/at-1.2.png differ diff --git a/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..bdc083d9 --- /dev/null +++ b/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,87 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof1 from "./at-1.1.png"; +import at1Proof2 from "./at-1.2.png"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "send" flow', + proof: [ + { + image: at1Proof1, + alt: "Robinhood Exchange doesn't allow ENS names as the recipient in the send flow (part 1)", + }, + { + image: at1Proof2, + alt: "Robinhood Exchange doesn't allow ENS names as the recipient in the send flow (part 2)", + }, + ], + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:57:04Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-1.png b/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-1.png new file mode 100644 index 00000000..0a8c928e Binary files /dev/null and b/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-1.png differ diff --git a/ensawards.org/data/apps/robinhood-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof-2.png b/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-2.png similarity index 100% rename from ensawards.org/data/apps/robinhood-exchange/benchmarks/correctly-resolve-ensv2-test-name-address-proof-2.png rename to ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/ensv2-ready-resolution/ac-2.png diff --git a/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..14766648 --- /dev/null +++ b/ensawards.org/data/apps/robinhood-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,52 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage1 from "./ac-1.png"; +import correctlyResolveEnsv2TestNameAddressProofImage2 from "./ac-2.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-15T06:59:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The app doesn't support + the use of ENS names at all as the recipient identifier. +
+
+ While that's a key issue that this app is encouraged to improve, this best practice is + applicable specifically to apps that already have an existing ENS integration and making + sure existing integrations are ENSv2 compatible. Therefore, for this best practice we + apply a rating of not applicable. +

+
+ Robinhood doesn't allow ENS name as recipient in the send flow, part 1 + Robinhood doesn't allow ENS name as recipient in the send flow, part 2 +
+
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/robinhood-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/robinhood-wallet/benchmarks/index.tsx index ed9df402..67d987f0 100644 --- a/ensawards.org/data/apps/robinhood-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/robinhood-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 RobinhoodWallet from "data/apps/robinhood-wallet"; 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 depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.gif"; - -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. @@ -26,34 +22,7 @@ const benchmarks: BestPracticeBenchmarks = { "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.NotApplicable, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T13:26:00Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The wallet doesn't - support the use of ENS names at all as the recipient identifier. -
-
- While that's a key issue that this app is encouraged to improve, this best practice is - applicable specifically to apps that already have an existing ENS integration and making - sure existing integrations are ENSv2 compatible. Therefore, for this best practice we - apply a rating of not applicable. -

- Robinhood Wallet doesn't allow ENS name as recipient in the send flow -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, -}; +} as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(RobinhoodWallet, benchmarks); diff --git a/ensawards.org/data/apps/robinhood-wallet/benchmarks/resolution/deposit-addresses/at-1.gif b/ensawards.org/data/apps/robinhood-wallet/benchmarks/resolution/deposit-addresses/at-1.gif new file mode 100644 index 00000000..513e4aa4 Binary files /dev/null and b/ensawards.org/data/apps/robinhood-wallet/benchmarks/resolution/deposit-addresses/at-1.gif differ diff --git a/ensawards.org/data/apps/robinhood-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/robinhood-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..1a7d1740 --- /dev/null +++ b/ensawards.org/data/apps/robinhood-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,80 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.gif"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:31:00Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "send" flow', + proof: { + image: at1Proof, + alt: "Robinhood Wallet doesn't allow ENS name as recipient in the send flow", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:32:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:32:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:32:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:32:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:33:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:33:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:33:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/robinhood-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif b/ensawards.org/data/apps/robinhood-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.gif similarity index 100% rename from ensawards.org/data/apps/robinhood-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif rename to ensawards.org/data/apps/robinhood-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.gif diff --git a/ensawards.org/data/apps/robinhood-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/robinhood-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..36e97e83 --- /dev/null +++ b/ensawards.org/data/apps/robinhood-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,43 @@ +// 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 { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.gif"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T13:26:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The wallet doesn't + support the use of ENS names at all as the recipient identifier. +
+
+ While that's a key issue that this app is encouraged to improve, this best practice is + applicable specifically to apps that already have an existing ENS integration and making + sure existing integrations are ENSv2 compatible. Therefore, for this best practice we + apply a rating of not applicable. +

+ Robinhood Wallet doesn't allow ENS name as recipient in the send flow +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/safe-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/safe-wallet/benchmarks/index.tsx index 2b625b4d..bdbe3b0a 100644 --- a/ensawards.org/data/apps/safe-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/safe-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 SafeWallet from "data/apps/safe-wallet"; 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 depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.gif"; - -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. @@ -26,27 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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-08T12:49:34Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is NOT correct. -

- Safe{Wallet} fails to resolve the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(SafeWallet, benchmarks); diff --git a/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-1.gif b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-1.gif new file mode 100644 index 00000000..4f0d8fa2 Binary files /dev/null and b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-1.gif differ diff --git a/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-2.gif b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-2.gif new file mode 100644 index 00000000..689a01ee Binary files /dev/null and b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-2.gif differ diff --git a/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-3.gif b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-3.gif new file mode 100644 index 00000000..e102aef1 Binary files /dev/null and b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-3.gif differ diff --git a/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-4.gif b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-4.gif new file mode 100644 index 00000000..d6643b6b Binary files /dev/null and b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-4.gif differ diff --git a/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-5.gif b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-5.gif new file mode 100644 index 00000000..50789604 Binary files /dev/null and b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/at-5.gif differ diff --git a/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..e2bbfc46 --- /dev/null +++ b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,116 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT5, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT3, + buildPassNoteForAT4, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.gif"; +import at2Proof from "./at-2.gif"; +import at3Proof from "./at-3.gif"; +import at4Proof from "./at-4.gif"; +import at5Proof from "./at-5.gif"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T11:22:53Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Safe Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T11:22:53Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "Safe Wallet correctly resolves the address for Ξthereum.eth", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T11:22:53Z") }, + ], + notes: buildPassNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "Safe Wallet correctly resolves the address for jesse.base.eth", + }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T11:22:53Z") }, + ], + notes: buildPassNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "Safe Wallet correctly resolves the address for dperri.com", + }, + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T11:22:53Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "Safe Wallet fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: 'The app showed the message "Invalid address format".', + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T11:22:53Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Bitcoin" }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T11:22:53Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Solana" }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T11:22:53Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/safe-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.gif similarity index 100% rename from ensawards.org/data/apps/safe-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.gif rename to ensawards.org/data/apps/safe-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.gif diff --git a/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..2a02525e --- /dev/null +++ b/ensawards.org/data/apps/safe-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.gif"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-08T12:49:34Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is{" "} + NOT correct. +

+ Safe{Wallet} fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/status-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/status-wallet/benchmarks/index.tsx index 4c401951..e3c38226 100644 --- a/ensawards.org/data/apps/status-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/status-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 StatusWallet from "data/apps/status-wallet"; 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 depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -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. @@ -26,27 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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-09T06:50:00Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is NOT correct. -

- Status fails to resolve the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(StatusWallet, benchmarks); diff --git a/ensawards.org/data/apps/status-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/status-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..e9009ed2 Binary files /dev/null and b/ensawards.org/data/apps/status-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/status-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/status-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..3324f87a --- /dev/null +++ b/ensawards.org/data/apps/status-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,80 @@ +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildEnsNotSupportedNote({ + method, + proof: { + image: at1Proof, + alt: "Status Wallet doesn't allow ENS name as recipient in the send flow", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/status-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/status-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/status-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/status-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/status-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/status-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..f3d32e03 --- /dev/null +++ b/ensawards.org/data/apps/status-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-09T06:50:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is{" "} + NOT correct. +

+ Status fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/trust-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/trust-wallet/benchmarks/index.tsx index 93221171..d57c73fb 100644 --- a/ensawards.org/data/apps/trust-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/trust-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 TrustWallet from "data/apps/trust-wallet"; 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 depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -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. @@ -26,27 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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-09T08:43:00Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is NOT correct. -

- Trust Wallet fails to resolve the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(TrustWallet, benchmarks); diff --git a/ensawards.org/data/apps/trust-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/trust-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..0c7e7504 Binary files /dev/null and b/ensawards.org/data/apps/trust-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/trust-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/trust-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..aca4ea58 --- /dev/null +++ b/ensawards.org/data/apps/trust-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,80 @@ +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildEnsNotSupportedNote({ + method, + proof: { + image: at1Proof, + alt: "Trust Wallet doesn't allow ENS name as recipient in the send flow", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-22T15:17:40Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/trust-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/trust-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/trust-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/trust-wallet/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/trust-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/trust-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..428cdea2 --- /dev/null +++ b/ensawards.org/data/apps/trust-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-09T08:43:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is{" "} + NOT correct. +

+ Trust Wallet fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx b/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx index fa6684af..cecdca27 100644 --- a/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx +++ b/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -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. @@ -26,27 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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); diff --git a/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..33041631 Binary files /dev/null and b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..521e4dd5 Binary files /dev/null and b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..7016fdbf Binary files /dev/null and b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-4.png b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-4.png new file mode 100644 index 00000000..bd8d5eaa Binary files /dev/null and b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-4.png differ diff --git a/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-5.gif b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-5.gif new file mode 100644 index 00000000..696f5939 Binary files /dev/null and b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-5.gif differ diff --git a/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-7.png b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-7.png new file mode 100644 index 00000000..1009ad10 Binary files /dev/null and b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/at-7.png differ diff --git a/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..5549142e --- /dev/null +++ b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,120 @@ +import type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildBenchmarkNote, + buildFailNoteForAT3, + buildFailNoteForAT5, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT4, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.gif"; +import at7Proof from "./at-7.png"; + +const method = 'the "send" flow on uniswap.org'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Uniswap correctly resolves the direct onchain subname address", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { image: at2Proof, alt: "Uniswap correctly resolves a name requiring normalization" }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildFailNoteForAT3({ + method, + proof: { image: at3Proof, alt: "Uniswap fails to resolve a CCIP-Read .eth subname" }, + extra: 'The app showed the message "Invalid recipient".', + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildPassNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "Uniswap correctly implements CCIP-Read for offchain DNS names", + }, + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { image: at5Proof, alt: "Uniswap fails to resolve the Base deposit address" }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Bitcoin" }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildBenchmarkNote({ + proof: { + image: at7Proof, + alt: "Uniswap has Solana context but does not support ENS names in the send flow", + }, + children: ( + <> + The app has Solana context but shows message "Send is not supported on Solana" so there is + no way to test this scenario. Therefore we classify this acceptance test as Not + Applicable. + + ), + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.llev, lastUpdated: parseTimestamp("2026-06-20T17:35:56Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; 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/resolution/ensv2-ready-resolution/ac-1.png similarity index 100% rename from ensawards.org/data/apps/uniswap-defi/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/ensv2-ready-resolution/ac-1.png diff --git a/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..7262725f --- /dev/null +++ b/ensawards.org/data/apps/uniswap-defi/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,38 @@ +// 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 type { AcceptanceTestBenchmarks } from "data/benchmarks/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./ac-1.png"; + +const ensv2ReadyResolution = { + "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 AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/acceptance-test-benchmark-proof-example.png b/ensawards.org/data/apps/walletchan-wallet/benchmarks/contract-naming/display-named-smart-contracts-l2-chains/acceptance-test-benchmark-proof-example.png similarity index 100% rename from ensawards.org/data/apps/walletchan-wallet/benchmarks/acceptance-test-benchmark-proof-example.png rename to ensawards.org/data/apps/walletchan-wallet/benchmarks/contract-naming/display-named-smart-contracts-l2-chains/acceptance-test-benchmark-proof-example.png diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/contract-naming/display-named-smart-contracts-l2-chains/index.tsx b/ensawards.org/data/apps/walletchan-wallet/benchmarks/contract-naming/display-named-smart-contracts-l2-chains/index.tsx new file mode 100644 index 00000000..32a1ea1e --- /dev/null +++ b/ensawards.org/data/apps/walletchan-wallet/benchmarks/contract-naming/display-named-smart-contracts-l2-chains/index.tsx @@ -0,0 +1,38 @@ +// 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 { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types.ts"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import exampleProofImage from "./acceptance-test-benchmark-proof-example.png"; + +const displayNamedSmartContractsL2Chains = { + // 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 + "l2-chain-interactions-display-named-smart-contracts": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.apoorvlathey, lastUpdated: parseTimestamp("2026-04-18T00:00:00Z") }, + ], + notes: ( +
+

TODO: Add correct Benchmark notes

+ example proof +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default displayNamedSmartContractsL2Chains; diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/contract-naming/display-named-smart-contracts-mainnet/index.tsx b/ensawards.org/data/apps/walletchan-wallet/benchmarks/contract-naming/display-named-smart-contracts-mainnet/index.tsx new file mode 100644 index 00000000..f04de29e --- /dev/null +++ b/ensawards.org/data/apps/walletchan-wallet/benchmarks/contract-naming/display-named-smart-contracts-mainnet/index.tsx @@ -0,0 +1,42 @@ +// 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 { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types.ts"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import namedSmartContractsOnMainnetProofImage from "./named-smart-contracts-on-mainnet-proof.png"; + +const displayNamedSmartContractsMainnet = { + // 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 + "mainnet-interactions-display-named-smart-contracts": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.apoorvlathey, lastUpdated: parseTimestamp("2026-04-18T00:00:00Z") }, + ], + notes: ( +
+

+ Screenshot presents a transaction interaction on mainnet (setting name's records using ENS + public resolver contract) where the user is interacting with a contract that has an ENS + name, and the wallet is correctly displaying the ENS name of the contract. +

+ proof image +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default displayNamedSmartContractsMainnet; diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/named-smart-contracts-on-mainnet-proof.png b/ensawards.org/data/apps/walletchan-wallet/benchmarks/contract-naming/display-named-smart-contracts-mainnet/named-smart-contracts-on-mainnet-proof.png similarity index 100% rename from ensawards.org/data/apps/walletchan-wallet/benchmarks/named-smart-contracts-on-mainnet-proof.png rename to ensawards.org/data/apps/walletchan-wallet/benchmarks/contract-naming/display-named-smart-contracts-mainnet/named-smart-contracts-on-mainnet-proof.png diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx index f7d1aca2..6d5b8c49 100644 --- a/ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx @@ -1,88 +1,20 @@ // 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 WalletChanWallet from "data/apps/walletchan-wallet"; import { defineAppBenchmarks } from "data/benchmarks/registry"; -import { BenchmarkResults } from "data/benchmarks/types.ts"; -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 exampleProofImage from "./acceptance-test-benchmark-proof-example.png"; -import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; -import namedSmartContractsOnMainnetProofImage from "./named-smart-contracts-on-mainnet-proof.png"; +import displayNamedSmartContractsL2Chains from "./contract-naming/display-named-smart-contracts-l2-chains"; +import displayNamedSmartContractsMainnet from "./contract-naming/display-named-smart-contracts-mainnet"; +import depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; 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": { - result: BenchmarkResults.Pass, - contributions: [ - { from: contributors.apoorvlathey, lastUpdated: parseTimestamp("2026-04-18T00:00:00Z") }, - ], - notes: ( -
-

- Screenshot presents a transaction interaction on mainnet (setting name's records using - ENS public resolver contract) where the user is interacting with a contract that has an - ENS name, and the wallet is correctly displaying the ENS name of the contract. -

- proof image -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, - "display-named-smart-contracts-l2-chains": { - "l2-chain-interactions-display-named-smart-contracts": { - result: BenchmarkResults.Pass, - contributions: [ - { from: contributors.apoorvlathey, lastUpdated: parseTimestamp("2026-04-18T00:00:00Z") }, - ], - notes: ( -
-

TODO: Add correct Benchmark notes

- example proof -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, - "ensv2-ready-resolution": { - "correctly-resolve-ensv2-test-name-address": { - result: BenchmarkResults.Pass, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-18T08:26:11Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is correct. -

- WalletChan correctly resolves the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, + "display-named-smart-contracts-mainnet": displayNamedSmartContractsMainnet, + "display-named-smart-contracts-l2-chains": displayNamedSmartContractsL2Chains, + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(WalletChanWallet, benchmarks); diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-1.gif b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-1.gif new file mode 100644 index 00000000..2e54416a Binary files /dev/null and b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-1.gif differ diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-2.gif b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-2.gif new file mode 100644 index 00000000..c3c8b5eb Binary files /dev/null and b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-2.gif differ diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-3.gif b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-3.gif new file mode 100644 index 00000000..36ae6cca Binary files /dev/null and b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-3.gif differ diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-4.gif b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-4.gif new file mode 100644 index 00000000..cd3b1907 Binary files /dev/null and b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-4.gif differ diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-5.gif b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-5.gif new file mode 100644 index 00000000..be0bdd51 Binary files /dev/null and b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/at-5.gif differ diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..e3f893b2 --- /dev/null +++ b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,107 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT5, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT3, + buildPassNoteForAT4, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.gif"; +import at2Proof from "./at-2.gif"; +import at3Proof from "./at-3.gif"; +import at4Proof from "./at-4.gif"; +import at5Proof from "./at-5.gif"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T16:04:13Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { image: at1Proof, alt: "WalletChan correctly resolves the address for vitalik.eth" }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T16:07:55Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { image: at2Proof, alt: "WalletChan correctly resolves the address for Ξthereum.eth" }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T16:13:18Z") }, + ], + notes: buildPassNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "WalletChan correctly resolves the address for jesse.base.eth", + }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T15:15:52Z") }, + ], + notes: buildPassNoteForAT4({ + method, + proof: { image: at4Proof, alt: "WalletChan correctly resolves the address for dperri.com" }, + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T16:25:50Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "WalletChan fails to resolve the address for lightkeeper.eth in context of the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T16:19:00Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Bitcoin" }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T16:19:00Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Solana" }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T16:26:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.png similarity index 100% rename from ensawards.org/data/apps/walletchan-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.png diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..70a17e9b --- /dev/null +++ b/ensawards.org/data/apps/walletchan-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,37 @@ +// 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 { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-18T08:26:11Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is + correct. +

+ WalletChan correctly resolves the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/worldapp-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/worldapp-wallet/benchmarks/index.tsx index 0534606b..74ef83f7 100644 --- a/ensawards.org/data/apps/worldapp-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/worldapp-wallet/benchmarks/index.tsx @@ -1,22 +1,17 @@ // 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 WorldWallet from "data/apps/worldapp-wallet"; 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 depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -import correctlyResolveEnsv2TestNameAddressProofImage1 from "./correctly-resolve-ensv2-test-name-address-proof-1.png"; -import correctlyResolveEnsv2TestNameAddressProofImage2 from "./correctly-resolve-ensv2-test-name-address-proof-2.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. @@ -27,40 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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.NotApplicable, - contributions: [ - { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-09T07:49:00Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The wallet doesn't - support the use of ENS names at all as the recipient identifier. -
-
- While that's a key issue that this app is encouraged to improve, this best practice is - applicable specifically to apps that already have an existing ENS integration and making - sure existing integrations are ENSv2 compatible. Therefore, for this best practice we - apply a rating of not applicable. -

-
- World App's wallet doesn't allow ENS name as recipient in the send flow, part 1 - World App's wallet doesn't allow ENS name as recipient in the send flow, part 2 -
-
- ), - } as const satisfies AcceptanceTestBenchmark, - }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(WorldWallet, benchmarks); diff --git a/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/deposit-addresses/at-1-1.png b/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/deposit-addresses/at-1-1.png new file mode 100644 index 00000000..0d08c9db Binary files /dev/null and b/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/deposit-addresses/at-1-1.png differ diff --git a/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/deposit-addresses/at-1-2.png b/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/deposit-addresses/at-1-2.png new file mode 100644 index 00000000..576d261c Binary files /dev/null and b/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/deposit-addresses/at-1-2.png differ diff --git a/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..5c636d83 --- /dev/null +++ b/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,87 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof1 from "./at-1-1.png"; +import at1Proof2 from "./at-1-2.png"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:45:00Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "send" flow', + proof: [ + { + image: at1Proof1, + alt: "World App's wallet doesn't allow ENS name as recipient in the send flow, part 1", + }, + { + image: at1Proof2, + alt: "World App's wallet doesn't allow ENS name as recipient in the send flow, part 2", + }, + ], + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:32:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:32:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:32:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:32:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:33:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:33:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T13:33:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/worldapp-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof-1.png b/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof-1.png similarity index 100% rename from ensawards.org/data/apps/worldapp-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof-1.png rename to ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof-1.png diff --git a/ensawards.org/data/apps/worldapp-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof-2.png b/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof-2.png similarity index 100% rename from ensawards.org/data/apps/worldapp-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof-2.png rename to ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof-2.png diff --git a/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..59b7bec3 --- /dev/null +++ b/ensawards.org/data/apps/worldapp-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,51 @@ +// 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 { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage1 from "./correctly-resolve-ensv2-test-name-address-proof-1.png"; +import correctlyResolveEnsv2TestNameAddressProofImage2 from "./correctly-resolve-ensv2-test-name-address-proof-2.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-09T07:49:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The wallet doesn't + support the use of ENS names at all as the recipient identifier. +
+
+ While that's a key issue that this app is encouraged to improve, this best practice is + applicable specifically to apps that already have an existing ENS integration and making + sure existing integrations are ENSv2 compatible. Therefore, for this best practice we + apply a rating of not applicable. +

+
+ World App's wallet doesn't allow ENS name as recipient in the send flow, part 1 + World App's wallet doesn't allow ENS name as recipient in the send flow, part 2 +
+
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/zerion-wallet/benchmarks/index.tsx index 8185f4e4..219ba0b7 100644 --- a/ensawards.org/data/apps/zerion-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/zerion-wallet/benchmarks/index.tsx @@ -1,21 +1,17 @@ // 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 ZerionWallet from "data/apps/zerion-wallet"; 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 depositAddresses from "./resolution/deposit-addresses"; +import ensv2ReadyResolution from "./resolution/ensv2-ready-resolution"; -import { cn } from "@/utils/tailwindClassConcatenation"; +const benchmarks = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, -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. @@ -26,27 +22,6 @@ const benchmarks: BestPracticeBenchmarks = { "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-09T06:37:10Z") }, - ], - notes: ( -
-

- ENSv2 ready resolution was tested using the "send" flow. The resolved address - is NOT correct. -

- Zerion fails to resolve the name for ENSv2 -
- ), - } as const satisfies AcceptanceTestBenchmark, - }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(ZerionWallet, benchmarks); diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..4d084d71 Binary files /dev/null and b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-2.1.png b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-2.1.png new file mode 100644 index 00000000..cca1985f Binary files /dev/null and b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-2.1.png differ diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-2.2.png b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-2.2.png new file mode 100644 index 00000000..a528fc9e Binary files /dev/null and b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-2.2.png differ diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..e24f484f Binary files /dev/null and b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-4.png b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-4.png new file mode 100644 index 00000000..a9659b7b Binary files /dev/null and b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-4.png differ diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-5.png b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-5.png new file mode 100644 index 00000000..757a4178 Binary files /dev/null and b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-5.png differ diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-6.png b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-6.png new file mode 100644 index 00000000..bb69d9b7 Binary files /dev/null and b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-6.png differ diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-7.png b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-7.png new file mode 100644 index 00000000..fc1c94a3 Binary files /dev/null and b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/at-7.png differ diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..e9bf7135 --- /dev/null +++ b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,145 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildBenchmarkNote, + buildFailNoteForAT3, + buildFailNoteForAT4, + buildFailNoteForAT5, + buildFailNoteForAT7, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; +import { + ethereumAddressSpan, + ethereumNormalizedEnsNameSpan, + ethereumUnnormalizedEnsNameSpan, +} from "data/ens-best-practices/resolution/deposit-addresses/technicalDetails"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2_1Proof from "./at-2.1.png"; +import at2_2Proof from "./at-2.2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.png"; +import at6Proof from "./at-6.png"; +import at7Proof from "./at-7.png"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T14:56:43Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { image: at1Proof, alt: "Zerion correctly resolves the address for vitalik.eth" }, + }), + }, + // The standard AT2 fail note doesn't capture this nuance, so we write a custom note. + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T15:02:11Z") }, + ], + notes: buildBenchmarkNote({ + proof: [ + { + image: at2_1Proof, + alt: "Zerion correctly resolves the address for Ξthereum.eth, but associates a different ENS name with this address", + }, + { + image: at2_2Proof, + alt: "Zerion sometimes shows No Result Found when resolving Ξthereum.eth", + }, + ], + children: ( + <> + Tested using {method}. For {ethereumUnnormalizedEnsNameSpan} (normalized to{" "} + {ethereumNormalizedEnsNameSpan}) the resolved Ethereum Mainnet address is correct ( + {ethereumAddressSpan}), but the app behaves inconsistently when displaying the resolved + name. Repeated attempts produce different outcomes: sometimes it associates a completely + different ENS name with this address, sometimes it shows "No Result Found" for the entered + name. Every observed outcome is incorrect, so we count this as a failure. + + ), + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T15:10:31Z") }, + ], + notes: buildFailNoteForAT3({ + method, + proof: { image: at3Proof, alt: "Zerion fails to resolve the address for jesse.base.eth" }, + extra: 'The app showed the message "No results".', + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T15:13:31Z") }, + ], + notes: buildFailNoteForAT4({ + method, + proof: { image: at4Proof, alt: "Zerion fails to resolve the address for dperri.com" }, + extra: 'The app showed the message "No results".', + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T15:16:11Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "Zerion fails to resolve the address for lightkeeper.eth in context of the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T15:24:21Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ + chain: "Bitcoin", + proof: { image: at6Proof, alt: "Zerion doesn't have context of non-EVM chain Bitcoin" }, + }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T15:28:04Z") }, + ], + notes: buildFailNoteForAT7({ + method, + proof: { + image: at7Proof, + alt: "Zerion fails to resolve the Solana address for gregskril.eth", + }, + extra: + 'The app showed the message "Recipient is on Ethereum but the sending wallet is on Solana".', + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T15:20:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.png similarity index 100% rename from ensawards.org/data/apps/zerion-wallet/benchmarks/correctly-resolve-ensv2-test-name-address-proof.png rename to ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/ensv2-ready-resolution/correctly-resolve-ensv2-test-name-address-proof.png diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..121193aa --- /dev/null +++ b/ensawards.org/data/apps/zerion-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,37 @@ +// 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 { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { acceptanceTestDetailsContainerStyles } from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-ensv2-test-name-address-proof.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-09T06:37:10Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "send" flow. The resolved address is{" "} + NOT correct. +

+ Zerion fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/contributors/index.ts b/ensawards.org/data/contributors/index.ts index 7d4fbcb6..2c149156 100644 --- a/ensawards.org/data/contributors/index.ts +++ b/ensawards.org/data/contributors/index.ts @@ -40,6 +40,10 @@ const contributors = { chainId: mainnet.id, address: asNormalizedAddress("0xbd4cd9ae5bff533bf4ee926eeddc3dca5e2cdb4c"), }, + llev: { + chainId: mainnet.id, + address: asNormalizedAddress("0xc0de20a37e2dac848f81a93bd85fe4acdde7c0de"), + }, } as const satisfies Record; export default contributors; diff --git a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/technicalDetails.tsx index e8f4164e..e0a9bb59 100644 --- a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/technicalDetails.tsx +++ b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/technicalDetails.tsx @@ -102,7 +102,7 @@ const benefitFromUsingEns = (

); -const useCaseSummary = ( +const ensBestPracticeOverview = (

ENSIP-19 enables primary names to be set on any chain. Contracts deployed to an L2 chain benefit from this, as the contract can then configure its name directly on the chain it is deployed to @@ -150,7 +150,7 @@ const acceptanceTest1 = { } as const satisfies AcceptanceTest; const technicalDetails = { - useCaseSummary, + ensBestPracticeOverview, benefitFromUsingEns, implementationRecommendations, acceptanceTests: [acceptanceTest1], diff --git a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/technicalDetails.tsx index e75aad28..4ed1ac98 100644 --- a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/technicalDetails.tsx +++ b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/technicalDetails.tsx @@ -99,7 +99,7 @@ const benefitFromUsingEns = (

); -const useCaseSummary = ( +const ensBestPracticeOverview = (

If a contract has an ENS name, you can use its ENS profile to power additional UX improvements such as avatars, metadata, audit information, and more. More information can be found at the{" "} @@ -151,7 +151,7 @@ const acceptanceTest1 = { } as const satisfies AcceptanceTest; const technicalDetails = { - useCaseSummary, + ensBestPracticeOverview, benefitFromUsingEns, implementationRecommendations, acceptanceTests: [acceptanceTest1], diff --git a/ensawards.org/data/ens-best-practices/contract-naming/name-your-smart-contracts/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/contract-naming/name-your-smart-contracts/technicalDetails.tsx index b00a0a5b..d1fc3c05 100644 --- a/ensawards.org/data/ens-best-practices/contract-naming/name-your-smart-contracts/technicalDetails.tsx +++ b/ensawards.org/data/ens-best-practices/contract-naming/name-your-smart-contracts/technicalDetails.tsx @@ -15,7 +15,7 @@ import enscribelookupAcceptanceTestImage from "./images/enscribe-lookup-example. // TODO: The content isn't fully curated for now. -const useCaseSummary = ( +const ensBestPracticeOverview = (

+ ); +} + +/** The `Not Applicable` keyword, styled consistently. */ +const notApplicableSpan = ( + Not Applicable +); + +// --------------------------------------------------------------------------- +// Pass notes — one per acceptance test. +// --------------------------------------------------------------------------- + +/** AT1: direct onchain .eth subname resolves to its Ethereum Mainnet address. */ +export function buildPassNoteForAT1({ method, proof }: { method: Method; proof?: ProofInput }) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. The resolved Ethereum Mainnet address of {vitalikEnsNameSpan} is + correct ({vitalikAddressSpan}). + + ), + }); +} + +/** AT2: a name requiring normalization is normalized and resolved correctly. */ +export function buildPassNoteForAT2({ method, proof }: { method: Method; proof?: ProofInput }) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. The input {ethereumUnnormalizedEnsNameSpan} was correctly normalized + to {ethereumNormalizedEnsNameSpan} and resolved to the correct Ethereum Mainnet address ( + {ethereumAddressSpan}). + + ), + }); +} + +/** AT3: CCIP-Read for a .eth subname resolves to its Ethereum Mainnet address. */ +export function buildPassNoteForAT3({ method, proof }: { method: Method; proof?: ProofInput }) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. The CCIP-Read enabled .eth subname {jesseBaseEnsNameSpan} resolved to + the correct Ethereum Mainnet address ({jesseBaseAddressSpan}). + + ), + }); +} + +/** AT4: CCIP-Read for an offchain DNS name resolves to its Ethereum Mainnet address. */ +export function buildPassNoteForAT4({ method, proof }: { method: Method; proof?: ProofInput }) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. The offchain DNS name {dperriComEnsNameSpan} resolved to the correct + Ethereum Mainnet address via CCIP-Read ({dperriComAddressSpan}). + + ), + }); +} + +/** AT5: a name resolves to its address on a different EVM chain (Base). */ +export function buildPassNoteForAT5({ method, proof }: { method: Method; proof?: ProofInput }) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method} in context of the Base chain. The resolved Base chain address of{" "} + {lightkeeperEnsNameSpan} is correct ({lightkeeperAddressSpan}). + + ), + }); +} + +/** AT6: a name resolves to its Bitcoin address. */ +export function buildPassNoteForAT6({ method, proof }: { method: Method; proof?: ProofInput }) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. The resolved Bitcoin address of {gregskrilEnsNameSpan} is correct ( + {gregskrilAddressBitcoinSpan}). + + ), + }); +} + +/** AT7: a name resolves to its Solana address. */ +export function buildPassNoteForAT7({ method, proof }: { method: Method; proof?: ProofInput }) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. The resolved Solana address of {gregskrilEnsNameSpan} is correct ( + {gregskrilAddressSolanaSpan}). + + ), + }); +} + +/** AT8: the app gracefully handles a name whose address is not a valid EVM address. */ +export function buildPassNoteForAT8({ method, proof }: { method: Method; proof?: ProofInput }) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. The app gracefully handled the resolved address of{" "} + {zissouEnsNameSpan} being an invalid EVM address without breaking the user experience. + + ), + }); +} + +// --------------------------------------------------------------------------- +// Fail notes — one per acceptance test. +// `extra` is appended as a follow-up sentence for app-specific detail +// (e.g. "The app showed an "invalid domain format" error instead."). +// --------------------------------------------------------------------------- + +type FailArgs = { method: Method; proof?: ProofInput; extra?: ReactNode }; + +function withExtra(extra?: ReactNode): ReactNode { + return extra ? <> {extra} : null; +} + +/** AT1 failed: a direct onchain .eth subname did not resolve to its correct address. */ +export function buildFailNoteForAT1({ method, proof, extra }: FailArgs) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. The resolved Ethereum Mainnet address of {vitalikEnsNameSpan} is{" "} + NOT correct (expected {vitalikAddressSpan}).{withExtra(extra)} + + ), + }); +} + +/** AT2 failed: a name requiring normalization did not resolve to its correct address. */ +export function buildFailNoteForAT2({ method, proof, extra }: FailArgs) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. The input {ethereumUnnormalizedEnsNameSpan} (normalized to{" "} + {ethereumNormalizedEnsNameSpan}) was NOT resolved to its expected Ethereum Mainnet + address ({ethereumAddressSpan}).{withExtra(extra)} + + ), + }); +} + +/** AT3 failed: CCIP-Read for a .eth subname did not resolve to its correct address. */ +export function buildFailNoteForAT3({ method, proof, extra }: FailArgs) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. The CCIP-Read enabled .eth subname {jesseBaseEnsNameSpan} was{" "} + NOT resolved to its expected Ethereum Mainnet address ({jesseBaseAddressSpan}). + {withExtra(extra)} + + ), + }); +} + +/** AT4 failed: CCIP-Read for an offchain DNS name did not resolve to its correct address. */ +export function buildFailNoteForAT4({ method, proof, extra }: FailArgs) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. The offchain DNS name {dperriComEnsNameSpan} was NOT resolved + to its expected Ethereum Mainnet address ({dperriComAddressSpan}).{withExtra(extra)} + + ), + }); +} + +/** AT5 failed: a name did not resolve to its address on a different EVM chain (Base). */ +export function buildFailNoteForAT5({ method, proof, extra }: FailArgs) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method} in context of the Base chain. For {lightkeeperEnsNameSpan} the + resolved address is NOT the expected Base chain address ({lightkeeperAddressSpan}). + {withExtra(extra)} + + ), + }); +} + +/** AT6 failed: a name did not resolve to its Bitcoin address. */ +export function buildFailNoteForAT6({ method, proof, extra }: FailArgs) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. For {gregskrilEnsNameSpan} the resolved address is NOT the + expected Bitcoin address ({gregskrilAddressBitcoinSpan}).{withExtra(extra)} + + ), + }); +} + +/** AT7 failed: a name did not resolve to its Solana address. */ +export function buildFailNoteForAT7({ method, proof, extra }: FailArgs) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. For {gregskrilEnsNameSpan} the resolved address is NOT the + expected Solana address ({gregskrilAddressSolanaSpan}).{withExtra(extra)} + + ), + }); +} + +/** AT8 failed: the app did not gracefully handle a name with an invalid EVM address. */ +export function buildFailNoteForAT8({ method, proof, extra }: FailArgs) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. The app did NOT gracefully handle the resolved address of{" "} + {zissouEnsNameSpan} being an invalid EVM address, breaking the user experience. + {withExtra(extra)} + + ), + }); +} + +// --------------------------------------------------------------------------- +// Special-case fail note: the app doesn't accept ENS names at all (common for +// wallets). Used for AT1; the remaining tests then become Not Applicable via +// `buildNotApplicableForFailedTest({ testNumber: 1 })`. +// --------------------------------------------------------------------------- + +export function buildEnsNotSupportedNote({ + method, + proof, +}: { + method: Method; + proof?: ProofInput; +}) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Tested using {method}. The app doesn't support the use of ENS names at all as the recipient + identifier, so it never resolves the expected Ethereum Mainnet address of{" "} + {vitalikEnsNameSpan} ({vitalikAddressSpan}), which we classify as a failure. + + ), + }); +} + +// --------------------------------------------------------------------------- +// Not Applicable notes. +// --------------------------------------------------------------------------- + +/** The app has no concept of the given non-EVM chain (Bitcoin / Solana). */ +export function buildNotApplicableForNonEvmChain({ + chain, + proof, +}: { + chain: "Bitcoin" | "Solana"; + proof?: ProofInput; +}) { + return buildBenchmarkNote({ + proof, + children: ( + <> + The app doesn't have context of the non-EVM chain {chain} and therefore we classify this + acceptance test as {notApplicableSpan}. + + ), + }); +} + +/** + * This test can't be evaluated because a prerequisite acceptance test failed. + * `scope` describes what the app doesn't support, e.g. `"at all"` (when Acceptance + * Test 1 fails) or `"on Base"` (when Acceptance Test 5 fails). + */ +export function buildNotApplicableForFailedTest({ + testNumber, + scope = "at all", + proof, +}: { + testNumber: number; + scope?: ReactNode; + proof?: ProofInput; +}) { + return buildBenchmarkNote({ + proof, + children: ( + <> + Based on the results of the{" "} + Acceptance Test {testNumber} + , the app doesn't appear to support ENS resolution {scope} and therefore we classify this + acceptance test as {notApplicableSpan}. + + ), + }); +} diff --git a/ensawards.org/data/ens-best-practices/resolution/deposit-addresses/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/resolution/deposit-addresses/technicalDetails.tsx new file mode 100644 index 00000000..186a7928 --- /dev/null +++ b/ensawards.org/data/ens-best-practices/resolution/deposit-addresses/technicalDetails.tsx @@ -0,0 +1,737 @@ +import type { + AcceptanceTest, + AcceptanceTestBenchmarkFail, + AcceptanceTestBenchmarkPass, +} from "data/acceptance-tests/types"; +import { BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + acceptanceTestDetailsContainerStyles, + bestPracticeTechnicalDetailsCodeStyles, + bestPracticeTechnicalDetailsLinkStyles, +} from "data/ens-best-practices/styles"; +import type { BestPracticeTechnicalDetails } from "data/ens-best-practices/types"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import at01ResolveOnchainNameExampleFailImage from "./images/at01-resolve-onchain-name-example-fail.gif"; +import at01ResolveOnchainNameExamplePassImage from "./images/at01-resolve-onchain-name-example-pass.gif"; +import at02ResolveNameNeedingNormalizationExampleFailImage from "./images/at02-resolve-name-needing-normalization-example-fail.png"; +import at02ResolveNameNeedingNormalizationExamplePassImage from "./images/at02-resolve-name-needing-normalization-example-pass.gif"; +import at03ResolveOffchainEthSubnameExampleFailImage from "./images/at03-resolve-offchain-eth-subname-example-fail.gif"; +import at03ResolveOffchainEthSubnameExamplePassImage from "./images/at03-resolve-offchain-eth-subname-example-pass.gif"; +import at04ResolveOffchainDnsNameExampleFailImage from "./images/at04-resolve-offchain-dns-name-example-fail.gif"; +import at04ResolveOffchainDnsNameExamplePassImage from "./images/at04-resolve-offchain-dns-name-example-pass.gif"; +import at05ResolveNameOnOtherEvmChainExampleFailImage from "./images/at05-resolve-name-on-other-evm-chain-example-fail.gif"; +import at05ResolveNameOnOtherEvmChainExamplePassImage from "./images/at05-resolve-name-on-other-evm-chain-example-pass.png"; +import at06ResolveBitcoinAddressExampleFailImage from "./images/at06-resolve-bitcoin-address-example-fail.png"; +import at06ResolveBitcoinAddressExamplePassImage from "./images/at06-resolve-bitcoin-address-example-pass.png"; +import at07ResolveSolanaAddressExampleFailImage from "./images/at07-resolve-solana-address-example-fail.gif"; +import at07ResolveSolanaAddressExamplePassImage from "./images/at07-resolve-solana-address-example-pass.png"; +import at08HandleInvalidAddressFormatExampleFailImage from "./images/at08-handle-invalid-address-format-example-fail.png"; +import at08HandleInvalidAddressFormatExamplePassImage from "./images/at08-handle-invalid-address-format-example-pass.png"; + +const ensBestPracticeOverview = ( +
+

+ When an app needs its users to identify a particular address on a particular chain where an + action should be taken (such as a transfer or deposit), ENS offers the possibility of a better + user experience. Instead of forcing users to enter a long string of hexadecimal digits, with + ENS, users can have the option of entering a simple name such as{" "} + vitalik.eth. ENS can then be + used to translate this input name into the relevant deposit address, such as + + 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 + + . This process of determining the deposit address for a name is an example of what is called + "resolution". +

+

+ This best practice checks that your app correctly resolves ENS names to the correct address + and chain for different contexts. +

+

+ The simplest way to get this right—and to continuously and automatically stay up to date with + all ENS best practices even as ENS keeps evolving—is to use the{" "} + + ENS Omnigraph API + {" "} + (powered by{" "} + + ENSNode + + ) which handles the implementation details of ENS resolution for you. The implementation + recommendations below cover how your engineering team can adopt it, or other supported + options. +

+
+); + +const benefitFromUsingEnsTitle = "Why this matters"; +const benefitFromUsingEns = ( +

+ Apps that fail to correctly implement ENS resolution fail their users and erode trust in + important ways. Failure to integrate ENS at all damages the user experience of the app and + exposes users to key risks such as{" "} + + address poisoning attacks + + . +
+
+ If ENS resolution is integrated, but not according to all ENS best practices, then it can cause + big issues. For example, deposits may silently be sent to the wrong address and be irrecoverably + lost. Or only a subset of ENS names might be properly supported which damages the network + effects and market distribution of ENS. +

+); + +const implementationRecommendations = ( +
+

There are a few ways to make sure your app's ENS resolution follows all best practices.

+
+

+ 1. Take full responsibility yourself. +

+

+ One option is to take the full responsibility for implementing all of these details correctly + yourself and continuously and rigorously testing your app for continued compliance. +

+
+

+ 2. Use the ENS Omnigraph API (recommended). +

+

+ Another, more highly recommended option is to simply perform your ENS resolutions through the{" "} + + ENS Omnigraph API + {" "} + (powered by{" "} + + ENSNode + + ). +

+

+ Fetch your ENS data through the ENS Omnigraph API and everything just works. It's a single + typed GraphQL API over both ENSv1 and ENSv2 for every chain and offchain names too. It also + handles the indexed ENS data your app reads (e.g. the names an address owns, profiles, + histories, etc.), with resolutions accelerated by{" "} + + Protocol Acceleration + + . Drop it in with{" "} + + enssdk + {" "} + (TypeScript) or{" "} + + enskit + {" "} + (React). +

+
+); + +export const vitalikEnsNameSpan = ( + vitalik.eth +); + +export const vitalikAddressSpan = ( + + 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 + +); + +const acceptanceTest1 = { + order: 0, + acceptanceTestSlug: "at01-resolve-onchain-name", + description: ( +
+

+ The baseline test for supporting ENS resolution of deposit addresses is to test with an + onchain direct subname of .eth (such as {vitalikEnsNameSpan}) where the name is input in + fully normalized form and the context for resolving the deposit address is on the Ethereum + Mainnet chain. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-19T08:48:26Z") }, + ], + notes: ( +
+

+ An app passes this test when it resolves the Ethereum Mainnet address of + {vitalikEnsNameSpan} to {vitalikAddressSpan}. +

+ Ambire Wallet correctly resolves the address for vitalik.eth +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + notes: ( +
+

+ An app fails this test when it does not accept ENS names at all as input or fails to + correctly resolve the Ethereum Mainnet address of {vitalikEnsNameSpan} to anything other + than the correct value ({vitalikAddressSpan}). +

+ Binance Wallet doesn't allow ENS name as recipient in the send flow +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, +} as const satisfies AcceptanceTest; + +export const ethereumUnnormalizedEnsNameSpan = ( + Ξthereum.eth +); + +export const ethereumNormalizedEnsNameSpan = ( + ξthereum.eth +); + +export const ethereumAddressSpan = ( + + 0x31C09F0616532F7a6f33d9ee4e1F45Ea529481af + +); + +const acceptanceTest2 = { + order: 1, + acceptanceTestSlug: "at02-resolve-name-needing-normalization", + description: ( +
+

+ This variation of the baseline test changes the input name to{" "} + {ethereumUnnormalizedEnsNameSpan}. +

+

+ This acceptance test verifies correct implementation of ENS name normalization and input + validation rules. This name is valid for input as an ENS name. It is not ENS normalized but + it is ENS normalizable. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + ], + notes: ( +
+

+ An app passes this test when it correctly normalizes the input name from{" "} + {ethereumUnnormalizedEnsNameSpan} to {ethereumNormalizedEnsNameSpan} and then resolves the + Ethereum Mainnet address of {ethereumNormalizedEnsNameSpan} to {ethereumAddressSpan}. +

+ Rabby correctly resolves the address for Ξthereum.eth +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:36:00Z") }, + ], + notes: ( +
+

+ An app fails this test when it does not accept normalizable ENS names such as{" "} + {ethereumUnnormalizedEnsNameSpan} as input or fails to correctly normalize this input to{" "} + {ethereumNormalizedEnsNameSpan} or fails to correctly resolve this input to anything other + than the correct value ({ethereumAddressSpan}). +

+ Gemini Wallet fails to correctly normalize and resolve the address for Ξthereum.eth +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, +} as const satisfies AcceptanceTest; + +export const jesseBaseEnsNameSpan = ( + jesse.base.eth +); + +export const jesseBaseAddressSpan = ( + + 0x2211d1D0020DAEA8039E46Cf1367962070d77DA9 + +); + +const acceptanceTest3 = { + order: 2, + acceptanceTestSlug: "at03-resolve-offchain-eth-subname", + description: ( +
+

+ This variation of the baseline test changes the input name to {jesseBaseEnsNameSpan}. +

+

+ This acceptance test verifies correct implementation of CCIP-read for a subname nested + beneath .eth. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + ], + notes: ( +
+

+ An app passes this test when it correctly resolves the Ethereum Mainnet address of{" "} + {jesseBaseEnsNameSpan} to {jesseBaseAddressSpan}. +

+ Safe{Wallet} correctly resolves the address for jesse.base.eth +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + notes: ( +
+

+ An app fails this test when it does not accept ENS names such as {jesseBaseEnsNameSpan} as + input or fails to correctly resolve this input to anything other than the correct value ( + {jesseBaseAddressSpan}). +

+ Phantom fails to resolve the address for jesse.base.eth +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, +} as const satisfies AcceptanceTest; + +export const dperriComEnsNameSpan = ( + dperri.com +); + +export const dperriComAddressSpan = ( + + 0x0b08dA7068b73A579Bd5E8a8290ff8afd37bc32A + +); + +const acceptanceTest4 = { + order: 3, + acceptanceTestSlug: "at04-resolve-offchain-dns-name", + description: ( +
+

+ This variation of the baseline test changes the input name to {dperriComEnsNameSpan}. +

+

+ This acceptance test verifies correct implementation of CCIP-read for DNS names that have + not been imported onchain but are still valid ENS names. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + ], + notes: ( +
+

+ An app passes this test when it correctly resolves the Ethereum Mainnet address of{" "} + {dperriComEnsNameSpan} to {dperriComAddressSpan}. +

+ WalletChan correctly resolves the address for dperri.com +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + notes: ( +
+

+ An app fails this test when it does not accept ENS names such as {dperriComEnsNameSpan} as + input or fails to correctly resolve this input to anything other than the correct value ( + {dperriComAddressSpan}). +

+ Ambire Wallet fails to resolve the address for dperri.com +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, +} as const satisfies AcceptanceTest; + +export const lightkeeperEnsNameSpan = ( + lightkeeper.eth +); + +export const lightkeeperAddressSpan = ( + + 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 + +); + +const acceptanceTest5 = { + order: 4, + acceptanceTestSlug: "at05-resolve-name-on-other-evm-chain", + description: ( +
+

+ This variation of the baseline test makes two changes: (1) the input name changes to{" "} + {lightkeeperEnsNameSpan} and (2) the context of the resolution changes from Ethereum Mainnet + to another EVM chain (the Base chain that's operated by Coinbase). +

+

+ This acceptance test verifies correct implementation of resolving the address for a name in + the context of different EVM chains. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T07:51:00Z") }, + ], + notes: ( +
+

+ An app passes this test when it correctly resolves the Base chain address of{" "} + {lightkeeperEnsNameSpan} to {lightkeeperAddressSpan}. +

+ Crypto.com Wallet correctly resolves the address for lightkeeper.eth on the Base chain +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + ], + notes: ( +
+

+ An app fails this test when it fails to correctly resolve this input to anything other + than the correct value ({lightkeeperAddressSpan}). +

+ Rabby resolves lightkeeper.eth to incorrect address on the Base chain +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, +} as const satisfies AcceptanceTest; + +export const gregskrilEnsNameSpan = ( + gregskril.eth +); + +export const gregskrilAddressBitcoinSpan = ( + 3NnpwUMGdGKuYaPDQagNXAgVXz9HdnJDNS +); + +const acceptanceTest6 = { + order: 5, + acceptanceTestSlug: "at06-resolve-bitcoin-address", + description: ( +
+

+ This variation of the baseline test makes two changes: (1) the input name changes to{" "} + {gregskrilEnsNameSpan} and (2) the context of the resolution changes from Ethereum Mainnet + to the non-EVM chain Bitcoin. +

+

+ This acceptance test verifies correct implementation of resolving the address for a name in + the context of a non-EVM chain such as Bitcoin. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + ], + notes: ( +
+

+ An app passes this test when it correctly resolves the Bitcoin address of{" "} + {gregskrilEnsNameSpan} to {gregskrilAddressBitcoinSpan}. +

+ Coinbase Wallet correctly resolves the address for gregskril.eth on Bitcoin +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:54:00Z") }, + ], + notes: ( +
+

+ An app fails this test when it does not accept ENS names such as {gregskrilEnsNameSpan} as + input when sending to non-EVM chains such as Bitcoin or fails to correctly resolve this + input to anything other than the correct value ({gregskrilAddressBitcoinSpan}). +

+ Phantom fails to resolve the address for gregskril.eth on Bitcoin +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, +} as const satisfies AcceptanceTest; + +export const gregskrilAddressSolanaSpan = ( + + 2JQANQn1kccapb7GT8XScf9qBy59uMo9vh9WwVQhwStJ + +); + +const acceptanceTest7 = { + order: 6, + acceptanceTestSlug: "at07-resolve-solana-address", + description: ( +
+

+ This variation of the baseline test makes two changes: (1) the input name changes to{" "} + {gregskrilEnsNameSpan} and (2) the context of the resolution changes from Ethereum Mainnet + to the non-EVM chain Solana. +

+

+ This acceptance test verifies correct implementation of resolving the address for a name in + the context of a non-EVM chain such as Solana. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + ], + notes: ( +
+

+ An app passes this test when it correctly resolves the Solana address of{" "} + {gregskrilEnsNameSpan} to {gregskrilAddressSolanaSpan}. +

+ OKX Wallet correctly resolves the address for gregskril.eth on Solana +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T14:51:00Z") }, + ], + notes: ( +
+

+ An app fails this test when it does not accept ENS names such as {gregskrilEnsNameSpan} as + input when sending to non-EVM chains such as Solana or fails to correctly resolve this + input to anything other than the correct value ({gregskrilAddressSolanaSpan}). +

+ Coinbase Wallet fails to resolve the address for gregskril.eth on Solana +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, +} as const satisfies AcceptanceTest; + +export const zissouEnsNameSpan = ( + zissou.eth +); + +export const zissouAddressSpan = ( + + (invalid address) + +); + +const acceptanceTest8 = { + order: 7, + acceptanceTestSlug: "at08-handle-invalid-address-format", + description: ( +
+

+ This variation of the baseline test makes two changes: (1) the input name changes to{" "} + {zissouEnsNameSpan} and (2) the context of the resolution changes from Ethereum Mainnet to + the EVM chain Base. +

+

+ This acceptance test verifies correct implementation of resolving the address for a name on + an EVM chain that is not formatted as a valid EVM address (not a 20-byte hex value), instead + resolving to {zissouAddressSpan}. +

+
+ ), + examplePass: { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:46:00Z") }, + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T07:57:00Z") }, + ], + notes: ( +
+

+ An app passes this test so long as it gracefully handles the resolved address being an + invalid EVM address. Here we define gracefully as not breaking the overall user + experience. +

+ Crypto.com Wallet gracefully handles the invalid address for zissou.eth on the Base chain +
+ ), + } as const satisfies AcceptanceTestBenchmarkPass, + exampleFail: { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.lightwalker, lastUpdated: parseTimestamp("2026-06-18T15:49:00Z") }, + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-22T12:25:00Z") }, + ], + notes: ( +
+

+ An app fails this test if the resolution of an invalid EVM address is not handled + gracefully and breaks the overall user experience. +

+

+ Although the UI shows a resolved address, this fails because {zissouEnsNameSpan} cannot be + resolved on Base (because the address record saved on Base for this name is not a valid + EVM address) and is silently falling back to the Ethereum Mainnet address, which risks + irrecoverable loss of funds. +

+ MetaMask resolves zissou.eth to the Ethereum Mainnet address instead of the Base address. +
+ ), + } as const satisfies AcceptanceTestBenchmarkFail, +} as const satisfies AcceptanceTest; + +const technicalDetails = { + ensBestPracticeOverview, + benefitFromUsingEnsTitle, + benefitFromUsingEns, + implementationRecommendations, + acceptanceTests: [ + acceptanceTest1, + acceptanceTest2, + acceptanceTest3, + acceptanceTest4, + acceptanceTest5, + acceptanceTest6, + acceptanceTest7, + acceptanceTest8, + ], +} as const satisfies BestPracticeTechnicalDetails; + +export default technicalDetails; diff --git a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png b/ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png similarity index 100% rename from ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png rename to ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-fail-example.png diff --git a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif b/ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif similarity index 100% rename from ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif rename to ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif diff --git a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif b/ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif similarity index 100% rename from ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif rename to ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/images/correctly-resolve-ensv2-test-name-address-pass-example.gif diff --git a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/index.ts b/ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/index.ts similarity index 93% rename from ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/index.ts rename to ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/index.ts index 73b7c44a..cf185371 100644 --- a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/index.ts +++ b/ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/index.ts @@ -8,7 +8,7 @@ import { type BestPracticeApp, BestPracticeTypes } from "data/ens-best-practices import { parseTimestamp } from "@ensnode/ensnode-sdk"; -import ENSv2ReadinessCategory from "../index.ts"; +import ENSResolutionCategory from "../index.ts"; import technicalDetails from "./technicalDetails.tsx"; const ensv2ReadyResolution: BestPracticeApp = { @@ -17,7 +17,7 @@ const ensv2ReadyResolution: BestPracticeApp = { bestPracticeSlug: "ensv2-ready-resolution", name: "Correctly Resolve All Names For ENSv2", description: "Make sure your app keeps resolving ENS names correctly once ENSv2 launches.", - category: ENSv2ReadinessCategory, + category: ENSResolutionCategory, appliesTo: [AppTypes.Wallet, AppTypes.Explorer, AppTypes.DeFi, AppTypes.Exchange], technicalDetails: technicalDetails, contributions: [ diff --git a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/technicalDetails.tsx similarity index 86% rename from ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/technicalDetails.tsx rename to ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/technicalDetails.tsx index 1033ff22..27a51b32 100644 --- a/ensawards.org/data/ens-best-practices/ensv2-readiness/ensv2-ready-resolution/technicalDetails.tsx +++ b/ensawards.org/data/ens-best-practices/resolution/ensv2-ready-resolution/technicalDetails.tsx @@ -8,6 +8,7 @@ import { BenchmarkResults } from "data/benchmarks/types"; import contributors from "data/contributors"; import { acceptanceTestDetailsContainerStyles, + bestPracticeTechnicalDetailsCodeStyles, bestPracticeTechnicalDetailsLinkStyles, } from "data/ens-best-practices/styles"; import type { BestPracticeTechnicalDetails } from "data/ens-best-practices/types"; @@ -20,7 +21,7 @@ import correctlyResolveEnsv2TestNameAddressExampleFailImage from "./images/corre import correctlyResolveEnsv2TestNameAddressExampleNotApplicableImage from "./images/correctly-resolve-ensv2-test-name-address-not-applicable-example.gif"; import correctlyResolveEnsv2TestNameAddressExamplePassImage from "./images/correctly-resolve-ensv2-test-name-address-pass-example.gif"; -const useCaseSummary = ( +const ensBestPracticeOverview = (

ENS is upgrading to{" "} @@ -163,7 +164,7 @@ const implementationRecommendations = ( If your app makes its own low-level RPC calls instead of using the Omnigraph or a helper library like viem, point your resolution RPC calls at ENS's new stable Universal Resolver proxy ( - + 0xeeeeeeee14d718c2b47d9923deab1335e144eeee ) rather than hardcoding a specific Universal Resolver implementation. Because ENS controls @@ -189,11 +190,9 @@ const acceptanceTest1 = {

To check whether an app has ENSv2 ready resolution, resolve the name{" "} - - ur.integration-tests.eth - {" "} - and verify it resolves to the correct address,{" "} - + ur.integration-tests.eth and + verify it resolves to the correct address,{" "} + 0x2222222222222222222222222222222222222222 . @@ -213,11 +212,9 @@ const acceptanceTest1 = { Rabby Wallet {" "} resolves the name{" "} - - ur.integration-tests.eth - {" "} + ur.integration-tests.eth{" "} to the correct address: - + 0x2222222222222222222222222222222222222222 . @@ -239,11 +236,9 @@ const acceptanceTest1 = {

An app that is NOT ENSv2 ready resolves the name{" "} - - ur.integration-tests.eth - {" "} + ur.integration-tests.eth{" "} to an invalid address such as:{" "} - + 0x1111111111111111111111111111111111111111 . @@ -272,10 +267,8 @@ const acceptanceTest1 = {

Therefore, any app that currently doesn’t support ENS resolution at all is classified as - - Not Applicable - {" "} - for this best practice. + Not Applicable for this + best practice.

Binance Wallet doesn't currently support ENS resolution at all) => ( + + + + +); + +export default Icon; diff --git a/ensawards.org/data/projects/bybit/index.ts b/ensawards.org/data/projects/bybit/index.ts new file mode 100644 index 00000000..29605f6c --- /dev/null +++ b/ensawards.org/data/projects/bybit/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 BybitIcon from "./icon.tsx"; + +const BybitProject: Project = { + id: ProjectIds.Bybit, + name: "Bybit", + description: + "Cryptocurrency exchange for spot and derivatives trading, buying, selling, and managing digital assets.", + icon: BybitIcon, + socials: { + website: new URL("https://www.bybit.com"), + twitter: new URL("https://x.com/Bybit_Official"), + }, +}; + +defineProject(BybitProject); + +export default BybitProject; diff --git a/ensawards.org/data/projects/types.ts b/ensawards.org/data/projects/types.ts index fcd4a0f4..959c1c31 100644 --- a/ensawards.org/data/projects/types.ts +++ b/ensawards.org/data/projects/types.ts @@ -37,6 +37,7 @@ export const ProjectIds = { Robinhood: "project-robinhood", Gemini: "project-gemini", Frame: "project-frame", + Bybit: "project-bybit", } as const; /** diff --git a/ensawards.org/data/shared/test-utils.tsx b/ensawards.org/data/shared/test-utils.tsx index 78145810..f179d4f1 100644 --- a/ensawards.org/data/shared/test-utils.tsx +++ b/ensawards.org/data/shared/test-utils.tsx @@ -49,7 +49,7 @@ export const createMockBestPractice = (overrides: { }, appliesTo: [AppTypes.Wallet], technicalDetails: { - useCaseSummary:

Mock use case summary

, + ensBestPracticeOverview:

Mock use case summary

, implementationRecommendations:

Mock implementation recommendations

, benefitFromUsingEns:

Mock benefit from using ENS

, acceptanceTests: [ diff --git a/ensawards.org/src/components/molecules/technicalDetails/benchmark/index.astro b/ensawards.org/src/components/molecules/technicalDetails/benchmark/index.astro index 49da85fb..c5c27192 100644 --- a/ensawards.org/src/components/molecules/technicalDetails/benchmark/index.astro +++ b/ensawards.org/src/components/molecules/technicalDetails/benchmark/index.astro @@ -8,7 +8,7 @@ import { technicalSectionContainerStyles, technicalSectionHeaderStyles, ImplementationRecommendations, - UseCaseSummary, + EnsBestPracticeOverview, AcceptanceTestDetailsContainer, } from "../shared"; import { cn } from "@/utils/tailwindClassConcatenation"; @@ -19,6 +19,7 @@ import { AcceptanceTestResultFooter, AcceptanceTestResultFooterLoading, } from "./acceptanceTestResultDetails.tsx"; +import { getAcceptanceTestBySlug } from "data/acceptance-tests/utils"; interface BenchmarkTechnicalDetailsProps { bestPractice: BestPractice; @@ -29,10 +30,32 @@ interface BenchmarkTechnicalDetailsProps { const { bestPractice, acceptanceTestBenchmarks, benchmarkedApp }: BenchmarkTechnicalDetailsProps = Astro.props; -// Sort acceptance tests by slug (alphabetically) to ensure consistent display order across best practice details and benchmark details pages. +// Sort acceptance tests by order (ascending) to ensure consistent display order +// across best practice details and benchmark details pages. +// The tiebreaker is the alphabetical order of the acceptance test slug. const sortedAcceptanceTestBenchmarks = [...Object.entries(acceptanceTestBenchmarks)].sort( - ([aAcceptanceTestSlug, _a], [bAcceptanceTestSlug, _b]) => - aAcceptanceTestSlug.localeCompare(bAcceptanceTestSlug), + ([aAcceptanceTestSlug, _a], [bAcceptanceTestSlug, _b]) => { + const aAcceptanceTest = getAcceptanceTestBySlug(aAcceptanceTestSlug); + const bAcceptanceTest = getAcceptanceTestBySlug(bAcceptanceTestSlug); + + if (!aAcceptanceTest) { + throw new Error( + `Invariant(AcceptanceTestSlug): Acceptance test with slug="${aAcceptanceTestSlug}" is not defined.`, + ); + } + + if (!bAcceptanceTest) { + throw new Error( + `Invariant(AcceptanceTestSlug): Acceptance test with slug="${bAcceptanceTestSlug}" is not defined.`, + ); + } + + const aOrder = aAcceptanceTest.order ?? Number.POSITIVE_INFINITY; + const bOrder = bAcceptanceTest.order ?? Number.POSITIVE_INFINITY; + if (aOrder !== bOrder) return aOrder - bOrder; + + return aAcceptanceTestSlug.localeCompare(bAcceptanceTestSlug); + }, ); --- @@ -42,7 +65,7 @@ const sortedAcceptanceTestBenchmarks = [...Object.entries(acceptanceTestBenchmar

ENS best practice benchmark report

- +
{ diff --git a/ensawards.org/src/components/molecules/technicalDetails/bestPractice/index.tsx b/ensawards.org/src/components/molecules/technicalDetails/bestPractice/index.tsx index 833ea6fb..d56041aa 100644 --- a/ensawards.org/src/components/molecules/technicalDetails/bestPractice/index.tsx +++ b/ensawards.org/src/components/molecules/technicalDetails/bestPractice/index.tsx @@ -7,10 +7,10 @@ import { cn } from "@/utils/tailwindClassConcatenation"; import { AcceptanceTestDetailsContainer, BenefitFromUsingEns, + EnsBestPracticeOverview, ImplementationRecommendations, technicalSectionContainerStyles, technicalSectionHeaderStyles, - UseCaseSummary, } from "../shared"; export interface BestPracticeTechnicalDetailsProps { @@ -20,16 +20,22 @@ export interface BestPracticeTechnicalDetailsProps { export const BestPracticeTechnicalDetails = ({ bestPractice, }: BestPracticeTechnicalDetailsProps) => { - // Sort acceptance tests by slug (alphabetically) to ensure consistent display order across best practice details and benchmark details pages. - const sortedAcceptanceTests = [...bestPractice.technicalDetails.acceptanceTests].sort((a, b) => - a.acceptanceTestSlug.localeCompare(b.acceptanceTestSlug), - ); + // Sort acceptance tests by order (ascending) to ensure consistent display order + // across best practice details and benchmark details pages. + // The tiebreaker is the alphabetical order of the acceptance test slug. + const sortedAcceptanceTests = [...bestPractice.technicalDetails.acceptanceTests].sort((a, b) => { + const aOrder = a.order ?? Number.POSITIVE_INFINITY; + const bOrder = b.order ?? Number.POSITIVE_INFINITY; + if (aOrder !== bOrder) return aOrder - bOrder; + + return a.acceptanceTestSlug.localeCompare(b.acceptanceTestSlug); + }); return (

ENS best practice overview

- +
{sortedAcceptanceTests.map((acceptanceTest, index) => ( diff --git a/ensawards.org/src/components/molecules/technicalDetails/shared.tsx b/ensawards.org/src/components/molecules/technicalDetails/shared.tsx index fd467cea..94d5a575 100644 --- a/ensawards.org/src/components/molecules/technicalDetails/shared.tsx +++ b/ensawards.org/src/components/molecules/technicalDetails/shared.tsx @@ -33,8 +33,8 @@ export const ImplementationRecommendations = ({ bestPractice }: { bestPractice:
); -export const UseCaseSummary = ({ bestPractice }: { bestPractice: BestPractice }) => ( - <>{bestPractice.technicalDetails.useCaseSummary} +export const EnsBestPracticeOverview = ({ bestPractice }: { bestPractice: BestPractice }) => ( + <>{bestPractice.technicalDetails.ensBestPracticeOverview} ); export interface AcceptanceTestDetailsProps {