From 90936cd376ccceb6dacbc9ac6126606ee623c844 Mon Sep 17 00:00:00 2001 From: wolyshaw Date: Sun, 20 Sep 2026 08:41:07 +0800 Subject: [PATCH 1/7] Support EVM accounts with existing walletconnect connector, #5533 --- .../components/login/web3/walletconnect.jsx | 25 +- .../components/wallet/walletConnectWallet.jsx | 4 +- packages/next-common/context/wagmi/index.jsx | 4 + .../context/wagmi/walletConnectEvm.js | 24 + .../context/walletconnect/index.jsx | 210 +- .../hooks/connect/useEVMWallets.js | 10 +- .../hooks/connect/useWalletConnectAccounts.js | 7 +- .../next-common/hooks/connect/useWeb3Login.js | 1 + packages/next-common/package.json | 1 + .../utils/consts/settings/hydradx.js | 3 +- .../utils/sendTransaction/sendEvmTx.js | 37 +- yarn.lock | 1900 +++++++++++++++-- 12 files changed, 1988 insertions(+), 238 deletions(-) create mode 100644 packages/next-common/context/wagmi/walletConnectEvm.js diff --git a/packages/next-common/components/login/web3/walletconnect.jsx b/packages/next-common/components/login/web3/walletconnect.jsx index b5856d1a7f..29b39194a6 100644 --- a/packages/next-common/components/login/web3/walletconnect.jsx +++ b/packages/next-common/components/login/web3/walletconnect.jsx @@ -12,19 +12,38 @@ import { toDataURL as QrcodeToDataURL } from "qrcode"; import { useEffect, useState } from "react"; import { useInterval, useUnmount } from "react-use"; import { Skeleton } from "next-common/components/skeleton"; +import { useDispatch } from "react-redux"; +import { newErrorToast } from "next-common/store/reducers/toastSlice"; const SIZE = 200; const REFRESH_QRCODE_INTERVAL = 4 * 60 * 1000; // 4 minutes export default function LoginWeb3WalletConnect() { const { setView } = useWeb3WalletView(); - const { connect, session, provider } = useWalletConnect(); + const { connect, session, provider, isEvmSession, connectEvm } = + useWalletConnect(); + const dispatch = useDispatch(); const [qrCode, setQrCode] = useState(null); const [uri, setUri] = useState(null); const [web3Login] = useWeb3Login(); const accounts = useWalletConnectAccounts(); const [refreshCount, setRefreshCount] = useState(0); + useEffect(() => { + if (!isEvmSession || !provider) { + return; + } + let active = true; + connectEvm() + .then(() => { + if (active) setView("evm"); + }) + .catch((error) => dispatch(newErrorToast(error.message))); + return () => { + active = false; + }; + }, [isEvmSession, provider, connectEvm, setView, dispatch]); + useEffect(() => { if (session) { return; @@ -57,7 +76,7 @@ export default function LoginWeb3WalletConnect() { }, [uri]); useEffect(() => { - if (accounts?.length) { + if (!isEvmSession && accounts?.length) { const account = accounts[0]; if (account) { @@ -67,7 +86,7 @@ export default function LoginWeb3WalletConnect() { }); } } - }, [accounts, web3Login]); + }, [accounts, web3Login, isEvmSession]); useUnmount(() => { if (provider) { diff --git a/packages/next-common/components/wallet/walletConnectWallet.jsx b/packages/next-common/components/wallet/walletConnectWallet.jsx index f9557925be..781252bc0c 100644 --- a/packages/next-common/components/wallet/walletConnectWallet.jsx +++ b/packages/next-common/components/wallet/walletConnectWallet.jsx @@ -5,7 +5,7 @@ import WalletOption from "./walletOption"; export default function WalletConnectWallet({ wallet, selected, onClick }) { const { setView } = useWeb3WalletView(); - const { provider, session } = useWalletConnect(); + const { provider, session, isEvmSession } = useWalletConnect(); return ( } title={wallet.title} onClick={() => { - if (session && onClick) { + if (session && !isEvmSession && onClick) { onClick?.(wallet); } else { setView("walletconnect"); diff --git a/packages/next-common/context/wagmi/index.jsx b/packages/next-common/context/wagmi/index.jsx index 90f3797bd6..6c2dab2ea8 100644 --- a/packages/next-common/context/wagmi/index.jsx +++ b/packages/next-common/context/wagmi/index.jsx @@ -8,6 +8,7 @@ import { WagmiProvider as Provider } from "wagmi"; import { http, createConfig } from "wagmi"; import { mainnet, base, darwinia, moonbeam, moonriver } from "wagmi/chains"; import { coinbaseWallet, injected } from "wagmi/connectors"; +import walletConnectEvm from "./walletConnectEvm"; const hydradx = compatWagmiChainConfig(hydradxSettings.ethereumNetwork); const centrifuge = compatWagmiChainConfig(centrifugeSettings.ethereumNetwork); @@ -31,6 +32,9 @@ export const wagmiConfig = createConfig({ ssr: true, connectors: [ injected(), + ...(process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID + ? [walletConnectEvm] + : []), coinbaseWallet({ appName: "subsquare", preference: { diff --git a/packages/next-common/context/wagmi/walletConnectEvm.js b/packages/next-common/context/wagmi/walletConnectEvm.js new file mode 100644 index 0000000000..91d50f23e4 --- /dev/null +++ b/packages/next-common/context/wagmi/walletConnectEvm.js @@ -0,0 +1,24 @@ +import { walletConnect } from "wagmi/connectors"; +import { CHAIN } from "next-common/utils/constants"; +import getChainSettings from "next-common/utils/consts/settings"; + +export default function walletConnectEvm(config) { + const { description, domain } = getChainSettings(CHAIN); + const url = + typeof window === "undefined" + ? `https://${domain || CHAIN}.subsquare.io` + : window.location.origin; + + return walletConnect({ + projectId: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID, + // Keep EVM sessions separate from the existing Polkadot provider. + customStoragePrefix: "subsquare-evm", + showQrModal: true, + metadata: { + name: "Subsquare", + description, + url, + icons: [`${url}/favicon.ico`], + }, + })(config); +} diff --git a/packages/next-common/context/walletconnect/index.jsx b/packages/next-common/context/walletconnect/index.jsx index 3cbf52b440..07a6146457 100644 --- a/packages/next-common/context/walletconnect/index.jsx +++ b/packages/next-common/context/walletconnect/index.jsx @@ -6,6 +6,8 @@ import { useCallback, useContext, useEffect, + useMemo, + useRef, useState, } from "react"; import { useConnectedAccountContext } from "../connectedAccount"; @@ -17,6 +19,9 @@ import { newWarningToast, } from "next-common/store/reducers/toastSlice"; import getChainSettings from "next-common/utils/consts/settings"; +import { connect as connectWagmi, getAccount } from "@wagmi/core"; +import { injected } from "wagmi/connectors"; +import { wagmiConfig } from "next-common/context/wagmi"; const projectId = process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID; @@ -33,6 +38,8 @@ export const defaultWalletConnect = { fetchAddresses: () => Promise.resolve([]), signWcMessage: () => Promise.resolve({ signature: "0x" }), signWcTx: () => Promise.resolve({ signature: "0x" }), + isEvmSession: false, + connectEvm: () => Promise.resolve(), }; const WalletConnectContext = createContext(defaultWalletConnect); @@ -54,33 +61,103 @@ function useWalletConnectChainId() { return caip ? `polkadot:${caip}` : null; } +let providerPromise; + async function initWalletConnectProvider() { - const { description, wallets } = getChainSettings(CHAIN); + const { description, wallets, domain } = getChainSettings(CHAIN); if (wallets?.walletconnect === false) { return defaultWalletConnect.provider; } - const provider = await UniversalProvider.init({ + const url = + window.location.origin || `https://${domain || CHAIN}.subsquare.io`; + providerPromise ??= UniversalProvider.init({ projectId, relayUrl, metadata: { name: "Subsquare", description, - url: `https://${CHAIN}.subsquare.io`, - icons: [`https://${CHAIN}.subsquare.io/favicon.ico`], + url, + icons: [`${url}/favicon.ico`], }, }); - return provider; + try { + return await providerPromise; + } catch (error) { + providerPromise = null; + throw error; + } } export default function WalletConnectProvider({ children }) { const dispatch = useDispatch(); - const { disconnect: disconnectAccount } = useConnectedAccountContext(); + const { disconnect: disconnectAccount, connectedAccount } = + useConnectedAccountContext(); const caip = useWalletConnectCaip(); const chainId = useWalletConnectChainId(); const [provider, setProvider] = useState(defaultWalletConnect.provider); const [session, setSession] = useState(defaultWalletConnect.session); + const pendingConnection = useRef(null); + const pendingEvmConnection = useRef(null); + const sessionAccounts = Object.values(session?.namespaces || {}).flatMap( + (namespace) => namespace.accounts || [], + ); + const isEvmSession = + !sessionAccounts.some((account) => account.startsWith("polkadot:")) && + sessionAccounts.some((account) => account.startsWith("eip155:")); + const evmConnector = useMemo( + () => + injected({ + shimDisconnect: false, + target: { + id: "walletConnectUniversal", + name: "WalletConnect", + provider: () => provider, + }, + }), + [provider], + ); + const connectEvm = useCallback(async () => { + if ( + !provider || + !isEvmSession || + provider.session?.topic !== session?.topic + ) { + throw new Error("No EVM WalletConnect session"); + } + const current = getAccount(wagmiConfig); + if ( + current.isConnected && + current.connector?.id === "walletConnectUniversal" + ) { + return; + } + pendingEvmConnection.current ??= connectWagmi(wagmiConfig, { + connector: evmConnector, + }).finally(() => { + pendingEvmConnection.current = null; + }); + return await pendingEvmConnection.current; + }, [provider, isEvmSession, evmConnector, session?.topic]); + + useEffect(() => { + if ( + isEvmSession && + provider && + provider.session?.topic === session?.topic && + connectedAccount?.connectorId === "walletConnectUniversal" + ) { + connectEvm().catch((error) => dispatch(newErrorToast(error.message))); + } + }, [ + provider, + session?.topic, + isEvmSession, + connectedAccount?.connectorId, + connectEvm, + dispatch, + ]); const [cachedSession, setCachedSession] = useLocalStorage( CACHE_KEY.walletConnectSession, @@ -106,42 +183,66 @@ export default function WalletConnectProvider({ children }) { if (provider) { return; } - initWalletConnectProvider().then(setProvider); - }, [provider]); + initWalletConnectProvider() + .then(setProvider) + .catch((error) => dispatch(newErrorToast(error.message))); + }, [provider, dispatch]); const connect = useCallback(async () => { if (!provider || !chainId) { return; } - return await provider.client - .connect({ - optionalNamespaces: { - polkadot: { - chains: [chainId], - methods: ["polkadot_signTransaction", "polkadot_signMessage"], - events: ["chainChanged", "accountsChanged"], + if (pendingConnection.current) { + return await pendingConnection.current; + } + + const chains = wagmiConfig.chains; + pendingConnection.current = new Promise((resolve) => { + const onDisplayUri = (uri) => resolve({ uri }); + provider.once("display_uri", onDisplayUri); + provider + .connect({ + optionalNamespaces: { + polkadot: { + chains: [chainId], + methods: ["polkadot_signTransaction", "polkadot_signMessage"], + events: ["chainChanged", "accountsChanged"], + }, + eip155: { + chains: chains.map((chain) => `eip155:${chain.id}`), + methods: [ + "personal_sign", + "eth_sendTransaction", + "eth_signTypedData_v4", + "wallet_addEthereumChain", + "wallet_switchEthereumChain", + ], + events: ["chainChanged", "accountsChanged"], + rpcMap: Object.fromEntries( + chains.map((chain) => [ + chain.id, + chain.rpcUrls.default.http[0], + ]), + ), + }, }, - }, - }) - .then((result) => { - result - .approval() - .then((session) => { - setSession(session); - setCachedSession(session); - }) - .catch((error) => { - const isUserRefused = error.code === 5000; - const isUnsupportedChains = error.code === 5100; - if ((isUserRefused || isUnsupportedChains) && error.message) { - dispatch(newWarningToast(error.message)); - } - console.error(error); - }); - - return result; - }); + }) + .then((approvedSession) => { + setSession(approvedSession); + setCachedSession(approvedSession); + resolve(); + }) + .catch((error) => { + dispatch(newWarningToast(error.message)); + resolve(); + }) + .finally(() => { + provider.removeListener("display_uri", onDisplayUri); + pendingConnection.current = null; + }); + }); + return await pendingConnection.current; }, [chainId, provider, setCachedSession, dispatch]); const [{ loading: disconnectLoading }, disconnect] = useAsyncFn(async () => { @@ -162,7 +263,7 @@ export default function WalletConnectProvider({ children }) { }, [provider, session, disconnectCombination]); const fetchAddresses = useCallback(async () => { - if (!provider || !session) { + if (!provider || !session || !caip || isEvmSession) { return []; } @@ -172,8 +273,8 @@ export default function WalletConnectProvider({ children }) { const filteredAccounts = walletConnectAccounts .filter((wcAccount) => { - const prefix = wcAccount.split(":")[1]; - return prefix === caip; + const [namespace, prefix] = wcAccount.split(":"); + return namespace === "polkadot" && prefix === caip; }) .map((wcAccount) => { const address = wcAccount.split(":")[2]; @@ -185,7 +286,7 @@ export default function WalletConnectProvider({ children }) { } return filteredAccounts; - }, [provider, session, caip, disconnectCombination]); + }, [provider, session, caip, isEvmSession, disconnectCombination]); // Attempt to sign a message and receive a signature const signWcMessage = useCallback( @@ -228,17 +329,25 @@ export default function WalletConnectProvider({ children }) { [chainId, provider, session], ); - const onSessionExpire = useCallback(() => { - dispatch( - newErrorToast("Session expired, please connect to WalletConnect again"), - ); - disconnectCombination(); - }, [disconnectCombination, dispatch]); + const onSessionExpire = useCallback( + ({ topic }) => { + if (topic !== session?.topic) return; + dispatch( + newErrorToast("Session expired, please connect to WalletConnect again"), + ); + disconnectCombination(); + }, + [session?.topic, disconnectCombination, dispatch], + ); - const onSessionDelete = useCallback(() => { - dispatch(newErrorToast("The connection has been disconnected")); - disconnectCombination(); - }, [disconnectCombination, dispatch]); + const onSessionDelete = useCallback( + ({ topic }) => { + if (topic !== session?.topic) return; + dispatch(newErrorToast("The connection has been disconnected")); + disconnectCombination(); + }, + [session?.topic, disconnectCombination, dispatch], + ); useEffect(() => { if (provider) { @@ -255,7 +364,6 @@ export default function WalletConnectProvider({ children }) { provider.off("disconnect", disconnectCombination); provider.client.off("session_expire", onSessionExpire); provider.client.off("session_delete", onSessionDelete); - provider.client.removeAllListeners(); } }; }, [disconnectCombination, onSessionExpire, onSessionDelete, provider]); @@ -286,6 +394,8 @@ export default function WalletConnectProvider({ children }) { signWcMessage, signWcTx, disconnectLoading, + isEvmSession, + connectEvm, }} > {children} diff --git a/packages/next-common/hooks/connect/useEVMWallets.js b/packages/next-common/hooks/connect/useEVMWallets.js index a243e09a7d..9043c7abe7 100644 --- a/packages/next-common/hooks/connect/useEVMWallets.js +++ b/packages/next-common/hooks/connect/useEVMWallets.js @@ -9,7 +9,7 @@ import { subWallet, talisman, } from "next-common/utils/consts/connect"; -import { useConnectors } from "wagmi"; +import { useAccount, useConnectors } from "wagmi"; import { useDetectEthereum } from "./useDetectEthereum"; import { useHasCoinbaseWallet } from "./useHasCoinbaseWallet"; @@ -25,7 +25,13 @@ const fixedWallets = [ ]; export function useEVMWallets() { - const connectors = useConnectors(); + const { connector: activeConnector } = useAccount(); + const connectors = useConnectors().map((connector) => + connector.id === "walletConnect" && + activeConnector?.id === "walletConnectUniversal" + ? activeConnector + : connector, + ); const ethereum = useDetectEthereum(); /** diff --git a/packages/next-common/hooks/connect/useWalletConnectAccounts.js b/packages/next-common/hooks/connect/useWalletConnectAccounts.js index ab93694a97..3a00db3b76 100644 --- a/packages/next-common/hooks/connect/useWalletConnectAccounts.js +++ b/packages/next-common/hooks/connect/useWalletConnectAccounts.js @@ -8,9 +8,11 @@ export function useWalletConnectAccounts() { const [accounts, setAccounts] = useState([]); useEffect(() => { + let active = true; + setAccounts([]); if (session) { fetchAddresses().then((addresses) => { - if (addresses && addresses.length > 0) { + if (active && addresses && addresses.length > 0) { setAccounts( normalizedSubstrateAccounts( addresses.map((address) => ({ address })), @@ -20,6 +22,9 @@ export function useWalletConnectAccounts() { } }); } + return () => { + active = false; + }; }, [session, fetchAddresses]); return accounts; diff --git a/packages/next-common/hooks/connect/useWeb3Login.js b/packages/next-common/hooks/connect/useWeb3Login.js index 1d22ea9a9d..42eff2a28e 100644 --- a/packages/next-common/hooks/connect/useWeb3Login.js +++ b/packages/next-common/hooks/connect/useWeb3Login.js @@ -28,6 +28,7 @@ export function useWeb3Login() { const accountInfo = { address, evmAddress: account.evmAddress, + connectorId: account.meta?.connectorId, wallet, }; await connectAccount(accountInfo); diff --git a/packages/next-common/package.json b/packages/next-common/package.json index ae9fc67a15..e8c1734e47 100644 --- a/packages/next-common/package.json +++ b/packages/next-common/package.json @@ -39,6 +39,7 @@ "@reduxjs/toolkit": "^1.9.3", "@talismn/signet-apps-sdk": "^0.0.7", "@tanstack/react-query": "^5.90.2", + "@walletconnect/ethereum-provider": "2.23.9", "@walletconnect/universal-provider": "^2.23.9", "@walletconnect/utils": "^2.23.9", "@xyflow/react": "^12.5.1", diff --git a/packages/next-common/utils/consts/settings/hydradx.js b/packages/next-common/utils/consts/settings/hydradx.js index b65e773ffa..1df4e29780 100644 --- a/packages/next-common/utils/consts/settings/hydradx.js +++ b/packages/next-common/utils/consts/settings/hydradx.js @@ -57,13 +57,14 @@ const links = [ const ethereumNetwork = { chainId: "0x3640e", - chainName: "HydraDX", + chainName: "Hydration", // If MetaMask fails with "Missing revert data in call exception" when // submitting a transaction, try using the RPC URL below. Also make sure the // RPC URL in the MetaMask network configuration is not stale. rpcUrls: ["https://hydration-rpc.n.dwellir.com"], blockExplorerUrls: ["https://explorer.evm.hydration.cloud"], nativeCurrency: { + name: "Wrapped Ether", symbol: "WETH", decimals: 18, }, diff --git a/packages/next-common/utils/sendTransaction/sendEvmTx.js b/packages/next-common/utils/sendTransaction/sendEvmTx.js index 585c9ad525..b02a4466de 100644 --- a/packages/next-common/utils/sendTransaction/sendEvmTx.js +++ b/packages/next-common/utils/sendTransaction/sendEvmTx.js @@ -1,5 +1,6 @@ import { ethers } from "ethers"; import { + addNetwork, getConnector, getEthereum, isSameChainId, @@ -10,6 +11,7 @@ import getChainSettings from "../consts/settings"; import { getEvmSignerAddress } from "../mixedChainUtil"; import { hexToNumber } from "viem"; import { noop } from "lodash-es"; +import Chains from "../consts/chains"; export const DISPATCH_PRECOMPILE_ADDRESS = "0x0000000000000000000000000000000000000401"; @@ -27,17 +29,34 @@ export async function prepareEthereum({ ethereum, onError, signerAddress }) { const chainId = hexToNumber(ethereumNetwork.chainId); - if (!isSameChainId(chainId)) { - try { + const isHydrationWalletConnect = + ["walletConnect", "walletConnectUniversal"].includes(connector.id) && + process.env.NEXT_PUBLIC_CHAIN === Chains.hydradx; + + try { + // Hydration may need to be registered in the wallet after session approval. + if (isHydrationWalletConnect) { + await addNetwork(ethereum, ethereumNetwork); + } + + if (!isSameChainId(chainId)) { await switchNetwork(chainId); - } catch { - onError( - new Error( - `Cannot switch to chain ${ethereumNetwork.chainName}, please add the network configuration to ${walletName} wallet.`, - ), - ); - return false; } + + if ( + isHydrationWalletConnect && + Number(await ethereum.request({ method: "eth_chainId" })) !== chainId + ) { + throw new Error("Wallet did not switch to the requested chain"); + } + } catch (cause) { + onError( + new Error( + `Cannot switch to chain ${ethereumNetwork.chainName}, please add the network configuration to ${walletName} wallet.`, + { cause }, + ), + ); + return false; } const accounts = await requestAccounts(); diff --git a/yarn.lock b/yarn.lock index 6098403ed8..62da968d9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,7 +19,7 @@ __metadata: languageName: node linkType: hard -"@adraffy/ens-normalize@npm:^1.11.0": +"@adraffy/ens-normalize@npm:^1.10.1, @adraffy/ens-normalize@npm:^1.11.0": version: 1.11.1 resolution: "@adraffy/ens-normalize@npm:1.11.1" checksum: 10c0/b364e2a57131db278ebf2f22d1a1ac6d8aea95c49dd2bbbc1825870b38aa91fd8816aba580a1f84edc50a45eb6389213dacfd1889f32893afc8549a82d304767 @@ -1856,6 +1856,23 @@ __metadata: languageName: node linkType: hard +"@base-org/account@npm:2.4.0": + version: 2.4.0 + resolution: "@base-org/account@npm:2.4.0" + dependencies: + "@coinbase/cdp-sdk": "npm:^1.0.0" + "@noble/hashes": "npm:1.4.0" + clsx: "npm:1.2.1" + eventemitter3: "npm:5.0.1" + idb-keyval: "npm:6.2.1" + ox: "npm:0.6.9" + preact: "npm:10.24.2" + viem: "npm:^2.31.7" + zustand: "npm:5.0.3" + checksum: 10c0/570a3134b81389f13a24c64e9b30b8e786dd34dfcfd59d56717352dfd892d484d49f7c57120d936f14f2e438ea11a2af543d985c90ceb3934c0e5b3deebab1f7 + languageName: node + linkType: hard + "@bramus/specificity@npm:^2.4.2": version: 2.4.2 resolution: "@bramus/specificity@npm:2.4.2" @@ -1867,6 +1884,40 @@ __metadata: languageName: node linkType: hard +"@coinbase/cdp-sdk@npm:^1.0.0": + version: 1.56.0 + resolution: "@coinbase/cdp-sdk@npm:1.56.0" + dependencies: + "@solana-program/system": "npm:^0.10.0" + "@solana-program/token": "npm:^0.9.0" + "@solana/kit": "npm:^5.5.1" + abitype: "npm:1.0.6" + axios: "npm:^1.18.0" + axios-retry: "npm:^4.5.0" + bs58: "npm:^6.0.0" + jose: "npm:^6.2.0" + md5: "npm:^2.3.0" + uncrypto: "npm:^0.1.3" + viem: "npm:^2.47.0" + zod: "npm:^3.25.76" + peerDependencies: + "@x402/core": ^2.25.0 + "@x402/evm": ^2.25.0 + "@x402/extensions": ^2.25.0 + "@x402/svm": ^2.25.0 + peerDependenciesMeta: + "@x402/core": + optional: true + "@x402/evm": + optional: true + "@x402/extensions": + optional: true + "@x402/svm": + optional: true + checksum: 10c0/a51926aa9a92d92918afad98a92b2adb1380e20274b686117188682a0d2bf60bf5b64cfe7261d454418a268d14bf3c915c57f8b538955fb461d35eb563eb81c0 + languageName: node + linkType: hard + "@commander-js/extra-typings@npm:^14.0.0": version: 14.0.0 resolution: "@commander-js/extra-typings@npm:14.0.0" @@ -2793,6 +2844,31 @@ __metadata: languageName: node linkType: hard +"@lit-labs/ssr-dom-shim@npm:^1.5.0": + version: 1.6.0 + resolution: "@lit-labs/ssr-dom-shim@npm:1.6.0" + checksum: 10c0/deffcfd765d268820beef600a1c1cf9d3cf1a5cb4bbe7e80843796ff33d1a122f4e5651ef4a44b33d36e5fa6538e6ee87a95b9d40b4a26cabf3c35b45194c87a + languageName: node + linkType: hard + +"@lit/react@npm:1.0.8": + version: 1.0.8 + resolution: "@lit/react@npm:1.0.8" + peerDependencies: + "@types/react": 17 || 18 || 19 + checksum: 10c0/18bf3eb6584fa989e0ad40988b349a4401da1cecd5bf1c6edfc1c5caed80037852a4ebe5685b04941e5b28ccf93e740676dae32773d7ae44b1479b96538392b1 + languageName: node + linkType: hard + +"@lit/reactive-element@npm:^2.1.0": + version: 2.1.2 + resolution: "@lit/reactive-element@npm:2.1.2" + dependencies: + "@lit-labs/ssr-dom-shim": "npm:^1.5.0" + checksum: 10c0/557069ce6ebbbafb1140e1e0a25ce73d3501bf455cda231d42bb131baa9065c54b6b7ca1655507eede397decd7ddde16c84192cb72a07d4edf41d54e07725933 + languageName: node + linkType: hard + "@metamask/superstruct@npm:^3.1.0": version: 3.1.0 resolution: "@metamask/superstruct@npm:3.1.0" @@ -2863,6 +2939,13 @@ __metadata: languageName: node linkType: hard +"@msgpack/msgpack@npm:3.1.2": + version: 3.1.2 + resolution: "@msgpack/msgpack@npm:3.1.2" + checksum: 10c0/4fee6dbea70a485d3a787ac76dd43687f489d662f22919237db1f2abbc3c88070c1d3ad78417ce6e764bcd041051680284654021f52068e0aff82d570cb942d5 + languageName: node + linkType: hard + "@msgpack/msgpack@npm:3.1.3": version: 3.1.3 resolution: "@msgpack/msgpack@npm:3.1.3" @@ -2998,7 +3081,7 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:1.9.7, @noble/curves@npm:~1.9.0": +"@noble/curves@npm:1.9.7, @noble/curves@npm:^1.6.0, @noble/curves@npm:~1.9.0": version: 1.9.7 resolution: "@noble/curves@npm:1.9.7" dependencies: @@ -3021,6 +3104,13 @@ __metadata: languageName: node linkType: hard +"@noble/hashes@npm:1.4.0, @noble/hashes@npm:^1.3.1": + version: 1.4.0 + resolution: "@noble/hashes@npm:1.4.0" + checksum: 10c0/8c3f005ee72e7b8f9cff756dfae1241485187254e3f743873e22073d63906863df5d4f13d441b7530ea614b7a093f0d889309f28b59850f33b66cb26a779a4a5 + languageName: node + linkType: hard + "@noble/hashes@npm:1.7.0": version: 1.7.0 resolution: "@noble/hashes@npm:1.7.0" @@ -3028,7 +3118,7 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.8.0, @noble/hashes@npm:^1.6.1, @noble/hashes@npm:^1.8.0, @noble/hashes@npm:~1.8.0": +"@noble/hashes@npm:1.8.0, @noble/hashes@npm:^1.5.0, @noble/hashes@npm:^1.6.1, @noble/hashes@npm:^1.8.0, @noble/hashes@npm:~1.8.0": version: 1.8.0 resolution: "@noble/hashes@npm:1.8.0" checksum: 10c0/06a0b52c81a6fa7f04d67762e08b2c476a00285858150caeaaff4037356dd5e119f45b2a530f638b77a5eeca013168ec1b655db41bae3236cb2e9d511484fc77 @@ -3042,13 +3132,6 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:^1.3.1": - version: 1.4.0 - resolution: "@noble/hashes@npm:1.4.0" - checksum: 10c0/8c3f005ee72e7b8f9cff756dfae1241485187254e3f743873e22073d63906863df5d4f13d441b7530ea614b7a093f0d889309f28b59850f33b66cb26a779a4a5 - languageName: node - linkType: hard - "@noble/hashes@npm:^2.2.0": version: 2.2.0 resolution: "@noble/hashes@npm:2.2.0" @@ -3477,6 +3560,15 @@ __metadata: languageName: node linkType: hard +"@phosphor-icons/webcomponents@npm:2.1.5": + version: 2.1.5 + resolution: "@phosphor-icons/webcomponents@npm:2.1.5" + dependencies: + lit: "npm:^3" + checksum: 10c0/547c0e3e18b0203e8b432fdbc5aa075219a4e19cffa8582e6da35f0d67ac85441f67a1bb005cadeb3601e5ecda760339fca3fbb729be66ae6ec0c9d3e4d36d38 + languageName: node + linkType: hard + "@pkgr/core@npm:^0.2.7": version: 0.2.9 resolution: "@pkgr/core@npm:0.2.9" @@ -6087,6 +6179,148 @@ __metadata: languageName: node linkType: hard +"@reown/appkit-common@npm:1.8.17-wc-circular-dependencies-fix.0": + version: 1.8.17-wc-circular-dependencies-fix.0 + resolution: "@reown/appkit-common@npm:1.8.17-wc-circular-dependencies-fix.0" + dependencies: + big.js: "npm:6.2.2" + dayjs: "npm:1.11.13" + viem: "npm:>=2.37.9" + checksum: 10c0/04293c086dac0d7c0d8c759f1cf66447d222d1ba2fbfe8cd97ad613976b4e0c59a015026541ede28904667a856d169c53a88c7894adbe72cd8c5f417c393d1be + languageName: node + linkType: hard + +"@reown/appkit-controllers@npm:1.8.17-wc-circular-dependencies-fix.0": + version: 1.8.17-wc-circular-dependencies-fix.0 + resolution: "@reown/appkit-controllers@npm:1.8.17-wc-circular-dependencies-fix.0" + dependencies: + "@reown/appkit-common": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-wallet": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@walletconnect/universal-provider": "npm:2.23.2" + valtio: "npm:2.1.7" + viem: "npm:>=2.37.9" + checksum: 10c0/5ff83a38f9d3ac2419bfe81f73554d0a5d8294c353fcc7bdb3297eabef82206559b272b8961b02bd30df16855308235f3f2dff268d132b12e58764c2f62ef02e + languageName: node + linkType: hard + +"@reown/appkit-pay@npm:1.8.17-wc-circular-dependencies-fix.0": + version: 1.8.17-wc-circular-dependencies-fix.0 + resolution: "@reown/appkit-pay@npm:1.8.17-wc-circular-dependencies-fix.0" + dependencies: + "@reown/appkit-common": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-controllers": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-ui": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-utils": "npm:1.8.17-wc-circular-dependencies-fix.0" + lit: "npm:3.3.0" + valtio: "npm:2.1.7" + checksum: 10c0/923acdda3f412b08977e870487b16f1ec382b0c3514e3bedce4f984891e2baff1703aafb3797aa9209fc9f867f9f4003b19c02d0e93fbf015a1fb7aea24c2e23 + languageName: node + linkType: hard + +"@reown/appkit-polyfills@npm:1.8.17-wc-circular-dependencies-fix.0": + version: 1.8.17-wc-circular-dependencies-fix.0 + resolution: "@reown/appkit-polyfills@npm:1.8.17-wc-circular-dependencies-fix.0" + dependencies: + buffer: "npm:6.0.3" + checksum: 10c0/0ce7984c424d401f2a3128e0d20b2eceb6f1f8001b7257a57f341701efe64dc7f057a05e2023b4de131f6e6e11fc2f12ff8bd80b9be4dd21b07aeb6bcde9c33d + languageName: node + linkType: hard + +"@reown/appkit-scaffold-ui@npm:1.8.17-wc-circular-dependencies-fix.0": + version: 1.8.17-wc-circular-dependencies-fix.0 + resolution: "@reown/appkit-scaffold-ui@npm:1.8.17-wc-circular-dependencies-fix.0" + dependencies: + "@reown/appkit-common": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-controllers": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-pay": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-ui": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-utils": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-wallet": "npm:1.8.17-wc-circular-dependencies-fix.0" + lit: "npm:3.3.0" + checksum: 10c0/510798bdf9452742fdb65c8099ed5d6f2736edfd0b4f984682908afb472e46d23d993c70a00765d6c94ce934afce31fe4945256e2cf61899680c3ad4140d14f6 + languageName: node + linkType: hard + +"@reown/appkit-ui@npm:1.8.17-wc-circular-dependencies-fix.0": + version: 1.8.17-wc-circular-dependencies-fix.0 + resolution: "@reown/appkit-ui@npm:1.8.17-wc-circular-dependencies-fix.0" + dependencies: + "@phosphor-icons/webcomponents": "npm:2.1.5" + "@reown/appkit-common": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-controllers": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-wallet": "npm:1.8.17-wc-circular-dependencies-fix.0" + lit: "npm:3.3.0" + qrcode: "npm:1.5.3" + checksum: 10c0/98fe6476624bcc16a04aae0fcb40e15a7c7fc60ea4ffbfc3a8392dbe92a898468985b0d6f881df43e93555427c858459b822decc1a59893314c52d32f94674b2 + languageName: node + linkType: hard + +"@reown/appkit-utils@npm:1.8.17-wc-circular-dependencies-fix.0": + version: 1.8.17-wc-circular-dependencies-fix.0 + resolution: "@reown/appkit-utils@npm:1.8.17-wc-circular-dependencies-fix.0" + dependencies: + "@base-org/account": "npm:2.4.0" + "@reown/appkit-common": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-controllers": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-polyfills": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-wallet": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@safe-global/safe-apps-provider": "npm:0.18.6" + "@safe-global/safe-apps-sdk": "npm:9.1.0" + "@wallet-standard/wallet": "npm:1.1.0" + "@walletconnect/logger": "npm:3.0.2" + "@walletconnect/universal-provider": "npm:2.23.2" + valtio: "npm:2.1.7" + viem: "npm:>=2.37.9" + peerDependencies: + valtio: 2.1.7 + dependenciesMeta: + "@base-org/account": + optional: true + "@safe-global/safe-apps-provider": + optional: true + "@safe-global/safe-apps-sdk": + optional: true + checksum: 10c0/eb0b6c1684490cd8c17ac011200f92cedc7da9b1b24e0d7c6d6ec81966f865cd44c5a32c14a09e4a6572abe5aa879054699b1551a4c133ad25f717c942a7dd59 + languageName: node + linkType: hard + +"@reown/appkit-wallet@npm:1.8.17-wc-circular-dependencies-fix.0": + version: 1.8.17-wc-circular-dependencies-fix.0 + resolution: "@reown/appkit-wallet@npm:1.8.17-wc-circular-dependencies-fix.0" + dependencies: + "@reown/appkit-common": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-polyfills": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@walletconnect/logger": "npm:3.0.2" + zod: "npm:3.22.4" + checksum: 10c0/0ecc6f934fb61752b22afea83db761b6faf7c78a9f1e0180487d42eb913a1945f01d2dc7df18e641d0913dcbcda78145bc02e2773c25e541cfd14ebde3ba53b9 + languageName: node + linkType: hard + +"@reown/appkit@npm:1.8.17-wc-circular-dependencies-fix.0": + version: 1.8.17-wc-circular-dependencies-fix.0 + resolution: "@reown/appkit@npm:1.8.17-wc-circular-dependencies-fix.0" + dependencies: + "@lit/react": "npm:1.0.8" + "@reown/appkit-common": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-controllers": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-pay": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-polyfills": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-scaffold-ui": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-ui": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-utils": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@reown/appkit-wallet": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@walletconnect/universal-provider": "npm:2.23.2" + bs58: "npm:6.0.0" + semver: "npm:7.7.2" + valtio: "npm:2.1.7" + viem: "npm:>=2.37.9" + dependenciesMeta: + "@lit/react": + optional: true + checksum: 10c0/be6bb64c92f0d6f095fc399cebc2c2be30d98b6397aae288a4341785af59a302f2df3725feb70ad5c41ae35ae8574baa4eb7ea7a69564656f6cdb0674b5d8a41 + languageName: node + linkType: hard + "@restart/hooks@npm:^0.4.7": version: 0.4.9 resolution: "@restart/hooks@npm:0.4.9" @@ -6405,6 +6639,33 @@ __metadata: languageName: node linkType: hard +"@safe-global/safe-apps-provider@npm:0.18.6": + version: 0.18.6 + resolution: "@safe-global/safe-apps-provider@npm:0.18.6" + dependencies: + "@safe-global/safe-apps-sdk": "npm:^9.1.0" + events: "npm:^3.3.0" + checksum: 10c0/e8567a97e43740bfe21b6f8a7759cabed2bc96eb50fd494118cab13a20f14797fbca3e02d18f0395054fcfbf2fd86315e5433d5b26f73bed6c3c86881087716c + languageName: node + linkType: hard + +"@safe-global/safe-apps-sdk@npm:9.1.0, @safe-global/safe-apps-sdk@npm:^9.1.0": + version: 9.1.0 + resolution: "@safe-global/safe-apps-sdk@npm:9.1.0" + dependencies: + "@safe-global/safe-gateway-typescript-sdk": "npm:^3.5.3" + viem: "npm:^2.1.1" + checksum: 10c0/13af12122a6b1388e7960a76c3c421ea5ed97197646cd1f720b9fc9364fad0cc8f21cda23773130cd6bf57935a36f9e93f5222569cc80382709430b5cad26fda + languageName: node + linkType: hard + +"@safe-global/safe-gateway-typescript-sdk@npm:^3.5.3": + version: 3.23.1 + resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.23.1" + checksum: 10c0/609cfdf71e73cb55c2596e6fa6212c73ff96aa5c857d2e5a98db193853638a8b8b2165c8cb8334a9060885acb2e688b33675bab000445bd3ec99bc6245cf8d61 + languageName: node + linkType: hard + "@scure/base@npm:1.2.6, @scure/base@npm:~1.2.5": version: 1.2.6 resolution: "@scure/base@npm:1.2.6" @@ -6451,7 +6712,7 @@ __metadata: languageName: node linkType: hard -"@scure/bip32@npm:1.7.0, @scure/bip32@npm:^1.7.0": +"@scure/bip32@npm:1.7.0, @scure/bip32@npm:^1.5.0, @scure/bip32@npm:^1.7.0": version: 1.7.0 resolution: "@scure/bip32@npm:1.7.0" dependencies: @@ -6472,7 +6733,7 @@ __metadata: languageName: node linkType: hard -"@scure/bip39@npm:1.6.0, @scure/bip39@npm:^1.6.0": +"@scure/bip39@npm:1.6.0, @scure/bip39@npm:^1.4.0, @scure/bip39@npm:^1.6.0": version: 1.6.0 resolution: "@scure/bip39@npm:1.6.0" dependencies: @@ -6496,150 +6757,860 @@ __metadata: languageName: node linkType: hard -"@standard-schema/spec@npm:^1.1.0": - version: 1.1.0 - resolution: "@standard-schema/spec@npm:1.1.0" - checksum: 10c0/d90f55acde4b2deb983529c87e8025fa693de1a5e8b49ecc6eb84d1fd96328add0e03d7d551442156c7432fd78165b2c26ff561b970a9a881f046abb78d6a526 +"@solana-program/system@npm:^0.10.0": + version: 0.10.0 + resolution: "@solana-program/system@npm:0.10.0" + peerDependencies: + "@solana/kit": ^5.0 + checksum: 10c0/4cc3164d49fe7b10e9c0c89493f738e2d4294e2eae40fafee56b01dfb50b939c88f82eb06d5393333743b0edee961b03e947afcc20e6965252576900266ec52e languageName: node linkType: hard -"@subsquare/collectives-next@workspace:packages/collectives-next": - version: 0.0.0-use.local - resolution: "@subsquare/collectives-next@workspace:packages/collectives-next" - dependencies: - "@next/env": "npm:^16.3.4" - "@osn/eslint-config": "npm:^1.0.2" - "@osn/icons": "npm:^1.235.9" - "@svgr/webpack": "npm:^7.0.0" - "@types/lodash-es": "npm:^4.17.12" - bignumber.js: "npm:^9.0.2" - chart.js: "npm:^4.1.1" - chartjs-plugin-gradient: "npm:^0.6.1" - clsx: "npm:^1.2.1" - cookies: "npm:^0.8.0" - dayjs: "npm:^1.10.7" - eslint: "npm:^10.2.1" - eslint-config-next: "npm:^16.3.4" - http-proxy: "npm:^1.18.1" - localforage: "npm:^1.10.0" - lodash-es: "npm:^4.18.1" - next: "npm:16.3.4" - next-common: "workspace:*" - nprogress: "npm:^0.2.0" - pluralize: "npm:^8.0.0" - raw-loader: "npm:^4.0.2" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" - react-is: "npm:^18.3.1" - react-redux: "npm:^8.0.5" - sass: "npm:^1.99.0" - sharp: "npm:^0.35.4" - sonner: "npm:^1.0.3" - styled-components: "npm:^5.3.9" - tailwind-merge: "npm:^1.14.0" - tailwind-styled-components: "npm:^2.2.0" - use-deep-compare-effect: "npm:^1.8.1" - webpack: "npm:^5.91.0" - languageName: unknown - linkType: soft - -"@subsquare/kintsugi-next@workspace:packages/kintsugi-next": - version: 0.0.0-use.local - resolution: "@subsquare/kintsugi-next@workspace:packages/kintsugi-next" - dependencies: - "@interlay/monetary-js": "npm:^0.5.3" - "@next/env": "npm:^16.3.4" - "@osn/eslint-config": "npm:^1.0.2" - "@osn/icons": "npm:^1.235.9" - "@polkadot/util-crypto": "npm:^13.5.9" - "@svgr/webpack": "npm:^7.0.0" - "@types/lodash-es": "npm:^4.17.12" - bignumber.js: "npm:^9.0.2" - chart.js: "npm:^4.1.1" - clsx: "npm:^1.2.1" - cookies: "npm:^0.8.0" - dayjs: "npm:^1.10.7" - eslint: "npm:^10.2.1" - eslint-config-next: "npm:^16.3.4" - http-proxy: "npm:^1.18.1" - lodash-es: "npm:^4.18.1" - next: "npm:16.3.4" - next-common: "workspace:*" - nprogress: "npm:^0.2.0" - raw-loader: "npm:^4.0.2" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" - react-is: "npm:^18.3.1" - react-redux: "npm:^8.0.5" - sass: "npm:^1.99.0" - sharp: "npm:^0.35.4" - sonner: "npm:^1.0.3" - styled-components: "npm:^5.3.9" - tailwind-merge: "npm:^1.14.0" - tailwind-styled-components: "npm:^2.2.0" - use-deep-compare-effect: "npm:^1.8.1" - webpack: "npm:^5.91.0" - languageName: unknown - linkType: soft +"@solana-program/token@npm:^0.9.0": + version: 0.9.0 + resolution: "@solana-program/token@npm:0.9.0" + peerDependencies: + "@solana/kit": ^5.0 + checksum: 10c0/f23b591e0ad27aa05e940429de73ebc0b9cbb65542e5aae775ac616577307d341d3335e36e24a38ba7612bcc584e50bd7cec360ca4904f42219f2708a9d453aa + languageName: node + linkType: hard -"@subsquare/next@workspace:packages/next": - version: 0.0.0-use.local - resolution: "@subsquare/next@workspace:packages/next" +"@solana/accounts@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/accounts@npm:5.5.1" dependencies: - "@next/env": "npm:^16.3.4" - "@osn/eslint-config": "npm:^1.0.2" - "@osn/icons": "npm:^1.235.9" - "@svgr/webpack": "npm:^7.0.0" - "@types/lodash-es": "npm:^4.17.12" - bignumber.js: "npm:^9.0.2" - chart.js: "npm:^4.1.1" - chartjs-plugin-gradient: "npm:^0.6.1" - clsx: "npm:^1.2.1" - cookies: "npm:^0.8.0" - dayjs: "npm:^1.10.7" - eslint: "npm:^10.2.1" - eslint-config-next: "npm:^16.3.4" - http-proxy: "npm:^1.18.1" - localforage: "npm:^1.10.0" - lodash-es: "npm:^4.18.1" - next: "npm:16.3.4" - next-common: "workspace:*" - nprogress: "npm:^0.2.0" - pluralize: "npm:^8.0.0" - posthog-js: "npm:^1.324.1" - raw-loader: "npm:^4.0.2" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" - react-is: "npm:^18.3.1" - react-redux: "npm:^8.0.5" - sass: "npm:^1.99.0" - sharp: "npm:^0.35.4" - sonner: "npm:^1.0.3" - styled-components: "npm:^5.3.9" - tailwind-merge: "npm:^1.14.0" - tailwind-styled-components: "npm:^2.2.0" - use-deep-compare-effect: "npm:^1.8.1" - webpack: "npm:^5.91.0" - languageName: unknown - linkType: soft - -"@substrate/connect-extension-protocol@npm:^2.0.0": - version: 2.0.0 - resolution: "@substrate/connect-extension-protocol@npm:2.0.0" - checksum: 10c0/14a7c96b49e686dbc710214abe0fe312a366011a3521952f2317684e2463d75d54080fe358bdd8ff8d972c9de7f0e7f508dfc5210cf694574943dd8ecc490e89 + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/rpc-spec": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/9851005767107f198a7d4dbd5498b271236d83527b25fc05d7beb5b347ac072fb51119b9863d2033e89bb9ee06e78289a1a71b0147d19a444c28ba36f19f970b languageName: node linkType: hard -"@substrate/connect-known-chains@npm:^1.1.4": - version: 1.1.4 - resolution: "@substrate/connect-known-chains@npm:1.1.4" - checksum: 10c0/657ded156f5d291ac702889a50cd1ffd276dd5a78e436a0557dfbf80dd1e4f73401b0069661ee90feaecd6c84f83e4546e162920e0c3bd886684001c883f2d24 +"@solana/addresses@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/addresses@npm:5.5.1" + dependencies: + "@solana/assertions": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/4908e3019c930c2c4a13528eae7a5bfac25400b4173144180a68bcbac43d1b90b0771bf952711503814440547ed45d32c3b450bac0aff19974035111e0f79865 languageName: node linkType: hard -"@substrate/connect-known-chains@npm:^1.1.5": - version: 1.4.1 - resolution: "@substrate/connect-known-chains@npm:1.4.1" +"@solana/assertions@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/assertions@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/d1a8fbfdd8e551d84b7624d645fcae66a26d9022828795f10b252f45fb84299088cec75e8f156895bb930c977db1bcbdda8ceb011f373fb288f0adb5ea4ecd31 + languageName: node + linkType: hard + +"@solana/codecs-core@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/codecs-core@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/a66cd3e3c9a0fcf369be5c3369463db03f4b1e1aa0d322d6cb8440613dcc83608dd52501ff2ee3c56daed2b1f2b07751cfa1fe1aeb584a306a9e14175b0ca994 + languageName: node + linkType: hard + +"@solana/codecs-data-structures@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/codecs-data-structures@npm:5.5.1" + dependencies: + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/db88246a2fc3d4c3c7d69d5e9ce7fab815be4e10e0b1519ed00454c7ac2189fc3dd2d2ae0cb05a77d560ccdc615652122cfada59e34285ce08545474542e4874 + languageName: node + linkType: hard + +"@solana/codecs-numbers@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/codecs-numbers@npm:5.5.1" + dependencies: + "@solana/codecs-core": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/1802ec289a912b086c031c8da7f856ffb2c5a581b2fef9de5bd0ea23e192ca472cc01f1a46747e0f9c1505c826f404bf2862d7403175688136b87056d22fc441 + languageName: node + linkType: hard + +"@solana/codecs-strings@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/codecs-strings@npm:5.5.1" + dependencies: + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: ^5.0.0 + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true + checksum: 10c0/16cf7f6edee96a11862bf41cc31e0162848ecd5ba67826eee3e5fe9f10007631db5f34f794fcf44bb075cbcaf43843e34632659105f75a02c7ff3d703ee49325 + languageName: node + linkType: hard + +"@solana/codecs@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/codecs@npm:5.5.1" + dependencies: + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-data-structures": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/options": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/bf576cb014f342edddb4b77f83a111ceecfc5709ecaa6225c71cbb40b3d31aba26f3c3f5787684d472b1ed0c705df10be517fdbab659cf43cd7a6e21bea9a9c1 + languageName: node + linkType: hard + +"@solana/errors@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/errors@npm:5.5.1" + dependencies: + chalk: "npm:5.6.2" + commander: "npm:14.0.2" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + bin: + errors: bin/cli.mjs + checksum: 10c0/cafa60aa4ca91c78b0d85e5d296c9080fc537b0c62ba1bc3d3d00eaad96d2894178849be478e653cf963a2d18d71b54e0f58f319a7d77f6dbfdd5845af4c6a08 + languageName: node + linkType: hard + +"@solana/fast-stable-stringify@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/fast-stable-stringify@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/b116c515e71cdace7a2e45c001de486c528e178f6170dc6faaea33a3a076a5ddd7806302584e480ef0dbf9f84c9a808cbc99a068c48b0e777bc5b5e178291ed9 + languageName: node + linkType: hard + +"@solana/functional@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/functional@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/17f60572407006b8913529019d928b0b43b6c24798fd743673a7878e8b8db25ebe27b7eb9ef0e28cc24773d34acbb1d5fe617f9096d527efc62c9e6719f7ada2 + languageName: node + linkType: hard + +"@solana/instruction-plans@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/instruction-plans@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/instructions": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/promises": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + "@solana/transactions": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/9f1cde9b925f1ecc01f3ceb6b87ba6154befb991ad58b176f58f2f210d75968d2dc26adada623d54eb5039a4116c5f8bf48e5153b813720dfc91301c2e37eb42 + languageName: node + linkType: hard + +"@solana/instructions@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/instructions@npm:5.5.1" + dependencies: + "@solana/codecs-core": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/72b3d599e8016ec6fdb34b3cdbc9cca76a8153e911fd18bee3ea9af8caf19591615425eb3c24aa04ee5da16f87fc568a17574532859b7a50c829c49397458dc4 + languageName: node + linkType: hard + +"@solana/keys@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/keys@npm:5.5.1" + dependencies: + "@solana/assertions": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/1b76a7c5b15a331ebc51c003f2f2e248c91a0f3c09659de855b05757c203c7a0e165c18c3a1b3636fd919859eb58b3e51afac234aa186e01305d4c5a38a3255d + languageName: node + linkType: hard + +"@solana/kit@npm:^5.5.1": + version: 5.5.1 + resolution: "@solana/kit@npm:5.5.1" + dependencies: + "@solana/accounts": "npm:5.5.1" + "@solana/addresses": "npm:5.5.1" + "@solana/codecs": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/instruction-plans": "npm:5.5.1" + "@solana/instructions": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/offchain-messages": "npm:5.5.1" + "@solana/plugin-core": "npm:5.5.1" + "@solana/programs": "npm:5.5.1" + "@solana/rpc": "npm:5.5.1" + "@solana/rpc-api": "npm:5.5.1" + "@solana/rpc-parsed-types": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + "@solana/rpc-subscriptions": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + "@solana/signers": "npm:5.5.1" + "@solana/sysvars": "npm:5.5.1" + "@solana/transaction-confirmation": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + "@solana/transactions": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/391fd781c28c2550dae77395b0bc4e37799da13695be03c5c57e82c31b4556c29b8ac4853087908549415c419ed758c34c1ac9cdae37c4e0d28b4c9be6867b81 + languageName: node + linkType: hard + +"@solana/nominal-types@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/nominal-types@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/aa0f5b850c6e74d6f883d9a2513f561112d531cda750ba75efbc84a524ffc69e014740f5fac308b42499b5ea4fcaa5d34fe3acd334ef65dffe22ba822c476fbc + languageName: node + linkType: hard + +"@solana/offchain-messages@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/offchain-messages@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-data-structures": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/93ba0fec4a3387e4809d8ebbdeb71901d69821cdd4b3645ee054197f9d564227cb76d66b509b98f1902fe522575662824ea58e583665c624dfb05e9a0d52b6dc + languageName: node + linkType: hard + +"@solana/options@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/options@npm:5.5.1" + dependencies: + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-data-structures": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/d4ab205e1286ba02a2ad97d8a3ad22e57798ce8f0fd77f3734f2c4a923c9fc7f0f949d5ceeb8b33eaf5484460c49ed0d9138f3eff5a571e754488f8aa4819269 + languageName: node + linkType: hard + +"@solana/plugin-core@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/plugin-core@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/6d981acfde238517692126f66594598b203eec84753677851f0dc038d01a8c55603aff1319513ba5306a29bf6b0018a1ad2d3b9de49d984acc0ecf76abfffbaa + languageName: node + linkType: hard + +"@solana/programs@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/programs@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/4d31ca06655366d368a853772559d5853494e82c559a02b8f6c4f90d390fb196df50b2d0d0540c2f7bbb7cc0abb3ac2e5694c2148a2bcc034a33dd64b7a105f4 + languageName: node + linkType: hard + +"@solana/promises@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/promises@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/d9818a5d38b85a17f74782457d8953c95835cc1190a63ff6749610e5f6272ee50d08f5720a84f9a5885e0faa94390210b86d927cf81c95f63707a122dfae100d + languageName: node + linkType: hard + +"@solana/rpc-api@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-api@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/rpc-parsed-types": "npm:5.5.1" + "@solana/rpc-spec": "npm:5.5.1" + "@solana/rpc-transformers": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + "@solana/transactions": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/7ac47bc771d825c251f18d92e0eaef8a1f90542e5313249f88970aff666e8aa4ba446d9efc0ded2188d60c41512c09aa285bf1847bd0c439e1a4ddcb20748fc4 + languageName: node + linkType: hard + +"@solana/rpc-parsed-types@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-parsed-types@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/b042b4d252e7b31a2e2cdc957711f0ecc438d1667da7414c0da25218fb439b1de2de0c1845a2ca776cddd8e399ba886a43a1f72a50e1ae0790ea6a500c90cfdb + languageName: node + linkType: hard + +"@solana/rpc-spec-types@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-spec-types@npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/19b4c0e3de748db5520ab4f21a97e7ddf8e5f7a722bf635eb62aacd72ee334b2b8ab8f9343bf660055ad61f4ff71cc402e52dd41b3742944e71f54e67bf82f5a + languageName: node + linkType: hard + +"@solana/rpc-spec@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-spec@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/634d5cd3ea7789ff20ca82782ce2fde6bb96c09fcd49dc9d113ade98a4516d2d080f771f3247454e9d4478933a3c1f1380a8409817c12cd40ef6e3579faa1d0d + languageName: node + linkType: hard + +"@solana/rpc-subscriptions-api@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-subscriptions-api@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/rpc-subscriptions-spec": "npm:5.5.1" + "@solana/rpc-transformers": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + "@solana/transactions": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/3ad059f20c361d5ced84f1d584ff5513d78559497c7cf8855703a7c1437dcb3024fc1dfe9d1be65e8241a4d1a4d0c272ed2ddca7e1aca3086f204546836503f9 + languageName: node + linkType: hard + +"@solana/rpc-subscriptions-channel-websocket@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-subscriptions-channel-websocket@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/rpc-subscriptions-spec": "npm:5.5.1" + "@solana/subscribable": "npm:5.5.1" + ws: "npm:^8.19.0" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/37619caefa2f36fdbbbdab0478965a0bc14f72254caa511ecc067700d9c23f4ac221a61079974b8f6286aa2b71bb4ae5fa106297e7044ef0ed7ceb2d816c74a2 + languageName: node + linkType: hard + +"@solana/rpc-subscriptions-spec@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-subscriptions-spec@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/promises": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + "@solana/subscribable": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/9b9e3a81977ee4deac918226a6f6d41fb524563a027d09da4439e18d3c99dd79b2af5a022a16ac97744f8e93ec9dd409714d5c371a313cb811c22194b94f28cc + languageName: node + linkType: hard + +"@solana/rpc-subscriptions@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-subscriptions@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/fast-stable-stringify": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/promises": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + "@solana/rpc-subscriptions-api": "npm:5.5.1" + "@solana/rpc-subscriptions-channel-websocket": "npm:5.5.1" + "@solana/rpc-subscriptions-spec": "npm:5.5.1" + "@solana/rpc-transformers": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + "@solana/subscribable": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/4dda3a418bae0eff6f7da59cc21840e45bd80f3e5fee9edd32ad66b4d128490838017e2ade245fbcd8f4f765bb67350bace41fc56e00a82b739be6d24fd00bbd + languageName: node + linkType: hard + +"@solana/rpc-transformers@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-transformers@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/3500e42b486627be8e39838f02f2f28c759b0183c1bc34e28d2f2289e9ae2e58d5d0825973da601f9f29b1ab366b0017b49df5329c1dcc9932724b9bfdfafafd + languageName: node + linkType: hard + +"@solana/rpc-transport-http@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-transport-http@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/rpc-spec": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + undici-types: "npm:^7.19.2" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/4300e1a334e2ea8deb66542dabff835ae3dbccbaba0011c1cb027f55219cb3144c7fcd5220da06565ef5fa87a25e73a43497caeb7100ff9f1a947792b2325489 + languageName: node + linkType: hard + +"@solana/rpc-types@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc-types@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/84fcad12f65c88bfbbe0689d1fb6715e37c41454b85f50ae0963f2626c45a26155f2395b03ab48f261966f1a5c02b1c96ad42ba0b1ca80c5fe22f08757401b1b + languageName: node + linkType: hard + +"@solana/rpc@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/rpc@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + "@solana/fast-stable-stringify": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/rpc-api": "npm:5.5.1" + "@solana/rpc-spec": "npm:5.5.1" + "@solana/rpc-spec-types": "npm:5.5.1" + "@solana/rpc-transformers": "npm:5.5.1" + "@solana/rpc-transport-http": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/c469655555013f5dcfa67ef3285c9abe48929a34bdc8a3c7c21823f86f58f07f91980ee59d48190bcda5b427399a81cb180ae0ca2542e9dd47e39407f62c7458 + languageName: node + linkType: hard + +"@solana/signers@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/signers@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/instructions": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + "@solana/offchain-messages": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + "@solana/transactions": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/53957109e4a99122b1225b04d477760e0c557fa9c66095e334de543e78f79c4b35b280dde942a0d7725dc3e61ee63c41d52b7fe5ddfc28967c3db009856573aa + languageName: node + linkType: hard + +"@solana/subscribable@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/subscribable@npm:5.5.1" + dependencies: + "@solana/errors": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/ff9f4af066488448276a439a9299f481cd70c1866b4ab4cce7c3486d6c950bab092f4f678b8b79b45681942c99090cd624b3eaa2a6c2820079d44c2502e7c77b + languageName: node + linkType: hard + +"@solana/sysvars@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/sysvars@npm:5.5.1" + dependencies: + "@solana/accounts": "npm:5.5.1" + "@solana/codecs": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/773e4ae956ed29999a5e0c76e44c3b390330325b03827a5a5092292678e3d1d46c2958911faf8b94b350bf42db02874b8942bd7679fc63519a259520c269883a + languageName: node + linkType: hard + +"@solana/transaction-confirmation@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/transaction-confirmation@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/promises": "npm:5.5.1" + "@solana/rpc": "npm:5.5.1" + "@solana/rpc-subscriptions": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + "@solana/transactions": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/01b96aa0518417bf257f8691e02aba5ce8a7144c64d1b96b0b17045bfe34dfa00b2035e6a930f3e36bb689dd2f00c56fc6b8a521711b2fcd262dcdabd3187966 + languageName: node + linkType: hard + +"@solana/transaction-messages@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/transaction-messages@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-data-structures": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/instructions": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/711503174284bf449b5ffbf32ae149a82a097781f0eac1cc777d941b3cc3b9de19a6daa9993c77650e001d8f8e9e2f749bd232a4da6e09fa9c856a03a6ec1cc8 + languageName: node + linkType: hard + +"@solana/transactions@npm:5.5.1": + version: 5.5.1 + resolution: "@solana/transactions@npm:5.5.1" + dependencies: + "@solana/addresses": "npm:5.5.1" + "@solana/codecs-core": "npm:5.5.1" + "@solana/codecs-data-structures": "npm:5.5.1" + "@solana/codecs-numbers": "npm:5.5.1" + "@solana/codecs-strings": "npm:5.5.1" + "@solana/errors": "npm:5.5.1" + "@solana/functional": "npm:5.5.1" + "@solana/instructions": "npm:5.5.1" + "@solana/keys": "npm:5.5.1" + "@solana/nominal-types": "npm:5.5.1" + "@solana/rpc-types": "npm:5.5.1" + "@solana/transaction-messages": "npm:5.5.1" + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/1dc87a6599ee60e6026b7de917b1e85a2bc2ec2e13732f872453bed597c86002c8b50ae3a4f2ea5725c969fbebe7f4987c5a2f17b02722a40f0b34191f1c7cf2 + languageName: node + linkType: hard + +"@standard-schema/spec@npm:^1.1.0": + version: 1.1.0 + resolution: "@standard-schema/spec@npm:1.1.0" + checksum: 10c0/d90f55acde4b2deb983529c87e8025fa693de1a5e8b49ecc6eb84d1fd96328add0e03d7d551442156c7432fd78165b2c26ff561b970a9a881f046abb78d6a526 + languageName: node + linkType: hard + +"@subsquare/collectives-next@workspace:packages/collectives-next": + version: 0.0.0-use.local + resolution: "@subsquare/collectives-next@workspace:packages/collectives-next" + dependencies: + "@next/env": "npm:^16.3.4" + "@osn/eslint-config": "npm:^1.0.2" + "@osn/icons": "npm:^1.235.9" + "@svgr/webpack": "npm:^7.0.0" + "@types/lodash-es": "npm:^4.17.12" + bignumber.js: "npm:^9.0.2" + chart.js: "npm:^4.1.1" + chartjs-plugin-gradient: "npm:^0.6.1" + clsx: "npm:^1.2.1" + cookies: "npm:^0.8.0" + dayjs: "npm:^1.10.7" + eslint: "npm:^10.2.1" + eslint-config-next: "npm:^16.3.4" + http-proxy: "npm:^1.18.1" + localforage: "npm:^1.10.0" + lodash-es: "npm:^4.18.1" + next: "npm:16.3.4" + next-common: "workspace:*" + nprogress: "npm:^0.2.0" + pluralize: "npm:^8.0.0" + raw-loader: "npm:^4.0.2" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + react-is: "npm:^18.3.1" + react-redux: "npm:^8.0.5" + sass: "npm:^1.99.0" + sharp: "npm:^0.35.4" + sonner: "npm:^1.0.3" + styled-components: "npm:^5.3.9" + tailwind-merge: "npm:^1.14.0" + tailwind-styled-components: "npm:^2.2.0" + use-deep-compare-effect: "npm:^1.8.1" + webpack: "npm:^5.91.0" + languageName: unknown + linkType: soft + +"@subsquare/kintsugi-next@workspace:packages/kintsugi-next": + version: 0.0.0-use.local + resolution: "@subsquare/kintsugi-next@workspace:packages/kintsugi-next" + dependencies: + "@interlay/monetary-js": "npm:^0.5.3" + "@next/env": "npm:^16.3.4" + "@osn/eslint-config": "npm:^1.0.2" + "@osn/icons": "npm:^1.235.9" + "@polkadot/util-crypto": "npm:^13.5.9" + "@svgr/webpack": "npm:^7.0.0" + "@types/lodash-es": "npm:^4.17.12" + bignumber.js: "npm:^9.0.2" + chart.js: "npm:^4.1.1" + clsx: "npm:^1.2.1" + cookies: "npm:^0.8.0" + dayjs: "npm:^1.10.7" + eslint: "npm:^10.2.1" + eslint-config-next: "npm:^16.3.4" + http-proxy: "npm:^1.18.1" + lodash-es: "npm:^4.18.1" + next: "npm:16.3.4" + next-common: "workspace:*" + nprogress: "npm:^0.2.0" + raw-loader: "npm:^4.0.2" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + react-is: "npm:^18.3.1" + react-redux: "npm:^8.0.5" + sass: "npm:^1.99.0" + sharp: "npm:^0.35.4" + sonner: "npm:^1.0.3" + styled-components: "npm:^5.3.9" + tailwind-merge: "npm:^1.14.0" + tailwind-styled-components: "npm:^2.2.0" + use-deep-compare-effect: "npm:^1.8.1" + webpack: "npm:^5.91.0" + languageName: unknown + linkType: soft + +"@subsquare/next@workspace:packages/next": + version: 0.0.0-use.local + resolution: "@subsquare/next@workspace:packages/next" + dependencies: + "@next/env": "npm:^16.3.4" + "@osn/eslint-config": "npm:^1.0.2" + "@osn/icons": "npm:^1.235.9" + "@svgr/webpack": "npm:^7.0.0" + "@types/lodash-es": "npm:^4.17.12" + bignumber.js: "npm:^9.0.2" + chart.js: "npm:^4.1.1" + chartjs-plugin-gradient: "npm:^0.6.1" + clsx: "npm:^1.2.1" + cookies: "npm:^0.8.0" + dayjs: "npm:^1.10.7" + eslint: "npm:^10.2.1" + eslint-config-next: "npm:^16.3.4" + http-proxy: "npm:^1.18.1" + localforage: "npm:^1.10.0" + lodash-es: "npm:^4.18.1" + next: "npm:16.3.4" + next-common: "workspace:*" + nprogress: "npm:^0.2.0" + pluralize: "npm:^8.0.0" + posthog-js: "npm:^1.324.1" + raw-loader: "npm:^4.0.2" + react: "npm:^18.2.0" + react-dom: "npm:^18.2.0" + react-is: "npm:^18.3.1" + react-redux: "npm:^8.0.5" + sass: "npm:^1.99.0" + sharp: "npm:^0.35.4" + sonner: "npm:^1.0.3" + styled-components: "npm:^5.3.9" + tailwind-merge: "npm:^1.14.0" + tailwind-styled-components: "npm:^2.2.0" + use-deep-compare-effect: "npm:^1.8.1" + webpack: "npm:^5.91.0" + languageName: unknown + linkType: soft + +"@substrate/connect-extension-protocol@npm:^2.0.0": + version: 2.0.0 + resolution: "@substrate/connect-extension-protocol@npm:2.0.0" + checksum: 10c0/14a7c96b49e686dbc710214abe0fe312a366011a3521952f2317684e2463d75d54080fe358bdd8ff8d972c9de7f0e7f508dfc5210cf694574943dd8ecc490e89 + languageName: node + linkType: hard + +"@substrate/connect-known-chains@npm:^1.1.4": + version: 1.1.4 + resolution: "@substrate/connect-known-chains@npm:1.1.4" + checksum: 10c0/657ded156f5d291ac702889a50cd1ffd276dd5a78e436a0557dfbf80dd1e4f73401b0069661ee90feaecd6c84f83e4546e162920e0c3bd886684001c883f2d24 + languageName: node + linkType: hard + +"@substrate/connect-known-chains@npm:^1.1.5": + version: 1.4.1 + resolution: "@substrate/connect-known-chains@npm:1.4.1" checksum: 10c0/fbfe7e7af93bbf5209332e059b54baa71f63a2cc05c4f4dd9f010862e4b36e46de73585f90b9d1c07b8ddd60ef75cecab0fc9e43faeec034976195e9a02f23ab languageName: node linkType: hard @@ -7502,7 +8473,7 @@ __metadata: languageName: node linkType: hard -"@types/trusted-types@npm:^2.0.7": +"@types/trusted-types@npm:^2.0.2, @types/trusted-types@npm:^2.0.7": version: 2.0.7 resolution: "@types/trusted-types@npm:2.0.7" checksum: 10c0/4c4855f10de7c6c135e0d32ce462419d8abbbc33713b31d294596c0cc34ae1fa6112a2f9da729c8f7a20707782b0d69da3b1f8df6645b0366d08825ca1522e0c @@ -7801,6 +8772,47 @@ __metadata: languageName: node linkType: hard +"@wallet-standard/base@npm:^1.1.0": + version: 1.1.1 + resolution: "@wallet-standard/base@npm:1.1.1" + checksum: 10c0/b5ea7bef9d1c7a72e3737d48347d255e43a3fff666ee971c6b5f98bde43c6f3caa742c5c22c64687222ac8091ed917227332000297dffd65817cf355fbf73565 + languageName: node + linkType: hard + +"@wallet-standard/wallet@npm:1.1.0": + version: 1.1.0 + resolution: "@wallet-standard/wallet@npm:1.1.0" + dependencies: + "@wallet-standard/base": "npm:^1.1.0" + checksum: 10c0/aa53460568f209d4e38030ee5e98d4f6ea6fec159a1e7fb5a3ee81cf8d91c89f0be86b7188dbf0bb9803d10608bf88bd824f73cd6800823279738827304038e5 + languageName: node + linkType: hard + +"@walletconnect/core@npm:2.23.2": + version: 2.23.2 + resolution: "@walletconnect/core@npm:2.23.2" + dependencies: + "@walletconnect/heartbeat": "npm:1.2.2" + "@walletconnect/jsonrpc-provider": "npm:1.0.14" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/jsonrpc-ws-connection": "npm:1.0.16" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/logger": "npm:3.0.2" + "@walletconnect/relay-api": "npm:1.0.11" + "@walletconnect/relay-auth": "npm:1.1.0" + "@walletconnect/safe-json": "npm:1.0.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.23.2" + "@walletconnect/utils": "npm:2.23.2" + "@walletconnect/window-getters": "npm:1.0.1" + es-toolkit: "npm:1.39.3" + events: "npm:3.3.0" + uint8arrays: "npm:3.1.1" + checksum: 10c0/ce6e293e0bf17cd70171cd0e35b71f48fd96137d67b8ee29812359c6eb67bad9eb6db5ac3e953afe462514e7f8852f5f86c72cd1b697b11335cb6ae7cb251ad1 + languageName: node + linkType: hard + "@walletconnect/core@npm:2.23.9": version: 2.23.9 resolution: "@walletconnect/core@npm:2.23.9" @@ -7835,6 +8847,26 @@ __metadata: languageName: node linkType: hard +"@walletconnect/ethereum-provider@npm:2.23.9": + version: 2.23.9 + resolution: "@walletconnect/ethereum-provider@npm:2.23.9" + dependencies: + "@reown/appkit": "npm:1.8.17-wc-circular-dependencies-fix.0" + "@walletconnect/jsonrpc-http-connection": "npm:1.0.8" + "@walletconnect/jsonrpc-provider": "npm:1.0.14" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/logger": "npm:3.0.2" + "@walletconnect/sign-client": "npm:2.23.9" + "@walletconnect/types": "npm:2.23.9" + "@walletconnect/universal-provider": "npm:2.23.9" + "@walletconnect/utils": "npm:2.23.9" + events: "npm:3.3.0" + checksum: 10c0/36cb9af8b2e4d51a3fd191138e1ebbecbc78a0725fe6bb07ea1ac24bd908d94a439b0e2e12d0e187bc3e6722b7eb152aeaab9eeeac40dce6565ad05831123bd2 + languageName: node + linkType: hard + "@walletconnect/events@npm:1.0.1, @walletconnect/events@npm:^1.0.1": version: 1.0.1 resolution: "@walletconnect/events@npm:1.0.1" @@ -7979,6 +9011,23 @@ __metadata: languageName: node linkType: hard +"@walletconnect/sign-client@npm:2.23.2": + version: 2.23.2 + resolution: "@walletconnect/sign-client@npm:2.23.2" + dependencies: + "@walletconnect/core": "npm:2.23.2" + "@walletconnect/events": "npm:1.0.1" + "@walletconnect/heartbeat": "npm:1.2.2" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/logger": "npm:3.0.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.23.2" + "@walletconnect/utils": "npm:2.23.2" + events: "npm:3.3.0" + checksum: 10c0/dac7b38364a12c8d2ec8491c79abdf3038b4ad5b8c46f512a40d4d7c2dde47ca39919b297dc54ec5d909a5015f3eafb567c4d7125374b3e803611932ea9ff0de + languageName: node + linkType: hard + "@walletconnect/sign-client@npm:2.23.9": version: 2.23.9 resolution: "@walletconnect/sign-client@npm:2.23.9" @@ -8005,6 +9054,20 @@ __metadata: languageName: node linkType: hard +"@walletconnect/types@npm:2.23.2": + version: 2.23.2 + resolution: "@walletconnect/types@npm:2.23.2" + dependencies: + "@walletconnect/events": "npm:1.0.1" + "@walletconnect/heartbeat": "npm:1.2.2" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/logger": "npm:3.0.2" + events: "npm:3.3.0" + checksum: 10c0/bea88b992bc0068826cd60f8121a72505a3a49b7790830b7abedd2cee2a808ba6edcbdd7c93f9dd811e6282296168a677ebdc3bae981b801ca3c17920716cf0c + languageName: node + linkType: hard + "@walletconnect/types@npm:2.23.9": version: 2.23.9 resolution: "@walletconnect/types@npm:2.23.9" @@ -8019,7 +9082,27 @@ __metadata: languageName: node linkType: hard -"@walletconnect/universal-provider@npm:^2.23.9": +"@walletconnect/universal-provider@npm:2.23.2": + version: 2.23.2 + resolution: "@walletconnect/universal-provider@npm:2.23.2" + dependencies: + "@walletconnect/events": "npm:1.0.1" + "@walletconnect/jsonrpc-http-connection": "npm:1.0.8" + "@walletconnect/jsonrpc-provider": "npm:1.0.14" + "@walletconnect/jsonrpc-types": "npm:1.0.4" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/logger": "npm:3.0.2" + "@walletconnect/sign-client": "npm:2.23.2" + "@walletconnect/types": "npm:2.23.2" + "@walletconnect/utils": "npm:2.23.2" + es-toolkit: "npm:1.39.3" + events: "npm:3.3.0" + checksum: 10c0/9e0dd9a0418a969dbf07ae2475328ba03b46dc5cc3c3b2b5fdfcaa100a3701d15b1a8c098b325f0a3e52197139f99f88f36da0951b794c369a367ee9bc2a5e1f + languageName: node + linkType: hard + +"@walletconnect/universal-provider@npm:2.23.9, @walletconnect/universal-provider@npm:^2.23.9": version: 2.23.9 resolution: "@walletconnect/universal-provider@npm:2.23.9" dependencies: @@ -8039,6 +9122,34 @@ __metadata: languageName: node linkType: hard +"@walletconnect/utils@npm:2.23.2": + version: 2.23.2 + resolution: "@walletconnect/utils@npm:2.23.2" + dependencies: + "@msgpack/msgpack": "npm:3.1.2" + "@noble/ciphers": "npm:1.3.0" + "@noble/curves": "npm:1.9.7" + "@noble/hashes": "npm:1.8.0" + "@scure/base": "npm:1.2.6" + "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/logger": "npm:3.0.2" + "@walletconnect/relay-api": "npm:1.0.11" + "@walletconnect/relay-auth": "npm:1.1.0" + "@walletconnect/safe-json": "npm:1.0.2" + "@walletconnect/time": "npm:1.0.2" + "@walletconnect/types": "npm:2.23.2" + "@walletconnect/window-getters": "npm:1.0.1" + "@walletconnect/window-metadata": "npm:1.0.1" + blakejs: "npm:1.2.1" + bs58: "npm:6.0.0" + detect-browser: "npm:5.3.0" + ox: "npm:0.9.3" + uint8arrays: "npm:3.1.1" + checksum: 10c0/72d3e450d5e18759f4abc047c8e4c224063178d44f863d6921cfd84f533a52e3b8360ea19c1fd8c83484b6b58f91d74aeb524f881030d66b3c65f3e7d7cd8b33 + languageName: node + linkType: hard + "@walletconnect/utils@npm:2.23.9, @walletconnect/utils@npm:^2.23.9": version: 2.23.9 resolution: "@walletconnect/utils@npm:2.23.9" @@ -8372,6 +9483,21 @@ __metadata: languageName: node linkType: hard +"abitype@npm:1.0.6": + version: 1.0.6 + resolution: "abitype@npm:1.0.6" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: 10c0/30ca97010bbf34b9aaed401858eeb6bc30419f7ff11eb34adcb243522dd56c9d8a9d3d406aa5d4f60a7c263902f5136043005698e3f073ea882a4922d43a2929 + languageName: node + linkType: hard + "abitype@npm:1.2.3": version: 1.2.3 resolution: "abitype@npm:1.2.3" @@ -8387,6 +9513,21 @@ __metadata: languageName: node linkType: hard +"abitype@npm:^1.0.6": + version: 1.3.0 + resolution: "abitype@npm:1.3.0" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: 10c0/368b0209c10396952e57d0e927da0fad6c079dd23632ab463da2dfff0fe454ba218804322f6fdd6da014b3fbe96afafb4bb1da3585507f3891c2b47c69c63980 + languageName: node + linkType: hard + "abitype@npm:^1.0.9": version: 1.1.1 resolution: "abitype@npm:1.1.1" @@ -8469,6 +9610,15 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:6": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: "npm:4" + checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 + languageName: node + linkType: hard + "aggregate-error@npm:^3.0.0": version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" @@ -8842,6 +9992,13 @@ __metadata: languageName: node linkType: hard +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + "atomic-sleep@npm:^1.0.0": version: 1.0.0 resolution: "atomic-sleep@npm:1.0.0" @@ -8897,6 +10054,29 @@ __metadata: languageName: node linkType: hard +"axios-retry@npm:^4.5.0": + version: 4.5.0 + resolution: "axios-retry@npm:4.5.0" + dependencies: + is-retry-allowed: "npm:^2.2.0" + peerDependencies: + axios: 0.x || 1.x + checksum: 10c0/574e7b1bf24aad99b560042d232a932d51bfaa29b5a6d4612d748ed799a6f11a5afb2582792492c55d95842200cbdfbe3454027a8c1b9a2d3e895d13c3d03c10 + languageName: node + linkType: hard + +"axios@npm:^1.18.0": + version: 1.20.0 + resolution: "axios@npm:1.20.0" + dependencies: + follow-redirects: "npm:^1.16.0" + form-data: "npm:^4.0.6" + https-proxy-agent: "npm:^5.0.1" + proxy-from-env: "npm:^2.1.0" + checksum: 10c0/976088acf532286356f4c2e65df1ef47ba7da3936d83e928d0d64357bbf5370456abd3eb5826c15df322335fcb1fe200d4a84b4fcf20ffccdd63b40d80fa495c + languageName: node + linkType: hard + "axobject-query@npm:^4.1.0": version: 4.1.0 resolution: "axobject-query@npm:4.1.0" @@ -8976,6 +10156,13 @@ __metadata: languageName: node linkType: hard +"base-x@npm:^5.0.0": + version: 5.0.1 + resolution: "base-x@npm:5.0.1" + checksum: 10c0/4ab6b02262b4fd499b147656f63ce7328bd5f895450401ce58a2f9e87828aea507cf0c320a6d8725389f86e8a48397562661c0bca28ef3276a22821b30f7a713 + languageName: node + linkType: hard + "base16@npm:^1.0.0": version: 1.0.0 resolution: "base16@npm:1.0.0" @@ -8983,6 +10170,13 @@ __metadata: languageName: node linkType: hard +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + "baseline-browser-mapping@npm:^2.11.12, baseline-browser-mapping@npm:^2.9.19": version: 2.11.21 resolution: "baseline-browser-mapping@npm:2.11.21" @@ -9008,6 +10202,13 @@ __metadata: languageName: node linkType: hard +"big.js@npm:6.2.2": + version: 6.2.2 + resolution: "big.js@npm:6.2.2" + checksum: 10c0/58d204f6a1a92508dc2eb98d964e2cc6dabb37a3d9fc8a1f0b77a34dead7c11e17b173d9a6df2d5a7a0f78d5c80853a9ce6df29852da59ab10b088e981195165 + languageName: node + linkType: hard + "big.js@npm:^5.2.2": version: 5.2.2 resolution: "big.js@npm:5.2.2" @@ -9109,6 +10310,15 @@ __metadata: languageName: node linkType: hard +"bs58@npm:6.0.0, bs58@npm:^6.0.0": + version: 6.0.0 + resolution: "bs58@npm:6.0.0" + dependencies: + base-x: "npm:^5.0.0" + checksum: 10c0/61910839746625ee4f69369f80e2634e2123726caaa1da6b3bcefcf7efcd9bdca86603360fed9664ffdabe0038c51e542c02581c72ca8d44f60329fe1a6bc8f4 + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -9116,6 +10326,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.2.1" + checksum: 10c0/2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0 + languageName: node + linkType: hard + "call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": version: 1.0.2 resolution: "call-bind-apply-helpers@npm:1.0.2" @@ -9214,6 +10434,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:5.6.2, chalk@npm:^5.6.2": + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 10c0/99a4b0f0e7991796b1e7e3f52dceb9137cae2a9dfc8fc0784a550dc4c558e15ab32ed70b14b21b52beb2679b4892b41a0aa44249bcb996f01e125d58477c6976 + languageName: node + linkType: hard + "chalk@npm:^2.0.0, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -9232,13 +10459,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^5.6.2": - version: 5.6.2 - resolution: "chalk@npm:5.6.2" - checksum: 10c0/99a4b0f0e7991796b1e7e3f52dceb9137cae2a9dfc8fc0784a550dc4c558e15ab32ed70b14b21b52beb2679b4892b41a0aa44249bcb996f01e125d58477c6976 - languageName: node - linkType: hard - "charenc@npm:0.0.2": version: 0.0.2 resolution: "charenc@npm:0.0.2" @@ -9435,7 +10655,7 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^1.2.1": +"clsx@npm:1.2.1, clsx@npm:^1.2.1": version: 1.2.1 resolution: "clsx@npm:1.2.1" checksum: 10c0/34dead8bee24f5e96f6e7937d711978380647e936a22e76380290e35486afd8634966ce300fc4b74a32f3762c7d4c0303f442c3e259f4ce02374eb0c82834f27 @@ -9481,6 +10701,22 @@ __metadata: languageName: node linkType: hard +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + +"commander@npm:14.0.2": + version: 14.0.2 + resolution: "commander@npm:14.0.2" + checksum: 10c0/245abd1349dbad5414cb6517b7b5c584895c02c4f7836ff5395f301192b8566f9796c82d7bd6c92d07eba8775fe4df86602fca5d86d8d10bcc2aded1e21c2aeb + languageName: node + linkType: hard + "commander@npm:7, commander@npm:^7.2.0": version: 7.2.0 resolution: "commander@npm:7.2.0" @@ -10174,6 +11410,13 @@ __metadata: languageName: node linkType: hard +"dayjs@npm:1.11.13": + version: 1.11.13 + resolution: "dayjs@npm:1.11.13" + checksum: 10c0/a3caf6ac8363c7dade9d1ee797848ddcf25c1ace68d9fe8678ecf8ba0675825430de5d793672ec87b24a69bf04a1544b176547b2539982275d5542a7955f35b7 + languageName: node + linkType: hard + "dayjs@npm:^1.10.7, dayjs@npm:^1.11.7": version: 1.11.7 resolution: "dayjs@npm:1.11.7" @@ -10181,6 +11424,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:4, debug@npm:^4.4.0, debug@npm:^4.4.3": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 + languageName: node + linkType: hard + "debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" @@ -10202,18 +11457,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.4.0, debug@npm:^4.4.3": - version: 4.4.3 - resolution: "debug@npm:4.4.3" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 - languageName: node - linkType: hard - "decamelize@npm:^1.2.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" @@ -10350,6 +11593,13 @@ __metadata: languageName: node linkType: hard +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + "depd@npm:~2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -10551,6 +11801,13 @@ __metadata: languageName: node linkType: hard +"encode-utf8@npm:^1.0.3": + version: 1.0.3 + resolution: "encode-utf8@npm:1.0.3" + checksum: 10c0/6b3458b73e868113d31099d7508514a5c627d8e16d1e0542d1b4e3652299b8f1f590c468e2b9dcdf1b4021ee961f31839d0be9d70a7f2a8a043c63b63c9b3a88 + languageName: node + linkType: hard + "enhanced-resolve@npm:^5.12.0": version: 5.12.0 resolution: "enhanced-resolve@npm:5.12.0" @@ -10914,6 +12171,18 @@ __metadata: languageName: node linkType: hard +"es-toolkit@npm:1.39.3": + version: 1.39.3 + resolution: "es-toolkit@npm:1.39.3" + dependenciesMeta: + "@trivago/prettier-plugin-sort-imports@4.3.0": + unplugged: true + prettier-plugin-sort-re-exports@0.0.1: + unplugged: true + checksum: 10c0/1c85e518b1d129d38fdc5796af353f45e8dcb8a20968ff25da1ae1749fc4a36f914570fcd992df33b47c7bca9f3866d53e4e6fa6411c21eb424e99a3e479c96e + languageName: node + linkType: hard + "es-toolkit@npm:1.44.0": version: 1.44.0 resolution: "es-toolkit@npm:1.44.0" @@ -11665,7 +12934,7 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0": +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.16.0": version: 1.16.0 resolution: "follow-redirects@npm:1.16.0" peerDependenciesMeta: @@ -11693,6 +12962,19 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.6": + version: 4.0.6 + resolution: "form-data@npm:4.0.6" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + hasown: "npm:^2.0.4" + mime-types: "npm:^2.1.35" + checksum: 10c0/43947a77bf0ff45c6ceed789778982d47a3f3e720a74b71721174ebf3310a5f1a8be1d6b38a3ee3688e8a18a2c4273073ec0844cd37efda3eaf46d41c9c318ff + languageName: node + linkType: hard + "formdata-polyfill@npm:^4.0.10": version: 4.0.10 resolution: "formdata-polyfill@npm:4.0.10" @@ -12257,6 +13539,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.4": + version: 2.0.4 + resolution: "hasown@npm:2.0.4" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/2d8de939e270b70618f8cebb69746620db10617dbb495bc66ddad326955ea24d3ca4af133aff3eb7c1853e0218f867bc2b050ec26fe02e3aea58f880ffc5e506 + languageName: node + linkType: hard + "hermes-estree@npm:0.25.1": version: 0.25.1 resolution: "hermes-estree@npm:0.25.1" @@ -12339,6 +13630,16 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^5.0.1": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: "npm:6" + debug: "npm:4" + checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 + languageName: node + linkType: hard + "human-signals@npm:^4.3.0": version: 4.3.1 resolution: "human-signals@npm:4.3.1" @@ -12385,13 +13686,20 @@ __metadata: languageName: node linkType: hard -"idb-keyval@npm:^6.2.1": +"idb-keyval@npm:6.2.1, idb-keyval@npm:^6.2.1": version: 6.2.1 resolution: "idb-keyval@npm:6.2.1" checksum: 10c0/9f0c83703a365e00bd0b4ed6380ce509a06dedfc6ec39b2ba5740085069fd2f2ff5c14ba19356488e3612a2f9c49985971982d836460a982a5d0b4019eeba48a languageName: node linkType: hard +"ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + "ignore@npm:^5.2.0": version: 5.2.4 resolution: "ignore@npm:5.2.4" @@ -12876,6 +14184,13 @@ __metadata: languageName: node linkType: hard +"is-retry-allowed@npm:^2.2.0": + version: 2.2.0 + resolution: "is-retry-allowed@npm:2.2.0" + checksum: 10c0/013be4f8a0a06a49ed1fe495242952e898325d496202a018f6f9fb3fb9ac8fe3b957a9bd62463d68299ae35dbbda680473c85a9bcefca731b49d500d3ccc08ff + languageName: node + linkType: hard + "is-set@npm:^2.0.1, is-set@npm:^2.0.2": version: 2.0.2 resolution: "is-set@npm:2.0.2" @@ -13159,6 +14474,13 @@ __metadata: languageName: node linkType: hard +"jose@npm:^6.2.0": + version: 6.2.12 + resolution: "jose@npm:6.2.12" + checksum: 10c0/e8582b946fabcae228819982dda4849908c353e9cb098f02f773635aa0d2f4917f17484c7441b8d526e564013b4cf96951455c94f81d0a39ee765bad44ce293d + languageName: node + linkType: hard + "js-cookie@npm:^2.2.1": version: 2.2.1 resolution: "js-cookie@npm:2.2.1" @@ -13596,6 +14918,48 @@ __metadata: languageName: node linkType: hard +"lit-element@npm:^4.2.0": + version: 4.2.2 + resolution: "lit-element@npm:4.2.2" + dependencies: + "@lit-labs/ssr-dom-shim": "npm:^1.5.0" + "@lit/reactive-element": "npm:^2.1.0" + lit-html: "npm:^3.3.0" + checksum: 10c0/114ab5837f1f9e03a30b1ed1c055fa0e31f01e444464e5ab0453ef88be12d778508235533267c42614d323e3048ee58f865b5c612948a53bd6219abca404c710 + languageName: node + linkType: hard + +"lit-html@npm:^3.3.0": + version: 3.3.3 + resolution: "lit-html@npm:3.3.3" + dependencies: + "@types/trusted-types": "npm:^2.0.2" + checksum: 10c0/84e57314412ff385cc67fc482d26b77057370e2cfe3c6495cc45f692bdad840d5ed0519ddddcfae1d043bb098c66daa7e807593d5a21ac72094da14274497879 + languageName: node + linkType: hard + +"lit@npm:3.3.0": + version: 3.3.0 + resolution: "lit@npm:3.3.0" + dependencies: + "@lit/reactive-element": "npm:^2.1.0" + lit-element: "npm:^4.2.0" + lit-html: "npm:^3.3.0" + checksum: 10c0/27e6d109c04c8995f47c82a546407c5ed8d399705f9511d1f3ee562eb1ab4bc00fae5ec897da55fb50f202b2a659466e23cccd809d039e7d4f935fcecb2bc6a7 + languageName: node + linkType: hard + +"lit@npm:^3": + version: 3.3.3 + resolution: "lit@npm:3.3.3" + dependencies: + "@lit/reactive-element": "npm:^2.1.0" + lit-element: "npm:^4.2.0" + lit-html: "npm:^3.3.0" + checksum: 10c0/11b6175ebffce92f4cf835ddd8a198d49707c27f34b0a7c538d2cb294f6c2fb7ff40aabd3589fcf0c2ed162404faaf2bb7c966fad9024bb9e02d013e2d5aa0b5 + languageName: node + linkType: hard + "loader-runner@npm:^4.3.1": version: 4.3.1 resolution: "loader-runner@npm:4.3.1" @@ -13936,7 +15300,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.27": +"mime-types@npm:^2.1.27, mime-types@npm:^2.1.35": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -14181,6 +15545,7 @@ __metadata: "@tanstack/react-query": "npm:^5.90.2" "@types/lodash-es": "npm:^4.17.12" "@types/marked": "npm:^6.0.0" + "@walletconnect/ethereum-provider": "npm:2.23.9" "@walletconnect/universal-provider": "npm:^2.23.9" "@walletconnect/utils": "npm:^2.23.9" "@xyflow/react": "npm:^12.5.1" @@ -14764,6 +16129,47 @@ __metadata: languageName: node linkType: hard +"ox@npm:0.14.45": + version: 0.14.45 + resolution: "ox@npm:0.14.45" + dependencies: + "@adraffy/ens-normalize": "npm:^1.11.0" + "@noble/ciphers": "npm:^1.3.0" + "@noble/curves": "npm:1.9.1" + "@noble/hashes": "npm:^1.8.0" + "@scure/bip32": "npm:^1.7.0" + "@scure/bip39": "npm:^1.6.0" + abitype: "npm:^1.2.3" + eventemitter3: "npm:5.0.1" + peerDependencies: + typescript: ">=5.4.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/d1d23e3b85a14d94ec0d608626c08e3dc1852fd90d22486827f1fbe300005958e004ac0db14a8168b2147001c493ff2eb344368513ee8fc82489e45b9115577a + languageName: node + linkType: hard + +"ox@npm:0.6.9": + version: 0.6.9 + resolution: "ox@npm:0.6.9" + dependencies: + "@adraffy/ens-normalize": "npm:^1.10.1" + "@noble/curves": "npm:^1.6.0" + "@noble/hashes": "npm:^1.5.0" + "@scure/bip32": "npm:^1.5.0" + "@scure/bip39": "npm:^1.4.0" + abitype: "npm:^1.0.6" + eventemitter3: "npm:5.0.1" + peerDependencies: + typescript: ">=5.4.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/02a7ea9795eaac0a7a672e983094f62ae6f19b7d0c786e6d7ef4584683faf535b5b133e42452dd3abb77115382e16b2cb5c0f629d5a0f2b80832c47756e0ecd1 + languageName: node + linkType: hard + "ox@npm:0.9.3": version: 0.9.3 resolution: "ox@npm:0.9.3" @@ -15195,6 +16601,13 @@ __metadata: languageName: node linkType: hard +"preact@npm:10.24.2": + version: 10.24.2 + resolution: "preact@npm:10.24.2" + checksum: 10c0/d1d22c5e1abc10eb8f83501857ef22c54a3fda2d20449d06f5b3c7d5ae812bd702c16c05b672138b8906504f9c893e072e9cebcbcada8cac320edf36265788fb + languageName: node + linkType: hard + "preact@npm:^10.28.0": version: 10.28.2 resolution: "preact@npm:10.28.2" @@ -15313,6 +16726,20 @@ __metadata: languageName: node linkType: hard +"proxy-compare@npm:^3.0.1": + version: 3.0.1 + resolution: "proxy-compare@npm:3.0.1" + checksum: 10c0/1e3631ef32603d4de263860ce02d84b48384dce9b62238b2148b3c58a4e4ec5b06644615dcc196a339f73b9695443317099d55a9173e02ce8492088c9330c00b + languageName: node + linkType: hard + +"proxy-from-env@npm:^2.1.0": + version: 2.1.0 + resolution: "proxy-from-env@npm:2.1.0" + checksum: 10c0/ed01729fd4d094eab619cd7e17ce3698b3413b31eb102c4904f9875e677cd207392795d5b4adee9cec359dfd31c44d5ad7595a3a3ad51c40250e141512281c58 + languageName: node + linkType: hard + "punycode@npm:^2.1.0": version: 2.3.0 resolution: "punycode@npm:2.3.0" @@ -15341,6 +16768,20 @@ __metadata: languageName: node linkType: hard +"qrcode@npm:1.5.3": + version: 1.5.3 + resolution: "qrcode@npm:1.5.3" + dependencies: + dijkstrajs: "npm:^1.0.1" + encode-utf8: "npm:^1.0.3" + pngjs: "npm:^5.0.0" + yargs: "npm:^15.3.1" + bin: + qrcode: bin/qrcode + checksum: 10c0/eb961cd8246e00ae338b6d4a3a28574174456db42cec7070aa2b315fb6576b7f040b0e4347be290032e447359a145c68cb60ef884d55ca3e1076294fed46f719 + languageName: node + linkType: hard + "qrcode@npm:^1.5.4": version: 1.5.4 resolution: "qrcode@npm:1.5.4" @@ -16650,6 +18091,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:7.7.2": + version: 7.7.2 + resolution: "semver@npm:7.7.2" + bin: + semver: bin/semver.js + checksum: 10c0/aca305edfbf2383c22571cb7714f48cadc7ac95371b4b52362fb8eeffdfbc0de0669368b82b2b15978f8848f01d7114da65697e56cd8c37b0dab8c58e543f9ea + languageName: node + linkType: hard + "semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -18236,6 +19686,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:^7.19.2": + version: 7.29.1 + resolution: "undici-types@npm:7.29.1" + checksum: 10c0/de05d1d4d97ef821a4c6ee17f71fa651f1ba68fe1e1f2f07dd8148eafe4c60a66483b838ed8ffaa7aba88bc41f2e5b9c60a3ff321a318598bdf68ba5ea5189a3 + languageName: node + linkType: hard + "undici-types@npm:~6.19.2": version: 6.19.8 resolution: "undici-types@npm:6.19.8" @@ -18590,6 +20047,44 @@ __metadata: languageName: node linkType: hard +"valtio@npm:2.1.7": + version: 2.1.7 + resolution: "valtio@npm:2.1.7" + dependencies: + proxy-compare: "npm:^3.0.1" + peerDependencies: + "@types/react": ">=18.0.0" + react: ">=18.0.0" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + checksum: 10c0/727976e35c7b8853b37cfc5ab14dd5be46ddf572482aa2d888c7e41e9b2d54bb5962c8dd7e26bd9ae69687c818464daf0a814098c3bc64b47e1363f0f7109423 + languageName: node + linkType: hard + +"viem@npm:>=2.37.9, viem@npm:^2.1.1, viem@npm:^2.31.7, viem@npm:^2.47.0": + version: 2.56.8 + resolution: "viem@npm:2.56.8" + dependencies: + "@noble/curves": "npm:1.9.1" + "@noble/hashes": "npm:1.8.0" + "@scure/bip32": "npm:1.7.0" + "@scure/bip39": "npm:1.6.0" + abitype: "npm:1.2.3" + isows: "npm:1.0.7" + ox: "npm:0.14.45" + ws: "npm:8.21.0" + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/7ac525363f6032b32b7a2f2e18f922b8cf8e32fe1c12e855e7f995fdfbda978c7b4a7689a51d63a8d26fafd89804a2bab154943e9ffbee28496aee4b714e2b40 + languageName: node + linkType: hard + "viem@npm:^2.48.4": version: 2.48.4 resolution: "viem@npm:2.48.4" @@ -19134,6 +20629,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:8.21.0": + version: 8.21.0 + resolution: "ws@npm:8.21.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/ef4a243476283fc49bc7550966c4af4aa0eef56273837211e700de3b664e08604a760cdddcb5ba43c049140e74ccfec5b0ee0bb439e08c2adf9138902fdde5f9 + languageName: node + linkType: hard + "ws@npm:^7.5.1": version: 7.5.9 resolution: "ws@npm:7.5.9" @@ -19164,6 +20674,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.19.0": + version: 8.21.3 + resolution: "ws@npm:8.21.3" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/7b28dc2863ea0e2cece68d142a3eee90361021b73f750431e6d8076bb7dede5fdfdb75b3d29534b62f411261147b76b1bc80fb5cc63ab0aabd467280e85b22e0 + languageName: node + linkType: hard + "xml-name-validator@npm:^5.0.0": version: 5.0.0 resolution: "xml-name-validator@npm:5.0.0" @@ -19281,6 +20806,13 @@ __metadata: languageName: node linkType: hard +"zod@npm:3.22.4": + version: 3.22.4 + resolution: "zod@npm:3.22.4" + checksum: 10c0/7578ab283dac0eee66a0ad0fc4a7f28c43e6745aadb3a529f59a4b851aa10872b3890398b3160f257f4b6817b4ce643debdda4fb21a2c040adda7862cab0a587 + languageName: node + linkType: hard + "zod@npm:^3.17.3, zod@npm:^3.22.2, zod@npm:^3.23.8": version: 3.23.8 resolution: "zod@npm:3.23.8" @@ -19295,6 +20827,13 @@ __metadata: languageName: node linkType: hard +"zod@npm:^3.25.76": + version: 3.25.76 + resolution: "zod@npm:3.25.76" + checksum: 10c0/5718ec35e3c40b600316c5b4c5e4976f7fee68151bc8f8d90ec18a469be9571f072e1bbaace10f1e85cf8892ea12d90821b200e980ab46916a6166a4260a983c + languageName: node + linkType: hard + "zustand@npm:5.0.0": version: 5.0.0 resolution: "zustand@npm:5.0.0" @@ -19316,6 +20855,27 @@ __metadata: languageName: node linkType: hard +"zustand@npm:5.0.3": + version: 5.0.3 + resolution: "zustand@npm:5.0.3" + peerDependencies: + "@types/react": ">=18.0.0" + immer: ">=9.0.6" + react: ">=18.0.0" + use-sync-external-store: ">=1.2.0" + peerDependenciesMeta: + "@types/react": + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + checksum: 10c0/dad96c6c123fda088c583d5df6692e9245cd207583078dc15f93d255a67b0f346bad4535545c98852ecde93d254812a0c799579dfde2ab595016b99fbe20e4d5 + languageName: node + linkType: hard + "zustand@npm:^4.4.0": version: 4.5.6 resolution: "zustand@npm:4.5.6" From ab27904d5213c37120d6cb6ff1396f9e214fbc94 Mon Sep 17 00:00:00 2001 From: wolyshaw Date: Sun, 20 Sep 2026 13:54:45 +0800 Subject: [PATCH 2/7] improve, #5533 --- .../next-common/components/header/drawer.jsx | 4 +- .../components/linkedAddress/popup.jsx | 65 ++++--- .../next-common/components/login/web3/evm.jsx | 66 +++++-- .../components/login/web3/walletconnect.jsx | 111 ++++++------ .../components/wallet/walletConnectWallet.jsx | 4 +- .../context/connectedAccount/index.js | 54 +++++- .../context/wagmi/walletConnectEvm.js | 30 +++- .../context/walletconnect/index.jsx | 165 ++++++------------ .../hooks/connect/useEVMWalletConnect.js | 69 ++++++++ .../hooks/connect/useEVMWallets.js | 10 +- .../next-common/hooks/connect/useWeb3Login.js | 6 +- 11 files changed, 370 insertions(+), 214 deletions(-) create mode 100644 packages/next-common/hooks/connect/useEVMWalletConnect.js diff --git a/packages/next-common/components/header/drawer.jsx b/packages/next-common/components/header/drawer.jsx index 5f7791378b..7ca5ce5886 100644 --- a/packages/next-common/components/header/drawer.jsx +++ b/packages/next-common/components/header/drawer.jsx @@ -163,7 +163,9 @@ export default function SidebarAccount() { export function WalletConnectDisconnectLoading({ type }) { const { disconnectLoading } = useWalletConnect(); - if (!disconnectLoading || type !== "logout") { + const { disconnectLoading: evmDisconnectLoading } = + useConnectedAccountContext(); + if (!(disconnectLoading || evmDisconnectLoading) || type !== "logout") { return null; } return ; diff --git a/packages/next-common/components/linkedAddress/popup.jsx b/packages/next-common/components/linkedAddress/popup.jsx index c5f5ccbc00..27632ddfeb 100644 --- a/packages/next-common/components/linkedAddress/popup.jsx +++ b/packages/next-common/components/linkedAddress/popup.jsx @@ -1,10 +1,12 @@ import { noop } from "lodash-es"; import Popup from "../popup/wrapper/Popup"; -import { useAccount, useConnect } from "wagmi"; +import { useConnection, useConnect, useConnectors } from "wagmi"; import WalletSubstrateSingleSigOptions from "../wallet/options/substrate/singleSig"; import WalletEVMOptions from "../wallet/options/evm"; import { useWeb3WalletView } from "next-common/hooks/connect/useWeb3WalletView"; import { useUnmount } from "react-use"; +import useEVMWalletConnect from "next-common/hooks/connect/useEVMWalletConnect"; +import { WalletConnectQrCode } from "../login/web3/walletconnect"; export default function LinkedAddressSelectWalletPopup({ selectedWallet, @@ -12,11 +14,38 @@ export default function LinkedAddressSelectWalletPopup({ onClose = noop, }) { const { isSubstrateView, isEVMView, resetView } = useWeb3WalletView(); - const { connector } = useAccount(); - const { connect } = useConnect(); + const { connector } = useConnection(); + const { mutate } = useConnect(); + const connectors = useConnectors(); + const walletConnect = useEVMWalletConnect( + connectors.find((item) => item.id === "walletConnect"), + ); useUnmount(resetView); + async function handleSelectWallet(wallet) { + if (wallet.connector?.id === connector?.id) { + onSelect(wallet); + return; + } + + if (wallet.connector.id === "walletConnect") { + if (await walletConnect.open()) { + onSelect(wallet); + } + return; + } + + mutate( + { connector: wallet.connector }, + { + onSuccess() { + onSelect(wallet); + }, + }, + ); + } + return (

