← Back
import { useState, useEffect } from 'react';
import { providers } from 'ethers';
import { usePrivy, useWallets } from '@privy-io/react-auth';

/**
 * Bridges the Privy embedded wallet to an ethers v5 signer for the Polymarket
 * SDKs (RelayClient / ClobClient need an ethers signer). Same pattern as the
 * official privy-safe-builder-example WalletProvider.
 */
export function usePrivySigner() {
  const { authenticated } = usePrivy();
  const { wallets, ready } = useWallets();
  const [ethersSigner, setEthersSigner] = useState<providers.JsonRpcSigner | null>(null);
  const [eoaAddress, setEoaAddress] = useState<string | null>(null);

  useEffect(() => {
    let cancelled = false;
    (async () => {
      if (!authenticated || !ready) {
        setEthersSigner(null); setEoaAddress(null); return;
      }
      const wallet = wallets.find(w => w.walletClientType === 'privy');
      if (!wallet) { setEthersSigner(null); setEoaAddress(null); return; }
      try {
        const provider = await wallet.getEthereumProvider();
        const ethersProvider = new providers.Web3Provider(provider as never);
        if (!cancelled) {
          setEthersSigner(ethersProvider.getSigner());
          setEoaAddress(wallet.address);
        }
      } catch {
        if (!cancelled) { setEthersSigner(null); setEoaAddress(null); }
      }
    })();
    return () => { cancelled = true; };
  }, [authenticated, ready, wallets]);

  return { eoaAddress, ethersSigner };
}

📜 Git History

6c47fa4chore: local Polikopi project home + Phase 1 redesign artifacts12 days ago
Show last diff
Loading...