npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

olivmath-ultraplonk-zk-verify

v0.2.0

Published

I have developed a **functional Proof of Concept (PoC/MVP)** that performs this conversion **natively in node.js (Backend) and in the browser (Frontend)**, allowing proofs to be submitted directly to ZKVerify without manual CLI steps.

Readme

Solution Proposal: zk-SNARK Conversion Tool UltraPlonk → ZKVerify

1. Executive Summary

Currently, developers using the Noir/Nargo stack with the UltraPlonk backend face a critical limitation: the lack of tools to convert zk-SNARK proofs generated via CLI (bb) into a format compatible with ZKVerify. This prevents direct frontend integrations with modern verifiers.

I have developed a functional Proof of Concept (PoC/MVP) that performs this conversion natively in node.js (Backend) and in the browser (Frontend), allowing proofs to be submitted directly to ZKVerify without manual CLI steps.


2. Current Problem

Developers working with UltraPlonk face the following barriers:

  • Proofs generated by bb prove are binary (.bin) and incompatible with ZKVerify.
  • Conversion to hex format is only possible via CLI, preventing frontend/browser usage.
  • There is no official solution for runtime conversion via JavaScript.

3. Proposed Solution

Creation of an open-source JavaScript/TypeScript library that:

  • Converts proofs and Uint8Array keys generated by @aztec/bb.js to hex in Node.js or browser environments.
  • Generates the proof format accepted by ZKVerify from the UltraPlonk structure.
  • Provides a user-friendly API for Web3 developers, DApps, and ZK tools.

This library is already functional as a PoC, with successful proof submissions to ZKVerify.


4. Proof of Feasibility

The developed PoC already demonstrates that:

  • Conversion can be done entirely in Node.js without CLI.
  • The converted format is accepted by ZKVerify's API.
  • It can run in Node.js backend.

Zk Verify Proof Submitted

5. How to use

BACKEND SIDE:

import ultraplonk from "olivmath-zkverify";

Apply in your flow:

// POST
app.post("/", async (req, res) => {
  // 1. Receive proof, public inputs and vk
  // 2. Convertendo proof e vk para Uint8Array
  // 3. Load ZK circuit
  // 4. Instantiate UltraPlonkBackend from @aztec/bb.js;
  // 5. Verify proofs + public inputs locally with UltraPlonkBackend
  // 6. Convert proofs & vk to ZkVerify compatible format
  const convertedProof = ultraplonk.convert_proof(proof, 1); // <- 1 is the number of public inputs
  const convertedVk = ultraplonk.convert_verification_key(vk);
  // 7. Submit to ZkVerify
  const session = await zkVerifySession
    .start()
    .Volta()
    .withAccount("your seed here");

  const { events } = await session
    .verify()
    .ultraplonk()
    .execute({
      proofData: {
        publicSignals: publicInputs,
        proof: convertedProof,
        vk: convertedVk,
      },
    });

  await new Promise((resolve) => {
    events.on(ZkVerifyEvents.Finalized, (data) => {
      console.log("Proof finalized on zkVerify. ✅", data);
      resolve(data);
    });
  });
});

FRONTEND SIDE:

Comingo soon