@@ -31,28 +60,18 @@ export default function LinkedAddressSelectWalletPopup({ /> )} - {isEVMView && ( + {isEVMView && walletConnect.isOpen && ( + + )} + + {isEVMView && !walletConnect.isOpen && ( { - function select() { - onSelect(wallet); - } - - if (wallet.connector?.id === connector?.id) { - select(); - return; - } - - connect( - { connector: wallet.connector }, - { - onSuccess() { - select(); - }, - }, - ); - }} + onSelect={handleSelectWallet} /> )} diff --git a/packages/next-common/components/login/web3/evm.jsx b/packages/next-common/components/login/web3/evm.jsx index f2428b63f7..1ca18413fc 100644 --- a/packages/next-common/components/login/web3/evm.jsx +++ b/packages/next-common/components/login/web3/evm.jsx @@ -9,29 +9,33 @@ import { useWeb3Login } from "next-common/hooks/connect/useWeb3Login"; import PrimaryButton from "next-common/lib/button/primary"; import { metamask } from "next-common/utils/consts/connect"; import { useEffect, useState } from "react"; -import { useAccount, useConnect } from "wagmi"; +import { useConnection, useConnect } from "wagmi"; import LoginAddressNotDetectedMessage from "../addressNotDetectedMessage"; import { Label } from "../styled"; +import useEVMWalletConnect from "next-common/hooks/connect/useEVMWalletConnect"; +import { WalletConnectQrCode } from "./walletconnect"; +import { normalizedMetaMaskAccounts } from "next-common/utils/metamask"; export default function LoginWeb3EVM() { const { lastConnectedAccount } = useConnectedAccountContext(); - const { connector, isConnecting, isConnected } = useAccount(); - const { connect, isError } = useConnect(); + const { connector, isConnecting, isConnected } = useConnection(); + const { mutate, isError } = useConnect(); const [selectedAccount, setSelectedAccount] = useState(); const { accounts } = useEVMAccounts(); const wallets = useEVMWallets(); + const walletConnect = useEVMWalletConnect( + find(wallets, ["connector.id", "walletConnect"])?.connector, + ); const connectedWallet = find(wallets, ["connector.id", connector?.id]); const [web3Login, web3Loading] = useWeb3Login(); const [selectedWallet, setSelectedWallet] = useState(); useEffect(() => { - if (selectedWallet) { + if (selectedWallet?.connector?.id === connectedWallet?.connector?.id) { return; } - setSelectedWallet(connectedWallet); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [connectedWallet]); + }, [connectedWallet, selectedWallet]); useEffect(() => { setSelectedWallet(connectedWallet); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -46,23 +50,51 @@ export default function LoginWeb3EVM() { setSelectedAccount(lastUsedAddress); } else if (accounts?.length > 0) { setSelectedAccount(accounts?.[0]); + } else { + setSelectedAccount(undefined); } }, [accounts, lastConnectedAccount?.address]); + async function handleSelectWallet(wallet) { + if (wallet.connector.id === connector?.id && isConnected) { + setSelectedWallet(wallet); + return; + } + if (wallet.connector.id === "walletConnect") { + await walletConnect.open(async ({ accounts: addresses }) => { + const [account] = normalizedMetaMaskAccounts( + addresses, + wallet.connector.id, + ); + await web3Login({ account, wallet: metamask.extensionName }); + }); + return; + } + mutate( + { connector: wallet.connector }, + { + onSuccess() { + setSelectedWallet(wallet); + }, + }, + ); + } + + if (walletConnect.isOpen) { + return ( + + ); + } + return (
{ - connect( - { connector: wallet.connector }, - { - onSuccess() { - setSelectedWallet(wallet); - }, - }, - ); - }} + onSelect={handleSelectWallet} /> {isConnecting && ( diff --git a/packages/next-common/components/login/web3/walletconnect.jsx b/packages/next-common/components/login/web3/walletconnect.jsx index 29b39194a6..6ef9686308 100644 --- a/packages/next-common/components/login/web3/walletconnect.jsx +++ b/packages/next-common/components/login/web3/walletconnect.jsx @@ -9,7 +9,7 @@ import { useWalletConnectAccounts } from "next-common/hooks/connect/useWalletCon import { useWeb3Login } from "next-common/hooks/connect/useWeb3Login"; import { useWeb3WalletView } from "next-common/hooks/connect/useWeb3WalletView"; import { toDataURL as QrcodeToDataURL } from "qrcode"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { useInterval, useUnmount } from "react-use"; import { Skeleton } from "next-common/components/skeleton"; import { useDispatch } from "react-redux"; @@ -20,41 +20,31 @@ const REFRESH_QRCODE_INTERVAL = 4 * 60 * 1000; // 4 minutes export default function LoginWeb3WalletConnect() { const { setView } = useWeb3WalletView(); - const { connect, session, provider, isEvmSession, connectEvm } = - useWalletConnect(); + const { connect, session, provider } = useWalletConnect(); const dispatch = useDispatch(); - const [qrCode, setQrCode] = useState(null); const [uri, setUri] = useState(null); const [web3Login] = useWeb3Login(); const accounts = useWalletConnectAccounts(); + const loginSession = useRef(null); const [refreshCount, setRefreshCount] = useState(0); useEffect(() => { - if (!isEvmSession || !provider) { + if (session) { return; } + let active = true; - connectEvm() - .then(() => { - if (active) setView("evm"); + connect() + .then((result) => { + if (active && result?.uri) { + setUri(result.uri); + } }) .catch((error) => dispatch(newErrorToast(error.message))); return () => { active = false; }; - }, [isEvmSession, provider, connectEvm, setView, dispatch]); - - useEffect(() => { - if (session) { - return; - } - - connect().then((result) => { - if (result?.uri) { - setUri(result.uri); - } - }); - }, [connect, session, refreshCount]); + }, [connect, session, refreshCount, dispatch]); useInterval( () => { @@ -64,29 +54,20 @@ export default function LoginWeb3WalletConnect() { ); useEffect(() => { - if (!uri) { + if ( + !accounts?.length || + !session?.topic || + loginSession.current === session.topic + ) { return; } - - QrcodeToDataURL(uri, { - width: SIZE, - height: SIZE, - margin: 0, - }).then(setQrCode); - }, [uri]); - - useEffect(() => { - if (!isEvmSession && accounts?.length) { - const account = accounts[0]; - - if (account) { - web3Login({ - account: { address: account?.address }, - wallet: account.meta?.source, - }); - } - } - }, [accounts, web3Login, isEvmSession]); + loginSession.current = session.topic; + const account = accounts[0]; + web3Login({ + account: { address: account.address }, + wallet: account.meta?.source, + }); + }, [accounts, session?.topic, web3Login]); useUnmount(() => { if (provider) { @@ -101,16 +82,48 @@ export default function LoginWeb3WalletConnect() { } }); + return ( + setView("substrate")} + /> + ); +} + +export function WalletConnectQrCode({ uri, backTitle, onBack }) { + const [qrCode, setQrCode] = useState(null); + const dispatch = useDispatch(); + + useEffect(() => { + let active = true; + setQrCode(null); + if (uri) { + QrcodeToDataURL(uri, { width: SIZE, height: SIZE, margin: 0 }) + .then((code) => { + if (active) { + setQrCode(code); + } + }) + .catch((error) => { + if (active) { + dispatch(newErrorToast(error.message)); + } + }); + } + return () => { + active = false; + }; + }, [uri, dispatch]); + return (
} - title="Back to Substrate" - onClick={() => { - setView("substrate"); - }} + title={backTitle} + onClick={onBack} /> @@ -118,10 +131,10 @@ export default function LoginWeb3WalletConnect() {
-
+
{qrCode ? ( - /* eslint-disable-next-line */ - qrcode + // eslint-disable-next-line @next/next/no-img-element + WalletConnect QR code ) : ( )} diff --git a/packages/next-common/components/wallet/walletConnectWallet.jsx b/packages/next-common/components/wallet/walletConnectWallet.jsx index 781252bc0c..f9557925be 100644 --- a/packages/next-common/components/wallet/walletConnectWallet.jsx +++ b/packages/next-common/components/wallet/walletConnectWallet.jsx @@ -5,7 +5,7 @@ import WalletOption from "./walletOption"; export default function WalletConnectWallet({ wallet, selected, onClick }) { const { setView } = useWeb3WalletView(); - const { provider, session, isEvmSession } = useWalletConnect(); + const { provider, session } = useWalletConnect(); return ( } title={wallet.title} onClick={() => { - if (session && !isEvmSession && onClick) { + if (session && onClick) { onClick?.(wallet); } else { setView("walletconnect"); diff --git a/packages/next-common/context/connectedAccount/index.js b/packages/next-common/context/connectedAccount/index.js index 7342fd89d9..65f299945b 100644 --- a/packages/next-common/context/connectedAccount/index.js +++ b/packages/next-common/context/connectedAccount/index.js @@ -1,6 +1,14 @@ import { CACHE_KEY } from "next-common/utils/constants"; import { clearCookie, setCookie } from "next-common/utils/viewfuncs/cookies"; -import { createContext, useCallback, useContext, useState } from "react"; +import { + createContext, + useCallback, + useContext, + useEffect, + useRef, + useState, +} from "react"; +import { useConnectors, useDisconnect } from "wagmi"; import { fetchAndUpdateUser, logoutUser, useUserContext } from "../user"; import { useLocalStorage } from "react-use"; import { clearMyMultisigsData } from "next-common/store/reducers/multisigSlice"; @@ -27,6 +35,15 @@ export function ConnectedAccountProvider({ ); const dispatch = useDispatch(); const { setPageLoading } = usePageLoading(); + const connectors = useConnectors(); + const { mutateAsync } = useDisconnect(); + const isDisconnecting = useRef(false); + const [disconnectLoading, setDisconnectLoading] = useState(false); + const walletConnect = connectors.find( + (connector) => + connector.id === "walletConnect" && + connector.id === connectedAccount?.connectorId, + ); const saveConnectedAccount = useCallback((account) => { savedConnectedAccount = account; @@ -41,7 +58,7 @@ export function ConnectedAccountProvider({ [setLastConnectedAccount], ); - const disconnect = useCallback(async () => { + const clearAccount = useCallback(async () => { await logoutUser(userContext); ssrConnectedAccount = null; savedConnectedAccount = null; @@ -50,11 +67,39 @@ export function ConnectedAccountProvider({ dispatch(clearMyMultisigsData()); }, [userContext, dispatch]); + useEffect(() => { + function handleDisconnect() { + if (!isDisconnecting.current) { + clearAccount().catch(console.error); + } + } + walletConnect?.emitter.on("disconnect", handleDisconnect); + return () => walletConnect?.emitter.off("disconnect", handleDisconnect); + }, [walletConnect, clearAccount]); + + const disconnect = useCallback(async () => { + isDisconnecting.current = true; + setDisconnectLoading(!!walletConnect); + try { + try { + if (walletConnect) { + await mutateAsync({ connector: walletConnect }); + } + } finally { + await clearAccount(); + } + } finally { + isDisconnecting.current = false; + setDisconnectLoading(false); + } + }, [walletConnect, mutateAsync, clearAccount]); + const connect = useCallback( async (account) => { try { setPageLoading(true); - await disconnect(); + // Selecting an account must keep its wallet session available. + await clearAccount(); const mockAddress = getMockAccountAddress(); const effectiveAccount = mockAddress ? { ...account, address: mockAddress } @@ -69,7 +114,7 @@ export function ConnectedAccountProvider({ } }, [ - disconnect, + clearAccount, saveLastConnectedAccount, saveConnectedAccount, userContext, @@ -84,6 +129,7 @@ export function ConnectedAccountProvider({ lastConnectedAccount, connect, disconnect, + disconnectLoading, saveConnectedAccount, saveLastConnectedAccount, }} diff --git a/packages/next-common/context/wagmi/walletConnectEvm.js b/packages/next-common/context/wagmi/walletConnectEvm.js index 91d50f23e4..9c7f0af89e 100644 --- a/packages/next-common/context/wagmi/walletConnectEvm.js +++ b/packages/next-common/context/wagmi/walletConnectEvm.js @@ -9,11 +9,11 @@ export default function walletConnectEvm(config) { ? `https://${domain || CHAIN}.subsquare.io` : window.location.origin; - return walletConnect({ + const connector = walletConnect({ projectId: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID, // Keep EVM sessions separate from the existing Polkadot provider. customStoragePrefix: "subsquare-evm", - showQrModal: true, + showQrModal: false, metadata: { name: "Subsquare", description, @@ -21,4 +21,30 @@ export default function walletConnectEvm(config) { icons: [`${url}/favicon.ico`], }, })(config); + + let pendingConnection; + let uri; + return { + ...connector, + onDisplayUri(value) { + uri = value; + connector.onDisplayUri(value); + }, + async connect(parameters) { + // Reopening our QR view must reuse the pending pairing request. + if (pendingConnection) { + if (uri) { + this.onDisplayUri(uri); + } + return await pendingConnection; + } + pendingConnection = connector.connect + .call(this, parameters) + .finally(() => { + pendingConnection = null; + uri = null; + }); + return await pendingConnection; + }, + }; } diff --git a/packages/next-common/context/walletconnect/index.jsx b/packages/next-common/context/walletconnect/index.jsx index 07a6146457..d712afac8c 100644 --- a/packages/next-common/context/walletconnect/index.jsx +++ b/packages/next-common/context/walletconnect/index.jsx @@ -6,7 +6,6 @@ import { useCallback, useContext, useEffect, - useMemo, useRef, useState, } from "react"; @@ -19,9 +18,7 @@ import { newWarningToast, } from "next-common/store/reducers/toastSlice"; import getChainSettings from "next-common/utils/consts/settings"; -import { connect as connectWagmi, getAccount } from "@wagmi/core"; -import { injected } from "wagmi/connectors"; -import { wagmiConfig } from "next-common/context/wagmi"; +import WalletTypes from "next-common/utils/consts/walletTypes"; const projectId = process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID; @@ -38,8 +35,6 @@ export const defaultWalletConnect = { fetchAddresses: () => Promise.resolve([]), signWcMessage: () => Promise.resolve({ signature: "0x" }), signWcTx: () => Promise.resolve({ signature: "0x" }), - isEvmSession: false, - connectEvm: () => Promise.resolve(), }; const WalletConnectContext = createContext(defaultWalletConnect); @@ -61,6 +56,16 @@ function useWalletConnectChainId() { return caip ? `polkadot:${caip}` : null; } +function isSubstrateSession(session) { + const accounts = Object.values(session?.namespaces || {}).flatMap( + (namespace) => namespace.accounts || [], + ); + return ( + accounts.length > 0 && + accounts.every((account) => account.startsWith("polkadot:")) + ); +} + let providerPromise; async function initWalletConnectProvider() { @@ -79,14 +84,20 @@ async function initWalletConnectProvider() { url, icons: [`${url}/favicon.ico`], }, - }); + }) + .then(async (provider) => { + // Discard EVM sessions created by the former cross-namespace connection. + if (provider.session && !isSubstrateSession(provider.session)) { + await provider.disconnect(); + } + return provider; + }) + .catch((error) => { + providerPromise = null; + throw error; + }); - try { - return await providerPromise; - } catch (error) { - providerPromise = null; - throw error; - } + return await providerPromise; } export default function WalletConnectProvider({ children }) { @@ -99,76 +110,10 @@ export default function WalletConnectProvider({ children }) { const [provider, setProvider] = useState(defaultWalletConnect.provider); const [session, setSession] = useState(defaultWalletConnect.session); const pendingConnection = useRef(null); - const pendingEvmConnection = useRef(null); - const sessionAccounts = Object.values(session?.namespaces || {}).flatMap( - (namespace) => namespace.accounts || [], - ); - const isEvmSession = - !sessionAccounts.some((account) => account.startsWith("polkadot:")) && - sessionAccounts.some((account) => account.startsWith("eip155:")); - const evmConnector = useMemo( - () => - injected({ - shimDisconnect: false, - target: { - id: "walletConnectUniversal", - name: "WalletConnect", - provider: () => provider, - }, - }), - [provider], - ); - const connectEvm = useCallback(async () => { - if ( - !provider || - !isEvmSession || - provider.session?.topic !== session?.topic - ) { - throw new Error("No EVM WalletConnect session"); - } - const current = getAccount(wagmiConfig); - if ( - current.isConnected && - current.connector?.id === "walletConnectUniversal" - ) { - return; - } - pendingEvmConnection.current ??= connectWagmi(wagmiConfig, { - connector: evmConnector, - }).finally(() => { - pendingEvmConnection.current = null; - }); - return await pendingEvmConnection.current; - }, [provider, isEvmSession, evmConnector, session?.topic]); - - useEffect(() => { - if ( - isEvmSession && - provider && - provider.session?.topic === session?.topic && - connectedAccount?.connectorId === "walletConnectUniversal" - ) { - connectEvm().catch((error) => dispatch(newErrorToast(error.message))); - } - }, [ - provider, - session?.topic, - isEvmSession, - connectedAccount?.connectorId, - connectEvm, - dispatch, - ]); - const [cachedSession, setCachedSession] = useLocalStorage( CACHE_KEY.walletConnectSession, session, ); - useEffect(() => { - if (cachedSession) { - setSession(cachedSession); - } - }, [cachedSession]); - const clearSession = useCallback(() => { setSession(null); setCachedSession(null); @@ -176,8 +121,24 @@ export default function WalletConnectProvider({ children }) { const disconnectCombination = useCallback(async () => { clearSession(); - await disconnectAccount(); - }, [clearSession, disconnectAccount]); + if ( + connectedAccount?.wallet === WalletTypes.WALLETCONNECT || + connectedAccount?.connectorId === "walletConnectUniversal" + ) { + await disconnectAccount(); + } + }, [clearSession, connectedAccount, disconnectAccount]); + + useEffect(() => { + if (!cachedSession) { + return; + } + if (!isSubstrateSession(cachedSession)) { + disconnectCombination(); + return; + } + setSession(cachedSession); + }, [cachedSession, disconnectCombination]); useEffect(() => { if (provider) { @@ -197,38 +158,26 @@ export default function WalletConnectProvider({ children }) { return await pendingConnection.current; } - const chains = wagmiConfig.chains; pendingConnection.current = new Promise((resolve) => { const onDisplayUri = (uri) => resolve({ uri }); provider.once("display_uri", onDisplayUri); provider .connect({ - optionalNamespaces: { + namespaces: { polkadot: { chains: [chainId], methods: ["polkadot_signTransaction", "polkadot_signMessage"], events: ["chainChanged", "accountsChanged"], }, - eip155: { - chains: chains.map((chain) => `eip155:${chain.id}`), - methods: [ - "personal_sign", - "eth_sendTransaction", - "eth_signTypedData_v4", - "wallet_addEthereumChain", - "wallet_switchEthereumChain", - ], - events: ["chainChanged", "accountsChanged"], - rpcMap: Object.fromEntries( - chains.map((chain) => [ - chain.id, - chain.rpcUrls.default.http[0], - ]), - ), - }, }, }) - .then((approvedSession) => { + .then(async (approvedSession) => { + if (!isSubstrateSession(approvedSession)) { + if (provider.session) { + await provider.disconnect(); + } + throw new Error("Please connect a Substrate account"); + } setSession(approvedSession); setCachedSession(approvedSession); resolve(); @@ -263,7 +212,7 @@ export default function WalletConnectProvider({ children }) { }, [provider, session, disconnectCombination]); const fetchAddresses = useCallback(async () => { - if (!provider || !session || !caip || isEvmSession) { + if (!provider || !session || !caip) { return []; } @@ -286,7 +235,7 @@ export default function WalletConnectProvider({ children }) { } return filteredAccounts; - }, [provider, session, caip, isEvmSession, disconnectCombination]); + }, [provider, session, caip, disconnectCombination]); // Attempt to sign a message and receive a signature const signWcMessage = useCallback( @@ -331,7 +280,9 @@ export default function WalletConnectProvider({ children }) { const onSessionExpire = useCallback( ({ topic }) => { - if (topic !== session?.topic) return; + if (topic !== session?.topic) { + return; + } dispatch( newErrorToast("Session expired, please connect to WalletConnect again"), ); @@ -342,7 +293,9 @@ export default function WalletConnectProvider({ children }) { const onSessionDelete = useCallback( ({ topic }) => { - if (topic !== session?.topic) return; + if (topic !== session?.topic) { + return; + } dispatch(newErrorToast("The connection has been disconnected")); disconnectCombination(); }, @@ -394,8 +347,6 @@ export default function WalletConnectProvider({ children }) { signWcMessage, signWcTx, disconnectLoading, - isEvmSession, - connectEvm, }} > {children} diff --git a/packages/next-common/hooks/connect/useEVMWalletConnect.js b/packages/next-common/hooks/connect/useEVMWalletConnect.js new file mode 100644 index 0000000000..ed15a05991 --- /dev/null +++ b/packages/next-common/hooks/connect/useEVMWalletConnect.js @@ -0,0 +1,69 @@ +import { useEffect, useRef, useState } from "react"; +import { useDispatch } from "react-redux"; +import { useConnect } from "wagmi"; +import { newErrorToast } from "next-common/store/reducers/toastSlice"; + +export default function useEVMWalletConnect(connector) { + const { mutateAsync } = useConnect(); + const dispatch = useDispatch(); + const [isOpen, setIsOpen] = useState(false); + const [uri, setUri] = useState(null); + const isActive = useRef(false); + const isOpenRef = useRef(false); + const pendingConnection = useRef(null); + + useEffect(() => { + isActive.current = true; + function onMessage(message) { + if (message.type === "display_uri") { + setUri(message.data); + } + } + connector?.emitter.on("message", onMessage); + return () => { + isActive.current = false; + connector?.emitter.off("message", onMessage); + }; + }, [connector]); + + async function open(onConnected) { + if (!connector) { + return false; + } + isOpenRef.current = true; + setIsOpen(true); + if (pendingConnection.current) { + return false; + } + setUri(null); + try { + pendingConnection.current = mutateAsync({ connector }); + const connection = await pendingConnection.current; + if (isActive.current && isOpenRef.current) { + await onConnected?.(connection); + } + if (isActive.current) { + setIsOpen(false); + } + return isActive.current && isOpenRef.current; + } catch (error) { + if (isActive.current) { + setIsOpen(false); + dispatch(newErrorToast(error.message)); + } + return false; + } finally { + pendingConnection.current = null; + if (isActive.current) { + setUri(null); + } + } + } + + function close() { + isOpenRef.current = false; + setIsOpen(false); + } + + return { uri, isOpen, open, close }; +} diff --git a/packages/next-common/hooks/connect/useEVMWallets.js b/packages/next-common/hooks/connect/useEVMWallets.js index 9043c7abe7..a243e09a7d 100644 --- a/packages/next-common/hooks/connect/useEVMWallets.js +++ b/packages/next-common/hooks/connect/useEVMWallets.js @@ -9,7 +9,7 @@ import { subWallet, talisman, } from "next-common/utils/consts/connect"; -import { useAccount, useConnectors } from "wagmi"; +import { useConnectors } from "wagmi"; import { useDetectEthereum } from "./useDetectEthereum"; import { useHasCoinbaseWallet } from "./useHasCoinbaseWallet"; @@ -25,13 +25,7 @@ const fixedWallets = [ ]; export function useEVMWallets() { - const { connector: activeConnector } = useAccount(); - const connectors = useConnectors().map((connector) => - connector.id === "walletConnect" && - activeConnector?.id === "walletConnectUniversal" - ? activeConnector - : connector, - ); + const connectors = useConnectors(); const ethereum = useDetectEthereum(); /** diff --git a/packages/next-common/hooks/connect/useWeb3Login.js b/packages/next-common/hooks/connect/useWeb3Login.js index 42eff2a28e..ada0ac724d 100644 --- a/packages/next-common/hooks/connect/useWeb3Login.js +++ b/packages/next-common/hooks/connect/useWeb3Login.js @@ -7,7 +7,7 @@ import { setLoginResult, } from "next-common/store/reducers/userSlice"; import { useConnectedAccountContext } from "next-common/context/connectedAccount"; -import { useAsyncFn } from "react-use"; +import { useAsyncFn, useMountedState } from "react-use"; import { useChain } from "next-common/context/chain"; export function useWeb3Login() { @@ -15,6 +15,7 @@ export function useWeb3Login() { const dispatch = useDispatch(); const { closeLoginPopup } = useLoginPopup(); const { connect: connectAccount } = useConnectedAccountContext(); + const isMounted = useMountedState(); const [state, web3Login] = useAsyncFn( async ({ account, wallet }) => { @@ -32,6 +33,9 @@ export function useWeb3Login() { wallet, }; await connectAccount(accountInfo); + if (!isMounted()) { + return; + } dispatch(setLoginResult(LoginResult.Connected)); closeLoginPopup(); From 236035911111b2206e0dc4ced9272286b80fffff Mon Sep 17 00:00:00 2001 From: wolyshaw Date: Sun, 20 Sep 2026 14:42:28 +0800 Subject: [PATCH 3/7] fix, #5533 --- .../context/connectedAccount/index.js | 25 ++++++++++++++++--- .../context/walletconnect/index.jsx | 3 ++- .../utils/consts/settings/hydradx.js | 2 +- .../utils/sendTransaction/sendEvmTx.js | 6 ----- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/packages/next-common/context/connectedAccount/index.js b/packages/next-common/context/connectedAccount/index.js index 65f299945b..c324be7869 100644 --- a/packages/next-common/context/connectedAccount/index.js +++ b/packages/next-common/context/connectedAccount/index.js @@ -68,14 +68,31 @@ export function ConnectedAccountProvider({ }, [userContext, dispatch]); useEffect(() => { + if (!walletConnect) { + return; + } + + let active = true; function handleDisconnect() { - if (!isDisconnecting.current) { + if (active && !isDisconnecting.current) { clearAccount().catch(console.error); } } - walletConnect?.emitter.on("disconnect", handleDisconnect); - return () => walletConnect?.emitter.off("disconnect", handleDisconnect); - }, [walletConnect, clearAccount]); + walletConnect.emitter.on("disconnect", handleDisconnect); + walletConnect + .getProvider() + .then((provider) => { + if (!provider.session) { + handleDisconnect(); + } + }) + .catch(console.error); + + return () => { + active = false; + walletConnect.emitter.off("disconnect", handleDisconnect); + }; + }, [walletConnect, connectedAccount, clearAccount]); const disconnect = useCallback(async () => { isDisconnecting.current = true; diff --git a/packages/next-common/context/walletconnect/index.jsx b/packages/next-common/context/walletconnect/index.jsx index d712afac8c..528b90f9bc 100644 --- a/packages/next-common/context/walletconnect/index.jsx +++ b/packages/next-common/context/walletconnect/index.jsx @@ -188,8 +188,9 @@ export default function WalletConnectProvider({ children }) { }) .finally(() => { provider.removeListener("display_uri", onDisplayUri); - pendingConnection.current = null; }); + }).finally(() => { + pendingConnection.current = null; }); return await pendingConnection.current; }, [chainId, provider, setCachedSession, dispatch]); diff --git a/packages/next-common/utils/consts/settings/hydradx.js b/packages/next-common/utils/consts/settings/hydradx.js index 1df4e29780..5a84e22ccb 100644 --- a/packages/next-common/utils/consts/settings/hydradx.js +++ b/packages/next-common/utils/consts/settings/hydradx.js @@ -57,7 +57,7 @@ const links = [ const ethereumNetwork = { chainId: "0x3640e", - chainName: "Hydration", + chainName: "HydraDX", // If MetaMask fails with "Missing revert data in call exception" when // submitting a transaction, try using the RPC URL below. Also make sure the // RPC URL in the MetaMask network configuration is not stale. diff --git a/packages/next-common/utils/sendTransaction/sendEvmTx.js b/packages/next-common/utils/sendTransaction/sendEvmTx.js index b02a4466de..59b2dd5e4e 100644 --- a/packages/next-common/utils/sendTransaction/sendEvmTx.js +++ b/packages/next-common/utils/sendTransaction/sendEvmTx.js @@ -1,6 +1,5 @@ import { ethers } from "ethers"; import { - addNetwork, getConnector, getEthereum, isSameChainId, @@ -34,11 +33,6 @@ export async function prepareEthereum({ ethereum, onError, signerAddress }) { process.env.NEXT_PUBLIC_CHAIN === Chains.hydradx; try { - // Hydration may need to be registered in the wallet after session approval. - if (isHydrationWalletConnect) { - await addNetwork(ethereum, ethereumNetwork); - } - if (!isSameChainId(chainId)) { await switchNetwork(chainId); } From c81e050e75f6511d438244d89725e932da854fd0 Mon Sep 17 00:00:00 2001 From: wolyshaw Date: Sun, 20 Sep 2026 15:21:24 +0800 Subject: [PATCH 4/7] improve, #5533 --- .../next-common/components/login/web3/evm.jsx | 8 +-- packages/next-common/context/wagmi/index.jsx | 4 +- .../context/wagmi/walletConnectEvm.js | 16 ++---- .../context/walletconnect/index.jsx | 49 +++---------------- .../hooks/connect/useWalletConnectAccounts.js | 2 +- 5 files changed, 19 insertions(+), 60 deletions(-) diff --git a/packages/next-common/components/login/web3/evm.jsx b/packages/next-common/components/login/web3/evm.jsx index 1ca18413fc..e596782988 100644 --- a/packages/next-common/components/login/web3/evm.jsx +++ b/packages/next-common/components/login/web3/evm.jsx @@ -4,17 +4,17 @@ import AddressSelect from "next-common/components/addressSelect"; import WalletEVMOptions from "next-common/components/wallet/options/evm"; import { useConnectedAccountContext } from "next-common/context/connectedAccount"; import { useEVMAccounts } from "next-common/hooks/connect/useEVMAccounts"; +import useEVMWalletConnect from "next-common/hooks/connect/useEVMWalletConnect"; import { useEVMWallets } from "next-common/hooks/connect/useEVMWallets"; import { useWeb3Login } from "next-common/hooks/connect/useWeb3Login"; import PrimaryButton from "next-common/lib/button/primary"; import { metamask } from "next-common/utils/consts/connect"; +import { normalizedMetaMaskAccounts } from "next-common/utils/metamask"; import { useEffect, useState } from "react"; import { useConnection, useConnect } from "wagmi"; import LoginAddressNotDetectedMessage from "../addressNotDetectedMessage"; import { Label } from "../styled"; -import useEVMWalletConnect from "next-common/hooks/connect/useEVMWalletConnect"; import { WalletConnectQrCode } from "./walletconnect"; -import { normalizedMetaMaskAccounts } from "next-common/utils/metamask"; export default function LoginWeb3EVM() { const { lastConnectedAccount } = useConnectedAccountContext(); @@ -51,7 +51,7 @@ export default function LoginWeb3EVM() { } else if (accounts?.length > 0) { setSelectedAccount(accounts?.[0]); } else { - setSelectedAccount(undefined); + setSelectedAccount(); } }, [accounts, lastConnectedAccount?.address]); @@ -60,6 +60,7 @@ export default function LoginWeb3EVM() { setSelectedWallet(wallet); return; } + if (wallet.connector.id === "walletConnect") { await walletConnect.open(async ({ accounts: addresses }) => { const [account] = normalizedMetaMaskAccounts( @@ -70,6 +71,7 @@ export default function LoginWeb3EVM() { }); return; } + mutate( { connector: wallet.connector }, { diff --git a/packages/next-common/context/wagmi/index.jsx b/packages/next-common/context/wagmi/index.jsx index 6c2dab2ea8..e39db002f3 100644 --- a/packages/next-common/context/wagmi/index.jsx +++ b/packages/next-common/context/wagmi/index.jsx @@ -32,9 +32,7 @@ export const wagmiConfig = createConfig({ ssr: true, connectors: [ injected(), - ...(process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID - ? [walletConnectEvm] - : []), + walletConnectEvm, coinbaseWallet({ appName: "subsquare", preference: { diff --git a/packages/next-common/context/wagmi/walletConnectEvm.js b/packages/next-common/context/wagmi/walletConnectEvm.js index 9c7f0af89e..3af0559e84 100644 --- a/packages/next-common/context/wagmi/walletConnectEvm.js +++ b/packages/next-common/context/wagmi/walletConnectEvm.js @@ -1,24 +1,18 @@ import { walletConnect } from "wagmi/connectors"; import { CHAIN } from "next-common/utils/constants"; -import getChainSettings from "next-common/utils/consts/settings"; -export default function walletConnectEvm(config) { - const { description, domain } = getChainSettings(CHAIN); - const url = - typeof window === "undefined" - ? `https://${domain || CHAIN}.subsquare.io` - : window.location.origin; +const projectId = process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID; +export default function walletConnectEvm(config) { const connector = walletConnect({ - projectId: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID, + projectId, // Keep EVM sessions separate from the existing Polkadot provider. customStoragePrefix: "subsquare-evm", showQrModal: false, metadata: { name: "Subsquare", - description, - url, - icons: [`${url}/favicon.ico`], + url: `https://${CHAIN}.subsquare.io`, + icons: [`https://${CHAIN}.subsquare.io/favicon.ico`], }, })(config); diff --git a/packages/next-common/context/walletconnect/index.jsx b/packages/next-common/context/walletconnect/index.jsx index 528b90f9bc..d5e1497301 100644 --- a/packages/next-common/context/walletconnect/index.jsx +++ b/packages/next-common/context/walletconnect/index.jsx @@ -56,48 +56,23 @@ function useWalletConnectChainId() { return caip ? `polkadot:${caip}` : null; } -function isSubstrateSession(session) { - const accounts = Object.values(session?.namespaces || {}).flatMap( - (namespace) => namespace.accounts || [], - ); - return ( - accounts.length > 0 && - accounts.every((account) => account.startsWith("polkadot:")) - ); -} - -let providerPromise; - async function initWalletConnectProvider() { - const { description, wallets, domain } = getChainSettings(CHAIN); + const { description, wallets } = getChainSettings(CHAIN); if (wallets?.walletconnect === false) { return defaultWalletConnect.provider; } - const url = - window.location.origin || `https://${domain || CHAIN}.subsquare.io`; - providerPromise ??= UniversalProvider.init({ + const provider = await UniversalProvider.init({ projectId, relayUrl, metadata: { name: "Subsquare", description, - url, - icons: [`${url}/favicon.ico`], + url: `https://${CHAIN}.subsquare.io`, + icons: [`https://${CHAIN}.subsquare.io/favicon.ico`], }, - }) - .then(async (provider) => { - // Discard EVM sessions created by the former cross-namespace connection. - if (provider.session && !isSubstrateSession(provider.session)) { - await provider.disconnect(); - } - return provider; - }) - .catch((error) => { - providerPromise = null; - throw error; - }); + }); - return await providerPromise; + return provider; } export default function WalletConnectProvider({ children }) { @@ -133,10 +108,6 @@ export default function WalletConnectProvider({ children }) { if (!cachedSession) { return; } - if (!isSubstrateSession(cachedSession)) { - disconnectCombination(); - return; - } setSession(cachedSession); }, [cachedSession, disconnectCombination]); @@ -171,13 +142,7 @@ export default function WalletConnectProvider({ children }) { }, }, }) - .then(async (approvedSession) => { - if (!isSubstrateSession(approvedSession)) { - if (provider.session) { - await provider.disconnect(); - } - throw new Error("Please connect a Substrate account"); - } + .then((approvedSession) => { setSession(approvedSession); setCachedSession(approvedSession); resolve(); diff --git a/packages/next-common/hooks/connect/useWalletConnectAccounts.js b/packages/next-common/hooks/connect/useWalletConnectAccounts.js index 3a00db3b76..ab5edbf8ab 100644 --- a/packages/next-common/hooks/connect/useWalletConnectAccounts.js +++ b/packages/next-common/hooks/connect/useWalletConnectAccounts.js @@ -12,7 +12,7 @@ export function useWalletConnectAccounts() { setAccounts([]); if (session) { fetchAddresses().then((addresses) => { - if (active && addresses && addresses.length > 0) { + if (active && addresses?.length) { setAccounts( normalizedSubstrateAccounts( addresses.map((address) => ({ address })), From 2ff173235de18c610ce6520f471b41b7e6e0c45e Mon Sep 17 00:00:00 2001 From: wolyshaw Date: Sun, 20 Sep 2026 17:35:11 +0800 Subject: [PATCH 5/7] switch network, #5533 --- .../utils/sendTransaction/sendEvmTx.js | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/next-common/utils/sendTransaction/sendEvmTx.js b/packages/next-common/utils/sendTransaction/sendEvmTx.js index 59b2dd5e4e..2c6cf20c25 100644 --- a/packages/next-common/utils/sendTransaction/sendEvmTx.js +++ b/packages/next-common/utils/sendTransaction/sendEvmTx.js @@ -1,5 +1,6 @@ import { ethers } from "ethers"; import { + addNetwork, getConnector, getEthereum, isSameChainId, @@ -32,24 +33,27 @@ export async function prepareEthereum({ ethereum, onError, signerAddress }) { ["walletConnect", "walletConnectUniversal"].includes(connector.id) && process.env.NEXT_PUBLIC_CHAIN === Chains.hydradx; + let chainAction = "check the current chain"; try { - if (!isSameChainId(chainId)) { + if (isHydrationWalletConnect) { + chainAction = "add the Hydration network"; + await addNetwork(ethereum, ethereumNetwork); + chainAction = "switch to Hydration"; + await ethereum.request({ + method: "wallet_switchEthereumChain", + params: [{ chainId: ethereumNetwork.chainId }], + }); + } else if (!isSameChainId(chainId)) { await switchNetwork(chainId); } - - if ( - isHydrationWalletConnect && - Number(await ethereum.request({ method: "eth_chainId" })) !== chainId - ) { - throw new Error("Wallet did not switch to the requested chain"); - } } catch (cause) { - onError( - new Error( - `Cannot switch to chain ${ethereumNetwork.chainName}, please add the network configuration to ${walletName} wallet.`, - { cause }, - ), - ); + console.error("Error switching network:", chainAction, cause); + const message = isHydrationWalletConnect + ? `Cannot ${chainAction}: ${ + cause?.details || cause?.message || String(cause) + }` + : `Cannot switch to chain ${ethereumNetwork.chainName}, please add the network configuration to ${walletName} wallet.`; + onError(new Error(message, { cause })); return false; } From dd8bd1f341e3a39f541d45e3ade15b38736cf65f Mon Sep 17 00:00:00 2001 From: wolyshaw Date: Sun, 20 Sep 2026 18:17:24 +0800 Subject: [PATCH 6/7] loading, #5533 --- packages/next-common/components/login/web3/evm.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/next-common/components/login/web3/evm.jsx b/packages/next-common/components/login/web3/evm.jsx index e596782988..3f01a04f05 100644 --- a/packages/next-common/components/login/web3/evm.jsx +++ b/packages/next-common/components/login/web3/evm.jsx @@ -18,8 +18,8 @@ import { WalletConnectQrCode } from "./walletconnect"; export default function LoginWeb3EVM() { const { lastConnectedAccount } = useConnectedAccountContext(); - const { connector, isConnecting, isConnected } = useConnection(); - const { mutate, isError } = useConnect(); + const { connector, isConnected } = useConnection(); + const { mutate, isError, isPending: isConnecting } = useConnect(); const [selectedAccount, setSelectedAccount] = useState(); const { accounts } = useEVMAccounts(); const wallets = useEVMWallets(); From 0252d8dc24dde49fb29b0cbb10fd986dd14cbcb9 Mon Sep 17 00:00:00 2001 From: wolyshaw Date: Mon, 21 Sep 2026 09:19:30 +0800 Subject: [PATCH 7/7] show evm walletconnect, #5533 --- packages/next-common/hooks/connect/useEVMWallets.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/next-common/hooks/connect/useEVMWallets.js b/packages/next-common/hooks/connect/useEVMWallets.js index a243e09a7d..f984f94042 100644 --- a/packages/next-common/hooks/connect/useEVMWallets.js +++ b/packages/next-common/hooks/connect/useEVMWallets.js @@ -1,4 +1,5 @@ import { filter, find, sortBy, uniqBy } from "lodash-es"; +import { useChainSettings } from "next-common/context/chain"; import { allWallets, coinbaseWallet, @@ -9,6 +10,7 @@ import { subWallet, talisman, } from "next-common/utils/consts/connect"; +import shouldEnableEvmWallets from "next-common/utils/shouldEnableEvmWallets"; import { useConnectors } from "wagmi"; import { useDetectEthereum } from "./useDetectEthereum"; import { useHasCoinbaseWallet } from "./useHasCoinbaseWallet"; @@ -27,6 +29,9 @@ const fixedWallets = [ export function useEVMWallets() { const connectors = useConnectors(); const ethereum = useDetectEthereum(); + const chainSettings = useChainSettings(); + const isWalletConnectEnabled = + chainSettings?.supportWalletconnect && shouldEnableEvmWallets(); /** * nova @@ -62,6 +67,10 @@ export function useEVMWallets() { }; const filteredConnectors = filter(connectors, (c) => { + if (c.id === "walletConnect" && !isWalletConnectEnabled) { + return false; + } + // ignore injected connector if (c.id === "injected") { return false;