@hyperlane-xyz/widgets
Version:
Common react components for Hyperlane projects
56 lines • 2.01 kB
JavaScript
import { useConnection, useWallet } from '@solana/wallet-adapter-react';
import { useWalletModal } from '@solana/wallet-adapter-react-ui';
import { useCallback, useMemo } from 'react';
import { ProtocolType } from '@hyperlane-xyz/utils';
import { widgetLogger } from '../logger.js';
import { findChainByRpcUrl } from './utils.js';
const logger = widgetLogger.child({
module: 'walletIntegrations/solanaWallet',
});
export function useSolanaAccount(_multiProvider) {
const { publicKey, connected, wallet } = useWallet();
const isReady = !!(publicKey && wallet && connected);
const address = publicKey?.toBase58();
return useMemo(() => ({
protocol: ProtocolType.Sealevel,
addresses: address ? [{ address }] : [],
isReady,
}), [address, isReady]);
}
export function useSolanaWalletDetails() {
const { wallet } = useWallet();
const { name, icon } = wallet?.adapter || {};
return useMemo(() => ({
name,
logoUrl: icon,
}), [name, icon]);
}
export function useSolanaConnectFn() {
const { setVisible } = useWalletModal();
return useCallback(() => setVisible(true), [setVisible]);
}
export function useSolanaDisconnectFn() {
const { disconnect } = useWallet();
return disconnect;
}
export function useSolanaActiveChain(multiProvider) {
const { connection } = useConnection();
const connectionEndpoint = connection?.rpcEndpoint;
return useMemo(() => {
try {
const hostname = new URL(connectionEndpoint).hostname;
const metadata = findChainByRpcUrl(multiProvider, hostname);
if (!metadata)
return {};
return {
chainDisplayName: metadata.displayName,
chainName: metadata.name,
};
}
catch (error) {
logger.warn('Error finding sol active chain', error);
return {};
}
}, [connectionEndpoint, multiProvider]);
}
//# sourceMappingURL=solanaWallet.js.map