diff --git a/ensawards.org/data/apps/1inch-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/1inch-wallet/benchmarks/index.tsx new file mode 100644 index 00000000..d02ff3df --- /dev/null +++ b/ensawards.org/data/apps/1inch-wallet/benchmarks/index.tsx @@ -0,0 +1,29 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import OneInchWallet from "data/apps/1inch-wallet"; +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 = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(OneInchWallet, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..7e8ee730 Binary files /dev/null and b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-2.gif b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-2.gif new file mode 100644 index 00000000..93e25ac3 Binary files /dev/null and b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-2.gif differ diff --git a/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-3.gif b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-3.gif new file mode 100644 index 00000000..4c9b16ec Binary files /dev/null and b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-3.gif differ diff --git a/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-4.gif b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-4.gif new file mode 100644 index 00000000..c3ebf369 Binary files /dev/null and b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-4.gif differ diff --git a/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-5.png b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-5.png new file mode 100644 index 00000000..d04fd1fc Binary files /dev/null and b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-5.png differ diff --git a/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-7.png b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-7.png new file mode 100644 index 00000000..3a38e335 Binary files /dev/null and b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/at-7.png differ diff --git a/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..d89ce622 --- /dev/null +++ b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,126 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT2, + buildFailNoteForAT5, + buildFailNoteForAT7, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT3, + buildPassNoteForAT4, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.gif"; +import at3Proof from "./at-3.gif"; +import at4Proof from "./at-4.gif"; +import at5Proof from "./at-5.png"; +import at7Proof from "./at-7.png"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:20:57Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "1inch Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:20:57Z") }, + ], + notes: buildFailNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "1inch Wallet fails to resolve the address for Ξthereum.eth", + }, + extra: "The app blocked the send operation from continuing.", + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:20:57Z") }, + ], + notes: buildPassNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "1inch Wallet correctly resolves the address for jesse.base.eth", + }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:20:57Z") }, + ], + notes: buildPassNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "1inch Wallet correctly resolves the address for dperri.com", + }, + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:20:57Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "1inch Wallet fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:20:57Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ chain: "Bitcoin" }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:20:57Z") }, + ], + notes: buildFailNoteForAT7({ + method: 'the "send" flow in context of the Solana chain', + proof: { + image: at7Proof, + alt: "1inch Wallet fails to resolve the Solana address for gregskril.eth", + }, + extra: 'The app showed the message "Incompatible network".', + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:20:57Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..d144b65b Binary files /dev/null and b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/1inch-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..c3638807 --- /dev/null +++ b/ensawards.org/data/apps/1inch-wallet/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-02T09:32:00Z") }, + ], + notes: ( +
+

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

+ 1inch Wallet fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/1inch-wallet/icon.tsx b/ensawards.org/data/apps/1inch-wallet/icon.tsx new file mode 100644 index 00000000..a25ec214 --- /dev/null +++ b/ensawards.org/data/apps/1inch-wallet/icon.tsx @@ -0,0 +1,21 @@ +import React from "react"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/1inch-wallet/index.ts b/ensawards.org/data/apps/1inch-wallet/index.ts new file mode 100644 index 00000000..196720bb --- /dev/null +++ b/ensawards.org/data/apps/1inch-wallet/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 OneInchProject from "data/projects/1inch"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import OneInchIcon from "./icon.tsx"; + +const OneInchWallet: App = { + id: "1inch-wallet", + appSlug: "1inch-wallet", + type: AppTypes.Wallet, + project: OneInchProject, + name: "1inch Wallet", + description: + "Self-custodial wallet for swapping, sending, and managing digital assets across Solana and EVM chains, with built-in access to 1inch DeFi trading.", + socials: { + website: new URL("https://1inch.com/wallet"), + twitter: new URL("https://x.com/1inch"), + }, + icon: OneInchIcon, + // TODO: Add OG images +}; + +defineApp(OneInchWallet); + +export default OneInchWallet; diff --git a/ensawards.org/data/apps/bitget-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/bitget-wallet/benchmarks/index.tsx new file mode 100644 index 00000000..06688fff --- /dev/null +++ b/ensawards.org/data/apps/bitget-wallet/benchmarks/index.tsx @@ -0,0 +1,29 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import BitgetWallet from "data/apps/bitget-wallet"; +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 = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(BitgetWallet, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..6f8f6109 Binary files /dev/null and b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..26cf138b Binary files /dev/null and b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..6c2d5353 Binary files /dev/null and b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-4.png b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-4.png new file mode 100644 index 00000000..16d509f0 Binary files /dev/null and b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-4.png differ diff --git a/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-5.png b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-5.png new file mode 100644 index 00000000..0c1253bd Binary files /dev/null and b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-5.png differ diff --git a/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-6.png b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-6.png new file mode 100644 index 00000000..7674f194 Binary files /dev/null and b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-6.png differ diff --git a/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-7.png b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-7.png new file mode 100644 index 00000000..9ee0578c Binary files /dev/null and b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/at-7.png differ diff --git a/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..ab42ea42 --- /dev/null +++ b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,135 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT3, + buildFailNoteForAT4, + buildFailNoteForAT5, + buildFailNoteForAT6, + buildFailNoteForAT7, + buildNotApplicableForFailedTest, + buildPassNoteForAT1, + buildPassNoteForAT2, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.png"; +import at6Proof from "./at-6.png"; +import at7Proof from "./at-7.png"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T11:06:01Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Bitget Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T11:06:01Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "Bitget Wallet correctly resolves the address for Ξthereum.eth", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T11:06:01Z") }, + ], + notes: buildFailNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "Bitget Wallet fails to resolve the address for jesse.base.eth", + }, + extra: 'The app showed the message "Invalid address".', + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T11:06:01Z") }, + ], + notes: buildFailNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "Bitget Wallet fails to resolve the address for dperri.com", + }, + extra: 'The app showed the message "Invalid address".', + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T11:06:01Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "Bitget Wallet fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T11:06:01Z") }, + ], + notes: buildFailNoteForAT6({ + method: 'the "send" flow in context of the Bitcoin chain', + proof: { + image: at6Proof, + alt: "Bitget Wallet fails to resolve the Bitcoin address for gregskril.eth", + }, + extra: 'The app showed the message "Invalid address".', + }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T11:06:01Z") }, + ], + notes: buildFailNoteForAT7({ + method: 'the "send" flow in context of the Solana chain', + proof: { + image: at7Proof, + alt: "Bitget Wallet fails to resolve the Solana address for gregskril.eth", + }, + extra: 'The app showed the message "Invalid address".', + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T11:06:01Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..b565818b Binary files /dev/null and b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..ce53adc6 --- /dev/null +++ b/ensawards.org/data/apps/bitget-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx @@ -0,0 +1,42 @@ +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-02T10:52:03Z") }, + ], + notes: ( +
+

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

+ Bitget Wallet fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/bitget-wallet/icon.tsx b/ensawards.org/data/apps/bitget-wallet/icon.tsx new file mode 100644 index 00000000..8e17b08a --- /dev/null +++ b/ensawards.org/data/apps/bitget-wallet/icon.tsx @@ -0,0 +1,23 @@ +import React from "react"; + +const Icon = (props: React.SVGProps) => ( + + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/bitget-wallet/index.ts b/ensawards.org/data/apps/bitget-wallet/index.ts new file mode 100644 index 00000000..2fa92d47 --- /dev/null +++ b/ensawards.org/data/apps/bitget-wallet/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 BitgetProject from "data/projects/bitget"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import BitgetIcon from "./icon.tsx"; + +const BitgetWallet: App = { + id: "bitget-wallet", + appSlug: "bitget-wallet", + type: AppTypes.Wallet, + project: BitgetProject, + name: "Bitget Wallet", + description: + "Self-custodial Web3 wallet for managing digital assets, swapping tokens, and interacting with decentralized applications across multiple chains.", + socials: { + website: new URL("https://web3.bitget.com/"), + twitter: new URL("https://x.com/bitget"), + }, + icon: BitgetIcon, + // TODO: Add OG images +}; + +defineApp(BitgetWallet); + +export default BitgetWallet; diff --git a/ensawards.org/data/apps/enkrypt-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/enkrypt-wallet/benchmarks/index.tsx new file mode 100644 index 00000000..69416e42 --- /dev/null +++ b/ensawards.org/data/apps/enkrypt-wallet/benchmarks/index.tsx @@ -0,0 +1,29 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import EnkryptWallet from "data/apps/enkrypt-wallet"; +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 = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(EnkryptWallet, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/enkrypt-wallet/benchmarks/resolution/deposit-addresses/at-1.gif b/ensawards.org/data/apps/enkrypt-wallet/benchmarks/resolution/deposit-addresses/at-1.gif new file mode 100644 index 00000000..d0211ffb Binary files /dev/null and b/ensawards.org/data/apps/enkrypt-wallet/benchmarks/resolution/deposit-addresses/at-1.gif differ diff --git a/ensawards.org/data/apps/enkrypt-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/enkrypt-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..5a82dac3 --- /dev/null +++ b/ensawards.org/data/apps/enkrypt-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,80 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.gif"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:38:30Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "send" flow', + proof: { + image: at1Proof, + alt: "Enkrypt Wallet doesn't allow ENS names as the recipient in the send flow", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:38:30Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:38:30Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:38:30Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:38:30Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:38:30Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:38:30Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:38:30Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/enkrypt-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.gif b/ensawards.org/data/apps/enkrypt-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.gif new file mode 100644 index 00000000..73c4f601 Binary files /dev/null and b/ensawards.org/data/apps/enkrypt-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.gif differ diff --git a/ensawards.org/data/apps/enkrypt-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/enkrypt-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..bd31b411 --- /dev/null +++ b/ensawards.org/data/apps/enkrypt-wallet/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.gif"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:09:06Z") }, + ], + notes: ( +
+

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

+ Enkrypt Wallet doesn't allow ENS name as recipient in the send flow +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/enkrypt-wallet/icon.png b/ensawards.org/data/apps/enkrypt-wallet/icon.png new file mode 100644 index 00000000..8747b14b Binary files /dev/null and b/ensawards.org/data/apps/enkrypt-wallet/icon.png differ diff --git a/ensawards.org/data/apps/enkrypt-wallet/icon.tsx b/ensawards.org/data/apps/enkrypt-wallet/icon.tsx new file mode 100644 index 00000000..7a62f895 --- /dev/null +++ b/ensawards.org/data/apps/enkrypt-wallet/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/enkrypt-wallet/index.ts b/ensawards.org/data/apps/enkrypt-wallet/index.ts new file mode 100644 index 00000000..f4476b28 --- /dev/null +++ b/ensawards.org/data/apps/enkrypt-wallet/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 MEWProject from "data/projects/mew"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import EnkryptIcon from "./icon.tsx"; + +const EnkryptWallet: App = { + id: "enkrypt-wallet", + appSlug: "enkrypt-wallet", + type: AppTypes.Wallet, + project: MEWProject, + name: "Enkrypt", + description: + "Self-custodial multichain browser-extension wallet built by MEW, extending beyond its classic Ethereum web app with native support for EVM and non-EVM chains and in-browser dApp connectivity.", + socials: { + website: new URL("https://www.enkrypt.com/"), + twitter: new URL("https://x.com/enkrypt"), + }, + icon: EnkryptIcon, + // TODO: Add OG images +}; + +defineApp(EnkryptWallet); + +export default EnkryptWallet; diff --git a/ensawards.org/data/apps/gem-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/gem-wallet/benchmarks/index.tsx new file mode 100644 index 00000000..4d0efe13 --- /dev/null +++ b/ensawards.org/data/apps/gem-wallet/benchmarks/index.tsx @@ -0,0 +1,29 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import GemWallet from "data/apps/gem-wallet"; +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 = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(GemWallet, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-1.gif b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-1.gif new file mode 100644 index 00000000..c5b5c226 Binary files /dev/null and b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-1.gif differ diff --git a/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..9fd2e953 Binary files /dev/null and b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..ca9aa703 Binary files /dev/null and b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-4.png b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-4.png new file mode 100644 index 00000000..a3fd961b Binary files /dev/null and b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-4.png differ diff --git a/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-5.gif b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-5.gif new file mode 100644 index 00000000..04e4f258 Binary files /dev/null and b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-5.gif differ diff --git a/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-6.png b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-6.png new file mode 100644 index 00000000..0f20ae60 Binary files /dev/null and b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-6.png differ diff --git a/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-7.png b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-7.png new file mode 100644 index 00000000..3ec8e5bd Binary files /dev/null and b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/at-7.png differ diff --git a/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..61ca36b9 --- /dev/null +++ b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,136 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT2, + buildFailNoteForAT3, + buildFailNoteForAT4, + buildFailNoteForAT5, + buildFailNoteForAT6, + buildFailNoteForAT7, + buildNotApplicableForFailedTest, + buildPassNoteForAT1, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.gif"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.gif"; +import at6Proof from "./at-6.png"; +import at7Proof from "./at-7.png"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:01:57Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Gem Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:01:57Z") }, + ], + notes: buildFailNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "Gem Wallet fails to resolve the address for Ξthereum.eth", + }, + extra: "The app blocked the send operation from continuing.", + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:01:57Z") }, + ], + notes: buildFailNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "Gem Wallet fails to resolve the address for jesse.base.eth", + }, + extra: "The app blocked the send operation from continuing.", + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:01:57Z") }, + ], + notes: buildFailNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "Gem Wallet fails to resolve the address for dperri.com", + }, + extra: "The app blocked the send operation from continuing.", + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:01:57Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "Gem Wallet fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:01:57Z") }, + ], + notes: buildFailNoteForAT6({ + method: 'the "send" flow in context of the Bitcoin chain', + proof: { + image: at6Proof, + alt: "Gem Wallet fails to resolve the Bitcoin address for gregskril.eth", + }, + extra: "The app blocked the send operation from continuing.", + }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:01:57Z") }, + ], + notes: buildFailNoteForAT7({ + method: 'the "send" flow in context of the Solana chain', + proof: { + image: at7Proof, + alt: "Gem Wallet fails to resolve the Solana address for gregskril.eth", + }, + extra: "The app blocked the send operation from continuing.", + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:01:57Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.gif b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.gif new file mode 100644 index 00000000..d91b5792 Binary files /dev/null and b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.gif differ diff --git a/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/gem-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..b4171faf --- /dev/null +++ b/ensawards.org/data/apps/gem-wallet/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.gif"; + +const ensv2ReadyResolution = { + "correctly-resolve-ensv2-test-name-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T07:57:00Z") }, + ], + notes: ( +
+

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

+ Gem Wallet fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/gem-wallet/icon.tsx b/ensawards.org/data/apps/gem-wallet/icon.tsx new file mode 100644 index 00000000..d4f35c27 --- /dev/null +++ b/ensawards.org/data/apps/gem-wallet/icon.tsx @@ -0,0 +1,48 @@ +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/gem-wallet/index.ts b/ensawards.org/data/apps/gem-wallet/index.ts new file mode 100644 index 00000000..7b5c682c --- /dev/null +++ b/ensawards.org/data/apps/gem-wallet/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 GemProject from "data/projects/gem"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import GemIcon from "./icon.tsx"; + +const GemWallet: App = { + id: "gem-wallet", + appSlug: "gem-wallet", + type: AppTypes.Wallet, + project: GemProject, + name: "Gem Wallet", + description: + "Open-source, self-custodial multichain wallet for storing, sending, and swapping digital assets and interacting with decentralized applications.", + socials: { + website: new URL("https://gemwallet.com"), + twitter: new URL("https://x.com/gemwallet"), + }, + icon: GemIcon, + // TODO: Add OG images +}; + +defineApp(GemWallet); + +export default GemWallet; diff --git a/ensawards.org/data/apps/imtoken-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/imtoken-wallet/benchmarks/index.tsx new file mode 100644 index 00000000..b6affd35 --- /dev/null +++ b/ensawards.org/data/apps/imtoken-wallet/benchmarks/index.tsx @@ -0,0 +1,29 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import ImTokenWallet from "data/apps/imtoken-wallet"; +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 = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(ImTokenWallet, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..8045fd2d Binary files /dev/null and b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..f9456016 Binary files /dev/null and b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..76f0c3c4 Binary files /dev/null and b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-4.png b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-4.png new file mode 100644 index 00000000..e0bf8110 Binary files /dev/null and b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-4.png differ diff --git a/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-5.png b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-5.png new file mode 100644 index 00000000..6a522def Binary files /dev/null and b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-5.png differ diff --git a/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-6.png b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-6.png new file mode 100644 index 00000000..8da47ce8 Binary files /dev/null and b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-6.png differ diff --git a/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-7.gif b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-7.gif new file mode 100644 index 00000000..0ebd1ac2 Binary files /dev/null and b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/at-7.gif differ diff --git a/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..0daba802 --- /dev/null +++ b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,133 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT4, + buildFailNoteForAT5, + buildFailNoteForAT6, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT3, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.png"; +import at6Proof from "./at-6.png"; +import at7Proof from "./at-7.gif"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:12:20Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "imToken correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:12:20Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "imToken correctly resolves the address for Ξthereum.eth", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:12:20Z") }, + ], + notes: buildPassNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "imToken correctly resolves the address for jesse.base.eth", + }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:12:20Z") }, + ], + notes: buildFailNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "imToken fails to resolve the address for dperri.com", + }, + extra: 'The app showed the message "The wallet address for the domain could not be found".', + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:12:20Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "imToken fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: 'The app showed the message "The wallet address for the domain could not be found".', + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:12:20Z") }, + ], + notes: buildFailNoteForAT6({ + method: 'the "send" flow in context of the Bitcoin chain', + proof: { + image: at6Proof, + alt: "imToken fails to resolve the Bitcoin address for gregskril.eth", + }, + extra: 'The app showed the message "The wallet address for the domain could not be found".', + }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:12:20Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ + chain: "Solana", + proof: { + image: at7Proof, + alt: "imToken has no context of the Solana chain in the send flow", + }, + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:12:20Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..081092fe Binary files /dev/null and b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/imtoken-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..184e76b3 --- /dev/null +++ b/ensawards.org/data/apps/imtoken-wallet/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, 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.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T08:05:00Z") }, + ], + notes: ( +
+

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

+ imToken correctly resolves the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/imtoken-wallet/icon.tsx b/ensawards.org/data/apps/imtoken-wallet/icon.tsx new file mode 100644 index 00000000..504dde6d --- /dev/null +++ b/ensawards.org/data/apps/imtoken-wallet/icon.tsx @@ -0,0 +1,48 @@ +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/imtoken-wallet/index.ts b/ensawards.org/data/apps/imtoken-wallet/index.ts new file mode 100644 index 00000000..52a7dfe7 --- /dev/null +++ b/ensawards.org/data/apps/imtoken-wallet/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 ImTokenProject from "data/projects/imtoken"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import ImTokenIcon from "./icon.tsx"; + +const ImTokenWallet: App = { + id: "imtoken-wallet", + appSlug: "imtoken-wallet", + type: AppTypes.Wallet, + project: ImTokenProject, + name: "imToken", + description: + "Self-custodial multichain wallet for storing, sending, and swapping digital assets and interacting with decentralized applications across Ethereum, Bitcoin, and other chains.", + socials: { + website: new URL("https://token.im"), + twitter: new URL("https://twitter.com/imTokenOfficial"), + }, + icon: ImTokenIcon, + // TODO: Add OG images +}; + +defineApp(ImTokenWallet); + +export default ImTokenWallet; diff --git a/ensawards.org/data/apps/mew-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/mew-wallet/benchmarks/index.tsx new file mode 100644 index 00000000..0fa14469 --- /dev/null +++ b/ensawards.org/data/apps/mew-wallet/benchmarks/index.tsx @@ -0,0 +1,29 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import MyEtherWallet from "data/apps/mew-wallet"; +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 = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(MyEtherWallet, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/mew-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/mew-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..367f2eca Binary files /dev/null and b/ensawards.org/data/apps/mew-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/mew-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/mew-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..108728ec --- /dev/null +++ b/ensawards.org/data/apps/mew-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,80 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T12:17:12Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "send" flow', + proof: { + image: at1Proof, + alt: "MyEtherWallet doesn't allow ENS names as the recipient in the send flow", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T12:17:12Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T12:17:12Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T12:17:12Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T12:17:12Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T12:17:12Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T12:17:12Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T12:17:12Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/mew-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/mew-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..f06feca9 Binary files /dev/null and b/ensawards.org/data/apps/mew-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/mew-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/mew-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..9167bf90 --- /dev/null +++ b/ensawards.org/data/apps/mew-wallet/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-03T12:09:00Z") }, + ], + notes: ( +
+

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

+ MyEtherWallet app doesn't allow ENS name as recipient in the send flow +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/mew-wallet/icon.tsx b/ensawards.org/data/apps/mew-wallet/icon.tsx new file mode 100644 index 00000000..db5e8692 --- /dev/null +++ b/ensawards.org/data/apps/mew-wallet/icon.tsx @@ -0,0 +1,116 @@ +import React from "react"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/mew-wallet/index.ts b/ensawards.org/data/apps/mew-wallet/index.ts new file mode 100644 index 00000000..41de492e --- /dev/null +++ b/ensawards.org/data/apps/mew-wallet/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 MEWProject from "data/projects/mew"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import MEWIcon from "./icon.tsx"; + +const MyEtherWallet: App = { + id: "mew-wallet", + appSlug: "mew-wallet", + type: AppTypes.Wallet, + project: MEWProject, + name: "MyEtherWallet", + description: + "Self-custodial mobile wallet for iOS and Android that lets you create and access Ethereum wallets, buy, send, and swap tokens, and connect to decentralized applications on the go.", + socials: { + website: new URL("https://www.mewwallet.com"), + twitter: new URL("https://x.com/myetherwallet"), + }, + icon: MEWIcon, + // TODO: Add OG images +}; + +defineApp(MyEtherWallet); + +export default MyEtherWallet; diff --git a/ensawards.org/data/apps/mewweb-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/mewweb-wallet/benchmarks/index.tsx new file mode 100644 index 00000000..98fcb73c --- /dev/null +++ b/ensawards.org/data/apps/mewweb-wallet/benchmarks/index.tsx @@ -0,0 +1,29 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import MyEtherWalletWeb from "data/apps/mewweb-wallet"; +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 = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(MyEtherWalletWeb, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..6e55c54b Binary files /dev/null and b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..0a602987 Binary files /dev/null and b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..f2fd4008 Binary files /dev/null and b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-4.png b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-4.png new file mode 100644 index 00000000..c7814abe Binary files /dev/null and b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-4.png differ diff --git a/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-5.png b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-5.png new file mode 100644 index 00000000..1cce69fe Binary files /dev/null and b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-5.png differ diff --git a/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-6.png b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-6.png new file mode 100644 index 00000000..07e96cd9 Binary files /dev/null and b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-6.png differ diff --git a/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-7.png b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-7.png new file mode 100644 index 00000000..06b4c913 Binary files /dev/null and b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/at-7.png differ diff --git a/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..d85e063a --- /dev/null +++ b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,131 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT2, + buildFailNoteForAT5, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT3, + buildPassNoteForAT4, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.png"; +import at5Proof from "./at-5.png"; +import at6Proof from "./at-6.png"; +import at7Proof from "./at-7.png"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:00:22Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "MyEtherWallet web app correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:00:22Z") }, + ], + notes: buildFailNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "MyEtherWallet web app fails to resolve the address for Ξthereum.eth", + }, + extra: 'The app showed the message "invalid address".', + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:00:22Z") }, + ], + notes: buildPassNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "MyEtherWallet web app correctly resolves the address for jesse.base.eth", + }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:00:22Z") }, + ], + notes: buildPassNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "MyEtherWallet web app correctly resolves the address for dperri.com", + }, + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:00:22Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "MyEtherWallet web app fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:00:22Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ + chain: "Bitcoin", + proof: { + image: at6Proof, + alt: "MyEtherWallet web app has no context of the Bitcoin chain in the send flow", + }, + }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:00:22Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ + chain: "Solana", + proof: { + image: at7Proof, + alt: "MyEtherWallet web app has no context of the Solana chain in the send flow", + }, + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T14:00:22Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..d9b60abf Binary files /dev/null and b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/mewweb-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..de951ea3 --- /dev/null +++ b/ensawards.org/data/apps/mewweb-wallet/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-02T13:58:28Z") }, + ], + notes: ( +
+

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

+ MyEtherWallet web app fails to resolve the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/mewweb-wallet/icon.tsx b/ensawards.org/data/apps/mewweb-wallet/icon.tsx new file mode 100644 index 00000000..7df6525c --- /dev/null +++ b/ensawards.org/data/apps/mewweb-wallet/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/mewweb-wallet/index.ts b/ensawards.org/data/apps/mewweb-wallet/index.ts new file mode 100644 index 00000000..49e39d66 --- /dev/null +++ b/ensawards.org/data/apps/mewweb-wallet/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 MEWProject from "data/projects/mew"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import MEWIcon from "./icon.tsx"; + +const MyEtherWalletWeb: App = { + id: "mewweb-wallet", + appSlug: "mewweb-wallet", + type: AppTypes.Wallet, + project: MEWProject, + name: "MyEtherWallet Web", + description: + "Self-custodial wallet interface for creating and accessing Ethereum wallets, sending and swapping tokens, and interacting with decentralized applications.", + socials: { + website: new URL("https://app.myetherwallet.com/"), + twitter: new URL("https://x.com/myetherwallet"), + }, + icon: MEWIcon, + // TODO: Add OG images +}; + +defineApp(MyEtherWalletWeb); + +export default MyEtherWalletWeb; diff --git a/ensawards.org/data/apps/safepal-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/safepal-wallet/benchmarks/index.tsx new file mode 100644 index 00000000..70910061 --- /dev/null +++ b/ensawards.org/data/apps/safepal-wallet/benchmarks/index.tsx @@ -0,0 +1,29 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import SafePalWallet from "data/apps/safepal-wallet"; +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 = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(SafePalWallet, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/safepal-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/safepal-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..33391a11 Binary files /dev/null and b/ensawards.org/data/apps/safepal-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/safepal-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/safepal-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..1ac656f6 --- /dev/null +++ b/ensawards.org/data/apps/safepal-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,80 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:00:00Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "send" flow', + proof: { + image: at1Proof, + alt: "SafePal Wallet doesn't allow ENS names as the recipient in the send flow", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:00:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:00:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:00:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:00:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:00:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:00:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:00:00Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/safepal-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/safepal-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..a310b242 Binary files /dev/null and b/ensawards.org/data/apps/safepal-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/safepal-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/safepal-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..c450958a --- /dev/null +++ b/ensawards.org/data/apps/safepal-wallet/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-03T09:56:41Z") }, + ], + notes: ( +
+

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

+ SafePal doesn't allow ENS name as recipient in the send flow +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/safepal-wallet/icon.tsx b/ensawards.org/data/apps/safepal-wallet/icon.tsx new file mode 100644 index 00000000..02af5b2f --- /dev/null +++ b/ensawards.org/data/apps/safepal-wallet/icon.tsx @@ -0,0 +1,25 @@ +import React from "react"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/safepal-wallet/index.ts b/ensawards.org/data/apps/safepal-wallet/index.ts new file mode 100644 index 00000000..4e1fbee3 --- /dev/null +++ b/ensawards.org/data/apps/safepal-wallet/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 SafePalProject from "data/projects/safepal"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import SafePalIcon from "./icon.tsx"; + +const SafePalWallet: App = { + id: "safepal-wallet", + appSlug: "safepal-wallet", + type: AppTypes.Wallet, + project: SafePalProject, + name: "SafePal", + description: + "Self-custodial multichain wallet for storing, sending, and swapping digital assets and interacting with decentralized applications, with optional hardware wallet pairing.", + socials: { + website: new URL("https://www.safepal.com"), + twitter: new URL("https://x.com/SafePal"), + }, + icon: SafePalIcon, + // TODO: Add OG images +}; + +defineApp(SafePalWallet); + +export default SafePalWallet; diff --git a/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/index.tsx new file mode 100644 index 00000000..662e3d70 --- /dev/null +++ b/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/index.tsx @@ -0,0 +1,29 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import TokenPocketWallet from "data/apps/tokenpocket-wallet"; +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 = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(TokenPocketWallet, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..022e93a2 Binary files /dev/null and b/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..42372e1a --- /dev/null +++ b/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,80 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildEnsNotSupportedNote, + buildNotApplicableForFailedTest, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:03:07Z") }, + ], + notes: buildEnsNotSupportedNote({ + method: 'the "send" flow', + proof: { + image: at1Proof, + alt: "TokenPocket Wallet doesn't allow ENS names as the recipient in the send flow", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:03:07Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:03:07Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:03:07Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:03:07Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:03:07Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:03:07Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-03T10:03:07Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 1 }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..2d3efa3c Binary files /dev/null and b/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/tokenpocket-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..4a0ce640 --- /dev/null +++ b/ensawards.org/data/apps/tokenpocket-wallet/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-03T10:00:28Z") }, + ], + notes: ( +
+

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

+ TokenPocket doesn't allow ENS name as recipient in the send flow +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/tokenpocket-wallet/icon.tsx b/ensawards.org/data/apps/tokenpocket-wallet/icon.tsx new file mode 100644 index 00000000..747b395f --- /dev/null +++ b/ensawards.org/data/apps/tokenpocket-wallet/icon.tsx @@ -0,0 +1,40 @@ +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/tokenpocket-wallet/index.ts b/ensawards.org/data/apps/tokenpocket-wallet/index.ts new file mode 100644 index 00000000..7a474055 --- /dev/null +++ b/ensawards.org/data/apps/tokenpocket-wallet/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 TokenPocketProject from "data/projects/tokenpocket"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import TokenPocketIcon from "./icon.tsx"; + +const TokenPocketWallet: App = { + id: "tokenpocket-wallet", + appSlug: "tokenpocket-wallet", + type: AppTypes.Wallet, + project: TokenPocketProject, + name: "TokenPocket", + description: + "Self-custodial multichain wallet for storing, sending, and swapping digital assets and interacting with decentralized applications across Ethereum, Bitcoin, Solana, and other chains.", + socials: { + website: new URL("https://www.tokenpocket.pro"), + twitter: new URL("https://x.com/TokenPocket_TP"), + }, + icon: TokenPocketIcon, + // TODO: Add OG images +}; + +defineApp(TokenPocketWallet); + +export default TokenPocketWallet; diff --git a/ensawards.org/data/apps/uniswap-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/uniswap-wallet/benchmarks/index.tsx new file mode 100644 index 00000000..12f74d8e --- /dev/null +++ b/ensawards.org/data/apps/uniswap-wallet/benchmarks/index.tsx @@ -0,0 +1,29 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import UniswapWallet from "data/apps/uniswap-wallet"; +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 = { + "ensv2-ready-resolution": ensv2ReadyResolution, + "deposit-addresses": depositAddresses, + + // TODO: `Contract Naming` category is temporarily hidden due to unfit content, + // and so are all benchmarks belonging to it. + // We aim to fix it as soon as we have the capacity. + // See: https://github.com/namehash/ensawards/issues/222 + "display-named-smart-contracts-mainnet": { + "mainnet-interactions-display-named-smart-contracts": undefined, + }, + "display-named-smart-contracts-l2-chains": { + "l2-chain-interactions-display-named-smart-contracts": undefined, + }, +} as const satisfies BestPracticeBenchmarks; + +defineAppBenchmarks(UniswapWallet, benchmarks); + +export default benchmarks; diff --git a/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-1.png b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-1.png new file mode 100644 index 00000000..a70a9bc8 Binary files /dev/null and b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-1.png differ diff --git a/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-2.png b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-2.png new file mode 100644 index 00000000..0c1d660b Binary files /dev/null and b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-2.png differ diff --git a/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-3.png b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-3.png new file mode 100644 index 00000000..69930cdc Binary files /dev/null and b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-3.png differ diff --git a/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-4.gif b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-4.gif new file mode 100644 index 00000000..5675f2ae Binary files /dev/null and b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-4.gif differ diff --git a/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-5.png b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-5.png new file mode 100644 index 00000000..cd8e1b05 Binary files /dev/null and b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-5.png differ diff --git a/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-6.gif b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-6.gif new file mode 100644 index 00000000..f3ec04c1 Binary files /dev/null and b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-6.gif differ diff --git a/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-7.gif b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-7.gif new file mode 100644 index 00000000..0449e948 Binary files /dev/null and b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/at-7.gif differ diff --git a/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/index.tsx b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/index.tsx new file mode 100644 index 00000000..85940408 --- /dev/null +++ b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/deposit-addresses/index.tsx @@ -0,0 +1,130 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying app benchmarks + +import { type AcceptanceTestBenchmarks, BenchmarkResults } from "data/benchmarks/types"; +import contributors from "data/contributors"; +import { + buildFailNoteForAT5, + buildNotApplicableForFailedTest, + buildNotApplicableForNonEvmChain, + buildPassNoteForAT1, + buildPassNoteForAT2, + buildPassNoteForAT3, + buildPassNoteForAT4, +} from "data/ens-best-practices/resolution/deposit-addresses/notes"; + +import { parseTimestamp } from "@ensnode/ensnode-sdk"; + +import at1Proof from "./at-1.png"; +import at2Proof from "./at-2.png"; +import at3Proof from "./at-3.png"; +import at4Proof from "./at-4.gif"; +import at5Proof from "./at-5.png"; +import at6Proof from "./at-6.gif"; +import at7Proof from "./at-7.gif"; + +const method = 'the "send" flow'; + +const depositAddresses = { + "at01-resolve-onchain-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:49:22Z") }, + ], + notes: buildPassNoteForAT1({ + method, + proof: { + image: at1Proof, + alt: "Uniswap Wallet correctly resolves the address for vitalik.eth", + }, + }), + }, + "at02-resolve-name-needing-normalization": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:49:22Z") }, + ], + notes: buildPassNoteForAT2({ + method, + proof: { + image: at2Proof, + alt: "Uniswap Wallet correctly resolves the address for Ξthereum.eth", + }, + }), + }, + "at03-resolve-offchain-eth-subname": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:49:22Z") }, + ], + notes: buildPassNoteForAT3({ + method, + proof: { + image: at3Proof, + alt: "Uniswap Wallet correctly resolves the address for jesse.base.eth", + }, + }), + }, + "at04-resolve-offchain-dns-name": { + result: BenchmarkResults.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:49:22Z") }, + ], + notes: buildPassNoteForAT4({ + method, + proof: { + image: at4Proof, + alt: "Uniswap Wallet correctly resolves the address for dperri.com", + }, + }), + }, + "at05-resolve-name-on-other-evm-chain": { + result: BenchmarkResults.Fail, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:49:22Z") }, + ], + notes: buildFailNoteForAT5({ + method, + proof: { + image: at5Proof, + alt: "Uniswap Wallet fails to resolve the address for lightkeeper.eth on the Base chain", + }, + extra: "The app resolved to the Ethereum Mainnet address instead of the Base address.", + }), + }, + "at06-resolve-bitcoin-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:49:22Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ + chain: "Bitcoin", + proof: { + image: at6Proof, + alt: "Uniswap Wallet has no context of the Bitcoin chain in the send flow", + }, + }), + }, + "at07-resolve-solana-address": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:49:22Z") }, + ], + notes: buildNotApplicableForNonEvmChain({ + chain: "Solana", + proof: { + image: at7Proof, + alt: "Uniswap Wallet has no context of the Solana chain in the send flow", + }, + }), + }, + "at08-handle-invalid-address-format": { + result: BenchmarkResults.NotApplicable, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:49:22Z") }, + ], + notes: buildNotApplicableForFailedTest({ testNumber: 5, scope: "on Base" }), + }, +} as const satisfies AcceptanceTestBenchmarks; + +export default depositAddresses; diff --git a/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png new file mode 100644 index 00000000..d440bd98 Binary files /dev/null and b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/ensv2-ready-resolution/at-1.png differ diff --git a/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx b/ensawards.org/data/apps/uniswap-wallet/benchmarks/resolution/ensv2-ready-resolution/index.tsx new file mode 100644 index 00000000..62a73283 --- /dev/null +++ b/ensawards.org/data/apps/uniswap-wallet/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, 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.Pass, + contributions: [ + { from: contributors.y3drk, lastUpdated: parseTimestamp("2026-07-02T10:34:33Z") }, + ], + notes: ( +
+

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

+ Uniswap Wallet correctly resolves the name for ENSv2 +
+ ), + } as const satisfies AcceptanceTestBenchmark, +} as const satisfies AcceptanceTestBenchmarks; + +export default ensv2ReadyResolution; diff --git a/ensawards.org/data/apps/uniswap-wallet/icon.tsx b/ensawards.org/data/apps/uniswap-wallet/icon.tsx new file mode 100644 index 00000000..2db804fd --- /dev/null +++ b/ensawards.org/data/apps/uniswap-wallet/icon.tsx @@ -0,0 +1,55 @@ +import React from "react"; + +const Icon = (props: React.SVGProps) => ( + + + + + + + + + + + +); + +export default Icon; diff --git a/ensawards.org/data/apps/uniswap-wallet/index.ts b/ensawards.org/data/apps/uniswap-wallet/index.ts new file mode 100644 index 00000000..d87d9460 --- /dev/null +++ b/ensawards.org/data/apps/uniswap-wallet/index.ts @@ -0,0 +1,30 @@ +// Read https://github.com/namehash/ensawards/blob/main/CONTRIBUTING.md +// for additional advice on adding and modifying apps + +import UniswapProject from "data/projects/uniswap"; +import { asInterpretedName } from "enssdk"; + +import { defineApp } from "../registry.ts"; +import { type App, AppTypes } from "../types.ts"; +import UniswapIcon from "./icon.tsx"; + +const UniswapWallet: App = { + id: "uniswap-wallet", + appSlug: "uniswap-wallet", + type: AppTypes.Wallet, + project: UniswapProject, + name: "Uniswap Wallet", + description: + "Self-custodial wallet for swapping, sending, and managing tokens and NFTs across Ethereum and other chains, with built-in access to the Uniswap protocol.", + socials: { + website: new URL("https://wallet.uniswap.org/"), + twitter: new URL("https://x.com/Uniswap"), + ens: asInterpretedName("uniswap.eth"), + }, + icon: UniswapIcon, + // TODO: Add OG images +}; + +defineApp(UniswapWallet); + +export default UniswapWallet; diff --git a/ensawards.org/data/projects/gem/icon.tsx b/ensawards.org/data/projects/gem/icon.tsx new file mode 100644 index 00000000..d4f35c27 --- /dev/null +++ b/ensawards.org/data/projects/gem/icon.tsx @@ -0,0 +1,48 @@ +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/gem/index.ts b/ensawards.org/data/projects/gem/index.ts new file mode 100644 index 00000000..57cd301c --- /dev/null +++ b/ensawards.org/data/projects/gem/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 GemIcon from "./icon.tsx"; + +const GemProject: Project = { + id: ProjectIds.Gem, + name: "Gem", + description: + "Open-source, self-custodial multichain crypto wallet for storing, sending, and swapping digital assets and interacting with decentralized applications.", + icon: GemIcon, + socials: { + website: new URL("https://gemwallet.com"), + twitter: new URL("https://x.com/gemwallet"), + }, +}; + +defineProject(GemProject); + +export default GemProject; diff --git a/ensawards.org/data/projects/imtoken/icon.tsx b/ensawards.org/data/projects/imtoken/icon.tsx new file mode 100644 index 00000000..504dde6d --- /dev/null +++ b/ensawards.org/data/projects/imtoken/icon.tsx @@ -0,0 +1,48 @@ +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/imtoken/index.ts b/ensawards.org/data/projects/imtoken/index.ts new file mode 100644 index 00000000..c1b29d32 --- /dev/null +++ b/ensawards.org/data/projects/imtoken/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 ImTokenIcon from "./icon.tsx"; + +const ImTokenProject: Project = { + id: ProjectIds.ImToken, + name: "imToken", + description: + "Self-custodial multichain wallet for storing, sending, and swapping digital assets and interacting with decentralized applications across Ethereum, Bitcoin, and other chains.", + icon: ImTokenIcon, + socials: { + website: new URL("https://token.im"), + twitter: new URL("https://twitter.com/imTokenOfficial"), + }, +}; + +defineProject(ImTokenProject); + +export default ImTokenProject; diff --git a/ensawards.org/data/projects/mew/icon.tsx b/ensawards.org/data/projects/mew/icon.tsx new file mode 100644 index 00000000..7df6525c --- /dev/null +++ b/ensawards.org/data/projects/mew/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/mew/index.ts b/ensawards.org/data/projects/mew/index.ts new file mode 100644 index 00000000..2dfbb253 --- /dev/null +++ b/ensawards.org/data/projects/mew/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 MEWIcon from "./icon.tsx"; + +const MEWProject: Project = { + id: ProjectIds.MEW, + name: "MEW", + description: + "MyEtherWallet: a self-custodial interface for creating and managing Ethereum wallets, sending tokens, and interacting with decentralized applications.", + icon: MEWIcon, + socials: { + website: new URL("https://www.myetherwallet.com"), + twitter: new URL("https://x.com/myetherwallet"), + }, +}; + +defineProject(MEWProject); + +export default MEWProject; diff --git a/ensawards.org/data/projects/safepal/icon.tsx b/ensawards.org/data/projects/safepal/icon.tsx new file mode 100644 index 00000000..02af5b2f --- /dev/null +++ b/ensawards.org/data/projects/safepal/icon.tsx @@ -0,0 +1,25 @@ +import React from "react"; + +const Icon = ({ className, ...props }: React.SVGProps) => ( + + + + + +); + +export default Icon; diff --git a/ensawards.org/data/projects/safepal/index.ts b/ensawards.org/data/projects/safepal/index.ts new file mode 100644 index 00000000..6d8727bc --- /dev/null +++ b/ensawards.org/data/projects/safepal/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 SafePalIcon from "./icon.tsx"; + +const SafePalProject: Project = { + id: ProjectIds.SafePal, + name: "SafePal", + description: + "Self-custodial crypto wallet spanning hardware, mobile, and browser-extension apps for storing, sending, and swapping digital assets across multiple chains.", + icon: SafePalIcon, + socials: { + website: new URL("https://www.safepal.com"), + twitter: new URL("https://x.com/SafePal"), + }, +}; + +defineProject(SafePalProject); + +export default SafePalProject; diff --git a/ensawards.org/data/projects/tokenpocket/icon.tsx b/ensawards.org/data/projects/tokenpocket/icon.tsx new file mode 100644 index 00000000..747b395f --- /dev/null +++ b/ensawards.org/data/projects/tokenpocket/icon.tsx @@ -0,0 +1,40 @@ +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/tokenpocket/index.ts b/ensawards.org/data/projects/tokenpocket/index.ts new file mode 100644 index 00000000..dd5049d8 --- /dev/null +++ b/ensawards.org/data/projects/tokenpocket/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 TokenPocketIcon from "./icon.tsx"; + +const TokenPocketProject: Project = { + id: ProjectIds.TokenPocket, + name: "TokenPocket", + description: + "Self-custodial multichain wallet for storing, sending, and swapping digital assets and interacting with decentralized applications across Ethereum, Bitcoin, Solana, and other chains.", + icon: TokenPocketIcon, + socials: { + website: new URL("https://www.tokenpocket.pro"), + twitter: new URL("https://x.com/TokenPocket_TP"), + }, +}; + +defineProject(TokenPocketProject); + +export default TokenPocketProject; diff --git a/ensawards.org/data/projects/types.ts b/ensawards.org/data/projects/types.ts index aec22ea5..e99e9f90 100644 --- a/ensawards.org/data/projects/types.ts +++ b/ensawards.org/data/projects/types.ts @@ -59,6 +59,11 @@ export const ProjectIds = { XTcom: "project-xtcom", WhiteBIT: "project-whitebit", Ourbit: "project-ourbit", + MEW: "project-mew", + Gem: "project-gem", + ImToken: "project-imtoken", + SafePal: "project-safepal", + TokenPocket: "project-tokenpocket", } as const; /**