@wallet-ui/react-native-web3js 2.2.0-canary-20251217104857 → 2.2.0-canary-20251217182030

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,6 +2,7 @@
2
2
 
3
3
  var web3_js = require('@solana/web3.js');
4
4
  var React = require('react');
5
+ var mobileWalletAdapterProtocol = require('@solana-mobile/mobile-wallet-adapter-protocol');
5
6
  var jsBase64 = require('js-base64');
6
7
  var AsyncStorage = require('@react-native-async-storage/async-storage');
7
8
  var reactQuery = require('@tanstack/react-query');
@@ -138,24 +139,47 @@ function useAuthorization({ chain, identity }) {
138
139
  );
139
140
  const authorizeSession = React.useCallback(
140
141
  async (wallet) => {
141
- const authorizationResult = await wallet.authorize({
142
- auth_token: fetchQuery.data?.authToken,
143
- chain,
144
- identity
145
- });
146
- return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
142
+ try {
143
+ const authorizationResult = await wallet.authorize({
144
+ auth_token: fetchQuery.data?.authToken,
145
+ chain,
146
+ identity
147
+ });
148
+ return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
149
+ } catch (error) {
150
+ if (error instanceof mobileWalletAdapterProtocol.SolanaMobileWalletAdapterProtocolError && error.code === mobileWalletAdapterProtocol.SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED) {
151
+ const retryResult = await wallet.authorize({
152
+ chain,
153
+ identity
154
+ });
155
+ return (await handleAuthorizationResult(retryResult)).selectedAccount;
156
+ }
157
+ throw error;
158
+ }
147
159
  },
148
160
  [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult]
149
161
  );
