@@ -11,6 +11,10 @@ import {
1111 getWalletClient ,
1212 Config ,
1313} from '@wagmi/core' ;
14+ import {
15+ EthereumProvider ,
16+ default as WalletConnectProvider ,
17+ } from '@walletconnect/ethereum-provider' ;
1418import depd from 'depd' ;
1519import { ethers } from 'ethers' ;
1620import { getAddress } from 'ethers/lib/utils' ;
@@ -43,7 +47,14 @@ import {
4347 validateSessionSig ,
4448} from '@lit-protocol/misc' ;
4549import { getStorageItem } from '@lit-protocol/misc-browser' ;
46- import { AuthSig , AuthCallbackParams , LITEVMChain } from '@lit-protocol/types' ;
50+ import {
51+ AuthSig ,
52+ AuthCallbackParams ,
53+ LITEVMChain ,
54+ AuthProvider ,
55+ } from '@lit-protocol/types' ;
56+
57+ import LitConnectModal from '../connect-modal/modal' ;
4758
4859const deprecated = depd ( 'lit-js-sdk:auth-browser:index' ) ;
4960
@@ -61,6 +72,9 @@ if (globalThis && typeof globalThis.Buffer === 'undefined') {
6172// log("_nacl:", _nacl);
6273// log("_naclUtil:", _naclUtil);
6374
75+ type RPCUrls = Record < string , string > ;
76+ let litWCProvider : WalletConnectProvider | undefined ;
77+
6478/** ---------- Local Interfaces ---------- */
6579interface ConnectWeb3 {
6680 chainId : number ;
@@ -367,13 +381,13 @@ const getWagmiProvider = async (
367381
368382/**
369383 * @browserOnly
370- * Connect to web 3
384+ * Connect to web 3 using wagmi as provider
371385 *
372- * @param { ConnectWeb3 }
386+ * @param { connectWeb3WithWagmi }
373387 *
374388 * @return { Promise<ConnectWeb3Result> } web3, account
375389 */
376- export const connectWeb3 = async ( {
390+ export const connectWeb3WithWagmi = async ( {
377391 chainId = 1 ,
378392 walletConnectProjectId,
379393} : ConnectWeb3 ) : Promise < ConnectWeb3Result > => {
@@ -416,6 +430,111 @@ export const connectWeb3 = async ({
416430 return { web3, account } ;
417431} ;
418432
433+ /**
434+ *
435+ * Get RPC Urls in the correct format
436+ * need to make it look like this:
437+ ---
438+ rpc: {
439+ 1: "https://mainnet.mycustomnode.com",
440+ 3: "https://ropsten.mycustomnode.com",
441+ 100: "https://dai.poa.network",
442+ // ...
443+ },
444+ ---
445+ *
446+ * @returns
447+ */
448+ export const getRPCUrls = ( ) : RPCUrls => {
449+ const rpcUrls : RPCUrls = { } ;
450+
451+ const keys : string [ ] = Object . keys ( LIT_CHAINS ) ;
452+
453+ for ( const chainName of keys ) {
454+ const chainId = LIT_CHAINS [ chainName ] . chainId ;
455+ const rpcUrl = LIT_CHAINS [ chainName ] . rpcUrls [ 0 ] ;
456+ rpcUrls [ chainId . toString ( ) ] = rpcUrl ;
457+ }
458+
459+ return rpcUrls ;
460+ } ;
461+
462+ /**
463+ * @browserOnly
464+ * Connect to web 3 using lit connect modal as provider
465+ *
466+ * @param { connectWeb3WithLitConnectModal }
467+ *
468+ * @return { Promise<ConnectWeb3Result> } web3, account
469+ */
470+ export const connectWeb3WithLitConnectModal = async ( {
471+ chainId = 1 ,
472+ walletConnectProjectId,
473+ } : ConnectWeb3 ) : Promise < ConnectWeb3Result > => {
474+ // -- check if it's nodejs
475+ if ( isNode ( ) ) {
476+ log ( 'connectWeb3 is not supported in nodejs.' ) ;
477+ return { web3 : null , account : null } ;
478+ }
479+
480+ const rpcUrls : RPCUrls = getRPCUrls ( ) ;
481+
482+ let providerOptions = { } ;
483+
484+ if ( walletConnectProjectId ) {
485+ const wcProvider = await EthereumProvider . init ( {
486+ projectId : walletConnectProjectId ,
487+ chains : [ chainId ] ,
488+ showQrModal : true ,
489+ optionalMethods : [ 'eth_sign' ] ,
490+ rpcMap : rpcUrls ,
491+ } ) ;
492+
493+ providerOptions = {
494+ walletconnect : {
495+ provider : wcProvider ,
496+ } ,
497+ } ;
498+
499+ if ( isBrowser ( ) ) {
500+ litWCProvider = wcProvider ;
501+ }
502+ }
503+
504+ log ( 'getting provider via lit connect modal' ) ;
505+
506+ const dialog = new LitConnectModal ( { providerOptions } ) ;
507+
508+ const provider = await dialog . getWalletProvider ( ) ;
509+
510+ log ( 'got provider' ) ;
511+
512+ // @ts -ignore
513+ const web3 = new Web3Provider ( provider ) ;
514+
515+ // trigger metamask popup
516+ try {
517+ deprecated (
518+ '@deprecated soon to be removed. - trying to enable provider. this will trigger the metamask popup.'
519+ ) ;
520+ // @ts -ignore
521+ await provider . enable ( ) ;
522+ } catch ( e ) {
523+ log (
524+ "error enabling provider but swallowed it because it's not important. most wallets use a different function now to enable the wallet so you can ignore this error, because those other methods will be tried." ,
525+ e
526+ ) ;
527+ }
528+
529+ log ( 'listing accounts' ) ;
530+ const accounts = await web3 . listAccounts ( ) ;
531+
532+ log ( 'accounts' , accounts ) ;
533+ const account = ethers . utils . getAddress ( accounts [ 0 ] ) ;
534+
535+ return { web3, account } ;
536+ } ;
537+
419538/**
420539 * @browserOnly
421540 * Delete any saved AuthSigs from local storage. Takes no params and returns
@@ -429,11 +548,16 @@ export const disconnectWeb3 = async (): Promise<void> => {
429548 log ( 'disconnectWeb3 is not supported in nodejs.' ) ;
430549 return ;
431550 }
432-
433- try {
434- await wagmiDisconnect ( wagmiConfig ) ;
435- } catch ( err ) {
436- log ( 'Error disconnecting wallet:' , err ) ;
551+ if ( isBrowser ( ) ) {
552+ try {
553+ if ( litWCProvider ) {
554+ litWCProvider . disconnect ( ) ;
555+ } else {
556+ await wagmiDisconnect ( wagmiConfig ) ;
557+ }
558+ } catch ( err ) {
559+ log ( 'Error disconnecting wallet:' , err ) ;
560+ }
437561 }
438562
439563 const storage = LOCAL_STORAGE_KEYS ;
@@ -460,6 +584,7 @@ export const checkAndSignEVMAuthMessage = async ({
460584 uri,
461585 walletConnectProjectId,
462586 nonce,
587+ provider = AuthProvider . LitConnectModal ,
463588} : AuthCallbackParams ) : Promise < AuthSig > => {
464589 // -- check if it's nodejs
465590 if ( isNode ( ) ) {
@@ -494,10 +619,20 @@ export const checkAndSignEVMAuthMessage = async ({
494619 const selectedChain = LIT_CHAINS [ chain ] ;
495620 const expirationString = expiration ?? getDefaultExpiration ( ) ;
496621
497- const { web3, account } = await connectWeb3 ( {
498- chainId : selectedChain . chainId ,
499- walletConnectProjectId,
500- } ) ;
622+ let web3 : Web3Provider ;
623+ let account : string ;
624+
625+ if ( provider === AuthProvider . Wagmi ) {
626+ ( { web3, account } = await connectWeb3WithWagmi ( {
627+ chainId : selectedChain . chainId ,
628+ walletConnectProjectId,
629+ } ) ) ;
630+ } else {
631+ ( { web3, account } = await connectWeb3WithLitConnectModal ( {
632+ chainId : selectedChain . chainId ,
633+ walletConnectProjectId,
634+ } ) ) ;
635+ }
501636
502637 log ( `got web3 and account: ${ account } ` ) ;
503638
0 commit comments