diff --git a/ensawards.org/data/apps/bitunix-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/bitunix-exchange/benchmarks/index.tsx new file mode 100644 index 00000000..abfaed7d --- /dev/null +++ b/ensawards.org/data/apps/bitunix-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 BitunixExchange from "data/apps/bitunix-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(BitunixExchange, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/bitunix-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/bitunix-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..7e86cd86 Binary files /dev/null and b/ensawards.org/data/apps/bitunix-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/bitunix-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/bitunix-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..f1ae4073 --- /dev/null +++ b/ensawards.org/data/apps/bitunix-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.png"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:00:51Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "withdrawal" flow', + proof: { + image: at1Proof, + alt: "Bitunix Exchange doesn't allow ENS names as the recipient in the withdrawal flow", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:00:51Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:00:51Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:00:51Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:00:51Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:00:51Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:00:51Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:00:51Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/bitunix-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/bitunix-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..7a9fc08b Binary files /dev/null and b/ensawards.org/data/apps/bitunix-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/bitunix-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/bitunix-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..9bc22258 --- /dev/null +++ b/ensawards.org/data/apps/bitunix-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 at1ProofImage from "./at-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T10:59:49Z") }, + ], + 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. +

+ Bitunix 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/bitunix-exchange/icon.png b/ensawards.org/data/apps/bitunix-exchange/icon.png new file mode 100644 index 00000000..dfd6b44e Binary files /dev/null and b/ensawards.org/data/apps/bitunix-exchange/icon.png differ diff --git a/ensawards.org/data/apps/bitunix-exchange/icon.tsx b/ensawards.org/data/apps/bitunix-exchange/icon.tsx new file mode 100644 index 00000000..02773a3c --- /dev/null +++ b/ensawards.org/data/apps/bitunix-exchange/icon.tsx @@ -0,0 +1,19 @@ +import React from "react"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import icon from "./icon.png"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/bitunix-exchange/index.ts b/ensawards.org/data/apps/bitunix-exchange/index.ts new file mode 100644 index 00000000..9a83f3d2 --- /dev/null +++ b/ensawards.org/data/apps/bitunix-exchange/index.ts @@ -0,0 +1,28 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying apps + +import BitunixProject from "data/projects/bitunix"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import BitunixIcon from "./icon.tsx"; + +const BitunixExchange: App = { + id: "bitunix-exchange", + appSlug: "bitunix-exchange", + type: AppTypes.Exchange, + project: BitunixProject, + name: "Bitunix", + description: + "Cryptocurrency exchange centered on perpetual futures and spot trading, with copy trading and earn products for putting idle assets to work.", + socials: { + website: new URL("https://www.bitunix.com"), + twitter: new URL("https://x.com/BitunixOfficial"), + }, + icon: BitunixIcon, + // TODO: Add OG images +}; + +defineApp(BitunixExchange); + +export default BitunixExchange; diff --git a/ensawards.org/data/apps/ourbit-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/ourbit-exchange/benchmarks/index.tsx new file mode 100644 index 00000000..892e79db --- /dev/null +++ b/ensawards.org/data/apps/ourbit-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 OurbitExchange from "data/apps/ourbit-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(OurbitExchange, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/ourbit-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/ourbit-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..120e6d7d Binary files /dev/null and b/ensawards.org/data/apps/ourbit-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/ourbit-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/ourbit-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..447b5cdf --- /dev/null +++ b/ensawards.org/data/apps/ourbit-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.png"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "Address management" feature', + proof: { + image: at1Proof, + alt: "Ourbit Exchange doesn't allow ENS names as the recipient in the Address management feature", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/ourbit-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/ourbit-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..4a890862 Binary files /dev/null and b/ensawards.org/data/apps/ourbit-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/ourbit-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/ourbit-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..97ab8289 --- /dev/null +++ b/ensawards.org/data/apps/ourbit-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.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:05:52Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "Address management" feature. 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. +

+ Ourbit exchange doesn't allow ENS name as recipient in the Address management feature +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/ourbit-exchange/icon.tsx b/ensawards.org/data/apps/ourbit-exchange/icon.tsx new file mode 100644 index 00000000..2eae2fc6 --- /dev/null +++ b/ensawards.org/data/apps/ourbit-exchange/icon.tsx @@ -0,0 +1,27 @@ +import React from "react"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/ourbit-exchange/index.ts b/ensawards.org/data/apps/ourbit-exchange/index.ts new file mode 100644 index 00000000..7e9bf503 --- /dev/null +++ b/ensawards.org/data/apps/ourbit-exchange/index.ts @@ -0,0 +1,28 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying apps + +import OurbitProject from "data/projects/ourbit"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import OurbitIcon from "./icon.tsx"; + +const OurbitExchange: App = { + id: "ourbit-exchange", + appSlug: "ourbit-exchange", + type: AppTypes.Exchange, + project: OurbitProject, + name: "Ourbit", + description: + "Cryptocurrency exchange offering spot and futures trading, copy trading, and earn products for growing a broad range of digital assets.", + socials: { + website: new URL("https://www.ourbit.com"), + twitter: new URL("https://x.com/ourbit"), + }, + icon: OurbitIcon, + // TODO: Add OG images +}; + +defineApp(OurbitExchange); + +export default OurbitExchange; diff --git a/ensawards.org/data/apps/whitebit-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/whitebit-exchange/benchmarks/index.tsx new file mode 100644 index 00000000..a363d81e --- /dev/null +++ b/ensawards.org/data/apps/whitebit-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 WhiteBITExchange from "data/apps/whitebit-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(WhiteBITExchange, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..22b280f0 Binary files /dev/null and b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..b747e8dc Binary files /dev/null and b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..622c041b Binary files /dev/null and b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-4.png b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-4.png new file mode 100644 index 00000000..b046310f Binary files /dev/null and b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-4.png differ diff --git a/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-5.png b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-5.png new file mode 100644 index 00000000..e4d7da5f Binary files /dev/null and b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/at-5.png differ diff --git a/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..ee98c6f4 --- /dev/null +++ b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,105 @@ +// 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, +} 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 "withdraw" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "WhiteBIT Exchange correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "WhiteBIT Exchange correctly resolves the address for Ξthereum.eth", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildFailNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "WhiteBIT Exchange fails to resolve the address for jesse.base.eth", + }, + extra: 'The app showed the message "Can\'t Find ENS Domain".', + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildFailNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "WhiteBIT Exchange fails to resolve the address for dperri.com", + }, + extra: 'The app showed the message "The address is invalid".', + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "WhiteBIT Exchange fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: 'The app showed the message "The address is invalid".', + }), + }, + "at06-resolve-bitcoin-address": undefined, + "at07-resolve-solana-address": undefined, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T14:10:50Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..829a794e Binary files /dev/null and b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..8940e5fc --- /dev/null +++ b/ensawards.org/data/apps/whitebit-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,45 @@ +// 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, + bestPracticeTechnicalDetailsCodeStyles, +} from "data/ens-best-practices/styles"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import at1ProofImage from "./at-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T12:17:00Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "withdraw" flow. The resolved + address is NOT the expected Ethereum Mainnet address ( + + 0x2222222222222222222222222222222222222222 + + ). +

+ WhiteBIT 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/whitebit-exchange/icon.tsx b/ensawards.org/data/apps/whitebit-exchange/icon.tsx new file mode 100644 index 00000000..3331278b --- /dev/null +++ b/ensawards.org/data/apps/whitebit-exchange/icon.tsx @@ -0,0 +1,22 @@ +import React from "react"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/whitebit-exchange/index.ts b/ensawards.org/data/apps/whitebit-exchange/index.ts new file mode 100644 index 00000000..45f2d03f --- /dev/null +++ b/ensawards.org/data/apps/whitebit-exchange/index.ts @@ -0,0 +1,28 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying apps + +import WhiteBITProject from "data/projects/whitebit"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import WhiteBITIcon from "./icon.tsx"; + +const WhiteBITExchange: App = { + id: "whitebit-exchange", + appSlug: "whitebit-exchange", + type: AppTypes.Exchange, + project: WhiteBITProject, + name: "WhiteBIT", + description: + "Cryptocurrency exchange for spot and futures trading, with staking and earn products for putting a broad range of digital assets to work.", + socials: { + website: new URL("https://whitebit.com"), + twitter: new URL("https://x.com/WhiteBit"), + }, + icon: WhiteBITIcon, + // TODO: Add OG images +}; + +defineApp(WhiteBITExchange); + +export default WhiteBITExchange; diff --git a/ensawards.org/data/apps/xtcom-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/xtcom-exchange/benchmarks/index.tsx new file mode 100644 index 00000000..b8ea911b --- /dev/null +++ b/ensawards.org/data/apps/xtcom-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 XTcomExchange from "data/apps/xtcom-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(XTcomExchange, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/xtcom-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/xtcom-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..cc963277 Binary files /dev/null and b/ensawards.org/data/apps/xtcom-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/xtcom-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/xtcom-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..7f12c924 --- /dev/null +++ b/ensawards.org/data/apps/xtcom-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.png"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:55:58Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "withdraw" flow', + proof: { + image: at1Proof, + alt: "XT.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-07-01T11:55:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:55:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:55:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:55:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:55:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:55:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:55:58Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/xtcom-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/xtcom-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..d0842edd Binary files /dev/null and b/ensawards.org/data/apps/xtcom-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/xtcom-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/xtcom-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..1f0974a4 --- /dev/null +++ b/ensawards.org/data/apps/xtcom-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 at1ProofImage from "./at-1.png"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T11:54:54Z") }, + ], + 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. +

+ XT.COM exchange doesn't allow ENS name as recipient in the withdraw flow +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/xtcom-exchange/icon.jpeg b/ensawards.org/data/apps/xtcom-exchange/icon.jpeg new file mode 100644 index 00000000..b67562a7 Binary files /dev/null and b/ensawards.org/data/apps/xtcom-exchange/icon.jpeg differ diff --git a/ensawards.org/data/apps/xtcom-exchange/icon.tsx b/ensawards.org/data/apps/xtcom-exchange/icon.tsx new file mode 100644 index 00000000..e607a396 --- /dev/null +++ b/ensawards.org/data/apps/xtcom-exchange/icon.tsx @@ -0,0 +1,19 @@ +import React from "react"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import icon from "./icon.jpeg"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/xtcom-exchange/index.ts b/ensawards.org/data/apps/xtcom-exchange/index.ts new file mode 100644 index 00000000..0fb67888 --- /dev/null +++ b/ensawards.org/data/apps/xtcom-exchange/index.ts @@ -0,0 +1,28 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying apps + +import XTcomProject from "data/projects/xtcom"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import XTcomIcon from "./icon.tsx"; + +const XTcomExchange: App = { + id: "xtcom-exchange", + appSlug: "xtcom-exchange", + type: AppTypes.Exchange, + project: XTcomProject, + name: "XT.COM", + description: + "Cryptocurrency exchange offering spot and futures trading across a broad token catalog, with copy trading and earn products for growing digital asset holdings.", + socials: { + website: new URL("https://www.xt.com"), + twitter: new URL("https://x.com/XTexchange"), + }, + icon: XTcomIcon, + // TODO: Add OG images +}; + +defineApp(XTcomExchange); + +export default XTcomExchange; diff --git a/ensawards.org/data/projects/bitunix/icon.png b/ensawards.org/data/projects/bitunix/icon.png new file mode 100644 index 00000000..dfd6b44e Binary files /dev/null and b/ensawards.org/data/projects/bitunix/icon.png differ diff --git a/ensawards.org/data/projects/bitunix/icon.tsx b/ensawards.org/data/projects/bitunix/icon.tsx new file mode 100644 index 00000000..02773a3c --- /dev/null +++ b/ensawards.org/data/projects/bitunix/icon.tsx @@ -0,0 +1,19 @@ +import React from "react"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import icon from "./icon.png"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + +); + +export default Icon; diff --git a/ensawards.org/data/projects/bitunix/index.ts b/ensawards.org/data/projects/bitunix/index.ts new file mode 100644 index 00000000..45f51bed --- /dev/null +++ b/ensawards.org/data/projects/bitunix/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 BitunixIcon from "./icon.tsx"; + +const BitunixProject: Project = { + id: ProjectIds.Bitunix, + name: "Bitunix", + description: + "Global cryptocurrency exchange focused on perpetual futures and spot trading, with copy trading and a range of earn products for digital assets.", + icon: BitunixIcon, + socials: { + website: new URL("https://www.bitunix.com"), + twitter: new URL("https://x.com/BitunixOfficial"), + }, +}; + +defineProject(BitunixProject); + +export default BitunixProject; diff --git a/ensawards.org/data/projects/ourbit/icon.tsx b/ensawards.org/data/projects/ourbit/icon.tsx new file mode 100644 index 00000000..2eae2fc6 --- /dev/null +++ b/ensawards.org/data/projects/ourbit/icon.tsx @@ -0,0 +1,27 @@ +import React from "react"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + + + +); + +export default Icon; diff --git a/ensawards.org/data/projects/ourbit/index.ts b/ensawards.org/data/projects/ourbit/index.ts new file mode 100644 index 00000000..4e13695c --- /dev/null +++ b/ensawards.org/data/projects/ourbit/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 OurbitIcon from "./icon.tsx"; + +const OurbitProject: Project = { + id: ProjectIds.Ourbit, + name: "Ourbit", + description: + "Cryptocurrency exchange offering spot and futures trading, copy trading, and earn products across a broad selection of digital assets.", + icon: OurbitIcon, + socials: { + website: new URL("https://www.ourbit.com"), + twitter: new URL("https://x.com/ourbit"), + }, +}; + +defineProject(OurbitProject); + +export default OurbitProject; diff --git a/ensawards.org/data/projects/types.ts b/ensawards.org/data/projects/types.ts index 0fceb8ac..cde40b6f 100644 --- a/ensawards.org/data/projects/types.ts +++ b/ensawards.org/data/projects/types.ts @@ -54,6 +54,10 @@ export const ProjectIds = { BitMart: "project-bitmart", CoinW: "project-coinw", WEEX: "project-weex", + Bitunix: "project-bitunix", + XTcom: "project-xtcom", + WhiteBIT: "project-whitebit", + Ourbit: "project-ourbit", } as const; /** diff --git a/ensawards.org/data/projects/whitebit/icon.tsx b/ensawards.org/data/projects/whitebit/icon.tsx new file mode 100644 index 00000000..3331278b --- /dev/null +++ b/ensawards.org/data/projects/whitebit/icon.tsx @@ -0,0 +1,22 @@ +import React from "react"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + +); + +export default Icon; diff --git a/ensawards.org/data/projects/whitebit/index.ts b/ensawards.org/data/projects/whitebit/index.ts new file mode 100644 index 00000000..1ffe43f6 --- /dev/null +++ b/ensawards.org/data/projects/whitebit/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 WhiteBITIcon from "./icon.tsx"; + +const WhiteBITProject: Project = { + id: ProjectIds.WhiteBIT, + name: "WhiteBIT", + description: + "European cryptocurrency exchange offering spot and futures trading, staking, and earn products across a wide range of digital assets.", + icon: WhiteBITIcon, + socials: { + website: new URL("https://whitebit.com"), + twitter: new URL("https://x.com/WhiteBit"), + }, +}; + +defineProject(WhiteBITProject); + +export default WhiteBITProject; diff --git a/ensawards.org/data/projects/xtcom/icon.jpeg b/ensawards.org/data/projects/xtcom/icon.jpeg new file mode 100644 index 00000000..b67562a7 Binary files /dev/null and b/ensawards.org/data/projects/xtcom/icon.jpeg differ diff --git a/ensawards.org/data/projects/xtcom/icon.tsx b/ensawards.org/data/projects/xtcom/icon.tsx new file mode 100644 index 00000000..e607a396 --- /dev/null +++ b/ensawards.org/data/projects/xtcom/icon.tsx @@ -0,0 +1,19 @@ +import React from "react"; + +import { cn } from "@/utils/tailwindClassConcatenation"; + +import icon from "./icon.jpeg"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + +); + +export default Icon; diff --git a/ensawards.org/data/projects/xtcom/index.ts b/ensawards.org/data/projects/xtcom/index.ts new file mode 100644 index 00000000..45864145 --- /dev/null +++ b/ensawards.org/data/projects/xtcom/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 XTcomIcon from "./icon.tsx"; + +const XTcomProject: Project = { + id: ProjectIds.XTcom, + name: "XT.COM", + description: + "Global cryptocurrency exchange offering spot and futures trading across a large selection of assets, with copy trading and earn products.", + icon: XTcomIcon, + socials: { + website: new URL("https://www.xt.com"), + twitter: new URL("https://x.com/XTexchange"), + }, +}; + +defineProject(XTcomProject); + +export default XTcomProject;