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