From 5516a0f15d5bf04bc9d6544048acbcc9aa0bbf73 Mon Sep 17 00:00:00 2001 From: babkenmes Date: Tue, 18 Feb 2025 14:55:41 +0400 Subject: [PATCH 1/5] Fixed metamask chain sync --- Models/WalletProvider.ts | 1 + .../Wallet/WalletTransfer/TransferToken.tsx | 17 +- .../Withdraw/Wallet/WalletTransfer/index.tsx | 12 +- components/WalletProviders/Wagmi.tsx | 5 +- lib/wallets/connectors/EthereumProvider.ts | 1 + lib/wallets/connectors/argent/index.ts | 1 + lib/wallets/connectors/bitget/index.ts | 3 +- lib/wallets/connectors/metamask/index.ts | 487 ++++++++++++++++++ lib/wallets/connectors/rainbow/index.ts | 1 + lib/wallets/evm/useEVM.ts | 8 +- package.json | 2 +- yarn.lock | 82 +-- 12 files changed, 561 insertions(+), 59 deletions(-) create mode 100644 lib/wallets/connectors/metamask/index.ts diff --git a/Models/WalletProvider.ts b/Models/WalletProvider.ts index c2794f09b..b2a6a3b2e 100644 --- a/Models/WalletProvider.ts +++ b/Models/WalletProvider.ts @@ -23,6 +23,7 @@ export type Wallet = { starknetAccount?: AccountInterface, wallet?: StarknetWindowObject, l1Address?: string, + deepLink?: string } chainId?: string | number, isLoading?: boolean, diff --git a/components/Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx b/components/Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx index dc942014e..a0a0ebb60 100644 --- a/components/Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx +++ b/components/Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx @@ -1,6 +1,7 @@ import { FC, useCallback, useEffect, useState } from "react"; import { useAccount, + useConfig, useSendTransaction } from "wagmi"; import { parseEther } from 'viem' @@ -15,6 +16,7 @@ import { ButtonWrapper } from "./buttons"; import { useSwapTransactionStore } from "../../../../../stores/swapTransactionStore"; import { useSwapDataState } from "../../../../../context/swap"; import { datadogRum } from "@datadog/browser-rum"; +import { isMobile } from "../../../../../lib/openLink"; const TransferTokenButton: FC = ({ depositAddress, @@ -35,7 +37,7 @@ const TransferTokenButton: FC = ({ const { depositActionsResponse } = useSwapDataState() const callData = depositActionsResponse?.find(da => true)?.call_data as `0x${string}` | undefined - + const config = useConfig() const transaction = useSendTransaction() useEffect(() => { @@ -72,7 +74,8 @@ const TransferTokenButton: FC = ({ console.error(e.message) } }, [transaction?.data, swapId]) - + const [clientChain, setClientChain] = useState() + const [connection, setConnection] = useState() const clickHandler = useCallback(async () => { setButtonClicked(true) try { @@ -90,16 +93,20 @@ const TransferTokenButton: FC = ({ value: parseEther(amount?.toString()), gas: estimatedGas, data: callData, - account: selectedSourceAccount.address + account: selectedSourceAccount.address as `0x${string}` + } + if (isMobile() && selectedSourceAccount.wallet.metadata?.deepLink) { + window.location.href = selectedSourceAccount.wallet.metadata?.deepLink + await new Promise(resolve => setTimeout(resolve, 100)) } - transaction?.sendTransaction(tx as any) + transaction?.sendTransaction(tx) } catch (e) { const error = new Error(e) error.name = "TransferTokenError" error.cause = e datadogRum.addError(error); } - }, [transaction, estimatedGas, depositAddress, amount, callData]) + }, [transaction, estimatedGas, depositAddress, amount, callData, config, chainId]) const isError = transaction.isError return
diff --git a/components/Swap/Withdraw/Wallet/WalletTransfer/index.tsx b/components/Swap/Withdraw/Wallet/WalletTransfer/index.tsx index a4fcfdaaf..9b21f4629 100644 --- a/components/Swap/Withdraw/Wallet/WalletTransfer/index.tsx +++ b/components/Swap/Withdraw/Wallet/WalletTransfer/index.tsx @@ -56,12 +56,12 @@ const TransferFromWallet: FC = ({ if (!isConnected || !wallet) { return } - else if (activeChain?.id !== networkChainId && network) { - return - } + // else if (activeChain?.id !== networkChainId && network) { + // return + // } else { return string order?: number, isAvailable?: boolean, + deepLink?: string, } export interface ProviderRpcError extends Error { diff --git a/lib/wallets/connectors/argent/index.ts b/lib/wallets/connectors/argent/index.ts index ebcf51104..35d445eb3 100644 --- a/lib/wallets/connectors/argent/index.ts +++ b/lib/wallets/connectors/argent/index.ts @@ -112,6 +112,7 @@ export function argent(parameters: WalletConnectParameters) { return ({ id: 'argent', name: 'Argent', + deepLink: 'argent://wc', resolveURI: (uri: string) => { return (isAndroid() || !isMobile()) ? uri diff --git a/lib/wallets/connectors/bitget/index.ts b/lib/wallets/connectors/bitget/index.ts index dc51ff04f..59e932d3d 100644 --- a/lib/wallets/connectors/bitget/index.ts +++ b/lib/wallets/connectors/bitget/index.ts @@ -112,7 +112,8 @@ export function bitget(parameters: WalletConnectParameters) { id: 'bitget', name: 'BitGet', rdns: 'com.bitget.web3', - getUri: (uri: string) => { + deepLink: 'bitkeep://bkconnect', + resolveURI: (uri: string) => { return isAndroid() ? uri : `bitkeep://wc?uri=${encodeURIComponent(uri)}`; diff --git a/lib/wallets/connectors/metamask/index.ts b/lib/wallets/connectors/metamask/index.ts new file mode 100644 index 000000000..87b8db032 --- /dev/null +++ b/lib/wallets/connectors/metamask/index.ts @@ -0,0 +1,487 @@ +import { + ChainNotConfiguredError, + type Connector, + ProviderNotFoundError, + createConnector, + extractRpcUrls, +} from '@wagmi/core' +import type { Compute, ExactPartial, Omit } from '@wagmi/core/internal' +import type { EthereumProvider } from '@walletconnect/ethereum-provider' +import { + type AddEthereumChainParameter, + type Address, + type ProviderConnectInfo, + type ProviderRpcError, + type RpcError, + SwitchChainError, + UserRejectedRequestError, + getAddress, + numberToHex, +} from 'viem' +import { getInjectedConnector, hasInjectedProvider } from '../getInjectedConnector' +import { isAndroid, isIOS } from '../utils/isMobile' + +type WalletConnectConnector = Connector & { + onDisplayUri(uri: string): void + onSessionDelete(data: { topic: string }): void +} + +type EthereumProviderOptions = Parameters<(typeof EthereumProvider)['init']>[0] + +export type WalletConnectParameters = Compute< + { + /** + * If a new chain is added to a previously existing configured connector `chains`, this flag + * will determine if that chain should be considered as stale. A stale chain is a chain that + * WalletConnect has yet to establish a relationship with (e.g. the user has not approved or + * rejected the chain). + * + * This flag mainly affects the behavior when a wallet does not support dynamic chain authorization + * with WalletConnect v2. + * + * If `true` (default), the new chain will be treated as a stale chain. If the user + * has yet to establish a relationship (approved/rejected) with this chain in their WalletConnect + * session, the connector will disconnect upon the dapp auto-connecting, and the user will have to + * reconnect to the dapp (revalidate the chain) in order to approve the newly added chain. + * This is the default behavior to avoid an unexpected error upon switching chains which may + * be a confusing user experience (e.g. the user will not know they have to reconnect + * unless the dapp handles these types of errors). + * + * If `false`, the new chain will be treated as a potentially valid chain. This means that if the user + * has yet to establish a relationship with the chain in their WalletConnect session, wagmi will successfully + * auto-connect the user. This comes with the trade-off that the connector will throw an error + * when attempting to switch to the unapproved chain if the wallet does not support dynamic session updates. + * This may be useful in cases where a dapp constantly + * modifies their configured chains, and they do not want to disconnect the user upon + * auto-connecting. If the user decides to switch to the unapproved chain, it is important that the + * dapp handles this error and prompts the user to reconnect to the dapp in order to approve + * the newly added chain. + * + * @default true + */ + isNewChainsStale?: boolean + } & Omit< + EthereumProviderOptions, + | 'chains' + | 'events' + | 'optionalChains' + | 'optionalEvents' + | 'optionalMethods' + | 'methods' + | 'rpcMap' + | 'showQrModal' + > & + ExactPartial> +> + +export function metaMask(parameters: WalletConnectParameters) { + const isMetaMaskInjected = hasInjectedProvider({ flag: 'isMetaMask' }); + const shouldUseWalletConnect = !isMetaMaskInjected; + return shouldUseWalletConnect ? walletConnect(parameters) : getInjectedConnector({ flag: 'isMetaMask' })({ id: 'metaMaskSDK', name: 'My Metamask' }); +} + +walletConnect.type = 'metamask' as const +export function walletConnect(parameters: WalletConnectParameters) { + const isNewChainsStale = parameters.isNewChainsStale ?? true + + type Provider = Awaited> + type Properties = { + connect(parameters?: { + chainId?: number | undefined + isReconnecting?: boolean | undefined + pairingTopic?: string | undefined + }): Promise<{ + accounts: readonly Address[] + chainId: number + }> + getNamespaceChainsIds(): number[] + getRequestedChainsIds(): Promise + isChainsStale(): Promise + onConnect(connectInfo: ProviderConnectInfo): void + onDisplayUri(uri: string): void + onSessionDelete(data: { topic: string }): void + setRequestedChainsIds(chains: number[]): void + requestedChainsStorageKey: `${string}.requestedChains` + } + type StorageItem = { + [_ in Properties['requestedChainsStorageKey']]: number[] + } + + let provider_: Provider | undefined + let providerPromise: Promise + const NAMESPACE = 'eip155' + + let accountsChanged: WalletConnectConnector['onAccountsChanged'] | undefined + let chainChanged: WalletConnectConnector['onChainChanged'] | undefined + let connect: WalletConnectConnector['onConnect'] | undefined + let displayUri: WalletConnectConnector['onDisplayUri'] | undefined + let sessionDelete: WalletConnectConnector['onSessionDelete'] | undefined + let disconnect: WalletConnectConnector['onDisconnect'] | undefined + + return createConnector((config) => ({ + //wltcnnct + id: 'metaMask', + name: 'MetaMask', + rdns: 'io.metamask', + type: walletConnect.type, + deepLink: 'metamask://wc', + resolveURI: (uri: string) => { + return isAndroid() + ? uri + : isIOS() + ? // currently broken in MetaMask v6.5.0 https://github.com/MetaMask/metamask-mobile/issues/6457 + `metamask://wc?uri=${encodeURIComponent(uri)}` + : `https://metamask.app.link/wc?uri=${encodeURIComponent(uri)}`; + }, + async setup() { + const provider = await this.getProvider().catch(() => null) + if (!provider) return + if (!connect) { + connect = this.onConnect.bind(this) + provider.on('connect', connect) + } + if (!sessionDelete) { + sessionDelete = this.onSessionDelete.bind(this) + provider.on('session_delete', sessionDelete) + } + }, + async connect({ chainId, ...rest } = {} as any) { + try { + const provider = await this.getProvider() + if (!provider) throw new ProviderNotFoundError() + if (!displayUri) { + displayUri = this.onDisplayUri + provider.on('display_uri', displayUri) + } + + let targetChainId = chainId + if (!targetChainId) { + const state = (await config.storage?.getItem('state')) ?? {} + const isChainSupported = config.chains.some( + (x) => x.id === state.chainId, + ) + if (isChainSupported) targetChainId = state.chainId + else targetChainId = config.chains[0]?.id + } + if (!targetChainId) throw new Error('No chains found on connector.') + + const isChainsStale = await this.isChainsStale() + // If there is an active session with stale chains, disconnect current session. + if (provider.session && isChainsStale) await provider.disconnect() + + // If there isn't an active session or chains are stale, connect. + if (!provider.session || isChainsStale) { + const optionalChains = config.chains + .filter((chain) => chain.id !== targetChainId) + .map((optionalChain) => optionalChain.id) + await provider.connect({ + optionalChains: [targetChainId, ...optionalChains], + ...('pairingTopic' in rest + ? { pairingTopic: rest.pairingTopic } + : {}), + }) + + this.setRequestedChainsIds(config.chains.map((x) => x.id)) + } + + // If session exists and chains are authorized, enable provider for required chain + const accounts = (await provider.enable()).map((x) => getAddress(x)) + const currentChainId = await this.getChainId() + + if (displayUri) { + provider.removeListener('display_uri', displayUri) + displayUri = undefined + } + if (connect) { + provider.removeListener('connect', connect) + connect = undefined + } + if (!accountsChanged) { + accountsChanged = this.onAccountsChanged.bind(this) + provider.on('accountsChanged', accountsChanged) + } + if (!chainChanged) { + chainChanged = this.onChainChanged.bind(this) + provider.on('chainChanged', chainChanged) + } + if (!disconnect) { + disconnect = this.onDisconnect.bind(this) + provider.on('disconnect', disconnect) + } + if (!sessionDelete) { + sessionDelete = this.onSessionDelete.bind(this) + provider.on('session_delete', sessionDelete) + } + + return { accounts, chainId: currentChainId } + } catch (error) { + if ( + /(user rejected|connection request reset)/i.test( + (error as ProviderRpcError)?.message, + ) + ) { + throw new UserRejectedRequestError(error as Error) + } + throw error + } + }, + async disconnect() { + const provider = await this.getProvider() + try { + await provider?.disconnect() + } catch (error) { + if (!/No matching key/i.test((error as Error).message)) throw error + } finally { + if (chainChanged) { + provider?.removeListener('chainChanged', chainChanged) + chainChanged = undefined + } + if (disconnect) { + provider?.removeListener('disconnect', disconnect) + disconnect = undefined + } + if (!connect) { + connect = this.onConnect.bind(this) + provider?.on('connect', connect) + } + if (accountsChanged) { + provider?.removeListener('accountsChanged', accountsChanged) + accountsChanged = undefined + } + if (sessionDelete) { + provider?.removeListener('session_delete', sessionDelete) + sessionDelete = undefined + } + + this.setRequestedChainsIds([]) + } + }, + async getAccounts() { + const provider = await this.getProvider() + return provider.accounts.map((x) => getAddress(x)) + }, + async getProvider({ chainId } = {}) { + async function initProvider() { + const optionalChains = config.chains.map((x) => x.id) as [number] + if (!optionalChains.length) return + const { EthereumProvider } = await import( + '@walletconnect/ethereum-provider' + ) + return await EthereumProvider.init({ + ...parameters, + disableProviderPing: true, + optionalChains, + projectId: parameters.projectId, + rpcMap: Object.fromEntries( + config.chains.map((chain) => { + const [url] = extractRpcUrls({ + chain, + transports: config.transports, + }) + return [chain.id, url] + }), + ), + showQrModal: parameters.showQrModal ?? true, + }) + } + + if (!provider_) { + if (!providerPromise) providerPromise = initProvider() + provider_ = await providerPromise + provider_?.events.setMaxListeners(Number.POSITIVE_INFINITY) + } + if (chainId) await this.switchChain?.({ chainId }) + return provider_! + }, + async getChainId() { + const provider = await this.getProvider() + return provider.chainId + }, + async isAuthorized() { + try { + const [accounts, provider] = await Promise.all([ + this.getAccounts(), + this.getProvider(), + ]) + + // If an account does not exist on the session, then the connector is unauthorized. + if (!accounts.length) return false + + // If the chains are stale on the session, then the connector is unauthorized. + const isChainsStale = await this.isChainsStale() + if (isChainsStale && provider.session) { + await provider.disconnect().catch(() => { }) + return false + } + return true + } catch { + return false + } + }, + async switchChain({ addEthereumChainParameter, chainId }) { + const provider = await this.getProvider() + if (!provider) throw new ProviderNotFoundError() + + const chain = config.chains.find((x) => x.id === chainId) + if (!chain) throw new SwitchChainError(new ChainNotConfiguredError()) + + try { + await Promise.all([ + new Promise((resolve) => { + const listener = ({ + chainId: currentChainId, + }: { chainId?: number | undefined }) => { + if (currentChainId === chainId) { + config.emitter.off('change', listener) + resolve() + } + } + config.emitter.on('change', listener) + }), + provider.request({ + method: 'wallet_switchEthereumChain', + params: [{ chainId: numberToHex(chainId) }], + }), + ]) + + const requestedChains = await this.getRequestedChainsIds() + this.setRequestedChainsIds([...requestedChains, chainId]) + + return chain + } catch (err) { + const error = err as RpcError + + if (/(user rejected)/i.test(error.message)) + throw new UserRejectedRequestError(error) + + // Indicates chain is not added to provider + try { + let blockExplorerUrls: string[] | undefined + if (addEthereumChainParameter?.blockExplorerUrls) + blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls + else + blockExplorerUrls = chain.blockExplorers?.default.url + ? [chain.blockExplorers?.default.url] + : [] + + let rpcUrls: readonly string[] + if (addEthereumChainParameter?.rpcUrls?.length) + rpcUrls = addEthereumChainParameter.rpcUrls + else rpcUrls = [...chain.rpcUrls.default.http] + + const addEthereumChain = { + blockExplorerUrls, + chainId: numberToHex(chainId), + chainName: addEthereumChainParameter?.chainName ?? chain.name, + iconUrls: addEthereumChainParameter?.iconUrls, + nativeCurrency: + addEthereumChainParameter?.nativeCurrency ?? chain.nativeCurrency, + rpcUrls, + } satisfies AddEthereumChainParameter + + await provider.request({ + method: 'wallet_addEthereumChain', + params: [addEthereumChain], + }) + + const requestedChains = await this.getRequestedChainsIds() + this.setRequestedChainsIds([...requestedChains, chainId]) + return chain + } catch (error) { + throw new UserRejectedRequestError(error as Error) + } + } + }, + onAccountsChanged(accounts) { + if (accounts.length === 0) this.onDisconnect() + else + config.emitter.emit('change', { + accounts: accounts.map((x) => getAddress(x)), + }) + }, + onChainChanged(chain) { + const chainId = Number(chain) + config.emitter.emit('change', { chainId }) + }, + async onConnect(connectInfo) { + const chainId = Number(connectInfo.chainId) + const accounts = await this.getAccounts() + config.emitter.emit('connect', { accounts, chainId }) + }, + async onDisconnect(_error) { + this.setRequestedChainsIds([]) + config.emitter.emit('disconnect') + + const provider = await this.getProvider() + if (accountsChanged) { + provider.removeListener('accountsChanged', accountsChanged) + accountsChanged = undefined + } + if (chainChanged) { + provider.removeListener('chainChanged', chainChanged) + chainChanged = undefined + } + if (disconnect) { + provider.removeListener('disconnect', disconnect) + disconnect = undefined + } + if (sessionDelete) { + provider.removeListener('session_delete', sessionDelete) + sessionDelete = undefined + } + if (!connect) { + connect = this.onConnect.bind(this) + provider.on('connect', connect) + } + }, + onDisplayUri(uri) { + config.emitter.emit('message', { type: 'display_uri', data: uri }) + }, + onSessionDelete() { + this.onDisconnect() + }, + getNamespaceChainsIds() { + if (!provider_) return [] + const chainIds = provider_.session?.namespaces[NAMESPACE]?.accounts?.map( + (account) => Number.parseInt(account.split(':')[1] || ''), + ) + return chainIds ?? [] + }, + async getRequestedChainsIds() { + return ( + (await config.storage?.getItem(this.requestedChainsStorageKey)) ?? [] + ) + }, + /** + * Checks if the target chains match the chains that were + * initially requested by the connector for the WalletConnect session. + * If there is a mismatch, this means that the chains on the connector + * are considered stale, and need to be revalidated at a later point (via + * connection). + * + * There may be a scenario where a dapp adds a chain to the + * connector later on, however, this chain will not have been approved or rejected + * by the wallet. In this case, the chain is considered stale. + */ + async isChainsStale() { + if (!isNewChainsStale) return false + + const connectorChains = config.chains.map((x) => x.id) + const namespaceChains = this.getNamespaceChainsIds() + if ( + namespaceChains.length && + !namespaceChains.some((id) => connectorChains.includes(id)) + ) + return false + + const requestedChains = await this.getRequestedChainsIds() + return !connectorChains.every((id) => requestedChains.includes(id)) + }, + async setRequestedChainsIds(chains) { + await config.storage?.setItem(this.requestedChainsStorageKey, chains) + }, + get requestedChainsStorageKey() { + return `${this.id}.requestedChains` as Properties['requestedChainsStorageKey'] + }, + })) +} \ No newline at end of file diff --git a/lib/wallets/connectors/rainbow/index.ts b/lib/wallets/connectors/rainbow/index.ts index 184373d2f..665c7bb28 100644 --- a/lib/wallets/connectors/rainbow/index.ts +++ b/lib/wallets/connectors/rainbow/index.ts @@ -119,6 +119,7 @@ export function walletConnect(parameters: WalletConnectParameters) { id: 'rainbow', name: 'Rainbow', rdns: 'rainbow', + deepLink: 'rainbow://wc', resolveURI: (uri: string) => { return isAndroid() ? uri diff --git a/lib/wallets/evm/useEVM.ts b/lib/wallets/evm/useEVM.ts index e0be55cd2..88f87633c 100644 --- a/lib/wallets/evm/useEVM.ts +++ b/lib/wallets/evm/useEVM.ts @@ -274,13 +274,12 @@ const ResolveWallet = (props: ResolveWalletProps): Wallet | undefined => { const connector = connection?.connector if (!connector) return undefined - const address = accountIsActive ? activeAddress : addresses?.[0] if (!address) return undefined const walletname = `${connector?.name} ${connector.id === "com.immutable.passport" ? "" : " - EVM"}` - const wallet = { + const wallet: Wallet = { id: connector.name, isActive: accountIsActive, address, @@ -293,7 +292,10 @@ const ResolveWallet = (props: ResolveWalletProps): Wallet | undefined => { asSourceSupportedNetworks: resolveSupportedNetworks(supportedNetworks.asSource, connector.id), autofillSupportedNetworks: resolveSupportedNetworks(supportedNetworks.autofill, connector.id), withdrawalSupportedNetworks: resolveSupportedNetworks(supportedNetworks.withdrawal, connector.id), - networkIcon: networks.find(n => connector?.id === "com.immutable.passport" ? immutableZKEvm.some(name => name === n.name) : ethereumNames.some(name => name === n.name))?.logo + networkIcon: networks.find(n => connector?.id === "com.immutable.passport" ? immutableZKEvm.some(name => name === n.name) : ethereumNames.some(name => name === n.name))?.logo, + metadata: { + deepLink: (connector as LSConnector).deepLink + } } return wallet diff --git a/package.json b/package.json index b676bc2a1..dfd2e3e65 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "uuid": "^9.0.0", "vaul": "^1.1.0", "viem": "^2.21.16", - "wagmi": "^2.12.16", + "wagmi": "2.14.11", "web-encoding": "^1.1.5", "web3": "1.8.0", "zksync": "0.13.1", diff --git a/yarn.lock b/yarn.lock index 0e3635111..52813ed7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1782,10 +1782,10 @@ react-keyed-flatten-children "^3.0.0" ts-deepmerge "^6.2.0" -"@coinbase/wallet-sdk@4.2.3": - version "4.2.3" - resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-4.2.3.tgz#a30fa0605b24bc42c37f52a62d2442bcbb7734af" - integrity sha512-BcyHZ/Ec84z0emORzqdXDv4P0oV+tV3a0OirfA8Ko1JGBIAVvB+hzLvZzCDvnuZx7MTK+Dd8Y9Tjlo446BpCIg== +"@coinbase/wallet-sdk@4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-4.3.0.tgz#03b8fce92ac2b3b7cf132f64d6008ac081569b4e" + integrity sha512-T3+SNmiCw4HzDm4we9wCHCxlP0pqCiwKe4sOwPH3YAK2KSKjxPRydKu6UQJrdONFVLG7ujXvbd/6ZqmvJb8rkw== dependencies: "@noble/hashes" "^1.4.0" clsx "^1.2.1" @@ -3784,10 +3784,10 @@ resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.2.tgz#bfac8c7a1a149b5bbfe98f59fbfea512dfa3bad4" integrity sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA== -"@metamask/sdk-communication-layer@0.31.0": - version "0.31.0" - resolved "https://registry.yarnpkg.com/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.31.0.tgz#0acc063b62aa09d044c7aab65801712d760e53b2" - integrity sha512-V9CxdzabDPjQVgmKGHsyU3SYt4Af27g+4DbGCx0fLoHqN/i1RBDZqs/LYbJX3ykJCANzE+llz/MolMCMrzM2RA== +"@metamask/sdk-communication-layer@0.32.0": + version "0.32.0" + resolved "https://registry.yarnpkg.com/@metamask/sdk-communication-layer/-/sdk-communication-layer-0.32.0.tgz#89710e807806836138ea5018b087731d6acab627" + integrity sha512-dmj/KFjMi1fsdZGIOtbhxdg3amxhKL/A5BqSU4uh/SyDKPub/OT+x5pX8bGjpTL1WPWY/Q0OIlvFyX3VWnT06Q== dependencies: bufferutil "^4.0.8" date-fns "^2.29.3" @@ -3795,23 +3795,23 @@ utf-8-validate "^5.0.2" uuid "^8.3.2" -"@metamask/sdk-install-modal-web@0.31.2": - version "0.31.2" - resolved "https://registry.yarnpkg.com/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.31.2.tgz#bb8c92a6844a632be8525e7bb5a35924a926d6cd" - integrity sha512-KPv36kQjmTwErU8g2neuHHSgkD5+1hp4D6ERfk5Kc2r73aOYNCdG9wDGRUmFmcY2MKkeK1EuDyZfJ4FPU30fxQ== +"@metamask/sdk-install-modal-web@0.32.0": + version "0.32.0" + resolved "https://registry.yarnpkg.com/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.32.0.tgz#86f80420ca364fa0d7710016fa5c81f95537ab23" + integrity sha512-TFoktj0JgfWnQaL3yFkApqNwcaqJ+dw4xcnrJueMP3aXkSNev2Ido+WVNOg4IIMxnmOrfAC9t0UJ0u/dC9MjOQ== dependencies: "@paulmillr/qr" "^0.2.1" -"@metamask/sdk@0.31.2": - version "0.31.2" - resolved "https://registry.yarnpkg.com/@metamask/sdk/-/sdk-0.31.2.tgz#2ec1c1c7cf6a444e65104862e83814a493047d72" - integrity sha512-6MWON2g1j7XwAHWam4trusGxeyhQweNLEHPsfuIxSwcsXoEm08Jj80OglJxQI4KwjcDnjSWBkQGG3mmK6ug/cA== +"@metamask/sdk@0.32.0": + version "0.32.0" + resolved "https://registry.yarnpkg.com/@metamask/sdk/-/sdk-0.32.0.tgz#f0e179746fe69dccd032a9026884b45b519c1975" + integrity sha512-WmGAlP1oBuD9hk4CsdlG1WJFuPtYJY+dnTHJMeCyohTWD2GgkcLMUUuvu9lO1/NVzuOoSi1OrnjbuY1O/1NZ1g== dependencies: "@babel/runtime" "^7.26.0" "@metamask/onboarding" "^1.0.1" "@metamask/providers" "16.1.0" - "@metamask/sdk-communication-layer" "0.31.0" - "@metamask/sdk-install-modal-web" "0.31.2" + "@metamask/sdk-communication-layer" "0.32.0" + "@metamask/sdk-install-modal-web" "0.32.0" "@paulmillr/qr" "^0.2.1" bowser "^2.9.0" cross-fetch "^4.0.0" @@ -5581,10 +5581,10 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz#427d5549943a9c6fce808e39ea64dbe60d4047f1" integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA== -"@safe-global/safe-apps-provider@0.18.4": - version "0.18.4" - resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.4.tgz#53df912aa20d933f6b14c5bcb0737a8cd47def57" - integrity sha512-SWYeG3gyTO6wGHMSokfHakZ9isByn2mHsM0VohIorYFFEyGGmJ89btnTm+DqDUSoQtvWAatZB7XNy6CaYMvqtg== +"@safe-global/safe-apps-provider@0.18.5": + version "0.18.5" + resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.5.tgz#745a932bda3739a8a298ae44ec6c465f6c4773b7" + integrity sha512-9v9wjBi3TwLsEJ3C2ujYoexp3pFJ0omDLH/GX91e2QB+uwCKTBYyhxFSrTQ9qzoyQd+bfsk4gjOGW87QcJhf7g== dependencies: "@safe-global/safe-apps-sdk" "^9.1.0" events "^3.3.0" @@ -10090,22 +10090,22 @@ tiny-invariant "^1.1.0" tiny-warning "^1.0.3" -"@wagmi/connectors@5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-5.6.1.tgz#948ca387916136501da80989f3eba351b0c6a595" - integrity sha512-6nGxKSDtT6udnrW21SPqP7gcaZFpyRAz7Ecf2DelYh5OHpGk/FBNB8mtB/w0AVSCH6XRIpVK81pO412pPBiEYg== +"@wagmi/connectors@5.7.7": + version "5.7.7" + resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-5.7.7.tgz#35fe03d69ca3f1494c0e97a758884e06e535eefd" + integrity sha512-hveKxuR35ZQQyteLo7aiN/TBVECYKVbLNTYGGgqzTNHJ8vVoblTP9PwPrRPGOPi5ji8raYSFWShxNK7QpGL+Kg== dependencies: - "@coinbase/wallet-sdk" "4.2.3" - "@metamask/sdk" "0.31.2" - "@safe-global/safe-apps-provider" "0.18.4" + "@coinbase/wallet-sdk" "4.3.0" + "@metamask/sdk" "0.32.0" + "@safe-global/safe-apps-provider" "0.18.5" "@safe-global/safe-apps-sdk" "9.1.0" "@walletconnect/ethereum-provider" "2.17.0" cbw-sdk "npm:@coinbase/wallet-sdk@3.9.3" -"@wagmi/core@2.16.0": - version "2.16.0" - resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-2.16.0.tgz#b997b2544cd80b4aac4df25ccb2436bf77f9fbe1" - integrity sha512-sy4n7Jv6YCbT2jp4zQ/9H6l0A8StsN7P8mm2BRuODgW2w6Fj4j6h2xgYJD2tIjJHkLU/nvPJ7audZ55X7XQU/g== +"@wagmi/core@2.16.4": + version "2.16.4" + resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-2.16.4.tgz#96f1a2803dbf3ca110938402bdf2d99ab8da638e" + integrity sha512-E4jY4A98gwuHCjzuEajHIG/WhNDY5BChVHMjflV9Bx5CO7COqYRG2dcRLuF6Bo0LQNvVvXDAFUwR2JShJnT5pA== dependencies: eventemitter3 "5.0.1" mipd "0.0.7" @@ -22761,7 +22761,7 @@ use-sync-external-store@1.2.2: resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== -use-sync-external-store@^1.2.0: +use-sync-external-store@1.4.0, use-sync-external-store@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc" integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== @@ -22948,14 +22948,14 @@ void-elements@3.1.0: resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== -wagmi@^2.12.16: - version "2.14.1" - resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-2.14.1.tgz#8c6e1e389f8dab7c21d1c91e3c2fba4815c4fbdb" - integrity sha512-Lq/UFJVorjwJlFjXbU+Jtfo64PObNfUCPtwgqi+q/WGBWzG7CL0xmCsB3wPc+YZYwD8O9OqFDHfcggUi0qwcGA== +wagmi@2.14.11: + version "2.14.11" + resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-2.14.11.tgz#bfdd479e88bb3907efb412d04b5135a0017d5090" + integrity sha512-Qj79cq+9MAcnKict9QLo60Lc4S2IXVVE94HBwCmczDrFtoM31NxfX4uQP73Elj2fV9lXH4/dw3jlb8eDhlm6iQ== dependencies: - "@wagmi/connectors" "5.6.1" - "@wagmi/core" "2.16.0" - use-sync-external-store "1.2.0" + "@wagmi/connectors" "5.7.7" + "@wagmi/core" "2.16.4" + use-sync-external-store "1.4.0" walker@^1.0.8: version "1.0.8" From cab312e0959c24b8f7950446a39094ca6f26229c Mon Sep 17 00:00:00 2001 From: babkenmes Date: Wed, 19 Feb 2025 18:10:15 +0400 Subject: [PATCH 2/5] Updated metamask id --- lib/wallets/connectors/metamask/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/wallets/connectors/metamask/index.ts b/lib/wallets/connectors/metamask/index.ts index 87b8db032..38d5aa8bc 100644 --- a/lib/wallets/connectors/metamask/index.ts +++ b/lib/wallets/connectors/metamask/index.ts @@ -119,8 +119,7 @@ export function walletConnect(parameters: WalletConnectParameters) { let disconnect: WalletConnectConnector['onDisconnect'] | undefined return createConnector((config) => ({ - //wltcnnct - id: 'metaMask', + id: 'io.metamask', name: 'MetaMask', rdns: 'io.metamask', type: walletConnect.type, From 0219af5c3666ee88471895fc2c85c8371f7092b5 Mon Sep 17 00:00:00 2001 From: babkenmes Date: Fri, 21 Feb 2025 15:23:31 +0400 Subject: [PATCH 3/5] Uncommented switch network --- .../Swap/Withdraw/Wallet/WalletTransfer/index.tsx | 12 ++++++------ lib/wallets/connectors/bitget/index.ts | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/components/Swap/Withdraw/Wallet/WalletTransfer/index.tsx b/components/Swap/Withdraw/Wallet/WalletTransfer/index.tsx index 9b21f4629..a4fcfdaaf 100644 --- a/components/Swap/Withdraw/Wallet/WalletTransfer/index.tsx +++ b/components/Swap/Withdraw/Wallet/WalletTransfer/index.tsx @@ -56,12 +56,12 @@ const TransferFromWallet: FC = ({ if (!isConnected || !wallet) { return } - // else if (activeChain?.id !== networkChainId && network) { - // return - // } + else if (activeChain?.id !== networkChainId && network) { + return + } else { return { return isAndroid() ? uri From 81d0f3d519ab2cc4da0dbae7ddd86033e5da9bff Mon Sep 17 00:00:00 2001 From: Babken Mesropyan Date: Fri, 21 Feb 2025 15:24:47 +0400 Subject: [PATCH 4/5] Update TransferToken.tsx --- .../Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/components/Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx b/components/Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx index a0a0ebb60..f349f484e 100644 --- a/components/Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx +++ b/components/Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx @@ -37,7 +37,6 @@ const TransferTokenButton: FC = ({ const { depositActionsResponse } = useSwapDataState() const callData = depositActionsResponse?.find(da => true)?.call_data as `0x${string}` | undefined - const config = useConfig() const transaction = useSendTransaction() useEffect(() => { @@ -169,4 +168,4 @@ const TransferTokenButton: FC = ({
} -export default TransferTokenButton \ No newline at end of file +export default TransferTokenButton From d9d84ce79b9b361e1240e8df9ddab304631a4245 Mon Sep 17 00:00:00 2001 From: Babken Mesropyan Date: Fri, 21 Feb 2025 15:25:12 +0400 Subject: [PATCH 5/5] Update TransferToken.tsx --- .../Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx b/components/Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx index f349f484e..5a31e5906 100644 --- a/components/Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx +++ b/components/Swap/Withdraw/Wallet/WalletTransfer/TransferToken.tsx @@ -105,7 +105,7 @@ const TransferTokenButton: FC = ({ error.cause = e datadogRum.addError(error); } - }, [transaction, estimatedGas, depositAddress, amount, callData, config, chainId]) + }, [transaction, estimatedGas, depositAddress, amount, callData, chainId]) const isError = transaction.isError return