diff --git a/ensawards.org/data/apps/bitmart-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/bitmart-exchange/benchmarks/index.tsx new file mode 100644 index 00000000..00ed4c64 --- /dev/null +++ b/ensawards.org/data/apps/bitmart-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 BitMartExchange from "data/apps/bitmart-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(BitMartExchange, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/bitmart-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/bitmart-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..e17951d9 Binary files /dev/null and b/ensawards.org/data/apps/bitmart-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/bitmart-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/bitmart-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..b29adac0 --- /dev/null +++ b/ensawards.org/data/apps/bitmart-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-06-30T14:03:27Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "withdraw" flow', + proof: { + image: at1Proof, + alt: "BitMart Exchange doesn't allow ENS names as the recipient in the withdraw flow", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T14:03:27Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T14:03:27Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T14:03:27Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T14:03:27Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T14:03:27Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T14:03:27Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T14:03:27Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/bitmart-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/bitmart-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..b01c3ac1 Binary files /dev/null and b/ensawards.org/data/apps/bitmart-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/bitmart-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/bitmart-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..ad5699c0 --- /dev/null +++ b/ensawards.org/data/apps/bitmart-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-06-30T14:01:09Z") }, + ], + 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. +

+ BitMart 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/bitmart-exchange/icon.png b/ensawards.org/data/apps/bitmart-exchange/icon.png new file mode 100644 index 00000000..cf5756b7 Binary files /dev/null and b/ensawards.org/data/apps/bitmart-exchange/icon.png differ diff --git a/ensawards.org/data/apps/bitmart-exchange/icon.tsx b/ensawards.org/data/apps/bitmart-exchange/icon.tsx new file mode 100644 index 00000000..d6eb0ea4 --- /dev/null +++ b/ensawards.org/data/apps/bitmart-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/bitmart-exchange/index.ts b/ensawards.org/data/apps/bitmart-exchange/index.ts new file mode 100644 index 00000000..f588576e --- /dev/null +++ b/ensawards.org/data/apps/bitmart-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 BitMartProject from "data/projects/bitmart"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import BitMartIcon from "./icon.tsx"; + +const BitMartExchange: App = { + id: "bitmart-exchange", + appSlug: "bitmart-exchange", + type: AppTypes.Exchange, + project: BitMartProject, + name: "BitMart", + description: + "Cryptocurrency exchange for spot and futures trading across a broad token catalog, with savings and staking options for earning on idle assets.", + socials: { + website: new URL("https://www.bitmart.com"), + twitter: new URL("https://x.com/BitMartExchange"), + }, + icon: BitMartIcon, + // TODO: Add OG images +}; + +defineApp(BitMartExchange); + +export default BitMartExchange; diff --git a/ensawards.org/data/apps/coinw-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/coinw-exchange/benchmarks/index.tsx new file mode 100644 index 00000000..301820c9 --- /dev/null +++ b/ensawards.org/data/apps/coinw-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 CoinWExchange from "data/apps/coinw-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(CoinWExchange, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/coinw-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/coinw-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..c7cca062 Binary files /dev/null and b/ensawards.org/data/apps/coinw-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/coinw-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/coinw-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..14b36339 --- /dev/null +++ b/ensawards.org/data/apps/coinw-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-01T08:01:28Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "Add address" feature', + proof: { + image: at1Proof, + alt: "CoinW Exchange doesn't allow ENS names as the recipient identifier in the Add address feature", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T08:01:28Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T08:01:28Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T08:01:28Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T08:01:28Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T08:01:28Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T08:01:28Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T08:01:28Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/coinw-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/coinw-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..6be53399 Binary files /dev/null and b/ensawards.org/data/apps/coinw-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/coinw-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/coinw-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..c32cb2f3 --- /dev/null +++ b/ensawards.org/data/apps/coinw-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-01T07:58:39Z") }, + ], + notes: ( +
+

+ ENSv2 ready resolution was tested using the "Add address" 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. +

+ CoinW exchange doesn't allow ENS name as recipient in the Add address feature +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/coinw-exchange/icon.tsx b/ensawards.org/data/apps/coinw-exchange/icon.tsx new file mode 100644 index 00000000..606b1c37 --- /dev/null +++ b/ensawards.org/data/apps/coinw-exchange/icon.tsx @@ -0,0 +1,24 @@ +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/coinw-exchange/index.ts b/ensawards.org/data/apps/coinw-exchange/index.ts new file mode 100644 index 00000000..98594de5 --- /dev/null +++ b/ensawards.org/data/apps/coinw-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 CoinWProject from "data/projects/coinw"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import CoinWIcon from "./icon.tsx"; + +const CoinWExchange: App = { + id: "coinw-exchange", + appSlug: "coinw-exchange", + type: AppTypes.Exchange, + project: CoinWProject, + name: "CoinW", + description: + "Cryptocurrency exchange offering spot and perpetual futures trading, copy trading, and earn products for managing digital assets.", + socials: { + website: new URL("https://www.coinw.com"), + twitter: new URL("https://x.com/CoinWOfficial"), + }, + icon: CoinWIcon, + // TODO: Add OG images +}; + +defineApp(CoinWExchange); + +export default CoinWExchange; diff --git a/ensawards.org/data/apps/lbank-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/lbank-exchange/benchmarks/index.tsx new file mode 100644 index 00000000..0d4a792c --- /dev/null +++ b/ensawards.org/data/apps/lbank-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 LBankExchange from "data/apps/lbank-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(LBankExchange, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/lbank-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/lbank-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..e79b3fc4 Binary files /dev/null and b/ensawards.org/data/apps/lbank-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/lbank-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/lbank-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..cf4bbbc5 --- /dev/null +++ b/ensawards.org/data/apps/lbank-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-06-30T13:15:22Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "withdrawal" flow', + proof: { + image: at1Proof, + alt: "LBank 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-06-30T13:15:22Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T13:15:22Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T13:15:22Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T13:15:22Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T13:15:22Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T13:15:22Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T13:15:22Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/lbank-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/lbank-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..3c426b0b Binary files /dev/null and b/ensawards.org/data/apps/lbank-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/lbank-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/lbank-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..7d87da70 --- /dev/null +++ b/ensawards.org/data/apps/lbank-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-06-30T13:14:10Z") }, + ], + 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. +

