+ 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.
+
+
+
+ ),
+ } 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.
+
+
+
+ ),
+ } 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
+
+ ).
+
+
+
+ ),
+ } 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.
+
+
+
+ ),
+ } 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;