From 69e6ba49824049858d52615e7fc8929f02f0deb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Von=C3=A1=C5=A1ek?= Date: Wed, 26 Jun 2024 14:42:56 +0200 Subject: [PATCH 1/6] Nova Wallet EVM --- .../web3-connect/wallets/NovaWalletEvm.ts | 22 +++++++++++++++++++ src/sections/web3-connect/wallets/index.ts | 8 +++++++ src/utils/metamask.ts | 13 ++++++++++- 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/sections/web3-connect/wallets/NovaWalletEvm.ts diff --git a/src/sections/web3-connect/wallets/NovaWalletEvm.ts b/src/sections/web3-connect/wallets/NovaWalletEvm.ts new file mode 100644 index 000000000..05089982d --- /dev/null +++ b/src/sections/web3-connect/wallets/NovaWalletEvm.ts @@ -0,0 +1,22 @@ +import NovaWalletLogo from "assets/icons/NovaWallet.svg" + +import { MetaMask } from "./MetaMask" +import { isNovaWalletEvm } from "utils/metamask" + +export class NovaWalletEvm extends MetaMask { + extensionName = "nova-wallet-evm" + title = "Nova Wallet EVM" + installUrl = "https://novawallet.io" + logo = { + src: NovaWalletLogo, + alt: "Nova Wallet Logo", + } + + get installed() { + return isNovaWalletEvm(window.ethereum) + } + + get rawExtension() { + return window.ethereum + } +} diff --git a/src/sections/web3-connect/wallets/index.ts b/src/sections/web3-connect/wallets/index.ts index f50819849..28936907d 100644 --- a/src/sections/web3-connect/wallets/index.ts +++ b/src/sections/web3-connect/wallets/index.ts @@ -10,6 +10,7 @@ import { H160, isEvmAddress } from "utils/evm" import { SubWalletEvm } from "sections/web3-connect/wallets/SubWalletEvm" import { SubWallet } from "sections/web3-connect/wallets/SubWallet" import { EIP6963AnnounceProviderEvent } from "sections/web3-connect/types" +import { NovaWalletEvm } from "sections/web3-connect/wallets/NovaWalletEvm" export enum WalletProviderType { MetaMask = "metamask", @@ -19,6 +20,7 @@ export enum WalletProviderType { SubwalletEvm = "subwallet-evm", PolkadotJS = "polkadot-js", NovaWallet = "nova-wallet", + NovaWalletEvm = "nova-wallet-evm", Phantom = "phantom", Enkrypt = "enkrypt", WalletConnect = "walletconnect", @@ -54,6 +56,11 @@ const onMetaMaskLikeAccountChange = } const novaWallet: Wallet = new NovaWallet() +const novaWalletEvm: Wallet = new NovaWalletEvm({ + onAccountsChanged: onMetaMaskLikeAccountChange( + WalletProviderType.NovaWalletEvm, + ), +}) const talismanEvm: Wallet = new TalismanEvm({ onAccountsChanged: onMetaMaskLikeAccountChange( WalletProviderType.TalismanEvm, @@ -95,6 +102,7 @@ export let SUPPORTED_WALLET_PROVIDERS: WalletProvider[] = [ subwalletEvm, subwallet, novaWallet, + novaWalletEvm, walletConnect, externalWallet, ].map((wallet) => ({ diff --git a/src/utils/metamask.ts b/src/utils/metamask.ts index ab4e3b365..b5f1bd34b 100644 --- a/src/utils/metamask.ts +++ b/src/utils/metamask.ts @@ -6,7 +6,12 @@ import UniversalProvider from "@walletconnect/universal-provider/dist/types/Univ import { chainsMap } from "@galacticcouncil/xcm-cfg" import { EvmParachain } from "@galacticcouncil/xcm-core" -const METAMASK_LIKE_CHECKS = ["isTalisman", "isSubWallet", "isPhantom"] as const +const METAMASK_LIKE_CHECKS = [ + "isTalisman", + "isSubWallet", + "isPhantom", + "isNovaWallet", +] as const type MetaMaskLikeChecksValues = (typeof METAMASK_LIKE_CHECKS)[number] type MetaMaskLikeChecks = { @@ -76,6 +81,12 @@ export function isPhantom(provider: Maybe) { return isMetaMaskLike(provider) && !!provider?.isPhantom } +export function isNovaWalletEvm( + provider: Maybe, +): provider is Required { + return isMetaMaskLike(provider) && !!provider?.isNovaWallet +} + export function isEthereumProvider( provider: Maybe, ): provider is Required { From cc65149fbd220e591aec86ba3d1a778b89ba7c2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Von=C3=A1=C5=A1ek?= Date: Wed, 26 Jun 2024 14:58:14 +0200 Subject: [PATCH 2/6] configure nova wallet evm --- src/sections/web3-connect/constants/providers.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sections/web3-connect/constants/providers.ts b/src/sections/web3-connect/constants/providers.ts index dc325118a..f9addd2cb 100644 --- a/src/sections/web3-connect/constants/providers.ts +++ b/src/sections/web3-connect/constants/providers.ts @@ -9,6 +9,7 @@ export const MOBILE_PROVIDERS: WalletProviderType[] = [ WalletProviderType.Phantom, WalletProviderType.Enkrypt, WalletProviderType.NovaWallet, + WalletProviderType.NovaWalletEvm, WalletProviderType.WalletConnect, ] @@ -28,6 +29,7 @@ export const EVM_PROVIDERS: WalletProviderType[] = [ WalletProviderType.MetaMask, WalletProviderType.TalismanEvm, WalletProviderType.SubwalletEvm, + WalletProviderType.NovaWalletEvm, WalletProviderType.Phantom, WalletProviderType.WalletConnect, ] From 3cf4911e6d6bd6979886bb9fe31cd183229f7b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Von=C3=A1=C5=A1ek?= Date: Wed, 26 Jun 2024 22:13:24 +0200 Subject: [PATCH 3/6] display only Nova Wallet providers inside app browser --- .../web3-connect/constants/providers.ts | 5 +++++ .../providers/Web3ConnectProviders.tsx | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/sections/web3-connect/constants/providers.ts b/src/sections/web3-connect/constants/providers.ts index f9addd2cb..8ed27d225 100644 --- a/src/sections/web3-connect/constants/providers.ts +++ b/src/sections/web3-connect/constants/providers.ts @@ -43,6 +43,11 @@ export const SUBSTRATE_PROVIDERS: WalletProviderType[] = [ WalletProviderType.WalletConnect, ] +export const NOVA_WALLET_PROVIDERS: WalletProviderType[] = [ + WalletProviderType.NovaWallet, + WalletProviderType.NovaWalletEvm, +] + export const ALTERNATIVE_PROVIDERS: WalletProviderType[] = [ WalletProviderType.ExternalWallet, ] diff --git a/src/sections/web3-connect/providers/Web3ConnectProviders.tsx b/src/sections/web3-connect/providers/Web3ConnectProviders.tsx index fd391eac2..e38eacb79 100644 --- a/src/sections/web3-connect/providers/Web3ConnectProviders.tsx +++ b/src/sections/web3-connect/providers/Web3ConnectProviders.tsx @@ -18,6 +18,7 @@ import { DESKTOP_PROVIDERS, EVM_PROVIDERS, MOBILE_PROVIDERS, + NOVA_WALLET_PROVIDERS, SUBSTRATE_PROVIDERS, } from "sections/web3-connect/constants/providers" import { POLKADOT_CAIP_ID_MAP } from "sections/web3-connect/wallets/WalletConnect" @@ -25,6 +26,18 @@ import { POLKADOT_CAIP_ID_MAP } from "sections/web3-connect/wallets/WalletConnec const useWalletProviders = (mode: WalletMode, chain?: string) => { const isDesktop = useMedia(theme.viewport.gte.sm) + const context = useMemo(() => { + const wallets = getSupportedWallets() + const isNovaWallet = wallets.some( + ({ type, wallet }) => + NOVA_WALLET_PROVIDERS.includes(type) && wallet.installed, + ) + + return { + isNovaWallet, + } + }, []) + return useMemo(() => { const wallets = getSupportedWallets() @@ -35,6 +48,9 @@ const useWalletProviders = (mode: WalletMode, chain?: string) => { const defaultProviders = wallets .filter((provider) => { if (isEvmMode) return EVM_PROVIDERS.includes(provider.type) + if (context.isNovaWallet) + return NOVA_WALLET_PROVIDERS.includes(provider.type) + const byScreen = isDesktop ? DESKTOP_PROVIDERS.includes(provider.type) : MOBILE_PROVIDERS.includes(provider.type) @@ -68,7 +84,7 @@ const useWalletProviders = (mode: WalletMode, chain?: string) => { defaultProviders, alternativeProviders, } - }, [isDesktop, mode, chain]) + }, [mode, context, isDesktop, chain]) } export const Web3ConnectProviders = () => { From d5addd78e546a90d5fedf0664e3fcf0b0d0bb0dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Von=C3=A1=C5=A1ek?= Date: Fri, 28 Jun 2024 12:12:55 +0200 Subject: [PATCH 4/6] removed wallet providers by context --- .../web3-connect/constants/providers.ts | 5 ----- .../providers/Web3ConnectProviders.tsx | 17 +---------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/src/sections/web3-connect/constants/providers.ts b/src/sections/web3-connect/constants/providers.ts index 8ed27d225..f9addd2cb 100644 --- a/src/sections/web3-connect/constants/providers.ts +++ b/src/sections/web3-connect/constants/providers.ts @@ -43,11 +43,6 @@ export const SUBSTRATE_PROVIDERS: WalletProviderType[] = [ WalletProviderType.WalletConnect, ] -export const NOVA_WALLET_PROVIDERS: WalletProviderType[] = [ - WalletProviderType.NovaWallet, - WalletProviderType.NovaWalletEvm, -] - export const ALTERNATIVE_PROVIDERS: WalletProviderType[] = [ WalletProviderType.ExternalWallet, ] diff --git a/src/sections/web3-connect/providers/Web3ConnectProviders.tsx b/src/sections/web3-connect/providers/Web3ConnectProviders.tsx index e38eacb79..bd143c74b 100644 --- a/src/sections/web3-connect/providers/Web3ConnectProviders.tsx +++ b/src/sections/web3-connect/providers/Web3ConnectProviders.tsx @@ -18,7 +18,6 @@ import { DESKTOP_PROVIDERS, EVM_PROVIDERS, MOBILE_PROVIDERS, - NOVA_WALLET_PROVIDERS, SUBSTRATE_PROVIDERS, } from "sections/web3-connect/constants/providers" import { POLKADOT_CAIP_ID_MAP } from "sections/web3-connect/wallets/WalletConnect" @@ -26,18 +25,6 @@ import { POLKADOT_CAIP_ID_MAP } from "sections/web3-connect/wallets/WalletConnec const useWalletProviders = (mode: WalletMode, chain?: string) => { const isDesktop = useMedia(theme.viewport.gte.sm) - const context = useMemo(() => { - const wallets = getSupportedWallets() - const isNovaWallet = wallets.some( - ({ type, wallet }) => - NOVA_WALLET_PROVIDERS.includes(type) && wallet.installed, - ) - - return { - isNovaWallet, - } - }, []) - return useMemo(() => { const wallets = getSupportedWallets() @@ -48,8 +35,6 @@ const useWalletProviders = (mode: WalletMode, chain?: string) => { const defaultProviders = wallets .filter((provider) => { if (isEvmMode) return EVM_PROVIDERS.includes(provider.type) - if (context.isNovaWallet) - return NOVA_WALLET_PROVIDERS.includes(provider.type) const byScreen = isDesktop ? DESKTOP_PROVIDERS.includes(provider.type) @@ -84,7 +69,7 @@ const useWalletProviders = (mode: WalletMode, chain?: string) => { defaultProviders, alternativeProviders, } - }, [mode, context, isDesktop, chain]) + }, [mode, isDesktop, chain]) } export const Web3ConnectProviders = () => { From d5f762a208542eee4c1b222752651ee67323a416 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Von=C3=A1=C5=A1ek?= Date: Fri, 28 Jun 2024 12:38:52 +0200 Subject: [PATCH 5/6] reset external account param only when its present in url --- src/sections/web3-connect/accounts/Web3ConnectEvmAccount.tsx | 5 +++-- .../web3-connect/accounts/Web3ConnectSubstrateAccount.tsx | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/sections/web3-connect/accounts/Web3ConnectEvmAccount.tsx b/src/sections/web3-connect/accounts/Web3ConnectEvmAccount.tsx index f664156aa..206eb7ae2 100644 --- a/src/sections/web3-connect/accounts/Web3ConnectEvmAccount.tsx +++ b/src/sections/web3-connect/accounts/Web3ConnectEvmAccount.tsx @@ -1,4 +1,4 @@ -import { useNavigate } from "@tanstack/react-location" +import { useNavigate, useSearch } from "@tanstack/react-location" import { Button } from "components/Button/Button" import { DisplayValue } from "components/DisplayValue/DisplayValue" import { Text } from "components/Typography/Text/Text" @@ -18,6 +18,7 @@ export const Web3ConnectEvmAccount: FC< const { account: currentAccount, setAccount, toggle } = useWeb3ConnectStore() const { wallet } = useWallet() const navigate = useNavigate() + const search = useSearch() const isActive = currentAccount?.address === account.address @@ -33,7 +34,7 @@ export const Web3ConnectEvmAccount: FC< onClick={() => { setAccount(account) toggle() - navigate({ search: { account: undefined } }) + if (search.account) navigate({ search: { account: undefined } }) }} >
= ({ balance, ...account }) => { const { account: currentAccount, setAccount, toggle } = useWeb3ConnectStore() const navigate = useNavigate() + const search = useSearch() const isActive = currentAccount?.address === account.address return ( @@ -18,7 +19,7 @@ export const Web3ConnectSubstrateAccount: React.FC< onClick={(account) => { setAccount(account) toggle() - navigate({ search: { account: undefined } }) + if (search.account) navigate({ search: { account: undefined } }) }} /> ) From ed77bc7366d1a14b0beea3dcef82034da6e96f21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Von=C3=A1=C5=A1ek?= Date: Fri, 28 Jun 2024 13:10:31 +0200 Subject: [PATCH 6/6] set correct button type --- .../web3-connect/providers/Web3ConnectProviderButton.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sections/web3-connect/providers/Web3ConnectProviderButton.tsx b/src/sections/web3-connect/providers/Web3ConnectProviderButton.tsx index bfea257cf..fe1d90a01 100644 --- a/src/sections/web3-connect/providers/Web3ConnectProviderButton.tsx +++ b/src/sections/web3-connect/providers/Web3ConnectProviderButton.tsx @@ -44,7 +44,7 @@ export const Web3ConnectProviderButton: FC = ({ type, wallet }) => { } return ( - + {logo.alt} {title}