UNPKG

@keypo/synapse-storage-sdk

Version:
96 lines (95 loc) 3.82 kB
import { createPublicClient, http } from "viem"; import { create7702KernelAccount, create7702KernelAccountClient } from "@zerodev/ecdsa-validator"; import { createZeroDevPaymasterClient, getUserOperationGasPrice } from "@zerodev/sdk"; import { getEntryPoint, KERNEL_V3_3 } from "@zerodev/sdk/constants"; import { createContractError } from '../errors/index.js'; /** * Helper to create a kernel client from a userSigner */ export async function getKernelClient(userSigner, chain, bundlerRpcUrl, authorization, debug) { if (debug) { console.log("[DEBUG] getKernelClient called with:", { userSigner, chain, bundlerRpcUrl, authorization }); } try { console.log("[DEBUG] Creating public client..."); const publicClient = createPublicClient({ transport: http(bundlerRpcUrl), chain, }); if (debug) { console.log("[DEBUG] publicClient created"); } console.log("[DEBUG] Creating kernel account..."); const account = await Promise.race([ create7702KernelAccount(publicClient, { signer: userSigner, entryPoint: getEntryPoint("0.7"), kernelVersion: KERNEL_V3_3, eip7702Auth: authorization }), new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout: create7702KernelAccount took too long')), 30000)) ]); if (debug) { console.log("[DEBUG] kernelAccount:", account); } console.log("[DEBUG] Creating paymaster client..."); const paymasterClient = createZeroDevPaymasterClient({ chain, transport: http(bundlerRpcUrl), }); if (debug) { console.log("[DEBUG] paymasterClient created"); } console.log("[DEBUG] Creating kernel client..."); const kernelClient = await Promise.race([ create7702KernelAccountClient({ account, chain, bundlerTransport: http(bundlerRpcUrl), paymaster: paymasterClient, client: publicClient, userOperation: { estimateFeesPerGas: async ({ bundlerClient }) => { try { return await getUserOperationGasPrice(bundlerClient); } catch (error) { if (debug) { console.warn("[DEBUG] Gas price estimation failed, using fallback:", error.message); } // Fallback gas price estimation return { maxFeePerGas: BigInt(2000000000), // 2 gwei maxPriorityFeePerGas: BigInt(1000000000), // 1 gwei }; } } } }), new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout: create7702KernelAccountClient took too long')), 30000)) ]); if (debug) { console.log("[DEBUG] kernelClient:", kernelClient); } return kernelClient; } catch (error) { console.error("Error creating kernel client:", error); if (debug) { console.error("Error details:", { message: error.message, cause: error.cause, stack: error.stack }); } throw createContractError('Failed to create kernel client', { cause: error, userMessage: 'Could not set up account abstraction for smart contract operations' }); } }