diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3c52b28d..7bc77928 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -228,7 +228,7 @@ For reference see [ensawards.org/data/ens-best-practices/contract-naming/name-yo [ensawards.org/data/ens-best-practices/types.ts](ensawards.org/data/ens-best-practices/types.ts) file. ```typescript export interface BestPracticeTechnicalDetails { - useCaseSummary: JSX.Element; + ensBestPracticeOverview: JSX.Element; benefitFromUsingEns: JSX.Element; /** Title for the benefit card. Defaults to "Benefit from using ENS" when omitted. */ benefitFromUsingEnsTitle?: string; @@ -309,6 +309,9 @@ For reference, see [ensawards.org/data/ens-best-practices/contract-naming/name-y examplePartialPass?: AcceptanceTestBenchmarkPartialPass; exampleFail?: AcceptanceTestBenchmarkFail; exampleNotApplicable?: NotApplicableAcceptanceTestBenchmark; + + /** Sort priority within a {@link BestPractice}; lower comes first, undefined sorts last (then by slug). */ + order?: number; } ``` 4. In your PR describe your reasoning for adding it. diff --git a/ensawards.org/astro.config.mjs b/ensawards.org/astro.config.mjs index 4514d95c..1a509a4f 100644 --- a/ensawards.org/astro.config.mjs +++ b/ensawards.org/astro.config.mjs @@ -45,6 +45,75 @@ export default defineConfig({ "/ens-best-practices/contract-naming": "/ens-best-practices", "/leaderboards/defi": "/leaderboards/defi-protocol", + + // The `ensv2-readiness` best practice category was renamed to `resolution`. + "/ens-best-practices/ensv2-readiness/ensv2-ready-resolution": + "/ens-best-practices/resolution/ensv2-ready-resolution", + + "/app/1inch-defi/ensv2-readiness/ensv2-ready-resolution": + "/app/1inch-defi/resolution/ensv2-ready-resolution", + "/app/aave-defi/ensv2-readiness/ensv2-ready-resolution": + "/app/aave-defi/resolution/ensv2-ready-resolution", + "/app/ambire-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/ambire-wallet/resolution/ensv2-ready-resolution", + "/app/binance-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/binance-exchange/resolution/ensv2-ready-resolution", + "/app/binance-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/binance-wallet/resolution/ensv2-ready-resolution", + "/app/blockscout-explorer/ensv2-readiness/ensv2-ready-resolution": + "/app/blockscout-explorer/resolution/ensv2-ready-resolution", + "/app/coinbase-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/coinbase-exchange/resolution/ensv2-ready-resolution", + "/app/coinbase-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/coinbase-wallet/resolution/ensv2-ready-resolution", + "/app/cryptocom-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/cryptocom-exchange/resolution/ensv2-ready-resolution", + "/app/cryptocom-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/cryptocom-wallet/resolution/ensv2-ready-resolution", + "/app/etherscan-explorer/ensv2-readiness/ensv2-ready-resolution": + "/app/etherscan-explorer/resolution/ensv2-ready-resolution", + "/app/frame-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/frame-wallet/resolution/ensv2-ready-resolution", + "/app/gemini-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/gemini-wallet/resolution/ensv2-ready-resolution", + "/app/kraken-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/kraken-exchange/resolution/ensv2-ready-resolution", + "/app/kraken-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/kraken-wallet/resolution/ensv2-ready-resolution", + "/app/lido-defi/ensv2-readiness/ensv2-ready-resolution": + "/app/lido-defi/resolution/ensv2-ready-resolution", + "/app/metamask-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/metamask-wallet/resolution/ensv2-ready-resolution", + "/app/okx-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/okx-exchange/resolution/ensv2-ready-resolution", + "/app/okx-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/okx-wallet/resolution/ensv2-ready-resolution", + "/app/phantom-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/phantom-wallet/resolution/ensv2-ready-resolution", + "/app/rabby-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/rabby-wallet/resolution/ensv2-ready-resolution", + "/app/rainbow-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/rainbow-wallet/resolution/ensv2-ready-resolution", + "/app/readyx-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/readyx-wallet/resolution/ensv2-ready-resolution", + "/app/robinhood-exchange/ensv2-readiness/ensv2-ready-resolution": + "/app/robinhood-exchange/resolution/ensv2-ready-resolution", + "/app/robinhood-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/robinhood-wallet/resolution/ensv2-ready-resolution", + "/app/safe-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/safe-wallet/resolution/ensv2-ready-resolution", + "/app/status-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/status-wallet/resolution/ensv2-ready-resolution", + "/app/trust-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/trust-wallet/resolution/ensv2-ready-resolution", + "/app/uniswap-defi/ensv2-readiness/ensv2-ready-resolution": + "/app/uniswap-defi/resolution/ensv2-ready-resolution", + "/app/walletchan-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/walletchan-wallet/resolution/ensv2-ready-resolution", + "/app/worldapp-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/worldapp-wallet/resolution/ensv2-ready-resolution", + "/app/zerion-wallet/ensv2-readiness/ensv2-ready-resolution": + "/app/zerion-wallet/resolution/ensv2-ready-resolution", }, adapter: vercel(), diff --git a/ensawards.org/data/acceptance-tests/types.ts b/ensawards.org/data/acceptance-tests/types.ts index 96256a02..16eb1653 100644 --- a/ensawards.org/data/acceptance-tests/types.ts +++ b/ensawards.org/data/acceptance-tests/types.ts @@ -47,6 +47,9 @@ export interface AcceptanceTest { examplePartialPass?: AcceptanceTestBenchmarkPartialPass; exampleFail?: AcceptanceTestBenchmarkFail; exampleNotApplicable?: AcceptanceTestBenchmarkNotApplicable; + + /** Sort priority within a {@link BestPractice}; lower comes first, undefined sorts last (then by slug). */ + order?: number; } /** diff --git a/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx b/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx index f4cdf5c0..b8ec35c2 100644 --- a/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx +++ b/ensawards.org/data/apps/1inch-defi/benchmarks/index.tsx @@ -55,6 +55,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(OneInchDeFi, benchmarks); diff --git a/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx b/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx index aad7f05e..1ba34940 100644 --- a/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx +++ b/ensawards.org/data/apps/aave-defi/benchmarks/index.tsx @@ -76,6 +76,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(AaveDeFi, benchmarks); diff --git a/ensawards.org/data/apps/ambire-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/ambire-wallet/benchmarks/index.tsx index 7a2c6b20..eeea40d3 100644 --- a/ensawards.org/data/apps/ambire-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/ambire-wallet/benchmarks/index.tsx @@ -67,6 +67,16 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(AmbireWallet, benchmarks); diff --git a/ensawards.org/data/apps/binance-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/binance-exchange/benchmarks/index.tsx index 9ce7bff5..8b90ab5f 100644 --- a/ensawards.org/data/apps/binance-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/binance-exchange/benchmarks/index.tsx @@ -60,6 +60,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(BinanceExchange, benchmarks); diff --git a/ensawards.org/data/apps/binance-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/binance-wallet/benchmarks/index.tsx index b8b031e0..abfaf9d7 100644 --- a/ensawards.org/data/apps/binance-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/binance-wallet/benchmarks/index.tsx @@ -53,6 +53,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(BinanceWallet, benchmarks); diff --git a/ensawards.org/data/apps/blockscout-explorer/benchmarks/index.tsx b/ensawards.org/data/apps/blockscout-explorer/benchmarks/index.tsx index cb6770de..973ac6d4 100644 --- a/ensawards.org/data/apps/blockscout-explorer/benchmarks/index.tsx +++ b/ensawards.org/data/apps/blockscout-explorer/benchmarks/index.tsx @@ -85,6 +85,16 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(BlockscoutExplorer, benchmarks); diff --git a/ensawards.org/data/apps/coinbase-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/coinbase-exchange/benchmarks/index.tsx index 92b1d021..4f16dae2 100644 --- a/ensawards.org/data/apps/coinbase-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/coinbase-exchange/benchmarks/index.tsx @@ -37,6 +37,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(CoinbaseExchange, benchmarks); diff --git a/ensawards.org/data/apps/coinbase-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/coinbase-wallet/benchmarks/index.tsx index 66d1ced8..59ac3814 100644 --- a/ensawards.org/data/apps/coinbase-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/coinbase-wallet/benchmarks/index.tsx @@ -85,6 +85,16 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(CoinbaseWallet, benchmarks); diff --git a/ensawards.org/data/apps/cryptocom-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/cryptocom-exchange/benchmarks/index.tsx index acab9f2a..461ec378 100644 --- a/ensawards.org/data/apps/cryptocom-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/cryptocom-exchange/benchmarks/index.tsx @@ -43,6 +43,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(CryptoComExchange, benchmarks); diff --git a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/index.tsx index 305c5e96..f60fd51b 100644 --- a/ensawards.org/data/apps/cryptocom-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/cryptocom-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(CryptoComWallet, benchmarks); diff --git a/ensawards.org/data/apps/etherscan-explorer/benchmarks/index.tsx b/ensawards.org/data/apps/etherscan-explorer/benchmarks/index.tsx index 4bcc9896..11620512 100644 --- a/ensawards.org/data/apps/etherscan-explorer/benchmarks/index.tsx +++ b/ensawards.org/data/apps/etherscan-explorer/benchmarks/index.tsx @@ -85,6 +85,16 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(EtherscanExplorer, benchmarks); diff --git a/ensawards.org/data/apps/frame-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/frame-wallet/benchmarks/index.tsx index 8ba257fc..7ec849fd 100644 --- a/ensawards.org/data/apps/frame-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/frame-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(FrameWallet, benchmarks); diff --git a/ensawards.org/data/apps/gemini-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/gemini-wallet/benchmarks/index.tsx index 91bdc14d..2c14828b 100644 --- a/ensawards.org/data/apps/gemini-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/gemini-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(GeminiWallet, benchmarks); diff --git a/ensawards.org/data/apps/kraken-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/kraken-exchange/benchmarks/index.tsx index 7c0e6b24..24c3132f 100644 --- a/ensawards.org/data/apps/kraken-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/kraken-exchange/benchmarks/index.tsx @@ -43,6 +43,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(KrakenExchange, benchmarks); diff --git a/ensawards.org/data/apps/kraken-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/kraken-wallet/benchmarks/index.tsx index 2411029e..d22ce50b 100644 --- a/ensawards.org/data/apps/kraken-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/kraken-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(KrakenWallet, benchmarks); diff --git a/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx b/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx index 0de5a9fd..c55d46a6 100644 --- a/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx +++ b/ensawards.org/data/apps/lido-defi/benchmarks/index.tsx @@ -56,6 +56,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(LidoDeFi, benchmarks); diff --git a/ensawards.org/data/apps/metamask-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/metamask-wallet/benchmarks/index.tsx index 61d652f7..44cdea75 100644 --- a/ensawards.org/data/apps/metamask-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/metamask-wallet/benchmarks/index.tsx @@ -74,6 +74,16 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(MetaMaskWallet, benchmarks); diff --git a/ensawards.org/data/apps/okx-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/okx-exchange/benchmarks/index.tsx index a6091eb8..a6b75985 100644 --- a/ensawards.org/data/apps/okx-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/okx-exchange/benchmarks/index.tsx @@ -43,6 +43,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(OKXExchange, benchmarks); diff --git a/ensawards.org/data/apps/okx-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/okx-wallet/benchmarks/index.tsx index ee54ee01..e54d4915 100644 --- a/ensawards.org/data/apps/okx-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/okx-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(OKXWallet, benchmarks); diff --git a/ensawards.org/data/apps/phantom-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/phantom-wallet/benchmarks/index.tsx index ec4ad451..7f57dd5a 100644 --- a/ensawards.org/data/apps/phantom-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/phantom-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(PhantomWallet, benchmarks); diff --git a/ensawards.org/data/apps/rabby-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/rabby-wallet/benchmarks/index.tsx index 17ddf6ca..6153a36c 100644 --- a/ensawards.org/data/apps/rabby-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/rabby-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(RabbyWallet, benchmarks); diff --git a/ensawards.org/data/apps/rainbow-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/rainbow-wallet/benchmarks/index.tsx index 7ae5f55c..34f54534 100644 --- a/ensawards.org/data/apps/rainbow-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/rainbow-wallet/benchmarks/index.tsx @@ -85,6 +85,16 @@ const benchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(RainbowWallet, benchmarks); diff --git a/ensawards.org/data/apps/readyx-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/readyx-wallet/benchmarks/index.tsx index 57e3fa58..72d62ffc 100644 --- a/ensawards.org/data/apps/readyx-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/readyx-wallet/benchmarks/index.tsx @@ -53,6 +53,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(ReadyXWallet, benchmarks); diff --git a/ensawards.org/data/apps/robinhood-exchange/benchmarks/index.tsx b/ensawards.org/data/apps/robinhood-exchange/benchmarks/index.tsx index 4bb2de11..6d97372f 100644 --- a/ensawards.org/data/apps/robinhood-exchange/benchmarks/index.tsx +++ b/ensawards.org/data/apps/robinhood-exchange/benchmarks/index.tsx @@ -51,6 +51,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(RobinhoodExchange, benchmarks); diff --git a/ensawards.org/data/apps/robinhood-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/robinhood-wallet/benchmarks/index.tsx index ed9df402..1f8991b5 100644 --- a/ensawards.org/data/apps/robinhood-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/robinhood-wallet/benchmarks/index.tsx @@ -53,6 +53,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, }; defineAppBenchmarks(RobinhoodWallet, benchmarks); diff --git a/ensawards.org/data/apps/safe-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/safe-wallet/benchmarks/index.tsx index 2b625b4d..c4207f1e 100644 --- a/ensawards.org/data/apps/safe-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/safe-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(SafeWallet, benchmarks); diff --git a/ensawards.org/data/apps/status-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/status-wallet/benchmarks/index.tsx index 4c401951..f0cbcd50 100644 --- a/ensawards.org/data/apps/status-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/status-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(StatusWallet, benchmarks); diff --git a/ensawards.org/data/apps/trust-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/trust-wallet/benchmarks/index.tsx index 93221171..7a63f9f3 100644 --- a/ensawards.org/data/apps/trust-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/trust-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(TrustWallet, benchmarks); diff --git a/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx b/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx index fa6684af..b915e5b8 100644 --- a/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx +++ b/ensawards.org/data/apps/uniswap-defi/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(UniswapDeFi, benchmarks); diff --git a/ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx index f7d1aca2..ab2a63f5 100644 --- a/ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/walletchan-wallet/benchmarks/index.tsx @@ -83,6 +83,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(WalletChanWallet, benchmarks); diff --git a/ensawards.org/data/apps/worldapp-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/worldapp-wallet/benchmarks/index.tsx index 0534606b..3e4cb542 100644 --- a/ensawards.org/data/apps/worldapp-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/worldapp-wallet/benchmarks/index.tsx @@ -61,6 +61,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(WorldWallet, benchmarks); diff --git a/ensawards.org/data/apps/zerion-wallet/benchmarks/index.tsx b/ensawards.org/data/apps/zerion-wallet/benchmarks/index.tsx index 8185f4e4..76066fee 100644 --- a/ensawards.org/data/apps/zerion-wallet/benchmarks/index.tsx +++ b/ensawards.org/data/apps/zerion-wallet/benchmarks/index.tsx @@ -47,6 +47,16 @@ const benchmarks: BestPracticeBenchmarks = { ), } as const satisfies AcceptanceTestBenchmark, }, + "deposit-addresses": { + "correctly-resolve-direct-onchain-subname-address": undefined, + "correctly-resolve-names-requiring-normalization": undefined, + "correctly-implement-ccip-read-for-eth-subnames": undefined, + "correctly-implement-ccip-read-for-offchain-dns-names": undefined, + "correctly-resolve-names-for-different-evm-chains": undefined, + "correctly-resolve-names-for-bitcoin": undefined, + "correctly-resolve-names-for-solana": undefined, + "correctly-handle-resolution-for-chains-with-invalid-address-formatting": undefined, + }, } as const satisfies BestPracticeBenchmarks; defineAppBenchmarks(ZerionWallet, benchmarks); diff --git a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/technicalDetails.tsx index e8f4164e..e0a9bb59 100644 --- a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/technicalDetails.tsx +++ b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-l2-chains/technicalDetails.tsx @@ -102,7 +102,7 @@ const benefitFromUsingEns = (
); -const useCaseSummary = ( +const ensBestPracticeOverview = (ENSIP-19 enables primary names to be set on any chain. Contracts deployed to an L2 chain benefit from this, as the contract can then configure its name directly on the chain it is deployed to @@ -150,7 +150,7 @@ const acceptanceTest1 = { } as const satisfies AcceptanceTest; const technicalDetails = { - useCaseSummary, + ensBestPracticeOverview, benefitFromUsingEns, implementationRecommendations, acceptanceTests: [acceptanceTest1], diff --git a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/technicalDetails.tsx index e75aad28..4ed1ac98 100644 --- a/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/technicalDetails.tsx +++ b/ensawards.org/data/ens-best-practices/contract-naming/display-named-smart-contracts-mainnet/technicalDetails.tsx @@ -99,7 +99,7 @@ const benefitFromUsingEns = (
); -const useCaseSummary = ( +const ensBestPracticeOverview = (If a contract has an ENS name, you can use its ENS profile to power additional UX improvements such as avatars, metadata, audit information, and more. More information can be found at the{" "} @@ -151,7 +151,7 @@ const acceptanceTest1 = { } as const satisfies AcceptanceTest; const technicalDetails = { - useCaseSummary, + ensBestPracticeOverview, benefitFromUsingEns, implementationRecommendations, acceptanceTests: [acceptanceTest1], diff --git a/ensawards.org/data/ens-best-practices/contract-naming/name-your-smart-contracts/technicalDetails.tsx b/ensawards.org/data/ens-best-practices/contract-naming/name-your-smart-contracts/technicalDetails.tsx index b00a0a5b..d1fc3c05 100644 --- a/ensawards.org/data/ens-best-practices/contract-naming/name-your-smart-contracts/technicalDetails.tsx +++ b/ensawards.org/data/ens-best-practices/contract-naming/name-your-smart-contracts/technicalDetails.tsx @@ -15,7 +15,7 @@ import enscribelookupAcceptanceTestImage from "./images/enscribe-lookup-example. // TODO: The content isn't fully curated for now. -const useCaseSummary = ( +const ensBestPracticeOverview = (
+ When an app needs its users to identify a particular address on a particular chain where an + action should be taken (such as a transfer or deposit), ENS offers the possibility of a better + user experience. Instead of forcing users to enter a long string of hexadecimal digits, with + ENS, users can have the option of entering a simple name such as{" "} + vitalik.eth. ENS can then be + used to translate this input name into the relevant deposit address, such as + + 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 + + . This process of determining the deposit address for a name is an example of what is called + "resolution". +
++ This best practice checks that your app correctly resolves ENS names to the correct address + and chain for different contexts. +
++ The simplest way to get this right—and to continuously and automatically stay up to date with + all ENS best practices even as ENS keeps evolving—is to use the{" "} + + ENS Omnigraph API + {" "} + (powered by{" "} + + ENSNode + + ) which handles the implementation details of ENS resolution for you. The implementation + recommendations below cover how your engineering team can adopt it, or other supported + options. +
+
+ Apps that fail to correctly implement ENS resolution fail their users and erode trust in
+ important ways. Failure to integrate ENS at all damages the user experience of the app and
+ exposes users to key risks such as{" "}
+
+ address poisoning attacks
+
+ .
+
+
+ If ENS resolution is integrated, but not according to all ENS best practices, then it can cause
+ big issues. For example, deposits may silently be sent to the wrong address and be irrecoverably
+ lost. Or only a subset of ENS names might be properly supported which damages the network
+ effects and market distribution of ENS.
+
There are a few ways to make sure your app's ENS resolution follows all best practices.
++ 1. Take full responsibility yourself. +
++ One option is to take the full responsibility for implementing all of these details correctly + yourself and continuously and rigorously testing your app for continued compliance. +
++ 2. Use the ENS Omnigraph API (recommended). +
++ Another, more highly recommended option is to simply perform your ENS resolutions through the{" "} + + ENS Omnigraph API + {" "} + (powered by{" "} + + ENSNode + + ). +
++ Fetch your ENS data through the ENS Omnigraph API and everything just works. It's a single + typed GraphQL API over both ENSv1 and ENSv2 for every chain and offchain names too. It also + handles the indexed ENS data your app reads (e.g. the names an address owns, profiles, + histories, etc.), with resolutions accelerated by{" "} + + Protocol Acceleration + + . Drop it in with{" "} + + enssdk + {" "} + (TypeScript) or{" "} + + enskit + {" "} + (React). +
++ The baseline test for supporting ENS resolution of deposit addresses is to test with an + onchain direct subname of .eth (such as {vitalikEnsNameSpan}) where the name is input in + fully normalized form and the context for resolving the deposit address is on the Ethereum + Mainnet chain. +
++ An app passes this test when it resolves the Ethereum Mainnet address of + {vitalikEnsNameSpan} to {vitalikAddressSpan}. +
++ An app fails this test when it does not accept ENS names at all as input or fails to + correctly resolve the Ethereum Mainnet address of {vitalikEnsNameSpan} to anything other + than the correct value ({vitalikAddressSpan}). +
++ This variation of the baseline test changes the input name to{" "} + {ethereumUnnormalizedEnsNameSpan}. +
++ This acceptance test verifies correct implementation of ENS name normalization and input + validation rules. This name is valid for input as an ENS name. It is not ENS normalized but + it is ENS normalizable. +
++ An app passes this test when it correctly normalizes the input name from{" "} + {ethereumUnnormalizedEnsNameSpan} to {ethereumNormalizedEnsNameSpan} and then resolves the + Ethereum Mainnet address of {ethereumNormalizedEnsNameSpan} to {ethereumAddressSpan}. +
++ An app fails this test when it does not accept normalizable ENS names such as{" "} + {ethereumUnnormalizedEnsNameSpan} as input or fails to correctly normalize this input to{" "} + {ethereumNormalizedEnsNameSpan} or fails to correctly resolve this input to anything other + than the correct value ({ethereumAddressSpan}). +
++ This variation of the baseline test changes the input name to {jesseBaseEnsNameSpan}. +
++ This acceptance test verifies correct implementation of CCIP-read for a subname nested + beneath .eth. +
++ An app passes this test when it correctly resolves the Ethereum Mainnet address of{" "} + {jesseBaseEnsNameSpan} to {jesseBaseAddressSpan}. +
++ An app fails this test when it does not accept ENS names such as {jesseBaseEnsNameSpan} as + input or fails to correctly resolve this input to anything other than the correct value ( + {jesseBaseAddressSpan}). +
++ This variation of the baseline test changes the input name to {dperriComEnsNameSpan}. +
++ This acceptance test verifies correct implementation of CCIP-read for DNS names that have + not been imported onchain but are still valid ENS names. +
++ An app passes this test when it correctly resolves the Ethereum Mainnet address of{" "} + {dperriComEnsNameSpan} to {dperriComAddressSpan}. +
++ An app fails this test when it does not accept ENS names such as {dperriComEnsNameSpan} as + input or fails to correctly resolve this input to anything other than the correct value ( + {dperriComAddressSpan}). +
++ This variation of the baseline test makes two changes: (1) the input name changes to{" "} + {lightkeeperEnsNameSpan} and (2) the context of the resolution changes from Ethereum Mainnet + to another EVM chain (the Base chain that's operated by Coinbase). +
++ This acceptance test verifies correct implementation of resolving the address for a name in + the context of different EVM chains. +
++ An app passes this test when it correctly resolves the Base chain address of{" "} + {lightkeeperEnsNameSpan} to {lightkeeperAddressSpan}. +
++ An app fails this test when it does not accept ENS names such as {lightkeeperEnsNameSpan}{" "} + as input or fails to correctly resolve this input to anything other than the correct value + ({lightkeeperAddressSpan}). +
++ This variation of the baseline test makes two changes: (1) the input name changes to{" "} + {gregskrilEnsNameSpan} and (2) the context of the resolution changes from Ethereum Mainnet + to the non-EVM chain Bitcoin. +
++ This acceptance test verifies correct implementation of resolving the address for a name in + the context of a non-EVM chain such as Bitcoin. +
++ An app passes this test when it correctly resolves the Bitcoin address of{" "} + {gregskrilEnsNameSpan} to {gregskrilAddressBitcoinSpan}. +
++ An app fails this test when it does not accept ENS names such as {gregskrilEnsNameSpan} as + input when sending to non-EVM chains such as Bitcoin or fails to correctly resolve this + input to anything other than the correct value ({gregskrilAddressBitcoinSpan}). +
++ This variation of the baseline test makes two changes: (1) the input name changes to{" "} + {gregskrilEnsNameSpan} and (2) the context of the resolution changes from Ethereum Mainnet + to the non-EVM chain Solana. +
++ This acceptance test verifies correct implementation of resolving the address for a name in + the context of a non-EVM chain such as Solana. +
++ An app passes this test when it correctly resolves the Solana address of{" "} + {gregskrilEnsNameSpan} to {gregskrilAddressSolanaSpan}. +
++ An app fails this test when it does not accept ENS names such as {gregskrilEnsNameSpan} as + input when sending to non-EVM chains such as Solana or fails to correctly resolve this + input to anything other than the correct value ({gregskrilAddressSolanaSpan}). +
++ This variation of the baseline test makes two changes: (1) the input name changes to{" "} + {zissouEnsNameSpan} and (2) the context of the resolution changes from Ethereum Mainnet to + the EVM chain Base. +
++ This acceptance test verifies correct implementation of resolving the address for a name on + an EVM chain that is not formatted as a valid EVM address (not a 20-byte hex value), instead + resolving to {zissouAddressSpan}. +
++ An app passes this test so long as it gracefully handles the resolved address being an + invalid EVM address. Here we define gracefully as not breaking the overall user + experience. +
++ An app fails this test if the resolution of an invalid EVM address is not handled + gracefully and breaks the overall user experience. +
+
ENS is upgrading to{" "}
@@ -163,7 +164,7 @@ const implementationRecommendations = (
If your app makes its own low-level RPC calls instead of using the Omnigraph or a helper
library like viem, point your resolution RPC calls at ENS's new stable Universal Resolver
proxy (
-
+
0xeeeeeeee14d718c2b47d9923deab1335e144eeee
) rather than hardcoding a specific Universal Resolver implementation. Because ENS controls
@@ -189,11 +190,9 @@ const acceptanceTest1 = {
To check whether an app has ENSv2 ready resolution, resolve the name{" "}
-
- ur.integration-tests.eth
- {" "}
- and verify it resolves to the correct address,{" "}
-
+ ur.integration-tests.eth and
+ verify it resolves to the correct address,{" "}
+
0x2222222222222222222222222222222222222222
.
@@ -213,11 +212,9 @@ const acceptanceTest1 = {
Rabby Wallet
{" "}
resolves the name{" "}
-
- ur.integration-tests.eth
- {" "}
+ ur.integration-tests.eth{" "}
to the correct address:
-
+
0x2222222222222222222222222222222222222222
.
@@ -239,11 +236,9 @@ const acceptanceTest1 = {
An app that is NOT ENSv2 ready resolves the name{" "}
-
- ur.integration-tests.eth
- {" "}
+ ur.integration-tests.eth{" "}
to an invalid address such as:{" "}
-
+
0x1111111111111111111111111111111111111111
.
@@ -272,10 +267,8 @@ const acceptanceTest1 = {
Mock use case summary Mock implementation recommendations Mock benefit from using ENS
Therefore, any app that currently doesn’t support ENS resolution at all is classified as
-
- Not Applicable
- {" "}
- for this best practice.
+ Not Applicable for this
+ best practice.
Mock use case summary,
+ ensBestPracticeOverview:
ENS best practice benchmark report
- ENS best practice overview
-