diff --git a/.github/ISSUE_TEMPLATE/suggest_wallet.yaml b/.github/ISSUE_TEMPLATE/suggest_wallet.yaml index 09b81f914fd..3ef58b7c5e7 100644 --- a/.github/ISSUE_TEMPLATE/suggest_wallet.yaml +++ b/.github/ISSUE_TEMPLATE/suggest_wallet.yaml @@ -6,7 +6,7 @@ body: - type: markdown attributes: value: | - Before suggesting a wallet, make sure you've read [our listing policy](https://www.ethereum.org/contributing/adding-wallets/). Only continue with the issue if the wallet meets the criteria listed there. For any required questions, please answer N/A for any questions not applicable to your wallet. This form is very comprehensive, and if you feel like you can't answer all the questions, please reach out to the wallet provider to fill out this template. + Before suggesting a wallet, make sure you've read [our listing policy](https://www.ethereum.org/contributing/adding-wallets/). Only continue with the issue if the wallet meets the criteria listed there. For any required questions, please answer N/A for any questions not applicable to your wallet. This form is very comprehensive, and if you feel like you can't answer all the questions, please reach out to the wallet provider to fill out this template. - type: markdown id: project_info attributes: @@ -24,7 +24,8 @@ body: label: What type of wallet? options: - "EOA" - - "Account Abstraction" + - "Smart Account (EIP-4337)" + - "EOA with Smart Features (EIP-7702)" - "Smart contract" validations: required: true @@ -293,7 +294,7 @@ body: id: wallet_eip_1559_support attributes: label: Does the wallet support EIP-1559 (type 2) transactions? - description: Does your wallet support EIP-1559 (type 2) transactions for Ethereum Mainnet. Please provide information on the type of transactions this wallet supports. If this is not applicable, please explain. + description: Does your wallet support EIP-1559 (type 2) transactions for Ethereum Mainnet. Please provide information on the type of transactions this wallet supports. If this is not applicable, please explain. validations: required: true - type: textarea @@ -342,6 +343,26 @@ body: description: Please provide any documentation on bundled transactions validations: required: true + - type: dropdown + id: wallet_eip_4337_support + attributes: + label: Does the wallet support Smart Accounts (EIP-4337)? + description: Smart contract wallets with features like gas sponsorship, social recovery, and custom authentication + options: + - "Yes" + - "No" + validations: + required: true + - type: dropdown + id: wallet_eip_7702_support + attributes: + label: Does the wallet support Account Upgrades (EIP-7702)? + description: Allows EOA accounts to temporarily use smart contract features + options: + - "Yes" + - "No" + validations: + required: true - type: markdown id: support attributes: diff --git a/package.json b/package.json index 804590a0d63..ca15488c548 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "humanize-duration": "^3.33.1", "i18n-iso-countries": "^7.14.0", "lodash": "^4.18.1", - "lucide-react": "^0.516.0", + "lucide-react": "^1.12.0", "motion": "^12.36.0", "next": "^16.2.3", "next-intl": "^4.9.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 096f2e0930e..584390c610d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -157,8 +157,8 @@ importers: specifier: ^4.18.1 version: 4.18.1 lucide-react: - specifier: ^0.516.0 - version: 0.516.0(react@19.2.4) + specifier: ^1.12.0 + version: 1.12.0(react@19.2.4) motion: specifier: ^12.36.0 version: 12.36.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -7152,8 +7152,8 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -8678,8 +8678,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-react@0.516.0: - resolution: {integrity: sha512-aybBJzLHcw1CIn3rUcRkztB37dsJATtpffLNX+0/w+ws2p21nYIlOwX/B5fqxq8F/BjqVemnJX8chKwRidvROg==} + lucide-react@1.12.0: + resolution: {integrity: sha512-rTKR3RN6HIAxdNZALoPvqxd64vjL9nTThU0JF9q1Qg8yUnmo1r+d8baN72YNVK3RGxUmzBzbd77IWJq/fkm+Xw==} peerDependencies: react: ^19.2.4 @@ -9657,6 +9657,10 @@ packages: resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.12: + resolution: {integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==} + engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -14121,7 +14125,7 @@ snapshots: '@chromaui/rrweb-snapshot@2.0.0-alpha.18-noAbsolute': dependencies: - postcss: 8.5.10 + postcss: 8.5.12 optional: true '@clack/core@0.5.0': @@ -21002,7 +21006,7 @@ snapshots: es-module-lexer@1.7.0: {} - es-module-lexer@2.0.0: + es-module-lexer@2.1.0: optional: true es-object-atoms@1.1.1: @@ -22775,7 +22779,7 @@ snapshots: dependencies: yallist: 3.1.1 - lucide-react@0.516.0(react@19.2.4): + lucide-react@1.12.0(react@19.2.4): dependencies: react: 19.2.4 @@ -24087,6 +24091,13 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.12: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + optional: true + postgres-array@2.0.0: {} postgres-bytea@1.0.0: {} @@ -26234,7 +26245,7 @@ snapshots: browserslist: 4.28.2 chrome-trace-event: 1.0.4 enhanced-resolve: 5.21.0 - es-module-lexer: 2.0.0 + es-module-lexer: 2.1.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 diff --git a/src/components/FindWalletProductTable/hooks/useWalletFilters.tsx b/src/components/FindWalletProductTable/hooks/useWalletFilters.tsx index 5bbf4b52cfe..d9c5f7320af 100644 --- a/src/components/FindWalletProductTable/hooks/useWalletFilters.tsx +++ b/src/components/FindWalletProductTable/hooks/useWalletFilters.tsx @@ -1,4 +1,5 @@ import { useRef } from "react" +import { Brain, LayersPlus } from "lucide-react" import { useLocale } from "next-intl" import { FilterOption } from "@/lib/types" @@ -6,28 +7,7 @@ import { FilterOption } from "@/lib/types" import FindWalletLanguageSelectInput from "@/components/FindWalletProductTable/FindWalletLanguageSelectInput" import Layer2SelectInput from "@/components/FindWalletProductTable/Layer2SelectInput" import PrivacyIcon from "@/components/icons/privacy.svg" -import { - BrowserIcon, - BuyCryptoIcon, - ConnectDappsIcon, - DesktopIcon, - ENSSupportIcon, - ERC20SupportIcon, - GasFeeCustomizationIcon, - HardwareIcon, - HardwareSupportIcon, - Layer2Icon, - MobileIcon, - MultisigIcon, - NFTSupportIcon, - NonCustodialIcon, - OpenSourceWalletIcon, - RPCImportingIcon, - SocialRecoverIcon, - StakingIcon, - SwapIcon, - WithdrawCryptoIcon, -} from "@/components/icons/wallets" +import * as icon from "@/components/icons/wallets" import CheckboxFilterInput from "@/components/ProductTable/FilterInputs/CheckboxFilterInput" import SwitchFilterInput from "@/components/ProductTable/FilterInputs/SwitchFilterInput" @@ -54,7 +34,7 @@ export const useWalletFilters = (): FilterOption[] => { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { }, options: [], }, + { + filterKey: "eip_4337_support", + filterLabel: t("page-find-wallet-smart-accounts"), + description: t("page-find-wallet-smart-accounts-desc"), + inputState: false, + input: (filterIndex, itemIndex, inputState, updateFilterState) => { + return ( + { + trackCustomEvent({ + eventCategory: "WalletFilterSidebar", + eventAction: `${locale} - ${t("page-find-wallet-smart-accounts")}`, + eventName: `eip_4337_support ${newInputState}`, + }) + updateFilterState(filterIndex, itemIndex, newInputState) + }} + /> + ) + }, + options: [], + }, + { + filterKey: "eip_7702_support", + filterLabel: t("page-find-wallet-account-upgrades"), + description: t("page-find-wallet-account-upgrades-desc"), + inputState: false, + input: (filterIndex, itemIndex, inputState, updateFilterState) => { + return ( + { + trackCustomEvent({ + eventCategory: "WalletFilterSidebar", + eventAction: `${locale} - ${t("page-find-wallet-account-upgrades")}`, + eventName: `eip_7702_support ${newInputState}`, + }) + updateFilterState(filterIndex, itemIndex, newInputState) + }} + /> + ) + }, + options: [], + }, ], }, { @@ -918,7 +952,7 @@ export const useWalletFilters = (): FilterOption[] => { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( { input: (filterIndex, itemIndex, inputState, updateFilterState) => { return ( > + Icon?: React.FC> | LucideIcon label: string description?: string | ReactElement filterIndex: number @@ -32,7 +33,9 @@ const SwitchFilterInput = ({
- {Icon && } + {Icon && ( + + )}

