UNPKG

zkverifyjs

Version:

Submit proofs to zkVerify and query proof state with ease using our npm package.

64 lines 2.62 kB
import { createSubmitProofExtrinsic } from "../extrinsic/index.js"; import { format } from "../format/index.js"; import { OptimisticVerificationResultType } from "../../types.js"; import { getKeyringAccountIfAvailable, interpretDryRunResponse, toSubmittableExtrinsic } from "../../utils/helpers/index.js"; export const optimisticVerify = async (connection, options, input) => { const { api } = connection; try { const transaction = buildTransaction(api, options, input); const selectedAccount = getKeyringAccountIfAvailable(connection, options.accountAddress); if (!selectedAccount) { throw new Error('No active session account available for optimisticVerify'); } const nonce = options.nonce ?? -1; await transaction.signAsync(selectedAccount, { nonce, era: 0 }); const txHex = transaction.toHex(); let atBlockHash; if (options.block !== undefined) { if (typeof options.block === 'number') { atBlockHash = await api.rpc.chain.getBlockHash(options.block); } else if (typeof options.block === 'string') { atBlockHash = options.block; } } else { atBlockHash = undefined; } const dryRun = atBlockHash ? await api.rpc.system.dryRun(txHex, atBlockHash) : await api.rpc.system.dryRun(txHex); return interpretDryRunResponse(api, dryRun.toHex(), options.proofOptions?.proofType); } catch (e) { return { success: false, type: OptimisticVerificationResultType.TransportError, message: `Optimistic verification failed: ${e instanceof Error ? e.message : String(e)}`, verificationError: false }; } }; /** * Builds a transaction from the provided input. * @param api - The Polkadot.js API instance. * @param options - Options for the proof. * @param input - Input for the verification (proofData or extrinsic). * @returns A SubmittableExtrinsic ready for dryRun. * @throws If input is invalid or cannot be formatted. */ const buildTransaction = (api, options, input) => { if ('proofData' in input && input.proofData) { const { proof, publicSignals, vk } = input.proofData; const formattedProofData = format(options.proofOptions, proof, publicSignals, vk, options.registeredVk); return createSubmitProofExtrinsic(api, options.proofOptions.proofType, formattedProofData, input.domainId); } if ('extrinsic' in input && input.extrinsic) { return toSubmittableExtrinsic(input.extrinsic, api); } throw new Error(`Invalid input provided. Expected either 'proofData' or 'extrinsic'. Received: ${JSON.stringify(input)}`); };