UNPKG

@keypo/synapse-storage-sdk

Version:
84 lines (83 loc) 3.44 kB
import { encodeFunctionData } from "viem"; import { createContractError } from '../../errors/index.js'; /** * Deploy file and write permissions to the PermissionsRegistry */ export const deployPermissionedData = async (fileIdentifier, fileMetaData, kernelClient, // Using any for now since we need the kernel client's methods signerAddress, contractAddress, validatorAddress, abi, customParameters, debug) => { const parameters = customParameters || [ { permissionType: 0, permissionAddress: signerAddress, tokenQuantity: 1, timeLimitBlockNumber: 0, operator: 0, }, ]; try { const txData = encodeFunctionData({ abi: abi, functionName: "deployPermissionedFile", args: [fileIdentifier, fileMetaData, validatorAddress, signerAddress, parameters], }); if (debug) { console.log("[DEBUG] deployPermissionedData txData:", txData); } // Prepare the user operation with explicit gas settings const userOperation = { callData: await kernelClient.account.encodeCalls([{ to: contractAddress, value: BigInt(0), data: txData, }]), }; if (debug) { console.log("[DEBUG] Sending user operation with callData:", userOperation.callData); } // Add timeout to sendUserOperation const userOpHash = await Promise.race([ kernelClient.sendUserOperation(userOperation), new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout: sendUserOperation took too long')), 30000)) ]); if (debug) { console.log("[DEBUG] userOpHash:", userOpHash); } // Add timeout to waitForUserOperationReceipt const { receipt } = await Promise.race([ kernelClient.waitForUserOperationReceipt({ hash: userOpHash, }), new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout: waitForUserOperationReceipt took too long')), 60000)) ]); if (debug) { console.log("[DEBUG] receipt:", receipt); } return receipt.transactionHash; } catch (error) { console.error("Error sending user operation:", error); // Log more detailed error information if (error.message) { console.error("Error message:", error.message); } if (error.cause) { console.error("Error cause:", error.cause); } if (error.stack) { console.error("Error stack:", error.stack); } // Check for specific error types if (error.message && error.message.includes("UserOperation reverted during simulation")) { console.error("UserOperation simulation failed - this could be due to:"); console.error("1. Insufficient gas estimation"); console.error("2. Contract state issues"); console.error("3. Network congestion"); console.error("4. Invalid parameters"); } throw createContractError('Failed to deploy permissioned data contract', { cause: error, userMessage: 'Could not deploy smart contract for file permissions', details: { fileIdentifier, contractAddress } }); } };