1
- import type { UniversalProvider } from "@walletconnect/universal-provider" ;
1
+ import type {
2
+ RequestArguments ,
3
+ UniversalProvider ,
4
+ } from "@walletconnect/universal-provider" ;
2
5
import type { Address } from "abitype" ;
3
6
import {
4
7
getTypesForEIP712Domain ,
@@ -39,6 +42,7 @@ import type { DisconnectFn, SwitchChainFn } from "../types.js";
39
42
import { getDefaultAppMetadata } from "../utils/defaultDappMetadata.js" ;
40
43
import { normalizeChainId } from "../utils/normalizeChainId.js" ;
41
44
import type { WalletEmitter } from "../wallet-emitter.js" ;
45
+ import type { WalletInfo } from "../wallet-info.js" ;
42
46
import type { WalletId } from "../wallet-types.js" ;
43
47
import { DEFAULT_PROJECT_ID , NAMESPACE } from "./constants.js" ;
44
48
import type { WCAutoConnectOptions , WCConnectOptions } from "./types.js" ;
@@ -78,16 +82,16 @@ export async function connectWC(
78
82
emitter : WalletEmitter < WCSupportedWalletIds > ,
79
83
walletId : WCSupportedWalletIds | "walletConnect" ,
80
84
storage : AsyncStorage ,
81
- sessionHandler ?: ( uri : string ) => void ,
85
+ sessionHandler ?: ( uri : string ) => void | Promise < void > ,
82
86
) : Promise < ReturnType < typeof onConnect > > {
83
87
const provider = await initProvider ( options , walletId , sessionHandler ) ;
84
88
const wcOptions = options . walletConnect ;
85
89
86
90
let { onDisplayUri } = wcOptions || { } ;
91
+ const walletInfo = await getWalletInfo ( walletId ) ;
87
92
88
93
// use default sessionHandler unless onDisplayUri is explicitly provided
89
94
if ( ! onDisplayUri && sessionHandler ) {
90
- const walletInfo = await getWalletInfo ( walletId ) ;
91
95
const deeplinkHandler = ( uri : string ) => {
92
96
const appUrl = walletInfo . mobile . native || walletInfo . mobile . universal ;
93
97
if ( ! appUrl ) {
@@ -185,7 +189,16 @@ export async function connectWC(
185
189
provider . events . removeListener ( "display_uri" , wcOptions . onDisplayUri ) ;
186
190
}
187
191
188
- return onConnect ( address , chain , provider , emitter , storage , options . client ) ;
192
+ return onConnect (
193
+ address ,
194
+ chain ,
195
+ provider ,
196
+ emitter ,
197
+ storage ,
198
+ options . client ,
199
+ walletInfo ,
200
+ sessionHandler ,
201
+ ) ;
189
202
}
190
203
191
204
/**
@@ -197,12 +210,14 @@ export async function autoConnectWC(
197
210
emitter : WalletEmitter < WCSupportedWalletIds > ,
198
211
walletId : WCSupportedWalletIds | "walletConnect" ,
199
212
storage : AsyncStorage ,
200
- sessionHandler ?: ( uri : string ) => void ,
213
+ sessionHandler ?: ( uri : string ) => void | Promise < void > ,
201
214
) : Promise < ReturnType < typeof onConnect > > {
202
215
const savedConnectParams : SavedConnectParams | null = storage
203
216
? await getSavedConnectParamsFromStorage ( storage , walletId )
204
217
: null ;
205
218
219
+ const walletInfo = await getWalletInfo ( walletId ) ;
220
+
206
221
const provider = await initProvider (
207
222
savedConnectParams
208
223
? {
@@ -243,7 +258,16 @@ export async function autoConnectWC(
243
258
? options . chain
244
259
: getCachedChain ( providerChainId ) ;
245
260
246
- return onConnect ( address , chain , provider , emitter , storage , options . client ) ;
261
+ return onConnect (
262
+ address ,
263
+ chain ,
264
+ provider ,
265
+ emitter ,
266
+ storage ,
267
+ options . client ,
268
+ walletInfo ,
269
+ sessionHandler ,
270
+ ) ;
247
271
}
248
272
249
273
// Connection utils -----------------------------------------------------------------------------------------------
@@ -284,6 +308,10 @@ async function initProvider(
284
308
] ,
285
309
name : wcOptions ?. appMetadata ?. name || getDefaultAppMetadata ( ) . name ,
286
310
url : wcOptions ?. appMetadata ?. url || getDefaultAppMetadata ( ) . url ,
311
+ redirect : {
312
+ native : walletInfo . mobile . native || undefined ,
313
+ universal : walletInfo . mobile . universal || undefined ,
314
+ } ,
287
315
} ,
288
316
projectId : wcOptions ?. projectId || DEFAULT_PROJECT_ID ,
289
317
} ) ;
@@ -321,17 +349,22 @@ function createAccount({
321
349
address,
322
350
client,
323
351
chain,
352
+ sessionRequestHandler,
353
+ walletInfo,
324
354
} : {
325
355
provider : WCProvider ;
326
356
address : string ;
327
357
client : ThirdwebClient ;
328
358
chain : Chain ;
359
+ sessionRequestHandler ?: ( uri : string ) => void | Promise < void > ;
360
+ walletInfo : WalletInfo ;
329
361
} ) {
330
362
const account : Account = {
331
363
address : getAddress ( address ) ,
332
364
async sendTransaction ( tx : SendTransactionOption ) {
333
- const transactionHash = ( await provider . request (
334
- {
365
+ const transactionHash = ( await requestAndOpenWallet ( {
366
+ provider,
367
+ payload : {
335
368
method : "eth_sendTransaction" ,
336
369
params : [
337
370
{
@@ -343,8 +376,10 @@ function createAccount({
343
376
} ,
344
377
] ,
345
378
} ,
346
- `eip155:${ tx . chainId } ` ,
347
- ) ) as Hex ;
379
+ chain : `eip155:${ tx . chainId } ` ,
380
+ walletInfo,
381
+ sessionRequestHandler,
382
+ } ) ) as Hex ;
348
383
349
384
trackTransaction ( {
350
385
chainId : tx . chainId ,
@@ -370,13 +405,16 @@ function createAccount({
370
405
}
371
406
return message . raw ;
372
407
} ) ( ) ;
373
- return provider . request (
374
- {
408
+ return requestAndOpenWallet ( {
409
+ provider,
410
+ payload : {
375
411
method : "personal_sign" ,
376
412
params : [ messageToSign , this . address ] ,
377
413
} ,
378
- `eip155:${ chain . id } ` ,
379
- ) ;
414
+ chain : `eip155:${ chain . id } ` ,
415
+ walletInfo,
416
+ sessionRequestHandler,
417
+ } ) ;
380
418
} ,
381
419
async signTypedData ( _data ) {
382
420
const data = parseTypedData ( _data ) ;
@@ -399,28 +437,65 @@ function createAccount({
399
437
types,
400
438
} ) ;
401
439
402
- return await provider . request (
403
- {
440
+ return await requestAndOpenWallet ( {
441
+ provider,
442
+ payload : {
404
443
method : "eth_signTypedData_v4" ,
405
444
params : [ this . address , typedData ] ,
406
445
} ,
407
- `eip155:${ chain . id } ` ,
408
- ) ;
446
+ chain : `eip155:${ chain . id } ` ,
447
+ walletInfo,
448
+ sessionRequestHandler,
449
+ } ) ;
409
450
} ,
410
451
} ;
411
452
412
453
return account ;
413
454
}
414
455
456
+ async function requestAndOpenWallet ( args : {
457
+ provider : WCProvider ;
458
+ payload : RequestArguments ;
459
+ chain ?: string ;
460
+ walletInfo : WalletInfo ;
461
+ sessionRequestHandler ?: ( uri : string ) => void | Promise < void > ;
462
+ } ) {
463
+ const { provider, payload, chain, walletInfo, sessionRequestHandler } = args ;
464
+ const resultPromise : Promise < `0x${string } `> = provider . request (
465
+ payload ,
466
+ chain ,
467
+ ) ;
468
+
469
+ const walletLinkToOpen =
470
+ provider . session ?. peer ?. metadata ?. redirect ?. native ||
471
+ walletInfo . mobile . native ||
472
+ walletInfo . mobile . universal ;
473
+
474
+ if ( sessionRequestHandler && walletLinkToOpen ) {
475
+ await sessionRequestHandler ( walletLinkToOpen ) ;
476
+ }
477
+
478
+ return resultPromise ;
479
+ }
480
+
415
481
function onConnect (
416
482
address : string ,
417
483
chain : Chain ,
418
484
provider : WCProvider ,
419
485
emitter : WalletEmitter < WCSupportedWalletIds > ,
420
486
storage : AsyncStorage ,
421
487
client : ThirdwebClient ,
488
+ walletInfo : WalletInfo ,
489
+ sessionRequestHandler ?: ( uri : string ) => void | Promise < void > ,
422
490
) : [ Account , Chain , DisconnectFn , SwitchChainFn ] {
423
- const account = createAccount ( { address, chain, client, provider } ) ;
491
+ const account = createAccount ( {
492
+ address,
493
+ chain,
494
+ client,
495
+ provider,
496
+ sessionRequestHandler,
497
+ walletInfo,
498
+ } ) ;
424
499
425
500
async function disconnect ( ) {
426
501
provider . removeListener ( "accountsChanged" , onAccountsChanged ) ;
@@ -444,6 +519,8 @@ function onConnect(
444
519
chain,
445
520
client,
446
521
provider,
522
+ sessionRequestHandler,
523
+ walletInfo,
447
524
} ) ;
448
525
emitter . emit ( "accountChanged" , newAccount ) ;
449
526
emitter . emit ( "accountsChanged" , accounts ) ;
0 commit comments