Skip to content
This repository was archived by the owner on Aug 5, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
ca34b63
Add 'refresh' to the relative time in <AcceptanceTestResultFooter>
Y3drk Jun 10, 2026
b008d7b
Add Exchange app type
Y3drk Jun 10, 2026
b2cb56a
Add Binance
Y3drk Jun 11, 2026
7e4b1ae
Add OKX Wallet
Y3drk Jun 11, 2026
d5ec675
Add Kraken (no official icons yet)
Y3drk Jun 11, 2026
7888ef9
Add OKX exchange + new benchmark for Binance exchange
Y3drk Jun 11, 2026
1988cd2
Add Crypto.com
Y3drk Jun 11, 2026
7c8349c
Add Robinhood Wallet
Y3drk Jun 11, 2026
d30f6d7
Add Gemini Wallet & Kraken icons
Y3drk Jun 12, 2026
39a6870
Add Coinbase exchange
Y3drk Jun 12, 2026
f3749db
Apply AI agents' suggestions, pt.1
Y3drk Jun 12, 2026
de7239e
Merge branch 'main' of https://github.com/namehash/ensawards into y3d…
Y3drk Jun 12, 2026
2585fee
Add Frame & rebenchmark Rabby
Y3drk Jun 15, 2026
7708d03
Add Robinhood Exchange
Y3drk Jun 15, 2026
fdb1eb8
Add OG images for the majority of new apps
Y3drk Jun 15, 2026
cc281bb
Add OG images for the majority of new apps, pt.2
Y3drk Jun 15, 2026
48c48da
Apply AI agents' suggestions, pt.2
Y3drk Jun 15, 2026
3450299
Fix audited dependency vulnerabilities
Y3drk Jun 15, 2026
63f2cd0
Apply AI agents' suggestions, pt.3
Y3drk Jun 15, 2026
a9c0744
Add OG images for the remaining apps (only Frame remining)
Y3drk Jun 15, 2026
1a1ec23
Add new benchmark result type --> not-applicable
Y3drk Jun 15, 2026
15fe9dc
Fix build error
Y3drk Jun 15, 2026
051b956
Apply AI agents' suggestions, pt.1 + build error fixes
Y3drk Jun 15, 2026
25b0ee7
Apply AI agents' suggestions, pt.2 + build error fixes 3
Y3drk Jun 15, 2026
61d82c7
Apply AI agents' suggestions, pt.3
Y3drk Jun 15, 2026
be94938
Resolve conflicts with main
Y3drk Jun 16, 2026
f601ca6
Apply 06/15/26 GitHub narrative suggestion
Y3drk Jun 16, 2026
bd71c1e
Fix surfaced vulnerabilities, pt.1
Y3drk Jun 16, 2026
07a1609
Apply AI agents' suggestions, pt.4
Y3drk Jun 16, 2026
ce5532a
Add new required mock functions to the unit tests
Y3drk Jun 16, 2026
3c12d79
Delete unused import
Y3drk Jun 16, 2026
1598ed3
Remove informative comments before the review
Y3drk Jun 18, 2026
b9e008b
Resolving conflicts with main, pt.2
Y3drk Jun 18, 2026
38f21b3
Fix audited dependency vulnerabilities
Y3drk Jun 18, 2026
d3895d2
Apply AI agents' suggestions, pt.5
Y3drk Jun 18, 2026
eccb9d2
Add exampleNotApplicable field to AcceptanceTest
Y3drk Jun 18, 2026
b91b41f
Apply the terminology improvements from the 06/18/26 GitHub review fe…
Y3drk Jun 18, 2026
be62cf9
Apply the requested overall app score display from the 06/18/26 GitHu…
Y3drk Jun 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,7 @@ export const BenchmarkResults = {
Pass: "passed",
PartialPass: "partially-passed",
Fail: "failed",
NotApplicable: "not-applicable",
} as const;

export type BenchmarkResult = (typeof BenchmarkResults)[keyof typeof BenchmarkResults];
Expand Down Expand Up @@ -444,10 +445,23 @@ export interface AcceptanceTestBenchmarkPartialPass
export interface AcceptanceTestBenchmarkFail
extends AcceptanceTestBenchmarkAbstract<typeof BenchmarkResults.Fail> {}

