// Copyright 2017-2026 @pezkuwi/react-params authors & contributors // SPDX-License-Identifier: Apache-2.0 import type { PezpalletAllianceCid } from '@pezkuwi/types/lookup'; import type { ExpandedCid } from './types.js'; import { CID, digest, varint } from 'multiformats'; import { u8aToHex } from '@pezkuwi/util'; export function fromIpfsCid (cid: string): ExpandedCid | null { try { const { code: codec, multihash: { code, digest }, version } = CID.parse(cid); return { codec, hash: { code, digest: u8aToHex(digest) }, version }; } catch (error) { console.error(`fromIpfsCid: ${(error as Error).message}::`, cid); return null; } } export function toIpfsCid (cid: PezpalletAllianceCid): string | null { try { const { codec, hash_: { code, digest: _bytes }, version } = cid; // Since we use parse, encode into a fully-specified bytes to // pass - + + bytes const bytes = _bytes.toU8a(true); const codeLen = varint.encodingLength(code.toNumber()); const sizeLen = varint.encodingLength(bytes.length); const encoded = new Uint8Array(codeLen + sizeLen + bytes.length); varint.encodeTo(code.toNumber(), encoded, 0); varint.encodeTo(bytes.length, encoded, codeLen); encoded.set(bytes, codeLen + sizeLen); return CID .create(version.index as 0, codec.toNumber(), digest.decode(encoded)) .toString(); } catch (error) { console.error(`toIpfsCid: ${(error as Error).message}::`, cid.toHuman()); return null; } }