diff --git a/.changeset/young-pears-hug.md b/.changeset/young-pears-hug.md new file mode 100644 index 000000000..e46d3bf67 --- /dev/null +++ b/.changeset/young-pears-hug.md @@ -0,0 +1,10 @@ +--- +'@solana/wallet-adapter-material-ui-starter': patch +'@solana/wallet-adapter-react-ui-starter': patch +'@solana/wallet-adapter-unsafe-burner': patch +'@solana/wallet-adapter-example': patch +'@solana/wallet-adapter-react': patch +'@solana/wallet-adapter-base': patch +--- + +Add `signIn` (Sign In With Solana) method diff --git a/FAQ.md b/FAQ.md index 162c43a18..4756581d1 100644 --- a/FAQ.md +++ b/FAQ.md @@ -114,44 +114,3 @@ This can happen if you try to use `signTransaction`, `signAllTransactions`, or ` The other methods are optional APIs, so you have to feature-detect them before using them. Please see [issue #72](https://github.com/solana-labs/wallet-adapter/issues/72#issuecomment-919232595). - -## How can I sign and verify messages? - -Some wallet adapters provide a `signMessage` method for signing arbitrary bytes. - -The signature string returned by this method can be verified using [tweetnacl-js](https://github.com/dchest/tweetnacl-js/blob/master/README.md#naclsigndetachedverifymessage-signature-publickey) using the public key from the adapter. - -This can be used to sign offline — without sending a transaction — and prove a user controls a given private key. - -```tsx -import { ed25519 } from '@noble/curves/ed25519'; -import { useWallet } from '@solana/wallet-adapter-react'; -import bs58 from 'bs58'; -import React, { FC, useCallback } from 'react'; - -export const SignMessageButton: FC = () => { - const { publicKey, signMessage } = useWallet(); - - const onClick = useCallback(async () => { - try { - // `publicKey` will be null if the wallet isn't connected - if (!publicKey) throw new Error('Wallet not connected!'); - // `signMessage` will be undefined if the wallet doesn't support it - if (!signMessage) throw new Error('Wallet does not support message signing!'); - - // Encode anything as bytes - const message = new TextEncoder().encode('Hello, world!'); - // Sign the bytes using the wallet - const signature = await signMessage(message); - // Verify that the bytes were signed using the private key that matches the known public key - if (!ed25519.verify(signature, message, publicKey.toBytes())) throw new Error('Invalid signature!'); - - alert(`Message signature: ${bs58.encode(signature)}`); - } catch (error: any) { - alert(`Signing failed: ${error?.message}`); - } - }, [publicKey, signMessage]); - - return signMessage ? () : null; -}; -``` diff --git a/packages/core/base/package.json b/packages/core/base/package.json index 6c68f6333..d318ed840 100644 --- a/packages/core/base/package.json +++ b/packages/core/base/package.json @@ -35,7 +35,7 @@ "@solana/web3.js": "^1.77.3" }, "dependencies": { - "@solana/wallet-standard-features": "^1.0.1", + "@solana/wallet-standard-features": "^1.1.0", "@wallet-standard/base": "^1.0.1", "@wallet-standard/features": "^1.0.3", "eventemitter3": "^4.0.7" diff --git a/packages/core/base/src/errors.ts b/packages/core/base/src/errors.ts index c2e89e224..d6c3e4c70 100644 --- a/packages/core/base/src/errors.ts +++ b/packages/core/base/src/errors.ts @@ -52,12 +52,16 @@ export class WalletSendTransactionError extends WalletError { name = 'WalletSendTransactionError'; } +export class WalletSignTransactionError extends WalletError { + name = 'WalletSignTransactionError'; +} + export class WalletSignMessageError extends WalletError { name = 'WalletSignMessageError'; } -export class WalletSignTransactionError extends WalletError { - name = 'WalletSignTransactionError'; +export class WalletSignInError extends WalletError { + name = 'WalletSignInError'; } export class WalletTimeoutError extends WalletError { diff --git a/packages/core/base/src/signer.ts b/packages/core/base/src/signer.ts index d6ac4fa8b..76f147b00 100644 --- a/packages/core/base/src/signer.ts +++ b/packages/core/base/src/signer.ts @@ -1,3 +1,4 @@ +import type { SolanaSignInInput, SolanaSignInOutput } from '@solana/wallet-standard-features'; import type { Connection, TransactionSignature } from '@solana/web3.js'; import { BaseWalletAdapter, @@ -127,3 +128,17 @@ export abstract class BaseMessageSignerWalletAdapter; } + +export interface SignInMessageSignerWalletAdapterProps extends WalletAdapterProps { + signIn(input?: SolanaSignInInput): Promise; +} + +export type SignInMessageSignerWalletAdapter = WalletAdapter & + SignInMessageSignerWalletAdapterProps; + +export abstract class BaseSignInMessageSignerWalletAdapter + extends BaseMessageSignerWalletAdapter + implements SignInMessageSignerWalletAdapter +{ + abstract signIn(input?: SolanaSignInInput): Promise; +} diff --git a/packages/core/base/src/standard.ts b/packages/core/base/src/standard.ts index 0bb78566b..ad865e620 100644 --- a/packages/core/base/src/standard.ts +++ b/packages/core/base/src/standard.ts @@ -1,6 +1,7 @@ import { SolanaSignAndSendTransaction, type SolanaSignAndSendTransactionFeature, + type SolanaSignInFeature, type SolanaSignMessageFeature, SolanaSignTransaction, type SolanaSignTransactionFeature, @@ -19,7 +20,7 @@ export type WalletAdapterCompatibleStandardWallet = StandardWalletWithFeatures< StandardConnectFeature & StandardEventsFeature & (SolanaSignAndSendTransactionFeature | SolanaSignTransactionFeature) & - (StandardDisconnectFeature | SolanaSignMessageFeature | object) + (StandardDisconnectFeature | SolanaSignMessageFeature | SolanaSignInFeature | object) >; export interface StandardWalletAdapterProps extends WalletAdapterProps { diff --git a/packages/core/base/src/types.ts b/packages/core/base/src/types.ts index 56dba0402..f94079c21 100644 --- a/packages/core/base/src/types.ts +++ b/packages/core/base/src/types.ts @@ -1,8 +1,13 @@ import type { WalletAdapter } from './adapter.js'; -import type { MessageSignerWalletAdapter, SignerWalletAdapter } from './signer.js'; +import type { MessageSignerWalletAdapter, SignerWalletAdapter, SignInMessageSignerWalletAdapter } from './signer.js'; import type { StandardWalletAdapter } from './standard.js'; -export type Adapter = WalletAdapter | SignerWalletAdapter | MessageSignerWalletAdapter | StandardWalletAdapter; +export type Adapter = + | WalletAdapter + | SignerWalletAdapter + | MessageSignerWalletAdapter + | SignInMessageSignerWalletAdapter + | StandardWalletAdapter; export enum WalletAdapterNetwork { Mainnet = 'mainnet-beta', diff --git a/packages/core/react/package.json b/packages/core/react/package.json index 59d16f7a8..40cd1835d 100644 --- a/packages/core/react/package.json +++ b/packages/core/react/package.json @@ -39,7 +39,7 @@ "dependencies": { "@solana-mobile/wallet-adapter-mobile": "^2.0.0", "@solana/wallet-adapter-base": "workspace:^", - "@solana/wallet-standard-wallet-adapter-react": "^1.0.2" + "@solana/wallet-standard-wallet-adapter-react": "^1.1.0" }, "devDependencies": { "@solana/web3.js": "^1.77.3", diff --git a/packages/core/react/src/WalletProvider.tsx b/packages/core/react/src/WalletProvider.tsx index e032e23ca..be50c5d7f 100644 --- a/packages/core/react/src/WalletProvider.tsx +++ b/packages/core/react/src/WalletProvider.tsx @@ -17,7 +17,7 @@ import { WalletProviderBase } from './WalletProviderBase.js'; export interface WalletProviderProps { children: ReactNode; wallets: Adapter[]; - autoConnect?: boolean; + autoConnect?: boolean | ((adapter: Adapter) => Promise); localStorageKey?: string; onError?: (error: WalletError, adapter?: Adapter) => void; } @@ -37,9 +37,7 @@ function getIsMobile(adapters: Adapter[]) { function getUriForAppIdentity() { const location = globalThis.location; - if (location == null) { - return; - } + if (!location) return; return `${location.protocol}//${location.host}`; } @@ -88,9 +86,7 @@ export function WalletProvider({ ); const changeWallet = useCallback( (nextWalletName: WalletName | null) => { - if (walletName === nextWalletName) { - return; - } + if (walletName === nextWalletName) return; if ( adapter && // Selecting a wallet other than the mobile wallet adapter is not @@ -106,17 +102,11 @@ export function WalletProvider({ [adapter, setWalletName, walletName] ); useEffect(() => { - if (adapter == null) { - return; - } + if (!adapter) return; function handleDisconnect() { - if (isUnloadingRef.current) { - return; - } - if (walletName === SolanaMobileWalletAdapterWalletName && getIsMobile(adaptersWithStandardAdapters)) { - // Leave the adapter selected in the event of a disconnection. - return; - } + if (isUnloadingRef.current) return; + // Leave the adapter selected in the event of a disconnection. + if (walletName === SolanaMobileWalletAdapterWalletName && getIsMobile(adaptersWithStandardAdapters)) return; setWalletName(null); } adapter.on('disconnect', handleDisconnect); @@ -126,12 +116,18 @@ export function WalletProvider({ }, [adapter, adaptersWithStandardAdapters, setWalletName, walletName]); const hasUserSelectedAWallet = useRef(false); const handleAutoConnectRequest = useMemo(() => { - if (autoConnect !== true || !adapter) { - return; - } - - return () => (hasUserSelectedAWallet.current ? adapter.connect() : adapter.autoConnect()); - }, [adapter, autoConnect]); + if (!autoConnect || !adapter) return; + return async () => { + // If autoConnect is true or returns true, use the default autoConnect behavior. + if (autoConnect === true || (await autoConnect(adapter))) { + if (hasUserSelectedAWallet.current) { + await adapter.connect(); + } else { + await adapter.autoConnect(); + } + } + }; + }, [autoConnect, adapter]); const isUnloadingRef = useRef(false); useEffect(() => { if (walletName === SolanaMobileWalletAdapterWalletName && getIsMobile(adaptersWithStandardAdapters)) { diff --git a/packages/core/react/src/WalletProviderBase.tsx b/packages/core/react/src/WalletProviderBase.tsx index 9569d51b8..642ea43c0 100644 --- a/packages/core/react/src/WalletProviderBase.tsx +++ b/packages/core/react/src/WalletProviderBase.tsx @@ -2,6 +2,7 @@ import { type Adapter, type MessageSignerWalletAdapterProps, type SignerWalletAdapterProps, + type SignInMessageSignerWalletAdapterProps, type WalletAdapterProps, type WalletError, type WalletName, @@ -174,9 +175,9 @@ export function WalletProviderBase({ connected || !onAutoConnectRequest || !(wallet?.readyState === WalletReadyState.Installed || wallet?.readyState === WalletReadyState.Loadable) - ) { + ) return; - } + isConnectingRef.current = true; setConnecting(true); didAttemptAutoConnectRef.current = true; @@ -239,6 +240,17 @@ export function WalletProviderBase({ [adapter, connected] ); + // Sign in if the wallet supports it + const signIn: SignInMessageSignerWalletAdapterProps['signIn'] | undefined = useMemo( + () => + adapter && 'signIn' in adapter + ? async (input) => { + return await adapter.signIn(input); + } + : undefined, + [adapter] + ); + const handleConnect = useCallback(async () => { if (isConnectingRef.current || isDisconnectingRef.current || wallet?.adapter.connected) return; if (!wallet) throw handleErrorRef.current(new WalletNotSelectedError()); @@ -288,6 +300,7 @@ export function WalletProviderBase({ signTransaction, signAllTransactions, signMessage, + signIn, }} > {children} diff --git a/packages/core/react/src/useWallet.ts b/packages/core/react/src/useWallet.ts index 5b8dada70..87a199606 100644 --- a/packages/core/react/src/useWallet.ts +++ b/packages/core/react/src/useWallet.ts @@ -2,6 +2,7 @@ import { type Adapter, type MessageSignerWalletAdapterProps, type SignerWalletAdapterProps, + type SignInMessageSignerWalletAdapterProps, type WalletAdapterProps, type WalletName, type WalletReadyState, @@ -31,6 +32,7 @@ export interface WalletContextState { signTransaction: SignerWalletAdapterProps['signTransaction'] | undefined; signAllTransactions: SignerWalletAdapterProps['signAllTransactions'] | undefined; signMessage: MessageSignerWalletAdapterProps['signMessage'] | undefined; + signIn: SignInMessageSignerWalletAdapterProps['signIn'] | undefined; } const EMPTY_ARRAY: ReadonlyArray = []; @@ -61,6 +63,9 @@ const DEFAULT_CONTEXT: Partial = { signMessage() { return Promise.reject(logMissingProviderError('call', 'signMessage')); }, + signIn() { + return Promise.reject(logMissingProviderError('call', 'signIn')); + }, }; Object.defineProperty(DEFAULT_CONTEXT, 'wallets', { get() { diff --git a/packages/starter/example/package.json b/packages/starter/example/package.json index 51c08bb35..31e6aaa88 100644 --- a/packages/starter/example/package.json +++ b/packages/starter/example/package.json @@ -46,6 +46,8 @@ "@solana/wallet-adapter-react": "workspace:^", "@solana/wallet-adapter-react-ui": "workspace:^", "@solana/wallet-adapter-wallets": "workspace:^", + "@solana/wallet-standard-features": "^1.1.0", + "@solana/wallet-standard-util": "^1.1.0", "@solana/web3.js": "^1.77.3", "antd": "^4.24.10", "bs58": "^4.0.1", diff --git a/packages/starter/example/src/components/ContextProvider.tsx b/packages/starter/example/src/components/ContextProvider.tsx index 06dd9ad49..196512a85 100644 --- a/packages/starter/example/src/components/ContextProvider.tsx +++ b/packages/starter/example/src/components/ContextProvider.tsx @@ -7,6 +7,8 @@ import { WalletDialogProvider as MaterialUIWalletDialogProvider } from '@solana/ import { ConnectionProvider, WalletProvider } from '@solana/wallet-adapter-react'; import { WalletModalProvider as ReactUIWalletModalProvider } from '@solana/wallet-adapter-react-ui'; import { UnsafeBurnerWalletAdapter } from '@solana/wallet-adapter-wallets'; +import { type SolanaSignInInput } from '@solana/wallet-standard-features'; +import { verifySignIn } from '@solana/wallet-standard-util'; import { clusterApiUrl } from '@solana/web3.js'; import { SnackbarProvider, useSnackbar } from 'notistack'; import type { FC, ReactNode } from 'react'; @@ -86,9 +88,24 @@ const WalletContextProvider: FC<{ children: ReactNode }> = ({ children }) => { [enqueueSnackbar] ); + const autoSignIn = useCallback(async (adapter: Adapter) => { + if (!('signIn' in adapter)) return true; + + const input: SolanaSignInInput = { + domain: window.location.host, + address: adapter.publicKey ? adapter.publicKey.toBase58() : undefined, + statement: 'Please sign in.', + }; + const output = await adapter.signIn(input); + + if (!verifySignIn(input, output)) throw new Error('Sign In verification failed!'); + + return false; + }, []); + return ( - + {children} diff --git a/packages/starter/example/src/components/SignIn.tsx b/packages/starter/example/src/components/SignIn.tsx new file mode 100644 index 000000000..68fdc3661 --- /dev/null +++ b/packages/starter/example/src/components/SignIn.tsx @@ -0,0 +1,37 @@ +import { Button } from '@mui/material'; +import { useWallet } from '@solana/wallet-adapter-react'; +import type { SolanaSignInInput } from '@solana/wallet-standard-features'; +import { verifySignIn } from '@solana/wallet-standard-util'; +import bs58 from 'bs58'; +import type { FC } from 'react'; +import React, { useCallback } from 'react'; +import { useNotify } from './notify'; + +export const SignIn: FC = () => { + const { signIn, publicKey } = useWallet(); + const notify = useNotify(); + + const onClick = useCallback(async () => { + try { + if (!signIn) throw new Error('Wallet does not support Sign In With Solana!'); + + const input: SolanaSignInInput = { + domain: window.location.host, + address: publicKey ? publicKey.toBase58() : undefined, + statement: 'Please sign in.', + }; + const output = await signIn(input); + + if (!verifySignIn(input, output)) throw new Error('Sign In verification failed!'); + notify('success', `Message signature: ${bs58.encode(output.signature)}`); + } catch (error: any) { + notify('error', `Sign In failed: ${error?.message}`); + } + }, [signIn, publicKey, notify]); + + return ( + + ); +}; diff --git a/packages/starter/example/src/components/SignMessage.tsx b/packages/starter/example/src/components/SignMessage.tsx index 65b8e2adf..abfddf6ad 100644 --- a/packages/starter/example/src/components/SignMessage.tsx +++ b/packages/starter/example/src/components/SignMessage.tsx @@ -15,10 +15,14 @@ export const SignMessage: FC = () => { if (!publicKey) throw new Error('Wallet not connected!'); if (!signMessage) throw new Error('Wallet does not support message signing!'); - const message = new TextEncoder().encode('Hello, world!'); + const message = new TextEncoder().encode( + `${ + window.location.host + } wants you to sign in with your Solana account:\n${publicKey.toBase58()}\n\nPlease sign in.` + ); const signature = await signMessage(message); - if (!ed25519.verify(signature, message, publicKey.toBytes())) throw new Error('Message signature invalid!'); + if (!ed25519.verify(signature, message, publicKey.toBytes())) throw new Error('Message signature invalid!'); notify('success', `Message signature: ${bs58.encode(signature)}`); } catch (error: any) { notify('error', `Sign Message failed: ${error?.message}`); diff --git a/packages/starter/example/src/pages/index.tsx b/packages/starter/example/src/pages/index.tsx index f44194efb..d5f7d8ff5 100644 --- a/packages/starter/example/src/pages/index.tsx +++ b/packages/starter/example/src/pages/index.tsx @@ -70,6 +70,7 @@ const SendV0TransactionDynamic = dynamic( async () => (await import('../components/SendV0Transaction')).SendV0Transaction, { ssr: false } ); +const SignInDynamic = dynamic(async () => (await import('../components/SignIn')).SignIn, { ssr: false }); const SignMessageDynamic = dynamic(async () => (await import('../components/SignMessage')).SignMessage, { ssr: false }); const SignTransactionDynamic = dynamic(async () => (await import('../components/SignTransaction')).SignTransaction, { ssr: false, @@ -183,7 +184,9 @@ const Index: NextPage = () => { - + + + diff --git a/packages/starter/material-ui-starter/src/index.tsx b/packages/starter/material-ui-starter/src/index.tsx index b32489297..306befb5c 100644 --- a/packages/starter/material-ui-starter/src/index.tsx +++ b/packages/starter/material-ui-starter/src/index.tsx @@ -1,10 +1,10 @@ import React, { StrictMode } from 'react'; -import ReactDOM from 'react-dom'; +import { createRoot } from 'react-dom/client'; import { App } from './App'; -ReactDOM.render( +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +createRoot(document.getElementById('app')!).render( - , - document.getElementById('app') + ); diff --git a/packages/starter/react-ui-starter/src/index.tsx b/packages/starter/react-ui-starter/src/index.tsx index b32489297..306befb5c 100644 --- a/packages/starter/react-ui-starter/src/index.tsx +++ b/packages/starter/react-ui-starter/src/index.tsx @@ -1,10 +1,10 @@ import React, { StrictMode } from 'react'; -import ReactDOM from 'react-dom'; +import { createRoot } from 'react-dom/client'; import { App } from './App'; -ReactDOM.render( +// eslint-disable-next-line @typescript-eslint/no-non-null-assertion +createRoot(document.getElementById('app')!).render( - , - document.getElementById('app') + ); diff --git a/packages/wallets/unsafe-burner/package.json b/packages/wallets/unsafe-burner/package.json index 11b32aeb4..6248f28ec 100644 --- a/packages/wallets/unsafe-burner/package.json +++ b/packages/wallets/unsafe-burner/package.json @@ -36,7 +36,9 @@ }, "dependencies": { "@noble/curves": "^1.1.0", - "@solana/wallet-adapter-base": "workspace:^" + "@solana/wallet-adapter-base": "workspace:^", + "@solana/wallet-standard-features": "^1.1.0", + "@solana/wallet-standard-util": "^1.1.0" }, "devDependencies": { "@solana/web3.js": "^1.77.3", diff --git a/packages/wallets/unsafe-burner/src/adapter.ts b/packages/wallets/unsafe-burner/src/adapter.ts index b653f0a05..7159431e7 100644 --- a/packages/wallets/unsafe-burner/src/adapter.ts +++ b/packages/wallets/unsafe-burner/src/adapter.ts @@ -1,11 +1,13 @@ import { ed25519 } from '@noble/curves/ed25519'; import type { WalletName } from '@solana/wallet-adapter-base'; import { - BaseMessageSignerWalletAdapter, + BaseSignInMessageSignerWalletAdapter, isVersionedTransaction, WalletNotConnectedError, WalletReadyState, } from '@solana/wallet-adapter-base'; +import { type SolanaSignInInput, type SolanaSignInOutput } from '@solana/wallet-standard-features'; +import { createSignInMessage } from '@solana/wallet-standard-util'; import type { Transaction, TransactionVersion, VersionedTransaction } from '@solana/web3.js'; import { Keypair } from '@solana/web3.js'; @@ -15,7 +17,7 @@ export const UnsafeBurnerWalletName = 'Burner Wallet' as WalletName<'Burner Wall * This burner wallet adapter is unsafe to use and is only included to provide an easy way for applications to test * Wallet Adapter without using a third-party wallet. */ -export class UnsafeBurnerWalletAdapter extends BaseMessageSignerWalletAdapter { +export class UnsafeBurnerWalletAdapter extends BaseSignInMessageSignerWalletAdapter { name = UnsafeBurnerWalletName; url = 'https://github.com/solana-labs/wallet-adapter#usage'; icon = @@ -77,4 +79,30 @@ export class UnsafeBurnerWalletAdapter extends BaseMessageSignerWalletAdapter { return ed25519.sign(message, this._keypair.secretKey.slice(0, 32)); } + + async signIn(input: SolanaSignInInput = {}): Promise { + const { publicKey, secretKey } = (this._keypair ||= new Keypair()); + const domain = input.domain || window.location.host; + const address = input.address || publicKey.toBase58(); + + const signedMessage = createSignInMessage({ + ...input, + domain, + address, + }); + const signature = ed25519.sign(signedMessage, secretKey.slice(0, 32)); + + this.emit('connect', publicKey); + + return { + account: { + address, + publicKey: publicKey.toBytes(), + chains: [], + features: [], + }, + signedMessage, + signature, + }; + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9cc16eb3e..8c23241e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -70,8 +70,8 @@ importers: packages/core/base: dependencies: '@solana/wallet-standard-features': - specifier: ^1.0.1 - version: 1.0.1 + specifier: ^1.1.0 + version: 1.1.0 '@wallet-standard/base': specifier: ^1.0.1 version: 1.0.1 @@ -101,8 +101,8 @@ importers: specifier: workspace:^ version: link:../base '@solana/wallet-standard-wallet-adapter-react': - specifier: ^1.0.2 - version: 1.0.2(@solana/wallet-adapter-base@packages+core+base)(@solana/web3.js@1.78.0)(bs58@4.0.1)(react@18.2.0) + specifier: ^1.1.0 + version: 1.1.0(@solana/wallet-adapter-base@packages+core+base)(@solana/web3.js@1.78.0)(bs58@4.0.1)(react@18.2.0) devDependencies: '@solana/web3.js': specifier: ^1.77.3 @@ -264,6 +264,12 @@ importers: '@solana/wallet-adapter-wallets': specifier: workspace:^ version: link:../../wallets/wallets + '@solana/wallet-standard-features': + specifier: ^1.1.0 + version: 1.1.0 + '@solana/wallet-standard-util': + specifier: ^1.1.0 + version: 1.1.0 '@solana/web3.js': specifier: ^1.77.3 version: 1.78.0 @@ -1238,6 +1244,12 @@ importers: '@solana/wallet-adapter-base': specifier: workspace:^ version: link:../../core/base + '@solana/wallet-standard-features': + specifier: ^1.1.0 + version: 1.1.0 + '@solana/wallet-standard-util': + specifier: ^1.1.0 + version: 1.1.0 devDependencies: '@solana/web3.js': specifier: ^1.77.3 @@ -6018,40 +6030,41 @@ packages: dependencies: buffer: 6.0.3 - /@solana/wallet-standard-chains@1.0.0: - resolution: {integrity: sha512-kr3+JAo7mEBhVCH9cYzjn/vXeUiZeYfB4BF6E8u3U2jq3KlZA/KB+YM976+zGumTfN0NmMXUm066pTTG9kJsNQ==} + /@solana/wallet-standard-chains@1.1.0: + resolution: {integrity: sha512-IRJHf94UZM8AaRRmY18d34xCJiVPJej1XVwXiTjihHnmwD0cxdQbc/CKjrawyqFyQAKJx7raE5g9mnJsAdspTg==} engines: {node: '>=16'} dependencies: '@wallet-standard/base': 1.0.1 dev: false - /@solana/wallet-standard-features@1.0.1: - resolution: {integrity: sha512-SUfx7KtBJ55XIj0qAhhVcC1I6MklAXqWFEz9hDHW+6YcJIyvfix/EilBhaBik1FJ2JT0zukpOfFv8zpuAbFRbw==} + /@solana/wallet-standard-features@1.1.0: + resolution: {integrity: sha512-oVyygxfYkkF5INYL0GuD8GFmNO/wd45zNesIqGCFE6X66BYxmI6HmyzQJCcZTZ0BNsezlVg4t+3MCL5AhfFoGA==} engines: {node: '>=16'} dependencies: '@wallet-standard/base': 1.0.1 '@wallet-standard/features': 1.0.3 dev: false - /@solana/wallet-standard-util@1.0.0: - resolution: {integrity: sha512-qRAOBXnN7dwvtgzTtxIHsSeJAMbGNZdSWs57TT8pCyBrKL5dVxaK2u95Dm17SRSzwfKl/EByV1lTjOxXyKWS+g==} + /@solana/wallet-standard-util@1.1.0: + resolution: {integrity: sha512-vssoCIx43sY5EMrT1pVltsZZKPAQfKpPG3ib2fuqRqpTRGkeRFCPDf4lrVFAYYp238tFr3Xrr/3JLcGvPP7uYw==} engines: {node: '>=16'} dependencies: - '@solana/wallet-standard-chains': 1.0.0 - '@solana/wallet-standard-features': 1.0.1 + '@noble/curves': 1.1.0 + '@solana/wallet-standard-chains': 1.1.0 + '@solana/wallet-standard-features': 1.1.0 dev: false - /@solana/wallet-standard-wallet-adapter-base@1.0.2(@solana/web3.js@1.78.0)(bs58@4.0.1): - resolution: {integrity: sha512-QqkupdWvWuihX87W6ijt174u6ZdP5OSFlNhZhuhoMlIdyI/sj7MhGsdppuRlMh65oVO2WNWTL9y2bO5Pbx+dfg==} + /@solana/wallet-standard-wallet-adapter-base@1.1.0(@solana/web3.js@1.78.0)(bs58@4.0.1): + resolution: {integrity: sha512-wCPiQChIsTB3SlQ18QiPiAcmnqXcX1FRf3ylxpo9LNJ+cOD6vBcrAC4UK/P7sYww1RJM+bHTxvUTweeNtQ/7Pg==} engines: {node: '>=16'} peerDependencies: '@solana/web3.js': ^1.58.0 bs58: ^4.0.1 dependencies: '@solana/wallet-adapter-base': link:packages/core/base - '@solana/wallet-standard-chains': 1.0.0 - '@solana/wallet-standard-features': 1.0.1 - '@solana/wallet-standard-util': 1.0.0 + '@solana/wallet-standard-chains': 1.1.0 + '@solana/wallet-standard-features': 1.1.0 + '@solana/wallet-standard-util': 1.1.0 '@solana/web3.js': 1.78.0 '@wallet-standard/app': 1.0.1 '@wallet-standard/base': 1.0.1 @@ -6060,15 +6073,15 @@ packages: bs58: 4.0.1 dev: false - /@solana/wallet-standard-wallet-adapter-react@1.0.2(@solana/wallet-adapter-base@packages+core+base)(@solana/web3.js@1.78.0)(bs58@4.0.1)(react@18.2.0): - resolution: {integrity: sha512-0YTPUnjiSG5ajDP2hK8EipxkeHhO3+nCtXeF1eS/ZP2QcFAgS/4luywrn/6CdfzQ2cQYPCFdnG/QculpUp6bBg==} + /@solana/wallet-standard-wallet-adapter-react@1.1.0(@solana/wallet-adapter-base@packages+core+base)(@solana/web3.js@1.78.0)(bs58@4.0.1)(react@18.2.0): + resolution: {integrity: sha512-bkCPtOHWMXsCpqudoOQ2BSMAJQAcPrgAApDROGI4zpPIM1GI8WA7QslS9MJgSvkWKIRIUdf1r6YnpVSwT6c8sw==} engines: {node: '>=16'} peerDependencies: '@solana/wallet-adapter-base': '*' react: '*' dependencies: '@solana/wallet-adapter-base': link:packages/core/base - '@solana/wallet-standard-wallet-adapter-base': 1.0.2(@solana/web3.js@1.78.0)(bs58@4.0.1) + '@solana/wallet-standard-wallet-adapter-base': 1.1.0(@solana/web3.js@1.78.0)(bs58@4.0.1) '@wallet-standard/app': 1.0.1 '@wallet-standard/base': 1.0.1 react: 18.2.0