Skip to content

Commit c2e4e6d

Browse files
committed
refactor: litConnectModal as deafult
1 parent 429b95c commit c2e4e6d

File tree

2 files changed

+158
-13
lines changed

2 files changed

+158
-13
lines changed

packages/auth-browser/src/lib/chains/eth.ts

Lines changed: 148 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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';
1418
import depd from 'depd';
1519
import { ethers } from 'ethers';
1620
import { getAddress } from 'ethers/lib/utils';
@@ -43,7 +47,14 @@ import {
4347
validateSessionSig,
4448
} from '@lit-protocol/misc';
4549
import { 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

4859
const 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 ---------- */
6579
interface 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

packages/types/src/lib/interfaces.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ export interface CosmosAuthSig extends AuthSig {
7878

7979
export type CosmosWalletType = 'keplr' | 'leap';
8080

81+
export enum AuthProvider {
82+
Wagmi = "wagmi",
83+
LitConnectModal = "litConnectModal",
84+
}
85+
8186
export interface AuthCallbackParams extends LitActionSdkParams {
8287
/**
8388
* The serialized session key pair to sign. If not provided, a session key pair will be fetched from localStorge or generated.
@@ -127,6 +132,11 @@ export interface AuthCallbackParams extends LitActionSdkParams {
127132
walletConnectProjectId?: string;
128133

129134
resourceAbilityRequests?: LitResourceAbilityRequest[];
135+
136+
/**
137+
* The provider to use for the auth callback. Defaults to `litConnectModal`.
138+
*/
139+
provider?: AuthProvider;
130140
}
131141

132142
/** ---------- Web3 ---------- */

0 commit comments

Comments
 (0)