export type AcceptanceTestBenchmark =
/**
* Represents a benchmark of an {@link AcceptanceTest} on an {@link App} against a {@link BestPractice},
* that is not applicable to the acceptance test scenario.
* Most often, this is because the app doesn't use ENS at all,
* in places where it should.
Comment thread
Y3drk marked this conversation as resolved.
*/
export interface NotApplicableAcceptanceTestBenchmark
extends AcceptanceTestBenchmarkAbstract<typeof BenchmarkResults.NotApplicable> {}

export type ApplicableAcceptanceTestBenchmark =
| AcceptanceTestBenchmarkPass
| AcceptanceTestBenchmarkPartialPass
| AcceptanceTestBenchmarkFail;

export type AcceptanceTestBenchmark =
| ApplicableAcceptanceTestBenchmark
| NotApplicableAcceptanceTestBenchmark;
```

3. Add notes made during the benchmarking process in the form of a simple JSX element that is a part of the new item in the `benchmarks` record. For reference, see
Expand Down
16 changes: 15 additions & 1 deletion ensawards.org/data/acceptance-tests/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ export interface AcceptanceTest {
examplePartialPass?: AcceptanceTestBenchmarkPartialPass;
exampleFail?: AcceptanceTestBenchmarkFail;
}
// TODO: Decided that there is no point in adding an example for NotApplicable.
Comment thread
Y3drk marked this conversation as resolved.
Outdated

/**
* Represents the benchmark of an {@link AcceptanceTest} on an {@link App} against a {@link BestPractice}.
Expand Down Expand Up @@ -92,7 +93,20 @@ export interface AcceptanceTestBenchmarkPartialPass
export interface AcceptanceTestBenchmarkFail
extends AcceptanceTestBenchmarkAbstract<typeof BenchmarkResults.Fail> {}

export type AcceptanceTestBenchmark =
/**
* Represents a benchmark of an {@link AcceptanceTest} on an {@link App} against a {@link BestPractice},
* that is not applicable to the acceptance test scenario.
* Most often, this is because the app doesn't use ENS at all,
* in places where it should.
*/
export interface NotApplicableAcceptanceTestBenchmark
extends AcceptanceTestBenchmarkAbstract<typeof BenchmarkResults.NotApplicable> {}

export type ApplicableAcceptanceTestBenchmark =
Comment thread
Y3drk marked this conversation as resolved.
Outdated
| AcceptanceTestBenchmarkPass
| AcceptanceTestBenchmarkPartialPass
| AcceptanceTestBenchmarkFail;

export type AcceptanceTestBenchmark =
| ApplicableAcceptanceTestBenchmark
| NotApplicableAcceptanceTestBenchmark;
51 changes: 37 additions & 14 deletions ensawards.org/data/acceptance-tests/utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,25 +25,32 @@ describe("Acceptance test utils", () => {
},
);

it("Returns `BenchmarkResults.Fail` if all defined benchmarks are `BenchmarkResults.Fail`", () => {
const expectedResult = BenchmarkResults.Fail;
it(
"Returns `BenchmarkResults.Fail` if in all defined benchmarks there is at least one `BenchmarkResults.Fail`" +
" and all others are `BenchmarkResults.Fail` or `BenchmarkResults.NotApplicable`",
() => {
const expectedResult = BenchmarkResults.Fail;

const inputBenchmarks = {
"mock-acceptance-test-1": createMockAcceptanceTestBenchmark(BenchmarkResults.Fail),
"mock-acceptance-test-2": createMockAcceptanceTestBenchmark(BenchmarkResults.Fail),
"mock-acceptance-test-3": undefined,
// pending benchmarks should be ignored in this case of the generalization
} as const satisfies AcceptanceTestBenchmarks;
const inputBenchmarks = {
"mock-acceptance-test-1": createMockAcceptanceTestBenchmark(BenchmarkResults.Fail),
"mock-acceptance-test-2": createMockAcceptanceTestBenchmark(BenchmarkResults.Fail),
"mock-acceptance-test-3": createMockAcceptanceTestBenchmark(
BenchmarkResults.NotApplicable,
),
"mock-acceptance-test-4": undefined,
// pending benchmarks should be ignored in this case of the generalization
} as const satisfies AcceptanceTestBenchmarks;

expect(
generalizeAcceptanceTestBenchmarks(inputBenchmarks),
"generalizeAcceptanceTestBenchmarks should return `BenchmarkResults.Fail`",
).toEqual(expectedResult);
});
expect(
generalizeAcceptanceTestBenchmarks(inputBenchmarks),
"generalizeAcceptanceTestBenchmarks should return `BenchmarkResults.Fail`",
).toEqual(expectedResult);
},
);

it(
"Returns `BenchmarkResults.PartialPass` if at least one defined benchmark is `BenchmarkResults.Fail`" +
" and at least one defined benchmark is `BenchmarkResults.Pass`",
" and at least one defined benchmark is `BenchmarkResults.Pass` or `BenchmarkResults.PartialPass`",
() => {
const expectedResult = BenchmarkResults.PartialPass;

Expand Down Expand Up @@ -78,6 +85,22 @@ describe("Acceptance test utils", () => {
).toEqual(expectedResult);
});

it("Returns `BenchmarkResults.NotApplicable` if all defined benchmarks are `BenchmarkResults.NotApplicable`", () => {
const expectedResult = BenchmarkResults.NotApplicable;

const inputBenchmarks = {
"mock-acceptance-test-1": createMockAcceptanceTestBenchmark(BenchmarkResults.NotApplicable),
"mock-acceptance-test-2": createMockAcceptanceTestBenchmark(BenchmarkResults.NotApplicable),
"mock-acceptance-test-3": undefined,
// pending benchmarks should be ignored in this case of the generalization
} as const satisfies AcceptanceTestBenchmarks;

expect(
generalizeAcceptanceTestBenchmarks(inputBenchmarks),
"generalizeAcceptanceTestBenchmarks should return `BenchmarkResults.NotApplicable`",
).toEqual(expectedResult);
});

it("Returns `undefined` if all benchmarks are `undefined` (pending)", () => {
const expectedResult = undefined;

Expand Down
21 changes: 18 additions & 3 deletions ensawards.org/data/acceptance-tests/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,20 @@ export const getAcceptanceTestBenchmarksByApp = (
* {@link BenchmarkResults.Pass}
* - and all others are {@link BenchmarkResults.Pass} or {@link BenchmarkResults.PartialPass}
*
Comment thread
Y3drk marked this conversation as resolved.
* - Returns {@link BenchmarkResults.Fail} if all defined benchmarks
* are {@link BenchmarkResults.Fail},
* - Returns {@link BenchmarkResults.Fail} if:
* - in all defined benchmarks there is at least one
* {@link BenchmarkResults.Fail}
* - and all others are {@link BenchmarkResults.Fail} or {@link BenchmarkResults.NotApplicable}
*
Comment thread
Y3drk marked this conversation as resolved.
* - Returns {@link BenchmarkResults.PartialPass} if:
* - at least one defined benchmark is {@link BenchmarkResults.Fail}
* and at least one defined benchmark is
* {@link BenchmarkResults.Pass} or {@link BenchmarkResults.PartialPass},
* - or all defined benchmarks are {@link BenchmarkResults.PartialPass},
*
* - Returns {@link BenchmarkResults.NotApplicable} if:
* - all defined benchmarks are {@link BenchmarkResults.NotApplicable}
*
* - Returns `undefined` if all benchmarks are `undefined` (pending).
*/
export const generalizeAcceptanceTestBenchmarks = (
Expand All @@ -87,6 +92,14 @@ export const generalizeAcceptanceTestBenchmarks = (
return BenchmarkResults.PartialPass;
}
Comment thread
Y3drk marked this conversation as resolved.

const allDefinedBenchmarksNotApplicable = definedBenchmarkResults.every(
(result) => result === BenchmarkResults.NotApplicable,
);

if (allDefinedBenchmarksNotApplicable) {
return BenchmarkResults.NotApplicable;
}

// For now, we'll explicitly treat pass and partial pass equally
// (For cases where not all benchmarks are partial pass)
const allDefinedBenchmarksPass = definedBenchmarkResults.every(
Expand All @@ -97,8 +110,10 @@ export const generalizeAcceptanceTestBenchmarks = (
return BenchmarkResults.Pass;
}
Comment thread
Y3drk marked this conversation as resolved.

// For now, we'll explicitly treat fail and not applicable equally
// (For cases where not all benchmarks are not applicable)
const allDefinedBenchmarksFail = definedBenchmarkResults.every(
(result) => result === BenchmarkResults.Fail,
(result) => result === BenchmarkResults.Fail || result === BenchmarkResults.NotApplicable,
);

if (allDefinedBenchmarksFail) {
Expand Down
22 changes: 17 additions & 5 deletions ensawards.org/data/apps/binance-exchange/benchmarks/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,28 @@ 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";

// TODO: Here we can test how the layout looks
// when the explanation for the not applicable result is separated
// from the result description and joined with it.
// In my opinion the separation looks better but I'm open to using either of these.
Comment thread
Y3drk marked this conversation as resolved.
Outdated
const benchmarks: BestPracticeBenchmarks = {
"ensv2-ready-resolution": {
"correctly-resolve-ensv2-test-name-address": {
result: BenchmarkResults.Fail,
result: BenchmarkResults.NotApplicable,
Comment thread
coderabbitai[bot] marked this conversation as resolved.
contributions: [
{ from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T07:30:06Z") },
],
notes: (
<div className={cn(acceptanceTestDetailsContainerStyles, "w-full")}>
<p className="w-full">
ENSv2 ready resolution was tested using the search tool in the &quot;copy-trading&quot;
flow. The app either doesn't allow using ENS name as the trader identifier or fails to
resolve it, both of which we interpret as a failure.
flow. The app doesn't support the use of ENS names at all as the trader identifier.
<br />
<br />
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.
</p>
<img
alt="Binance exchange doesn't allow ENS name as trader in the copy-trading flow"
Expand All @@ -37,8 +46,11 @@ const benchmarks: BestPracticeBenchmarks = {
/>
<p className="w-full">
The ENSv2 ready resolution was also tested using the &quot;withdrawal&quot; flow. The
app doesn't allow using ENS name as the recipient identifier, which we interpret as a
failure.
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.
</p>
<img
alt="Binance exchange doesn't allow ENS name as recipient in the withdrawal flow"
Expand Down
10 changes: 8 additions & 2 deletions ensawards.org/data/apps/binance-wallet/benchmarks/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,21 @@ const benchmarks: BestPracticeBenchmarks = {
},
"ensv2-ready-resolution": {
"correctly-resolve-ensv2-test-name-address": {
result: BenchmarkResults.Fail,
result: BenchmarkResults.NotApplicable,
contributions: [
{ from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T07:33:06Z") },
],
notes: (
<div className={cn(acceptanceTestDetailsContainerStyles, "w-full")}>
<p className="w-full">
ENSv2 ready resolution was tested using the &quot;send&quot; flow. The wallet doesn't
allow using ENS name as the recipient identifier, which we interpret as a failure.
support the use of ENS names at all as the recipient identifier.
<br />
<br />
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.
</p>
<img
alt="Binance Wallet doesn't allow ENS name as recipient in the send flow"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,21 @@ import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-
const benchmarks: BestPracticeBenchmarks = {
"ensv2-ready-resolution": {
"correctly-resolve-ensv2-test-name-address": {
result: BenchmarkResults.Fail,
result: BenchmarkResults.NotApplicable,
contributions: [
{ from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T13:47:40Z") },
],
notes: (
<div className={cn(acceptanceTestDetailsContainerStyles, "w-full")}>
<p className="w-full">
ENSv2 ready resolution was tested using the &quot;withdrawal&quot; flow. The app doesn't
allow using ENS name as the recipient identifier, which we interpret as a failure.
support the use of ENS names at all as the recipient identifier.
<br />
<br />
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.
</p>
<img
alt="Crypto.com exchange doesn't allow ENS name as recipient in the withdrawal flow"
Expand Down
10 changes: 8 additions & 2 deletions ensawards.org/data/apps/kraken-exchange/benchmarks/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,21 @@ import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-
const benchmarks: BestPracticeBenchmarks = {
"ensv2-ready-resolution": {
"correctly-resolve-ensv2-test-name-address": {
result: BenchmarkResults.Fail,
result: BenchmarkResults.NotApplicable,
contributions: [
{ from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T10:47:44Z") },
],
notes: (
<div className={cn(acceptanceTestDetailsContainerStyles, "w-full")}>
<p className="w-full">
ENSv2 ready resolution was tested using the &quot;withdrawal&quot; flow. The app doesn't
allow using ENS name as the recipient identifier, which we interpret as a failure.
support the use of ENS names at all as the recipient identifier.
<br />
<br />
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.
</p>
<img
alt="Kraken exchange doesn't allow ENS name as recipient in the withdrawal flow"
Expand Down
10 changes: 8 additions & 2 deletions ensawards.org/data/apps/okx-exchange/benchmarks/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,21 @@ import correctlyResolveEnsv2TestNameAddressProofImage from "./correctly-resolve-
const benchmarks: BestPracticeBenchmarks = {
"ensv2-ready-resolution": {
"correctly-resolve-ensv2-test-name-address": {
result: BenchmarkResults.Fail,
result: BenchmarkResults.NotApplicable,
contributions: [
{ from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-11T11:42:14Z") },
],
notes: (
<div className={cn(acceptanceTestDetailsContainerStyles, "w-full")}>
<p className="w-full">
ENSv2 ready resolution was tested using the &quot;withdrawal&quot; flow. The app doesn't
allow using ENS name as the recipient identifier, which we interpret as a failure.
support the use of ENS names at all as the recipient identifier.
<br />
<br />
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.
</p>
<img
alt="OKX exchange doesn't allow ENS name as recipient in the withdrawal flow"
Expand Down
12 changes: 9 additions & 3 deletions ensawards.org/data/apps/readyx-wallet/benchmarks/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,21 @@ const benchmarks: BestPracticeBenchmarks = {
},
"ensv2-ready-resolution": {
"correctly-resolve-ensv2-test-name-address": {
result: BenchmarkResults.Fail,
result: BenchmarkResults.NotApplicable,
contributions: [
{ from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-08T16:18:00Z") },
],
notes: (
<div className={cn(acceptanceTestDetailsContainerStyles, "w-full")}>
<p className="w-full">
ENSv2 ready resolution was tested using the &quot;send&quot; flow. The app doesn't allow
using ENS name as the recipient identifier, which we interpret as a failure.
ENSv2 ready resolution was tested using the &quot;send&quot; flow. The app doesn't
support the use of ENS names at all as the recipient identifier.
<br />
<br />
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.
</p>
<img
alt="ReadyX doesn't allow ENS name as recipient in the send flow"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,21 @@ import correctlyResolveEnsv2TestNameAddressProofImage2 from "./correctly-resolve
const benchmarks: BestPracticeBenchmarks = {
"ensv2-ready-resolution": {
"correctly-resolve-ensv2-test-name-address": {
result: BenchmarkResults.Fail,
result: BenchmarkResults.NotApplicable,
contributions: [
{ from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-15T06:59:00Z") },
],
notes: (
<div className={cn(acceptanceTestDetailsContainerStyles, "w-full")}>
<p className="w-full">
ENSv2 ready resolution was tested using the &quot;send&quot; flow. The app doesn't allow
using ENS name as the recipient identifier, which we interpret as a failure.
ENSv2 ready resolution was tested using the &quot;send&quot; flow. The app doesn't
support the use of ENS names at all as the recipient identifier.
<br />
<br />
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.
</p>
<div className="flex flex-col justify-start items-center gap-5">
<img
Expand Down
Loading
Loading