accounts 0.5.7 → 0.5.9

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.
@@ -0,0 +1,314 @@
1
+ import { Address as core_Address, Base64, Hex, P256, Provider as core_Provider, PublicKey, RpcResponse, } from 'ox';
2
+ import { KeyAuthorization } from 'ox/tempo';
3
+ import { prepareTransactionRequest } from 'viem/actions';
4
+ import { Account as TempoAccount, Secp256k1 } from 'viem/tempo';
5
+ import * as AccessKey from '../core/AccessKey.js';
6
+ import * as Adapter from '../core/Adapter.js';
7
+ /**
8
+ * Creates a React Native adapter that authorizes access keys via the system browser.
9
+ *
10
+ * Authentication opens a browser session and completes via a redirect callback
11
+ * that returns the signed key authorization.
12
+ */
13
+ export function reactNative(options) {
14
+ const { name = 'Tempo Mobile', rdns = 'xyz.tempo.mobile' } = options;
15
+ return Adapter.define({ name, rdns }, ({ getAccount, getClient, store }) => {
16
+ async function loadManagedKey(address, parameters = {}) {
17
+ const { keyType } = parameters;
18
+ const { secureStorage } = options;
19
+ if (!secureStorage)
20
+ return undefined;
21
+ const { chainId } = store.getState();
22
+ const storageKey = managedKeyStorageKey(address, chainId, keyType);
23
+ const entry = await secureStorage.getItem(storageKey);
24
+ if (!entry)
25
+ return undefined;
26
+ const deserialized = KeyAuthorization.deserialize(entry.keyAuthorization);
27
+ if (!deserialized.signature)
28
+ throw new Error('Managed access key is missing a signature.');
29
+ const keyAuthorization = deserialized;
30
+ AccessKey.save({
31
+ address,
32
+ keyAuthorization,
33
+ privateKey: entry.key,
34
+ store,
35
+ });
36
+ return entry;
37
+ }
38
+ async function resolveManagedKey(resolveOptions = {}) {
39
+ const { address, keyType } = resolveOptions;
40
+ const requestedKeyType = keyType === 'p256' || keyType === 'secp256k1' ? keyType : undefined;
41
+ const entry = address
42
+ ? await loadManagedKey(address, requestedKeyType ? { keyType: requestedKeyType } : {})
43
+ : undefined;
44
+ if (entry) {
45
+ const account = entry.keyType === 'p256'
46
+ ? TempoAccount.fromP256(entry.key, { access: address })
47
+ : TempoAccount.fromSecp256k1(entry.key, { access: address });
48
+ return {
49
+ account,
50
+ key: entry.key,
51
+ keyAddress: entry.keyAddress,
52
+ keyType: entry.keyType,
53
+ publicKey: account.publicKey,
54
+ };
55
+ }
56
+ const nextKeyType = requestedKeyType === 'p256' ? 'p256' : 'secp256k1';
57
+ const key = nextKeyType === 'p256' ? P256.randomPrivateKey() : Secp256k1.randomPrivateKey();
58
+ const account = nextKeyType === 'p256'
59
+ ? TempoAccount.fromP256(key, address ? { access: address } : undefined)
60
+ : TempoAccount.fromSecp256k1(key, address ? { access: address } : undefined);
61
+ return {
62
+ account,
63
+ key,
64
+ keyAddress: core_Address.fromPublicKey(PublicKey.from(account.publicKey)),
65
+ keyType: nextKeyType,
66
+ publicKey: account.publicKey,
67
+ };
68
+ }
69
+ async function saveManagedKey(address, managedKey, keyAuthorization) {
70
+ if (!managedKey)
71
+ return;
72
+ AccessKey.save({
73
+ address,
74
+ keyAuthorization,
75
+ privateKey: managedKey.key,
76
+ store,
77
+ });
78
+ const { secureStorage } = options;
79
+ if (!secureStorage)
80
+ return;
81
+ const { chainId } = store.getState();
82
+ const storageKey = managedKeyStorageKey(address, chainId, managedKey.keyType);
83
+ const entry = {
84
+ chainId,
85
+ expiry: keyAuthorization.expiry ?? 0,
86
+ key: managedKey.key,
87
+ keyAddress: managedKey.keyAddress,
88
+ keyAuthorization: KeyAuthorization.serialize(keyAuthorization),
89
+ keyType: managedKey.keyType,
90
+ walletAddress: address,
91
+ };
92
+ await secureStorage.setItem(storageKey, entry);
93
+ }
94
+ async function withManagedAccessKey(fn) {
95
+ const rootAddress = store.getState().accounts[store.getState().activeAccount]?.address;
96
+ if (rootAddress)
97
+ await loadManagedKey(rootAddress);
98
+ const account = getAccount({ signable: true });
99
+ const keyAuthorization = AccessKey.getPending(account, { store });
100
+ try {
101
+ const result = await fn(account, keyAuthorization ?? undefined);
102
+ AccessKey.removePending(account, { store });
103
+ return result;
104
+ }
105
+ catch (error) {
106
+ AccessKey.remove(account, { store });
107
+ throw error;
108
+ }
109
+ }
110
+ async function authorize(request) {
111
+ const { host, redirectUri, open = defaultOpen } = options;
112
+ const { account, authorizeAccessKey, method } = request;
113
+ const managedKey = authorizeAccessKey && !authorizeAccessKey.publicKey && !authorizeAccessKey.address
114
+ ? await resolveManagedKey({
115
+ ...(account ? { address: account } : {}),
116
+ ...(authorizeAccessKey.keyType ? { keyType: authorizeAccessKey.keyType } : {}),
117
+ })
118
+ : undefined;
119
+ const publicKey = authorizeAccessKey?.publicKey ?? managedKey?.publicKey;
120
+ const keyType = authorizeAccessKey?.keyType ?? managedKey?.keyType;
121
+ if (!publicKey)
122
+ throw new RpcResponse.InvalidParamsError({
123
+ message: method === 'wallet_connect'
124
+ ? '`wallet_connect` on the React Native adapter requires `capabilities.authorizeAccessKey`.'
125
+ : '`wallet_authorizeAccessKey` on the React Native adapter requires key parameters.',
126
+ });
127
+ const state = Base64.fromBytes(Hex.toBytes(Hex.random(16)), { pad: false, url: true });
128
+ const authUrl = buildAuthUrl(host, {
129
+ callback: redirectUri,
130
+ chainId: store.getState().chainId,
131
+ ...(typeof authorizeAccessKey?.expiry !== 'undefined'
132
+ ? { expiry: authorizeAccessKey.expiry }
133
+ : {}),
134
+ ...(keyType ? { keyType } : {}),
135
+ ...(authorizeAccessKey?.limits
136
+ ? { limits: authorizeAccessKey.limits.map((l) => ({ ...l, limit: String(l.limit) })) }
137
+ : {}),
138
+ pubKey: publicKey,
139
+ state,
140
+ });
141
+ const callbackUrl = await open(authUrl, redirectUri);
142
+ if (!callbackUrl)
143
+ throw new AuthCancelledError();
144
+ const params = new URL(callbackUrl).searchParams;
145
+ const returnedState = params.get('state');
146
+ if (returnedState !== state)
147
+ throw new StateMismatchError();
148
+ const accountAddress = params.get('accountAddress');
149
+ if (!accountAddress)
150
+ throw new Error('Missing accountAddress in callback.');
151
+ const keyAuthorizationHex = params.get('keyAuthorization');
152
+ if (!keyAuthorizationHex)
153
+ throw new Error('Missing keyAuthorization in callback.');
154
+ const keyAuthorization = KeyAuthorization.deserialize(keyAuthorizationHex);
155
+ if (!keyAuthorization.signature)
156
+ throw new Error('Key authorization in callback is missing a signature.');
157
+ const signed = keyAuthorization;
158
+ if (managedKey)
159
+ await saveManagedKey(accountAddress, managedKey, signed);
160
+ return {
161
+ accountAddress: accountAddress,
162
+ keyAuthorization: signed,
163
+ };
164
+ }
165
+ return {
166
+ actions: {
167
+ async authorizeAccessKey(parameters) {
168
+ const { accounts, activeAccount } = store.getState();
169
+ const account = accounts[activeAccount]?.address;
170
+ const result = await authorize({
171
+ ...(account ? { account } : {}),
172
+ authorizeAccessKey: parameters,
173
+ method: 'wallet_authorizeAccessKey',
174
+ });
175
+ if (!account)
176
+ store.setState({
177
+ accounts: [{ address: result.accountAddress }],
178
+ activeAccount: 0,
179
+ });
180
+ return {
181
+ keyAuthorization: KeyAuthorization.toRpc(result.keyAuthorization),
182
+ rootAddress: result.accountAddress,
183
+ };
184
+ },
185
+ async createAccount(params, request) {
186
+ return this.loadAccounts(params, request);
187
+ },
188
+ async loadAccounts(parameters) {
189
+ if (parameters?.digest)
190
+ throw unsupported('`wallet_connect` digest signing not supported by React Native adapter.');
191
+ const result = await authorize({
192
+ authorizeAccessKey: parameters?.authorizeAccessKey,
193
+ method: 'wallet_connect',
194
+ });
195
+ return {
196
+ accounts: [
197
+ {
198
+ address: result.accountAddress,
199
+ capabilities: {},
200
+ },
201
+ ],
202
+ keyAuthorization: KeyAuthorization.toRpc(result.keyAuthorization),
203
+ };
204
+ },
205
+ async revokeAccessKey() {
206
+ throw unsupported('`wallet_revokeAccessKey` not supported by React Native adapter.');
207
+ },
208
+ async sendTransaction(parameters) {
209
+ const { feePayer, ...rest } = parameters;
210
+ const client = getClient(typeof feePayer === 'string' ? { feePayer } : {});
211
+ const { account, prepared } = await withManagedAccessKey(async (account, keyAuthorization) => ({
212
+ account,
213
+ prepared: await prepareTransactionRequest(client, {
214
+ account,
215
+ ...rest,
216
+ ...(feePayer ? { feePayer: true } : {}),
217
+ ...(keyAuthorization ? { keyAuthorization } : {}),
218
+ type: 'tempo',
219
+ }),
220
+ }));
221
+ const signed = await account.signTransaction(prepared);
222
+ return await client.request({
223
+ method: 'eth_sendRawTransaction',
224
+ params: [signed],
225
+ });
226
+ },
227
+ async sendTransactionSync(parameters) {
228
+ const { feePayer, ...rest } = parameters;
229
+ const client = getClient(typeof feePayer === 'string' ? { feePayer } : {});
230
+ const { account, prepared } = await withManagedAccessKey(async (account, keyAuthorization) => ({
231
+ account,
232
+ prepared: await prepareTransactionRequest(client, {
233
+ account,
234
+ ...rest,
235
+ ...(feePayer ? { feePayer: true } : {}),
236
+ ...(keyAuthorization ? { keyAuthorization } : {}),
237
+ type: 'tempo',
238
+ }),
239
+ }));
240
+ const signed = await account.signTransaction(prepared);
241
+ return await client.request({
242
+ method: 'eth_sendRawTransactionSync',
243
+ params: [signed],
244
+ });
245
+ },
246
+ async signPersonalMessage({ address, data }) {
247
+ await loadManagedKey(address);
248
+ const account = getAccount({ address, signable: true });
249
+ return await account.signMessage({ message: { raw: data } });
250
+ },
251
+ async signTransaction(parameters) {
252
+ const { feePayer, ...rest } = parameters;
253
+ const client = getClient(typeof feePayer === 'string' ? { feePayer } : {});
254
+ const { account, prepared } = await withManagedAccessKey(async (account, keyAuthorization) => ({
255
+ account,
256
+ prepared: await prepareTransactionRequest(client, {
257
+ account,
258
+ ...rest,
259
+ ...(feePayer ? { feePayer: true } : {}),
260
+ ...(keyAuthorization ? { keyAuthorization } : {}),
261
+ type: 'tempo',
262
+ }),
263
+ }));
264
+ return await account.signTransaction(prepared);
265
+ },
266
+ async signTypedData({ address, data }) {
267
+ await loadManagedKey(address);
268
+ const account = getAccount({ address, signable: true });
269
+ return await account.signTypedData(JSON.parse(data));
270
+ },
271
+ },
272
+ };
273
+ });
274
+ }
275
+ class AuthCancelledError extends Error {
276
+ constructor() {
277
+ super('Authentication was cancelled by the user.');
278
+ this.name = 'AuthCancelledError';
279
+ }
280
+ }
281
+ class StateMismatchError extends Error {
282
+ constructor() {
283
+ super('State parameter mismatch — possible CSRF attack.');
284
+ this.name = 'StateMismatchError';
285
+ }
286
+ }
287
+ async function defaultOpen(url, redirectUri) {
288
+ const { openAuthSessionAsync } = await import('expo-web-browser');
289
+ const result = await openAuthSessionAsync(url, redirectUri);
290
+ if (result.type !== 'success')
291
+ return null;
292
+ return result.url;
293
+ }
294
+ function buildAuthUrl(host, params) {
295
+ const url = new URL('/mobile-auth', host);
296
+ url.searchParams.set('pubKey', params.pubKey);
297
+ if (params.keyType)
298
+ url.searchParams.set('keyType', params.keyType);
299
+ url.searchParams.set('chainId', String(params.chainId));
300
+ if (typeof params.expiry !== 'undefined')
301
+ url.searchParams.set('expiry', String(params.expiry));
302
+ if (params.limits)
303
+ url.searchParams.set('limits', JSON.stringify(params.limits));
304
+ url.searchParams.set('callback', params.callback);
305
+ url.searchParams.set('state', params.state);
306
+ return url.toString();
307
+ }
308
+ function managedKeyStorageKey(address, chainId, keyType) {
309
+ return `managedKey.${address.toLowerCase()}.${chainId}${keyType ? `.${keyType}` : ''}`;
310
+ }
311
+ function unsupported(message) {
312
+ return new core_Provider.UnsupportedMethodError({ message });
313
+ }
314
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/react-native/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * as Provider from './Provider.js';
2
+ export { reactNative } from './adapter.js';
3
+ export { asyncStorage, secureStorage } from './storage.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react-native/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * as Provider from './Provider.js';
2
+ export { reactNative } from './adapter.js';
3
+ export { asyncStorage, secureStorage } from './storage.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react-native/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,12 @@
1
+ import * as Storage from '../core/Storage.js';
2
+ /** Creates a storage adapter backed by `expo-secure-store`. For private key material. */
3
+ export declare function secureStorage(options?: secureStorage.Options): Storage.Storage;
4
+ export declare namespace secureStorage {
5
+ type Options = Storage.from.Options;
6
+ }
7
+ /** Creates a storage adapter backed by `@react-native-async-storage/async-storage`. */
8
+ export declare function asyncStorage(options?: asyncStorage.Options): Storage.Storage;
9
+ export declare namespace asyncStorage {
10
+ type Options = Storage.from.Options;
11
+ }
12
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/react-native/storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAE7C,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,OAAO,GAAE,aAAa,CAAC,OAAY,GAAG,OAAO,CAAC,OAAO,CAwBlF;AAED,MAAM,CAAC,OAAO,WAAW,aAAa,CAAC;IACrC,KAAK,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAA;CACpC;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,OAAO,GAAE,YAAY,CAAC,OAAY,GAAG,OAAO,CAAC,OAAO,CAwBhF;AAED,MAAM,CAAC,OAAO,WAAW,YAAY,CAAC;IACpC,KAAK,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAA;CACpC"}
@@ -0,0 +1,53 @@
1
+ import { Json } from 'ox';
2
+ import * as Storage from '../core/Storage.js';
3
+ /** Creates a storage adapter backed by `expo-secure-store`. For private key material. */
4
+ export function secureStorage(options = {}) {
5
+ return Storage.from({
6
+ async getItem(name) {
7
+ const { getItemAsync } = await import('expo-secure-store');
8
+ const raw = await getItemAsync(name);
9
+ if (raw === null)
10
+ return null;
11
+ try {
12
+ return Json.parse(raw);
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ },
18
+ async setItem(name, value) {
19
+ const { setItemAsync } = await import('expo-secure-store');
20
+ await setItemAsync(name, Json.stringify(value));
21
+ },
22
+ async removeItem(name) {
23
+ const { deleteItemAsync } = await import('expo-secure-store');
24
+ await deleteItemAsync(name);
25
+ },
26
+ }, options);
27
+ }
28
+ /** Creates a storage adapter backed by `@react-native-async-storage/async-storage`. */
29
+ export function asyncStorage(options = {}) {
30
+ return Storage.from({
31
+ async getItem(name) {
32
+ const AsyncStorage = (await import('@react-native-async-storage/async-storage')).default;
33
+ const raw = await AsyncStorage.getItem(name);
34
+ if (raw === null)
35
+ return null;
36
+ try {
37
+ return Json.parse(raw);
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ },
43
+ async setItem(name, value) {
44
+ const AsyncStorage = (await import('@react-native-async-storage/async-storage')).default;
45
+ await AsyncStorage.setItem(name, Json.stringify(value));
46
+ },
47
+ async removeItem(name) {
48
+ const AsyncStorage = (await import('@react-native-async-storage/async-storage')).default;
49
+ await AsyncStorage.removeItem(name);
50
+ },
51
+ }, options);
52
+ }
53
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/react-native/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAA;AAEzB,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAE7C,yFAAyF;AACzF,MAAM,UAAU,aAAa,CAAC,UAAiC,EAAE;IAC/D,OAAO,OAAO,CAAC,IAAI,CACjB;QACE,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;YAC1D,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAA;YACpC,IAAI,GAAG,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAA;YAC7B,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK;YACvB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;YAC1D,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QACjD,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,IAAI;YACnB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;YAC7D,MAAM,eAAe,CAAC,IAAI,CAAC,CAAA;QAC7B,CAAC;KACF,EACD,OAAO,CACR,CAAA;AACH,CAAC;AAMD,uFAAuF;AACvF,MAAM,UAAU,YAAY,CAAC,UAAgC,EAAE;IAC7D,OAAO,OAAO,CAAC,IAAI,CACjB;QACE,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,YAAY,GAAG,CAAC,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC,OAAO,CAAA;YACxF,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC5C,IAAI,GAAG,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAA;YAC7B,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK;YACvB,MAAM,YAAY,GAAG,CAAC,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC,OAAO,CAAA;YACxF,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QACzD,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,IAAI;YACnB,MAAM,YAAY,GAAG,CAAC,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC,OAAO,CAAA;YACxF,MAAM,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACrC,CAAC;KACF,EACD,OAAO,CACR,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "accounts",
3
3
  "description": "Tempo Accounts SDK",
4
4
  "type": "module",
5
- "version": "0.5.7",
5
+ "version": "0.5.9",
6
6
  "dependencies": {
7
7
  "hono": "^4.12.12",
8
8
  "idb-keyval": "^6.2.2",
@@ -14,7 +14,10 @@
14
14
  "zustand": "^5.0.11"
15
15
  },
16
16
  "peerDependencies": {
17
+ "@react-native-async-storage/async-storage": "^3.0.2",
17
18
  "@wagmi/core": ">=2",
19
+ "expo-secure-store": "^55.0.12",
20
+ "expo-web-browser": "^55.0.13",
18
21
  "react": ">=18",
19
22
  "viem": ">=2.43.3"
20
23
  },
@@ -27,6 +30,15 @@
27
30
  },
28
31
  "viem": {
29
32
  "optional": true
33
+ },
34
+ "expo-web-browser": {
35
+ "optional": true
36
+ },
37
+ "expo-secure-store": {
38
+ "optional": true
39
+ },
40
+ "@react-native-async-storage/async-storage": {
41
+ "optional": true
30
42
  }
31
43
  },