150
162
  const authorizeSessionWithSignIn = React.useCallback(
151
163
  async (wallet, signInPayload) => {
152
- const authorizationResult = await wallet.authorize({
153
- auth_token: fetchQuery.data?.authToken,
154
- chain,
155
- identity,
156
- sign_in_payload: signInPayload
157
- });
158
- return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
164
+ try {
165
+ const authorizationResult = await wallet.authorize({
166
+ auth_token: fetchQuery.data?.authToken,
167
+ chain,
168
+ identity,
169
+ sign_in_payload: signInPayload
170
+ });
171
+ return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
172
+ } catch (error) {
173
+ if (error instanceof mobileWalletAdapterProtocol.SolanaMobileWalletAdapterProtocolError && error.code === mobileWalletAdapterProtocol.SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED) {
174
+ const retryResult = await wallet.authorize({
175
+ chain,
176
+ identity,
177
+ sign_in_payload: signInPayload
178
+ });
179
+ return (await handleAuthorizationResult(retryResult)).selectedAccount;
180
+ }
181
+ throw error;
182
+ }
159
183
  },
160
184
  [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult]
161
185
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mobile-wallet-provider.tsx","../src/get-public-key-from-address.ts","../src/get-account-from-authorized-account.ts","../src/get-authorization-from-authorization-result.ts","../src/use-query-config.ts","../src/use-fetch-authorization.ts","../src/use-invalidate-authorizations.ts","../src/use-persist-authorization.ts","../src/use-authorization.ts","../src/use-mobile-wallet.ts"],"names":["createContext","useMemo","Connection","React","toUint8Array","PublicKey","useQueryClient","useQuery","AsyncStorage","useMutation","useCallback","useContext","transact"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import { Commitment, Connection, ConnectionConfig } from '@solana/web3.js';\nimport { AppIdentity, Chain } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport React, { createContext, type ReactNode, useMemo } from 'react';\n\nexport interface MobileWalletProviderProps {\n chain: Chain;\n children: ReactNode;\n commitmentOrConfig?: Commitment | ConnectionConfig;\n endpoint: string;\n identity: AppIdentity;\n}\nexport interface MobileWalletProviderState {\n chain: Chain;\n connection: Connection;\n identity: AppIdentity;\n}\n\nexport const MobileWalletProviderContext = createContext<MobileWalletProviderState>({} as MobileWalletProviderState);\nexport function MobileWalletProvider({\n children,\n chain,\n commitmentOrConfig = { commitment: 'confirmed' },\n endpoint,\n identity,\n}: MobileWalletProviderProps) {\n const connection = useMemo(() => new Connection(endpoint, commitmentOrConfig), [commitmentOrConfig, endpoint]);\n\n return (\n <MobileWalletProviderContext.Provider\n value={useMemo(\n () => ({\n chain,\n connection,\n identity,\n }),\n [connection, identity, chain],\n )}\n >\n {children}\n </MobileWalletProviderContext.Provider>\n );\n}\n","import { PublicKey } from '@solana/web3.js';\nimport { Base64EncodedAddress } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { toUint8Array } from 'js-base64';\n\nexport function getPublicKeyFromAddress(address: Base64EncodedAddress): PublicKey {\n const publicKeyByteArray = toUint8Array(address);\n\n return new PublicKey(publicKeyByteArray);\n}\n","import { Account as AuthorizedAccount } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getPublicKeyFromAddress } from './get-public-key-from-address';\nimport { Account } from './use-authorization';\n\nfunction ellipsify(str = '', len = 4, delimiter = '..') {\n const limit = len * 2 + delimiter.length;\n\n return str.length > limit ? str.slice(0, len) + delimiter + str.slice(-len) : str;\n}\n\nexport function getAccountFromAuthorizedAccount(account: AuthorizedAccount): Account {\n const publicKey = getPublicKeyFromAddress(account.address);\n\n return {\n address: account.address,\n icon: account.icon,\n label: account.label ?? ellipsify(publicKey.toString(), 8),\n publicKey,\n };\n}\n","import { AuthorizationResult } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getAccountFromAuthorizedAccount } from './get-account-from-authorized-account';\nimport { Account, WalletAuthorization } from './use-authorization';\n\nexport function getAuthorizationFromAuthorizationResult(\n authorizationResult: AuthorizationResult,\n previouslySelectedAccount?: Account,\n): WalletAuthorization {\n let selectedAccount: Account;\n if (\n // We have yet to select an account.\n previouslySelectedAccount == null ||\n // The previously selected account is no longer in the set of authorized addresses.\n !authorizationResult.accounts.some(({ address }) => address === previouslySelectedAccount.address)\n ) {\n const firstAccount = authorizationResult.accounts[0];\n selectedAccount = getAccountFromAuthorizedAccount(firstAccount);\n } else {\n selectedAccount = previouslySelectedAccount;\n }\n return {\n accounts: authorizationResult.accounts.map(getAccountFromAuthorizedAccount),\n authToken: authorizationResult.auth_token,\n selectedAccount,\n };\n}\n","import { useQueryClient } from '@tanstack/react-query';\n\nexport function useQueryConfig() {\n const storageKey = 'authorization-cache';\n const queryClient = useQueryClient();\n const queryKey = ['wallet-authorization'];\n\n return { queryClient, queryKey, storageKey };\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { PublicKey, PublicKeyInitData } from '@solana/web3.js';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nfunction cacheReviver(key: string, value: unknown) {\n if (key === 'publicKey') {\n return new PublicKey(value as PublicKeyInitData); // the PublicKeyInitData should match the actual data structure stored in AsyncStorage\n } else {\n return value;\n }\n}\n\nexport function useFetchAuthorization() {\n const { queryKey, storageKey } = useQueryConfig();\n return useQuery({\n queryFn: async (): Promise<WalletAuthorization | null> => {\n const cacheFetchResult = await AsyncStorage.getItem(storageKey);\n\n // Return prior authorization, if found.\n return cacheFetchResult ? JSON.parse(cacheFetchResult, cacheReviver) : null;\n },\n queryKey,\n });\n}\n","import { useQueryConfig } from './use-query-config';\n\nexport function useInvalidateAuthorizations() {\n const { queryClient, queryKey } = useQueryConfig();\n\n return () => queryClient.invalidateQueries({ queryKey });\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nexport function usePersistAuthorization() {\n const { queryClient, queryKey, storageKey } = useQueryConfig();\n return useMutation({\n mutationFn: async (auth: WalletAuthorization | null): Promise<void> => {\n await AsyncStorage.setItem(storageKey, JSON.stringify(auth));\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","import { PublicKey } from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n AuthorizeAPI,\n AuthToken,\n Base64EncodedAddress,\n Chain,\n DeauthorizeAPI,\n SignInPayload,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { WalletIcon } from '@wallet-standard/core';\nimport { useCallback, useMemo } from 'react';\n\nimport { getAuthorizationFromAuthorizationResult } from './get-authorization-from-authorization-result';\nimport { useFetchAuthorization } from './use-fetch-authorization';\nimport { useInvalidateAuthorizations } from './use-invalidate-authorizations';\nimport { usePersistAuthorization } from './use-persist-authorization';\n\nexport type Account = Readonly<{\n address: Base64EncodedAddress;\n icon?: WalletIcon;\n label?: string;\n publicKey: PublicKey;\n}>;\n\nexport type WalletAuthorization = Readonly<{\n accounts: Account[];\n authToken: AuthToken;\n selectedAccount: Account;\n}>;\n\nexport function useAuthorization({ chain, identity }: { chain: Chain; identity: AppIdentity }) {\n const fetchQuery = useFetchAuthorization();\n const invalidateAuthorizations = useInvalidateAuthorizations();\n const persistMutation = usePersistAuthorization();\n\n const handleAuthorizationResult = useCallback(\n async (authorizationResult: AuthorizationResult): Promise<WalletAuthorization> => {\n const nextAuthorization = getAuthorizationFromAuthorizationResult(\n authorizationResult,\n fetchQuery.data?.selectedAccount,\n );\n await persistMutation.mutateAsync(nextAuthorization);\n return nextAuthorization;\n },\n [fetchQuery.data?.selectedAccount, persistMutation],\n );\n\n const authorizeSession = useCallback(\n async (wallet: AuthorizeAPI) => {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const authorizeSessionWithSignIn = useCallback(\n async (wallet: AuthorizeAPI, signInPayload: SignInPayload) => {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const deauthorizeSession = useCallback(\n async (wallet: DeauthorizeAPI) => {\n if (fetchQuery.data?.authToken == null) {\n return;\n }\n await wallet.deauthorize({ auth_token: fetchQuery.data.authToken });\n await persistMutation.mutateAsync(null);\n },\n [fetchQuery.data?.authToken, persistMutation],\n );\n\n const deauthorizeSessions = useCallback(async () => {\n await invalidateAuthorizations();\n await persistMutation.mutateAsync(null);\n }, [invalidateAuthorizations, persistMutation]);\n\n return useMemo(\n () => ({\n accounts: fetchQuery.data?.accounts ?? null,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading: fetchQuery.isLoading,\n selectedAccount: fetchQuery.data?.selectedAccount ?? null,\n }),\n [\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n fetchQuery.data?.accounts,\n fetchQuery.data?.selectedAccount,\n fetchQuery.isLoading,\n ],\n );\n}\n","import { Transaction, TransactionSignature, VersionedTransaction } from '@solana/web3.js';\nimport { AuthorizeAPI, SignInPayload } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { transact } from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';\nimport { useCallback, useContext, useMemo } from 'react';\n\nimport { MobileWalletProviderContext } from './mobile-wallet-provider';\nimport { Account, useAuthorization } from './use-authorization';\n\nexport function useMobileWallet() {\n const ctx = useContext(MobileWalletProviderContext);\n const { authorizeSessionWithSignIn, authorizeSession, deauthorizeSessions, selectedAccount, ...authorization } =\n useAuthorization(ctx);\n\n const connect = useCallback(\n async (): Promise<Account> => await transact(async wallet => await authorizeSession(wallet)),\n [authorizeSession],\n );\n\n const connectAnd = useCallback(\n async (cb: (wallet: AuthorizeAPI) => Promise<Account | void>): Promise<Account | void> => {\n return await transact(async wallet => await cb(wallet));\n },\n [],\n );\n\n const signIn = useCallback(\n async (signInPayload: SignInPayload): Promise<Account> =>\n await transact(async wallet => await authorizeSessionWithSignIn(wallet, signInPayload)),\n [authorizeSessionWithSignIn],\n );\n\n const disconnect = useCallback(async (): Promise<void> => await deauthorizeSessions(), [deauthorizeSessions]);\n\n const signAndSendTransaction = useCallback(\n async (\n transaction: Transaction | VersionedTransaction,\n minContextSlot: number,\n ): Promise<TransactionSignature> =>\n await transact(async wallet => {\n await authorizeSession(wallet);\n const signatures = await wallet.signAndSendTransactions({\n minContextSlot,\n transactions: [transaction],\n });\n return signatures[0];\n }),\n [authorizeSession],\n );\n\n const signMessage = useCallback(\n async (message: Uint8Array): Promise<Uint8Array> =>\n await transact(async wallet => {\n const authResult = await authorizeSession(wallet);\n const signedMessages = await wallet.signMessages({\n addresses: [authResult.address],\n payloads: [message],\n });\n return signedMessages[0];\n }),\n [authorizeSession],\n );\n\n return useMemo(\n () => ({\n ...ctx,\n ...authorization,\n account: selectedAccount,\n connect,\n connectAnd,\n disconnect,\n signAndSendTransaction,\n signIn,\n signMessage,\n }),\n [\n authorization,\n connect,\n connectAnd,\n ctx,\n disconnect,\n selectedAccount,\n signAndSendTransaction,\n signIn,\n signMessage,\n ],\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/mobile-wallet-provider.tsx","../src/get-public-key-from-address.ts","../src/get-account-from-authorized-account.ts","../src/get-authorization-from-authorization-result.ts","../src/use-query-config.ts","../src/use-fetch-authorization.ts","../src/use-invalidate-authorizations.ts","../src/use-persist-authorization.ts","../src/use-authorization.ts","../src/use-mobile-wallet.ts"],"names":["createContext","useMemo","Connection","React","toUint8Array","PublicKey","useQueryClient","useQuery","AsyncStorage","useMutation","useCallback","SolanaMobileWalletAdapterProtocolError","SolanaMobileWalletAdapterProtocolErrorCode","useContext","transact"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import { Commitment, Connection, ConnectionConfig } from '@solana/web3.js';\nimport { AppIdentity, Chain } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport React, { createContext, type ReactNode, useMemo } from 'react';\n\nexport interface MobileWalletProviderProps {\n chain: Chain;\n children: ReactNode;\n commitmentOrConfig?: Commitment | ConnectionConfig;\n endpoint: string;\n identity: AppIdentity;\n}\nexport interface MobileWalletProviderState {\n chain: Chain;\n connection: Connection;\n identity: AppIdentity;\n}\n\nexport const MobileWalletProviderContext = createContext<MobileWalletProviderState>({} as MobileWalletProviderState);\nexport function MobileWalletProvider({\n children,\n chain,\n commitmentOrConfig = { commitment: 'confirmed' },\n endpoint,\n identity,\n}: MobileWalletProviderProps) {\n const connection = useMemo(() => new Connection(endpoint, commitmentOrConfig), [commitmentOrConfig, endpoint]);\n\n return (\n <MobileWalletProviderContext.Provider\n value={useMemo(\n () => ({\n chain,\n connection,\n identity,\n }),\n [connection, identity, chain],\n )}\n >\n {children}\n </MobileWalletProviderContext.Provider>\n );\n}\n","import { PublicKey } from '@solana/web3.js';\nimport { Base64EncodedAddress } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { toUint8Array } from 'js-base64';\n\nexport function getPublicKeyFromAddress(address: Base64EncodedAddress): PublicKey {\n const publicKeyByteArray = toUint8Array(address);\n\n return new PublicKey(publicKeyByteArray);\n}\n","import { Account as AuthorizedAccount } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getPublicKeyFromAddress } from './get-public-key-from-address';\nimport { Account } from './use-authorization';\n\nfunction ellipsify(str = '', len = 4, delimiter = '..') {\n const limit = len * 2 + delimiter.length;\n\n return str.length > limit ? str.slice(0, len) + delimiter + str.slice(-len) : str;\n}\n\nexport function getAccountFromAuthorizedAccount(account: AuthorizedAccount): Account {\n const publicKey = getPublicKeyFromAddress(account.address);\n\n return {\n address: account.address,\n icon: account.icon,\n label: account.label ?? ellipsify(publicKey.toString(), 8),\n publicKey,\n };\n}\n","import { AuthorizationResult } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getAccountFromAuthorizedAccount } from './get-account-from-authorized-account';\nimport { Account, WalletAuthorization } from './use-authorization';\n\nexport function getAuthorizationFromAuthorizationResult(\n authorizationResult: AuthorizationResult,\n previouslySelectedAccount?: Account,\n): WalletAuthorization {\n let selectedAccount: Account;\n if (\n // We have yet to select an account.\n previouslySelectedAccount == null ||\n // The previously selected account is no longer in the set of authorized addresses.\n !authorizationResult.accounts.some(({ address }) => address === previouslySelectedAccount.address)\n ) {\n const firstAccount = authorizationResult.accounts[0];\n selectedAccount = getAccountFromAuthorizedAccount(firstAccount);\n } else {\n selectedAccount = previouslySelectedAccount;\n }\n return {\n accounts: authorizationResult.accounts.map(getAccountFromAuthorizedAccount),\n authToken: authorizationResult.auth_token,\n selectedAccount,\n };\n}\n","import { useQueryClient } from '@tanstack/react-query';\n\nexport function useQueryConfig() {\n const storageKey = 'authorization-cache';\n const queryClient = useQueryClient();\n const queryKey = ['wallet-authorization'];\n\n return { queryClient, queryKey, storageKey };\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { PublicKey, PublicKeyInitData } from '@solana/web3.js';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nfunction cacheReviver(key: string, value: unknown) {\n if (key === 'publicKey') {\n return new PublicKey(value as PublicKeyInitData); // the PublicKeyInitData should match the actual data structure stored in AsyncStorage\n } else {\n return value;\n }\n}\n\nexport function useFetchAuthorization() {\n const { queryKey, storageKey } = useQueryConfig();\n return useQuery({\n queryFn: async (): Promise<WalletAuthorization | null> => {\n const cacheFetchResult = await AsyncStorage.getItem(storageKey);\n\n // Return prior authorization, if found.\n return cacheFetchResult ? JSON.parse(cacheFetchResult, cacheReviver) : null;\n },\n queryKey,\n });\n}\n","import { useQueryConfig } from './use-query-config';\n\nexport function useInvalidateAuthorizations() {\n const { queryClient, queryKey } = useQueryConfig();\n\n return () => queryClient.invalidateQueries({ queryKey });\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nexport function usePersistAuthorization() {\n const { queryClient, queryKey, storageKey } = useQueryConfig();\n return useMutation({\n mutationFn: async (auth: WalletAuthorization | null): Promise<void> => {\n await AsyncStorage.setItem(storageKey, JSON.stringify(auth));\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","import { PublicKey } from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n AuthorizeAPI,\n AuthToken,\n Base64EncodedAddress,\n Chain,\n DeauthorizeAPI,\n SignInPayload,\n SolanaMobileWalletAdapterProtocolError,\n SolanaMobileWalletAdapterProtocolErrorCode,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { WalletIcon } from '@wallet-standard/core';\nimport { useCallback, useMemo } from 'react';\n\nimport { getAuthorizationFromAuthorizationResult } from './get-authorization-from-authorization-result';\nimport { useFetchAuthorization } from './use-fetch-authorization';\nimport { useInvalidateAuthorizations } from './use-invalidate-authorizations';\nimport { usePersistAuthorization } from './use-persist-authorization';\n\nexport type Account = Readonly<{\n address: Base64EncodedAddress;\n icon?: WalletIcon;\n label?: string;\n publicKey: PublicKey;\n}>;\n\nexport type WalletAuthorization = Readonly<{\n accounts: Account[];\n authToken: AuthToken;\n selectedAccount: Account;\n}>;\n\nexport function useAuthorization({ chain, identity }: { chain: Chain; identity: AppIdentity }) {\n const fetchQuery = useFetchAuthorization();\n const invalidateAuthorizations = useInvalidateAuthorizations();\n const persistMutation = usePersistAuthorization();\n\n const handleAuthorizationResult = useCallback(\n async (authorizationResult: AuthorizationResult): Promise<WalletAuthorization> => {\n const nextAuthorization = getAuthorizationFromAuthorizationResult(\n authorizationResult,\n fetchQuery.data?.selectedAccount,\n );\n await persistMutation.mutateAsync(nextAuthorization);\n return nextAuthorization;\n },\n [fetchQuery.data?.selectedAccount, persistMutation],\n );\n\n const authorizeSession = useCallback(\n async (wallet: AuthorizeAPI) => {\n try {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n } catch (error) {\n if (\n error instanceof SolanaMobileWalletAdapterProtocolError &&\n error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED\n ) {\n const retryResult = await wallet.authorize({\n chain,\n identity,\n });\n return (await handleAuthorizationResult(retryResult)).selectedAccount;\n }\n throw error;\n }\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const authorizeSessionWithSignIn = useCallback(\n async (wallet: AuthorizeAPI, signInPayload: SignInPayload) => {\n try {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n } catch (error) {\n if (\n error instanceof SolanaMobileWalletAdapterProtocolError &&\n error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED\n ) {\n const retryResult = await wallet.authorize({\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(retryResult)).selectedAccount;\n }\n throw error;\n }\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const deauthorizeSession = useCallback(\n async (wallet: DeauthorizeAPI) => {\n if (fetchQuery.data?.authToken == null) {\n return;\n }\n await wallet.deauthorize({ auth_token: fetchQuery.data.authToken });\n await persistMutation.mutateAsync(null);\n },\n [fetchQuery.data?.authToken, persistMutation],\n );\n\n const deauthorizeSessions = useCallback(async () => {\n await invalidateAuthorizations();\n await persistMutation.mutateAsync(null);\n }, [invalidateAuthorizations, persistMutation]);\n\n return useMemo(\n () => ({\n accounts: fetchQuery.data?.accounts ?? null,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading: fetchQuery.isLoading,\n selectedAccount: fetchQuery.data?.selectedAccount ?? null,\n }),\n [\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n fetchQuery.data?.accounts,\n fetchQuery.data?.selectedAccount,\n fetchQuery.isLoading,\n ],\n );\n}\n","import { Transaction, TransactionSignature, VersionedTransaction } from '@solana/web3.js';\nimport { AuthorizeAPI, SignInPayload } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { transact } from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';\nimport { useCallback, useContext, useMemo } from 'react';\n\nimport { MobileWalletProviderContext } from './mobile-wallet-provider';\nimport { Account, useAuthorization } from './use-authorization';\n\nexport function useMobileWallet() {\n const ctx = useContext(MobileWalletProviderContext);\n const { authorizeSessionWithSignIn, authorizeSession, deauthorizeSessions, selectedAccount, ...authorization } =\n useAuthorization(ctx);\n\n const connect = useCallback(\n async (): Promise<Account> => await transact(async wallet => await authorizeSession(wallet)),\n [authorizeSession],\n );\n\n const connectAnd = useCallback(\n async (cb: (wallet: AuthorizeAPI) => Promise<Account | void>): Promise<Account | void> => {\n return await transact(async wallet => await cb(wallet));\n },\n [],\n );\n\n const signIn = useCallback(\n async (signInPayload: SignInPayload): Promise<Account> =>\n await transact(async wallet => await authorizeSessionWithSignIn(wallet, signInPayload)),\n [authorizeSessionWithSignIn],\n );\n\n const disconnect = useCallback(async (): Promise<void> => await deauthorizeSessions(), [deauthorizeSessions]);\n\n const signAndSendTransaction = useCallback(\n async (\n transaction: Transaction | VersionedTransaction,\n minContextSlot: number,\n ): Promise<TransactionSignature> =>\n await transact(async wallet => {\n await authorizeSession(wallet);\n const signatures = await wallet.signAndSendTransactions({\n minContextSlot,\n transactions: [transaction],\n });\n return signatures[0];\n }),\n [authorizeSession],\n );\n\n const signMessage = useCallback(\n async (message: Uint8Array): Promise<Uint8Array> =>\n await transact(async wallet => {\n const authResult = await authorizeSession(wallet);\n const signedMessages = await wallet.signMessages({\n addresses: [authResult.address],\n payloads: [message],\n });\n return signedMessages[0];\n }),\n [authorizeSession],\n );\n\n return useMemo(\n () => ({\n ...ctx,\n ...authorization,\n account: selectedAccount,\n connect,\n connectAnd,\n disconnect,\n signAndSendTransaction,\n signIn,\n signMessage,\n }),\n [\n authorization,\n connect,\n connectAnd,\n ctx,\n disconnect,\n selectedAccount,\n signAndSendTransaction,\n signIn,\n signMessage,\n ],\n );\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { Connection, PublicKey } from '@solana/web3.js';
2
2
  import React, { createContext, useMemo, useCallback, useContext } from 'react';
3
+ import { SolanaMobileWalletAdapterProtocolError, SolanaMobileWalletAdapterProtocolErrorCode } from '@solana-mobile/mobile-wallet-adapter-protocol';
3
4
  import { toUint8Array } from 'js-base64';
4
5
  export { fromUint8Array, toUint8Array } from 'js-base64';
5
6
  import AsyncStorage from '@react-native-async-storage/async-storage';
@@ -133,24 +134,47 @@ function useAuthorization({ chain, identity }) {
133
134
  );
134
135
  const authorizeSession = useCallback(
135
136
  async (wallet) => {
136
- const authorizationResult = await wallet.authorize({
137
- auth_token: fetchQuery.data?.authToken,
138
- chain,
139
- identity
140
- });
141
- return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
137
+ try {
138
+ const authorizationResult = await wallet.authorize({
139
+ auth_token: fetchQuery.data?.authToken,
140
+ chain,
141
+ identity
142
+ });
143
+ return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
144
+ } catch (error) {
145
+ if (error instanceof SolanaMobileWalletAdapterProtocolError && error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED) {
146
+ const retryResult = await wallet.authorize({
147
+ chain,
148
+ identity
149
+ });
150
+ return (await handleAuthorizationResult(retryResult)).selectedAccount;
151
+ }
152
+ throw error;
153
+ }
142
154
  },
143
155
  [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult]
144
156
  );
145
157
  const authorizeSessionWithSignIn = useCallback(
146
158
  async (wallet, signInPayload) => {
147
- const authorizationResult = await wallet.authorize({
148
- auth_token: fetchQuery.data?.authToken,
149
- chain,
150
- identity,
151
- sign_in_payload: signInPayload
152
- });
153
- return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
159
+ try {
160
+ const authorizationResult = await wallet.authorize({
161
+ auth_token: fetchQuery.data?.authToken,
162
+ chain,
163
+ identity,
164
+ sign_in_payload: signInPayload
165
+ });
166
+ return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
167
+ } catch (error) {
168
+ if (error instanceof SolanaMobileWalletAdapterProtocolError && error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED) {
169
+ const retryResult = await wallet.authorize({
170
+ chain,
171
+ identity,
172
+ sign_in_payload: signInPayload
173
+ });
174
+ return (await handleAuthorizationResult(retryResult)).selectedAccount;
175
+ }
176
+ throw error;
177
+ }
154
178
  },
155
179
  [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult]
156
180
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mobile-wallet-provider.tsx","../src/get-public-key-from-address.ts","../src/get-account-from-authorized-account.ts","../src/get-authorization-from-authorization-result.ts","../src/use-query-config.ts","../src/use-fetch-authorization.ts","../src/use-invalidate-authorizations.ts","../src/use-persist-authorization.ts","../src/use-authorization.ts","../src/use-mobile-wallet.ts"],"names":["PublicKey","AsyncStorage","useMemo","useCallback"],"mappings":"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","file":"index.browser.mjs","sourcesContent":["import { Commitment, Connection, ConnectionConfig } from '@solana/web3.js';\nimport { AppIdentity, Chain } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport React, { createContext, type ReactNode, useMemo } from 'react';\n\nexport interface MobileWalletProviderProps {\n chain: Chain;\n children: ReactNode;\n commitmentOrConfig?: Commitment | ConnectionConfig;\n endpoint: string;\n identity: AppIdentity;\n}\nexport interface MobileWalletProviderState {\n chain: Chain;\n connection: Connection;\n identity: AppIdentity;\n}\n\nexport const MobileWalletProviderContext = createContext<MobileWalletProviderState>({} as MobileWalletProviderState);\nexport function MobileWalletProvider({\n children,\n chain,\n commitmentOrConfig = { commitment: 'confirmed' },\n endpoint,\n identity,\n}: MobileWalletProviderProps) {\n const connection = useMemo(() => new Connection(endpoint, commitmentOrConfig), [commitmentOrConfig, endpoint]);\n\n return (\n <MobileWalletProviderContext.Provider\n value={useMemo(\n () => ({\n chain,\n connection,\n identity,\n }),\n [connection, identity, chain],\n )}\n >\n {children}\n </MobileWalletProviderContext.Provider>\n );\n}\n","import { PublicKey } from '@solana/web3.js';\nimport { Base64EncodedAddress } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { toUint8Array } from 'js-base64';\n\nexport function getPublicKeyFromAddress(address: Base64EncodedAddress): PublicKey {\n const publicKeyByteArray = toUint8Array(address);\n\n return new PublicKey(publicKeyByteArray);\n}\n","import { Account as AuthorizedAccount } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getPublicKeyFromAddress } from './get-public-key-from-address';\nimport { Account } from './use-authorization';\n\nfunction ellipsify(str = '', len = 4, delimiter = '..') {\n const limit = len * 2 + delimiter.length;\n\n return str.length > limit ? str.slice(0, len) + delimiter + str.slice(-len) : str;\n}\n\nexport function getAccountFromAuthorizedAccount(account: AuthorizedAccount): Account {\n const publicKey = getPublicKeyFromAddress(account.address);\n\n return {\n address: account.address,\n icon: account.icon,\n label: account.label ?? ellipsify(publicKey.toString(), 8),\n publicKey,\n };\n}\n","import { AuthorizationResult } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getAccountFromAuthorizedAccount } from './get-account-from-authorized-account';\nimport { Account, WalletAuthorization } from './use-authorization';\n\nexport function getAuthorizationFromAuthorizationResult(\n authorizationResult: AuthorizationResult,\n previouslySelectedAccount?: Account,\n): WalletAuthorization {\n let selectedAccount: Account;\n if (\n // We have yet to select an account.\n previouslySelectedAccount == null ||\n // The previously selected account is no longer in the set of authorized addresses.\n !authorizationResult.accounts.some(({ address }) => address === previouslySelectedAccount.address)\n ) {\n const firstAccount = authorizationResult.accounts[0];\n selectedAccount = getAccountFromAuthorizedAccount(firstAccount);\n } else {\n selectedAccount = previouslySelectedAccount;\n }\n return {\n accounts: authorizationResult.accounts.map(getAccountFromAuthorizedAccount),\n authToken: authorizationResult.auth_token,\n selectedAccount,\n };\n}\n","import { useQueryClient } from '@tanstack/react-query';\n\nexport function useQueryConfig() {\n const storageKey = 'authorization-cache';\n const queryClient = useQueryClient();\n const queryKey = ['wallet-authorization'];\n\n return { queryClient, queryKey, storageKey };\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { PublicKey, PublicKeyInitData } from '@solana/web3.js';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nfunction cacheReviver(key: string, value: unknown) {\n if (key === 'publicKey') {\n return new PublicKey(value as PublicKeyInitData); // the PublicKeyInitData should match the actual data structure stored in AsyncStorage\n } else {\n return value;\n }\n}\n\nexport function useFetchAuthorization() {\n const { queryKey, storageKey } = useQueryConfig();\n return useQuery({\n queryFn: async (): Promise<WalletAuthorization | null> => {\n const cacheFetchResult = await AsyncStorage.getItem(storageKey);\n\n // Return prior authorization, if found.\n return cacheFetchResult ? JSON.parse(cacheFetchResult, cacheReviver) : null;\n },\n queryKey,\n });\n}\n","import { useQueryConfig } from './use-query-config';\n\nexport function useInvalidateAuthorizations() {\n const { queryClient, queryKey } = useQueryConfig();\n\n return () => queryClient.invalidateQueries({ queryKey });\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nexport function usePersistAuthorization() {\n const { queryClient, queryKey, storageKey } = useQueryConfig();\n return useMutation({\n mutationFn: async (auth: WalletAuthorization | null): Promise<void> => {\n await AsyncStorage.setItem(storageKey, JSON.stringify(auth));\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","import { PublicKey } from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n AuthorizeAPI,\n AuthToken,\n Base64EncodedAddress,\n Chain,\n DeauthorizeAPI,\n SignInPayload,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { WalletIcon } from '@wallet-standard/core';\nimport { useCallback, useMemo } from 'react';\n\nimport { getAuthorizationFromAuthorizationResult } from './get-authorization-from-authorization-result';\nimport { useFetchAuthorization } from './use-fetch-authorization';\nimport { useInvalidateAuthorizations } from './use-invalidate-authorizations';\nimport { usePersistAuthorization } from './use-persist-authorization';\n\nexport type Account = Readonly<{\n address: Base64EncodedAddress;\n icon?: WalletIcon;\n label?: string;\n publicKey: PublicKey;\n}>;\n\nexport type WalletAuthorization = Readonly<{\n accounts: Account[];\n authToken: AuthToken;\n selectedAccount: Account;\n}>;\n\nexport function useAuthorization({ chain, identity }: { chain: Chain; identity: AppIdentity }) {\n const fetchQuery = useFetchAuthorization();\n const invalidateAuthorizations = useInvalidateAuthorizations();\n const persistMutation = usePersistAuthorization();\n\n const handleAuthorizationResult = useCallback(\n async (authorizationResult: AuthorizationResult): Promise<WalletAuthorization> => {\n const nextAuthorization = getAuthorizationFromAuthorizationResult(\n authorizationResult,\n fetchQuery.data?.selectedAccount,\n );\n await persistMutation.mutateAsync(nextAuthorization);\n return nextAuthorization;\n },\n [fetchQuery.data?.selectedAccount, persistMutation],\n );\n\n const authorizeSession = useCallback(\n async (wallet: AuthorizeAPI) => {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const authorizeSessionWithSignIn = useCallback(\n async (wallet: AuthorizeAPI, signInPayload: SignInPayload) => {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const deauthorizeSession = useCallback(\n async (wallet: DeauthorizeAPI) => {\n if (fetchQuery.data?.authToken == null) {\n return;\n }\n await wallet.deauthorize({ auth_token: fetchQuery.data.authToken });\n await persistMutation.mutateAsync(null);\n },\n [fetchQuery.data?.authToken, persistMutation],\n );\n\n const deauthorizeSessions = useCallback(async () => {\n await invalidateAuthorizations();\n await persistMutation.mutateAsync(null);\n }, [invalidateAuthorizations, persistMutation]);\n\n return useMemo(\n () => ({\n accounts: fetchQuery.data?.accounts ?? null,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading: fetchQuery.isLoading,\n selectedAccount: fetchQuery.data?.selectedAccount ?? null,\n }),\n [\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n fetchQuery.data?.accounts,\n fetchQuery.data?.selectedAccount,\n fetchQuery.isLoading,\n ],\n );\n}\n","import { Transaction, TransactionSignature, VersionedTransaction } from '@solana/web3.js';\nimport { AuthorizeAPI, SignInPayload } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { transact } from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';\nimport { useCallback, useContext, useMemo } from 'react';\n\nimport { MobileWalletProviderContext } from './mobile-wallet-provider';\nimport { Account, useAuthorization } from './use-authorization';\n\nexport function useMobileWallet() {\n const ctx = useContext(MobileWalletProviderContext);\n const { authorizeSessionWithSignIn, authorizeSession, deauthorizeSessions, selectedAccount, ...authorization } =\n useAuthorization(ctx);\n\n const connect = useCallback(\n async (): Promise<Account> => await transact(async wallet => await authorizeSession(wallet)),\n [authorizeSession],\n );\n\n const connectAnd = useCallback(\n async (cb: (wallet: AuthorizeAPI) => Promise<Account | void>): Promise<Account | void> => {\n return await transact(async wallet => await cb(wallet));\n },\n [],\n );\n\n const signIn = useCallback(\n async (signInPayload: SignInPayload): Promise<Account> =>\n await transact(async wallet => await authorizeSessionWithSignIn(wallet, signInPayload)),\n [authorizeSessionWithSignIn],\n );\n\n const disconnect = useCallback(async (): Promise<void> => await deauthorizeSessions(), [deauthorizeSessions]);\n\n const signAndSendTransaction = useCallback(\n async (\n transaction: Transaction | VersionedTransaction,\n minContextSlot: number,\n ): Promise<TransactionSignature> =>\n await transact(async wallet => {\n await authorizeSession(wallet);\n const signatures = await wallet.signAndSendTransactions({\n minContextSlot,\n transactions: [transaction],\n });\n return signatures[0];\n }),\n [authorizeSession],\n );\n\n const signMessage = useCallback(\n async (message: Uint8Array): Promise<Uint8Array> =>\n await transact(async wallet => {\n const authResult = await authorizeSession(wallet);\n const signedMessages = await wallet.signMessages({\n addresses: [authResult.address],\n payloads: [message],\n });\n return signedMessages[0];\n }),\n [authorizeSession],\n );\n\n return useMemo(\n () => ({\n ...ctx,\n ...authorization,\n account: selectedAccount,\n connect,\n connectAnd,\n disconnect,\n signAndSendTransaction,\n signIn,\n signMessage,\n }),\n [\n authorization,\n connect,\n connectAnd,\n ctx,\n disconnect,\n selectedAccount,\n signAndSendTransaction,\n signIn,\n signMessage,\n ],\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/mobile-wallet-provider.tsx","../src/get-public-key-from-address.ts","../src/get-account-from-authorized-account.ts","../src/get-authorization-from-authorization-result.ts","../src/use-query-config.ts","../src/use-fetch-authorization.ts","../src/use-invalidate-authorizations.ts","../src/use-persist-authorization.ts","../src/use-authorization.ts","../src/use-mobile-wallet.ts"],"names":["PublicKey","AsyncStorage","useMemo","useCallback"],"mappings":"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","file":"index.browser.mjs","sourcesContent":["import { Commitment, Connection, ConnectionConfig } from '@solana/web3.js';\nimport { AppIdentity, Chain } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport React, { createContext, type ReactNode, useMemo } from 'react';\n\nexport interface MobileWalletProviderProps {\n chain: Chain;\n children: ReactNode;\n commitmentOrConfig?: Commitment | ConnectionConfig;\n endpoint: string;\n identity: AppIdentity;\n}\nexport interface MobileWalletProviderState {\n chain: Chain;\n connection: Connection;\n identity: AppIdentity;\n}\n\nexport const MobileWalletProviderContext = createContext<MobileWalletProviderState>({} as MobileWalletProviderState);\nexport function MobileWalletProvider({\n children,\n chain,\n commitmentOrConfig = { commitment: 'confirmed' },\n endpoint,\n identity,\n}: MobileWalletProviderProps) {\n const connection = useMemo(() => new Connection(endpoint, commitmentOrConfig), [commitmentOrConfig, endpoint]);\n\n return (\n <MobileWalletProviderContext.Provider\n value={useMemo(\n () => ({\n chain,\n connection,\n identity,\n }),\n [connection, identity, chain],\n )}\n >\n {children}\n </MobileWalletProviderContext.Provider>\n );\n}\n","import { PublicKey } from '@solana/web3.js';\nimport { Base64EncodedAddress } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { toUint8Array } from 'js-base64';\n\nexport function getPublicKeyFromAddress(address: Base64EncodedAddress): PublicKey {\n const publicKeyByteArray = toUint8Array(address);\n\n return new PublicKey(publicKeyByteArray);\n}\n","import { Account as AuthorizedAccount } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getPublicKeyFromAddress } from './get-public-key-from-address';\nimport { Account } from './use-authorization';\n\nfunction ellipsify(str = '', len = 4, delimiter = '..') {\n const limit = len * 2 + delimiter.length;\n\n return str.length > limit ? str.slice(0, len) + delimiter + str.slice(-len) : str;\n}\n\nexport function getAccountFromAuthorizedAccount(account: AuthorizedAccount): Account {\n const publicKey = getPublicKeyFromAddress(account.address);\n\n return {\n address: account.address,\n icon: account.icon,\n label: account.label ?? ellipsify(publicKey.toString(), 8),\n publicKey,\n };\n}\n","import { AuthorizationResult } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getAccountFromAuthorizedAccount } from './get-account-from-authorized-account';\nimport { Account, WalletAuthorization } from './use-authorization';\n\nexport function getAuthorizationFromAuthorizationResult(\n authorizationResult: AuthorizationResult,\n previouslySelectedAccount?: Account,\n): WalletAuthorization {\n let selectedAccount: Account;\n if (\n // We have yet to select an account.\n previouslySelectedAccount == null ||\n // The previously selected account is no longer in the set of authorized addresses.\n !authorizationResult.accounts.some(({ address }) => address === previouslySelectedAccount.address)\n ) {\n const firstAccount = authorizationResult.accounts[0];\n selectedAccount = getAccountFromAuthorizedAccount(firstAccount);\n } else {\n selectedAccount = previouslySelectedAccount;\n }\n return {\n accounts: authorizationResult.accounts.map(getAccountFromAuthorizedAccount),\n authToken: authorizationResult.auth_token,\n selectedAccount,\n };\n}\n","import { useQueryClient } from '@tanstack/react-query';\n\nexport function useQueryConfig() {\n const storageKey = 'authorization-cache';\n const queryClient = useQueryClient();\n const queryKey = ['wallet-authorization'];\n\n return { queryClient, queryKey, storageKey };\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { PublicKey, PublicKeyInitData } from '@solana/web3.js';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nfunction cacheReviver(key: string, value: unknown) {\n if (key === 'publicKey') {\n return new PublicKey(value as PublicKeyInitData); // the PublicKeyInitData should match the actual data structure stored in AsyncStorage\n } else {\n return value;\n }\n}\n\nexport function useFetchAuthorization() {\n const { queryKey, storageKey } = useQueryConfig();\n return useQuery({\n queryFn: async (): Promise<WalletAuthorization | null> => {\n const cacheFetchResult = await AsyncStorage.getItem(storageKey);\n\n // Return prior authorization, if found.\n return cacheFetchResult ? JSON.parse(cacheFetchResult, cacheReviver) : null;\n },\n queryKey,\n });\n}\n","import { useQueryConfig } from './use-query-config';\n\nexport function useInvalidateAuthorizations() {\n const { queryClient, queryKey } = useQueryConfig();\n\n return () => queryClient.invalidateQueries({ queryKey });\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nexport function usePersistAuthorization() {\n const { queryClient, queryKey, storageKey } = useQueryConfig();\n return useMutation({\n mutationFn: async (auth: WalletAuthorization | null): Promise<void> => {\n await AsyncStorage.setItem(storageKey, JSON.stringify(auth));\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","import { PublicKey } from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n AuthorizeAPI,\n AuthToken,\n Base64EncodedAddress,\n Chain,\n DeauthorizeAPI,\n SignInPayload,\n SolanaMobileWalletAdapterProtocolError,\n SolanaMobileWalletAdapterProtocolErrorCode,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { WalletIcon } from '@wallet-standard/core';\nimport { useCallback, useMemo } from 'react';\n\nimport { getAuthorizationFromAuthorizationResult } from './get-authorization-from-authorization-result';\nimport { useFetchAuthorization } from './use-fetch-authorization';\nimport { useInvalidateAuthorizations } from './use-invalidate-authorizations';\nimport { usePersistAuthorization } from './use-persist-authorization';\n\nexport type Account = Readonly<{\n address: Base64EncodedAddress;\n icon?: WalletIcon;\n label?: string;\n publicKey: PublicKey;\n}>;\n\nexport type WalletAuthorization = Readonly<{\n accounts: Account[];\n authToken: AuthToken;\n selectedAccount: Account;\n}>;\n\nexport function useAuthorization({ chain, identity }: { chain: Chain; identity: AppIdentity }) {\n const fetchQuery = useFetchAuthorization();\n const invalidateAuthorizations = useInvalidateAuthorizations();\n const persistMutation = usePersistAuthorization();\n\n const handleAuthorizationResult = useCallback(\n async (authorizationResult: AuthorizationResult): Promise<WalletAuthorization> => {\n const nextAuthorization = getAuthorizationFromAuthorizationResult(\n authorizationResult,\n fetchQuery.data?.selectedAccount,\n );\n await persistMutation.mutateAsync(nextAuthorization);\n return nextAuthorization;\n },\n [fetchQuery.data?.selectedAccount, persistMutation],\n );\n\n const authorizeSession = useCallback(\n async (wallet: AuthorizeAPI) => {\n try {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n } catch (error) {\n if (\n error instanceof SolanaMobileWalletAdapterProtocolError &&\n error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED\n ) {\n const retryResult = await wallet.authorize({\n chain,\n identity,\n });\n return (await handleAuthorizationResult(retryResult)).selectedAccount;\n }\n throw error;\n }\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const authorizeSessionWithSignIn = useCallback(\n async (wallet: AuthorizeAPI, signInPayload: SignInPayload) => {\n try {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n } catch (error) {\n if (\n error instanceof SolanaMobileWalletAdapterProtocolError &&\n error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED\n ) {\n const retryResult = await wallet.authorize({\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(retryResult)).selectedAccount;\n }\n throw error;\n }\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const deauthorizeSession = useCallback(\n async (wallet: DeauthorizeAPI) => {\n if (fetchQuery.data?.authToken == null) {\n return;\n }\n await wallet.deauthorize({ auth_token: fetchQuery.data.authToken });\n await persistMutation.mutateAsync(null);\n },\n [fetchQuery.data?.authToken, persistMutation],\n );\n\n const deauthorizeSessions = useCallback(async () => {\n await invalidateAuthorizations();\n await persistMutation.mutateAsync(null);\n }, [invalidateAuthorizations, persistMutation]);\n\n return useMemo(\n () => ({\n accounts: fetchQuery.data?.accounts ?? null,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading: fetchQuery.isLoading,\n selectedAccount: fetchQuery.data?.selectedAccount ?? null,\n }),\n [\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n fetchQuery.data?.accounts,\n fetchQuery.data?.selectedAccount,\n fetchQuery.isLoading,\n ],\n );\n}\n","import { Transaction, TransactionSignature, VersionedTransaction } from '@solana/web3.js';\nimport { AuthorizeAPI, SignInPayload } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { transact } from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';\nimport { useCallback, useContext, useMemo } from 'react';\n\nimport { MobileWalletProviderContext } from './mobile-wallet-provider';\nimport { Account, useAuthorization } from './use-authorization';\n\nexport function useMobileWallet() {\n const ctx = useContext(MobileWalletProviderContext);\n const { authorizeSessionWithSignIn, authorizeSession, deauthorizeSessions, selectedAccount, ...authorization } =\n useAuthorization(ctx);\n\n const connect = useCallback(\n async (): Promise<Account> => await transact(async wallet => await authorizeSession(wallet)),\n [authorizeSession],\n );\n\n const connectAnd = useCallback(\n async (cb: (wallet: AuthorizeAPI) => Promise<Account | void>): Promise<Account | void> => {\n return await transact(async wallet => await cb(wallet));\n },\n [],\n );\n\n const signIn = useCallback(\n async (signInPayload: SignInPayload): Promise<Account> =>\n await transact(async wallet => await authorizeSessionWithSignIn(wallet, signInPayload)),\n [authorizeSessionWithSignIn],\n );\n\n const disconnect = useCallback(async (): Promise<void> => await deauthorizeSessions(), [deauthorizeSessions]);\n\n const signAndSendTransaction = useCallback(\n async (\n transaction: Transaction | VersionedTransaction,\n minContextSlot: number,\n ): Promise<TransactionSignature> =>\n await transact(async wallet => {\n await authorizeSession(wallet);\n const signatures = await wallet.signAndSendTransactions({\n minContextSlot,\n transactions: [transaction],\n });\n return signatures[0];\n }),\n [authorizeSession],\n );\n\n const signMessage = useCallback(\n async (message: Uint8Array): Promise<Uint8Array> =>\n await transact(async wallet => {\n const authResult = await authorizeSession(wallet);\n const signedMessages = await wallet.signMessages({\n addresses: [authResult.address],\n payloads: [message],\n });\n return signedMessages[0];\n }),\n [authorizeSession],\n );\n\n return useMemo(\n () => ({\n ...ctx,\n ...authorization,\n account: selectedAccount,\n connect,\n connectAnd,\n disconnect,\n signAndSendTransaction,\n signIn,\n signMessage,\n }),\n [\n authorization,\n connect,\n connectAnd,\n ctx,\n disconnect,\n selectedAccount,\n signAndSendTransaction,\n signIn,\n signMessage,\n ],\n );\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { Connection, PublicKey } from '@solana/web3.js';
2
2
  import React, { createContext, useMemo, useCallback, useContext } from 'react';
3
+ import { SolanaMobileWalletAdapterProtocolError, SolanaMobileWalletAdapterProtocolErrorCode } from '@solana-mobile/mobile-wallet-adapter-protocol';
3
4
  import { toUint8Array } from 'js-base64';
4
5
  export { fromUint8Array, toUint8Array } from 'js-base64';
5
6
  import AsyncStorage from '@react-native-async-storage/async-storage';
@@ -133,24 +134,47 @@ function useAuthorization({ chain, identity }) {
133
134
  );
134
135
  const authorizeSession = useCallback(
135
136
  async (wallet) => {
136
- const authorizationResult = await wallet.authorize({
137
- auth_token: fetchQuery.data?.authToken,
138
- chain,
139
- identity
140
- });
141
- return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
137
+ try {
138
+ const authorizationResult = await wallet.authorize({
139
+ auth_token: fetchQuery.data?.authToken,
140
+ chain,
141
+ identity
142
+ });
143
+ return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
144
+ } catch (error) {
145
+ if (error instanceof SolanaMobileWalletAdapterProtocolError && error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED) {
146
+ const retryResult = await wallet.authorize({
147
+ chain,
148
+ identity
149
+ });
150
+ return (await handleAuthorizationResult(retryResult)).selectedAccount;
151
+ }
152
+ throw error;
153
+ }
142
154
  },
143
155
  [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult]
144
156
  );
145
157
  const authorizeSessionWithSignIn = useCallback(
146
158
  async (wallet, signInPayload) => {
147
- const authorizationResult = await wallet.authorize({
148
- auth_token: fetchQuery.data?.authToken,
149
- chain,
150
- identity,
151
- sign_in_payload: signInPayload
152
- });
153
- return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
159
+ try {
160
+ const authorizationResult = await wallet.authorize({
161
+ auth_token: fetchQuery.data?.authToken,
162
+ chain,
163
+ identity,
164
+ sign_in_payload: signInPayload
165
+ });
166
+ return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
167
+ } catch (error) {
168
+ if (error instanceof SolanaMobileWalletAdapterProtocolError && error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED) {
169
+ const retryResult = await wallet.authorize({
170
+ chain,
171
+ identity,
172
+ sign_in_payload: signInPayload
173
+ });
174
+ return (await handleAuthorizationResult(retryResult)).selectedAccount;
175
+ }
176
+ throw error;
177
+ }
154
178
  },
155
179
  [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult]
156
180
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mobile-wallet-provider.tsx","../src/get-public-key-from-address.ts","../src/get-account-from-authorized-account.ts","../src/get-authorization-from-authorization-result.ts","../src/use-query-config.ts","../src/use-fetch-authorization.ts","../src/use-invalidate-authorizations.ts","../src/use-persist-authorization.ts","../src/use-authorization.ts","../src/use-mobile-wallet.ts"],"names":["PublicKey","AsyncStorage","useMemo","useCallback"],"mappings":"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","file":"index.native.mjs","sourcesContent":["import { Commitment, Connection, ConnectionConfig } from '@solana/web3.js';\nimport { AppIdentity, Chain } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport React, { createContext, type ReactNode, useMemo } from 'react';\n\nexport interface MobileWalletProviderProps {\n chain: Chain;\n children: ReactNode;\n commitmentOrConfig?: Commitment | ConnectionConfig;\n endpoint: string;\n identity: AppIdentity;\n}\nexport interface MobileWalletProviderState {\n chain: Chain;\n connection: Connection;\n identity: AppIdentity;\n}\n\nexport const MobileWalletProviderContext = createContext<MobileWalletProviderState>({} as MobileWalletProviderState);\nexport function MobileWalletProvider({\n children,\n chain,\n commitmentOrConfig = { commitment: 'confirmed' },\n endpoint,\n identity,\n}: MobileWalletProviderProps) {\n const connection = useMemo(() => new Connection(endpoint, commitmentOrConfig), [commitmentOrConfig, endpoint]);\n\n return (\n <MobileWalletProviderContext.Provider\n value={useMemo(\n () => ({\n chain,\n connection,\n identity,\n }),\n [connection, identity, chain],\n )}\n >\n {children}\n </MobileWalletProviderContext.Provider>\n );\n}\n","import { PublicKey } from '@solana/web3.js';\nimport { Base64EncodedAddress } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { toUint8Array } from 'js-base64';\n\nexport function getPublicKeyFromAddress(address: Base64EncodedAddress): PublicKey {\n const publicKeyByteArray = toUint8Array(address);\n\n return new PublicKey(publicKeyByteArray);\n}\n","import { Account as AuthorizedAccount } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getPublicKeyFromAddress } from './get-public-key-from-address';\nimport { Account } from './use-authorization';\n\nfunction ellipsify(str = '', len = 4, delimiter = '..') {\n const limit = len * 2 + delimiter.length;\n\n return str.length > limit ? str.slice(0, len) + delimiter + str.slice(-len) : str;\n}\n\nexport function getAccountFromAuthorizedAccount(account: AuthorizedAccount): Account {\n const publicKey = getPublicKeyFromAddress(account.address);\n\n return {\n address: account.address,\n icon: account.icon,\n label: account.label ?? ellipsify(publicKey.toString(), 8),\n publicKey,\n };\n}\n","import { AuthorizationResult } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getAccountFromAuthorizedAccount } from './get-account-from-authorized-account';\nimport { Account, WalletAuthorization } from './use-authorization';\n\nexport function getAuthorizationFromAuthorizationResult(\n authorizationResult: AuthorizationResult,\n previouslySelectedAccount?: Account,\n): WalletAuthorization {\n let selectedAccount: Account;\n if (\n // We have yet to select an account.\n previouslySelectedAccount == null ||\n // The previously selected account is no longer in the set of authorized addresses.\n !authorizationResult.accounts.some(({ address }) => address === previouslySelectedAccount.address)\n ) {\n const firstAccount = authorizationResult.accounts[0];\n selectedAccount = getAccountFromAuthorizedAccount(firstAccount);\n } else {\n selectedAccount = previouslySelectedAccount;\n }\n return {\n accounts: authorizationResult.accounts.map(getAccountFromAuthorizedAccount),\n authToken: authorizationResult.auth_token,\n selectedAccount,\n };\n}\n","import { useQueryClient } from '@tanstack/react-query';\n\nexport function useQueryConfig() {\n const storageKey = 'authorization-cache';\n const queryClient = useQueryClient();\n const queryKey = ['wallet-authorization'];\n\n return { queryClient, queryKey, storageKey };\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { PublicKey, PublicKeyInitData } from '@solana/web3.js';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nfunction cacheReviver(key: string, value: unknown) {\n if (key === 'publicKey') {\n return new PublicKey(value as PublicKeyInitData); // the PublicKeyInitData should match the actual data structure stored in AsyncStorage\n } else {\n return value;\n }\n}\n\nexport function useFetchAuthorization() {\n const { queryKey, storageKey } = useQueryConfig();\n return useQuery({\n queryFn: async (): Promise<WalletAuthorization | null> => {\n const cacheFetchResult = await AsyncStorage.getItem(storageKey);\n\n // Return prior authorization, if found.\n return cacheFetchResult ? JSON.parse(cacheFetchResult, cacheReviver) : null;\n },\n queryKey,\n });\n}\n","import { useQueryConfig } from './use-query-config';\n\nexport function useInvalidateAuthorizations() {\n const { queryClient, queryKey } = useQueryConfig();\n\n return () => queryClient.invalidateQueries({ queryKey });\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nexport function usePersistAuthorization() {\n const { queryClient, queryKey, storageKey } = useQueryConfig();\n return useMutation({\n mutationFn: async (auth: WalletAuthorization | null): Promise<void> => {\n await AsyncStorage.setItem(storageKey, JSON.stringify(auth));\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","import { PublicKey } from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n AuthorizeAPI,\n AuthToken,\n Base64EncodedAddress,\n Chain,\n DeauthorizeAPI,\n SignInPayload,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { WalletIcon } from '@wallet-standard/core';\nimport { useCallback, useMemo } from 'react';\n\nimport { getAuthorizationFromAuthorizationResult } from './get-authorization-from-authorization-result';\nimport { useFetchAuthorization } from './use-fetch-authorization';\nimport { useInvalidateAuthorizations } from './use-invalidate-authorizations';\nimport { usePersistAuthorization } from './use-persist-authorization';\n\nexport type Account = Readonly<{\n address: Base64EncodedAddress;\n icon?: WalletIcon;\n label?: string;\n publicKey: PublicKey;\n}>;\n\nexport type WalletAuthorization = Readonly<{\n accounts: Account[];\n authToken: AuthToken;\n selectedAccount: Account;\n}>;\n\nexport function useAuthorization({ chain, identity }: { chain: Chain; identity: AppIdentity }) {\n const fetchQuery = useFetchAuthorization();\n const invalidateAuthorizations = useInvalidateAuthorizations();\n const persistMutation = usePersistAuthorization();\n\n const handleAuthorizationResult = useCallback(\n async (authorizationResult: AuthorizationResult): Promise<WalletAuthorization> => {\n const nextAuthorization = getAuthorizationFromAuthorizationResult(\n authorizationResult,\n fetchQuery.data?.selectedAccount,\n );\n await persistMutation.mutateAsync(nextAuthorization);\n return nextAuthorization;\n },\n [fetchQuery.data?.selectedAccount, persistMutation],\n );\n\n const authorizeSession = useCallback(\n async (wallet: AuthorizeAPI) => {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const authorizeSessionWithSignIn = useCallback(\n async (wallet: AuthorizeAPI, signInPayload: SignInPayload) => {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const deauthorizeSession = useCallback(\n async (wallet: DeauthorizeAPI) => {\n if (fetchQuery.data?.authToken == null) {\n return;\n }\n await wallet.deauthorize({ auth_token: fetchQuery.data.authToken });\n await persistMutation.mutateAsync(null);\n },\n [fetchQuery.data?.authToken, persistMutation],\n );\n\n const deauthorizeSessions = useCallback(async () => {\n await invalidateAuthorizations();\n await persistMutation.mutateAsync(null);\n }, [invalidateAuthorizations, persistMutation]);\n\n return useMemo(\n () => ({\n accounts: fetchQuery.data?.accounts ?? null,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading: fetchQuery.isLoading,\n selectedAccount: fetchQuery.data?.selectedAccount ?? null,\n }),\n [\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n fetchQuery.data?.accounts,\n fetchQuery.data?.selectedAccount,\n fetchQuery.isLoading,\n ],\n );\n}\n","import { Transaction, TransactionSignature, VersionedTransaction } from '@solana/web3.js';\nimport { AuthorizeAPI, SignInPayload } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { transact } from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';\nimport { useCallback, useContext, useMemo } from 'react';\n\nimport { MobileWalletProviderContext } from './mobile-wallet-provider';\nimport { Account, useAuthorization } from './use-authorization';\n\nexport function useMobileWallet() {\n const ctx = useContext(MobileWalletProviderContext);\n const { authorizeSessionWithSignIn, authorizeSession, deauthorizeSessions, selectedAccount, ...authorization } =\n useAuthorization(ctx);\n\n const connect = useCallback(\n async (): Promise<Account> => await transact(async wallet => await authorizeSession(wallet)),\n [authorizeSession],\n );\n\n const connectAnd = useCallback(\n async (cb: (wallet: AuthorizeAPI) => Promise<Account | void>): Promise<Account | void> => {\n return await transact(async wallet => await cb(wallet));\n },\n [],\n );\n\n const signIn = useCallback(\n async (signInPayload: SignInPayload): Promise<Account> =>\n await transact(async wallet => await authorizeSessionWithSignIn(wallet, signInPayload)),\n [authorizeSessionWithSignIn],\n );\n\n const disconnect = useCallback(async (): Promise<void> => await deauthorizeSessions(), [deauthorizeSessions]);\n\n const signAndSendTransaction = useCallback(\n async (\n transaction: Transaction | VersionedTransaction,\n minContextSlot: number,\n ): Promise<TransactionSignature> =>\n await transact(async wallet => {\n await authorizeSession(wallet);\n const signatures = await wallet.signAndSendTransactions({\n minContextSlot,\n transactions: [transaction],\n });\n return signatures[0];\n }),\n [authorizeSession],\n );\n\n const signMessage = useCallback(\n async (message: Uint8Array): Promise<Uint8Array> =>\n await transact(async wallet => {\n const authResult = await authorizeSession(wallet);\n const signedMessages = await wallet.signMessages({\n addresses: [authResult.address],\n payloads: [message],\n });\n return signedMessages[0];\n }),\n [authorizeSession],\n );\n\n return useMemo(\n () => ({\n ...ctx,\n ...authorization,\n account: selectedAccount,\n connect,\n connectAnd,\n disconnect,\n signAndSendTransaction,\n signIn,\n signMessage,\n }),\n [\n authorization,\n connect,\n connectAnd,\n ctx,\n disconnect,\n selectedAccount,\n signAndSendTransaction,\n signIn,\n signMessage,\n ],\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/mobile-wallet-provider.tsx","../src/get-public-key-from-address.ts","../src/get-account-from-authorized-account.ts","../src/get-authorization-from-authorization-result.ts","../src/use-query-config.ts","../src/use-fetch-authorization.ts","../src/use-invalidate-authorizations.ts","../src/use-persist-authorization.ts","../src/use-authorization.ts","../src/use-mobile-wallet.ts"],"names":["PublicKey","AsyncStorage","useMemo","useCallback"],"mappings":"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","file":"index.native.mjs","sourcesContent":["import { Commitment, Connection, ConnectionConfig } from '@solana/web3.js';\nimport { AppIdentity, Chain } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport React, { createContext, type ReactNode, useMemo } from 'react';\n\nexport interface MobileWalletProviderProps {\n chain: Chain;\n children: ReactNode;\n commitmentOrConfig?: Commitment | ConnectionConfig;\n endpoint: string;\n identity: AppIdentity;\n}\nexport interface MobileWalletProviderState {\n chain: Chain;\n connection: Connection;\n identity: AppIdentity;\n}\n\nexport const MobileWalletProviderContext = createContext<MobileWalletProviderState>({} as MobileWalletProviderState);\nexport function MobileWalletProvider({\n children,\n chain,\n commitmentOrConfig = { commitment: 'confirmed' },\n endpoint,\n identity,\n}: MobileWalletProviderProps) {\n const connection = useMemo(() => new Connection(endpoint, commitmentOrConfig), [commitmentOrConfig, endpoint]);\n\n return (\n <MobileWalletProviderContext.Provider\n value={useMemo(\n () => ({\n chain,\n connection,\n identity,\n }),\n [connection, identity, chain],\n )}\n >\n {children}\n </MobileWalletProviderContext.Provider>\n );\n}\n","import { PublicKey } from '@solana/web3.js';\nimport { Base64EncodedAddress } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { toUint8Array } from 'js-base64';\n\nexport function getPublicKeyFromAddress(address: Base64EncodedAddress): PublicKey {\n const publicKeyByteArray = toUint8Array(address);\n\n return new PublicKey(publicKeyByteArray);\n}\n","import { Account as AuthorizedAccount } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getPublicKeyFromAddress } from './get-public-key-from-address';\nimport { Account } from './use-authorization';\n\nfunction ellipsify(str = '', len = 4, delimiter = '..') {\n const limit = len * 2 + delimiter.length;\n\n return str.length > limit ? str.slice(0, len) + delimiter + str.slice(-len) : str;\n}\n\nexport function getAccountFromAuthorizedAccount(account: AuthorizedAccount): Account {\n const publicKey = getPublicKeyFromAddress(account.address);\n\n return {\n address: account.address,\n icon: account.icon,\n label: account.label ?? ellipsify(publicKey.toString(), 8),\n publicKey,\n };\n}\n","import { AuthorizationResult } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getAccountFromAuthorizedAccount } from './get-account-from-authorized-account';\nimport { Account, WalletAuthorization } from './use-authorization';\n\nexport function getAuthorizationFromAuthorizationResult(\n authorizationResult: AuthorizationResult,\n previouslySelectedAccount?: Account,\n): WalletAuthorization {\n let selectedAccount: Account;\n if (\n // We have yet to select an account.\n previouslySelectedAccount == null ||\n // The previously selected account is no longer in the set of authorized addresses.\n !authorizationResult.accounts.some(({ address }) => address === previouslySelectedAccount.address)\n ) {\n const firstAccount = authorizationResult.accounts[0];\n selectedAccount = getAccountFromAuthorizedAccount(firstAccount);\n } else {\n selectedAccount = previouslySelectedAccount;\n }\n return {\n accounts: authorizationResult.accounts.map(getAccountFromAuthorizedAccount),\n authToken: authorizationResult.auth_token,\n selectedAccount,\n };\n}\n","import { useQueryClient } from '@tanstack/react-query';\n\nexport function useQueryConfig() {\n const storageKey = 'authorization-cache';\n const queryClient = useQueryClient();\n const queryKey = ['wallet-authorization'];\n\n return { queryClient, queryKey, storageKey };\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { PublicKey, PublicKeyInitData } from '@solana/web3.js';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nfunction cacheReviver(key: string, value: unknown) {\n if (key === 'publicKey') {\n return new PublicKey(value as PublicKeyInitData); // the PublicKeyInitData should match the actual data structure stored in AsyncStorage\n } else {\n return value;\n }\n}\n\nexport function useFetchAuthorization() {\n const { queryKey, storageKey } = useQueryConfig();\n return useQuery({\n queryFn: async (): Promise<WalletAuthorization | null> => {\n const cacheFetchResult = await AsyncStorage.getItem(storageKey);\n\n // Return prior authorization, if found.\n return cacheFetchResult ? JSON.parse(cacheFetchResult, cacheReviver) : null;\n },\n queryKey,\n });\n}\n","import { useQueryConfig } from './use-query-config';\n\nexport function useInvalidateAuthorizations() {\n const { queryClient, queryKey } = useQueryConfig();\n\n return () => queryClient.invalidateQueries({ queryKey });\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nexport function usePersistAuthorization() {\n const { queryClient, queryKey, storageKey } = useQueryConfig();\n return useMutation({\n mutationFn: async (auth: WalletAuthorization | null): Promise<void> => {\n await AsyncStorage.setItem(storageKey, JSON.stringify(auth));\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","import { PublicKey } from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n AuthorizeAPI,\n AuthToken,\n Base64EncodedAddress,\n Chain,\n DeauthorizeAPI,\n SignInPayload,\n SolanaMobileWalletAdapterProtocolError,\n SolanaMobileWalletAdapterProtocolErrorCode,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { WalletIcon } from '@wallet-standard/core';\nimport { useCallback, useMemo } from 'react';\n\nimport { getAuthorizationFromAuthorizationResult } from './get-authorization-from-authorization-result';\nimport { useFetchAuthorization } from './use-fetch-authorization';\nimport { useInvalidateAuthorizations } from './use-invalidate-authorizations';\nimport { usePersistAuthorization } from './use-persist-authorization';\n\nexport type Account = Readonly<{\n address: Base64EncodedAddress;\n icon?: WalletIcon;\n label?: string;\n publicKey: PublicKey;\n}>;\n\nexport type WalletAuthorization = Readonly<{\n accounts: Account[];\n authToken: AuthToken;\n selectedAccount: Account;\n}>;\n\nexport function useAuthorization({ chain, identity }: { chain: Chain; identity: AppIdentity }) {\n const fetchQuery = useFetchAuthorization();\n const invalidateAuthorizations = useInvalidateAuthorizations();\n const persistMutation = usePersistAuthorization();\n\n const handleAuthorizationResult = useCallback(\n async (authorizationResult: AuthorizationResult): Promise<WalletAuthorization> => {\n const nextAuthorization = getAuthorizationFromAuthorizationResult(\n authorizationResult,\n fetchQuery.data?.selectedAccount,\n );\n await persistMutation.mutateAsync(nextAuthorization);\n return nextAuthorization;\n },\n [fetchQuery.data?.selectedAccount, persistMutation],\n );\n\n const authorizeSession = useCallback(\n async (wallet: AuthorizeAPI) => {\n try {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n } catch (error) {\n if (\n error instanceof SolanaMobileWalletAdapterProtocolError &&\n error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED\n ) {\n const retryResult = await wallet.authorize({\n chain,\n identity,\n });\n return (await handleAuthorizationResult(retryResult)).selectedAccount;\n }\n throw error;\n }\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const authorizeSessionWithSignIn = useCallback(\n async (wallet: AuthorizeAPI, signInPayload: SignInPayload) => {\n try {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n } catch (error) {\n if (\n error instanceof SolanaMobileWalletAdapterProtocolError &&\n error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED\n ) {\n const retryResult = await wallet.authorize({\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(retryResult)).selectedAccount;\n }\n throw error;\n }\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const deauthorizeSession = useCallback(\n async (wallet: DeauthorizeAPI) => {\n if (fetchQuery.data?.authToken == null) {\n return;\n }\n await wallet.deauthorize({ auth_token: fetchQuery.data.authToken });\n await persistMutation.mutateAsync(null);\n },\n [fetchQuery.data?.authToken, persistMutation],\n );\n\n const deauthorizeSessions = useCallback(async () => {\n await invalidateAuthorizations();\n await persistMutation.mutateAsync(null);\n }, [invalidateAuthorizations, persistMutation]);\n\n return useMemo(\n () => ({\n accounts: fetchQuery.data?.accounts ?? null,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading: fetchQuery.isLoading,\n selectedAccount: fetchQuery.data?.selectedAccount ?? null,\n }),\n [\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n fetchQuery.data?.accounts,\n fetchQuery.data?.selectedAccount,\n fetchQuery.isLoading,\n ],\n );\n}\n","import { Transaction, TransactionSignature, VersionedTransaction } from '@solana/web3.js';\nimport { AuthorizeAPI, SignInPayload } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { transact } from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';\nimport { useCallback, useContext, useMemo } from 'react';\n\nimport { MobileWalletProviderContext } from './mobile-wallet-provider';\nimport { Account, useAuthorization } from './use-authorization';\n\nexport function useMobileWallet() {\n const ctx = useContext(MobileWalletProviderContext);\n const { authorizeSessionWithSignIn, authorizeSession, deauthorizeSessions, selectedAccount, ...authorization } =\n useAuthorization(ctx);\n\n const connect = useCallback(\n async (): Promise<Account> => await transact(async wallet => await authorizeSession(wallet)),\n [authorizeSession],\n );\n\n const connectAnd = useCallback(\n async (cb: (wallet: AuthorizeAPI) => Promise<Account | void>): Promise<Account | void> => {\n return await transact(async wallet => await cb(wallet));\n },\n [],\n );\n\n const signIn = useCallback(\n async (signInPayload: SignInPayload): Promise<Account> =>\n await transact(async wallet => await authorizeSessionWithSignIn(wallet, signInPayload)),\n [authorizeSessionWithSignIn],\n );\n\n const disconnect = useCallback(async (): Promise<void> => await deauthorizeSessions(), [deauthorizeSessions]);\n\n const signAndSendTransaction = useCallback(\n async (\n transaction: Transaction | VersionedTransaction,\n minContextSlot: number,\n ): Promise<TransactionSignature> =>\n await transact(async wallet => {\n await authorizeSession(wallet);\n const signatures = await wallet.signAndSendTransactions({\n minContextSlot,\n transactions: [transaction],\n });\n return signatures[0];\n }),\n [authorizeSession],\n );\n\n const signMessage = useCallback(\n async (message: Uint8Array): Promise<Uint8Array> =>\n await transact(async wallet => {\n const authResult = await authorizeSession(wallet);\n const signedMessages = await wallet.signMessages({\n addresses: [authResult.address],\n payloads: [message],\n });\n return signedMessages[0];\n }),\n [authorizeSession],\n );\n\n return useMemo(\n () => ({\n ...ctx,\n ...authorization,\n account: selectedAccount,\n connect,\n connectAnd,\n disconnect,\n signAndSendTransaction,\n signIn,\n signMessage,\n }),\n [\n authorization,\n connect,\n connectAnd,\n ctx,\n disconnect,\n selectedAccount,\n signAndSendTransaction,\n signIn,\n signMessage,\n ],\n );\n}\n"]}
@@ -2,6 +2,7 @@
2
2
 
3
3
  var web3_js = require('@solana/web3.js');
4
4
  var React = require('react');
5
+ var mobileWalletAdapterProtocol = require('@solana-mobile/mobile-wallet-adapter-protocol');
5
6
  var jsBase64 = require('js-base64');
6
7
  var AsyncStorage = require('@react-native-async-storage/async-storage');
7
8
  var reactQuery = require('@tanstack/react-query');
@@ -138,24 +139,47 @@ function useAuthorization({ chain, identity }) {
138
139
  );
139
140
  const authorizeSession = React.useCallback(
140
141
  async (wallet) => {
141
- const authorizationResult = await wallet.authorize({
142
- auth_token: fetchQuery.data?.authToken,
143
- chain,
144
- identity
145
- });
146
- return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
142
+ try {
143
+ const authorizationResult = await wallet.authorize({
144
+ auth_token: fetchQuery.data?.authToken,
145
+ chain,
146
+ identity
147
+ });
148
+ return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
149
+ } catch (error) {
150
+ if (error instanceof mobileWalletAdapterProtocol.SolanaMobileWalletAdapterProtocolError && error.code === mobileWalletAdapterProtocol.SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED) {
151
+ const retryResult = await wallet.authorize({
152
+ chain,
153
+ identity
154
+ });
155
+ return (await handleAuthorizationResult(retryResult)).selectedAccount;
156
+ }
157
+ throw error;
158
+ }
147
159
  },
148
160
  [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult]
149
161
  );
150
162
  const authorizeSessionWithSignIn = React.useCallback(
151
163
  async (wallet, signInPayload) => {
152
- const authorizationResult = await wallet.authorize({
153
- auth_token: fetchQuery.data?.authToken,
154
- chain,
155
- identity,
156
- sign_in_payload: signInPayload
157
- });
158
- return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
164
+ try {
165
+ const authorizationResult = await wallet.authorize({
166
+ auth_token: fetchQuery.data?.authToken,
167
+ chain,
168
+ identity,
169
+ sign_in_payload: signInPayload
170
+ });
171
+ return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
172
+ } catch (error) {
173
+ if (error instanceof mobileWalletAdapterProtocol.SolanaMobileWalletAdapterProtocolError && error.code === mobileWalletAdapterProtocol.SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED) {
174
+ const retryResult = await wallet.authorize({
175
+ chain,
176
+ identity,
177
+ sign_in_payload: signInPayload
178
+ });
179
+ return (await handleAuthorizationResult(retryResult)).selectedAccount;
180
+ }
181
+ throw error;
182
+ }
159
183
  },
160
184
  [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult]
161
185
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mobile-wallet-provider.tsx","../src/get-public-key-from-address.ts","../src/get-account-from-authorized-account.ts","../src/get-authorization-from-authorization-result.ts","../src/use-query-config.ts","../src/use-fetch-authorization.ts","../src/use-invalidate-authorizations.ts","../src/use-persist-authorization.ts","../src/use-authorization.ts","../src/use-mobile-wallet.ts"],"names":["createContext","useMemo","Connection","React","toUint8Array","PublicKey","useQueryClient","useQuery","AsyncStorage","useMutation","useCallback","useContext","transact"],"mappings":"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","file":"index.node.cjs","sourcesContent":["import { Commitment, Connection, ConnectionConfig } from '@solana/web3.js';\nimport { AppIdentity, Chain } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport React, { createContext, type ReactNode, useMemo } from 'react';\n\nexport interface MobileWalletProviderProps {\n chain: Chain;\n children: ReactNode;\n commitmentOrConfig?: Commitment | ConnectionConfig;\n endpoint: string;\n identity: AppIdentity;\n}\nexport interface MobileWalletProviderState {\n chain: Chain;\n connection: Connection;\n identity: AppIdentity;\n}\n\nexport const MobileWalletProviderContext = createContext<MobileWalletProviderState>({} as MobileWalletProviderState);\nexport function MobileWalletProvider({\n children,\n chain,\n commitmentOrConfig = { commitment: 'confirmed' },\n endpoint,\n identity,\n}: MobileWalletProviderProps) {\n const connection = useMemo(() => new Connection(endpoint, commitmentOrConfig), [commitmentOrConfig, endpoint]);\n\n return (\n <MobileWalletProviderContext.Provider\n value={useMemo(\n () => ({\n chain,\n connection,\n identity,\n }),\n [connection, identity, chain],\n )}\n >\n {children}\n </MobileWalletProviderContext.Provider>\n );\n}\n","import { PublicKey } from '@solana/web3.js';\nimport { Base64EncodedAddress } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { toUint8Array } from 'js-base64';\n\nexport function getPublicKeyFromAddress(address: Base64EncodedAddress): PublicKey {\n const publicKeyByteArray = toUint8Array(address);\n\n return new PublicKey(publicKeyByteArray);\n}\n","import { Account as AuthorizedAccount } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getPublicKeyFromAddress } from './get-public-key-from-address';\nimport { Account } from './use-authorization';\n\nfunction ellipsify(str = '', len = 4, delimiter = '..') {\n const limit = len * 2 + delimiter.length;\n\n return str.length > limit ? str.slice(0, len) + delimiter + str.slice(-len) : str;\n}\n\nexport function getAccountFromAuthorizedAccount(account: AuthorizedAccount): Account {\n const publicKey = getPublicKeyFromAddress(account.address);\n\n return {\n address: account.address,\n icon: account.icon,\n label: account.label ?? ellipsify(publicKey.toString(), 8),\n publicKey,\n };\n}\n","import { AuthorizationResult } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getAccountFromAuthorizedAccount } from './get-account-from-authorized-account';\nimport { Account, WalletAuthorization } from './use-authorization';\n\nexport function getAuthorizationFromAuthorizationResult(\n authorizationResult: AuthorizationResult,\n previouslySelectedAccount?: Account,\n): WalletAuthorization {\n let selectedAccount: Account;\n if (\n // We have yet to select an account.\n previouslySelectedAccount == null ||\n // The previously selected account is no longer in the set of authorized addresses.\n !authorizationResult.accounts.some(({ address }) => address === previouslySelectedAccount.address)\n ) {\n const firstAccount = authorizationResult.accounts[0];\n selectedAccount = getAccountFromAuthorizedAccount(firstAccount);\n } else {\n selectedAccount = previouslySelectedAccount;\n }\n return {\n accounts: authorizationResult.accounts.map(getAccountFromAuthorizedAccount),\n authToken: authorizationResult.auth_token,\n selectedAccount,\n };\n}\n","import { useQueryClient } from '@tanstack/react-query';\n\nexport function useQueryConfig() {\n const storageKey = 'authorization-cache';\n const queryClient = useQueryClient();\n const queryKey = ['wallet-authorization'];\n\n return { queryClient, queryKey, storageKey };\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { PublicKey, PublicKeyInitData } from '@solana/web3.js';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nfunction cacheReviver(key: string, value: unknown) {\n if (key === 'publicKey') {\n return new PublicKey(value as PublicKeyInitData); // the PublicKeyInitData should match the actual data structure stored in AsyncStorage\n } else {\n return value;\n }\n}\n\nexport function useFetchAuthorization() {\n const { queryKey, storageKey } = useQueryConfig();\n return useQuery({\n queryFn: async (): Promise<WalletAuthorization | null> => {\n const cacheFetchResult = await AsyncStorage.getItem(storageKey);\n\n // Return prior authorization, if found.\n return cacheFetchResult ? JSON.parse(cacheFetchResult, cacheReviver) : null;\n },\n queryKey,\n });\n}\n","import { useQueryConfig } from './use-query-config';\n\nexport function useInvalidateAuthorizations() {\n const { queryClient, queryKey } = useQueryConfig();\n\n return () => queryClient.invalidateQueries({ queryKey });\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nexport function usePersistAuthorization() {\n const { queryClient, queryKey, storageKey } = useQueryConfig();\n return useMutation({\n mutationFn: async (auth: WalletAuthorization | null): Promise<void> => {\n await AsyncStorage.setItem(storageKey, JSON.stringify(auth));\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","import { PublicKey } from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n AuthorizeAPI,\n AuthToken,\n Base64EncodedAddress,\n Chain,\n DeauthorizeAPI,\n SignInPayload,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { WalletIcon } from '@wallet-standard/core';\nimport { useCallback, useMemo } from 'react';\n\nimport { getAuthorizationFromAuthorizationResult } from './get-authorization-from-authorization-result';\nimport { useFetchAuthorization } from './use-fetch-authorization';\nimport { useInvalidateAuthorizations } from './use-invalidate-authorizations';\nimport { usePersistAuthorization } from './use-persist-authorization';\n\nexport type Account = Readonly<{\n address: Base64EncodedAddress;\n icon?: WalletIcon;\n label?: string;\n publicKey: PublicKey;\n}>;\n\nexport type WalletAuthorization = Readonly<{\n accounts: Account[];\n authToken: AuthToken;\n selectedAccount: Account;\n}>;\n\nexport function useAuthorization({ chain, identity }: { chain: Chain; identity: AppIdentity }) {\n const fetchQuery = useFetchAuthorization();\n const invalidateAuthorizations = useInvalidateAuthorizations();\n const persistMutation = usePersistAuthorization();\n\n const handleAuthorizationResult = useCallback(\n async (authorizationResult: AuthorizationResult): Promise<WalletAuthorization> => {\n const nextAuthorization = getAuthorizationFromAuthorizationResult(\n authorizationResult,\n fetchQuery.data?.selectedAccount,\n );\n await persistMutation.mutateAsync(nextAuthorization);\n return nextAuthorization;\n },\n [fetchQuery.data?.selectedAccount, persistMutation],\n );\n\n const authorizeSession = useCallback(\n async (wallet: AuthorizeAPI) => {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const authorizeSessionWithSignIn = useCallback(\n async (wallet: AuthorizeAPI, signInPayload: SignInPayload) => {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const deauthorizeSession = useCallback(\n async (wallet: DeauthorizeAPI) => {\n if (fetchQuery.data?.authToken == null) {\n return;\n }\n await wallet.deauthorize({ auth_token: fetchQuery.data.authToken });\n await persistMutation.mutateAsync(null);\n },\n [fetchQuery.data?.authToken, persistMutation],\n );\n\n const deauthorizeSessions = useCallback(async () => {\n await invalidateAuthorizations();\n await persistMutation.mutateAsync(null);\n }, [invalidateAuthorizations, persistMutation]);\n\n return useMemo(\n () => ({\n accounts: fetchQuery.data?.accounts ?? null,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading: fetchQuery.isLoading,\n selectedAccount: fetchQuery.data?.selectedAccount ?? null,\n }),\n [\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n fetchQuery.data?.accounts,\n fetchQuery.data?.selectedAccount,\n fetchQuery.isLoading,\n ],\n );\n}\n","import { Transaction, TransactionSignature, VersionedTransaction } from '@solana/web3.js';\nimport { AuthorizeAPI, SignInPayload } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { transact } from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';\nimport { useCallback, useContext, useMemo } from 'react';\n\nimport { MobileWalletProviderContext } from './mobile-wallet-provider';\nimport { Account, useAuthorization } from './use-authorization';\n\nexport function useMobileWallet() {\n const ctx = useContext(MobileWalletProviderContext);\n const { authorizeSessionWithSignIn, authorizeSession, deauthorizeSessions, selectedAccount, ...authorization } =\n useAuthorization(ctx);\n\n const connect = useCallback(\n async (): Promise<Account> => await transact(async wallet => await authorizeSession(wallet)),\n [authorizeSession],\n );\n\n const connectAnd = useCallback(\n async (cb: (wallet: AuthorizeAPI) => Promise<Account | void>): Promise<Account | void> => {\n return await transact(async wallet => await cb(wallet));\n },\n [],\n );\n\n const signIn = useCallback(\n async (signInPayload: SignInPayload): Promise<Account> =>\n await transact(async wallet => await authorizeSessionWithSignIn(wallet, signInPayload)),\n [authorizeSessionWithSignIn],\n );\n\n const disconnect = useCallback(async (): Promise<void> => await deauthorizeSessions(), [deauthorizeSessions]);\n\n const signAndSendTransaction = useCallback(\n async (\n transaction: Transaction | VersionedTransaction,\n minContextSlot: number,\n ): Promise<TransactionSignature> =>\n await transact(async wallet => {\n await authorizeSession(wallet);\n const signatures = await wallet.signAndSendTransactions({\n minContextSlot,\n transactions: [transaction],\n });\n return signatures[0];\n }),\n [authorizeSession],\n );\n\n const signMessage = useCallback(\n async (message: Uint8Array): Promise<Uint8Array> =>\n await transact(async wallet => {\n const authResult = await authorizeSession(wallet);\n const signedMessages = await wallet.signMessages({\n addresses: [authResult.address],\n payloads: [message],\n });\n return signedMessages[0];\n }),\n [authorizeSession],\n );\n\n return useMemo(\n () => ({\n ...ctx,\n ...authorization,\n account: selectedAccount,\n connect,\n connectAnd,\n disconnect,\n signAndSendTransaction,\n signIn,\n signMessage,\n }),\n [\n authorization,\n connect,\n connectAnd,\n ctx,\n disconnect,\n selectedAccount,\n signAndSendTransaction,\n signIn,\n signMessage,\n ],\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/mobile-wallet-provider.tsx","../src/get-public-key-from-address.ts","../src/get-account-from-authorized-account.ts","../src/get-authorization-from-authorization-result.ts","../src/use-query-config.ts","../src/use-fetch-authorization.ts","../src/use-invalidate-authorizations.ts","../src/use-persist-authorization.ts","../src/use-authorization.ts","../src/use-mobile-wallet.ts"],"names":["createContext","useMemo","Connection","React","toUint8Array","PublicKey","useQueryClient","useQuery","AsyncStorage","useMutation","useCallback","SolanaMobileWalletAdapterProtocolError","SolanaMobileWalletAdapterProtocolErrorCode","useContext","transact"],"mappings":"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","file":"index.node.cjs","sourcesContent":["import { Commitment, Connection, ConnectionConfig } from '@solana/web3.js';\nimport { AppIdentity, Chain } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport React, { createContext, type ReactNode, useMemo } from 'react';\n\nexport interface MobileWalletProviderProps {\n chain: Chain;\n children: ReactNode;\n commitmentOrConfig?: Commitment | ConnectionConfig;\n endpoint: string;\n identity: AppIdentity;\n}\nexport interface MobileWalletProviderState {\n chain: Chain;\n connection: Connection;\n identity: AppIdentity;\n}\n\nexport const MobileWalletProviderContext = createContext<MobileWalletProviderState>({} as MobileWalletProviderState);\nexport function MobileWalletProvider({\n children,\n chain,\n commitmentOrConfig = { commitment: 'confirmed' },\n endpoint,\n identity,\n}: MobileWalletProviderProps) {\n const connection = useMemo(() => new Connection(endpoint, commitmentOrConfig), [commitmentOrConfig, endpoint]);\n\n return (\n <MobileWalletProviderContext.Provider\n value={useMemo(\n () => ({\n chain,\n connection,\n identity,\n }),\n [connection, identity, chain],\n )}\n >\n {children}\n </MobileWalletProviderContext.Provider>\n );\n}\n","import { PublicKey } from '@solana/web3.js';\nimport { Base64EncodedAddress } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { toUint8Array } from 'js-base64';\n\nexport function getPublicKeyFromAddress(address: Base64EncodedAddress): PublicKey {\n const publicKeyByteArray = toUint8Array(address);\n\n return new PublicKey(publicKeyByteArray);\n}\n","import { Account as AuthorizedAccount } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getPublicKeyFromAddress } from './get-public-key-from-address';\nimport { Account } from './use-authorization';\n\nfunction ellipsify(str = '', len = 4, delimiter = '..') {\n const limit = len * 2 + delimiter.length;\n\n return str.length > limit ? str.slice(0, len) + delimiter + str.slice(-len) : str;\n}\n\nexport function getAccountFromAuthorizedAccount(account: AuthorizedAccount): Account {\n const publicKey = getPublicKeyFromAddress(account.address);\n\n return {\n address: account.address,\n icon: account.icon,\n label: account.label ?? ellipsify(publicKey.toString(), 8),\n publicKey,\n };\n}\n","import { AuthorizationResult } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getAccountFromAuthorizedAccount } from './get-account-from-authorized-account';\nimport { Account, WalletAuthorization } from './use-authorization';\n\nexport function getAuthorizationFromAuthorizationResult(\n authorizationResult: AuthorizationResult,\n previouslySelectedAccount?: Account,\n): WalletAuthorization {\n let selectedAccount: Account;\n if (\n // We have yet to select an account.\n previouslySelectedAccount == null ||\n // The previously selected account is no longer in the set of authorized addresses.\n !authorizationResult.accounts.some(({ address }) => address === previouslySelectedAccount.address)\n ) {\n const firstAccount = authorizationResult.accounts[0];\n selectedAccount = getAccountFromAuthorizedAccount(firstAccount);\n } else {\n selectedAccount = previouslySelectedAccount;\n }\n return {\n accounts: authorizationResult.accounts.map(getAccountFromAuthorizedAccount),\n authToken: authorizationResult.auth_token,\n selectedAccount,\n };\n}\n","import { useQueryClient } from '@tanstack/react-query';\n\nexport function useQueryConfig() {\n const storageKey = 'authorization-cache';\n const queryClient = useQueryClient();\n const queryKey = ['wallet-authorization'];\n\n return { queryClient, queryKey, storageKey };\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { PublicKey, PublicKeyInitData } from '@solana/web3.js';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nfunction cacheReviver(key: string, value: unknown) {\n if (key === 'publicKey') {\n return new PublicKey(value as PublicKeyInitData); // the PublicKeyInitData should match the actual data structure stored in AsyncStorage\n } else {\n return value;\n }\n}\n\nexport function useFetchAuthorization() {\n const { queryKey, storageKey } = useQueryConfig();\n return useQuery({\n queryFn: async (): Promise<WalletAuthorization | null> => {\n const cacheFetchResult = await AsyncStorage.getItem(storageKey);\n\n // Return prior authorization, if found.\n return cacheFetchResult ? JSON.parse(cacheFetchResult, cacheReviver) : null;\n },\n queryKey,\n });\n}\n","import { useQueryConfig } from './use-query-config';\n\nexport function useInvalidateAuthorizations() {\n const { queryClient, queryKey } = useQueryConfig();\n\n return () => queryClient.invalidateQueries({ queryKey });\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nexport function usePersistAuthorization() {\n const { queryClient, queryKey, storageKey } = useQueryConfig();\n return useMutation({\n mutationFn: async (auth: WalletAuthorization | null): Promise<void> => {\n await AsyncStorage.setItem(storageKey, JSON.stringify(auth));\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","import { PublicKey } from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n AuthorizeAPI,\n AuthToken,\n Base64EncodedAddress,\n Chain,\n DeauthorizeAPI,\n SignInPayload,\n SolanaMobileWalletAdapterProtocolError,\n SolanaMobileWalletAdapterProtocolErrorCode,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { WalletIcon } from '@wallet-standard/core';\nimport { useCallback, useMemo } from 'react';\n\nimport { getAuthorizationFromAuthorizationResult } from './get-authorization-from-authorization-result';\nimport { useFetchAuthorization } from './use-fetch-authorization';\nimport { useInvalidateAuthorizations } from './use-invalidate-authorizations';\nimport { usePersistAuthorization } from './use-persist-authorization';\n\nexport type Account = Readonly<{\n address: Base64EncodedAddress;\n icon?: WalletIcon;\n label?: string;\n publicKey: PublicKey;\n}>;\n\nexport type WalletAuthorization = Readonly<{\n accounts: Account[];\n authToken: AuthToken;\n selectedAccount: Account;\n}>;\n\nexport function useAuthorization({ chain, identity }: { chain: Chain; identity: AppIdentity }) {\n const fetchQuery = useFetchAuthorization();\n const invalidateAuthorizations = useInvalidateAuthorizations();\n const persistMutation = usePersistAuthorization();\n\n const handleAuthorizationResult = useCallback(\n async (authorizationResult: AuthorizationResult): Promise<WalletAuthorization> => {\n const nextAuthorization = getAuthorizationFromAuthorizationResult(\n authorizationResult,\n fetchQuery.data?.selectedAccount,\n );\n await persistMutation.mutateAsync(nextAuthorization);\n return nextAuthorization;\n },\n [fetchQuery.data?.selectedAccount, persistMutation],\n );\n\n const authorizeSession = useCallback(\n async (wallet: AuthorizeAPI) => {\n try {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n } catch (error) {\n if (\n error instanceof SolanaMobileWalletAdapterProtocolError &&\n error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED\n ) {\n const retryResult = await wallet.authorize({\n chain,\n identity,\n });\n return (await handleAuthorizationResult(retryResult)).selectedAccount;\n }\n throw error;\n }\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const authorizeSessionWithSignIn = useCallback(\n async (wallet: AuthorizeAPI, signInPayload: SignInPayload) => {\n try {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n } catch (error) {\n if (\n error instanceof SolanaMobileWalletAdapterProtocolError &&\n error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED\n ) {\n const retryResult = await wallet.authorize({\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(retryResult)).selectedAccount;\n }\n throw error;\n }\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const deauthorizeSession = useCallback(\n async (wallet: DeauthorizeAPI) => {\n if (fetchQuery.data?.authToken == null) {\n return;\n }\n await wallet.deauthorize({ auth_token: fetchQuery.data.authToken });\n await persistMutation.mutateAsync(null);\n },\n [fetchQuery.data?.authToken, persistMutation],\n );\n\n const deauthorizeSessions = useCallback(async () => {\n await invalidateAuthorizations();\n await persistMutation.mutateAsync(null);\n }, [invalidateAuthorizations, persistMutation]);\n\n return useMemo(\n () => ({\n accounts: fetchQuery.data?.accounts ?? null,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading: fetchQuery.isLoading,\n selectedAccount: fetchQuery.data?.selectedAccount ?? null,\n }),\n [\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n fetchQuery.data?.accounts,\n fetchQuery.data?.selectedAccount,\n fetchQuery.isLoading,\n ],\n );\n}\n","import { Transaction, TransactionSignature, VersionedTransaction } from '@solana/web3.js';\nimport { AuthorizeAPI, SignInPayload } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { transact } from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';\nimport { useCallback, useContext, useMemo } from 'react';\n\nimport { MobileWalletProviderContext } from './mobile-wallet-provider';\nimport { Account, useAuthorization } from './use-authorization';\n\nexport function useMobileWallet() {\n const ctx = useContext(MobileWalletProviderContext);\n const { authorizeSessionWithSignIn, authorizeSession, deauthorizeSessions, selectedAccount, ...authorization } =\n useAuthorization(ctx);\n\n const connect = useCallback(\n async (): Promise<Account> => await transact(async wallet => await authorizeSession(wallet)),\n [authorizeSession],\n );\n\n const connectAnd = useCallback(\n async (cb: (wallet: AuthorizeAPI) => Promise<Account | void>): Promise<Account | void> => {\n return await transact(async wallet => await cb(wallet));\n },\n [],\n );\n\n const signIn = useCallback(\n async (signInPayload: SignInPayload): Promise<Account> =>\n await transact(async wallet => await authorizeSessionWithSignIn(wallet, signInPayload)),\n [authorizeSessionWithSignIn],\n );\n\n const disconnect = useCallback(async (): Promise<void> => await deauthorizeSessions(), [deauthorizeSessions]);\n\n const signAndSendTransaction = useCallback(\n async (\n transaction: Transaction | VersionedTransaction,\n minContextSlot: number,\n ): Promise<TransactionSignature> =>\n await transact(async wallet => {\n await authorizeSession(wallet);\n const signatures = await wallet.signAndSendTransactions({\n minContextSlot,\n transactions: [transaction],\n });\n return signatures[0];\n }),\n [authorizeSession],\n );\n\n const signMessage = useCallback(\n async (message: Uint8Array): Promise<Uint8Array> =>\n await transact(async wallet => {\n const authResult = await authorizeSession(wallet);\n const signedMessages = await wallet.signMessages({\n addresses: [authResult.address],\n payloads: [message],\n });\n return signedMessages[0];\n }),\n [authorizeSession],\n );\n\n return useMemo(\n () => ({\n ...ctx,\n ...authorization,\n account: selectedAccount,\n connect,\n connectAnd,\n disconnect,\n signAndSendTransaction,\n signIn,\n signMessage,\n }),\n [\n authorization,\n connect,\n connectAnd,\n ctx,\n disconnect,\n selectedAccount,\n signAndSendTransaction,\n signIn,\n signMessage,\n ],\n );\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { Connection, PublicKey } from '@solana/web3.js';
2
2
  import React, { createContext, useMemo, useCallback, useContext } from 'react';
3
+ import { SolanaMobileWalletAdapterProtocolError, SolanaMobileWalletAdapterProtocolErrorCode } from '@solana-mobile/mobile-wallet-adapter-protocol';
3
4
  import { toUint8Array } from 'js-base64';
4
5
  export { fromUint8Array, toUint8Array } from 'js-base64';
5
6
  import AsyncStorage from '@react-native-async-storage/async-storage';
@@ -133,24 +134,47 @@ function useAuthorization({ chain, identity }) {
133
134
  );
134
135
  const authorizeSession = useCallback(
135
136
  async (wallet) => {
136
- const authorizationResult = await wallet.authorize({
137
- auth_token: fetchQuery.data?.authToken,
138
- chain,
139
- identity
140
- });
141
- return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
137
+ try {
138
+ const authorizationResult = await wallet.authorize({
139
+ auth_token: fetchQuery.data?.authToken,
140
+ chain,
141
+ identity
142
+ });
143
+ return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
144
+ } catch (error) {
145
+ if (error instanceof SolanaMobileWalletAdapterProtocolError && error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED) {
146
+ const retryResult = await wallet.authorize({
147
+ chain,
148
+ identity
149
+ });
150
+ return (await handleAuthorizationResult(retryResult)).selectedAccount;
151
+ }
152
+ throw error;
153
+ }
142
154
  },
143
155
  [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult]
144
156
  );
145
157
  const authorizeSessionWithSignIn = useCallback(
146
158
  async (wallet, signInPayload) => {
147
- const authorizationResult = await wallet.authorize({
148
- auth_token: fetchQuery.data?.authToken,
149
- chain,
150
- identity,
151
- sign_in_payload: signInPayload
152
- });
153
- return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
159
+ try {
160
+ const authorizationResult = await wallet.authorize({
161
+ auth_token: fetchQuery.data?.authToken,
162
+ chain,
163
+ identity,
164
+ sign_in_payload: signInPayload
165
+ });
166
+ return (await handleAuthorizationResult(authorizationResult)).selectedAccount;
167
+ } catch (error) {
168
+ if (error instanceof SolanaMobileWalletAdapterProtocolError && error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED) {
169
+ const retryResult = await wallet.authorize({
170
+ chain,
171
+ identity,
172
+ sign_in_payload: signInPayload
173
+ });
174
+ return (await handleAuthorizationResult(retryResult)).selectedAccount;
175
+ }
176
+ throw error;
177
+ }
154
178
  },
155
179
  [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult]
156
180
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mobile-wallet-provider.tsx","../src/get-public-key-from-address.ts","../src/get-account-from-authorized-account.ts","../src/get-authorization-from-authorization-result.ts","../src/use-query-config.ts","../src/use-fetch-authorization.ts","../src/use-invalidate-authorizations.ts","../src/use-persist-authorization.ts","../src/use-authorization.ts","../src/use-mobile-wallet.ts"],"names":["PublicKey","AsyncStorage","useMemo","useCallback"],"mappings":"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","file":"index.node.mjs","sourcesContent":["import { Commitment, Connection, ConnectionConfig } from '@solana/web3.js';\nimport { AppIdentity, Chain } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport React, { createContext, type ReactNode, useMemo } from 'react';\n\nexport interface MobileWalletProviderProps {\n chain: Chain;\n children: ReactNode;\n commitmentOrConfig?: Commitment | ConnectionConfig;\n endpoint: string;\n identity: AppIdentity;\n}\nexport interface MobileWalletProviderState {\n chain: Chain;\n connection: Connection;\n identity: AppIdentity;\n}\n\nexport const MobileWalletProviderContext = createContext<MobileWalletProviderState>({} as MobileWalletProviderState);\nexport function MobileWalletProvider({\n children,\n chain,\n commitmentOrConfig = { commitment: 'confirmed' },\n endpoint,\n identity,\n}: MobileWalletProviderProps) {\n const connection = useMemo(() => new Connection(endpoint, commitmentOrConfig), [commitmentOrConfig, endpoint]);\n\n return (\n <MobileWalletProviderContext.Provider\n value={useMemo(\n () => ({\n chain,\n connection,\n identity,\n }),\n [connection, identity, chain],\n )}\n >\n {children}\n </MobileWalletProviderContext.Provider>\n );\n}\n","import { PublicKey } from '@solana/web3.js';\nimport { Base64EncodedAddress } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { toUint8Array } from 'js-base64';\n\nexport function getPublicKeyFromAddress(address: Base64EncodedAddress): PublicKey {\n const publicKeyByteArray = toUint8Array(address);\n\n return new PublicKey(publicKeyByteArray);\n}\n","import { Account as AuthorizedAccount } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getPublicKeyFromAddress } from './get-public-key-from-address';\nimport { Account } from './use-authorization';\n\nfunction ellipsify(str = '', len = 4, delimiter = '..') {\n const limit = len * 2 + delimiter.length;\n\n return str.length > limit ? str.slice(0, len) + delimiter + str.slice(-len) : str;\n}\n\nexport function getAccountFromAuthorizedAccount(account: AuthorizedAccount): Account {\n const publicKey = getPublicKeyFromAddress(account.address);\n\n return {\n address: account.address,\n icon: account.icon,\n label: account.label ?? ellipsify(publicKey.toString(), 8),\n publicKey,\n };\n}\n","import { AuthorizationResult } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getAccountFromAuthorizedAccount } from './get-account-from-authorized-account';\nimport { Account, WalletAuthorization } from './use-authorization';\n\nexport function getAuthorizationFromAuthorizationResult(\n authorizationResult: AuthorizationResult,\n previouslySelectedAccount?: Account,\n): WalletAuthorization {\n let selectedAccount: Account;\n if (\n // We have yet to select an account.\n previouslySelectedAccount == null ||\n // The previously selected account is no longer in the set of authorized addresses.\n !authorizationResult.accounts.some(({ address }) => address === previouslySelectedAccount.address)\n ) {\n const firstAccount = authorizationResult.accounts[0];\n selectedAccount = getAccountFromAuthorizedAccount(firstAccount);\n } else {\n selectedAccount = previouslySelectedAccount;\n }\n return {\n accounts: authorizationResult.accounts.map(getAccountFromAuthorizedAccount),\n authToken: authorizationResult.auth_token,\n selectedAccount,\n };\n}\n","import { useQueryClient } from '@tanstack/react-query';\n\nexport function useQueryConfig() {\n const storageKey = 'authorization-cache';\n const queryClient = useQueryClient();\n const queryKey = ['wallet-authorization'];\n\n return { queryClient, queryKey, storageKey };\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { PublicKey, PublicKeyInitData } from '@solana/web3.js';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nfunction cacheReviver(key: string, value: unknown) {\n if (key === 'publicKey') {\n return new PublicKey(value as PublicKeyInitData); // the PublicKeyInitData should match the actual data structure stored in AsyncStorage\n } else {\n return value;\n }\n}\n\nexport function useFetchAuthorization() {\n const { queryKey, storageKey } = useQueryConfig();\n return useQuery({\n queryFn: async (): Promise<WalletAuthorization | null> => {\n const cacheFetchResult = await AsyncStorage.getItem(storageKey);\n\n // Return prior authorization, if found.\n return cacheFetchResult ? JSON.parse(cacheFetchResult, cacheReviver) : null;\n },\n queryKey,\n });\n}\n","import { useQueryConfig } from './use-query-config';\n\nexport function useInvalidateAuthorizations() {\n const { queryClient, queryKey } = useQueryConfig();\n\n return () => queryClient.invalidateQueries({ queryKey });\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nexport function usePersistAuthorization() {\n const { queryClient, queryKey, storageKey } = useQueryConfig();\n return useMutation({\n mutationFn: async (auth: WalletAuthorization | null): Promise<void> => {\n await AsyncStorage.setItem(storageKey, JSON.stringify(auth));\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","import { PublicKey } from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n AuthorizeAPI,\n AuthToken,\n Base64EncodedAddress,\n Chain,\n DeauthorizeAPI,\n SignInPayload,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { WalletIcon } from '@wallet-standard/core';\nimport { useCallback, useMemo } from 'react';\n\nimport { getAuthorizationFromAuthorizationResult } from './get-authorization-from-authorization-result';\nimport { useFetchAuthorization } from './use-fetch-authorization';\nimport { useInvalidateAuthorizations } from './use-invalidate-authorizations';\nimport { usePersistAuthorization } from './use-persist-authorization';\n\nexport type Account = Readonly<{\n address: Base64EncodedAddress;\n icon?: WalletIcon;\n label?: string;\n publicKey: PublicKey;\n}>;\n\nexport type WalletAuthorization = Readonly<{\n accounts: Account[];\n authToken: AuthToken;\n selectedAccount: Account;\n}>;\n\nexport function useAuthorization({ chain, identity }: { chain: Chain; identity: AppIdentity }) {\n const fetchQuery = useFetchAuthorization();\n const invalidateAuthorizations = useInvalidateAuthorizations();\n const persistMutation = usePersistAuthorization();\n\n const handleAuthorizationResult = useCallback(\n async (authorizationResult: AuthorizationResult): Promise<WalletAuthorization> => {\n const nextAuthorization = getAuthorizationFromAuthorizationResult(\n authorizationResult,\n fetchQuery.data?.selectedAccount,\n );\n await persistMutation.mutateAsync(nextAuthorization);\n return nextAuthorization;\n },\n [fetchQuery.data?.selectedAccount, persistMutation],\n );\n\n const authorizeSession = useCallback(\n async (wallet: AuthorizeAPI) => {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const authorizeSessionWithSignIn = useCallback(\n async (wallet: AuthorizeAPI, signInPayload: SignInPayload) => {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const deauthorizeSession = useCallback(\n async (wallet: DeauthorizeAPI) => {\n if (fetchQuery.data?.authToken == null) {\n return;\n }\n await wallet.deauthorize({ auth_token: fetchQuery.data.authToken });\n await persistMutation.mutateAsync(null);\n },\n [fetchQuery.data?.authToken, persistMutation],\n );\n\n const deauthorizeSessions = useCallback(async () => {\n await invalidateAuthorizations();\n await persistMutation.mutateAsync(null);\n }, [invalidateAuthorizations, persistMutation]);\n\n return useMemo(\n () => ({\n accounts: fetchQuery.data?.accounts ?? null,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading: fetchQuery.isLoading,\n selectedAccount: fetchQuery.data?.selectedAccount ?? null,\n }),\n [\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n fetchQuery.data?.accounts,\n fetchQuery.data?.selectedAccount,\n fetchQuery.isLoading,\n ],\n );\n}\n","import { Transaction, TransactionSignature, VersionedTransaction } from '@solana/web3.js';\nimport { AuthorizeAPI, SignInPayload } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { transact } from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';\nimport { useCallback, useContext, useMemo } from 'react';\n\nimport { MobileWalletProviderContext } from './mobile-wallet-provider';\nimport { Account, useAuthorization } from './use-authorization';\n\nexport function useMobileWallet() {\n const ctx = useContext(MobileWalletProviderContext);\n const { authorizeSessionWithSignIn, authorizeSession, deauthorizeSessions, selectedAccount, ...authorization } =\n useAuthorization(ctx);\n\n const connect = useCallback(\n async (): Promise<Account> => await transact(async wallet => await authorizeSession(wallet)),\n [authorizeSession],\n );\n\n const connectAnd = useCallback(\n async (cb: (wallet: AuthorizeAPI) => Promise<Account | void>): Promise<Account | void> => {\n return await transact(async wallet => await cb(wallet));\n },\n [],\n );\n\n const signIn = useCallback(\n async (signInPayload: SignInPayload): Promise<Account> =>\n await transact(async wallet => await authorizeSessionWithSignIn(wallet, signInPayload)),\n [authorizeSessionWithSignIn],\n );\n\n const disconnect = useCallback(async (): Promise<void> => await deauthorizeSessions(), [deauthorizeSessions]);\n\n const signAndSendTransaction = useCallback(\n async (\n transaction: Transaction | VersionedTransaction,\n minContextSlot: number,\n ): Promise<TransactionSignature> =>\n await transact(async wallet => {\n await authorizeSession(wallet);\n const signatures = await wallet.signAndSendTransactions({\n minContextSlot,\n transactions: [transaction],\n });\n return signatures[0];\n }),\n [authorizeSession],\n );\n\n const signMessage = useCallback(\n async (message: Uint8Array): Promise<Uint8Array> =>\n await transact(async wallet => {\n const authResult = await authorizeSession(wallet);\n const signedMessages = await wallet.signMessages({\n addresses: [authResult.address],\n payloads: [message],\n });\n return signedMessages[0];\n }),\n [authorizeSession],\n );\n\n return useMemo(\n () => ({\n ...ctx,\n ...authorization,\n account: selectedAccount,\n connect,\n connectAnd,\n disconnect,\n signAndSendTransaction,\n signIn,\n signMessage,\n }),\n [\n authorization,\n connect,\n connectAnd,\n ctx,\n disconnect,\n selectedAccount,\n signAndSendTransaction,\n signIn,\n signMessage,\n ],\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/mobile-wallet-provider.tsx","../src/get-public-key-from-address.ts","../src/get-account-from-authorized-account.ts","../src/get-authorization-from-authorization-result.ts","../src/use-query-config.ts","../src/use-fetch-authorization.ts","../src/use-invalidate-authorizations.ts","../src/use-persist-authorization.ts","../src/use-authorization.ts","../src/use-mobile-wallet.ts"],"names":["PublicKey","AsyncStorage","useMemo","useCallback"],"mappings":"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","file":"index.node.mjs","sourcesContent":["import { Commitment, Connection, ConnectionConfig } from '@solana/web3.js';\nimport { AppIdentity, Chain } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport React, { createContext, type ReactNode, useMemo } from 'react';\n\nexport interface MobileWalletProviderProps {\n chain: Chain;\n children: ReactNode;\n commitmentOrConfig?: Commitment | ConnectionConfig;\n endpoint: string;\n identity: AppIdentity;\n}\nexport interface MobileWalletProviderState {\n chain: Chain;\n connection: Connection;\n identity: AppIdentity;\n}\n\nexport const MobileWalletProviderContext = createContext<MobileWalletProviderState>({} as MobileWalletProviderState);\nexport function MobileWalletProvider({\n children,\n chain,\n commitmentOrConfig = { commitment: 'confirmed' },\n endpoint,\n identity,\n}: MobileWalletProviderProps) {\n const connection = useMemo(() => new Connection(endpoint, commitmentOrConfig), [commitmentOrConfig, endpoint]);\n\n return (\n <MobileWalletProviderContext.Provider\n value={useMemo(\n () => ({\n chain,\n connection,\n identity,\n }),\n [connection, identity, chain],\n )}\n >\n {children}\n </MobileWalletProviderContext.Provider>\n );\n}\n","import { PublicKey } from '@solana/web3.js';\nimport { Base64EncodedAddress } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { toUint8Array } from 'js-base64';\n\nexport function getPublicKeyFromAddress(address: Base64EncodedAddress): PublicKey {\n const publicKeyByteArray = toUint8Array(address);\n\n return new PublicKey(publicKeyByteArray);\n}\n","import { Account as AuthorizedAccount } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getPublicKeyFromAddress } from './get-public-key-from-address';\nimport { Account } from './use-authorization';\n\nfunction ellipsify(str = '', len = 4, delimiter = '..') {\n const limit = len * 2 + delimiter.length;\n\n return str.length > limit ? str.slice(0, len) + delimiter + str.slice(-len) : str;\n}\n\nexport function getAccountFromAuthorizedAccount(account: AuthorizedAccount): Account {\n const publicKey = getPublicKeyFromAddress(account.address);\n\n return {\n address: account.address,\n icon: account.icon,\n label: account.label ?? ellipsify(publicKey.toString(), 8),\n publicKey,\n };\n}\n","import { AuthorizationResult } from '@solana-mobile/mobile-wallet-adapter-protocol';\n\nimport { getAccountFromAuthorizedAccount } from './get-account-from-authorized-account';\nimport { Account, WalletAuthorization } from './use-authorization';\n\nexport function getAuthorizationFromAuthorizationResult(\n authorizationResult: AuthorizationResult,\n previouslySelectedAccount?: Account,\n): WalletAuthorization {\n let selectedAccount: Account;\n if (\n // We have yet to select an account.\n previouslySelectedAccount == null ||\n // The previously selected account is no longer in the set of authorized addresses.\n !authorizationResult.accounts.some(({ address }) => address === previouslySelectedAccount.address)\n ) {\n const firstAccount = authorizationResult.accounts[0];\n selectedAccount = getAccountFromAuthorizedAccount(firstAccount);\n } else {\n selectedAccount = previouslySelectedAccount;\n }\n return {\n accounts: authorizationResult.accounts.map(getAccountFromAuthorizedAccount),\n authToken: authorizationResult.auth_token,\n selectedAccount,\n };\n}\n","import { useQueryClient } from '@tanstack/react-query';\n\nexport function useQueryConfig() {\n const storageKey = 'authorization-cache';\n const queryClient = useQueryClient();\n const queryKey = ['wallet-authorization'];\n\n return { queryClient, queryKey, storageKey };\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { PublicKey, PublicKeyInitData } from '@solana/web3.js';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nfunction cacheReviver(key: string, value: unknown) {\n if (key === 'publicKey') {\n return new PublicKey(value as PublicKeyInitData); // the PublicKeyInitData should match the actual data structure stored in AsyncStorage\n } else {\n return value;\n }\n}\n\nexport function useFetchAuthorization() {\n const { queryKey, storageKey } = useQueryConfig();\n return useQuery({\n queryFn: async (): Promise<WalletAuthorization | null> => {\n const cacheFetchResult = await AsyncStorage.getItem(storageKey);\n\n // Return prior authorization, if found.\n return cacheFetchResult ? JSON.parse(cacheFetchResult, cacheReviver) : null;\n },\n queryKey,\n });\n}\n","import { useQueryConfig } from './use-query-config';\n\nexport function useInvalidateAuthorizations() {\n const { queryClient, queryKey } = useQueryConfig();\n\n return () => queryClient.invalidateQueries({ queryKey });\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\nimport { useQueryConfig } from './use-query-config';\n\nexport function usePersistAuthorization() {\n const { queryClient, queryKey, storageKey } = useQueryConfig();\n return useMutation({\n mutationFn: async (auth: WalletAuthorization | null): Promise<void> => {\n await AsyncStorage.setItem(storageKey, JSON.stringify(auth));\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({ queryKey });\n },\n });\n}\n","import { PublicKey } from '@solana/web3.js';\nimport {\n AppIdentity,\n AuthorizationResult,\n AuthorizeAPI,\n AuthToken,\n Base64EncodedAddress,\n Chain,\n DeauthorizeAPI,\n SignInPayload,\n SolanaMobileWalletAdapterProtocolError,\n SolanaMobileWalletAdapterProtocolErrorCode,\n} from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { WalletIcon } from '@wallet-standard/core';\nimport { useCallback, useMemo } from 'react';\n\nimport { getAuthorizationFromAuthorizationResult } from './get-authorization-from-authorization-result';\nimport { useFetchAuthorization } from './use-fetch-authorization';\nimport { useInvalidateAuthorizations } from './use-invalidate-authorizations';\nimport { usePersistAuthorization } from './use-persist-authorization';\n\nexport type Account = Readonly<{\n address: Base64EncodedAddress;\n icon?: WalletIcon;\n label?: string;\n publicKey: PublicKey;\n}>;\n\nexport type WalletAuthorization = Readonly<{\n accounts: Account[];\n authToken: AuthToken;\n selectedAccount: Account;\n}>;\n\nexport function useAuthorization({ chain, identity }: { chain: Chain; identity: AppIdentity }) {\n const fetchQuery = useFetchAuthorization();\n const invalidateAuthorizations = useInvalidateAuthorizations();\n const persistMutation = usePersistAuthorization();\n\n const handleAuthorizationResult = useCallback(\n async (authorizationResult: AuthorizationResult): Promise<WalletAuthorization> => {\n const nextAuthorization = getAuthorizationFromAuthorizationResult(\n authorizationResult,\n fetchQuery.data?.selectedAccount,\n );\n await persistMutation.mutateAsync(nextAuthorization);\n return nextAuthorization;\n },\n [fetchQuery.data?.selectedAccount, persistMutation],\n );\n\n const authorizeSession = useCallback(\n async (wallet: AuthorizeAPI) => {\n try {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n } catch (error) {\n if (\n error instanceof SolanaMobileWalletAdapterProtocolError &&\n error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED\n ) {\n const retryResult = await wallet.authorize({\n chain,\n identity,\n });\n return (await handleAuthorizationResult(retryResult)).selectedAccount;\n }\n throw error;\n }\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const authorizeSessionWithSignIn = useCallback(\n async (wallet: AuthorizeAPI, signInPayload: SignInPayload) => {\n try {\n const authorizationResult = await wallet.authorize({\n auth_token: fetchQuery.data?.authToken,\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(authorizationResult)).selectedAccount;\n } catch (error) {\n if (\n error instanceof SolanaMobileWalletAdapterProtocolError &&\n error.code === SolanaMobileWalletAdapterProtocolErrorCode.ERROR_AUTHORIZATION_FAILED\n ) {\n const retryResult = await wallet.authorize({\n chain,\n identity,\n sign_in_payload: signInPayload,\n });\n return (await handleAuthorizationResult(retryResult)).selectedAccount;\n }\n throw error;\n }\n },\n [fetchQuery.data?.authToken, chain, identity, handleAuthorizationResult],\n );\n\n const deauthorizeSession = useCallback(\n async (wallet: DeauthorizeAPI) => {\n if (fetchQuery.data?.authToken == null) {\n return;\n }\n await wallet.deauthorize({ auth_token: fetchQuery.data.authToken });\n await persistMutation.mutateAsync(null);\n },\n [fetchQuery.data?.authToken, persistMutation],\n );\n\n const deauthorizeSessions = useCallback(async () => {\n await invalidateAuthorizations();\n await persistMutation.mutateAsync(null);\n }, [invalidateAuthorizations, persistMutation]);\n\n return useMemo(\n () => ({\n accounts: fetchQuery.data?.accounts ?? null,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading: fetchQuery.isLoading,\n selectedAccount: fetchQuery.data?.selectedAccount ?? null,\n }),\n [\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n fetchQuery.data?.accounts,\n fetchQuery.data?.selectedAccount,\n fetchQuery.isLoading,\n ],\n );\n}\n","import { Transaction, TransactionSignature, VersionedTransaction } from '@solana/web3.js';\nimport { AuthorizeAPI, SignInPayload } from '@solana-mobile/mobile-wallet-adapter-protocol';\nimport { transact } from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';\nimport { useCallback, useContext, useMemo } from 'react';\n\nimport { MobileWalletProviderContext } from './mobile-wallet-provider';\nimport { Account, useAuthorization } from './use-authorization';\n\nexport function useMobileWallet() {\n const ctx = useContext(MobileWalletProviderContext);\n const { authorizeSessionWithSignIn, authorizeSession, deauthorizeSessions, selectedAccount, ...authorization } =\n useAuthorization(ctx);\n\n const connect = useCallback(\n async (): Promise<Account> => await transact(async wallet => await authorizeSession(wallet)),\n [authorizeSession],\n );\n\n const connectAnd = useCallback(\n async (cb: (wallet: AuthorizeAPI) => Promise<Account | void>): Promise<Account | void> => {\n return await transact(async wallet => await cb(wallet));\n },\n [],\n );\n\n const signIn = useCallback(\n async (signInPayload: SignInPayload): Promise<Account> =>\n await transact(async wallet => await authorizeSessionWithSignIn(wallet, signInPayload)),\n [authorizeSessionWithSignIn],\n );\n\n const disconnect = useCallback(async (): Promise<void> => await deauthorizeSessions(), [deauthorizeSessions]);\n\n const signAndSendTransaction = useCallback(\n async (\n transaction: Transaction | VersionedTransaction,\n minContextSlot: number,\n ): Promise<TransactionSignature> =>\n await transact(async wallet => {\n await authorizeSession(wallet);\n const signatures = await wallet.signAndSendTransactions({\n minContextSlot,\n transactions: [transaction],\n });\n return signatures[0];\n }),\n [authorizeSession],\n );\n\n const signMessage = useCallback(\n async (message: Uint8Array): Promise<Uint8Array> =>\n await transact(async wallet => {\n const authResult = await authorizeSession(wallet);\n const signedMessages = await wallet.signMessages({\n addresses: [authResult.address],\n payloads: [message],\n });\n return signedMessages[0];\n }),\n [authorizeSession],\n );\n\n return useMemo(\n () => ({\n ...ctx,\n ...authorization,\n account: selectedAccount,\n connect,\n connectAnd,\n disconnect,\n signAndSendTransaction,\n signIn,\n signMessage,\n }),\n [\n authorization,\n connect,\n connectAnd,\n ctx,\n disconnect,\n selectedAccount,\n signAndSendTransaction,\n signIn,\n signMessage,\n ],\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"use-authorization.d.ts","sourceRoot":"","sources":["../../src/use-authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACH,WAAW,EAEX,YAAY,EACZ,SAAS,EACT,oBAAoB,EACpB,KAAK,EACL,cAAc,EACd,aAAa,EAChB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAQnD,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC;IAC3B,OAAO,EAAE,oBAAoB,CAAC;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;CACxB,CAAC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACvC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;CAC5B,CAAC,CAAC;AAEH,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE;;iBAZhF,oBAAoB;eACtB,UAAU;gBACT,MAAM;mBACH,SAAS;;+BA2BD,YAAY;iBA9BtB,oBAAoB;eACtB,UAAU;gBACT,MAAM;mBACH,SAAS;;yCAuCD,YAAY,iBAAiB,aAAa;iBA1CpD,oBAAoB;eACtB,UAAU;gBACT,MAAM;mBACH,SAAS;;iCAoDD,cAAc;;;;iBAvDxB,oBAAoB;eACtB,UAAU;gBACT,MAAM;mBACH,SAAS;;EAuFvB"}
1
+ {"version":3,"file":"use-authorization.d.ts","sourceRoot":"","sources":["../../src/use-authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACH,WAAW,EAEX,YAAY,EACZ,SAAS,EACT,oBAAoB,EACpB,KAAK,EACL,cAAc,EACd,aAAa,EAGhB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAQnD,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC;IAC3B,OAAO,EAAE,oBAAoB,CAAC;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;CACxB,CAAC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACvC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;CAC5B,CAAC,CAAC;AAEH,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE;;iBAZhF,oBAAoB;eACtB,UAAU;gBACT,MAAM;mBACH,SAAS;;+BA2BD,YAAY;iBA9BtB,oBAAoB;eACtB,UAAU;gBACT,MAAM;mBACH,SAAS;;yCAqDD,YAAY,iBAAiB,aAAa;iBAxDpD,oBAAoB;eACtB,UAAU;gBACT,MAAM;mBACH,SAAS;;iCAiFD,cAAc;;;;iBApFxB,oBAAoB;eACtB,UAAU;gBACT,MAAM;mBACH,SAAS;;EAoHvB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wallet-ui/react-native-web3js",
3
- "version": "2.2.0-canary-20251217104857",
3
+ "version": "2.2.0-canary-20251217182030",
4
4
  "description": "React components for Wallet UI",
5
5
  "exports": {
6
6
  ".": {
@@ -67,7 +67,7 @@
67
67
  "@wallet-standard/core": "1.1.1",
68
68
  "@wallet-standard/react": "1.0.1",
69
69
  "js-base64": "^3.7.8",
70
- "@wallet-ui/core": "2.2.0-canary-20251217104857"
70
+ "@wallet-ui/core": "2.2.0-canary-20251217182030"
71
71
  },
72
72
  "peerDependencies": {
73
73
  "@solana/signers": "2.3.0",