{label}

diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index ab2e7f155f4..97e51003a33 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -446,6 +446,7 @@ export const walletsData: WalletData[] = [ withdraw_crypto: true, multisig: false, social_recovery: false, + eip_7702_support: true, onboard_documentation: "https://support.metamask.io", documentation: "https://docs.metamask.io/", supported_chains: [ @@ -502,6 +503,7 @@ export const walletsData: WalletData[] = [ withdraw_crypto: false, multisig: true, social_recovery: true, + eip_4337_support: true, onboard_documentation: "https://docs.safe.global/", documentation: "https://docs.safe.global/", supported_chains: [ @@ -637,6 +639,7 @@ export const walletsData: WalletData[] = [ withdraw_crypto: false, multisig: false, social_recovery: false, + eip_4337_support: true, onboard_documentation: "https://help.ambire.com/hc/en-us/categories/4404980091538-Ambire-Wallet", documentation: "", @@ -941,6 +944,7 @@ export const walletsData: WalletData[] = [ withdraw_crypto: false, multisig: false, social_recovery: false, + eip_7702_support: true, onboard_documentation: "https://docs.pillarx.app/", documentation: "https://docs.pillarx.app/", supported_chains: [ @@ -1326,6 +1330,7 @@ export const walletsData: WalletData[] = [ withdraw_crypto: false, multisig: false, social_recovery: false, + eip_7702_support: true, onboard_documentation: "https://learn.rainbow.me/", documentation: "", supported_chains: [ @@ -1783,6 +1788,7 @@ export const walletsData: WalletData[] = [ withdraw_crypto: true, multisig: false, social_recovery: false, + eip_7702_support: true, onboard_documentation: "https://study.bitkeep.com/en/", documentation: "https://docs.bitkeep.com/en/docs/guide/", supported_chains: [ @@ -2154,6 +2160,7 @@ export const walletsData: WalletData[] = [ withdraw_crypto: true, multisig: false, social_recovery: false, + eip_7702_support: true, onboard_documentation: "https://community.trustwallet.com/", documentation: "https://developer.trustwallet.com/developer/", supported_chains: [ @@ -2814,6 +2821,7 @@ export const walletsData: WalletData[] = [ withdraw_crypto: true, multisig: false, social_recovery: false, + eip_7702_support: true, onboard_documentation: "https://support.nu.fi/", documentation: "https://support.nu.fi/", supported_chains: [ @@ -2914,6 +2922,7 @@ export const walletsData: WalletData[] = [ withdraw_crypto: true, multisig: false, social_recovery: false, + eip_7702_support: true, onboard_documentation: "https://support.uniswap.org/hc/en-us/categories/11301970439565-Uniswap-Wallet", documentation: "https://docs.uniswap.org/", diff --git a/src/intl/en/page-wallets-find-wallet.json b/src/intl/en/page-wallets-find-wallet.json index 0982b3a1892..74b51b72b72 100644 --- a/src/intl/en/page-wallets-find-wallet.json +++ b/src/intl/en/page-wallets-find-wallet.json @@ -86,6 +86,10 @@ "page-find-wallet-empty-results-desc": "There are no wallets matching your criteria, try removing some filters.", "page-find-wallet-privacy": "Privacy", "page-find-wallet-privacy-desc": "Wallets that support built-in private transactions", + "page-find-wallet-smart-accounts": "Smart accounts", + "page-find-wallet-smart-accounts-desc": "Use a smart contract as your wallet account. Pay gas fees with tokens other than ETH, recover your wallet if you lose your keys, and bundle multiple actions into one transaction.", + "page-find-wallet-account-upgrades": "Account upgrades", + "page-find-wallet-account-upgrades-desc": "Add smart features to your existing account. Keep your existing address while gaining abilities like batched transactions and sponsored gas fees.", "page-find-wallet-see-wallets": "See wallets", "page-find-wallet-search-languages": "Search languages...", "page-find-wallet-methodology-title": "How we evaluate wallets", diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 27b4c82674a..e42649e62ab 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -98,6 +98,8 @@ export const WALLETS_FILTERS_DEFAULT = { withdraw_crypto: false, multisig: false, social_recovery: false, + eip_4337_support: false, + eip_7702_support: false, new_to_crypto: false, } diff --git a/src/lib/types.ts b/src/lib/types.ts index 46a2d290001..57625789077 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -834,6 +834,8 @@ export type WalletData = { withdraw_crypto: boolean multisig: boolean social_recovery: boolean + eip_4337_support?: boolean + eip_7702_support?: boolean onboard_documentation: string documentation: string mpc?: boolean