+ LBank 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/lbank-exchange/icon.tsx b/ensawards.org/data/apps/lbank-exchange/icon.tsx new file mode 100644 index 00000000..8a30e93d --- /dev/null +++ b/ensawards.org/data/apps/lbank-exchange/icon.tsx @@ -0,0 +1,34 @@ +import React from "react"; + +const Icon = ({ className, ...props }: React.SVGProps) => { + const reactId = React.useId(); + const id = (name: string) => `${reactId}-${name}`; + const url = (name: string) => `url(#${id(name)})`; + + return ( + + + + + + + + + + + + + + ); +}; + +export default Icon; diff --git a/ensawards.org/data/apps/lbank-exchange/index.ts b/ensawards.org/data/apps/lbank-exchange/index.ts new file mode 100644 index 00000000..27bdf025 --- /dev/null +++ b/ensawards.org/data/apps/lbank-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 LBankProject from "data/projects/lbank"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import LBankIcon from "./icon.tsx"; + +const LBankExchange: App = { + id: "lbank-exchange", + appSlug: "lbank-exchange", + type: AppTypes.Exchange, + project: LBankProject, + name: "LBank", + description: + "Cryptocurrency exchange offering spot and futures trading, with early listings of emerging tokens and staking-based earn products.", + socials: { + website: new URL("https://www.lbank.com"), + twitter: new URL("https://x.com/LBank_Exchange"), + }, + icon: LBankIcon, + // TODO: Add OG images +}; + +defineApp(LBankExchange); + +export default LBankExchange; diff --git a/ensawards.org/data/apps/mexc-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/mexc-exchange/benchmarks/index.tsx new file mode 100644 index 00000000..9aae02fe --- /dev/null +++ b/ensawards.org/data/apps/mexc-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 MEXCExchange from "data/apps/mexc-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(MEXCExchange, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/mexc-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/mexc-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..70a79159 Binary files /dev/null and b/ensawards.org/data/apps/mexc-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/mexc-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/mexc-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..012233a4 --- /dev/null +++ b/ensawards.org/data/apps/mexc-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-06-30T12:20:52Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "withdrawal" flow', + proof: { + image: at1Proof, + alt: "MEXC 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-06-30T12:20:52Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T12:20:52Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T12:20:52Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T12:20:52Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T12:20:52Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T12:20:52Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T12:20:52Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/mexc-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/mexc-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..f0cf57da Binary files /dev/null and b/ensawards.org/data/apps/mexc-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/mexc-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/mexc-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..05217e99 --- /dev/null +++ b/ensawards.org/data/apps/mexc-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-06-30T12:19:31Z") }, + ], + 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. +

+ MEXC 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/mexc-exchange/icon.tsx b/ensawards.org/data/apps/mexc-exchange/icon.tsx new file mode 100644 index 00000000..efd82460 --- /dev/null +++ b/ensawards.org/data/apps/mexc-exchange/icon.tsx @@ -0,0 +1,22 @@ +import React from "react"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/mexc-exchange/index.ts b/ensawards.org/data/apps/mexc-exchange/index.ts new file mode 100644 index 00000000..cfb9fa52 --- /dev/null +++ b/ensawards.org/data/apps/mexc-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 MEXCProject from "data/projects/mexc"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import MEXCIcon from "./icon.tsx"; + +const MEXCExchange: App = { + id: "mexc-exchange", + appSlug: "mexc-exchange", + type: AppTypes.Exchange, + project: MEXCProject, + name: "MEXC", + description: + "Cryptocurrency exchange offering spot, margin, and futures trading with an extensive catalog of newly listed tokens and copy trading.", + socials: { + website: new URL("https://www.mexc.com"), + twitter: new URL("https://x.com/MEXC"), + }, + icon: MEXCIcon, + // TODO: Add OG images +}; + +defineApp(MEXCExchange); + +export default MEXCExchange; diff --git a/ensawards.org/data/apps/toobit-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/toobit-exchange/benchmarks/index.tsx new file mode 100644 index 00000000..b3bc52a8 --- /dev/null +++ b/ensawards.org/data/apps/toobit-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 ToobitExchange from "data/apps/toobit-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(ToobitExchange, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/toobit-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/toobit-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..81467f49 Binary files /dev/null and b/ensawards.org/data/apps/toobit-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/toobit-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/toobit-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..0e25ac03 --- /dev/null +++ b/ensawards.org/data/apps/toobit-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-06-30T11:31:15Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "withdraw" flow', + proof: { + image: at1Proof, + alt: "Toobit Exchange doesn't allow ENS names as the recipient in the withdraw flow", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T11:31:15Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T11:31:15Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T11:31:15Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T11:31:15Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T11:31:15Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T11:31:15Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-06-30T11:31:15Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/toobit-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/toobit-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..a50f5b84 Binary files /dev/null and b/ensawards.org/data/apps/toobit-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/toobit-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/toobit-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..f00e6e90 --- /dev/null +++ b/ensawards.org/data/apps/toobit-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-06-30T11:27:39Z") }, + ], + notes: ( +
+

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

+ Toobit 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/toobit-exchange/icon.png b/ensawards.org/data/apps/toobit-exchange/icon.png new file mode 100644 index 00000000..3c6f4d5f Binary files /dev/null and b/ensawards.org/data/apps/toobit-exchange/icon.png differ diff --git a/ensawards.org/data/apps/toobit-exchange/icon.tsx b/ensawards.org/data/apps/toobit-exchange/icon.tsx new file mode 100644 index 00000000..1e233442 --- /dev/null +++ b/ensawards.org/data/apps/toobit-exchange/icon.tsx @@ -0,0 +1,17 @@ +import React from "react"; + +import icon from "./icon.png"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/toobit-exchange/index.ts b/ensawards.org/data/apps/toobit-exchange/index.ts new file mode 100644 index 00000000..2f39a95e --- /dev/null +++ b/ensawards.org/data/apps/toobit-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 ToobitProject from "data/projects/toobit"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import ToobitIcon from "./icon.tsx"; + +const ToobitExchange: App = { + id: "toobit-exchange", + appSlug: "toobit-exchange", + type: AppTypes.Exchange, + project: ToobitProject, + name: "Toobit", + description: + "Cryptocurrency exchange offering spot and perpetual futures trading, copy trading, and earn products for managing digital assets.", + socials: { + website: new URL("https://www.toobit.com"), + twitter: new URL("https://x.com/Toobit_official"), + }, + icon: ToobitIcon, + // TODO: Add OG images +}; + +defineApp(ToobitExchange); + +export default ToobitExchange; diff --git a/ensawards.org/data/apps/weex-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/weex-exchange/benchmarks/index.tsx new file mode 100644 index 00000000..d5896f22 --- /dev/null +++ b/ensawards.org/data/apps/weex-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 WEEXExchange from "data/apps/weex-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(WEEXExchange, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/weex-exchange/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/weex-exchange/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..a1984057 Binary files /dev/null and b/ensawards.org/data/apps/weex-exchange/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/weex-exchange/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/weex-exchange/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..b14c4654 --- /dev/null +++ b/ensawards.org/data/apps/weex-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-01T09:35:08Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "withdrawal" flow', + proof: { + image: at1Proof, + alt: "WEEX 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-01T09:35:08Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T09:35:08Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T09:35:08Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T09:35:08Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T09:35:08Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T09:35:08Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-01T09:35:08Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/weex-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/weex-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..83418ce8 Binary files /dev/null and b/ensawards.org/data/apps/weex-exchange/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/weex-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/weex-exchange/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..e6f4e2d8 --- /dev/null +++ b/ensawards.org/data/apps/weex-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-01T09:33:01Z") }, + ], + 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. +

+ WEEX 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/weex-exchange/icon.tsx b/ensawards.org/data/apps/weex-exchange/icon.tsx new file mode 100644 index 00000000..2ce39b9c --- /dev/null +++ b/ensawards.org/data/apps/weex-exchange/icon.tsx @@ -0,0 +1,22 @@ +import React from "react"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/weex-exchange/index.ts b/ensawards.org/data/apps/weex-exchange/index.ts new file mode 100644 index 00000000..c4442712 --- /dev/null +++ b/ensawards.org/data/apps/weex-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 WEEXProject from "data/projects/weex"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import WEEXIcon from "./icon.tsx"; + +const WEEXExchange: App = { + id: "weex-exchange", + appSlug: "weex-exchange", + type: AppTypes.Exchange, + project: WEEXProject, + name: "WEEX", + description: + "Cryptocurrency exchange centered on perpetual futures and spot trading, with copy trading and earn products for growing digital asset holdings.", + socials: { + website: new URL("https://www.weex.com"), + twitter: new URL("https://x.com/WEEX_Official"), + }, + icon: WEEXIcon, + // TODO: Add OG images +}; + +defineApp(WEEXExchange); + +export default WEEXExchange; diff --git a/ensawards.org/data/projects/bitmart/icon.png b/ensawards.org/data/projects/bitmart/icon.png new file mode 100644 index 00000000..cf5756b7 Binary files /dev/null and b/ensawards.org/data/projects/bitmart/icon.png differ diff --git a/ensawards.org/data/projects/bitmart/icon.tsx b/ensawards.org/data/projects/bitmart/icon.tsx new file mode 100644 index 00000000..d6eb0ea4 --- /dev/null +++ b/ensawards.org/data/projects/bitmart/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/bitmart/index.ts b/ensawards.org/data/projects/bitmart/index.ts new file mode 100644 index 00000000..74eb666c --- /dev/null +++ b/ensawards.org/data/projects/bitmart/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 BitMartIcon from "./icon.tsx"; + +const BitMartProject: Project = { + id: ProjectIds.BitMart, + name: "BitMart", + description: + "Global cryptocurrency exchange offering spot and futures trading across a wide range of assets, with staking, savings, and other earn products.", + icon: BitMartIcon, + socials: { + website: new URL("https://www.bitmart.com"), + twitter: new URL("https://x.com/BitMartExchange"), + }, +}; + +defineProject(BitMartProject); + +export default BitMartProject; diff --git a/ensawards.org/data/projects/coinw/icon.tsx b/ensawards.org/data/projects/coinw/icon.tsx new file mode 100644 index 00000000..606b1c37 --- /dev/null +++ b/ensawards.org/data/projects/coinw/icon.tsx @@ -0,0 +1,24 @@ +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/coinw/index.ts b/ensawards.org/data/projects/coinw/index.ts new file mode 100644 index 00000000..3d2b73a9 --- /dev/null +++ b/ensawards.org/data/projects/coinw/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 CoinWIcon from "./icon.tsx"; + +const CoinWProject: Project = { + id: ProjectIds.CoinW, + name: "CoinW", + description: + "Global cryptocurrency exchange offering spot and futures trading, copy trading, and earn products across a wide selection of digital assets.", + icon: CoinWIcon, + socials: { + website: new URL("https://www.coinw.com"), + twitter: new URL("https://x.com/CoinWOfficial"), + }, +}; + +defineProject(CoinWProject); + +export default CoinWProject; diff --git a/ensawards.org/data/projects/lbank/icon.tsx b/ensawards.org/data/projects/lbank/icon.tsx new file mode 100644 index 00000000..8a30e93d --- /dev/null +++ b/ensawards.org/data/projects/lbank/icon.tsx @@ -0,0 +1,34 @@ +import React from "react"; + +const Icon = ({ className, ...props }: React.SVGProps) => { + const reactId = React.useId(); + const id = (name: string) => `${reactId}-${name}`; + const url = (name: string) => `url(#${id(name)})`; + + return ( + + + + + + + + + + + + + + ); +}; + +export default Icon; diff --git a/ensawards.org/data/projects/lbank/index.ts b/ensawards.org/data/projects/lbank/index.ts new file mode 100644 index 00000000..45b49456 --- /dev/null +++ b/ensawards.org/data/projects/lbank/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 LBankIcon from "./icon.tsx"; + +const LBankProject: Project = { + id: ProjectIds.LBank, + name: "LBank", + description: + "Global cryptocurrency exchange offering spot and futures trading, early access to emerging tokens, and a range of earn and staking products.", + icon: LBankIcon, + socials: { + website: new URL("https://www.lbank.com"), + twitter: new URL("https://x.com/LBank_Exchange"), + }, +}; + +defineProject(LBankProject); + +export default LBankProject; diff --git a/ensawards.org/data/projects/mexc/icon.tsx b/ensawards.org/data/projects/mexc/icon.tsx new file mode 100644 index 00000000..efd82460 --- /dev/null +++ b/ensawards.org/data/projects/mexc/icon.tsx @@ -0,0 +1,22 @@ +import React from "react"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + +); + +export default Icon; diff --git a/ensawards.org/data/projects/mexc/index.ts b/ensawards.org/data/projects/mexc/index.ts new file mode 100644 index 00000000..d3fc44ab --- /dev/null +++ b/ensawards.org/data/projects/mexc/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 MEXCIcon from "./icon.tsx"; + +const MEXCProject: Project = { + id: ProjectIds.MEXC, + name: "MEXC", + description: + "Global cryptocurrency exchange known for fast listings of new tokens, offering spot, margin, and futures trading alongside copy trading and earn products.", + icon: MEXCIcon, + socials: { + website: new URL("https://www.mexc.com"), + twitter: new URL("https://x.com/MEXC"), + }, +}; + +defineProject(MEXCProject); + +export default MEXCProject; diff --git a/ensawards.org/data/projects/toobit/icon.png b/ensawards.org/data/projects/toobit/icon.png new file mode 100644 index 00000000..3c6f4d5f Binary files /dev/null and b/ensawards.org/data/projects/toobit/icon.png differ diff --git a/ensawards.org/data/projects/toobit/icon.tsx b/ensawards.org/data/projects/toobit/icon.tsx new file mode 100644 index 00000000..1e233442 --- /dev/null +++ b/ensawards.org/data/projects/toobit/icon.tsx @@ -0,0 +1,17 @@ +import React from "react"; + +import icon from "./icon.png"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + +); + +export default Icon; diff --git a/ensawards.org/data/projects/toobit/index.ts b/ensawards.org/data/projects/toobit/index.ts new file mode 100644 index 00000000..69660bf3 --- /dev/null +++ b/ensawards.org/data/projects/toobit/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 ToobitIcon from "./icon.tsx"; + +const ToobitProject: Project = { + id: ProjectIds.Toobit, + name: "Toobit", + description: + "Cryptocurrency exchange for spot and futures trading, buying, and managing digital assets, with copy trading and a range of earn products.", + icon: ToobitIcon, + socials: { + website: new URL("https://www.toobit.com"), + twitter: new URL("https://x.com/Toobit_official"), + }, +}; + +defineProject(ToobitProject); + +export default ToobitProject; diff --git a/ensawards.org/data/projects/types.ts b/ensawards.org/data/projects/types.ts index da95d946..0fceb8ac 100644 --- a/ensawards.org/data/projects/types.ts +++ b/ensawards.org/data/projects/types.ts @@ -48,6 +48,12 @@ export const ProjectIds = { BingX: "project-bingx", Gate: "project-gate", Bitfinex: "project-bitfinex", + Toobit: "project-toobit", + MEXC: "project-mexc", + LBank: "project-lbank", + BitMart: "project-bitmart", + CoinW: "project-coinw", + WEEX: "project-weex", } as const; /** diff --git a/ensawards.org/data/projects/weex/icon.tsx b/ensawards.org/data/projects/weex/icon.tsx new file mode 100644 index 00000000..2ce39b9c --- /dev/null +++ b/ensawards.org/data/projects/weex/icon.tsx @@ -0,0 +1,22 @@ +import React from "react"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + +); + +export default Icon; diff --git a/ensawards.org/data/projects/weex/index.ts b/ensawards.org/data/projects/weex/index.ts new file mode 100644 index 00000000..a17ab27d --- /dev/null +++ b/ensawards.org/data/projects/weex/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 WEEXIcon from "./icon.tsx"; + +const WEEXProject: Project = { + id: ProjectIds.WEEX, + name: "WEEX", + description: + "Global cryptocurrency exchange focused on futures and spot trading, with copy trading and a range of earn products for digital assets.", + icon: WEEXIcon, + socials: { + website: new URL("https://www.weex.com"), + twitter: new URL("https://x.com/WEEX_Official"), + }, +}; + +defineProject(WEEXProject); + +export default WEEXProject;