@wallet-ui/react-native-web3js 2.2.1 → 2.2.2-canary-20260119215049
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.
- package/dist/index.browser.cjs +50 -45
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.mjs +50 -45
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.native.mjs +50 -45
- package/dist/index.native.mjs.map +1 -1
- package/dist/index.node.cjs +50 -45
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +50 -45
- package/dist/index.node.mjs.map +1 -1
- package/dist/types/use-authorization-storage.d.ts +19 -0
- package/dist/types/use-authorization-storage.d.ts.map +1 -0
- package/dist/types/use-authorization.d.ts +1 -1
- package/dist/types/use-authorization.d.ts.map +1 -1
- package/dist/types/use-fetch-authorization.d.ts +4 -1
- package/dist/types/use-fetch-authorization.d.ts.map +1 -1
- package/dist/types/use-mobile-wallet.d.ts +1 -1
- package/dist/types/use-persist-authorization.d.ts +4 -1
- package/dist/types/use-persist-authorization.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/types/use-invalidate-authorizations.d.ts +0 -2
- package/dist/types/use-invalidate-authorizations.d.ts.map +0 -1
- package/dist/types/use-query-config.d.ts +0 -6
- package/dist/types/use-query-config.d.ts.map +0 -1
package/dist/index.browser.cjs
CHANGED
|
@@ -4,8 +4,8 @@ var web3_js = require('@solana/web3.js');
|
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var mobileWalletAdapterProtocol = require('@solana-mobile/mobile-wallet-adapter-protocol');
|
|
6
6
|
var jsBase64 = require('js-base64');
|
|
7
|
-
var AsyncStorage = require('@react-native-async-storage/async-storage');
|
|
8
7
|
var reactQuery = require('@tanstack/react-query');
|
|
8
|
+
var AsyncStorage = require('@react-native-async-storage/async-storage');
|
|
9
9
|
var mobileWalletAdapterProtocolWeb3js = require('@solana-mobile/mobile-wallet-adapter-protocol-web3js');
|
|
10
10
|
var core = require('@wallet-ui/core');
|
|
11
11
|
|
|
@@ -78,14 +78,6 @@ function getAuthorizationFromAuthorizationResult(authorizationResult, previously
|
|
|
78
78
|
selectedAccount
|
|
79
79
|
};
|
|
80
80
|
}
|
|
81
|
-
function useQueryConfig() {
|
|
82
|
-
const storageKey = "authorization-cache";
|
|
83
|
-
const queryClient = reactQuery.useQueryClient();
|
|
84
|
-
const queryKey = ["wallet-authorization"];
|
|
85
|
-
return { queryClient, queryKey, storageKey };
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// src/use-fetch-authorization.ts
|
|
89
81
|
function cacheReviver(key, value) {
|
|
90
82
|
if (key === "publicKey") {
|
|
91
83
|
return new web3_js.PublicKey(value);
|
|
@@ -93,8 +85,7 @@ function cacheReviver(key, value) {
|
|
|
93
85
|
return value;
|
|
94
86
|
}
|
|
95
87
|
}
|
|
96
|
-
function useFetchAuthorization() {
|
|
97
|
-
const { queryKey, storageKey } = useQueryConfig();
|
|
88
|
+
function useFetchAuthorization({ queryKey, storageKey }) {
|
|
98
89
|
return reactQuery.useQuery({
|
|
99
90
|
queryFn: async () => {
|
|
100
91
|
const cacheFetchResult = await AsyncStorage__default.default.getItem(storageKey);
|
|
@@ -103,14 +94,8 @@ function useFetchAuthorization() {
|
|
|
103
94
|
queryKey
|
|
104
95
|
});
|
|
105
96
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
function useInvalidateAuthorizations() {
|
|
109
|
-
const { queryClient, queryKey } = useQueryConfig();
|
|
110
|
-
return () => queryClient.invalidateQueries({ queryKey });
|
|
111
|
-
}
|
|
112
|
-
function usePersistAuthorization() {
|
|
113
|
-
const { queryClient, queryKey, storageKey } = useQueryConfig();
|
|
97
|
+
function usePersistAuthorization({ queryKey, storageKey }) {
|
|
98
|
+
const queryClient = reactQuery.useQueryClient();
|
|
114
99
|
return reactQuery.useMutation({
|
|
115
100
|
mutationFn: async (auth) => {
|
|
116
101
|
await AsyncStorage__default.default.setItem(storageKey, JSON.stringify(auth));
|
|
@@ -121,27 +106,48 @@ function usePersistAuthorization() {
|
|
|
121
106
|
});
|
|
122
107
|
}
|
|
123
108
|
|
|
109
|
+
// src/use-authorization-storage.ts
|
|
110
|
+
function useAuthorizationStorage() {
|
|
111
|
+
const queryKey = ["wallet-authorization"];
|
|
112
|
+
const storageKey = "authorization-cache";
|
|
113
|
+
const queryClient = reactQuery.useQueryClient();
|
|
114
|
+
const fetchQuery = useFetchAuthorization({ queryKey, storageKey });
|
|
115
|
+
const persistMutation = usePersistAuthorization({ queryKey, storageKey });
|
|
116
|
+
async function persist(next, invalidate = false) {
|
|
117
|
+
await persistMutation.mutateAsync(next);
|
|
118
|
+
if (invalidate) {
|
|
119
|
+
await queryClient.invalidateQueries({ queryKey });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const accounts = fetchQuery.data?.accounts ?? null;
|
|
123
|
+
const authToken = fetchQuery.data?.authToken ?? void 0;
|
|
124
|
+
const isLoading = fetchQuery.isLoading;
|
|
125
|
+
const selectedAccount = fetchQuery.data?.selectedAccount ?? void 0;
|
|
126
|
+
return {
|
|
127
|
+
accounts,
|
|
128
|
+
authToken,
|
|
129
|
+
isLoading,
|
|
130
|
+
persist,
|
|
131
|
+
selectedAccount
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
124
135
|
// src/use-authorization.ts
|
|
125
136
|
function useAuthorization({ chain, identity }) {
|
|
126
|
-
const
|
|
127
|
-
const invalidateAuthorizations = useInvalidateAuthorizations();
|
|
128
|
-
const persistMutation = usePersistAuthorization();
|
|
137
|
+
const { accounts, authToken, isLoading, persist, selectedAccount } = useAuthorizationStorage();
|
|
129
138
|
const handleAuthorizationResult = React.useCallback(
|
|
130
139
|
async (authorizationResult) => {
|
|
131
|
-
const nextAuthorization = getAuthorizationFromAuthorizationResult(
|
|
132
|
-
|
|
133
|
-
fetchQuery.data?.selectedAccount
|
|
134
|
-
);
|
|
135
|
-
await persistMutation.mutateAsync(nextAuthorization);
|
|
140
|
+
const nextAuthorization = getAuthorizationFromAuthorizationResult(authorizationResult, selectedAccount);
|
|
141
|
+
await persist(nextAuthorization);
|
|
136
142
|
return nextAuthorization;
|
|
137
143
|
},
|
|
138
|
-
[
|
|
144
|
+
[selectedAccount, persist]
|
|
139
145
|
);
|
|
140
146
|
const authorizeSession = React.useCallback(
|
|
141
147
|
async (wallet) => {
|
|
142
148
|
try {
|
|
143
149
|
const authorizationResult = await wallet.authorize({
|
|
144
|
-
auth_token:
|
|
150
|
+
auth_token: authToken,
|
|
145
151
|
chain,
|
|
146
152
|
identity
|
|
147
153
|
});
|
|
@@ -157,13 +163,13 @@ function useAuthorization({ chain, identity }) {
|
|
|
157
163
|
throw error;
|
|
158
164
|
}
|
|
159
165
|
},
|
|
160
|
-
[
|
|
166
|
+
[authToken, chain, identity, handleAuthorizationResult]
|
|
161
167
|
);
|
|
162
168
|
const authorizeSessionWithSignIn = React.useCallback(
|
|
163
169
|
async (wallet, signInPayload) => {
|
|
164
170
|
try {
|
|
165
171
|
const authorizationResult = await wallet.authorize({
|
|
166
|
-
auth_token:
|
|
172
|
+
auth_token: authToken,
|
|
167
173
|
chain,
|
|
168
174
|
identity,
|
|
169
175
|
sign_in_payload: signInPayload
|
|
@@ -181,40 +187,39 @@ function useAuthorization({ chain, identity }) {
|
|
|
181
187
|
throw error;
|
|
182
188
|
}
|
|
183
189
|
},
|
|
184
|
-
[
|
|
190
|
+
[authToken, chain, identity, handleAuthorizationResult]
|
|
185
191
|
);
|
|
186
192
|
const deauthorizeSession = React.useCallback(
|
|
187
193
|
async (wallet) => {
|
|
188
|
-
if (
|
|
194
|
+
if (authToken == null) {
|
|
189
195
|
return;
|
|
190
196
|
}
|
|
191
|
-
await wallet.deauthorize({ auth_token:
|
|
192
|
-
await
|
|
197
|
+
await wallet.deauthorize({ auth_token: authToken });
|
|
198
|
+
await persist(null);
|
|
193
199
|
},
|
|
194
|
-
[
|
|
200
|
+
[authToken, persist]
|
|
195
201
|
);
|
|
196
202
|
const deauthorizeSessions = React.useCallback(async () => {
|
|
197
|
-
await
|
|
198
|
-
|
|
199
|
-
}, [invalidateAuthorizations, persistMutation]);
|
|
203
|
+
await persist(null, true);
|
|
204
|
+
}, [persist]);
|
|
200
205
|
return React.useMemo(
|
|
201
206
|
() => ({
|
|
202
|
-
accounts
|
|
207
|
+
accounts,
|
|
203
208
|
authorizeSession,
|
|
204
209
|
authorizeSessionWithSignIn,
|
|
205
210
|
deauthorizeSession,
|
|
206
211
|
deauthorizeSessions,
|
|
207
|
-
isLoading
|
|
208
|
-
selectedAccount
|
|
212
|
+
isLoading,
|
|
213
|
+
selectedAccount
|
|
209
214
|
}),
|
|
210
215
|
[
|
|
216
|
+
accounts,
|
|
211
217
|
authorizeSession,
|
|
212
218
|
authorizeSessionWithSignIn,
|
|
213
219
|
deauthorizeSession,
|
|
214
220
|
deauthorizeSessions,
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
fetchQuery.isLoading
|
|
221
|
+
isLoading,
|
|
222
|
+
selectedAccount
|
|
218
223
|
]
|
|
219
224
|
);
|
|
220
225
|
}
|
|
@@ -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","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
|
+
{"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-fetch-authorization.ts","../src/use-persist-authorization.ts","../src/use-authorization-storage.ts","../src/use-authorization.ts","../src/use-mobile-wallet.ts"],"names":["createContext","useMemo","Connection","React","toUint8Array","PublicKey","useQuery","AsyncStorage","useQueryClient","useMutation","useCallback","SolanaMobileWalletAdapterProtocolError","SolanaMobileWalletAdapterProtocolErrorCode","useContext","transact"],"mappings":";;;;;;;;;;;;;;;;;AAiBO,IAAM,2BAAA,GAA8BA,mBAAA,CAAyC,EAA+B;AAC5G,SAAS,oBAAA,CAAqB;AAAA,EACjC,QAAA;AAAA,EACA,KAAA;AAAA,EACA,kBAAA,GAAqB,EAAE,UAAA,EAAY,WAAA,EAAY;AAAA,EAC/C,QAAA;AAAA,EACA;AACJ,CAAA,EAA8B;AAC1B,EAAA,MAAM,UAAA,GAAaC,aAAA,CAAQ,MAAM,IAAIC,kBAAA,CAAW,QAAA,EAAU,kBAAkB,CAAA,EAAG,CAAC,kBAAA,EAAoB,QAAQ,CAAC,CAAA;AAE7G,EAAA,uBACIC,sBAAA,CAAA,aAAA;AAAA,IAAC,2BAAA,CAA4B,QAAA;AAAA,IAA5B;AAAA,MACG,KAAA,EAAOF,aAAA;AAAA,QACH,OAAO;AAAA,UACH,KAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACJ,CAAA;AAAA,QACA,CAAC,UAAA,EAAY,QAAA,EAAU,KAAK;AAAA;AAChC,KAAA;AAAA,IAEC;AAAA,GACL;AAER;ACrCO,SAAS,wBAAwB,OAAA,EAA0C;AAC9E,EAAA,MAAM,kBAAA,GAAqBG,sBAAa,OAAO,CAAA;AAE/C,EAAA,OAAO,IAAIC,kBAAU,kBAAkB,CAAA;AAC3C;;;ACHA,SAAS,UAAU,GAAA,GAAM,EAAA,EAAI,GAAA,GAAM,CAAA,EAAG,YAAY,IAAA,EAAM;AACpD,EAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,CAAA,GAAI,SAAA,CAAU,MAAA;AAElC,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,SAAA,GAAY,GAAA,CAAI,KAAA,CAAM,CAAC,GAAG,CAAA,GAAI,GAAA;AAClF;AAEO,SAAS,gCAAgC,OAAA,EAAqC;AACjF,EAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,OAAA,CAAQ,OAAO,CAAA;AAEzD,EAAA,OAAO;AAAA,IACH,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAO,OAAA,CAAQ,KAAA,IAAS,UAAU,SAAA,CAAU,QAAA,IAAY,CAAC,CAAA;AAAA,IACzD;AAAA,GACJ;AACJ;;;ACfO,SAAS,uCAAA,CACZ,qBACA,yBAAA,EACmB;AACnB,EAAA,IAAI,eAAA;AACJ,EAAA;AAAA;AAAA,IAEI,yBAAA,IAA6B,IAAA;AAAA,IAE7B,CAAC,mBAAA,CAAoB,QAAA,CAAS,IAAA,CAAK,CAAC,EAAE,OAAA,EAAQ,KAAM,OAAA,KAAY,yBAAA,CAA0B,OAAO;AAAA,IACnG;AACE,IAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,QAAA,CAAS,CAAC,CAAA;AACnD,IAAA,eAAA,GAAkB,gCAAgC,YAAY,CAAA;AAAA,EAClE,CAAA,MAAO;AACH,IAAA,eAAA,GAAkB,yBAAA;AAAA,EACtB;AACA,EAAA,OAAO;AAAA,IACH,QAAA,EAAU,mBAAA,CAAoB,QAAA,CAAS,GAAA,CAAI,+BAA+B,CAAA;AAAA,IAC1E,WAAW,mBAAA,CAAoB,UAAA;AAAA,IAC/B;AAAA,GACJ;AACJ;ACpBA,SAAS,YAAA,CAAa,KAAa,KAAA,EAAgB;AAC/C,EAAA,IAAI,QAAQ,WAAA,EAAa;AACrB,IAAA,OAAO,IAAIA,kBAAU,KAA0B,CAAA;AAAA,EACnD,CAAA,MAAO;AACH,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AAEO,SAAS,qBAAA,CAAsB,EAAE,QAAA,EAAU,UAAA,EAAW,EAA+C;AACxG,EAAA,OAAOC,mBAAA,CAAS;AAAA,IACZ,SAAS,YAAiD;AACtD,MAAA,MAAM,gBAAA,GAAmB,MAAMC,6BAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AAG9D,MAAA,OAAO,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,gBAAA,EAAkB,YAAY,CAAA,GAAI,IAAA;AAAA,IAC3E,CAAA;AAAA,IACA;AAAA,GACH,CAAA;AACL;ACnBO,SAAS,uBAAA,CAAwB,EAAE,QAAA,EAAU,UAAA,EAAW,EAA+C;AAC1G,EAAA,MAAM,cAAcC,yBAAA,EAAe;AACnC,EAAA,OAAOC,sBAAA,CAAY;AAAA,IACf,UAAA,EAAY,OAAO,IAAA,KAAoD;AACnE,MAAA,MAAMF,8BAAa,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IAC/D,CAAA;AAAA,IACA,WAAW,YAAY;AACnB,MAAA,MAAM,WAAA,CAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,CAAA;AAAA,IACpD;AAAA,GACH,CAAA;AACL;;;ACTO,SAAS,uBAAA,GAA0B;AACtC,EAAA,MAAM,QAAA,GAAW,CAAC,sBAAsB,CAAA;AACxC,EAAA,MAAM,UAAA,GAAa,qBAAA;AACnB,EAAA,MAAM,cAAcC,yBAAAA,EAAe;AACnC,EAAA,MAAM,UAAA,GAAa,qBAAA,CAAsB,EAAE,QAAA,EAAU,YAAY,CAAA;AACjE,EAAA,MAAM,eAAA,GAAkB,uBAAA,CAAwB,EAAE,QAAA,EAAU,YAAY,CAAA;AAExE,EAAA,eAAe,OAAA,CAAQ,IAAA,EAAkC,UAAA,GAAa,KAAA,EAAO;AACzE,IAAA,MAAM,eAAA,CAAgB,YAAY,IAAI,CAAA;AACtC,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,MAAM,WAAA,CAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,CAAA;AAAA,IACpD;AAAA,EACJ;AAEA,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,IAAA,EAAM,QAAA,IAAY,IAAA;AAC9C,EAAA,MAAM,SAAA,GAAgC,UAAA,CAAW,IAAA,EAAM,SAAA,IAAa,MAAA;AACpE,EAAA,MAAM,YAAY,UAAA,CAAW,SAAA;AAC7B,EAAA,MAAM,eAAA,GAAuC,UAAA,CAAW,IAAA,EAAM,eAAA,IAAmB,MAAA;AAEjF,EAAA,OAAO;AAAA,IACH,QAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACJ;AACJ;;;ACAO,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAO,QAAA,EAAS,EAA4C;AAC3F,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,WAAW,OAAA,EAAS,eAAA,KAAoB,uBAAA,EAAwB;AAE7F,EAAA,MAAM,yBAAA,GAA4BE,iBAAA;AAAA,IAC9B,OAAO,mBAAA,KAA2E;AAC9E,MAAA,MAAM,iBAAA,GAAoB,uCAAA,CAAwC,mBAAA,EAAqB,eAAe,CAAA;AACtG,MAAA,MAAM,QAAQ,iBAAiB,CAAA;AAC/B,MAAA,OAAO,iBAAA;AAAA,IACX,CAAA;AAAA,IACA,CAAC,iBAAiB,OAAO;AAAA,GAC7B;AAEA,EAAA,MAAM,gBAAA,GAAmBA,iBAAA;AAAA,IACrB,OAAO,MAAA,KAAyB;AAC5B,MAAA,IAAI;AACA,QAAA,MAAM,mBAAA,GAAsB,MAAM,MAAA,CAAO,SAAA,CAAU;AAAA,UAC/C,UAAA,EAAY,SAAA;AAAA,UACZ,KAAA;AAAA,UACA;AAAA,SACH,CAAA;AACD,QAAA,OAAA,CAAQ,MAAM,yBAAA,CAA0B,mBAAmB,CAAA,EAAG,eAAA;AAAA,MAClE,SAAS,KAAA,EAAO;AACZ,QAAA,IACI,KAAA,YAAiBC,kEAAA,IACjB,KAAA,CAAM,IAAA,KAASC,uEAA2C,0BAAA,EAC5D;AACE,UAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,SAAA,CAAU;AAAA,YACvC,KAAA;AAAA,YACA;AAAA,WACH,CAAA;AACD,UAAA,OAAA,CAAQ,MAAM,yBAAA,CAA0B,WAAW,CAAA,EAAG,eAAA;AAAA,QAC1D;AACA,QAAA,MAAM,KAAA;AAAA,MACV;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,KAAA,EAAO,QAAA,EAAU,yBAAyB;AAAA,GAC1D;AAEA,EAAA,MAAM,0BAAA,GAA6BF,iBAAA;AAAA,IAC/B,OAAO,QAAsB,aAAA,KAAiC;AAC1D,MAAA,IAAI;AACA,QAAA,MAAM,mBAAA,GAAsB,MAAM,MAAA,CAAO,SAAA,CAAU;AAAA,UAC/C,UAAA,EAAY,SAAA;AAAA,UACZ,KAAA;AAAA,UACA,QAAA;AAAA,UACA,eAAA,EAAiB;AAAA,SACpB,CAAA;AACD,QAAA,OAAA,CAAQ,MAAM,yBAAA,CAA0B,mBAAmB,CAAA,EAAG,eAAA;AAAA,MAClE,SAAS,KAAA,EAAO;AACZ,QAAA,IACI,KAAA,YAAiBC,kEAAA,IACjB,KAAA,CAAM,IAAA,KAASC,uEAA2C,0BAAA,EAC5D;AACE,UAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,SAAA,CAAU;AAAA,YACvC,KAAA;AAAA,YACA,QAAA;AAAA,YACA,eAAA,EAAiB;AAAA,WACpB,CAAA;AACD,UAAA,OAAA,CAAQ,MAAM,yBAAA,CAA0B,WAAW,CAAA,EAAG,eAAA;AAAA,QAC1D;AACA,QAAA,MAAM,KAAA;AAAA,MACV;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,KAAA,EAAO,QAAA,EAAU,yBAAyB;AAAA,GAC1D;AAEA,EAAA,MAAM,kBAAA,GAAqBF,iBAAA;AAAA,IACvB,OAAO,MAAA,KAA2B;AAC9B,MAAA,IAAI,aAAa,IAAA,EAAM;AACnB,QAAA;AAAA,MACJ;AACA,MAAA,MAAM,MAAA,CAAO,WAAA,CAAY,EAAE,UAAA,EAAY,WAAW,CAAA;AAClD,MAAA,MAAM,QAAQ,IAAI,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,WAAW,OAAO;AAAA,GACvB;AAEA,EAAA,MAAM,mBAAA,GAAsBA,kBAAY,YAAY;AAChD,IAAA,MAAM,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAOT,aAAAA;AAAA,IACH,OAAO;AAAA,MACH,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,0BAAA;AAAA,MACA,kBAAA;AAAA,MACA,mBAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACJ,CAAA;AAAA,IACA;AAAA,MACI,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,0BAAA;AAAA,MACA,kBAAA;AAAA,MACA,mBAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AACJ,GACJ;AACJ;AC7HO,SAAS,eAAA,GAAkB;AAC9B,EAAA,MAAM,GAAA,GAAMY,iBAAW,2BAA2B,CAAA;AAClD,EAAA,MAAM,EAAE,4BAA4B,gBAAA,EAAkB,mBAAA,EAAqB,iBAAiB,GAAG,aAAA,EAAc,GACzG,gBAAA,CAAiB,GAAG,CAAA;AAExB,EAAA,MAAM,OAAA,GAAUH,iBAAAA;AAAA,IACZ,YAA8B,MAAMI,0CAAA,CAAS,OAAM,WAAU,MAAM,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAAA,IAC3F,CAAC,gBAAgB;AAAA,GACrB;AAEA,EAAA,MAAM,UAAA,GAAaJ,iBAAAA;AAAA,IACf,OAAO,EAAA,KAAmF;AACtF,MAAA,OAAO,MAAMI,0CAAA,CAAS,OAAM,WAAU,MAAM,EAAA,CAAG,MAAM,CAAC,CAAA;AAAA,IAC1D,CAAA;AAAA,IACA;AAAC,GACL;AAEA,EAAA,MAAM,MAAA,GAASJ,iBAAAA;AAAA,IACX,OAAO,aAAA,KACH,MAAMI,0CAAA,CAAS,OAAM,WAAU,MAAM,0BAAA,CAA2B,MAAA,EAAQ,aAAa,CAAC,CAAA;AAAA,IAC1F,CAAC,0BAA0B;AAAA,GAC/B;AAEA,EAAA,MAAM,UAAA,GAAaJ,kBAAY,YAA2B,MAAM,qBAAoB,EAAG,CAAC,mBAAmB,CAAC,CAAA;AAE5G,EAAA,MAAM,sBAAA,GAAyBA,iBAAAA;AAAA,IAC3B,OACI,WAAA,EACA,cAAA,KAEA,MAAMI,0CAAA,CAAS,OAAM,MAAA,KAAU;AAC3B,MAAA,MAAM,iBAAiB,MAAM,CAAA;AAC7B,MAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,uBAAA,CAAwB;AAAA,QACpD,cAAA;AAAA,QACA,YAAA,EAAc,CAAC,WAAW;AAAA,OAC7B,CAAA;AACD,MAAA,OAAO,WAAW,CAAC,CAAA;AAAA,IACvB,CAAC,CAAA;AAAA,IACL,CAAC,gBAAgB;AAAA,GACrB;AAEA,EAAA,MAAM,WAAA,GAAcJ,iBAAAA;AAAA,IAChB,OAAO,OAAA,KACH,MAAMI,0CAAA,CAAS,OAAM,MAAA,KAAU;AAC3B,MAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,CAAiB,MAAM,CAAA;AAChD,MAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,YAAA,CAAa;AAAA,QAC7C,SAAA,EAAW,CAAC,UAAA,CAAW,OAAO,CAAA;AAAA,QAC9B,QAAA,EAAU,CAAC,OAAO;AAAA,OACrB,CAAA;AACD,MAAA,OAAO,eAAe,CAAC,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,IACL,CAAC,gBAAgB;AAAA,GACrB;AAEA,EAAA,OAAOb,aAAAA;AAAA,IACH,OAAO;AAAA,MACH,GAAG,GAAA;AAAA,MACH,GAAG,aAAA;AAAA,MACH,OAAA,EAAS,eAAA;AAAA,MACT,OAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,sBAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACJ,CAAA;AAAA,IACA;AAAA,MACI,aAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,GAAA;AAAA,MACA,UAAA;AAAA,MACA,eAAA;AAAA,MACA,sBAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA;AACJ,GACJ;AACJ","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 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';\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({ queryKey, storageKey }: { queryKey: string[]; storageKey: string }) {\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 AsyncStorage from '@react-native-async-storage/async-storage';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\n\nexport function usePersistAuthorization({ queryKey, storageKey }: { queryKey: string[]; storageKey: string }) {\n const queryClient = useQueryClient();\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 { useQueryClient } from '@tanstack/react-query';\n\nimport { Account, WalletAuthorization } from './use-authorization';\nimport { useFetchAuthorization } from './use-fetch-authorization';\nimport { usePersistAuthorization } from './use-persist-authorization';\n\nexport function useAuthorizationStorage() {\n const queryKey = ['wallet-authorization'];\n const storageKey = 'authorization-cache';\n const queryClient = useQueryClient();\n const fetchQuery = useFetchAuthorization({ queryKey, storageKey });\n const persistMutation = usePersistAuthorization({ queryKey, storageKey });\n\n async function persist(next: WalletAuthorization | null, invalidate = false) {\n await persistMutation.mutateAsync(next);\n if (invalidate) {\n await queryClient.invalidateQueries({ queryKey });\n }\n }\n\n const accounts = fetchQuery.data?.accounts ?? null;\n const authToken: string | undefined = fetchQuery.data?.authToken ?? undefined;\n const isLoading = fetchQuery.isLoading;\n const selectedAccount: Account | undefined = fetchQuery.data?.selectedAccount ?? undefined;\n\n return {\n accounts,\n authToken,\n isLoading,\n persist,\n selectedAccount,\n } as const;\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 { useAuthorizationStorage } from './use-authorization-storage';\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 { accounts, authToken, isLoading, persist, selectedAccount } = useAuthorizationStorage();\n\n const handleAuthorizationResult = useCallback(\n async (authorizationResult: AuthorizationResult): Promise<WalletAuthorization> => {\n const nextAuthorization = getAuthorizationFromAuthorizationResult(authorizationResult, selectedAccount);\n await persist(nextAuthorization);\n return nextAuthorization;\n },\n [selectedAccount, persist],\n );\n\n const authorizeSession = useCallback(\n async (wallet: AuthorizeAPI) => {\n try {\n const authorizationResult = await wallet.authorize({\n auth_token: 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 [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: 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 [authToken, chain, identity, handleAuthorizationResult],\n );\n\n const deauthorizeSession = useCallback(\n async (wallet: DeauthorizeAPI) => {\n if (authToken == null) {\n return;\n }\n await wallet.deauthorize({ auth_token: authToken });\n await persist(null);\n },\n [authToken, persist],\n );\n\n const deauthorizeSessions = useCallback(async () => {\n await persist(null, true);\n }, [persist]);\n\n return useMemo(\n () => ({\n accounts,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading,\n selectedAccount,\n }),\n [\n accounts,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading,\n selectedAccount,\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"]}
|
package/dist/index.browser.mjs
CHANGED
|
@@ -3,8 +3,8 @@ import React, { createContext, useMemo, useCallback, useContext } from 'react';
|
|
|
3
3
|
import { SolanaMobileWalletAdapterProtocolError, SolanaMobileWalletAdapterProtocolErrorCode } from '@solana-mobile/mobile-wallet-adapter-protocol';
|
|
4
4
|
import { toUint8Array } from 'js-base64';
|
|
5
5
|
export { fromUint8Array, toUint8Array } from 'js-base64';
|
|
6
|
+
import { useQueryClient, useQuery, useMutation } from '@tanstack/react-query';
|
|
6
7
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
7
|
-
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
8
8
|
import { transact } from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';
|
|
9
9
|
export * from '@solana-mobile/mobile-wallet-adapter-protocol-web3js';
|
|
10
10
|
export * from '@wallet-ui/core';
|
|
@@ -73,14 +73,6 @@ function getAuthorizationFromAuthorizationResult(authorizationResult, previously
|
|
|
73
73
|
selectedAccount
|
|
74
74
|
};
|
|
75
75
|
}
|
|
76
|
-
function useQueryConfig() {
|
|
77
|
-
const storageKey = "authorization-cache";
|
|
78
|
-
const queryClient = useQueryClient();
|
|
79
|
-
const queryKey = ["wallet-authorization"];
|
|
80
|
-
return { queryClient, queryKey, storageKey };
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// src/use-fetch-authorization.ts
|
|
84
76
|
function cacheReviver(key, value) {
|
|
85
77
|
if (key === "publicKey") {
|
|
86
78
|
return new PublicKey(value);
|
|
@@ -88,8 +80,7 @@ function cacheReviver(key, value) {
|
|
|
88
80
|
return value;
|
|
89
81
|
}
|
|
90
82
|
}
|
|
91
|
-
function useFetchAuthorization() {
|
|
92
|
-
const { queryKey, storageKey } = useQueryConfig();
|
|
83
|
+
function useFetchAuthorization({ queryKey, storageKey }) {
|
|
93
84
|
return useQuery({
|
|
94
85
|
queryFn: async () => {
|
|
95
86
|
const cacheFetchResult = await AsyncStorage.getItem(storageKey);
|
|
@@ -98,14 +89,8 @@ function useFetchAuthorization() {
|
|
|
98
89
|
queryKey
|
|
99
90
|
});
|
|
100
91
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
function useInvalidateAuthorizations() {
|
|
104
|
-
const { queryClient, queryKey } = useQueryConfig();
|
|
105
|
-
return () => queryClient.invalidateQueries({ queryKey });
|
|
106
|
-
}
|
|
107
|
-
function usePersistAuthorization() {
|
|
108
|
-
const { queryClient, queryKey, storageKey } = useQueryConfig();
|
|
92
|
+
function usePersistAuthorization({ queryKey, storageKey }) {
|
|
93
|
+
const queryClient = useQueryClient();
|
|
109
94
|
return useMutation({
|
|
110
95
|
mutationFn: async (auth) => {
|
|
111
96
|
await AsyncStorage.setItem(storageKey, JSON.stringify(auth));
|
|
@@ -116,27 +101,48 @@ function usePersistAuthorization() {
|
|
|
116
101
|
});
|
|
117
102
|
}
|
|
118
103
|
|
|
104
|
+
// src/use-authorization-storage.ts
|
|
105
|
+
function useAuthorizationStorage() {
|
|
106
|
+
const queryKey = ["wallet-authorization"];
|
|
107
|
+
const storageKey = "authorization-cache";
|
|
108
|
+
const queryClient = useQueryClient();
|
|
109
|
+
const fetchQuery = useFetchAuthorization({ queryKey, storageKey });
|
|
110
|
+
const persistMutation = usePersistAuthorization({ queryKey, storageKey });
|
|
111
|
+
async function persist(next, invalidate = false) {
|
|
112
|
+
await persistMutation.mutateAsync(next);
|
|
113
|
+
if (invalidate) {
|
|
114
|
+
await queryClient.invalidateQueries({ queryKey });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const accounts = fetchQuery.data?.accounts ?? null;
|
|
118
|
+
const authToken = fetchQuery.data?.authToken ?? void 0;
|
|
119
|
+
const isLoading = fetchQuery.isLoading;
|
|
120
|
+
const selectedAccount = fetchQuery.data?.selectedAccount ?? void 0;
|
|
121
|
+
return {
|
|
122
|
+
accounts,
|
|
123
|
+
authToken,
|
|
124
|
+
isLoading,
|
|
125
|
+
persist,
|
|
126
|
+
selectedAccount
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
119
130
|
// src/use-authorization.ts
|
|
120
131
|
function useAuthorization({ chain, identity }) {
|
|
121
|
-
const
|
|
122
|
-
const invalidateAuthorizations = useInvalidateAuthorizations();
|
|
123
|
-
const persistMutation = usePersistAuthorization();
|
|
132
|
+
const { accounts, authToken, isLoading, persist, selectedAccount } = useAuthorizationStorage();
|
|
124
133
|
const handleAuthorizationResult = useCallback(
|
|
125
134
|
async (authorizationResult) => {
|
|
126
|
-
const nextAuthorization = getAuthorizationFromAuthorizationResult(
|
|
127
|
-
|
|
128
|
-
fetchQuery.data?.selectedAccount
|
|
129
|
-
);
|
|
130
|
-
await persistMutation.mutateAsync(nextAuthorization);
|
|
135
|
+
const nextAuthorization = getAuthorizationFromAuthorizationResult(authorizationResult, selectedAccount);
|
|
136
|
+
await persist(nextAuthorization);
|
|
131
137
|
return nextAuthorization;
|
|
132
138
|
},
|
|
133
|
-
[
|
|
139
|
+
[selectedAccount, persist]
|
|
134
140
|
);
|
|
135
141
|
const authorizeSession = useCallback(
|
|
136
142
|
async (wallet) => {
|
|
137
143
|
try {
|
|
138
144
|
const authorizationResult = await wallet.authorize({
|
|
139
|
-
auth_token:
|
|
145
|
+
auth_token: authToken,
|
|
140
146
|
chain,
|
|
141
147
|
identity
|
|
142
148
|
});
|
|
@@ -152,13 +158,13 @@ function useAuthorization({ chain, identity }) {
|
|
|
152
158
|
throw error;
|
|
153
159
|
}
|
|
154
160
|
},
|
|
155
|
-
[
|
|
161
|
+
[authToken, chain, identity, handleAuthorizationResult]
|
|
156
162
|
);
|
|
157
163
|
const authorizeSessionWithSignIn = useCallback(
|
|
158
164
|
async (wallet, signInPayload) => {
|
|
159
165
|
try {
|
|
160
166
|
const authorizationResult = await wallet.authorize({
|
|
161
|
-
auth_token:
|
|
167
|
+
auth_token: authToken,
|
|
162
168
|
chain,
|
|
163
169
|
identity,
|
|
164
170
|
sign_in_payload: signInPayload
|
|
@@ -176,40 +182,39 @@ function useAuthorization({ chain, identity }) {
|
|
|
176
182
|
throw error;
|
|
177
183
|
}
|
|
178
184
|
},
|
|
179
|
-
[
|
|
185
|
+
[authToken, chain, identity, handleAuthorizationResult]
|
|
180
186
|
);
|
|
181
187
|
const deauthorizeSession = useCallback(
|
|
182
188
|
async (wallet) => {
|
|
183
|
-
if (
|
|
189
|
+
if (authToken == null) {
|
|
184
190
|
return;
|
|
185
191
|
}
|
|
186
|
-
await wallet.deauthorize({ auth_token:
|
|
187
|
-
await
|
|
192
|
+
await wallet.deauthorize({ auth_token: authToken });
|
|
193
|
+
await persist(null);
|
|
188
194
|
},
|
|
189
|
-
[
|
|
195
|
+
[authToken, persist]
|
|
190
196
|
);
|
|
191
197
|
const deauthorizeSessions = useCallback(async () => {
|
|
192
|
-
await
|
|
193
|
-
|
|
194
|
-
}, [invalidateAuthorizations, persistMutation]);
|
|
198
|
+
await persist(null, true);
|
|
199
|
+
}, [persist]);
|
|
195
200
|
return useMemo(
|
|
196
201
|
() => ({
|
|
197
|
-
accounts
|
|
202
|
+
accounts,
|
|
198
203
|
authorizeSession,
|
|
199
204
|
authorizeSessionWithSignIn,
|
|
200
205
|
deauthorizeSession,
|
|
201
206
|
deauthorizeSessions,
|
|
202
|
-
isLoading
|
|
203
|
-
selectedAccount
|
|
207
|
+
isLoading,
|
|
208
|
+
selectedAccount
|
|
204
209
|
}),
|
|
205
210
|
[
|
|
211
|
+
accounts,
|
|
206
212
|
authorizeSession,
|
|
207
213
|
authorizeSessionWithSignIn,
|
|
208
214
|
deauthorizeSession,
|
|
209
215
|
deauthorizeSessions,
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
fetchQuery.isLoading
|
|
216
|
+
isLoading,
|
|
217
|
+
selectedAccount
|
|
213
218
|
]
|
|
214
219
|
);
|
|
215
220
|
}
|
|
@@ -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 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
|
+
{"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-fetch-authorization.ts","../src/use-persist-authorization.ts","../src/use-authorization-storage.ts","../src/use-authorization.ts","../src/use-mobile-wallet.ts"],"names":["PublicKey","AsyncStorage","useQueryClient","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 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';\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({ queryKey, storageKey }: { queryKey: string[]; storageKey: string }) {\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 AsyncStorage from '@react-native-async-storage/async-storage';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\n\nimport { WalletAuthorization } from './use-authorization';\n\nexport function usePersistAuthorization({ queryKey, storageKey }: { queryKey: string[]; storageKey: string }) {\n const queryClient = useQueryClient();\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 { useQueryClient } from '@tanstack/react-query';\n\nimport { Account, WalletAuthorization } from './use-authorization';\nimport { useFetchAuthorization } from './use-fetch-authorization';\nimport { usePersistAuthorization } from './use-persist-authorization';\n\nexport function useAuthorizationStorage() {\n const queryKey = ['wallet-authorization'];\n const storageKey = 'authorization-cache';\n const queryClient = useQueryClient();\n const fetchQuery = useFetchAuthorization({ queryKey, storageKey });\n const persistMutation = usePersistAuthorization({ queryKey, storageKey });\n\n async function persist(next: WalletAuthorization | null, invalidate = false) {\n await persistMutation.mutateAsync(next);\n if (invalidate) {\n await queryClient.invalidateQueries({ queryKey });\n }\n }\n\n const accounts = fetchQuery.data?.accounts ?? null;\n const authToken: string | undefined = fetchQuery.data?.authToken ?? undefined;\n const isLoading = fetchQuery.isLoading;\n const selectedAccount: Account | undefined = fetchQuery.data?.selectedAccount ?? undefined;\n\n return {\n accounts,\n authToken,\n isLoading,\n persist,\n selectedAccount,\n } as const;\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 { useAuthorizationStorage } from './use-authorization-storage';\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 { accounts, authToken, isLoading, persist, selectedAccount } = useAuthorizationStorage();\n\n const handleAuthorizationResult = useCallback(\n async (authorizationResult: AuthorizationResult): Promise<WalletAuthorization> => {\n const nextAuthorization = getAuthorizationFromAuthorizationResult(authorizationResult, selectedAccount);\n await persist(nextAuthorization);\n return nextAuthorization;\n },\n [selectedAccount, persist],\n );\n\n const authorizeSession = useCallback(\n async (wallet: AuthorizeAPI) => {\n try {\n const authorizationResult = await wallet.authorize({\n auth_token: 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 [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: 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 [authToken, chain, identity, handleAuthorizationResult],\n );\n\n const deauthorizeSession = useCallback(\n async (wallet: DeauthorizeAPI) => {\n if (authToken == null) {\n return;\n }\n await wallet.deauthorize({ auth_token: authToken });\n await persist(null);\n },\n [authToken, persist],\n );\n\n const deauthorizeSessions = useCallback(async () => {\n await persist(null, true);\n }, [persist]);\n\n return useMemo(\n () => ({\n accounts,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading,\n selectedAccount,\n }),\n [\n accounts,\n authorizeSession,\n authorizeSessionWithSignIn,\n deauthorizeSession,\n deauthorizeSessions,\n isLoading,\n selectedAccount,\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"]}
|