32
44
  "repository": {
@@ -46,6 +58,7 @@
46
58
  ".": {
47
59
  "types": "./dist/index.d.ts",
48
60
  "src": "./src/index.ts",
61
+ "react-native": "./dist/index.js",
49
62
  "default": "./dist/index.js"
50
63
  },
51
64
  "./server": {
@@ -67,6 +80,12 @@
67
80
  "types": "./dist/wagmi/index.d.ts",
68
81
  "src": "./src/wagmi/index.ts",
69
82
  "default": "./dist/wagmi/index.js"
83
+ },
84
+ "./react-native": {
85
+ "types": "./dist/react-native/index.d.ts",
86
+ "src": "./src/react-native/index.ts",
87
+ "react-native": "./dist/react-native/index.js",
88
+ "default": "./dist/react-native/index.js"
70
89
  }
71
90
  }
72
91
  }
@@ -65,6 +65,8 @@ let cached: { host: string; instance: Instance } | undefined
65
65
  /** Mutable refs swapped on re-entry so the singleton always uses the latest caller's state. */
66
66
  let store: Store.Store | undefined
67
67
  let fallback: Instance | undefined
68
+ /** Previous stores kept alive so in-flight responses find their matching request. */
69
+ let previousStores: Store.Store[] = []
68
70
 
