@lifi/wallet-management
Version:
LI.FI Wallet Management solution.
77 lines • 3.5 kB
JavaScript
import { http, createClient } from 'viem';
import { mainnet } from 'viem/chains';
import { createConfig } from 'wagmi';
import { safe } from 'wagmi/connectors';
import { createCoinbaseConnector } from './connectors/coinbase.js';
import { createMetaMaskConnector } from './connectors/metaMask.js';
import { createWalletConnectConnector } from './connectors/walletConnect.js';
import { isWalletInstalled } from './utils/isWalletInstalled.js';
/**
* Creates default Wagmi config that can be later synced (via useSyncWagmiConfig) with chains fetched from LI.FI API.
* @param props Properties to setup connectors. {@link DefaultWagmiConfigProps}
* @returns Wagmi config and connectors. {@link DefaultWagmiConfigResult}
* @example
* const { config, connectors } = createDefaultWagmiConfig({
* walletConnect: {
* projectId: import.meta.env.VITE_WALLET_CONNECT,
* },
* coinbase: { appName: 'LI.FI Demo' },
* });
* export const WalletProvider: FC<PropsWithChildren> = ({ children }) => {
* const { chains } = useAvailableChains();
* useSyncWagmiConfig(config, connectors, chains);
* return (
* <WagmiProvider config={wagmi.config} reconnectOnMount={false}>
* {children}
* </WagmiProvider>
* );
* };
*/
export function createDefaultWagmiConfig(props) {
const connectors = [...(props?.connectors ?? [])];
const anyWindow = typeof window !== 'undefined' ? window : undefined;
const localStorage = anyWindow?.localStorage;
// in Multisig env, window.parent is not equal to window
const isIframeEnvironment = anyWindow && anyWindow.parent !== anyWindow;
const multiInjectedProviderDiscovery = isIframeEnvironment
? false
: (props?.wagmiConfig?.multiInjectedProviderDiscovery ?? true);
const config = createConfig({
chains: [mainnet],
client({ chain }) {
return createClient({ chain, transport: http() });
},
...props?.wagmiConfig,
multiInjectedProviderDiscovery,
});
if (isIframeEnvironment) {
connectors.unshift(safe());
}
// Check if WalletConnect properties exist in the props
if (props?.walletConnect) {
// Retrieve the ID of the most recently connected wallet connector from storage
const recentConnectorId = localStorage?.getItem(`${config.storage?.key}.recentConnectorId`);
// If WalletConnect is the most recently connected wallet or lazy loading is disabled,
// add the WalletConnect connector to the beginning of the connectors list
if (recentConnectorId?.includes?.('walletConnect') || !props.lazy) {
connectors.unshift(createWalletConnectConnector(props.walletConnect));
}
}
if (props?.coinbase && !isWalletInstalled('coinbase')) {
const recentConnectorId = localStorage?.getItem(`${config.storage?.key}.recentConnectorId`);
if (recentConnectorId?.includes?.('coinbaseWalletSDK') || !props.lazy) {
connectors.unshift(createCoinbaseConnector(props.coinbase));
}
}
if (props?.metaMask && !isWalletInstalled('metaMask')) {
const recentConnectorId = localStorage?.getItem(`${config.storage?.key}.recentConnectorId`);
if (recentConnectorId?.includes?.('metaMaskSDK') || !props.lazy) {
connectors.unshift(createMetaMaskConnector(props.metaMask));
}
}
return {
config,
connectors,
};
}
//# sourceMappingURL=createDefaultWagmiConfig.js.map