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

x402z-shared-web

v0.0.19

Published

Browser relayer + token helpers for the erc7984-mind-v1 x402 scheme.

Readme

x402z-shared-web

Browser relayer + token helpers for the erc7984-mind-v1 x402 scheme.

Install

pnpm add x402z-shared-web

Folder map

  • src/core/: ABI, constants, types, utils
  • src/relayer/: relayer helpers
  • src/token/: token, balance, observer, transfer helpers
  • src/index.ts: public exports

Relayer helpers (Browser)

import {
  createRelayer,
  getBrowserEthereumProvider,
  createEncryptedAmountInput,
  getSepoliaConfig,
} from "x402z-shared-web";
import type { FhevmInstanceConfig } from "x402z-shared-web";

const provider = getBrowserEthereumProvider();
const relayerConfig: FhevmInstanceConfig = {
  ...(getSepoliaConfig() as object),
  network: provider,
};
const relayer = await createRelayer(relayerConfig);
const encrypted = await createEncryptedAmountInput(
  relayer,
  "0xToken",
  "0xBatcher",
  1000,
);

createRelayer calls initSDK() for you the first time.

Unwrap helpers (Browser)

import {
  getTokenEip712Domain,
  prepareUnwrapAuthorization,
  getUnwrapHandleFromLogs,
} from "x402z-shared-web";

Wrap helpers (Browser)

import { ensureUnderlyingAllowance, getUnderlyingTokenAddress } from "x402z-shared-web";

Token helper (Browser)

import { ConfidentialToken } from "x402z-shared-web";
import { createWalletClient, custom } from "viem";
import { createBrowserSigner, getBrowserEthereumProvider } from "x402z-shared-web";

const provider = getBrowserEthereumProvider();
const signer = await createBrowserSigner(provider);
const walletClient = createWalletClient({
  transport: custom(provider as any),
  account: signer.address,
});
const token = new ConfidentialToken({
  rpcUrl: "https://sepolia.infura.io/v3/...",
  tokenAddress: "0xToken",
  relayer,
  walletClient,
  signer,
});
const balance = await token.balanceOf("0xWallet");
console.log(balance.toString());

Notes:

  • Balance decryption is allowed for the account or its observer (ERC7984ObserverAccess).
  • Unauthorized observer errors throw confidentialErrorCodes.observerNotAuthorized (ConfidentialErrorCode).

Transfer amount helper (Browser)

import { getTransferAmounts } from "x402z-shared-web";
import { createBrowserSigner, getBrowserEthereumProvider } from "x402z-shared-web";

const provider = getBrowserEthereumProvider();
const signer = await createBrowserSigner(provider);
const transfers = await getTransferAmounts({
  rpcUrl: "https://sepolia.infura.io/v3/...",
  tokenAddress: "0xToken",
  txHash: "0xTransactionHash",
  relayer,
  signer,
});
console.log(transfers[0]?.amount?.toString());

Notes:

  • Transfer amount decryption is allowed for holder, payee, or an observer set via ERC7984ObserverAccess.
  • Unauthorized observer errors throw confidentialErrorCodes.observerNotAuthorized (ConfidentialErrorCode).

Observer helper (Browser)

import { ConfidentialToken } from "x402z-shared-web";
import { createWalletClient, custom } from "viem";
import { createBrowserSigner, getBrowserEthereumProvider } from "x402z-shared-web";

const provider = getBrowserEthereumProvider();
const signer = await createBrowserSigner(provider);
const walletClient = createWalletClient({ transport: custom(provider as any) });
const token = new ConfidentialToken({
  rpcUrl: "https://sepolia.infura.io/v3/...",
  tokenAddress: "0xToken",
  relayer,
  walletClient,
  signer,
});
const txHash = await token.setObserver("0xHolder", "0xObserver");
console.log(txHash);

Notes

  • Web builds use @zama-fhe/relayer-sdk/web (no CDN script tag or bundle).
  • Requires an injected wallet for signing (e.g. MetaMask).
  • Scheme name: erc7984-mind-v1

API surface

Exports:

  • confidentialTokenAbi: FHEToken ABI fragment used by helpers.
  • confidentialPaymentTypes: EIP-712 type definitions for confidential payments.
  • confidentialErrorCodes: mapped error codes for relayer/decryption flows.
  • createNonce: generates a random bytes32 nonce.
  • hashEncryptedAmountInput: hashes an encrypted handle for authorization binding.
  • normalizeAmount: coerces amounts to on-chain uint64-safe values.
  • createBrowserSigner: builds a signer from an injected provider.
  • getBrowserEthereumProvider: fetches the injected EIP-1193 provider.
  • createRelayer: creates a Zama relayer instance (browser).
  • createEncryptedAmountInput: builds encrypted handle + proof for amounts.
  • getSepoliaConfig: returns default browser relayer config for Sepolia.
  • initSDK: initializes the browser SDK once.
  • publicDecrypt: performs public decryption with proof.
  • SepoliaConfig: default relayer config for Sepolia.
  • decryptEuint64: user decryption flow for a single handle.
  • getTokenEip712Domain: reads token EIP-712 domain with fallbacks.
  • getUnwrapHandleFromLogs: extracts unwrap handle from receipt logs.
  • prepareUnwrapAuthorization: creates/ signs unwrap authorization payload.
  • ensureUnderlyingAllowance: checks/approves underlying ERC-20 allowance.
  • getUnderlyingTokenAddress: reads underlying ERC-20 address from FHEToken.
  • getTransferAmounts: decrypts transfer amounts for a payment tx.
  • ConfidentialToken: high-level token helper (balance, wrap/unwrap).

Types:

  • ConfidentialErrorCode: discriminated error codes for decrypt flows.
  • ConfidentialPaymentAuthorization: signed payment authorization shape.
  • UnwrapAuthorization: signed unwrap authorization shape.
  • ConfidentialPaymentPayload: full payment payload sent to server.
  • ConfidentialRequirementsExtra: scheme requirements extension payload.
  • ConfidentialPaymentInput: relayer input for confidential payments.
  • BrowserEthereumProvider: EIP-1193 provider type.
  • BrowserSigner: browser signer interface.
  • TransferAmount: decrypted transfer amount record.
  • TransferQueryOptions: query options for transfer amount lookup.
  • ConfidentialTokenOptions: constructor config for ConfidentialToken.
  • FhevmInstanceConfig: relayer configuration type.
  • RelayerInstance: relayer instance type.
  • RelayerSigner: EIP-712 signer interface for relayer ops.
  • RelayerSdkModule: relayer SDK module type.
  • re-exported types from @x402/core/types: shared x402 types.