69
71
  /** Creates an iframe dialog that embeds the auth app in a `<dialog>` element. */
70
72
  export function iframe(): Dialog {
@@ -75,7 +77,13 @@ export function iframe(): Dialog {
75
77
 
76
78
  // Reuse existing iframe if the host matches — just swap the store/fallback refs.
77
79
  if (cached && cached.host === host) {
80
+ const oldStore = store
78
81
  store = parameters.store
82
+
83
+ // Keep the old store so in-flight responses can find their matching request.
84
+ if (oldStore && oldStore !== store && !previousStores.includes(oldStore))
85
+ previousStores.push(oldStore)
86
+
79
87
  fallback?.destroy()
80
88
  fallback = popup()(parameters)
81
89
  return cached.instance
@@ -168,7 +176,10 @@ export function iframe(): Dialog {
168
176
  }),
169
177
  waitForReady: true,
170
178
  })
171
- m.on('rpc-response', (response) => handleResponse(store!, response))
179
+ m.on('rpc-response', (response) => {
180
+ const targetStore = findStoreForResponse(store!, previousStores, response.id)
181
+ handleResponse(targetStore, response)
182
+ })
172
183
  m.waitForReady().then((result) => {
173
184
  readyResult = result
174
185
  if (result.colorScheme) frame.style.colorScheme = result.colorScheme
@@ -300,6 +311,7 @@ export function iframe(): Dialog {
300
311
 
301
312
  store = undefined
302
313
  fallback = undefined
314
+ previousStores = []
303
315
  },
304
316
  open() {
305
317
  if (open) return
@@ -494,6 +506,19 @@ export function noop(): Dialog {
494
506
  }))
495
507
  }
