← Back
import { useCallback, useMemo } from 'react';
import { createPublicClient, http } from 'viem';
import { polygon } from 'viem/chains';
import { RelayClient, RelayerTransactionState } from '@polymarket/builder-relayer-client';
import { deriveSafe } from '@polymarket/builder-relayer-client/dist/builder/derive';
import { getContractConfig } from '@polymarket/builder-relayer-client/dist/config';

const POLYGON_CHAIN_ID = 137;
const pub = createPublicClient({ chain: polygon, transport: http('https://polygon.drpc.org') });

/**
 * Derive + deploy the user's Polymarket Gnosis Safe (deterministic from the EOA),
 * gasless via the RelayClient. Same logic as the official privy-safe-builder-example.
 */
export default function useSafeDeployment(eoaAddress?: string | null) {
  const derivedSafeAddressFromEoa = useMemo(() => {
    if (!eoaAddress) return undefined;
    try {
      const config = getContractConfig(POLYGON_CHAIN_ID);
      return deriveSafe(eoaAddress, config.SafeContracts.SafeFactory);
    } catch (err) {
      console.error('Error deriving Safe address:', err);
      return undefined;
    }
  }, [eoaAddress]);

  const isSafeDeployed = useCallback(
    async (relayClient: RelayClient, safeAddr: string): Promise<boolean> => {
      try {
        return await (relayClient as unknown as { getDeployed: (a: string) => Promise<boolean> }).getDeployed(safeAddr);
      } catch {
        const code = await pub.getCode({ address: safeAddr as `0x${string}` });
        return !!code && code !== '0x';
      }
    },
    [],
  );

  const deploySafe = useCallback(async (relayClient: RelayClient): Promise<string> => {
    const response = await relayClient.deploy();
    const result = await relayClient.pollUntilState(
      response.transactionID,
      [
        RelayerTransactionState.STATE_MINED,
        RelayerTransactionState.STATE_CONFIRMED,
        RelayerTransactionState.STATE_FAILED,
      ],
      '60',
      3000,
    );
    if (!result) throw new Error('Safe deployment failed');
    return result.proxyAddress;
  }, []);

  return { derivedSafeAddressFromEoa, isSafeDeployed, deploySafe };
}

📜 Git History

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