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...