496
508
 
509
+ /** Finds the store that owns the request matching the given response id. */
510
+ function findStoreForResponse(
511
+ current: Store.Store,
512
+ previous: Store.Store[],
513
+ id: number,
514
+ ): Store.Store {
515
+ if (current.getState().requestQueue.some((q) => q.request.id === id)) return current
516
+ for (const s of previous) {
517
+ if (s.getState().requestQueue.some((q) => q.request.id === id)) return s
518
+ }
519
+ return current
520
+ }
521
+
497
522
  /** Updates the store with an RPC response from the remote auth app. */
498
523
  function handleResponse(
499
524
  store: Store.Store,
@@ -607,7 +607,7 @@ export function create(options: create.Options = {}): create.ReturnType {
607
607
  },
608
608
  )
609
609
 
610
- if (typeof window !== 'undefined') {
610
+ if (typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') {
611
611
  const rdns =
612
612
  adapter.rdns ?? `com.${(adapter.name ?? 'Injected Wallet').toLowerCase().replace(/\s+/g, '')}`
613
613
 
@@ -0,0 +1,28 @@
1
+ import * as CoreProvider from '../core/Provider.js'
2
+ import { reactNative } from './adapter.js'
3
+
4
+ /** Creates a provider for React Native apps using system browser authentication. */
5
+ export function create(options: create.Options): create.ReturnType {
6
+ const { host = 'https://wallet.tempo.xyz', redirectUri, open, secureStorage, ...rest } = options
7
+
8
+ return CoreProvider.create({
9
+ ...rest,
10
+ adapter: reactNative({
11
+ host,
12
+ redirectUri,
13
+ ...(open ? { open } : {}),
14
+ ...(secureStorage ? { secureStorage } : {}),
15
+ }),
16
+ })
17
+ }
18
+
19
+ export declare namespace create {
20
+ export type Options = Omit<
21
+ CoreProvider.create.Options & reactNative.Options,
22
+ 'adapter' | 'host'
23
+ > & {
24
+ /** Host URL for the mobile auth page. @default "https://wallet.tempo.xyz" */
25
+ host?: string | undefined
26
+ }
27
+ export type ReturnType = CoreProvider.create.ReturnType
28
+ }