@keypo/synapse-storage-sdk
Version:
TypeScript SDK for encrypted file storage on Filecoin via Synapse
96 lines (95 loc) • 3.82 kB
JavaScript
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'
});
}
}