import { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js' import { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js' import type { ErrorType } from '../errors/utils.js' import type { Bytes, Hex } from '../types/data.js' import type { Kzg } from '../types/kzg.js' type To = 'hex' | 'bytes' export type BlobsToCommitmentsParameters< blobs extends readonly Bytes[] | readonly Hex[] = | readonly Bytes[] | readonly Hex[], to extends To | undefined = undefined, > = { /** Blobs to transform into commitments. */ blobs: blobs | readonly Bytes[] | readonly Hex[] /** KZG implementation. */ kzg: Pick /** Return type. */ to?: to | To | undefined } export type BlobsToCommitmentsReturnType = | (to extends 'bytes' ? readonly Bytes[] : never) | (to extends 'hex' ? readonly Hex[] : never) export type BlobsToCommitmentsErrorType = | HexToBytesErrorType | BytesToHexErrorType | ErrorType /** * Compute commitments from a list of blobs. * * @example * ```ts * import { Blobs } from 'viem' * import { kzg } from './kzg' * * const blobs = Blobs.from({ data: '0x1234' }) * const commitments = Blobs.toCommitments({ blobs, kzg }) * ``` */ export function blobsToCommitments< const blobs extends readonly Bytes[] | readonly Hex[], to extends To = | (blobs extends readonly Hex[] ? 'hex' : never) | (blobs extends readonly Bytes[] ? 'bytes' : never), >( parameters: BlobsToCommitmentsParameters, ): BlobsToCommitmentsReturnType { const { kzg } = parameters const to = parameters.to ?? (typeof parameters.blobs[0] === 'string' ? 'hex' : 'bytes') const blobs = ( typeof parameters.blobs[0] === 'string' ? parameters.blobs.map((x) => hexToBytes(x as any)) : parameters.blobs ) as Bytes[] const commitments: Bytes[] = [] for (const blob of blobs) commitments.push(Uint8Array.from(kzg.blobToKzgCommitment(blob))) return (to === 'bytes' ? commitments : commitments.map((x) => bytesToHex(x), )) as {} as BlobsToCommitmentsReturnType }